From 7f9c96a5a1e619c03bf81c8b3783703b780edaf4 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 18 Jun 2023 15:38:09 +0200 Subject: Adding upstream version 20230618. Signed-off-by: Daniel Baumann --- extensions/vertical-workspaces/lib/overlayKey.js | 108 +++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 extensions/vertical-workspaces/lib/overlayKey.js (limited to 'extensions/vertical-workspaces/lib/overlayKey.js') diff --git a/extensions/vertical-workspaces/lib/overlayKey.js b/extensions/vertical-workspaces/lib/overlayKey.js new file mode 100644 index 0000000..e0fc11d --- /dev/null +++ b/extensions/vertical-workspaces/lib/overlayKey.js @@ -0,0 +1,108 @@ +/** + * V-Shell (Vertical Workspaces) + * overlayKey.js + * + * @author GdH + * @copyright 2022 - 2023 + * @license GPL-3.0 + * + */ + +'use strict'; +const { GObject, Gio, GLib, Meta, St } = imports.gi; + +const Main = imports.ui.main; +const Overview = imports.ui.overview; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const _Util = Me.imports.lib.util; + +const _ = Me.imports.lib.settings._; +const shellVersion = _Util.shellVersion; +const WIN_SEARCH_PREFIX = Me.imports.lib.windowSearchProvider.prefix; +const RECENT_FILES_PREFIX = Me.imports.lib.recentFilesSearchProvider.prefix; +const A11Y_SCHEMA = 'org.gnome.desktop.a11y.keyboard'; + +let opt; +let _firstRun = true; + +let _originalOverlayKeyHandlerId; +let _overlayKeyHandlerId; + +function update(reset = false) { + opt = Me.imports.lib.settings.opt; + const moduleEnabled = opt.get('overlayKeyModule', true); + reset = reset || (!_firstRun && !moduleEnabled); + + // don't even touch this module if disabled + if (_firstRun && !moduleEnabled) + return; + + _firstRun = false; + + if (reset) { + _updateOverlayKey(reset); + opt = null; + return; + } + + _updateOverlayKey(); +} + +function _updateOverlayKey(reset = false) { + if (reset) { + _restoreOverlayKeyHandler(); + } else if (!_originalOverlayKeyHandlerId) { + _originalOverlayKeyHandlerId = GObject.signal_handler_find(global.display, { signalId: 'overlay-key' }); + if (_originalOverlayKeyHandlerId !== null) + global.display.block_signal_handler(_originalOverlayKeyHandlerId); + _connectOverlayKey.bind(Main.overview._overview.controls)(); + } +} + +function _restoreOverlayKeyHandler() { + // Disconnect modified overlay key handler + if (_overlayKeyHandlerId !== null) { + global.display.disconnect(_overlayKeyHandlerId); + _overlayKeyHandlerId = null; + } + + // Unblock original overlay key handler + if (_originalOverlayKeyHandlerId !== null) { + global.display.unblock_signal_handler(_originalOverlayKeyHandlerId); + _originalOverlayKeyHandlerId = null; + } +} + +function _connectOverlayKey() { + this._a11ySettings = new Gio.Settings({ schema_id: A11Y_SCHEMA }); + + this._lastOverlayKeyTime = 0; + _overlayKeyHandlerId = global.display.connect('overlay-key', () => { + if (this._a11ySettings.get_boolean('stickykeys-enable')) + return; + + const { initialState, finalState, transitioning } = + this._stateAdjustment.getStateTransitionParams(); + + const time = GLib.get_monotonic_time() / 1000; + const timeDiff = time - this._lastOverlayKeyTime; + this._lastOverlayKeyTime = time; + + const shouldShift = St.Settings.get().enable_animations + ? transitioning && finalState > initialState + : Main.overview.visible && timeDiff < Overview.ANIMATION_TIME; + + const mode = opt.OVERLAY_KEY_SECONDARY; + if (shouldShift) { + if (mode === 1) + this._shiftState(Meta.MotionDirection.UP); + else if (mode === 2) + _Util.activateSearchProvider(WIN_SEARCH_PREFIX); + else if (mode === 3) + _Util.activateSearchProvider(RECENT_FILES_PREFIX); + } else { + Main.overview.toggle(); + } + }); +} -- cgit v1.2.3