diff --git a/ChangeLog b/ChangeLog index 2c2155770..4767863a3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2002-09-03 Havoc Pennington + + * src/display.c (meta_display_get_tab_current): new function + + * src/keybindings.c (do_choose_window): apply modified patch from + JeyaSudha to still display tab popup if only one window is on the + desktop. + 2002-06-25 JeyaSudha * src/session.c, src/window.c: Session saves the unmaximized diff --git a/src/display.c b/src/display.c index f5d7a5da8..d622be34b 100644 --- a/src/display.c +++ b/src/display.c @@ -3119,6 +3119,26 @@ meta_display_get_tab_next (MetaDisplay *display, display->mru_list); } +MetaWindow* +meta_display_get_tab_current (MetaDisplay *display, + MetaTabList type, + MetaScreen *screen, + MetaWorkspace *workspace) +{ + MetaWindow *window; + + window = display->focus_window; + + if (window != NULL && + window->screen == screen && + IN_TAB_CHAIN (window, type) && + (workspace == NULL || + meta_window_visible_on_workspace (window, workspace))) + return window; + else + return NULL; +} + int meta_resize_gravity_from_grab_op (MetaGrabOp op) { diff --git a/src/display.h b/src/display.h index b301c4545..ecf20a6e3 100644 --- a/src/display.h +++ b/src/display.h @@ -369,6 +369,11 @@ MetaWindow* meta_display_get_tab_next (MetaDisplay *display, MetaWindow *window, gboolean backward); +MetaWindow* meta_display_get_tab_current (MetaDisplay *display, + MetaTabList type, + MetaScreen *screen, + MetaWorkspace *workspace); + int meta_resize_gravity_from_grab_op (MetaGrabOp op); gboolean meta_rectangle_intersect (MetaRectangle *src1, diff --git a/src/keybindings.c b/src/keybindings.c index f46ec266d..5bb267628 100644 --- a/src/keybindings.c +++ b/src/keybindings.c @@ -2333,77 +2333,68 @@ do_choose_window (MetaDisplay *display, MetaKeyBinding *binding, gboolean show_popup) { - MetaWindow *window; + MetaScreen *screen; MetaTabList type; gboolean backward; + MetaWindow *initial_selection; type = GPOINTER_TO_INT (binding->handler->data); meta_topic (META_DEBUG_KEYBINDINGS, "Tab list = %d show_popup = %d\n", type, show_popup); + + screen = meta_display_screen_for_root (display, + event->xkey.root); + + if (screen == NULL) + { + meta_topic (META_DEBUG_KEYBINDINGS, + "No screen for root 0x%lx, not doing choose_window\n", + event->xkey.root); + return; + } /* backward if shift is down, this isn't configurable */ backward = (event->xkey.state & ShiftMask) != 0; + + initial_selection = meta_display_get_tab_next (display, + type, + screen, + screen->active_workspace, + NULL, + backward); + + /* Note that focus_window may not be in the tab chain, but it's OK */ + if (initial_selection == NULL) + initial_selection = meta_display_get_tab_current (display, + type, screen, + screen->active_workspace); - window = NULL; + meta_topic (META_DEBUG_KEYBINDINGS, + "Initially selecting window %s\n", + initial_selection ? initial_selection->desc : "(none)"); - if (display->focus_window != NULL) - { - window = meta_display_get_tab_next (display, - type, - display->focus_window->screen, - display->focus_window->screen->active_workspace, - display->focus_window, - backward); - } + if (initial_selection != NULL && + meta_display_begin_grab_op (display, + screen, + NULL, + show_popup ? + tab_op_from_tab_type (type) : + cycle_op_from_tab_type (type), + FALSE, + 0, + event->xkey.state & ~(display->ignored_modifier_mask), + event->xkey.time, + 0, 0)) + { + meta_ui_tab_popup_select (screen->tab_popup, + (MetaTabEntryKey) initial_selection->xwindow); - if (window == NULL) - { - MetaScreen *screen; - - screen = meta_display_screen_for_root (display, - event->xkey.root); - - /* We get the screen because event_window may be NULL, - * in which case we can't use event_window->screen - */ - if (screen) - { - window = meta_display_get_tab_next (screen->display, - type, - screen, - screen->active_workspace, - NULL, - backward); - } - } - - if (window) - { - meta_topic (META_DEBUG_KEYBINDINGS, - "Starting tab/cycle between windows\n"); - - if (meta_display_begin_grab_op (window->display, - window->screen, - NULL, - show_popup ? - tab_op_from_tab_type (type) : - cycle_op_from_tab_type (type), - FALSE, - 0, - event->xkey.state & ~(display->ignored_modifier_mask), - event->xkey.time, - 0, 0)) - { - meta_ui_tab_popup_select (window->screen->tab_popup, - (MetaTabEntryKey) window->xwindow); - - if (show_popup) - meta_ui_tab_popup_set_showing (window->screen->tab_popup, - TRUE); - else - meta_window_raise (window); - } + if (show_popup) + meta_ui_tab_popup_set_showing (screen->tab_popup, + TRUE); + else + meta_window_raise (initial_selection); } } diff --git a/src/tabpopup.c b/src/tabpopup.c index 116e42e5c..30378f175 100644 --- a/src/tabpopup.c +++ b/src/tabpopup.c @@ -446,6 +446,10 @@ meta_ui_tab_popup_select (MetaTabPopup *popup, { GList *tmp; + /* Note, "key" may not be in the list of entries; other code assumes + * it's OK to pass in a key that isn't. + */ + tmp = popup->entries; while (tmp != NULL) {