diff options
author | rcaridade145 <[email protected]> | 2020-03-03 20:05:27 +0000 |
---|---|---|
committer | Victor Kareh <[email protected]> | 2020-05-27 11:26:47 -0400 |
commit | 55aec359a614370e866e4a282e350e8db0558124 (patch) | |
tree | 744a711663669e840d60b8a3e4bd672350846890 | |
parent | c7d07c2f4d00bb0e7252b773ef2e1d0559f733fd (diff) | |
download | marco-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.c | 42 |
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) { |