Blob Blame History Raw
From fb2abec45170ffd81659c40fd5d2f6c1455fa651 Mon Sep 17 00:00:00 2001
From: rcaridade145 <rcaridade145@gmail.com>
Date: Tue, 3 Mar 2020 20:05:27 +0000
Subject: [PATCH 3/4] stack: make meta_window_raise() and meta_window_lower()
 smarter

https://bugzilla.gnome.org/show_bug.cgi?id=620744

Based on commit https://gitlab.gnome.org/GNOME/metacity/-/commit/9245f9588bd7c17ccbe04df65c1579313cbad07b
---
 src/core/stack.c | 42 +++++++++++++++++++++++++++++++++++++++---
 1 file changed, 39 insertions(+), 3 deletions(-)

diff --git a/src/core/stack.c b/src/core/stack.c
index 23a257b8..fa4dbee3 100644
--- a/src/core/stack.c
+++ b/src/core/stack.c
@@ -181,8 +181,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);
 }
@@ -191,7 +208,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);
 }
@@ -202,6 +237,7 @@ meta_stack_freeze (MetaStack *stack)
   stack->freeze_count += 1;
 }
 
+
 void
 meta_stack_thaw (MetaStack *stack)
 {
-- 
2.21.1