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>
This commit is contained in:
Jonas Dreßler 2021-02-20 13:58:39 +01:00 committed by Marge Bot
parent 95ed7c7a06
commit 36b103525c

View File

@ -2014,11 +2014,19 @@ var Keyboard = GObject.registerClass({
let monitor = Main.layoutManager.keyboardMonitor; let monitor = Main.layoutManager.keyboardMonitor;
if (window && monitor) { 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); this._setFocusWindow(window);
else if (y < keyboardHeight) else
this._setFocusWindow(null); this._setFocusWindow(null);
} else { } else {
this._setFocusWindow(null); this._setFocusWindow(null);