diff --git a/keybindings.js b/keybindings.js index 7a396ee6..c1ff536e 100644 --- a/keybindings.js +++ b/keybindings.js @@ -172,6 +172,11 @@ export function setupActions(settings) { registerMinimapAction("switch-up", (mw, space) => space.switchUp()); registerMinimapAction("switch-down", (mw, space) => space.switchDown()); + registerMinimapAction("switch-global-right", (mw, space) => space.switchGlobalRight()); + registerMinimapAction("switch-global-left", (mw, space) => space.switchGlobalLeft()); + registerMinimapAction("switch-global-up", (mw, space) => space.switchGlobalUp()); + registerMinimapAction("switch-global-down", (mw, space) => space.switchGlobalDown()); + registerMinimapAction("move-left", (mw, space) => space.swap(Meta.MotionDirection.LEFT)); registerMinimapAction("move-right", diff --git a/navigator.js b/navigator.js index 15319098..8460b86a 100644 --- a/navigator.js +++ b/navigator.js @@ -199,7 +199,7 @@ class ActionDispatcher { } if (!Tiling.inGrab && action.options.opensMinimap) { - nav._showMinimap(space); + nav.showMinimap(space); } action.handler(metaWindow, space, { navigator: this.navigator }); if (space !== Tiling.spaces.selectedSpace) { @@ -286,7 +286,7 @@ class NavigatorClass { this.space.startAnimate(); } - _showMinimap(space) { + showMinimap(space) { let minimap = this.minimaps.get(space); if (!minimap) { let minimapId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 200, () => { diff --git a/prefsKeybinding.js b/prefsKeybinding.js index 47881ff1..9c4539ee 100644 --- a/prefsKeybinding.js +++ b/prefsKeybinding.js @@ -27,6 +27,10 @@ const actions = { 'switch-right', 'switch-up', 'switch-down', + 'switch-global-left', + 'switch-global-right', + 'switch-global-up', + 'switch-global-down', 'switch-first', 'switch-last', 'live-alt-tab', diff --git a/schemas/gschemas.compiled b/schemas/gschemas.compiled index d42b14fa..5f7b8042 100644 Binary files a/schemas/gschemas.compiled and b/schemas/gschemas.compiled differ diff --git a/schemas/org.gnome.shell.extensions.paperwm.gschema.xml b/schemas/org.gnome.shell.extensions.paperwm.gschema.xml index e12822f0..ee0cc22a 100644 --- a/schemas/org.gnome.shell.extensions.paperwm.gschema.xml +++ b/schemas/org.gnome.shell.extensions.paperwm.gschema.xml @@ -167,6 +167,23 @@ Switch to the below window + + + Switch to the right window (no monitor boundary) + + + + Switch to the left window (no monitor boundary) + + + + Switch to the above window (no monitor boundary) + + + + Switch to the below window (no monitor boundary) + + Home']]]> Switch to the first window diff --git a/tiling.js b/tiling.js index 12c6f0d1..ea133626 100644 --- a/tiling.js +++ b/tiling.js @@ -1071,6 +1071,84 @@ export class Space extends Array { ensureViewport(metaWindow, space); } + switchGlobalLeft() { this.switchGlobal(Meta.MotionDirection.LEFT); } + switchGlobalRight() { this.switchGlobal(Meta.MotionDirection.RIGHT); } + switchGlobalUp() { this.switchGlobal(Meta.MotionDirection.UP); } + switchGlobalDown() { this.switchGlobal(Meta.MotionDirection.DOWN); } + switchGlobal(direction) { + let space = this; + let index = space.selectedIndex(); + if (index === -1) { + return; + } + let row = space[index].indexOf(space.selectedWindow); + + switch (direction) { + case Meta.MotionDirection.RIGHT: + index++; + break; + case Meta.MotionDirection.LEFT: + index--; + } + if (index < 0 || index >= space.length) { + let monitor = focusMonitor(); + let dir = index < 0 + ? Meta.DisplayDirection.LEFT : Meta.DisplayDirection.RIGHT; + let i = display.get_monitor_neighbor_index(monitor.index, dir); + if (i === -1) + return; + + let newMonitor = Main.layoutManager.monitors[i]; + space = spaces.monitors.get(newMonitor); + if (dir === Meta.DisplayDirection.LEFT) { + index = space.length - 1; + } else { + index = 0; + } + if (space[index].length <= row) + row = space[index].length - 1; + space.activate(false, false); + Navigator.finishNavigation(); + Navigator.getNavigator().showMinimap(space); + } + + let column = space[index]; + if (column.length <= row) + row = column.length - 1; + + switch (direction) { + case Meta.MotionDirection.UP: + row--; + break; + case Meta.MotionDirection.DOWN: + row++; + } + if (row < 0 || row >= column.length) { + let monitor = focusMonitor(); + let dir = row < 0 + ? Meta.DisplayDirection.UP : Meta.DisplayDirection.DOWN; + let i = display.get_monitor_neighbor_index(monitor.index, dir); + if (i === -1) + return; + + let newMonitor = Main.layoutManager.monitors[i]; + space = spaces.monitors.get(newMonitor); + if (space.length <= index) + index = space.length - 1; + if (dir === Meta.DisplayDirection.UP) { + row = space[index].length - 1; + } else { + row = 0; + } + space.activate(false, false); + Navigator.finishNavigation(); + Navigator.getNavigator().showMinimap(space); + } + + let metaWindow = space.getWindow(index, row); + ensureViewport(metaWindow, space); + } + /** * Return the x position of the visible element of this window. */