[metacity] stack: make meta_window_raise() and meta_window_lower() smarter



commit 9245f9588bd7c17ccbe04df65c1579313cbad07b
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Tue Oct 18 00:39:08 2011 -0400

    stack: make meta_window_raise() and meta_window_lower() smarter
    
    https://bugzilla.gnome.org/show_bug.cgi?id=620744

 src/core/stack.c |   41 ++++++++++++++++++++++++++++++++++++++---
 1 files changed, 38 insertions(+), 3 deletions(-)
---
diff --git a/src/core/stack.c b/src/core/stack.c
index 822d43b..c499ada 100644
--- a/src/core/stack.c
+++ b/src/core/stack.c
@@ -179,8 +179,25 @@ void
 meta_stack_raise (MetaStack  *stack,
                   MetaWindow *window)
 {
-  meta_window_set_stack_position_no_sync (window,
-                                          stack->n_positions - 1);
+  GList *l;
+  int max_stack_position = window->stack_position;
+  MetaWorkspace *workspace;
+
+  g_assert (stack->added == NULL);
+
+  workspace = meta_window_get_workspace (window);
+  for (l = stack->sorted; l; l = l->next)
+    {
+      MetaWindow *w = (MetaWindow *) l->data;
+      if (meta_window_located_on_workspace (w, workspace) &&
+          w->stack_position > max_stack_position)
+        max_stack_position = w->stack_position;
+    }
+
+  if (max_stack_position == window->stack_position)
+    return;
+
+  meta_window_set_stack_position_no_sync (window, max_stack_position);
 
   stack_sync_to_server (stack);
 }
@@ -189,7 +206,25 @@ void
 meta_stack_lower (MetaStack  *stack,
                   MetaWindow *window)
 {
-  meta_window_set_stack_position_no_sync (window, 0);
+  GList *l;
+  int min_stack_position = window->stack_position;
+  MetaWorkspace *workspace;
+
+  g_assert (stack->added == NULL);
+
+  workspace = meta_window_get_workspace (window);
+  for (l = stack->sorted; l; l = l->next)
+    {
+      MetaWindow *w = (MetaWindow *) l->data;
+      if (meta_window_located_on_workspace (w, workspace) &&
+          w->stack_position < min_stack_position)
+        min_stack_position = w->stack_position;
+    }
+
+  if (min_stack_position == window->stack_position)
+    return;
+
+  meta_window_set_stack_position_no_sync (window, min_stack_position);
 
   stack_sync_to_server (stack);
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]