diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2019-01-19 15:58:45 +0100 |
---|---|---|
committer | Florian Müllner <fmuellner@gnome.org> | 2019-02-05 16:25:57 +0100 |
commit | f78efc46e7bfc1e9f2a2c5830759cd0ccc0c7fb3 (patch) | |
tree | d5aa97f2ad0fb86eca3c99ab4588a8cfdb40c44f | |
parent | 42ae052da76fb3c4070b1cb95b1cc3ad1cade923 (diff) | |
download | gnome-shell-f78efc46e7bfc1e9f2a2c5830759cd0ccc0c7fb3.tar.gz |
keyboard: Implement keypad OSK panel
This is pretty ad-hoc, the panel is hooked so it shows right away on the
right Clutter.InputContentPurpose.
-rw-r--r-- | js/ui/keyboard.js | 85 |
1 files changed, 80 insertions, 5 deletions
diff --git a/js/ui/keyboard.js b/js/ui/keyboard.js index a0c68c740..587d9c0e7 100644 --- a/js/ui/keyboard.js +++ b/js/ui/keyboard.js @@ -982,6 +982,52 @@ var EmojiSelection = class EmojiSelection { }; Signals.addSignalMethods(EmojiSelection.prototype); +var Keypad = class Keypad { + constructor() { + let keys = [ + { label: '1', keyval: Clutter.KEY_1, left: 0, top: 0 }, + { label: '2', keyval: Clutter.KEY_2, left: 1, top: 0 }, + { label: '3', keyval: Clutter.KEY_3, left: 2, top: 0 }, + { label: '4', keyval: Clutter.KEY_4, left: 0, top: 1 }, + { label: '5', keyval: Clutter.KEY_5, left: 1, top: 1 }, + { label: '6', keyval: Clutter.KEY_6, left: 2, top: 1 }, + { label: '7', keyval: Clutter.KEY_7, left: 0, top: 2 }, + { label: '8', keyval: Clutter.KEY_8, left: 1, top: 2 }, + { label: '9', keyval: Clutter.KEY_9, left: 2, top: 2 }, + { label: '0', keyval: Clutter.KEY_0, left: 1, top: 3 }, + { label: '⌫', keyval: Clutter.KEY_BackSpace, left: 3, top: 0 }, + { keyval: Clutter.KEY_Return, extraClassName: 'enter-key', left: 3, top: 1, height: 2 }, + ]; + + this.actor = new AspectContainer({ layout_manager: new Clutter.BinLayout(), + x_expand: true, y_expand: true }); + + let gridLayout = new Clutter.GridLayout({ orientation: Clutter.Orientation.HORIZONTAL, + column_homogeneous: true, + row_homogeneous: true }); + this._box = new St.Widget({ layout_manager: gridLayout, x_expand: true, y_expand: true }); + this.actor.add_child(this._box); + + for (let i = 0; i < keys.length; i++) { + let cur = keys[i]; + let key = new Key(cur.label || "", []); + + if (keys[i].extraClassName) + key.keyButton.add_style_class_name(cur.extraClassName); + + let w, h; + w = cur.width || 1; + h = cur.height || 1; + gridLayout.attach(key.actor, cur.left, cur.top, w, h); + + key.connect('released', () => { + this.emit('keyval', cur.keyval); + }); + } + } +}; +Signals.addSignalMethods(Keypad.prototype); + var Keyboard = class Keyboard { constructor() { this.actor = null; @@ -1092,6 +1138,8 @@ var Keyboard = class Keyboard { this._keyboardController.disconnect(this._keyboardStateId); if (this._emojiKeyVisibleId) this._keyboardController.disconnect(this._emojiKeyVisibleId); + if (this._keypadVisibleId) + this._keyboardController.disconnect(this._keypadVisibleId); if (this._focusNotifyId) global.stage.disconnect(this._focusNotifyId); this._keyboard = null; @@ -1132,6 +1180,15 @@ var Keyboard = class Keyboard { this._aspectContainer.add_child(this._emojiSelection.actor); this._emojiSelection.actor.hide(); + this._keypad = new Keypad(); + this._keypad.connect('keyval', (keypad, keyval) => { + this._keyboardController.keyvalPress(keyval); + this._keyboardController.keyvalRelease(keyval); + }); + this._aspectContainer.add_child(this._keypad.actor); + this._keypad.actor.hide(); + this._keypadVisible = false; + this._ensureKeysForGroup(this._keyboardController.getCurrentGroup()); this._setActiveLayer(0); @@ -1144,6 +1201,7 @@ var Keyboard = class Keyboard { this._keyboardGroupsChangedId = this._keyboardController.connect('groups-changed', this._onKeyboardGroupsChanged.bind(this)); this._keyboardStateId = this._keyboardController.connect('panel-state', this._onKeyboardStateChanged.bind(this)); this._emojiKeyVisibleId = this._keyboardController.connect('emoji-visible', this._onEmojiKeyVisible.bind(this)); + this._keypadVisibleId = this._keyboardController.connect('keypad-visible', this._onKeypadVisible.bind(this)); this._focusNotifyId = global.stage.connect('notify::key-focus', this._onKeyFocusChanged.bind(this)); this._relayout(); @@ -1319,11 +1377,15 @@ var Keyboard = class Keyboard { } } + _updateCurrentPageVisible() { + if (this._current_page) + this._current_page.visible = !this._emojiActive && !this._keypadVisible; + } + _setEmojiActive(active) { this._emojiActive = active; this._emojiSelection.actor.visible = this._emojiActive; - if (this._current_page) - this._current_page.visible = !this._emojiActive; + this._updateCurrentPageVisible(); } _toggleEmoji() { @@ -1410,6 +1472,15 @@ var Keyboard = class Keyboard { this._onGroupChanged(); } + _onKeypadVisible(controller, visible) { + if (visible == this._keypadVisible) + return; + + this._keypadVisible = visible; + this._keypad.actor.visible = this._keypadVisible; + this._updateCurrentPageVisible(); + } + _onEmojiKeyVisible(controller, visible) { if (visible == this._emojiKeyVisible) return; @@ -1446,7 +1517,7 @@ var Keyboard = class Keyboard { } this._current_page = layers[activeLevel]; - this._current_page.show(); + this._updateCurrentPageVisible(); } shouldTakeEvent(event) { @@ -1666,16 +1737,20 @@ var KeyboardController = class { let hints = method.content_hints; let purpose = method.content_purpose; let emojiVisible = false; + let keypadVisible = false; if (purpose == Clutter.InputContentPurpose.NORMAL || purpose == Clutter.InputContentPurpose.ALPHA || purpose == Clutter.InputContentPurpose.PASSWORD || purpose == Clutter.InputContentPurpose.TERMINAL) emojiVisible = true; + if (purpose == Clutter.InputContentPurpose.DIGITS || + purpose == Clutter.InputContentPurpose.NUMBER || + purpose == Clutter.InputContentPurpose.PHONE) + keypadVisible = true; this.emit('emoji-visible', emojiVisible) - - // XXX: hook numeric/emoji/etc special keyboards + this.emit('keypad-visible', keypadVisible); } getGroups() { |