use new functions

2002-03-11  Havoc Pennington  <hp@pobox.com>

	* src/keybindings.c: use new functions

	* src/display.c (meta_display_get_tab_next):
	(meta_display_get_tab_list): new tab order functions using
	MRU list instead of map order

	* src/window.c (meta_window_notify_focus): maintain focus MRU list

	* src/display.h (struct _MetaDisplay): Keep an MRU list of
	windows.
This commit is contained in:
Havoc Pennington 2002-03-12 04:34:17 +00:00 committed by Havoc Pennington
parent 35a2f2df76
commit 11089cb824
8 changed files with 237 additions and 59 deletions

View File

@ -1,3 +1,16 @@
2002-03-11 Havoc Pennington <hp@pobox.com>
* src/keybindings.c: use new functions
* src/display.c (meta_display_get_tab_next):
(meta_display_get_tab_list): new tab order functions using
MRU list instead of map order
* src/window.c (meta_window_notify_focus): maintain focus MRU list
* src/display.h (struct _MetaDisplay): Keep an MRU list of
windows.
2002-03-10 Havoc Pennington <hp@pobox.com> 2002-03-10 Havoc Pennington <hp@pobox.com>
* src/display.c (event_callback): support _NET_NUMBER_OF_DESKTOPS * src/display.c (event_callback): support _NET_NUMBER_OF_DESKTOPS

View File

