From 73e92b4291823a7669e91483a5ce29c3d44f56b3 Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Thu, 15 Oct 2009 14:29:19 -0700 Subject: [PATCH] Improve wallpaper offset handling. Fiddle around with the offsets of wallpapers to have better defaults, and update the offset when the currently wallpaper target is not setting an offset itself. Change-Id: I1864d098fb4813fb0c67857af8ebf398b35e6876 --- .../android/server/WindowManagerService.java | 112 ++++++++++-------- 1 file changed, 60 insertions(+), 52 deletions(-) diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java index 20b01d2d745a7..9caa38602f00d 100644 --- a/services/java/com/android/server/WindowManagerService.java +++ b/services/java/com/android/server/WindowManagerService.java @@ -430,8 +430,8 @@ public class WindowManagerService extends IWindowManager.Stub // to another, and this is the higher one in Z-order. WindowState mUpperWallpaperTarget = null; int mWallpaperAnimLayerAdjustment; - float mLastWallpaperX; - float mLastWallpaperY; + float mLastWallpaperX = -1; + float mLastWallpaperY = -1; // Lock for waiting for the wallpaper. final Object mWaitingOnWallpaperLock = new Object(); // This is set when we are waiting for a wallpaper to tell us it is done @@ -1464,8 +1464,12 @@ public class WindowManagerService extends IWindowManager.Stub } if (visible) { - mLastWallpaperX = mWallpaperTarget.mWallpaperX; - mLastWallpaperY = mWallpaperTarget.mWallpaperY; + if (mWallpaperTarget.mWallpaperX >= 0) { + mLastWallpaperX = mWallpaperTarget.mWallpaperX; + } + if (mWallpaperTarget.mWallpaperY >= 0) { + mLastWallpaperY = mWallpaperTarget.mWallpaperY; + } } // Start stepping backwards from here, ensuring that our wallpaper windows @@ -1566,34 +1570,32 @@ public class WindowManagerService extends IWindowManager.Stub boolean sync) { boolean changed = false; boolean rawChanged = false; - if (mLastWallpaperX >= 0) { - int availw = wallpaperWin.mFrame.right-wallpaperWin.mFrame.left-dw; - int offset = availw > 0 ? -(int)(availw*mLastWallpaperX+.5f) : 0; - changed = wallpaperWin.mXOffset != offset; - if (changed) { - if (DEBUG_WALLPAPER) Log.v(TAG, "Update wallpaper " - + wallpaperWin + " x: " + offset); - wallpaperWin.mXOffset = offset; - } - if (wallpaperWin.mWallpaperX != mLastWallpaperX) { - wallpaperWin.mWallpaperX = mLastWallpaperX; - rawChanged = true; - } + float wpx = mLastWallpaperX >= 0 ? mLastWallpaperX : 0.5f; + int availw = wallpaperWin.mFrame.right-wallpaperWin.mFrame.left-dw; + int offset = availw > 0 ? -(int)(availw*wpx+.5f) : 0; + changed = wallpaperWin.mXOffset != offset; + if (changed) { + if (DEBUG_WALLPAPER) Log.v(TAG, "Update wallpaper " + + wallpaperWin + " x: " + offset); + wallpaperWin.mXOffset = offset; + } + if (wallpaperWin.mWallpaperX != wpx) { + wallpaperWin.mWallpaperX = wpx; + rawChanged = true; } - if (mLastWallpaperY >= 0) { - int availh = wallpaperWin.mFrame.bottom-wallpaperWin.mFrame.top-dh; - int offset = availh > 0 ? -(int)(availh*mLastWallpaperY+.5f) : 0; - if (wallpaperWin.mYOffset != offset) { - if (DEBUG_WALLPAPER) Log.v(TAG, "Update wallpaper " - + wallpaperWin + " y: " + offset); - changed = true; - wallpaperWin.mYOffset = offset; - } - if (wallpaperWin.mWallpaperY != mLastWallpaperY) { - wallpaperWin.mWallpaperY = mLastWallpaperY; - rawChanged = true; - } + float wpy = mLastWallpaperY >= 0 ? mLastWallpaperY : 0.5f; + int availh = wallpaperWin.mFrame.bottom-wallpaperWin.mFrame.top-dh; + offset = availh > 0 ? -(int)(availh*wpy+.5f) : 0; + if (wallpaperWin.mYOffset != offset) { + if (DEBUG_WALLPAPER) Log.v(TAG, "Update wallpaper " + + wallpaperWin + " y: " + offset); + changed = true; + wallpaperWin.mYOffset = offset; + } + if (wallpaperWin.mWallpaperY != wpy) { + wallpaperWin.mWallpaperY = wpy; + rawChanged = true; } if (rawChanged) { @@ -1649,7 +1651,7 @@ public class WindowManagerService extends IWindowManager.Stub } } - boolean updateWallpaperOffsetLocked(boolean sync) { + boolean updateWallpaperOffsetLocked(WindowState changingTarget, boolean sync) { final int dw = mDisplay.getWidth(); final int dh = mDisplay.getHeight(); @@ -1657,22 +1659,31 @@ public class WindowManagerService extends IWindowManager.Stub WindowState target = mWallpaperTarget; if (target != null) { - mLastWallpaperX = target.mWallpaperX; - mLastWallpaperY = target.mWallpaperY; - int curTokenIndex = mWallpaperTokens.size(); - while (curTokenIndex > 0) { - curTokenIndex--; - WindowToken token = mWallpaperTokens.get(curTokenIndex); - int curWallpaperIndex = token.windows.size(); - while (curWallpaperIndex > 0) { - curWallpaperIndex--; - WindowState wallpaper = token.windows.get(curWallpaperIndex); - if (updateWallpaperOffsetLocked(wallpaper, dw, dh, sync)) { - wallpaper.computeShownFrameLocked(); - changed = true; - // We only want to be synchronous with one wallpaper. - sync = false; - } + if (target.mWallpaperX >= 0) { + mLastWallpaperX = target.mWallpaperX; + } else if (changingTarget.mWallpaperX >= 0) { + mLastWallpaperX = changingTarget.mWallpaperX; + } + if (target.mWallpaperY >= 0) { + mLastWallpaperY = target.mWallpaperY; + } else if (changingTarget.mWallpaperY >= 0) { + mLastWallpaperY = changingTarget.mWallpaperY; + } + } + + int curTokenIndex = mWallpaperTokens.size(); + while (curTokenIndex > 0) { + curTokenIndex--; + WindowToken token = mWallpaperTokens.get(curTokenIndex); + int curWallpaperIndex = token.windows.size(); + while (curWallpaperIndex > 0) { + curWallpaperIndex--; + WindowState wallpaper = token.windows.get(curWallpaperIndex); + if (updateWallpaperOffsetLocked(wallpaper, dw, dh, sync)) { + wallpaper.computeShownFrameLocked(); + changed = true; + // We only want to be synchronous with one wallpaper. + sync = false; } } } @@ -2179,11 +2190,8 @@ public class WindowManagerService extends IWindowManager.Stub if (window.mWallpaperX != x || window.mWallpaperY != y) { window.mWallpaperX = x; window.mWallpaperY = y; - - if (mWallpaperTarget == window) { - if (updateWallpaperOffsetLocked(true)) { - performLayoutAndPlaceSurfacesLocked(); - } + if (updateWallpaperOffsetLocked(window, true)) { + performLayoutAndPlaceSurfacesLocked(); } } }