summaryrefslogtreecommitdiff
path: root/src/core/keybindings.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/keybindings.c')
-rw-r--r--src/core/keybindings.c111
1 files changed, 69 insertions, 42 deletions
diff --git a/src/core/keybindings.c b/src/core/keybindings.c
index 4dff55a0..2b71b3fa 100644
--- a/src/core/keybindings.c
+++ b/src/core/keybindings.c
@@ -75,11 +75,12 @@ handler (MetaDisplay *display,\
* handler functions and have some kind of flag to say they're unbindable.
*/
-static void handle_workspace_switch (MetaDisplay *display,
- MetaScreen *screen,
- MetaWindow *window,
- XEvent *event,
- MetaKeyBinding *binding);
+static void handle_workspace_switch_or_move (MetaDisplay *display,
+ MetaScreen *screen,
+ MetaWindow *window,
+ XEvent *event,
+ MetaKeyBinding *binding,
+ gboolean is_move);
static gboolean process_mouse_move_resize_grab (MetaDisplay *display,
MetaScreen *screen,
@@ -106,6 +107,7 @@ static gboolean process_tab_grab (MetaDisplay *display,
static gboolean process_workspace_switch_grab (MetaDisplay *display,
MetaScreen *screen,
+ MetaWindow *window,
XEvent *event,
KeySym keysym);
@@ -1404,11 +1406,11 @@ meta_display_process_key_event (MetaDisplay *display,
break;
case META_GRAB_OP_KEYBOARD_WORKSPACE_SWITCHING:
+ case META_GRAB_OP_KEYBOARD_WORKSPACE_MOVING:
meta_topic (META_DEBUG_KEYBINDINGS,
"Processing event for keyboard workspace switching\n");
- keep_grab = process_workspace_switch_grab (display, screen, event, keysym);
+ keep_grab = process_workspace_switch_grab (display, screen, window, event, keysym);
break;
-
default:
break;
}
@@ -2331,7 +2333,7 @@ handle_switch_to_workspace (MetaDisplay *display,
* Note that we're the only caller of that function, so perhaps
* we should merge with it.
*/
- handle_workspace_switch (display, screen, event_window, event, binding);
+ handle_workspace_switch_or_move (display, screen, event_window, event, binding, FALSE);
return;
}
@@ -2673,6 +2675,7 @@ handle_move_to_center (MetaDisplay *display,
static gboolean
process_workspace_switch_grab (MetaDisplay *display,
MetaScreen *screen,
+ MetaWindow *window,
XEvent *event,
KeySym keysym)
{
@@ -2701,12 +2704,15 @@ process_workspace_switch_grab (MetaDisplay *display,
"Ending grab so we can focus on the target workspace\n");
meta_display_end_grab_op (display, event->xkey.time);
- meta_topic (META_DEBUG_KEYBINDINGS,
- "Focusing default window on target workspace\n");
- meta_workspace_focus_default_window (target_workspace,
- NULL,
- event->xkey.time);
+ if(display->grab_op == META_GRAB_OP_KEYBOARD_WORKSPACE_SWITCHING)
+ {
+ meta_topic (META_DEBUG_KEYBINDINGS,
+ "Focusing default window on target workspace\n");
+ meta_workspace_focus_default_window (target_workspace,
+ NULL,
+ event->xkey.time);
+ }
return TRUE; /* we already ended the grab */
}
@@ -2742,21 +2748,25 @@ process_workspace_switch_grab (MetaDisplay *display,
switch (action)
{
case META_KEYBINDING_ACTION_WORKSPACE_UP:
+ case META_KEYBINDING_ACTION_WORKSPACE_MOVE_UP:
target_workspace = meta_workspace_get_neighbor (workspace,
META_MOTION_UP);
break;
case META_KEYBINDING_ACTION_WORKSPACE_DOWN:
+ case META_KEYBINDING_ACTION_WORKSPACE_MOVE_DOWN:
target_workspace = meta_workspace_get_neighbor (workspace,
META_MOTION_DOWN);
break;
case META_KEYBINDING_ACTION_WORKSPACE_LEFT:
+ case META_KEYBINDING_ACTION_WORKSPACE_MOVE_LEFT:
target_workspace = meta_workspace_get_neighbor (workspace,
META_MOTION_LEFT);
break;
case META_KEYBINDING_ACTION_WORKSPACE_RIGHT:
+ case META_KEYBINDING_ACTION_WORKSPACE_MOVE_RIGHT:
target_workspace = meta_workspace_get_neighbor (workspace,
META_MOTION_RIGHT);
break;
@@ -2776,7 +2786,18 @@ process_workspace_switch_grab (MetaDisplay *display,
meta_topic (META_DEBUG_KEYBINDINGS,
"Activating target workspace\n");
- meta_workspace_activate (target_workspace, event->xkey.time);
+ if(display->grab_op == META_GRAB_OP_KEYBOARD_WORKSPACE_SWITCHING)
+ meta_workspace_activate (target_workspace, event->xkey.time);
+ else
+ {
+ meta_window_change_workspace (window, target_workspace);
+ target_workspace->screen->display->mouse_mode = FALSE;
+ meta_workspace_activate_with_focus (target_workspace,
+ window,
+ event->xkey.time);
+ }
+
+
return TRUE; /* we already ended the grab */
}
@@ -2787,7 +2808,10 @@ process_workspace_switch_grab (MetaDisplay *display,
"Ending workspace tabbing & focusing default window; uninteresting key pressed\n");
workspace =
(MetaWorkspace *) meta_ui_tab_popup_get_selected (screen->tab_popup);
- meta_workspace_focus_default_window (workspace, NULL, event->xkey.time);
+
+ if(display->grab_op == META_GRAB_OP_KEYBOARD_WORKSPACE_SWITCHING)
+ meta_workspace_focus_default_window (workspace, NULL, event->xkey.time);
+
return FALSE;
}
@@ -3252,7 +3276,6 @@ handle_move_to_workspace (MetaDisplay *display,
MetaKeyBinding *binding)
{
gint which = binding->handler->data;
- gboolean flip = (which < 0);
MetaWorkspace *workspace;
/* If which is zero or positive, it's a workspace number, and the window
@@ -3266,31 +3289,18 @@ handle_move_to_workspace (MetaDisplay *display,
if (window->always_sticky)
return;
- workspace = NULL;
- if (flip)
- {
- workspace = meta_workspace_get_neighbor (screen->active_workspace,
- which);
- }
- else
+ if (which < 0)
{
- workspace = meta_screen_get_workspace_by_index (screen, which);
+ handle_workspace_switch_or_move (display, screen, window, event, binding, TRUE);
+ return;
}
+
+ workspace = meta_screen_get_workspace_by_index (screen, which);
if (workspace)
{
/* Activate second, so the window is never unmapped */
meta_window_change_workspace (window, workspace);
- if (flip)
- {
- meta_topic (META_DEBUG_FOCUS,
- "Resetting mouse_mode to FALSE due to "
- "handle_move_to_workspace() call with flip set.\n");
- workspace->screen->display->mouse_mode = FALSE;
- meta_workspace_activate_with_focus (workspace,
- window,
- event->xkey.time);
- }
}
else
{
@@ -3365,11 +3375,12 @@ handle_lower (MetaDisplay *display,
}
static void
-handle_workspace_switch (MetaDisplay *display,
- MetaScreen *screen,
- MetaWindow *window,
- XEvent *event,
- MetaKeyBinding *binding)
+handle_workspace_switch_or_move (MetaDisplay *display,
+ MetaScreen *screen,
+ MetaWindow *window,
+ XEvent *event,
+ MetaKeyBinding *binding,
+ gboolean is_move)
{
gint motion = binding->handler->data;
unsigned int grab_mask;
@@ -3379,13 +3390,17 @@ handle_workspace_switch (MetaDisplay *display,
meta_topic (META_DEBUG_KEYBINDINGS,
"Starting tab between workspaces, showing popup\n");
+ MetaGrabOp grab_op = is_move ?
+ META_GRAB_OP_KEYBOARD_WORKSPACE_MOVING
+ : META_GRAB_OP_KEYBOARD_WORKSPACE_SWITCHING;
+
/* FIXME should we use binding->mask ? */
grab_mask = event->xkey.state & ~(display->ignored_modifier_mask);
if (meta_display_begin_grab_op (display,
screen,
- NULL,
- META_GRAB_OP_KEYBOARD_WORKSPACE_SWITCHING,
+ is_move ? window : NULL,
+ grab_op,
FALSE,
FALSE,
0,
@@ -3414,7 +3429,19 @@ handle_workspace_switch (MetaDisplay *display,
meta_display_end_grab_op (display, event->xkey.time);
}
- meta_workspace_activate (next, event->xkey.time);
+ if(is_move)
+ {
+ meta_window_change_workspace (window, next);
+ meta_topic (META_DEBUG_FOCUS,
+ "Resetting mouse_mode to FALSE due to "
+ "handle_move_to_workspace() call with flip set.\n");
+ next->screen->display->mouse_mode = FALSE;
+ meta_workspace_activate_with_focus (next,
+ window,
+ event->xkey.time);
+ }
+ else
+ meta_workspace_activate (next, event->xkey.time);
if (grabbed_before_release)
{