diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/display-private.h | 3 | ||||
-rw-r--r-- | src/core/display.c | 121 | ||||
-rw-r--r-- | src/core/keybindings.c | 11 |
3 files changed, 92 insertions, 43 deletions
diff --git a/src/core/display-private.h b/src/core/display-private.h index 692e25f2..c59c5e19 100644 --- a/src/core/display-private.h +++ b/src/core/display-private.h @@ -445,7 +445,8 @@ typedef enum { META_TAB_LIST_NORMAL, META_TAB_LIST_DOCKS, - META_TAB_LIST_GROUP + META_TAB_LIST_GROUP, + META_TAB_LIST_NORMAL_ALL_WORKSPACES } MetaTabList; typedef enum diff --git a/src/core/display.c b/src/core/display.c index 59ec9021..647581f5 100644 --- a/src/core/display.c +++ b/src/core/display.c @@ -90,7 +90,9 @@ (g == META_GRAB_OP_KEYBOARD_TABBING_NORMAL || \ g == META_GRAB_OP_KEYBOARD_TABBING_DOCK || \ g == META_GRAB_OP_KEYBOARD_TABBING_GROUP || \ + g == META_GRAB_OP_KEYBOARD_TABBING_NORMAL_ALL_WORKSPACES || \ g == META_GRAB_OP_KEYBOARD_ESCAPING_NORMAL || \ + g == META_GRAB_OP_KEYBOARD_ESCAPING_NORMAL_ALL_WORKSPACES || \ g == META_GRAB_OP_KEYBOARD_ESCAPING_DOCK || \ g == META_GRAB_OP_KEYBOARD_ESCAPING_GROUP) @@ -1141,9 +1143,11 @@ grab_op_is_keyboard (MetaGrabOp op) case META_GRAB_OP_KEYBOARD_RESIZING_SW: case META_GRAB_OP_KEYBOARD_RESIZING_NW: case META_GRAB_OP_KEYBOARD_TABBING_NORMAL: + case META_GRAB_OP_KEYBOARD_TABBING_NORMAL_ALL_WORKSPACES: case META_GRAB_OP_KEYBOARD_TABBING_DOCK: case META_GRAB_OP_KEYBOARD_TABBING_GROUP: case META_GRAB_OP_KEYBOARD_ESCAPING_NORMAL: + case META_GRAB_OP_KEYBOARD_ESCAPING_NORMAL_ALL_WORKSPACES: case META_GRAB_OP_KEYBOARD_ESCAPING_DOCK: case META_GRAB_OP_KEYBOARD_ESCAPING_GROUP: case META_GRAB_OP_KEYBOARD_WORKSPACE_SWITCHING: @@ -3625,12 +3629,23 @@ meta_display_begin_grab_op (MetaDisplay *display, META_TAB_LIST_NORMAL, META_TAB_SHOW_ICON); break; + case META_GRAB_OP_KEYBOARD_TABBING_NORMAL_ALL_WORKSPACES: + meta_screen_ensure_tab_popup (screen, + META_TAB_LIST_NORMAL_ALL_WORKSPACES, + META_TAB_SHOW_ICON); + break; case META_GRAB_OP_KEYBOARD_ESCAPING_NORMAL: meta_screen_ensure_tab_popup (screen, META_TAB_LIST_NORMAL, META_TAB_SHOW_INSTANTLY); break; + case META_GRAB_OP_KEYBOARD_ESCAPING_NORMAL_ALL_WORKSPACES: + meta_screen_ensure_tab_popup (screen, + META_TAB_LIST_NORMAL_ALL_WORKSPACES, + META_TAB_SHOW_INSTANTLY); + break; + case META_GRAB_OP_KEYBOARD_TABBING_DOCK: meta_screen_ensure_tab_popup (screen, META_TAB_LIST_DOCKS, @@ -4441,7 +4456,9 @@ get_focussed_group (MetaDisplay *display) return NULL; } -#define IN_TAB_CHAIN(w,t) (((t) == META_TAB_LIST_NORMAL && META_WINDOW_IN_NORMAL_TAB_CHAIN (w)) \ +#define IN_TAB_CHAIN(w,t) \ + (((t) == META_TAB_LIST_NORMAL && META_WINDOW_IN_NORMAL_TAB_CHAIN (w)) \ + || ((t) == META_TAB_LIST_NORMAL_ALL_WORKSPACES && META_WINDOW_IN_NORMAL_TAB_CHAIN (w)) \ || ((t) == META_TAB_LIST_DOCKS && META_WINDOW_IN_DOCK_TAB_CHAIN (w)) \ || ((t) == META_TAB_LIST_GROUP && META_WINDOW_IN_GROUP_TAB_CHAIN (w, get_focussed_group(w->display)))) @@ -4532,56 +4549,76 @@ GList* meta_display_get_tab_list (MetaDisplay *display, MetaTabList type, MetaScreen *screen, - MetaWorkspace *workspace) + MetaWorkspace *active_workspace) { - GList *tab_list; + GList *tab_list, *workspace_list, *l, link; + MetaWorkspace *workspace; - g_return_val_if_fail (workspace != NULL, NULL); + g_return_val_if_fail (active_workspace != NULL, NULL); + + if (type == META_TAB_LIST_NORMAL_ALL_WORKSPACES) + { + workspace_list = screen->workspaces; + type = META_TAB_LIST_NORMAL; + } + else + { + link.next = NULL; + link.prev = NULL; + link.data = active_workspace; + workspace_list = &link; + } + tab_list = NULL; /* Windows sellout mode - MRU order. Collect unminimized windows * then minimized so minimized windows aren't in the way so much. */ - { - GList *tmp; - - tab_list = NULL; - tmp = workspace->mru_list; - while (tmp != NULL) - { - MetaWindow *window = tmp->data; - - if (!window->minimized && - window->screen == screen && - IN_TAB_CHAIN (window, type)) - tab_list = g_list_prepend (tab_list, window); - - tmp = tmp->next; - } - } - - { - GList *tmp; - - tmp = workspace->mru_list; - while (tmp != NULL) - { - MetaWindow *window = tmp->data; - - if (window->minimized && - window->screen == screen && - IN_TAB_CHAIN (window, type)) - tab_list = g_list_prepend (tab_list, window); - - tmp = tmp->next; - } - } - + for (l = workspace_list; l != NULL; l = l->next) + { + GList *tmp; + + workspace = l->data; + + tmp = workspace->mru_list; + while (tmp != NULL) + { + MetaWindow *window = tmp->data; + + if (!window->minimized && + window->screen == screen && + IN_TAB_CHAIN (window, type)) + tab_list = g_list_prepend (tab_list, window); + + tmp = tmp->next; + } + } + + for (l = workspace_list; l != NULL; l = l->next) + { + GList *tmp; + + workspace = l->data; + + tmp = workspace->mru_list; + while (tmp != NULL) + { + MetaWindow *window = tmp->data; + + if (window->minimized && + window->screen == screen && + IN_TAB_CHAIN (window, type)) + tab_list = g_list_prepend (tab_list, window); + + tmp = tmp->next; + } + } + tab_list = g_list_reverse (tab_list); - + { GSList *tmp; MetaWindow *l_window; - + tmp = meta_display_list_windows (display); /* Go through all windows */ @@ -4591,7 +4628,7 @@ meta_display_get_tab_list (MetaDisplay *display, /* Check to see if it demands attention */ if (l_window->wm_state_demands_attention && - l_window->workspace!=workspace && + l_window->workspace!=active_workspace && IN_TAB_CHAIN (l_window, type)) { /* if it does, add it to the popup */ diff --git a/src/core/keybindings.c b/src/core/keybindings.c index b9371c85..e1d87920 100644 --- a/src/core/keybindings.c +++ b/src/core/keybindings.c @@ -1340,9 +1340,11 @@ meta_display_process_key_event (MetaDisplay *display, break; case META_GRAB_OP_KEYBOARD_TABBING_NORMAL: + case META_GRAB_OP_KEYBOARD_TABBING_NORMAL_ALL_WORKSPACES: case META_GRAB_OP_KEYBOARD_TABBING_DOCK: case META_GRAB_OP_KEYBOARD_TABBING_GROUP: case META_GRAB_OP_KEYBOARD_ESCAPING_NORMAL: + case META_GRAB_OP_KEYBOARD_ESCAPING_NORMAL_ALL_WORKSPACES: case META_GRAB_OP_KEYBOARD_ESCAPING_DOCK: case META_GRAB_OP_KEYBOARD_ESCAPING_GROUP: meta_topic (META_DEBUG_KEYBINDINGS, @@ -2029,6 +2031,7 @@ process_tab_grab (MetaDisplay *display, target_window->desc); display->mouse_mode = FALSE; meta_window_activate (target_window, event->xkey.time); + meta_workspace_activate (target_window->workspace, event->xkey.time); meta_topic (META_DEBUG_KEYBINDINGS, "Ending grab early so we can focus the target window\n"); @@ -2070,6 +2073,7 @@ process_tab_grab (MetaDisplay *display, switch (display->grab_op) { case META_GRAB_OP_KEYBOARD_ESCAPING_NORMAL: + case META_GRAB_OP_KEYBOARD_ESCAPING_NORMAL_ALL_WORKSPACES: case META_GRAB_OP_KEYBOARD_ESCAPING_DOCK: /* carry on */ break; @@ -2087,6 +2091,7 @@ process_tab_grab (MetaDisplay *display, switch (display->grab_op) { case META_GRAB_OP_KEYBOARD_TABBING_NORMAL: + case META_GRAB_OP_KEYBOARD_TABBING_NORMAL_ALL_WORKSPACES: case META_GRAB_OP_KEYBOARD_TABBING_DOCK: /* carry on */ break; @@ -2810,6 +2815,8 @@ tab_op_from_tab_type (MetaTabList type) { case META_TAB_LIST_NORMAL: return META_GRAB_OP_KEYBOARD_TABBING_NORMAL; + case META_TAB_LIST_NORMAL_ALL_WORKSPACES: + return META_GRAB_OP_KEYBOARD_TABBING_NORMAL_ALL_WORKSPACES; case META_TAB_LIST_DOCKS: return META_GRAB_OP_KEYBOARD_TABBING_DOCK; case META_TAB_LIST_GROUP: @@ -2828,6 +2835,8 @@ cycle_op_from_tab_type (MetaTabList type) { case META_TAB_LIST_NORMAL: return META_GRAB_OP_KEYBOARD_ESCAPING_NORMAL; + case META_TAB_LIST_NORMAL_ALL_WORKSPACES: + return META_GRAB_OP_KEYBOARD_ESCAPING_NORMAL_ALL_WORKSPACES; case META_TAB_LIST_DOCKS: return META_GRAB_OP_KEYBOARD_ESCAPING_DOCK; case META_TAB_LIST_GROUP: @@ -2888,6 +2897,7 @@ do_choose_window (MetaDisplay *display, initial_selection->desc); display->mouse_mode = FALSE; meta_window_activate (initial_selection, event->xkey.time); + meta_workspace_activate (initial_selection->workspace, event->xkey.time); } else if (meta_display_begin_grab_op (display, screen, @@ -2917,6 +2927,7 @@ do_choose_window (MetaDisplay *display, meta_display_end_grab_op (display, event->xkey.time); display->mouse_mode = FALSE; meta_window_activate (initial_selection, event->xkey.time); + meta_workspace_activate (initial_selection->workspace, event->xkey.time); } else { |