screen: use stack tracker for initial window query

In meta_screen_manage_all_windows() we can use our own stack
tracker to get the list of windows - no need to query X again.

A copy is needed because the stack gets modified as part of the loop.
Specifically, meta_stack_tracker_get_stack() at this time returns the
predicted stack, and meta_window_new() performs a few operations
(e.g. framing) which cause immediate changes to the predicted stack.

https://bugzilla.gnome.org/show_bug.cgi?id=721345
This commit is contained in:
Daniel Drake 2013-12-30 14:26:10 -06:00
parent fef32fb0d4
commit bc9b923d5c

View File

@ -883,9 +883,9 @@ meta_screen_free (MetaScreen *screen,
void void
meta_screen_manage_all_windows (MetaScreen *screen) meta_screen_manage_all_windows (MetaScreen *screen)
{ {
Window ignored1, ignored2; Window *_children;
Window *children; Window *children;
guint n_children, i; int n_children, i;
meta_display_grab (screen->display); meta_display_grab (screen->display);
@ -894,10 +894,10 @@ meta_screen_manage_all_windows (MetaScreen *screen)
screen); screen);
meta_stack_freeze (screen->stack); meta_stack_freeze (screen->stack);
meta_stack_tracker_get_stack (screen->stack_tracker, &_children, &n_children);
XQueryTree (screen->display->xdisplay, /* Copy the stack as it will be modified as part of the loop */
screen->xroot, children = g_memdup (_children, sizeof (Window) * n_children);
&ignored1, &ignored2, &children, &n_children);
for (i = 0; i < n_children; ++i) for (i = 0; i < n_children; ++i)
{ {
@ -905,9 +905,7 @@ meta_screen_manage_all_windows (MetaScreen *screen)
META_COMP_EFFECT_NONE); META_COMP_EFFECT_NONE);
} }
if (children) g_free (children);
XFree (children);
meta_stack_thaw (screen->stack); meta_stack_thaw (screen->stack);
meta_display_ungrab (screen->display); meta_display_ungrab (screen->display);