diff options
Diffstat (limited to 'src/core/stack.c')
-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) { |