diff --git a/extension.js b/extension.js index d2b4ba5..7885bc3 100644 --- a/extension.js +++ b/extension.js @@ -48,6 +48,14 @@ function registerPaperAction(actionName, handler, flags) { {settings: settings, mutterFlags: flags, activeInNavigator: true}) } +function registerNavigatorAction(name, handler) { + let settings = convenience.getSettings('org.gnome.Shell.Extensions.PaperWM.Keybindings'); + Keybindings.registerAction( + name, + handler, + {settings: settings, opensNavigator: true}) +} + function init() { SESSIONID += "#"; log(`init: ${SESSIONID}`); @@ -86,10 +94,10 @@ function init() { registerPaperAction("switch-first", Tiling.activateFirstWindow); registerPaperAction("switch-last", Tiling.activateLastWindow); - registerPaperAction("switch-right", previewNavigate); - registerPaperAction("switch-left", previewNavigate); - registerPaperAction("switch-up", previewNavigate); - registerPaperAction("switch-down", previewNavigate); + registerNavigatorAction("switch-right", (mw, space) => space.switchRight()); + registerNavigatorAction("switch-left", (mw, space) => space.switchLeft()); + registerNavigatorAction("switch-up", (mw, space) => space.switchUp()); + registerNavigatorAction("switch-down", (mw, space) => space.switchDown()); registerPaperAction("move-left", previewNavigate); registerPaperAction("move-right", previewNavigate); @@ -101,7 +109,7 @@ function init() { Scratch)); registerPaperAction("toggle-scratch", - utils.as_key_handler("toggle", + dynamic_function_ref("toggle", Scratch), Meta.KeyBindingFlags.PER_WINDOW); @@ -110,54 +118,52 @@ function init() { utils)); registerPaperAction("cycle-width", - as_key_handler("cycleWindowWidth", + dynamic_function_ref("cycleWindowWidth", Tiling), Meta.KeyBindingFlags.PER_WINDOW); registerPaperAction("center-horizontally", - as_key_handler("centerWindowHorizontally", + dynamic_function_ref("centerWindowHorizontally", Tiling), Meta.KeyBindingFlags.PER_WINDOW); registerPaperAction("tile-visible", - as_key_handler("tileVisible", + dynamic_function_ref("tileVisible", Tiling), Meta.KeyBindingFlags.PER_WINDOW); registerPaperAction('new-window', - as_key_handler('newWindow', + dynamic_function_ref('newWindow', App), Meta.KeyBindingFlags.PER_WINDOW); registerPaperAction('close-window', - as_key_handler( - (metaWindow) => - metaWindow.delete(global.get_current_time())), + (metaWindow) => + metaWindow.delete(global.get_current_time()), Meta.KeyBindingFlags.PER_WINDOW); registerPaperAction('slurp-in', - as_key_handler('slurp', - Tiling), + dynamic_function_ref('slurp', + Tiling), Meta.KeyBindingFlags.PER_WINDOW); registerPaperAction('barf-out', - as_key_handler('barf', - Tiling), + dynamic_function_ref('barf', + Tiling), Meta.KeyBindingFlags.PER_WINDOW); registerPaperAction('toggle-maximize-width', - as_key_handler("toggleMaximizeHorizontally", - Tiling), + dynamic_function_ref("toggleMaximizeHorizontally", + Tiling), Meta.KeyBindingFlags.PER_WINDOW); registerPaperAction('paper-toggle-fullscreen', - as_key_handler( (metaWindow) => { if (metaWindow.fullscreen) metaWindow.unmake_fullscreen(); else metaWindow.make_fullscreen(); - }), Meta.KeyBindingFlags.PER_WINDOW); + }, Meta.KeyBindingFlags.PER_WINDOW); initUserConfig(); } diff --git a/keybindings.js b/keybindings.js index a720f57..590f930 100644 --- a/keybindings.js +++ b/keybindings.js @@ -47,11 +47,14 @@ function byId(mutterId) { return actions.find(action => action.id == mutterId); } +function asKeyHandler(actionHandler) { + return (display, screen, mw, binding) => { + return actionHandler(mw, null, {display, screen, binding}); + } +} + /** - * NB: handler interface not stabilized: atm. its the same as mutter keyhandler - * interface, but we'll change that in the future - * - * handler: function(ignored, ignored, metaWindow) -> ignored + * handler: function(metaWindow, space, {binding, display, screen}) -> ignored */ function registerAction(actionName, handler, options) { options = Object.assign({}, options); @@ -72,7 +75,9 @@ function registerAction(actionName, handler, options) { if (settings) { Utils.assert(actionName, "Schema action must have a name"); mutterName = actionName; - keyHandler = opensNavigator ? Navigator.preview_navigate : handler; + keyHandler = opensNavigator + ? asKeyHandler(Navigator.preview_navigate) + : asKeyHandler(handler) } else { // actionId, mutterName and keyHandler will be set if/when the action is bound } @@ -137,7 +142,7 @@ function bindkey(keystr, actionName=null, handler=null, options=null) { if (action.options.opensNavigator) { action.keyHandler = openNavigatorHandler(mutterName, keystr); } else { - action.keyHandler = Utils.as_key_handler(handler); + action.keyHandler = asKeyHandler(handler); } Main.wm.allowKeybinding(action.mutterName, Shell.ActionMode.ALL); @@ -195,14 +200,14 @@ function rawMaskOfKeystr(keystr) { function openNavigatorHandler(actionName, keystr) { const mask = rawMaskOfKeystr(keystr) & 0xff; - const dummyEvent = { + const binding = { get_name: () => actionName, get_mask: () => mask, is_reversed: () => false, } return function(display, screen, metaWindow) { return Navigator.preview_navigate( - display, screen, metaWindow, dummyEvent); + metaWindow, null, {screen, display, binding}); } } diff --git a/liveAltTab.js b/liveAltTab.js index 0f446ba..62e02f6 100644 --- a/liveAltTab.js +++ b/liveAltTab.js @@ -104,7 +104,7 @@ var LiveAltTab = Lang.Class({ } }) -function liveAltTab(display, screen, meta_window, binding) { +function liveAltTab(meta_window, space, {display, screen, binding}) { let tabPopup = new LiveAltTab(); tabPopup.show(binding.is_reversed(), binding.get_name(), binding.get_mask()); } diff --git a/navigator.js b/navigator.js index f8dbcc7..0b9b776 100644 --- a/navigator.js +++ b/navigator.js @@ -286,18 +286,6 @@ var PreviewedWindowNavigator = new Lang.Class({ } else if (mutterActionId === Keybindings.idOf("switch-previous")) { this._select(this._previous()); return true; - } else if (mutterActionId === Keybindings.idOf("switch-right")) { - this._switch(Meta.MotionDirection.RIGHT); - return true; - } else if (mutterActionId === Keybindings.idOf("switch-left")) { - this._switch(Meta.MotionDirection.LEFT); - return true; - } else if (mutterActionId === Keybindings.idOf("switch-up")) { - this._switch(Meta.MotionDirection.UP); - return true; - } else if (mutterActionId === Keybindings.idOf("switch-down")) { - this._switch(Meta.MotionDirection.DOWN); - return true; } else if (mutterActionId === Keybindings.idOf("move-left")) { this._showMinimap(); this.space.swap(Meta.MotionDirection.LEFT); @@ -335,7 +323,7 @@ var PreviewedWindowNavigator = new Lang.Class({ log("Show minimap and do action..") this._showMinimap(); let metaWindow = this.space.selectedWindow; - action.handler(null, null, metaWindow); + action.handler(metaWindow, this.space); return true; } } @@ -343,44 +331,6 @@ var PreviewedWindowNavigator = new Lang.Class({ return false; }, - _switch(direction) { - let space = this.space; - let index = space.selectedIndex(); - let row = space[index].indexOf(space.selectedWindow); - switch (direction) { - case Meta.MotionDirection.RIGHT: - index++; - row = -1; - break;; - case Meta.MotionDirection.LEFT: - index--; - row = -1; - } - if (index < 0 || index >= space.length) - return; - - let column = space[index]; - - if (row === -1) { - let mru = global.display.get_tab_list(Meta.TabList.NORMAL, - space.workspace); - let selected = mru.filter(w => column.includes(w))[0]; - row = column.indexOf(selected); - } - - switch (direction) { - case Meta.MotionDirection.UP: - row--; - break;; - case Meta.MotionDirection.DOWN: - row++; - } - if (row < 0 || row >= column.length) - return; - - this._select([index, row]); - }, - _keyPressHandler: function(keysym, action) { if (keysym !== Clutter.KEY_Escape && this._doAction(action)) { return Clutter.EVENT_STOP; @@ -504,7 +454,7 @@ var PreviewedWindowNavigator = new Lang.Class({ } }); -function preview_navigate(display, screen, meta_window, binding) { +function preview_navigate(meta_window, space, {display, screen, binding}) { let tabPopup = new PreviewedWindowNavigator(); tabPopup.show(binding.is_reversed(), binding.get_name(), binding.get_mask()); } diff --git a/tiling.js b/tiling.js index 6c1c214..7c0e59d 100644 --- a/tiling.js +++ b/tiling.js @@ -391,6 +391,49 @@ class Space extends Array { ensureViewport(this.selectedWindow, this, true); } + switchLeft() { this.switch(Meta.MotionDirection.LEFT) } + switchRight() { this.switch(Meta.MotionDirection.RIGHT) } + switchUp() { this.switch(Meta.MotionDirection.UP) } + switchDown() { this.switch(Meta.MotionDirection.DOWN) } + switch(direction) { + let space = this; + let index = space.selectedIndex(); + let row = space[index].indexOf(space.selectedWindow); + switch (direction) { + case Meta.MotionDirection.RIGHT: + index++; + row = -1; + break;; + case Meta.MotionDirection.LEFT: + index--; + row = -1; + } + if (index < 0 || index >= space.length) + return; + + let column = space[index]; + + if (row === -1) { + let mru = global.display.get_tab_list(Meta.TabList.NORMAL, + space.workspace); + let selected = mru.filter(w => column.includes(w))[0]; + row = column.indexOf(selected); + } + + switch (direction) { + case Meta.MotionDirection.UP: + row--; + break;; + case Meta.MotionDirection.DOWN: + row++; + } + if (row < 0 || row >= column.length) + return; + + let metaWindow = space.getWindow(index, row); + ensureViewport(metaWindow, space); + } + positionOf(metaWindow) { metaWindow = metaWindow || this.selectedWindow; let index, row;