diff options
author | Jeff Brown <jeffbrown@google.com> | 2012-09-08 18:05:28 -0700 |
---|---|---|
committer | Jeff Brown <jeffbrown@google.com> | 2012-09-08 18:12:57 -0700 |
commit | d728bf514f257670fcb9aa22c6eaf97626072c93 (patch) | |
tree | dedf4c8771ab1e1b618ea0d75e5f8328b0bfe83a /services/java/com/android/server/display/DisplayManagerService.java | |
parent | 631938f26dbc89e7e9530bb85d9f37706dba59f3 (diff) |
Make display manager tell input system about viewports.
The window manager is no longer responsible for telling the
input system about the display viewport.
Change-Id: I932882bae55decef55f25093bb2a7ebac1620bb1
Diffstat (limited to 'services/java/com/android/server/display/DisplayManagerService.java')
-rw-r--r-- | services/java/com/android/server/display/DisplayManagerService.java | 87 |
1 files changed, 84 insertions, 3 deletions
diff --git a/services/java/com/android/server/display/DisplayManagerService.java b/services/java/com/android/server/display/DisplayManagerService.java index 41a0c09d8bb1..e11d45475668 100644 --- a/services/java/com/android/server/display/DisplayManagerService.java +++ b/services/java/com/android/server/display/DisplayManagerService.java @@ -96,6 +96,7 @@ public final class DisplayManagerService extends IDisplayManager.Stub { private static final int MSG_REGISTER_ADDITIONAL_DISPLAY_ADAPTERS = 2; private static final int MSG_DELIVER_DISPLAY_EVENT = 3; private static final int MSG_REQUEST_TRAVERSAL = 4; + private static final int MSG_UPDATE_VIEWPORT = 5; private final Context mContext; private final boolean mHeadless; @@ -103,6 +104,7 @@ public final class DisplayManagerService extends IDisplayManager.Stub { private final Handler mUiHandler; private final DisplayAdapterListener mDisplayAdapterListener; private WindowManagerFuncs mWindowManagerFuncs; + private InputManagerFuncs mInputManagerFuncs; // The synchronization root for the display manager. // This lock guards most of the display manager's state. @@ -141,6 +143,11 @@ public final class DisplayManagerService extends IDisplayManager.Stub { // The Wifi display adapter, or null if not registered. private WifiDisplayAdapter mWifiDisplayAdapter; + // Viewports of the default display and the display that should receive touch + // input from an external source. Used by the input system. + private final DisplayViewport mDefaultViewport = new DisplayViewport(); + private final DisplayViewport mExternalTouchViewport = new DisplayViewport(); + // Temporary callback list, used when sending display events to applications. // May be used outside of the lock but only on the handler thread. private final ArrayList<CallbackRecord> mTempCallbacks = new ArrayList<CallbackRecord>(); @@ -148,6 +155,11 @@ public final class DisplayManagerService extends IDisplayManager.Stub { // Temporary display info, used for comparing display configurations. private final DisplayInfo mTempDisplayInfo = new DisplayInfo(); + // Temporary viewports, used when sending new viewport information to the + // input system. May be used outside of the lock but only on the handler thread. + private final DisplayViewport mTempDefaultViewport = new DisplayViewport(); + private final DisplayViewport mTempExternalTouchViewport = new DisplayViewport(); + public DisplayManagerService(Context context, Handler mainHandler, Handler uiHandler) { mContext = context; mHeadless = SystemProperties.get(SYSTEM_HEADLESS).equals("1"); @@ -183,7 +195,7 @@ public final class DisplayManagerService extends IDisplayManager.Stub { } /** - * Called during initialization to associated the display manager with the + * Called during initialization to associate the display manager with the * window manager. */ public void setWindowManager(WindowManagerFuncs windowManagerFuncs) { @@ -194,6 +206,17 @@ public final class DisplayManagerService extends IDisplayManager.Stub { } /** + * Called during initialization to associate the display manager with the + * input manager. + */ + public void setInputManager(InputManagerFuncs inputManagerFuncs) { + synchronized (mSyncRoot) { + mInputManagerFuncs = inputManagerFuncs; + scheduleTraversalLocked(); + } + } + + /** * Called when the system is ready to go. */ public void systemReady(boolean safeMode, boolean onlyCore) { @@ -487,7 +510,7 @@ public final class DisplayManagerService extends IDisplayManager.Stub { final int displayId = assignDisplayIdLocked(isDefault); final int layerStack = assignLayerStackLocked(displayId); - LogicalDisplay display = new LogicalDisplay(layerStack, device); + LogicalDisplay display = new LogicalDisplay(displayId, layerStack, device); display.updateLocked(mDisplayDevices); if (!display.isValidLocked()) { // This should never happen currently. @@ -548,6 +571,10 @@ public final class DisplayManagerService extends IDisplayManager.Stub { } mRemovedDisplayDevices.clear(); + // Clear all viewports before configuring displays so that we can keep + // track of which ones we have configured. + clearViewportsLocked(); + // Configure each display device. final int count = mDisplayDevices.size(); for (int i = 0; i < count; i++) { @@ -555,6 +582,11 @@ public final class DisplayManagerService extends IDisplayManager.Stub { configureDisplayInTransactionLocked(device); device.performTraversalInTransactionLocked(); } + + // Tell the input system about these new viewports. + if (mInputManagerFuncs != null) { + mHandler.sendEmptyMessage(MSG_UPDATE_VIEWPORT); + } } /** @@ -577,7 +609,11 @@ public final class DisplayManagerService extends IDisplayManager.Stub { scheduleTraversalLocked(); } } + } + private void clearViewportsLocked() { + mDefaultViewport.valid = false; + mExternalTouchViewport.valid = false; } private void configureDisplayInTransactionLocked(DisplayDevice device) { @@ -593,11 +629,30 @@ public final class DisplayManagerService extends IDisplayManager.Stub { // Apply the logical display configuration to the display device. if (display == null) { // TODO: no logical display for the device, blank it - Slog.d(TAG, "Missing logical display to use for physical display device: " + Slog.w(TAG, "Missing logical display to use for physical display device: " + device.getDisplayDeviceInfoLocked()); + return; } else { display.configureDisplayInTransactionLocked(device); } + + // Update the viewports if needed. + DisplayDeviceInfo info = device.getDisplayDeviceInfoLocked(); + if (!mDefaultViewport.valid + && (info.flags & DisplayDeviceInfo.FLAG_DEFAULT_DISPLAY) != 0) { + setViewportLocked(mDefaultViewport, display, device); + } + if (!mExternalTouchViewport.valid + && info.touch == DisplayDeviceInfo.TOUCH_EXTERNAL) { + setViewportLocked(mExternalTouchViewport, display, device); + } + } + + private static void setViewportLocked(DisplayViewport viewport, + LogicalDisplay display, DisplayDevice device) { + viewport.valid = true; + viewport.displayId = display.getDisplayIdLocked(); + device.populateViewportLocked(viewport); } private LogicalDisplay findLogicalDisplayForDeviceLocked(DisplayDevice device) { @@ -690,6 +745,10 @@ public final class DisplayManagerService extends IDisplayManager.Stub { pw.println(" Display " + displayId + ":"); display.dumpLocked(ipw); } + + pw.println(); + pw.println("Default viewport: " + mDefaultViewport); + pw.println("External touch viewport: " + mExternalTouchViewport); } } @@ -714,6 +773,18 @@ public final class DisplayManagerService extends IDisplayManager.Stub { void requestTraversal(); } + /** + * Private interface to the input manager. + */ + public interface InputManagerFuncs { + /** + * Sets information about the displays as needed by the input system. + * The input system should copy this information if required. + */ + void setDisplayViewports(DisplayViewport defaultViewport, + DisplayViewport externalTouchViewport); + } + private final class DisplayManagerHandler extends Handler { public DisplayManagerHandler(Looper looper) { super(looper, null, true /*async*/); @@ -737,6 +808,16 @@ public final class DisplayManagerService extends IDisplayManager.Stub { case MSG_REQUEST_TRAVERSAL: mWindowManagerFuncs.requestTraversal(); break; + + case MSG_UPDATE_VIEWPORT: { + synchronized (mSyncRoot) { + mTempDefaultViewport.copyFrom(mDefaultViewport); + mTempExternalTouchViewport.copyFrom(mExternalTouchViewport); + } + mInputManagerFuncs.setDisplayViewports( + mTempDefaultViewport, mTempExternalTouchViewport); + break; + } } } } |