From 2033763bb18913773eea3ac82bf9dbb053444ac6 Mon Sep 17 00:00:00 2001 From: Jeff Brown Date: Mon, 24 Sep 2012 14:25:54 -0700 Subject: [PATCH 1/3] Allow a window on a secondary display to have focus. If any window on the default display has focus, then it gets focus as usual. If no window on the default display has focus, then we consider windows on the secondary display. In the future we will need more elaborate schemes for managing focus across multiple displays, but this is enough for testing purposes now. Bug: 7183618 Change-Id: I21ddb9904eb9e574e42d28743aeca51f4ffebf64 --- .../server/wm/WindowManagerService.java | 35 +++++++++++-------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java index 5a6e0107de6f3..c09c261d15eaf 100755 --- a/services/java/com/android/server/wm/WindowManagerService.java +++ b/services/java/com/android/server/wm/WindowManagerService.java @@ -9777,7 +9777,7 @@ public class WindowManagerService extends IWindowManager.Stub if (moveInputMethodWindowsIfNeededLocked( mode != UPDATE_FOCUS_WILL_ASSIGN_LAYERS && mode != UPDATE_FOCUS_WILL_PLACE_SURFACES)) { - getDefaultDisplayContentLocked().layoutNeeded = true; + displayContent.layoutNeeded = true; } if (mode == UPDATE_FOCUS_PLACING_SURFACES) { performLayoutLockedInner(displayContent, true /*initial*/, updateInputWindows); @@ -9791,7 +9791,7 @@ public class WindowManagerService extends IWindowManager.Stub if ((focusChanged & WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT) != 0) { // The change in focus caused us to need to do a layout. Okay. - getDefaultDisplayContentLocked().layoutNeeded = true; + displayContent.layoutNeeded = true; if (mode == UPDATE_FOCUS_PLACING_SURFACES) { performLayoutLockedInner(displayContent, true /*initial*/, updateInputWindows); } @@ -9814,22 +9814,29 @@ public class WindowManagerService extends IWindowManager.Stub } private WindowState computeFocusedWindowLocked() { - WindowState result = null; - WindowState win; - if (mAnimator.mUniverseBackground != null && mAnimator.mUniverseBackground.mWin.canReceiveKeys()) { return mAnimator.mUniverseBackground.mWin; } - int nextAppIndex = mAppTokens.size()-1; - WindowToken nextApp = nextAppIndex >= 0 - ? mAppTokens.get(nextAppIndex) : null; + final int displayCount = mDisplayContents.size(); + for (int i = 0; i < displayCount; i++) { + final DisplayContent displayContent = mDisplayContents.valueAt(i); + WindowState win = findFocusedWindowLocked(displayContent); + if (win != null) { + return win; + } + } + return null; + } - // TODO(multidisplay): IMEs are only supported on the default display. - WindowList windows = getDefaultWindowListLocked(); + private WindowState findFocusedWindowLocked(DisplayContent displayContent) { + int nextAppIndex = mAppTokens.size()-1; + WindowToken nextApp = nextAppIndex >= 0 ? mAppTokens.get(nextAppIndex) : null; + + final WindowList windows = displayContent.getWindowList(); for (int i = windows.size() - 1; i >= 0; i--) { - win = windows.get(i); + final WindowState win = windows.get(i); if (localLOGV || DEBUG_FOCUS) Slog.v( TAG, "Looking for focus: " + i @@ -9879,12 +9886,10 @@ public class WindowManagerService extends IWindowManager.Stub if (win.canReceiveKeys()) { if (DEBUG_FOCUS) Slog.v( TAG, "Found focus @ " + i + " = " + win); - result = win; - break; + return win; } } - - return result; + return null; } private void startFreezingDisplayLocked(boolean inTransaction, From 14a9f2b9d23976b7aae5330b56c633a03181c710 Mon Sep 17 00:00:00 2001 From: Jeff Brown Date: Mon, 24 Sep 2012 14:36:44 -0700 Subject: [PATCH 2/3] Fix drag and drop surfaces on secondary displays. Bug: 7183618 Change-Id: I4ef746916aad984640f1eb3b3c71b1e34595aabd --- services/java/com/android/server/wm/Session.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/services/java/com/android/server/wm/Session.java b/services/java/com/android/server/wm/Session.java index 16beeabf6f23d..d84a52bf0d434 100644 --- a/services/java/com/android/server/wm/Session.java +++ b/services/java/com/android/server/wm/Session.java @@ -280,7 +280,8 @@ final class Session extends IWindowSession.Stub // !!! FIXME: put all this heavy stuff onto the mH looper, as well as // the actual drag event dispatch stuff in the dragstate - mService.mDragState.register(callingWin.mDisplayContent.getDisplay()); + Display display = callingWin.mDisplayContent.getDisplay(); + mService.mDragState.register(display); mService.mInputMonitor.updateInputWindowsLw(true /*force*/); if (!mService.mInputManager.transferTouchFocus(callingWin.mInputChannel, mService.mDragState.mServerChannel)) { @@ -310,6 +311,7 @@ final class Session extends IWindowSession.Stub touchY - thumbCenterY); surface.setAlpha(.7071f); surface.setLayer(mService.mDragState.getDragLayerLw()); + surface.setLayerStack(display.getLayerStack()); surface.show(); } finally { Surface.closeTransaction(); From 8d0243a3d0269d3a57d90eb2e7b12b41f53b27d9 Mon Sep 17 00:00:00 2001 From: Jeff Brown Date: Mon, 24 Sep 2012 15:01:47 -0700 Subject: [PATCH 3/3] Fix surface view on secondary display. Bug: 7183618 Change-Id: I8d743b5db8f362afb97f720846d990f9a722b3bd --- core/java/android/view/SurfaceView.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index 973c7f6328591..3be63d5b5704b 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -456,11 +456,12 @@ public class SurfaceView extends View { } if (mWindow == null) { + Display display = getDisplay(); mWindow = new MyWindow(this); mLayout.type = mWindowType; mLayout.gravity = Gravity.START|Gravity.TOP; mSession.addToDisplayWithoutInputChannel(mWindow, mWindow.mSeq, mLayout, - mVisible ? VISIBLE : GONE, Display.DEFAULT_DISPLAY, mContentInsets); + mVisible ? VISIBLE : GONE, display.getDisplayId(), mContentInsets); } boolean realSizeChanged;