From bf2d2071fc6062d25a6dadea830df5a5e2cbbb27 Mon Sep 17 00:00:00 2001 From: Giovanni Campagna Date: Fri, 20 Jul 2012 15:59:53 +0200 Subject: [PATCH] Keyboard: fix timestamp handling to account for CURRENT_TIME CLUTTER_CURRENT_TIME (like GDK_CURRENT_TIME and libX11 CurrentTime) is 0, and thus compares lower than all valid timestamps, meaning that focus changes without an X11 event in the stack are ignored by the on screen keyboard. https://bugzilla.gnome.org/show_bug.cgi?id=664309 --- js/ui/keyboard.js | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/js/ui/keyboard.js b/js/ui/keyboard.js index 57e4db427..6a4d50833 100644 --- a/js/ui/keyboard.js +++ b/js/ui/keyboard.js @@ -201,7 +201,7 @@ const Keyboard = new Lang.Class({ this.actor = null; - this._timestamp = global.get_current_time(); + this._timestamp = global.display.get_current_time_roundtrip(); Main.layoutManager.connect('monitors-changed', Lang.bind(this, this._redraw)); this._keyboardSettings = new Gio.Settings({ schema: KEYBOARD_SCHEMA }); @@ -494,15 +494,30 @@ const Keyboard = new Lang.Class({ this._moveTemporarily(); }, + // _compareTimestamp: + // + // Compare two timestamps taking into account + // CURRENT_TIME (0) + _compareTimestamp: function(one, two) { + if (one == two) + return 0; + if (one == Clutter.CURRENT_TIME) + return 1; + if (two == Clutter.CURRENT_TIME) + return -1; + return one - two; + }, + // D-Bus methods Show: function(timestamp) { if (!this._enableKeyboard) return; - if (timestamp - this._timestamp < 0) + if (this._compareTimestamp(timestamp, this._timestamp) < 0) return; - this._timestamp = timestamp; + if (timestamp != Clutter.CURRENT_TIME) + this._timestamp = timestamp; this.show(); }, @@ -510,10 +525,11 @@ const Keyboard = new Lang.Class({ if (!this._enableKeyboard) return; - if (timestamp - this._timestamp < 0) + if (this._compareTimestamp(timestamp, this._timestamp) < 0) return; - this._timestamp = timestamp; + if (timestamp != Clutter.CURRENT_TIME) + this._timestamp = timestamp; this.hide(); },