Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 73e92b42 authored by Dianne Hackborn's avatar Dianne Hackborn
Browse files

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
parent 007a429f
Loading
Loading
Loading
Loading
+60 −52
Original line number Diff line number Diff line
@@ -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,9 +1464,13 @@ public class WindowManagerService extends IWindowManager.Stub
        }
        
        if (visible) {
            if (mWallpaperTarget.mWallpaperX >= 0) {
                mLastWallpaperX = mWallpaperTarget.mWallpaperX;
            }
            if (mWallpaperTarget.mWallpaperY >= 0) {
                mLastWallpaperY = mWallpaperTarget.mWallpaperY;
            }
        }
        
        // Start stepping backwards from here, ensuring that our wallpaper windows
        // are correctly placed.
@@ -1566,35 +1570,33 @@ public class WindowManagerService extends IWindowManager.Stub
            boolean sync) {
        boolean changed = false;
        boolean rawChanged = false;
        if (mLastWallpaperX >= 0) {
        float wpx = mLastWallpaperX >= 0 ? mLastWallpaperX : 0.5f;
        int availw = wallpaperWin.mFrame.right-wallpaperWin.mFrame.left-dw;
            int offset = availw > 0 ? -(int)(availw*mLastWallpaperX+.5f) : 0;
        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 != mLastWallpaperX) {
                wallpaperWin.mWallpaperX = mLastWallpaperX;
        if (wallpaperWin.mWallpaperX != wpx) {
            wallpaperWin.mWallpaperX = wpx;
            rawChanged = true;
        }
        }
        
        if (mLastWallpaperY >= 0) {
        float wpy = mLastWallpaperY >= 0 ? mLastWallpaperY : 0.5f;
        int availh = wallpaperWin.mFrame.bottom-wallpaperWin.mFrame.top-dh;
            int offset = availh > 0 ? -(int)(availh*mLastWallpaperY+.5f) : 0;
        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 != mLastWallpaperY) {
                wallpaperWin.mWallpaperY = mLastWallpaperY;
        if (wallpaperWin.mWallpaperY != wpy) {
            wallpaperWin.mWallpaperY = wpy;
            rawChanged = true;
        }
        }
        
        if (rawChanged) {
            try {
@@ -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,8 +1659,18 @@ public class WindowManagerService extends IWindowManager.Stub
        
        WindowState target = mWallpaperTarget;
        if (target != null) {
            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--;
@@ -1675,7 +1687,6 @@ public class WindowManagerService extends IWindowManager.Stub
                }
            }
        }
        }
        
        return changed;
    }
@@ -2179,14 +2190,11 @@ 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)) {
            if (updateWallpaperOffsetLocked(window, true)) {
                performLayoutAndPlaceSurfacesLocked();
            }
        }
    }
    }
    
    public int relayoutWindow(Session session, IWindow client,
            WindowManager.LayoutParams attrs, int requestedWidth,