[gnome-shell] keyboard: Show in an idle on clutter key focus changes



commit f07fee538d35695ef24024eb37d8799e2e3744bd
Author: Rui Matos <tiagomatos gmail com>
Date:   Tue Oct 30 16:46:18 2012 +0100

    keyboard: Show in an idle on clutter key focus changes
    
    It's common to do actor.grab_key_focus() before the actor is mapped
    which means that we can't reliably determine where the actor is at
    notify::key-focus time and thus might end up showing the keyboard on
    the wrong monitor.
    
    This is happening, in particular, with the run dialog. Delaying until
    we hit the main loop allows us to know where the actor finally is
    before showing the OSK.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=685856

 js/ui/keyboard.js |   23 ++++++++++++++++++++---
 1 files changed, 20 insertions(+), 3 deletions(-)
---
diff --git a/js/ui/keyboard.js b/js/ui/keyboard.js
index 67f00ba..e3a9a9b 100644
--- a/js/ui/keyboard.js
+++ b/js/ui/keyboard.js
@@ -182,6 +182,8 @@ const Keyboard = new Lang.Class({
         this._a11yApplicationsSettings = new Gio.Settings({ schema: A11Y_APPLICATIONS_SCHEMA });
         this._a11yApplicationsSettings.connect('changed', Lang.bind(this, this._settingsChanged));
         this._settingsChanged();
+
+        this._showIdleId = 0;
     },
 
     init: function () {
@@ -273,10 +275,14 @@ const Keyboard = new Lang.Class({
             return;
 
         let time = global.get_current_time();
-        if (focus instanceof Clutter.Text)
-            this.Show(time);
-        else
+        if (!(focus instanceof Clutter.Text)) {
             this.Hide(time);
+            return;
+        }
+
+        if (!this._showIdleId)
+            this._showIdleId = GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE,
+                                             Lang.bind(this, function() { this.Show(time); }));
     },
 
     _addKeys: function () {
@@ -502,6 +508,13 @@ const Keyboard = new Lang.Class({
         return one - two;
     },
 
+    _clearShowIdle: function() {
+        if (!this._showIdleId)
+            return;
+        GLib.source_remove(this._showIdleId);
+        this._showIdleId = 0;
+    },
+
     // D-Bus methods
     Show: function(timestamp) {
         if (!this._enableKeyboard)
@@ -510,6 +523,8 @@ const Keyboard = new Lang.Class({
         if (this._compareTimestamp(timestamp, this._timestamp) < 0)
             return;
 
+        this._clearShowIdle();
+
         if (timestamp != Clutter.CURRENT_TIME)
             this._timestamp = timestamp;
         this.show(Main.layoutManager.focusIndex);
@@ -522,6 +537,8 @@ const Keyboard = new Lang.Class({
         if (this._compareTimestamp(timestamp, this._timestamp) < 0)
             return;
 
+        this._clearShowIdle();
+
         if (timestamp != Clutter.CURRENT_TIME)
             this._timestamp = timestamp;
         this.hide();



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