From fe0da4e0855ae9688e4166c064977b241019f543 Mon Sep 17 00:00:00 2001 From: Adam Williamson Date: Tue, 11 Oct 2022 22:12:39 +0200 Subject: [PATCH] Backport MR2508 to fix OSK space entry (#2131837) --- 2508.patch | 168 +++++++++++++++++++++++++++++++++++++++++++++++ gnome-shell.spec | 9 ++- 2 files changed, 176 insertions(+), 1 deletion(-) create mode 100644 2508.patch diff --git a/2508.patch b/2508.patch new file mode 100644 index 0000000..78913e3 --- /dev/null +++ b/2508.patch @@ -0,0 +1,168 @@ +From 524a5401266f8b30c2210cf147530cbb815b71ed Mon Sep 17 00:00:00 2001 +From: Carlos Garnacho +Date: Tue, 11 Oct 2022 18:23:19 +0200 +Subject: [PATCH 1/2] keyboard: Refactor code + +Move inline anonymous function to be its own. This method +will become asynchronous in following commits. +--- + js/ui/keyboard.js | 54 +++++++++++++++++++++++++---------------------- + 1 file changed, 29 insertions(+), 25 deletions(-) + +diff --git a/js/ui/keyboard.js b/js/ui/keyboard.js +index 895691c34e..28369316e1 100644 +--- a/js/ui/keyboard.js ++++ b/js/ui/keyboard.js +@@ -1510,31 +1510,8 @@ var Keyboard = GObject.registerClass({ + button.setWidth(key.width); + + if (key.action !== 'modifier') { +- button.connect('commit', (actor, keyval, str) => { +- if (this._modifiers.size === 0 && str !== '' && +- keyval && this._oskCompletionEnabled) { +- Main.inputMethod.handleVirtualKey(keyval); +- return; +- } +- +- if (str === '' || !Main.inputMethod.currentFocus || +- (keyval && this._oskCompletionEnabled) || +- this._modifiers.size > 0 || +- !this._keyboardController.commitString(str, true)) { +- if (keyval !== 0) { +- this._forwardModifiers(this._modifiers, Clutter.EventType.KEY_PRESS); +- this._keyboardController.keyvalPress(keyval); +- GLib.timeout_add(GLib.PRIORITY_DEFAULT, KEY_RELEASE_TIMEOUT, () => { +- this._keyboardController.keyvalRelease(keyval); +- this._forwardModifiers(this._modifiers, Clutter.EventType.KEY_RELEASE); +- this._disableAllModifiers(); +- return GLib.SOURCE_REMOVE; +- }); +- } +- } +- +- if (!this._latched) +- this._setActiveLayer(0); ++ button.connect('commit', (_actor, keyval, str) => { ++ this._commitAction(keyval, str); + }); + } + +@@ -1592,6 +1569,33 @@ var Keyboard = GObject.registerClass({ + } + } + ++ _commitAction(keyval, str) { ++ if (this._modifiers.size === 0 && str !== '' && ++ keyval && this._oskCompletionEnabled) { ++ Main.inputMethod.handleVirtualKey(keyval); ++ return; ++ } ++ ++ if (str === '' || !Main.inputMethod.currentFocus || ++ (keyval && this._oskCompletionEnabled) || ++ this._modifiers.size > 0 || ++ !this._keyboardController.commitString(str, true)) { ++ if (keyval !== 0) { ++ this._forwardModifiers(this._modifiers, Clutter.EventType.KEY_PRESS); ++ this._keyboardController.keyvalPress(keyval); ++ GLib.timeout_add(GLib.PRIORITY_DEFAULT, KEY_RELEASE_TIMEOUT, () => { ++ this._keyboardController.keyvalRelease(keyval); ++ this._forwardModifiers(this._modifiers, Clutter.EventType.KEY_RELEASE); ++ this._disableAllModifiers(); ++ return GLib.SOURCE_REMOVE; ++ }); ++ } ++ } ++ ++ if (!this._latched) ++ this._setActiveLayer(0); ++ } ++ + _previousWordPosition(text, cursor) { + /* Skip word prior to cursor */ + let pos = Math.max(0, text.slice(0, cursor).search(/\s+\S+\s*$/)); +-- +GitLab + + +From 6e997c993e8c392b88cb97644ad604be6dd8028a Mon Sep 17 00:00:00 2001 +From: Carlos Garnacho +Date: Tue, 11 Oct 2022 18:24:15 +0200 +Subject: [PATCH 2/2] inputMethod: Check return value when letting IM handle + virtual keys + +When propagating keys from the OSK, we usually feed these directly to +the IBusInputContext and let the IM handle the effects of this virtual +key event (which may also include feeding a key event back to us). + +But these functions may also return a FALSE value if the key was "let +through" by the IM, which means the ball is in our yard again, and +we are responsible of letting this event get to its destination. + +If that happens, just fall through, so the string is committed to +the client as an UTF-8 string, or propagated through keyboard events. + +Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/5930 +--- + js/misc/inputMethod.js | 19 ++++++++++++++----- + js/ui/keyboard.js | 6 +++--- + 2 files changed, 17 insertions(+), 8 deletions(-) + +diff --git a/js/misc/inputMethod.js b/js/misc/inputMethod.js +index 7bf6646d80..906fe1fc93 100644 +--- a/js/misc/inputMethod.js ++++ b/js/misc/inputMethod.js +@@ -7,6 +7,8 @@ const Main = imports.ui.main; + + Gio._promisify(IBus.Bus.prototype, + 'create_input_context_async', 'create_input_context_async_finish'); ++Gio._promisify(IBus.InputContext.prototype, ++ 'process_key_event_async', 'process_key_event_async_finish'); + + var HIDE_PANEL_TIME = 50; + +@@ -329,10 +331,17 @@ var InputMethod = GObject.registerClass({ + return this._preeditVisible && this._preeditStr !== '' && this._preeditStr !== null; + } + +- handleVirtualKey(keyval) { +- this._context.process_key_event_async( +- keyval, 0, 0, -1, null, null); +- this._context.process_key_event_async( +- keyval, 0, IBus.ModifierType.RELEASE_MASK, -1, null, null); ++ async handleVirtualKey(keyval) { ++ try { ++ if (!await this._context.process_key_event_async( ++ keyval, 0, 0, -1, null)) ++ return false; ++ ++ await this._context.process_key_event_async( ++ keyval, 0, IBus.ModifierType.RELEASE_MASK, -1, null); ++ return true; ++ } catch (e) { ++ return false; ++ } + } + }); +diff --git a/js/ui/keyboard.js b/js/ui/keyboard.js +index 28369316e1..3241571de7 100644 +--- a/js/ui/keyboard.js ++++ b/js/ui/keyboard.js +@@ -1569,11 +1569,11 @@ var Keyboard = GObject.registerClass({ + } + } + +- _commitAction(keyval, str) { ++ async _commitAction(keyval, str) { + if (this._modifiers.size === 0 && str !== '' && + keyval && this._oskCompletionEnabled) { +- Main.inputMethod.handleVirtualKey(keyval); +- return; ++ if (await Main.inputMethod.handleVirtualKey(keyval)) ++ return; + } + + if (str === '' || !Main.inputMethod.currentFocus || +-- +GitLab + diff --git a/gnome-shell.spec b/gnome-shell.spec index 407385a..8ac8a1d 100644 --- a/gnome-shell.spec +++ b/gnome-shell.spec @@ -2,7 +2,7 @@ Name: gnome-shell Version: 43.0 -Release: 2%{?dist} +Release: 3%{?dist} Summary: Window management and application launching for GNOME License: GPLv2+ @@ -15,6 +15,10 @@ Patch0: 2487.patch # Backported from upstream # https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2495 Patch1: 2495.patch +# https://bugzilla.redhat.com/show_bug.cgi?id=2131837 +# Backported from upstream +# https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2508 +Patch2: 2508.patch # Replace Epiphany with Firefox in the default favourite apps list Patch10001: gnome-shell-favourite-apps-firefox.patch @@ -238,6 +242,9 @@ desktop-file-validate %{buildroot}%{_datadir}/applications/evolution-calendar.de %{_mandir}/man1/gnome-shell.1* %changelog +* Tue Oct 11 2022 Adam Williamson - 43.0-3 +- Backport MR2508 to fix OSK space entry (#2131837) + * Thu Sep 22 2022 Kalev Lember - 43.0-2 - Backport MR2487 and MR2495 to fix input sources sorting (#2121110)