[gnome-shell/wip/carlosg/osk-cldr: 28/45] keyboard: Use InputMethod underneath



commit 5d58ecd426133d3dd754f5b24b8ea06f22826eef
Author: Carlos Garnacho <carlosg gnome org>
Date:   Tue Dec 5 20:05:18 2017 +0100

    keyboard: Use InputMethod underneath

 js/ui/keyboard.js | 68 +++++++++++++++++++++++++++++++++++++++++++++++--------
 1 file changed, 59 insertions(+), 9 deletions(-)
---
diff --git a/js/ui/keyboard.js b/js/ui/keyboard.js
index d3e30a2fa..4152cb676 100644
--- a/js/ui/keyboard.js
+++ b/js/ui/keyboard.js
@@ -100,7 +100,7 @@ var Key = new Lang.Class({
 
     _press: function(key) {
         if (key != this.key || this._extended_keys.length == 0) {
-            this.emit('pressed', this._getKeyval(key));
+            this.emit('pressed', this._getKeyval(key), key);
         } else if (key == this.key) {
             this._pressTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT,
                                                     KEY_LONG_PRESS_TIME,
@@ -122,10 +122,10 @@ var Key = new Lang.Class({
         if (this._pressTimeoutId != 0) {
             GLib.source_remove(this._pressTimeoutId);
             this._pressTimeoutId = 0;
-            this.emit('pressed', this._getKeyval(key));
+            this.emit('pressed', this._getKeyval(key), key);
         }
 
-        this.emit('released', this._getKeyval(key));
+        this.emit('released', this._getKeyval(key), key);
     },
 
     _makeKey: function (key) {
@@ -408,6 +408,8 @@ var Keyboard = new Lang.Class({
             this._keyboardController.disconnect(this._keyboardNotifyId);
         if (this._keyboardGroupsChangedId)
             this._keyboardController.disconnect(this._keyboardGroupsChangedId);
+        if (this._keyboardStateId)
+            this._keyboardController.disconnect(this._keyboardStateId);
         if (this._focusNotifyId)
             global.stage.disconnect(this._focusNotifyId);
         this._keyboard = null;
@@ -438,6 +440,7 @@ var Keyboard = new Lang.Class({
 
         this._keyboardNotifyId = this._keyboardController.connect('active-group', Lang.bind(this, 
this._onGroupChanged));
         this._keyboardGroupsChangedId = this._keyboardController.connect('groups-changed', Lang.bind(this, 
this._onKeyboardGroupsChanged));
+        this._keyboardStateId = this._keyboardController.connect('panel-state', Lang.bind(this, 
this._onKeyboardStateChanged));
         this._focusNotifyId = global.stage.connect('notify::key-focus', Lang.bind(this, 
this._onKeyFocusChanged));
     },
 
@@ -529,15 +532,23 @@ var Keyboard = new Lang.Class({
             button.connect('hide-subkeys', Lang.bind(this, function() {
                 this._hideSubkeys();
             }));
-            button.connect('pressed', Lang.bind(this, function(actor, keyval) {
+            button.connect('pressed', Lang.bind(this, function(actor, keyval, str) {
                 this._hideSubkeys();
-                if (keyval != 0)
-                    this._keyboardController.keyvalPress(keyval);
+                if (!Main.inputMethod.currentFocus ||
+                    !this._keyboardController.commitString(str, true)) {
+                    if (keyval != 0) {
+                        this._keyboardController.keyvalPress(keyval);
+                        button._keyvalPress = true;
+                    }
+                }
             }));
-            button.connect('released', Lang.bind(this, function(actor, keyval) {
+            button.connect('released', Lang.bind(this, function(actor, keyval, str) {
                 this._hideSubkeys();
-                if (keyval != 0)
-                    this._keyboardController.keyvalRelease(keyval);
+                if (keyval != 0) {
+                    if (button._keyvalPress)
+                        this._keyboardController.keyvalRelease(keyval);
+                    button._keyvalPress = false;
+                }
             }));
 
             keyboardRow.add(button.container, { expand: true, x_fill: false, x_align: St.Align.END });
@@ -697,6 +708,23 @@ var Keyboard = new Lang.Class({
         this._addKeys();
     },
 
+    _onKeyboardStateChanged: function(controller, state) {
+        let enabled;
+        if (state == Clutter.InputPanelState.OFF)
+            enabled = false;
+        else if (state == Clutter.InputPanelState.ON)
+            enabled = true;
+        else if (state == Clutter.InputPanelState.TOGGLE)
+            enabled = (this._keyboardVisible == false);
+        else
+            return;
+
+        if (enabled)
+            this.show(Main.layoutManager.focusIndex);
+        else
+            this.hide();
+    },
+
     _setActiveLayer: function (activeLevel) {
         let activeGroupName = this._keyboardController.getCurrentGroup();
         let layers = this._groups[activeGroupName];
@@ -849,6 +877,10 @@ var KeyboardController = new Lang.Class({
         this._sourcesModifiedId = this._inputSourceManager.connect ('sources-changed',
                                                                     Lang.bind(this, 
this._onSourcesModified));
         this._currentSource = this._inputSourceManager.currentSource;
+
+        Main.inputMethod.connect('notify::content-purpose', Lang.bind(this, 
this._onContentPurposeHintsChanged));
+        Main.inputMethod.connect('notify::content-hints', Lang.bind(this, 
this._onContentPurposeHintsChanged));
+        Main.inputMethod.connect('input-panel-state', Lang.bind(this, function(o, state) { 
this.emit('panel-state', state); }));
     },
 
     _onSourcesModified: function () {
@@ -861,6 +893,13 @@ var KeyboardController = new Lang.Class({
         this.emit('active-group', source.id);
     },
 
+    _onContentPurposeHintsChanged: function(method) {
+        let hints = method.content_hints;
+        let purpose = method.content_purpose;
+
+        // XXX: hook numeric/emoji/etc special keyboards
+    },
+
     getGroups: function () {
         let inputSources = this._inputSourceManager.inputSources;
         let groups = []
@@ -877,6 +916,17 @@ var KeyboardController = new Lang.Class({
         return this._currentSource.xkbId;
     },
 
+    commitString: function(string, fromKey) {
+        if (string == null)
+            return false;
+        /* Let ibus methods fall through keyval emission */
+        if (fromKey && this._currentSource.type == InputSourceManager.INPUT_SOURCE_TYPE_IBUS)
+            return false;
+
+        Main.inputMethod.commit(string);
+        return true;
+    },
+
     keyvalPress: function(keyval) {
         this._virtualDevice.notify_keyval(Clutter.get_current_event_time(),
                                           keyval, Clutter.KeyState.PRESSED);


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