summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2019-01-19 15:58:45 +0100
committerFlorian Müllner <fmuellner@gnome.org>2019-02-05 16:25:57 +0100
commitf78efc46e7bfc1e9f2a2c5830759cd0ccc0c7fb3 (patch)
treed5aa97f2ad0fb86eca3c99ab4588a8cfdb40c44f
parent42ae052da76fb3c4070b1cb95b1cc3ad1cade923 (diff)
downloadgnome-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.js85
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() {