Blame SOURCES/0001-Add-extra-osk-keys-extension.patch

6714ba
From 2ebc78ce92ae615d36ae80420b737b6f1583c7c8 Mon Sep 17 00:00:00 2001
6714ba
From: rpm-build <rpm-build>
6714ba
Date: Fri, 9 Aug 2019 14:46:44 +0200
6714ba
Subject: [PATCH] Add extra-osk-keys extension
6714ba
6714ba
Originally improveosk by Simon Schumann,
6714ba
https://extensions.gnome.org/extension/1631/improve-onscreen-keyboard/
6714ba
---
6714ba
 extensions/extra-osk-keys/extension.js     | 230 +++++++++++++++++++++
6714ba
 extensions/extra-osk-keys/meson.build      |   5 +
6714ba
 extensions/extra-osk-keys/metadata.json.in |  10 +
6714ba
 extensions/extra-osk-keys/stylesheet.css   |   6 +
6714ba
 meson.build                                |   1 +
6714ba
 5 files changed, 252 insertions(+)
6714ba
 create mode 100644 extensions/extra-osk-keys/extension.js
6714ba
 create mode 100644 extensions/extra-osk-keys/meson.build
6714ba
 create mode 100644 extensions/extra-osk-keys/metadata.json.in
6714ba
 create mode 100644 extensions/extra-osk-keys/stylesheet.css
