[gnome-shell] keyboard: Correctly compare cursor rect to keyboard rect



commit 36b103525c5e57900368211da86c377c0ca34852
Author: Jonas Dreßler <verdre v0yd nl>
Date:   Sat Feb 20 13:58:39 2021 +0100

    keyboard: Correctly compare cursor rect to keyboard rect
    
    The logic that decides whether we should shift the window up when the
    cursor rectangle overlaps with the keyboard rectangle doesn't work
    properly right now, we want it to work like this:
    
    - If the currently focused window is shifted up, keep it shifted up
    until the cursor rect no longer overlaps the keyboard rect. To do that
    comparison correctly, we need to adjust for the height the cursor rect
    is shifted up by (keyboardHeight) and temporarily shift it down again.
    
    - If the currently focused is not shifted up, we want to shift it up as
    soon as the focus rect overlaps the keyboard rect. If that's not the
    case, want still want to call _setFocusWindow(null) in order to shift
    the previously focused window back down.
    
    This fixes two issues: 1) We're currently shifting windows back down at
    the wrong position of the cursor (that is y < keyboardHeight). 2) We're
    not shifting down previously focused windows when focusing a different
    window with the new focus in a specific region (y >= keyboardHeight &&
    y + h < monitor.y + monitor.height - keyboardHeight).
    
    Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1760>

 js/ui/keyboard.js | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)
---
diff --git a/js/ui/keyboard.js b/js/ui/keyboard.js
index ce4f11fab4..7452feaac5 100644
--- a/js/ui/keyboard.js
+++ b/js/ui/keyboard.js
@@ -2014,11 +2014,19 @@ var Keyboard = GObject.registerClass({
         let monitor = Main.layoutManager.keyboardMonitor;
 
         if (window && monitor) {
-            let keyboardHeight = Main.layoutManager.keyboardBox.height;
+            const keyboardHeight = Main.layoutManager.keyboardBox.height;
+            const keyboardY1 = (monitor.y + monitor.height) - keyboardHeight;
 
-            if (y + h >= monitor.y + monitor.height - keyboardHeight)
+            if (this._focusWindow === window) {
+                if (y + h + keyboardHeight < keyboardY1)
+                    this._setFocusWindow(null);
+
+                return;
+            }
+
+            if (y + h >= keyboardY1)
                 this._setFocusWindow(window);
-            else if (y < keyboardHeight)
+            else
                 this._setFocusWindow(null);
         } else {
             this._setFocusWindow(null);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]