summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrcaridade145 <[email protected]>2020-03-03 20:05:27 +0000
committerVictor Kareh <[email protected]>2020-05-27 11:26:47 -0400
commit55aec359a614370e866e4a282e350e8db0558124 (patch)
tree744a711663669e840d60b8a3e4bd672350846890
parentc7d07c2f4d00bb0e7252b773ef2e1d0559f733fd (diff)
downloadmarco-55aec359a614370e866e4a282e350e8db0558124.tar.bz2
marco-55aec359a614370e866e4a282e350e8db0558124.tar.xz
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
-rw-r--r--src/core/stack.c42
1 files 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)
{