diff options
Diffstat (limited to 'src/core/stack.c')
-rw-r--r-- | src/core/stack.c | 226 |
1 files changed, 113 insertions, 113 deletions
diff --git a/src/core/stack.c b/src/core/stack.c index 2a1dd8e5..9ab4d60e 100644 --- a/src/core/stack.c +++ b/src/core/stack.c @@ -4,12 +4,12 @@ * \file stack.c Which windows cover which other windows */ -/* +/* * Copyright (C) 2001 Havoc Pennington * Copyright (C) 2002, 2003 Red Hat, Inc. * Copyright (C) 2004 Rob Adams * Copyright (C) 2004, 2005 Elijah Newren - * + * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the @@ -19,7 +19,7 @@ * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA @@ -66,7 +66,7 @@ MetaStack* meta_stack_new (MetaScreen *screen) { MetaStack *stack; - + stack = g_new (MetaStack, 1); stack->screen = screen; @@ -84,7 +84,7 @@ meta_stack_new (MetaScreen *screen) stack->need_resort = FALSE; stack->need_relayer = FALSE; stack->need_constrain = FALSE; - + return stack; } @@ -99,7 +99,7 @@ meta_stack_free (MetaStack *stack) if (stack->last_root_children_stacked) g_array_free (stack->last_root_children_stacked, TRUE); - + g_free (stack); } @@ -111,7 +111,7 @@ meta_stack_add (MetaStack *stack, if (window->stack_position >= 0) meta_bug ("Window %s had stack position already\n", window->desc); - + stack->added = g_list_prepend (stack->added, window); window->stack_position = stack->n_positions; @@ -119,7 +119,7 @@ meta_stack_add (MetaStack *stack, meta_topic (META_DEBUG_STACK, "Window %s has stack_position initialized to %d\n", window->desc, window->stack_position); - + stack_sync_to_server (stack); } @@ -139,7 +139,7 @@ meta_stack_remove (MetaStack *stack, meta_window_set_stack_position_no_sync (window, stack->n_positions - 1); window->stack_position = -1; - stack->n_positions -= 1; + stack->n_positions -= 1; /* We don't know if it's been moved from "added" to "stack" yet */ stack->added = g_list_remove (stack->added, window); @@ -154,7 +154,7 @@ meta_stack_remove (MetaStack *stack, if (window->frame) stack->removed = g_list_prepend (stack->removed, GUINT_TO_POINTER (window->frame->xwindow)); - + stack_sync_to_server (stack); } @@ -163,7 +163,7 @@ meta_stack_update_layer (MetaStack *stack, MetaWindow *window) { stack->need_relayer = TRUE; - + stack_sync_to_server (stack); } @@ -172,7 +172,7 @@ meta_stack_update_transient (MetaStack *stack, MetaWindow *window) { stack->need_constrain = TRUE; - + stack_sync_to_server (stack); } @@ -180,10 +180,10 @@ meta_stack_update_transient (MetaStack *stack, void meta_stack_raise (MetaStack *stack, MetaWindow *window) -{ +{ meta_window_set_stack_position_no_sync (window, stack->n_positions - 1); - + stack_sync_to_server (stack); } @@ -192,7 +192,7 @@ meta_stack_lower (MetaStack *stack, MetaWindow *window) { meta_window_set_stack_position_no_sync (window, 0); - + stack_sync_to_server (stack); } @@ -206,7 +206,7 @@ void meta_stack_thaw (MetaStack *stack) { g_return_if_fail (stack->freeze_count > 0); - + stack->freeze_count -= 1; stack_sync_to_server (stack); } @@ -240,7 +240,7 @@ get_standalone_layer (MetaWindow *window) { MetaStackLayer layer; gboolean focused_transient = FALSE; - + switch (window->type) { case META_WINDOW_DESKTOP: @@ -255,7 +255,7 @@ get_standalone_layer (MetaWindow *window) layer = META_LAYER_DOCK; break; - default: + default: meta_window_foreach_transient (window, is_focused_foreach, &focused_transient); @@ -291,16 +291,16 @@ get_maximum_layer_in_group (MetaWindow *window) GSList *tmp; MetaStackLayer max; MetaStackLayer layer; - + max = META_LAYER_DESKTOP; - + group = meta_window_get_group (window); if (group != NULL) members = meta_group_list_windows (group); else members = NULL; - + tmp = members; while (tmp != NULL) { @@ -309,12 +309,12 @@ get_maximum_layer_in_group (MetaWindow *window) layer = get_standalone_layer (w); if (layer > max) max = layer; - + tmp = tmp->next; } g_slist_free (members); - + return max; } @@ -322,7 +322,7 @@ static void compute_layer (MetaWindow *window) { window->layer = get_standalone_layer (window); - + /* We can only do promotion-due-to-group for dialogs and other * transients, or weird stuff happens like the desktop window and * caja windows getting in the same layer, or all mate-terminal @@ -338,11 +338,11 @@ compute_layer (MetaWindow *window) * and a dialog transient for the normal window; you don't want the dialog * above the dock if it wouldn't normally be. */ - + MetaStackLayer group_max; - + group_max = get_maximum_layer_in_group (window); - + if (group_max > window->layer) { meta_topic (META_DEBUG_STACK, @@ -379,10 +379,10 @@ compare_window_position (void *a, else return 0; /* not reached */ } - + /* * Stacking constraints - * + * * Assume constraints of the form "AB" meaning "window A must be * below window B" * @@ -399,14 +399,14 @@ compare_window_position (void *a, * apply BC: ABC * * but apply constraints in the wrong order and it breaks: - * + * * start: BCA * apply BC: BCA * apply AB: CAB * * We make a directed graph of the constraints by linking * from "above windows" to "below windows as follows: - * + * * AB -> BC -> CD * \ * CE @@ -431,7 +431,7 @@ struct Constraint /* used to create the graph. */ GSList *next_nodes; - + /* constraint has been applied, used * to detect cycles. */ @@ -459,7 +459,7 @@ add_constraint (Constraint **constraints, Constraint *c; g_assert (above->screen == below->screen); - + /* check if constraint is a duplicate */ c = constraints[below->stack_position]; while (c != NULL) @@ -486,7 +486,7 @@ create_constraints (Constraint **constraints, GList *windows) { GList *tmp; - + tmp = windows; while (tmp != NULL) { @@ -499,7 +499,7 @@ create_constraints (Constraint **constraints, tmp = tmp->next; continue; } - + if (WINDOW_TRANSIENT_FOR_WHOLE_GROUP (w)) { GSList *group_windows; @@ -512,9 +512,9 @@ create_constraints (Constraint **constraints, group_windows = meta_group_list_windows (group); else group_windows = NULL; - + tmp2 = group_windows; - + while (tmp2 != NULL) { MetaWindow *group_window = tmp2->data; @@ -525,7 +525,7 @@ create_constraints (Constraint **constraints, tmp2 = tmp2->next; continue; } - + #if 0 /* old way of doing it */ if (!(meta_window_is_ancestor_of_transient (w, group_window)) && @@ -541,7 +541,7 @@ create_constraints (Constraint **constraints, w->desc, group_window->desc); add_constraint (constraints, w, group_window); } - + tmp2 = tmp2->next; } @@ -551,7 +551,7 @@ create_constraints (Constraint **constraints, !w->transient_parent_is_root_window) { MetaWindow *parent; - + parent = meta_display_lookup_x_window (w->display, w->xtransient_for); @@ -563,7 +563,7 @@ create_constraints (Constraint **constraints, add_constraint (constraints, w, parent); } } - + tmp = tmp->next; } } @@ -582,12 +582,12 @@ graph_constraints (Constraint **constraints, /* If we have "A below B" and "B below C" then AB -> BC so we * add BC to next_nodes in AB. */ - + c = constraints[i]; while (c != NULL) { Constraint *n; - + g_assert (c->below->stack_position == i); /* Constraints where ->above is below are our @@ -600,10 +600,10 @@ graph_constraints (Constraint **constraints, n); /* c is a previous node of n */ n->has_prev = TRUE; - + n = n->next; } - + c = c->next; } @@ -621,16 +621,16 @@ free_constraints (Constraint **constraints, while (i < n_constraints) { Constraint *c; - + c = constraints[i]; while (c != NULL) { Constraint *next = c->next; - + g_slist_free (c->next_nodes); g_free (c); - + c = next; } @@ -641,7 +641,7 @@ free_constraints (Constraint **constraints, static void ensure_above (MetaWindow *above, MetaWindow *below) -{ +{ if (WINDOW_HAS_TRANSIENT_TYPE(above) && above->layer < below->layer) { @@ -669,10 +669,10 @@ traverse_constraint (Constraint *c) if (c->applied) return; - + ensure_above (c->above, c->below); c->applied = TRUE; - + tmp = c->next_nodes; while (tmp != NULL) { @@ -696,13 +696,13 @@ apply_constraints (Constraint **constraints, while (i < n_constraints) { Constraint *c; - + c = constraints[i]; while (c != NULL) { if (!c->has_prev) heads = g_slist_prepend (heads, c); - + c = c->next; } @@ -716,7 +716,7 @@ apply_constraints (Constraint **constraints, Constraint *c = tmp->data; traverse_constraint (c); - + tmp = tmp->next; } @@ -735,7 +735,7 @@ stack_do_window_deletions (MetaStack *stack) */ GList *tmp; int i; - + tmp = stack->removed; while (tmp != NULL) { @@ -749,7 +749,7 @@ stack_do_window_deletions (MetaStack *stack) while (i > 0) { --i; - + /* there's no guarantee we'll actually find windows to * remove, e.g. the same xwindow could have been * added/removed before we ever synced, and we put @@ -786,34 +786,34 @@ stack_do_window_additions (MetaStack *stack) meta_topic (META_DEBUG_STACK, "Adding %d windows to sorted list\n", n_added); - + old_size = stack->windows->len; g_array_set_size (stack->windows, old_size + n_added); - + end = &g_array_index (stack->windows, Window, old_size); /* stack->added has the most recent additions at the * front of the list, so we need to reverse it */ stack->added = g_list_reverse (stack->added); - + i = 0; tmp = stack->added; while (tmp != NULL) { MetaWindow *w; - + w = tmp->data; - + end[i] = w->xwindow; /* add to the main list */ stack->sorted = g_list_prepend (stack->sorted, w); - + ++i; tmp = tmp->next; } - + stack->need_resort = TRUE; /* may not be needed as we add to top */ stack->need_constrain = TRUE; stack->need_relayer = TRUE; @@ -830,13 +830,13 @@ static void stack_do_relayer (MetaStack *stack) { GList *tmp; - + if (!stack->need_relayer) return; - + meta_topic (META_DEBUG_STACK, "Recomputing layers\n"); - + tmp = stack->sorted; while (tmp != NULL) @@ -854,7 +854,7 @@ stack_do_relayer (MetaStack *stack) meta_topic (META_DEBUG_STACK, "Window %s moved from layer %u to %u\n", w->desc, old_layer, w->layer); - + stack->need_resort = TRUE; stack->need_constrain = TRUE; /* don't need to constrain as constraining @@ -862,7 +862,7 @@ stack_do_relayer (MetaStack *stack) * not layer */ } - + tmp = tmp->next; } @@ -879,7 +879,7 @@ stack_do_constrain (MetaStack *stack) Constraint **constraints; /* It'd be nice if this were all faster, probably */ - + if (!stack->need_constrain) return; @@ -894,10 +894,10 @@ stack_do_constrain (MetaStack *stack) graph_constraints (constraints, stack->n_positions); apply_constraints (constraints, stack->n_positions); - + free_constraints (constraints, stack->n_positions); g_free (constraints); - + stack->need_constrain = FALSE; } @@ -909,10 +909,10 @@ stack_do_resort (MetaStack *stack) { if (!stack->need_resort) return; - + meta_topic (META_DEBUG_STACK, "Sorting stack list\n"); - + stack->sorted = g_list_sort (stack->sorted, (GCompareFunc) compare_window_position); @@ -963,9 +963,9 @@ raise_window_relative_to_managed_windows (MetaScreen *screen, * we don't, since we know we won't manage any new windows * or restack any windows before using the XQueryTree results. */ - + meta_error_trap_push_with_return (screen->display); - + XQueryTree (screen->display->xdisplay, screen->xroot, &ignored1, &ignored2, &children, &n_children); @@ -1001,7 +1001,7 @@ raise_window_relative_to_managed_windows (MetaScreen *screen, children[i]) != NULL) { XWindowChanges changes; - + /* children[i] is the topmost managed child */ meta_topic (META_DEBUG_STACK, "Moving 0x%lx above topmost managed child window 0x%lx\n", @@ -1033,7 +1033,7 @@ raise_window_relative_to_managed_windows (MetaScreen *screen, xwindow); meta_error_trap_pop (screen->display, FALSE); } - + if (children) XFree (children); } @@ -1051,15 +1051,15 @@ stack_sync_to_server (MetaStack *stack) GArray *stacked; GArray *root_children_stacked; GList *tmp; - + /* Bail out if frozen */ if (stack->freeze_count > 0) return; - - meta_topic (META_DEBUG_STACK, "Syncing window stack to server\n"); + + meta_topic (META_DEBUG_STACK, "Syncing window stack to server\n"); stack_ensure_sorted (stack); - + /* Create stacked xwindow arrays. * Painfully, "stacked" is in bottom-to-top order for the * _NET hints, and "root_children_stacked" is in top-to-bottom @@ -1070,25 +1070,25 @@ stack_sync_to_server (MetaStack *stack) meta_topic (META_DEBUG_STACK, "Top to bottom: "); meta_push_no_msg_prefix (); - + tmp = stack->sorted; while (tmp != NULL) { MetaWindow *w; - + w = tmp->data; - + /* remember, stacked is in reverse order (bottom to top) */ g_array_prepend_val (stacked, w->xwindow); - + /* build XRestackWindows() array from top to bottom */ if (w->frame) g_array_append_val (root_children_stacked, w->frame->xwindow); else g_array_append_val (root_children_stacked, w->xwindow); - + meta_topic (META_DEBUG_STACK, "%u:%d - %s ", w->layer, w->stack_position, w->desc); - + tmp = tmp->next; } @@ -1099,12 +1099,12 @@ stack_sync_to_server (MetaStack *stack) if (stacked->len != stack->windows->len) meta_bug ("%u windows stacked, %u windows exist in stack\n", stacked->len, stack->windows->len); - + /* Sync to server */ meta_topic (META_DEBUG_STACK, "Restacking %u windows\n", root_children_stacked->len); - + meta_error_trap_push (stack->screen->display); if (stack->last_root_children_stacked == NULL) @@ -1136,7 +1136,7 @@ stack_sync_to_server (MetaStack *stack) const Window *old_end = old_stack + old_len; const Window *new_end = new_stack + new_len; Window last_window = None; - + while (oldp != old_end && newp != new_end) { @@ -1171,7 +1171,7 @@ stack_sync_to_server (MetaStack *stack) * *newp, then we fail to restack *newp; but on * unmanaging last_window, we'll fix it up. */ - + XWindowChanges changes; changes.sibling = last_window; @@ -1179,7 +1179,7 @@ stack_sync_to_server (MetaStack *stack) meta_topic (META_DEBUG_STACK, "Placing window 0x%lx below 0x%lx\n", *newp, last_window); - + XConfigureWindow (stack->screen->display->xdisplay, *newp, CWSibling | CWStackMode, @@ -1212,7 +1212,7 @@ stack_sync_to_server (MetaStack *stack) * get removed from the stacking list when we unmanage it * and we'll fix stacking at that time. */ - + /* Sync _NET_CLIENT_LIST and _NET_CLIENT_LIST_STACKING */ XChangeProperty (stack->screen->display->xdisplay, @@ -1235,7 +1235,7 @@ stack_sync_to_server (MetaStack *stack) if (stack->last_root_children_stacked) g_array_free (stack->last_root_children_stacked, TRUE); stack->last_root_children_stacked = root_children_stacked; - + /* That was scary... */ } @@ -1271,9 +1271,9 @@ meta_stack_get_above (MetaStack *stack, { GList *link; MetaWindow *above; - + stack_ensure_sorted (stack); - + link = g_list_find (stack->sorted, window); if (link == NULL) return NULL; @@ -1296,7 +1296,7 @@ meta_stack_get_below (MetaStack *stack, { GList *link; MetaWindow *below; - + stack_ensure_sorted (stack); link = g_list_find (stack->sorted, window); @@ -1305,7 +1305,7 @@ meta_stack_get_below (MetaStack *stack, return NULL; if (link->next == NULL) return NULL; - + below = link->next->data; if (only_within_layer && @@ -1347,7 +1347,7 @@ get_default_focus_window (MetaStack *stack, MetaWindow *topmost_overall; MetaGroup *not_this_one_group; GList *link; - + topmost_dock = NULL; transient_parent = NULL; topmost_in_group = NULL; @@ -1361,7 +1361,7 @@ get_default_focus_window (MetaStack *stack, /* top of this layer is at the front of the list */ link = stack->sorted; - + while (link) { MetaWindow *window = link->data; @@ -1449,22 +1449,22 @@ meta_stack_list_windows (MetaStack *stack, { GList *workspace_windows = NULL; GList *link; - + stack_ensure_sorted (stack); /* do adds/removes */ - + link = stack->sorted; - + while (link) { MetaWindow *window = link->data; - + if (window && (workspace == NULL || meta_window_located_on_workspace (window, workspace))) { workspace_windows = g_list_prepend (workspace_windows, window); } - + link = link->next; } @@ -1481,7 +1481,7 @@ meta_stack_windows_cmp (MetaStack *stack, /* -1 means a below b */ stack_ensure_sorted (stack); /* update constraints, layers */ - + if (window_a->layer < window_b->layer) return -1; else if (window_a->layer > window_b->layer) @@ -1531,7 +1531,7 @@ compare_pointers (gconstpointer a, return 1; else if (a < b) return -1; - else + else return 0; } @@ -1569,7 +1569,7 @@ meta_stack_set_positions (MetaStack *stack, /* Make sure any adds or removes aren't in limbo -- is this needed? */ stack_ensure_sorted (stack); - + if (!lists_contain_same_windows (windows, stack->sorted)) { meta_warning ("This list of windows has somehow changed; not resetting " @@ -1582,7 +1582,7 @@ meta_stack_set_positions (MetaStack *stack, stack->need_resort = TRUE; stack->need_constrain = TRUE; - + i = 0; tmp = windows; while (tmp != NULL) @@ -1591,7 +1591,7 @@ meta_stack_set_positions (MetaStack *stack, w->stack_position = i++; tmp = tmp->next; } - + meta_topic (META_DEBUG_STACK, "Reset the stack positions of (nearly) all windows\n"); @@ -1604,7 +1604,7 @@ meta_window_set_stack_position_no_sync (MetaWindow *window, { int low, high, delta; GList *tmp; - + g_return_if_fail (window->screen->stack != NULL); g_return_if_fail (window->stack_position >= 0); g_return_if_fail (position >= 0); @@ -1619,7 +1619,7 @@ meta_window_set_stack_position_no_sync (MetaWindow *window, window->screen->stack->need_resort = TRUE; window->screen->stack->need_constrain = TRUE; - + if (position < window->stack_position) { low = position; @@ -1644,7 +1644,7 @@ meta_window_set_stack_position_no_sync (MetaWindow *window, tmp = tmp->next; } - + window->stack_position = position; meta_topic (META_DEBUG_STACK, |