From 34e4b594cded1773cd961ba0afea552fe2594e4d Mon Sep 17 00:00:00 2001 From: "Owen W. Taylor" Date: Mon, 15 Jun 2009 14:31:04 -0400 Subject: [PATCH] Don't do stacking for override-redirect windows Don't add override-redirect windows to MetaStack; we shouldn't be restacking them. Since we *aren't* stacking the override-redirect windows, we need to be careful that to ignore them when looking for the top managed window. http://bugzilla.gnome.org/show_bug.cgi?id=585984 --- src/core/stack.c | 46 ++++++++++++++++++++++------------------- src/core/window-props.c | 3 ++- src/core/window.c | 10 ++++++--- 3 files changed, 34 insertions(+), 25 deletions(-) diff --git a/src/core/stack.c b/src/core/stack.c index de70fb854..40a936501 100644 --- a/src/core/stack.c +++ b/src/core/stack.c @@ -1015,31 +1015,35 @@ raise_window_relative_to_managed_windows (MetaScreen *screen, * to be moved below. */ } - else if (meta_display_lookup_x_window (screen->display, - children[i]) != NULL) + else { - XWindowChanges changes; - - /* children[i] is the topmost managed child */ - meta_topic (META_DEBUG_STACK, - "Moving 0x%lx above topmost managed child window 0x%lx\n", - xwindow, children[i]); + MetaWindow *other = meta_display_lookup_x_window (screen->display, + children[i]); + if (other != NULL && !other->override_redirect) + { + XWindowChanges changes; - changes.sibling = children[i]; - changes.stack_mode = Above; + /* children[i] is the topmost managed child */ + meta_topic (META_DEBUG_STACK, + "Moving 0x%lx above topmost managed child window 0x%lx\n", + xwindow, children[i]); - meta_error_trap_push (screen->display); - meta_stack_tracker_record_raise_above (screen->stack_tracker, - xwindow, - children[i], - XNextRequest (screen->display->xdisplay)); - XConfigureWindow (screen->display->xdisplay, - xwindow, - CWSibling | CWStackMode, - &changes); - meta_error_trap_pop (screen->display, FALSE); + changes.sibling = children[i]; + changes.stack_mode = Above; - break; + meta_error_trap_push (screen->display); + meta_stack_tracker_record_raise_above (screen->stack_tracker, + xwindow, + children[i], + XNextRequest (screen->display->xdisplay)); + XConfigureWindow (screen->display->xdisplay, + xwindow, + CWSibling | CWStackMode, + &changes); + meta_error_trap_pop (screen->display, FALSE); + + break; + } } --i; diff --git a/src/core/window-props.c b/src/core/window-props.c index 8be22f870..ff2eb302a 100644 --- a/src/core/window-props.c +++ b/src/core/window-props.c @@ -1435,7 +1435,8 @@ reload_transient_for (MetaWindow *window, meta_window_recalc_window_type (window); /* update stacking constraints */ - meta_stack_update_transient (window->screen->stack, window); + if (!window->override_redirect) + meta_stack_update_transient (window->screen->stack, window); /* possibly change its group. We treat being a window's transient as * equivalent to making it your group leader, to work around shortcomings diff --git a/src/core/window.c b/src/core/window.c index 77d000ae3..5558e0cd7 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -955,8 +955,11 @@ meta_window_new_with_attrs (MetaDisplay *display, * and thus constraints may try to auto-fullscreen it which also * means restacking it. */ - meta_stack_add (window->screen->stack, - window); + if (!window->override_redirect) + meta_stack_add (window->screen->stack, + window); + else + window->layer = META_LAYER_OVERRIDE_REDIRECT; /* otherwise set by MetaStack */ /* Put our state back where it should be, * passing TRUE for is_configure_request, ICCCM says @@ -1311,7 +1314,8 @@ meta_window_unmanage (MetaWindow *window, } #endif - meta_stack_remove (window->screen->stack, window); + if (!window->override_redirect) + meta_stack_remove (window->screen->stack, window); if (window->frame) meta_window_destroy_frame (window);