From e1bc0853a215bab79b2af1271eeacfbddcabdb56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ole=20J=C3=B8rgen=20Br=C3=B8nner?= Date: Fri, 6 Jul 2018 11:26:54 +0200 Subject: [PATCH] Disable and enable our keybindings more robustly --- extension.js | 8 ------- keybindings.js | 58 +++++++++++++++++++++++++++++++++++++------------- utils.js | 4 ++++ 3 files changed, 47 insertions(+), 23 deletions(-) diff --git a/extension.js b/extension.js index 59497e7..5588081 100644 --- a/extension.js +++ b/extension.js @@ -211,10 +211,6 @@ function enable() { setKeybinding('switch-to-workspace-last', // End Keybindings.byMutterName('switch-last').handler); - Keybindings.actions.forEach(a => { - setKeybinding(a.name, a.handler); - }); - // Only enable modules after disable have been run if (enabled) { log('enable called without calling disable'); @@ -252,10 +248,6 @@ function disable() { Meta.keybindings_set_custom_handler('switch-to-workspace-down', null); Meta.keybindings_set_custom_handler('switch-to-workspace-up', null); - Keybindings.actions.forEach(a => { - setKeybinding(a.name, () => {}); - }); - if (!enabled) return; log(`disable ${SESSIONID}`); diff --git a/keybindings.js b/keybindings.js index 373aa88..92e0091 100644 --- a/keybindings.js +++ b/keybindings.js @@ -59,27 +59,17 @@ function registerAction(actionName, handler, options) { activeInScratch, } = options; - let actionId, mutterName, keyHandler; + let mutterName, keyHandler; if (settings) { Utils.assert(actionName, "Schema action must have a name"); mutterName = actionName; keyHandler = opensNavigator ? Navigator.preview_navigate : handler; - - actionId = Main.wm.addKeybinding( - actionName, - settings, mutterFlags || Meta.KeyBindingFlags.NONE, - Shell.ActionMode.NORMAL, - keyHandler); - - // If the id is NONE the action is already registered - if (actionId === Meta.KeyBindingAction.NONE) - return null; } else { // actionId, mutterName and keyHandler will be set if/when the action is bound } let action = { - id: actionId, // mutter action + id: Meta.KeyBindingAction.NONE, name: actionName, mutterName: mutterName, keyHandler: keyHandler, @@ -87,15 +77,17 @@ function registerAction(actionName, handler, options) { options: options, }; + enableAction(action); // sets `action.id` + actions.push(action); if (actionName) nameMap[actionName] = action; - if (actionId) - actionIdMap[actionId] = action; + if (action.id) + actionIdMap[action.id] = action; return action; } - + /** * Bind a key to an action (possibly creating a new action) */ @@ -233,14 +225,50 @@ function handleAccelerator(display, actionId, deviceId, timestamp) { } } + +function disableAction(action) { + if (action.options.settings) { + Main.wm.removeKeybinding(action.mutterName); + action.id = Meta.KeyBindingAction.NONE; + } else { + // Should only be called in disable/enable - schemaless actions are + // disabled/enabled by other means + } +} + +function enableAction(action) { + if (action.id !== Meta.KeyBindingAction.NONE) + return; // Already enabled (happens on enable right after init) + + if (action.options.settings) { + let actionId = Main.wm.addKeybinding( + action.mutterName, + action.options.settings, + action.options.mutterFlags || Meta.KeyBindingFlags.NONE, + Shell.ActionMode.NORMAL, + action.keyHandler); + + if (actionId !== Meta.KeyBindingAction.NONE) + action.id = actionId; + else + Utils.warn("Could not enable action", action.name); + + } else { + // Should only be called in disable/enable - schemaless actions are + // disabled/enabled by other means + } +} + function enable() { signals.connect( global.display, 'accelerator-activated', Utils.dynamic_function_ref(handleAccelerator.name, Me) ); + actions.forEach(enableAction); } function disable() { signals.destroy(); + actions.forEach(disableAction); } diff --git a/utils.js b/utils.js index b3c0228..ddc3cfc 100644 --- a/utils.js +++ b/utils.js @@ -13,6 +13,10 @@ function debug() { print(Array.prototype.join.call(arguments, " | ")); } +function warn(...args) { + print("WARNING:", ...args); +} + function assert(condition, message, ...dump) { if (!condition) { throw new Error(message + "\n", dump);