6714ba
6714ba
diff --git a/extensions/extra-osk-keys/extension.js b/extensions/extra-osk-keys/extension.js
6714ba
new file mode 100644
6714ba
index 0000000..23221d7
6714ba
--- /dev/null
6714ba
+++ b/extensions/extra-osk-keys/extension.js
6714ba
@@ -0,0 +1,230 @@
6714ba
+
6714ba
+const St = imports.gi.St;
6714ba
+const Main = imports.ui.main;
6714ba
+const Keyboard = imports.ui.keyboard;
6714ba
+const EdgeDragAction = imports.ui.edgeDragAction;
6714ba
+const Shell = imports.gi.Shell;
6714ba
+const Lang = imports.lang;
6714ba
+const Clutter = imports.gi.Clutter;
6714ba
+const Workspace = imports.ui.workspace
6714ba
+const Tweener = imports.ui.tweener;
6714ba
+const Overview = imports.ui.overview;
6714ba
+const Layout = imports.ui.layout;
6714ba
+
6714ba
+var defaultKeyboardDelay;
6714ba
+var Backup_DefaultKeysForRow;
6714ba
+var Backup_contructor;
6714ba
+var Backup_keyvalPress;
6714ba
+var Backup_keyvalRelease;
6714ba
+
6714ba
+
6714ba
+function init() {
6714ba
+    defaultKeyboardDelay = Layout.KEYBOARD_ANIMATION_TIME;
6714ba
+    Backup_DefaultKeysForRow = Keyboard.Keyboard.prototype['_getDefaultKeysForRow'];
6714ba
+    Backup_contructor = Keyboard.KeyboardController.prototype['constructor'];
6714ba
+    Backup_keyvalPress = Keyboard.KeyboardController.prototype['keyvalPress'];
6714ba
+    Backup_keyvalRelease = Keyboard.KeyboardController.prototype['keyvalRelease'];
6714ba
+}
6714ba
+
6714ba
+function enable() {
6714ba
+    Main.layoutManager.removeChrome(Main.layoutManager.keyboardBox);
6714ba
+
6714ba
+    var KeyboardIsSetup = true;
6714ba
+    try {
6714ba
+      Main.keyboard._destroyKeyboard();
6714ba
+    } catch (e) {
6714ba
+        if(e instanceof TypeError) {
6714ba
+            // In case the keyboard is currently disabled in accessability settings, attempting to _destroyKeyboard() yields a TypeError ("TypeError: this.actor is null")
6714ba
+            // This doesn't affect functionality, so proceed as usual. The only difference is that we do not automatically _setupKeyboard at the end of this enable() (let the user enable the keyboard in accessability settings)
6714ba
+            KeyboardIsSetup = false;
6714ba
+        } else {
6714ba
+            // Something different happened
6714ba
+            throw e;
6714ba
+        }
6714ba
+    }
6714ba
+    
6714ba
+
6714ba
+    Keyboard.Keyboard.prototype['_getDefaultKeysForRow'] = function(row, numRows, level) {
6714ba
+        
6714ba
+        let defaultKeysPreMod = [
6714ba
+            [ [{ label: 'Esc', width: 1, keyval: Clutter.KEY_Escape }], [{ label: '↹', width: 1.5, keyval: Clutter.KEY_Tab }], [{ width: 1.5, level: 1, extraClassName: 'shift-key-lowercase' }], [{ label: 'Ctrl', width: 1, keyval: Clutter.KEY_Control_L, extraClassName: 'control-key' }, { label: '◆', width: 1, keyval: Clutter.KEY_Super_L, extraClassName: 'super-key' }, { label: 'Alt', width: 1, keyval: Clutter.KEY_Alt_L, extraClassName: 'alt-key' }] ],
6714ba
+            [ [{ label: 'Esc', width: 1, keyval: Clutter.KEY_Escape }], [{ label: '↹', width: 1.5, keyval: Clutter.KEY_Tab }], [{ width: 1.5, level: 0, extraClassName: 'shift-key-uppercase' }], [{ label: 'Ctrl', width: 1, keyval: Clutter.KEY_Control_L, extraClassName: 'control-key' }, { label: '◆', width: 1, keyval: Clutter.KEY_Super_L, extraClassName: 'super-key' }, { label: 'Alt', width: 1, keyval: Clutter.KEY_Alt_L, extraClassName: 'alt-key' }] ],
6714ba
+            [ [{ label: 'Esc', width: 1, keyval: Clutter.KEY_Escape }], [{ label: '↹', width: 1.5, keyval: Clutter.KEY_Tab }], [{ label: '=/
6714ba
+            [ [{ label: 'Esc', width: 1, keyval: Clutter.KEY_Escape }], [{ label: '↹', width: 1.5, keyval: Clutter.KEY_Tab }], [{ label: '?123', width: 1.5, level: 2 }], [{ label: 'Ctrl', width: 1, keyval: Clutter.KEY_Control_L, extraClassName: 'control-key' }, { label: '◆', width: 1, keyval: Clutter.KEY_Super_L, extraClassName: 'super-key' }, { label: 'Alt', width: 1, keyval: Clutter.KEY_Alt_L, extraClassName: 'alt-key' }] ],
6714ba
+        ];
6714ba
+
6714ba
+    
6714ba
+        let defaultKeysPostMod = [
6714ba
+            [ [{ label: '⌫', width: 1.5, keyval: Clutter.KEY_BackSpace }, { label: '⌦', width: 1, keyval: Clutter.KEY_Delete }, { width: 1, action: 'hide', extraClassName: 'hide-key' }],
6714ba
+              [{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key' }, { width: 1.5, action: 'languageMenu', extraClassName: 'layout-key' }],
6714ba
+              [{ width: 3, level: 1, right: true, extraClassName: 'shift-key-lowercase' }, { label: '?123', width: 1.5, level: 2 }],
6714ba
+              [{ label: '←', width: 1, keyval: Clutter.KEY_Left }, { label: '↑', width: 1, keyval: Clutter.KEY_Up }, { label: '↓', width: 1, keyval: Clutter.KEY_Down }, { label: '→', width: 1, keyval: Clutter.KEY_Right }] ],
6714ba
+            [ [{ label: '⌫', width: 1.5, keyval: Clutter.KEY_BackSpace }, { label: '⌦', width: 1, keyval: Clutter.KEY_Delete }, { width: 1, action: 'hide', extraClassName: 'hide-key' }],
6714ba
+              [{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key' }, { width: 1.5, action: 'languageMenu', extraClassName: 'layout-key' }],
6714ba
+              [{ width: 3, level: 0, right: true, extraClassName: 'shift-key-uppercase' }, { label: '?123', width: 1.5, level: 2 }],
6714ba
+              [{ label: '←', width: 1, keyval: Clutter.KEY_Left }, { label: '↑', width: 1, keyval: Clutter.KEY_Up }, { label: '↓', width: 1, keyval: Clutter.KEY_Down }, { label: '→', width: 1, keyval: Clutter.KEY_Right }] ],
6714ba
+            [ [{ label: '⌫', width: 1.5, keyval: Clutter.KEY_BackSpace }, { label: '⌦', width: 1, keyval: Clutter.KEY_Delete }, { width: 1, action: 'hide', extraClassName: 'hide-key' }],
6714ba
+              [{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key' }, { width: 1.5, action: 'languageMenu', extraClassName: 'layout-key' }],
6714ba
+              [{ label: '=/
6714ba
+              [{ label: '←', width: 1, keyval: Clutter.KEY_Left }, { label: '↑', width: 1, keyval: Clutter.KEY_Up }, { label: '↓', width: 1, keyval: Clutter.KEY_Down }, { label: '→', width: 1, keyval: Clutter.KEY_Right }] ],
6714ba
+            [ [{ label: 'F1', width: 1, keyval: Clutter.KEY_F1 }, { label: 'F2', width: 1, keyval: Clutter.KEY_F2 }, { label: 'F3', width: 1, keyval: Clutter.KEY_F3 }, { label: '⌫', width: 1.5, keyval: Clutter.KEY_BackSpace }, { label: '⌦', width: 1, keyval: Clutter.KEY_Delete }, { width: 1, action: 'hide', extraClassName: 'hide-key' }],
6714ba
+              [{ label: 'F4', width: 1, keyval: Clutter.KEY_F4 }, { label: 'F5', width: 1, keyval: Clutter.KEY_F5 }, { label: 'F6', width: 1, keyval: Clutter.KEY_F6 }, { width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key' }, { width: 1.5, action: 'languageMenu', extraClassName: 'layout-key' }],
6714ba
+              [{ label: 'F7', width: 1, keyval: Clutter.KEY_F7 }, { label: 'F8', width: 1, keyval: Clutter.KEY_F8 }, { label: 'F9', width: 1, keyval: Clutter.KEY_F9 }, { label: '?123', width: 3, level: 2, right: true }, { label: 'ABC', width: 1.5, level: 0 }],
6714ba
+              [{ label: 'F10', width: 1, keyval: Clutter.KEY_F10 }, { label: 'F11', width: 1, keyval: Clutter.KEY_F11 }, { label: 'F12', width: 1, keyval: Clutter.KEY_F12 }, { label: '←', width: 1, keyval: Clutter.KEY_Left }, { label: '↑', width: 1, keyval: Clutter.KEY_Up }, { label: '↓', width: 1, keyval: Clutter.KEY_Down }, { label: '→', width: 1, keyval: Clutter.KEY_Right }] ],
6714ba
+        ];
6714ba
+
6714ba
+    
6714ba
+        let pre, post;
6714ba
+
6714ba
+        /* The first 2 rows in defaultKeysPre/Post belong together with
6714ba
+         * the first 2 rows on each keymap. On keymaps that have more than
6714ba
+         * 4 rows, the last 2 default key rows must be respectively
6714ba
+         * assigned to the 2 last keymap ones.
6714ba
+         */
6714ba
+        if (row < 2) {
6714ba
+            return [defaultKeysPreMod[level][row], defaultKeysPostMod[level][row]];
6714ba
+        } else if (row >= numRows - 2) {
6714ba
+            let defaultRow = row - (numRows - 2) + 2;
6714ba
+            return [defaultKeysPreMod[level][defaultRow], defaultKeysPostMod[level][defaultRow]];
6714ba
+        } else {
6714ba
+            return [null, null];
6714ba
+        }
6714ba
+    }
6714ba
+    
6714ba
+    Keyboard.KeyboardController.prototype['constructor'] = function() {
6714ba
+        let deviceManager = Clutter.DeviceManager.get_default();
6714ba
+        this._virtualDevice = deviceManager.create_virtual_device(Clutter.InputDeviceType.KEYBOARD_DEVICE);
6714ba
+
6714ba
+        this._inputSourceManager = InputSourceManager.getInputSourceManager();
6714ba
+        this._sourceChangedId = this._inputSourceManager.connect('current-source-changed',
6714ba
+                                                                 this._onSourceChanged.bind(this));
6714ba
+        this._sourcesModifiedId = this._inputSourceManager.connect ('sources-changed',
6714ba
+                                                                    this._onSourcesModified.bind(this));
6714ba
+        this._currentSource = this._inputSourceManager.currentSource;
6714ba
+        
6714ba
+        this._controlActive = false;
6714ba
+        this._superActive = false;
6714ba
+        this._altActive = false;
6714ba
+
6714ba
+        Main.inputMethod.connect('notify::content-purpose',
6714ba
+                                 this._onContentPurposeHintsChanged.bind(this));
6714ba
+        Main.inputMethod.connect('notify::content-hints',
6714ba
+                                 this._onContentPurposeHintsChanged.bind(this));
6714ba
+        Main.inputMethod.connect('input-panel-state', (o, state) => {
6714ba
+            this.emit('panel-state', state);
6714ba
+        });
6714ba
+    }
6714ba
+
6714ba
+    
6714ba
+    Keyboard.KeyboardController.prototype['keyvalPress'] = function(keyval) {
6714ba
+        if(keyval==Clutter.KEY_Control_L) {
6714ba
+            this._controlActive = !this._controlActive; // This allows to revert an accidental tap on Ctrl by tapping on it again
6714ba
+        }
6714ba
+        if(keyval==Clutter.KEY_Super_L) {
6714ba
+            this._superActive = !this._superActive;
6714ba
+        }
6714ba
+        if(keyval==Clutter.KEY_Alt_L) {
6714ba
+            this._altActive = !this._altActive;
6714ba
+        }
6714ba
+        
6714ba
+        if(this._controlActive)
6714ba
+        {
6714ba
+            this._virtualDevice.notify_keyval(Clutter.get_current_event_time(),
6714ba
+                                              Clutter.KEY_Control_L, Clutter.KeyState.PRESSED);
6714ba
+            Main.layoutManager.keyboardBox.add_style_class_name("control-key-latched");
6714ba
+        } else {
6714ba
+            this._virtualDevice.notify_keyval(Clutter.get_current_event_time(),
6714ba
+                                              Clutter.KEY_Control_L, Clutter.KeyState.RELEASED);
6714ba
+            Main.layoutManager.keyboardBox.remove_style_class_name("control-key-latched");
6714ba
+        }
6714ba
+        if(this._superActive)
6714ba
+        {
6714ba
+            this._virtualDevice.notify_keyval(Clutter.get_current_event_time(),
6714ba
+                                              Clutter.KEY_Super_L, Clutter.KeyState.PRESSED);
6714ba
+            Main.layoutManager.keyboardBox.add_style_class_name("super-key-latched");
6714ba
+        } else {
6714ba
+            this._virtualDevice.notify_keyval(Clutter.get_current_event_time(),
6714ba
+                                              Clutter.KEY_Super_L, Clutter.KeyState.RELEASED);
6714ba
+            Main.layoutManager.keyboardBox.remove_style_class_name("super-key-latched");
6714ba
+        }
6714ba
+        if(this._altActive)
6714ba
+        {
6714ba
+            this._virtualDevice.notify_keyval(Clutter.get_current_event_time(),
6714ba
+                                              Clutter.KEY_Alt_L, Clutter.KeyState.PRESSED);
6714ba
+            Main.layoutManager.keyboardBox.add_style_class_name("alt-key-latched");
6714ba
+        } else {
6714ba
+            this._virtualDevice.notify_keyval(Clutter.get_current_event_time(),
6714ba
+                                              Clutter.KEY_Alt_L, Clutter.KeyState.RELEASED);
6714ba
+            Main.layoutManager.keyboardBox.remove_style_class_name("alt-key-latched");
6714ba
+        }
6714ba
+        this._virtualDevice.notify_keyval(Clutter.get_current_event_time(),
6714ba
+                                          keyval, Clutter.KeyState.PRESSED);
6714ba
+    }
6714ba
+
6714ba
+    
6714ba
+    Keyboard.KeyboardController.prototype['keyvalRelease'] = function(keyval) {
6714ba
+        if(keyval==Clutter.KEY_Control_L || keyval==Clutter.KEY_Alt_L || keyval==Clutter.KEY_Super_L) {
6714ba
+            return;
6714ba
+        }
6714ba
+        
6714ba
+        this._virtualDevice.notify_keyval(Clutter.get_current_event_time(),
6714ba
+                                          keyval, Clutter.KeyState.RELEASED);
6714ba
+
6714ba
+        if(this._controlActive)
6714ba
+        {
6714ba
+            this._virtualDevice.notify_keyval(Clutter.get_current_event_time(),
6714ba
+                                              Clutter.KEY_Control_L, Clutter.KeyState.RELEASED);
6714ba
+            this._controlActive = false;
6714ba
+            Main.layoutManager.keyboardBox.remove_style_class_name("control-key-latched");
6714ba
+        }
6714ba
+        if(this._superActive)
6714ba
+        {
6714ba
+            this._virtualDevice.notify_keyval(Clutter.get_current_event_time(),
6714ba
+                                              Clutter.KEY_Super_L, Clutter.KeyState.RELEASED);
6714ba
+            this._superActive = false;
6714ba
+            Main.layoutManager.keyboardBox.remove_style_class_name("super-key-latched");
6714ba
+        }
6714ba
+        if(this._altActive)
6714ba
+        {
6714ba
+            this._virtualDevice.notify_keyval(Clutter.get_current_event_time(),
6714ba
+                                              Clutter.KEY_Alt_L, Clutter.KeyState.RELEASED);
6714ba
+            this._altActive = false;
6714ba
+            Main.layoutManager.keyboardBox.remove_style_class_name("alt-key-latched");
6714ba
+        }
6714ba
+
6714ba
+    }
6714ba
+
6714ba
+    Layout.KEYBOARD_ANIMATION_TIME = 0;
6714ba
+    if(KeyboardIsSetup) {
6714ba
+        Main.keyboard._setupKeyboard();
6714ba
+    }
6714ba
+    Main.layoutManager.addChrome(   Main.layoutManager.keyboardBox, { affectsStruts: true, trackFullscreen: false });
6714ba
+}
6714ba
+
6714ba
+function disable() {
6714ba
+    Main.layoutManager.removeChrome(Main.layoutManager.keyboardBox);
6714ba
+    
6714ba
+    var KeyboardIsSetup = true;
6714ba
+    try {
6714ba
+      Main.keyboard._destroyKeyboard();
6714ba
+    } catch (e) {
6714ba
+        if(e instanceof TypeError) {
6714ba
+            // In case the keyboard is currently disabled in accessability settings, attempting to _destroyKeyboard() yields a TypeError ("TypeError: this.actor is null")
6714ba
+            // This doesn't affect functionality, so proceed as usual. The only difference is that we do not automatically _setupKeyboard at the end of this enable() (let the user enable the keyboard in accessability settings)
6714ba
+            KeyboardIsSetup = false;
6714ba
+        } else {
6714ba
+            // Something different happened
6714ba
+            throw e;
6714ba
+        }
6714ba
+    }
6714ba
+    
6714ba
+    Keyboard.Keyboard.prototype['_getDefaultKeysForRow'] = Backup_DefaultKeysForRow;
6714ba
+    Keyboard.KeyboardController.prototype['constructor'] = Backup_contructor;
6714ba
+    Keyboard.KeyboardController.prototype['keyvalPress'] = Backup_keyvalPress;
6714ba
+    Keyboard.KeyboardController.prototype['keyvalRelease'] = Backup_keyvalRelease;
6714ba
+    Layout.KEYBOARD_ANIMATION_TIME = defaultKeyboardDelay;
6714ba
+    if(KeyboardIsSetup) {
6714ba
+        Main.keyboard._setupKeyboard();
6714ba
+    }
6714ba
+    Main.layoutManager.addChrome(   Main.layoutManager.keyboardBox);
6714ba
+}
6714ba
diff --git a/extensions/extra-osk-keys/meson.build b/extensions/extra-osk-keys/meson.build
6714ba
new file mode 100644
6714ba
index 0000000..48504f6
6714ba
--- /dev/null
6714ba
+++ b/extensions/extra-osk-keys/meson.build
6714ba
@@ -0,0 +1,5 @@
6714ba
+extension_data += configure_file(
6714ba
+  input: metadata_name + '.in',
6714ba
+  output: metadata_name,
6714ba
+  configuration: metadata_conf
6714ba
+)
6714ba
diff --git a/extensions/extra-osk-keys/metadata.json.in b/extensions/extra-osk-keys/metadata.json.in
6714ba
new file mode 100644
6714ba
index 0000000..39dfdd3
6714ba
--- /dev/null
6714ba
+++ b/extensions/extra-osk-keys/metadata.json.in
6714ba
@@ -0,0 +1,10 @@
6714ba
+{
6714ba
+"extension-id": "@extension_id@",
6714ba
+"uuid": "@uuid@",
6714ba
+"gettext-domain": "@gettext_domain@",
6714ba
+"name": "Extra Onscreen Keyboard Keys",
6714ba
+"description": "Adds extra keys to gnome-shell onscreen keyboard.",
6714ba
+"original-authors": [ "simon.schumann@web.de" ],
6714ba
+"shell-version": [ "@shell_current@" ],
6714ba
+"url": "@url@"
6714ba
+}
6714ba
diff --git a/extensions/extra-osk-keys/stylesheet.css b/extensions/extra-osk-keys/stylesheet.css
6714ba
new file mode 100644
6714ba
index 0000000..010cfb3
6714ba
--- /dev/null
6714ba
+++ b/extensions/extra-osk-keys/stylesheet.css
6714ba
@@ -0,0 +1,6 @@
6714ba
+.control-key-latched .control-key,
6714ba
+.super-key-latched .super-key,
6714ba
+.alt-key-latched .alt-key {
6714ba
+      background-color: #55a54c;
6714ba
+}
6714ba
+
6714ba
diff --git a/meson.build b/meson.build
6714ba
index df2be33..fa4aa9c 100644
6714ba
--- a/meson.build
6714ba
+++ b/meson.build
6714ba
@@ -56,6 +56,7 @@ all_extensions += [
6714ba
   'dash-to-dock',
6714ba
   'disable-screenshield',
6714ba
   'example',
6714ba
+  'extra-osk-keys',
6714ba
   'native-window-placement',
6714ba
   'no-hot-corner',
6714ba
   'panel-favorites',
6714ba
-- 
6714ba
2.23.0.rc1
6714ba