diff --git a/js/ui/main.js b/js/ui/main.js index 5fe478336..bb837a3bd 100644 --- a/js/ui/main.js +++ b/js/ui/main.js @@ -279,6 +279,9 @@ function _globalKeyPressHandler(actor, event) { } } else if (type == Clutter.EventType.KEY_RELEASE) { let symbol = event.get_key_symbol(); + let keyCode = event.get_key_code(); + let modifierState = Shell.get_event_state(event); + // Check the overview key first, this isn't a Meta.KeyBindingAction yet if (symbol == Clutter.Super_L || symbol == Clutter.Super_R) { // The super key is the default for triggering the overview, and should // get us out of the overview when we are already in it. @@ -286,8 +289,25 @@ function _globalKeyPressHandler(actor, event) { overview.hide(); return true; - } else if (symbol == Clutter.F2 && (Shell.get_event_state(event) & Clutter.ModifierType.MOD1_MASK)) { - getRunDialog().open(); + } + + // Whitelist some of the Metacity actions + let display = global.screen.get_display(); + let activeWorkspaceIndex = global.screen.get_active_workspace_index(); + + // This relies on the fact that Clutter.ModifierType is the same as Gdk.ModifierType + let action = display.get_keybinding_action(symbol, keyCode, modifierState); + switch (action) { + case Meta.KeyBindingAction.WORKSPACE_LEFT: + wm.actionMoveWorkspaceLeft(); + return true; + case Meta.KeyBindingAction.WORKSPACE_RIGHT: + wm.actionMoveWorkspaceRight(); + return true; + case Meta.KeyBindingAction.PANEL_RUN_DIALOG: + case Meta.KeyBindingAction.COMMAND_2: + getRunDialog().open(); + return true; } } diff --git a/js/ui/windowManager.js b/js/ui/windowManager.js index b3c2199a3..eb3db1b9d 100644 --- a/js/ui/windowManager.js +++ b/js/ui/windowManager.js @@ -315,27 +315,37 @@ WindowManager.prototype = { if (global.screen.n_workspaces == 1) return; - if (this._workspaceSwitcherPopup == null) + if (this._workspaceSwitcherPopup == null && Main.overview.visible) this._workspaceSwitcherPopup = new WorkspaceSwitcherPopup.WorkspaceSwitcherPopup(); - let activeWorkspaceIndex = global.screen.get_active_workspace_index(); - if (binding == "switch_to_workspace_left") { - if (activeWorkspaceIndex > 0) { - global.screen.get_workspace_by_index(activeWorkspaceIndex - 1).activate(global.get_current_time()); - this._workspaceSwitcherPopup.display(WorkspaceSwitcherPopup.LEFT, activeWorkspaceIndex - 1); - } - else - this._workspaceSwitcherPopup.display(WorkspaceSwitcherPopup.LEFT, activeWorkspaceIndex); + this.actionMoveWorkspaceLeft(); } if (binding == "switch_to_workspace_right") { - if (activeWorkspaceIndex < global.screen.n_workspaces - 1) { - global.screen.get_workspace_by_index(activeWorkspaceIndex + 1).activate(global.get_current_time()); + this.actionMoveWorkspaceRight(); + } + }, + + actionMoveWorkspaceLeft: function() { + let activeWorkspaceIndex = global.screen.get_active_workspace_index(); + if (activeWorkspaceIndex > 0) { + global.screen.get_workspace_by_index(activeWorkspaceIndex - 1).activate(global.get_current_time()); + if (this._workspaceSwitcherPopup != null) + this._workspaceSwitcherPopup.display(WorkspaceSwitcherPopup.LEFT, activeWorkspaceIndex - 1); + } else if (this._workspaceSwitcherPopup != null){ + this._workspaceSwitcherPopup.display(WorkspaceSwitcherPopup.LEFT, activeWorkspaceIndex); + } + }, + + actionMoveWorkspaceRight: function() { + let activeWorkspaceIndex = global.screen.get_active_workspace_index(); + if (activeWorkspaceIndex < global.screen.n_workspaces - 1) { + global.screen.get_workspace_by_index(activeWorkspaceIndex + 1).activate(global.get_current_time()); + if (this._workspaceSwitcherPopup != null) this._workspaceSwitcherPopup.display(WorkspaceSwitcherPopup.RIGHT, activeWorkspaceIndex + 1); - } - else - this._workspaceSwitcherPopup.display(WorkspaceSwitcherPopup.RIGHT, activeWorkspaceIndex); + } else if (this._workspaceSwitcherPopup != null) { + this._workspaceSwitcherPopup.display(WorkspaceSwitcherPopup.RIGHT, activeWorkspaceIndex); } } };