@ -240,7 +240,7 @@ meta_display_open (const char *name)
display->pending_pings = NULL; display->pending_pings = NULL;
display->focus_window = NULL; display->focus_window = NULL;
display->prev_focus_window = NULL; display->mru_list = NULL;
display->showing_desktop = FALSE; display->showing_desktop = FALSE;
@ -1509,7 +1509,7 @@ meta_event_mode_to_string (int m)
return mode; return mode;
} }
const char* static const char*
stack_mode_to_string (int mode) stack_mode_to_string (int mode)
{ {
switch (mode) switch (mode)
@ -1654,7 +1654,7 @@ meta_spew_event (MetaDisplay *display,
break; break;
case ConfigureRequest: case ConfigureRequest:
name = "ConfigureRequest"; name = "ConfigureRequest";
extra = g_strdup_printf ("parent: 0x%lx window: 0x%lx x: %d %sy: %d %sw: %d %sh: %d %sborder: %d %sabove: %lx %sstackmode: %lx %s", extra = g_strdup_printf ("parent: 0x%lx window: 0x%lx x: %d %sy: %d %sw: %d %sh: %d %sborder: %d %sabove: %lx %sstackmode: %s %s",
event->xconfigurerequest.parent, event->xconfigurerequest.parent,
event->xconfigurerequest.window, event->xconfigurerequest.window,
event->xconfigurerequest.x, event->xconfigurerequest.x,
@ -2506,3 +2506,154 @@ meta_display_window_has_pending_pings (MetaDisplay *display,
return FALSE; return FALSE;
} }
static MetaWindow*
find_tab_forward (MetaDisplay *display,
MetaWorkspace *workspace,
GList *start)
{
GList *tmp;
g_return_val_if_fail (start != NULL, NULL);
tmp = start->next;
while (tmp != NULL)
{
MetaWindow *window = tmp->data;
if (META_WINDOW_IN_TAB_CHAIN (window) &&
(workspace == NULL ||
meta_window_visible_on_workspace (window, workspace)))
return window;
tmp = tmp->next;
}
tmp = display->mru_list;
while (tmp != start)
{
MetaWindow *window = tmp->data;
if (META_WINDOW_IN_TAB_CHAIN (window) &&
(workspace == NULL ||
meta_window_visible_on_workspace (window, workspace)))
return window;
tmp = tmp->next;
}
return NULL;
}
static MetaWindow*
find_tab_backward (MetaDisplay *display,
MetaWorkspace *workspace,
GList *start)
{
GList *tmp;
g_return_val_if_fail (start != NULL, NULL);
tmp = start->prev;
while (tmp != NULL)
{
MetaWindow *window = tmp->data;
if (META_WINDOW_IN_TAB_CHAIN (window) &&
(workspace == NULL ||
meta_window_visible_on_workspace (window, workspace)))
return window;
tmp = tmp->prev;
}
tmp = g_list_last (display->mru_list);
while (tmp != start)
{
MetaWindow *window = tmp->data;
if (META_WINDOW_IN_TAB_CHAIN (window) &&
(workspace == NULL ||
meta_window_visible_on_workspace (window, workspace)))
return window;
tmp = tmp->prev;
}
return NULL;
}
GSList*
meta_display_get_tab_list (MetaDisplay *display,
MetaScreen *screen,
MetaWorkspace *workspace)
{
GSList *tab_list;
/* workspace can be NULL for all workspaces */
#ifdef JOEL_RECOMMENDATION
/* mapping order */
tab_list = meta_stack_get_tab_list (screen->stack, workspace);
#else
/* Windows sellout mode - MRU order */
{
GList *tmp;
tab_list = NULL;
tmp = screen->display->mru_list;
while (tmp != NULL)
{
MetaWindow *window = tmp->data;
if (window->screen == screen &&
META_WINDOW_IN_TAB_CHAIN (window) &&
(workspace == NULL ||
meta_window_visible_on_workspace (window, workspace)))
tab_list = g_slist_prepend (tab_list, window);
tmp = tmp->next;
}
tab_list = g_slist_reverse (tab_list);
}
#endif
return tab_list;
}
MetaWindow*
meta_display_get_tab_next (MetaDisplay *display,
MetaWorkspace *workspace,
MetaWindow *window,
gboolean backward)
{
#ifdef JOEL_RECOMMENDATION
return meta_stack_get_tab_next (window->screen->stack,
workspace,
window,
backward);
#else
if (display->mru_list == NULL)
return NULL;
if (window != NULL)
{
g_assert (window->display == display);
if (backward)
return find_tab_backward (display, workspace,
g_list_find (display->mru_list,
window));
else
return find_tab_forward (display, workspace,
g_list_find (display->mru_list,
window));
}
if (backward)
return find_tab_backward (display, workspace,
g_list_last (display->mru_list));
else
return find_tab_forward (display, workspace,
display->mru_list);
#endif
}

View File

@ -133,8 +133,10 @@ struct _MetaDisplay
*/ */
MetaWindow *focus_window; MetaWindow *focus_window;
/* Previous focus window */ /* Most recently focused list. Always contains all
MetaWindow *prev_focus_window; * live windows.
*/
GList *mru_list;
GList *workspaces; GList *workspaces;
@ -271,5 +273,13 @@ void meta_display_ping_window (MetaDisplay *display,
gboolean meta_display_window_has_pending_pings (MetaDisplay *display, gboolean meta_display_window_has_pending_pings (MetaDisplay *display,
MetaWindow *window); MetaWindow *window);
GSList* meta_display_get_tab_list (MetaDisplay *display,
MetaScreen *screen,
MetaWorkspace *workspace);
MetaWindow* meta_display_get_tab_next (MetaDisplay *display,
MetaWorkspace *workspace,
MetaWindow *window,
gboolean backward);
#endif #endif

View File

@ -961,10 +961,10 @@ handle_tab_forward (MetaDisplay *display,
if (display->focus_window != NULL) if (display->focus_window != NULL)
{ {
window = meta_stack_get_tab_next (display->focus_window->screen->stack, window = meta_display_get_tab_next (display,
display->focus_window->screen->active_workspace, display->focus_window->screen->active_workspace,
display->focus_window, display->focus_window,
FALSE); FALSE);
} }
if (window == NULL) if (window == NULL)
@ -979,10 +979,10 @@ handle_tab_forward (MetaDisplay *display,
*/ */
if (screen) if (screen)
{ {
window = meta_stack_get_tab_next (screen->stack, window = meta_display_get_tab_next (screen->display,
screen->active_workspace, screen->active_workspace,
NULL, NULL,
FALSE); FALSE);
} }
} }
@ -1022,10 +1022,10 @@ handle_tab_backward (MetaDisplay *display,
if (display->focus_window != NULL) if (display->focus_window != NULL)
{ {
window = meta_stack_get_tab_next (display->focus_window->screen->stack, window = meta_display_get_tab_next (display,
display->focus_window->screen->active_workspace, display->focus_window->screen->active_workspace,
display->focus_window, display->focus_window,
TRUE); TRUE);
} }
if (window == NULL) if (window == NULL)
@ -1040,10 +1040,10 @@ handle_tab_backward (MetaDisplay *display,
*/ */
if (screen) if (screen)
{ {
window = meta_stack_get_tab_next (screen->stack, window = meta_display_get_tab_next (screen->display,
screen->active_workspace, screen->active_workspace,
NULL, NULL,
TRUE); TRUE);
} }
} }
@ -1086,7 +1086,14 @@ handle_focus_previous (MetaDisplay *display,
if (screen == NULL) if (screen == NULL)
return; return;
window = display->prev_focus_window; window = NULL;
/* get previously-focused window, front of list is currently
* focused window
*/
if (display->mru_list &&
display->mru_list->next)
window = display->mru_list->next->data;
if (window && if (window &&
!meta_window_visible_on_workspace (window, !meta_window_visible_on_workspace (window,
@ -1096,10 +1103,10 @@ handle_focus_previous (MetaDisplay *display,
if (window == NULL) if (window == NULL)
{ {
/* Pick first window in tab order */ /* Pick first window in tab order */
window = meta_stack_get_tab_next (screen->stack, window = meta_display_get_tab_next (screen->display,
screen->active_workspace, screen->active_workspace,
NULL, NULL,
TRUE); TRUE);
} }
if (window && if (window &&

View File

@ -602,8 +602,10 @@ meta_screen_ensure_tab_popup (MetaScreen *screen)
if (screen->tab_popup) if (screen->tab_popup)
return; return;
tab_list = meta_stack_get_tab_list (screen->stack, tab_list = meta_display_get_tab_list (screen->display,
screen->active_workspace); screen,
screen->active_workspace);
len = g_slist_length (tab_list); len = g_slist_length (tab_list);
entries = g_new (MetaTabEntry, len + 1); entries = g_new (MetaTabEntry, len + 1);

View File

@ -929,8 +929,6 @@ meta_stack_get_default_focus_window (MetaStack *stack,
return topmost_dock; return topmost_dock;
} }
#define IN_TAB_CHAIN(w) ((w)->type != META_WINDOW_DOCK && (w)->type != META_WINDOW_DESKTOP)
#define GET_XWINDOW(stack, i) (g_array_index ((stack)->windows, \ #define GET_XWINDOW(stack, i) (g_array_index ((stack)->windows, \
Window, (i))) Window, (i)))
@ -951,7 +949,7 @@ find_tab_forward (MetaStack *stack,
window = meta_display_lookup_x_window (stack->screen->display, window = meta_display_lookup_x_window (stack->screen->display,
GET_XWINDOW (stack, i)); GET_XWINDOW (stack, i));
if (window && IN_TAB_CHAIN (window) && if (window && META_WINDOW_IN_TAB_CHAIN (window) &&
(workspace == NULL || (workspace == NULL ||
meta_window_visible_on_workspace (window, workspace))) meta_window_visible_on_workspace (window, workspace)))
return window; return window;
@ -967,7 +965,7 @@ find_tab_forward (MetaStack *stack,
window = meta_display_lookup_x_window (stack->screen->display, window = meta_display_lookup_x_window (stack->screen->display,
GET_XWINDOW (stack, i)); GET_XWINDOW (stack, i));
if (window && IN_TAB_CHAIN (window) && if (window && META_WINDOW_IN_TAB_CHAIN (window) &&
(workspace == NULL || (workspace == NULL ||
meta_window_visible_on_workspace (window, workspace))) meta_window_visible_on_workspace (window, workspace)))
return window; return window;
@ -996,7 +994,7 @@ find_tab_backward (MetaStack *stack,
window = meta_display_lookup_x_window (stack->screen->display, window = meta_display_lookup_x_window (stack->screen->display,
GET_XWINDOW (stack, i)); GET_XWINDOW (stack, i));
if (window && IN_TAB_CHAIN (window) && if (window && META_WINDOW_IN_TAB_CHAIN (window) &&
(workspace == NULL || (workspace == NULL ||
meta_window_visible_on_workspace (window, workspace))) meta_window_visible_on_workspace (window, workspace)))
return window; return window;
@ -1012,7 +1010,7 @@ find_tab_backward (MetaStack *stack,
window = meta_display_lookup_x_window (stack->screen->display, window = meta_display_lookup_x_window (stack->screen->display,
GET_XWINDOW (stack, i)); GET_XWINDOW (stack, i));
if (window && IN_TAB_CHAIN (window) && if (window && META_WINDOW_IN_TAB_CHAIN (window) &&
(workspace == NULL || (workspace == NULL ||
meta_window_visible_on_workspace (window, workspace))) meta_window_visible_on_workspace (window, workspace)))
return window; return window;
@ -1094,7 +1092,7 @@ meta_stack_get_tab_list (MetaStack *stack,
window = meta_display_lookup_x_window (stack->screen->display, window = meta_display_lookup_x_window (stack->screen->display,
GET_XWINDOW (stack, i)); GET_XWINDOW (stack, i));
if (window && IN_TAB_CHAIN (window) && if (window && META_WINDOW_IN_TAB_CHAIN (window) &&
(workspace == NULL || (workspace == NULL ||
meta_window_visible_on_workspace (window, workspace))) meta_window_visible_on_workspace (window, workspace)))
list = g_slist_prepend (list, window); list = g_slist_prepend (list, window);

View File

@ -590,6 +590,10 @@ meta_window_new (MetaDisplay *display, Window xwindow,
window->size_hints.width, window->size_hints.width,
window->size_hints.height); window->size_hints.height);
/* add to MRU list */
window->display->mru_list =
g_list_append (window->display->mru_list, window);
meta_stack_add (window->screen->stack, meta_stack_add (window->screen->stack,
window); window);
@ -761,8 +765,8 @@ meta_window_free (MetaWindow *window)
if (window->display->focus_window == window) if (window->display->focus_window == window)
window->display->focus_window = NULL; window->display->focus_window = NULL;
if (window->display->prev_focus_window == window) window->display->mru_list =
window->display->prev_focus_window = NULL; g_list_remove (window->display->mru_list, window);
meta_window_unqueue_calc_showing (window); meta_window_unqueue_calc_showing (window);
meta_window_unqueue_move_resize (window); meta_window_unqueue_move_resize (window);
@ -3185,19 +3189,14 @@ meta_window_notify_focus (MetaWindow *window,
* because we won't get a focus out if it occurs, apparently. * because we won't get a focus out if it occurs, apparently.
*/ */
/* We don't ever want to set prev_focus_window to NULL,
* though it may be NULL due to e.g. only one window ever
* getting focus, or a window disappearing.
*/
/* We ignore grabs, though this is questionable. /* We ignore grabs, though this is questionable.
* It may be better to increase the intelligence of * It may be better to increase the intelligence of
* the focus window tracking. * the focus window tracking.
* *
* The problem is that keybindings for windows are done * The problem is that keybindings for windows are done with
* with XGrabKey, which means focus_window disappears * XGrabKey, which means focus_window disappears and the front of
* and prev_focus_window gets confused from what the * the MRU list gets confused from what the user expects once a
* user expects once a keybinding is used. * keybinding is used.
*/ */
meta_topic (META_DEBUG_FOCUS, meta_topic (META_DEBUG_FOCUS,
"Focus %s event received on %s 0x%lx (%s) " "Focus %s event received on %s 0x%lx (%s) "
@ -3225,7 +3224,7 @@ meta_window_notify_focus (MetaWindow *window,
event->xfocus.detail > NotifyNonlinearVirtual)) event->xfocus.detail > NotifyNonlinearVirtual))
{ {
meta_topic (META_DEBUG_FOCUS, meta_topic (META_DEBUG_FOCUS,
"Ignoring focus event generated by a grab\n"); "Ignoring focus event generated by a grab or other weirdness\n");
return TRUE; return TRUE;
} }
@ -3233,18 +3232,15 @@ meta_window_notify_focus (MetaWindow *window,
{ {
if (window != window->display->focus_window) if (window != window->display->focus_window)
{ {
if (window == window->display->prev_focus_window &&
window->display->focus_window != NULL)
{
meta_topic (META_DEBUG_FOCUS,
"%s is now the previous focus window due to another window focused in\n",
window->display->focus_window->desc);
window->display->prev_focus_window = window->display->focus_window;
}
meta_topic (META_DEBUG_FOCUS, meta_topic (META_DEBUG_FOCUS,
"* Focus --> %s\n", window->desc); "* Focus --> %s\n", window->desc);
window->display->focus_window = window; window->display->focus_window = window;
window->has_focus = TRUE; window->has_focus = TRUE;
/* Move to the front of the MRU list */
window->display->mru_list =
g_list_remove (window->display->mru_list, window);
window->display->mru_list =
g_list_prepend (window->display->mru_list, window);
if (window->frame) if (window->frame)
meta_frame_queue_draw (window->frame); meta_frame_queue_draw (window->frame);
} }
@ -3268,8 +3264,6 @@ meta_window_notify_focus (MetaWindow *window,
"%s is now the previous focus window due to being focused out or unmapped\n", "%s is now the previous focus window due to being focused out or unmapped\n",
window->desc); window->desc);
window->display->prev_focus_window = window;
meta_topic (META_DEBUG_FOCUS, meta_topic (META_DEBUG_FOCUS,
"* Focus --> NULL (was %s)\n", window->desc); "* Focus --> NULL (was %s)\n", window->desc);

View File

@ -364,4 +364,7 @@ void meta_window_get_work_area (MetaWindow *window,
gboolean meta_window_same_application (MetaWindow *window, gboolean meta_window_same_application (MetaWindow *window,
MetaWindow *other_window); MetaWindow *other_window);
#define META_WINDOW_IN_TAB_CHAIN(w) \
((w)->type != META_WINDOW_DOCK && (w)->type != META_WINDOW_DESKTOP)
#endif #endif