[gnome-shell/wip/rstrode/rhel-7.9: 44/86] keyboard: Do not call KeyboardManager.holdKeyboard() with set-content-type




commit ba0c5321dd1e7e375c4fc46a0be44ba36f024aad
Author: Takao Fujiwara <tfujiwar redhat com>
Date:   Fri Aug 31 20:22:23 2018 +0900

    keyboard: Do not call KeyboardManager.holdKeyboard() with set-content-type
    
    When gnome-shell receives the signal of 'set-content-type' from ibus,
    gnome-shell calls KeyboardManager.holdKeyboard() and
    KeyboardManager.releaseKeyboard() and the functions change the current
    input focus in GNOME Xorg and it could result in closing a popup window
    which has a password entry by focusing on the entry.
    The solution is to stop to call the APIs on 'set-content-type' signal.
    
    https://gitlab.gnome.org/GNOME/gnome-shell/issues/391

 js/ui/status/keyboard.js | 18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)
---
diff --git a/js/ui/status/keyboard.js b/js/ui/status/keyboard.js
index 3dce2c9f9a..b80566adb2 100644
--- a/js/ui/status/keyboard.js
+++ b/js/ui/status/keyboard.js
@@ -360,11 +360,14 @@ var InputSourceManager = new Lang.Class({
         this._settings.connect('per-window-changed', this._sourcesPerWindowChanged.bind(this));
         this._sourcesPerWindowChanged();
         this._disableIBus = false;
+        this._reloading = false;
     },
 
     reload() {
+        this._reloading = true;
         this._keyboardManager.setKeyboardOptions(this._settings.keyboardOptions);
         this._inputSourcesChanged();
+        this._reloading = false;
     },
 
     _ibusReadyCallback(im, ready) {
@@ -458,7 +461,15 @@ var InputSourceManager = new Lang.Class({
     },
 
     activateInputSource(is, interactive) {
-        KeyboardManager.holdKeyboard();
+        // The focus changes during holdKeyboard/releaseKeyboard may trick
+        // the client into hiding UI containing the currently focused entry.
+        // So holdKeyboard/releaseKeyboard are not called when
+        // 'set-content-type' signal is received.
+        // E.g. Focusing on a password entry in a popup in Xorg Firefox
+        // will emit 'set-content-type' signal.
+        // https://gitlab.gnome.org/GNOME/gnome-shell/issues/391
+        if (!this._reloading)
+            KeyboardManager.holdKeyboard();
         this._keyboardManager.apply(is.xkbId);
 
         // All the "xkb:..." IBus engines simply "echo" back symbols,
@@ -473,7 +484,10 @@ var InputSourceManager = new Lang.Class({
         else
             engine = 'xkb:us::eng';
 
-        this._ibusManager.setEngine(engine, KeyboardManager.releaseKeyboard);
+        if (!this._reloading)
+            this._ibusManager.setEngine(engine, KeyboardManager.releaseKeyboard);
+        else
+            this._ibusManager.setEngine(engine);
         this._currentInputSourceChanged(is);
 
         if (interactive)


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