From c012105b90762279e72e31e6e1b9d386c50e4f59 Mon Sep 17 00:00:00 2001 From: "Owen W. Taylor" Date: Thu, 18 Jun 2009 16:35:31 -0400 Subject: [PATCH] Fix hiding newly added windows with live_hidden_windows When we add a window and it gets hidden as the first thing, we need to show not just the frame window, but also the window itself. Otherwise when the window subsequently becomes visible, it will just be an empty frame. Add helper functions to reduce current code duplication and avoid adding more. http://bugzilla.gnome.org/show_bug.cgi?id=586309 --- src/core/window.c | 153 ++++++++++++++++++++++++++-------------------- 1 file changed, 86 insertions(+), 67 deletions(-) diff --git a/src/core/window.c b/src/core/window.c index 3027b2bce..585adc2fd 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -2307,6 +2307,75 @@ window_would_be_covered (const MetaWindow *newbie) return FALSE; /* none found */ } +static gboolean +map_frame (MetaWindow *window) +{ + if (window->frame && !window->frame->mapped) + { + meta_topic (META_DEBUG_WINDOW_STATE, + "Frame actually needs map\n"); + window->frame->mapped = TRUE; + meta_ui_map_frame (window->screen->ui, window->frame->xwindow); + return TRUE; + } + else + return FALSE; +} + +static gboolean +unmap_frame (MetaWindow *window) +{ + if (window->frame && window->frame->mapped) + { + meta_topic (META_DEBUG_WINDOW_STATE, "Frame actually needs unmap\n"); + window->frame->mapped = FALSE; + meta_ui_unmap_frame (window->screen->ui, window->frame->xwindow); + return TRUE; + } + else + return FALSE; +} + +static gboolean +map_client_window (MetaWindow *window) +{ + if (!window->mapped) + { + meta_topic (META_DEBUG_WINDOW_STATE, + "%s actually needs map\n", window->desc); + window->mapped = TRUE; + meta_error_trap_push (window->display); + XMapWindow (window->display->xdisplay, window->xwindow); + meta_error_trap_pop (window->display, FALSE); + return TRUE; + } + else + return FALSE; +} + +static gboolean +unmap_client_window (MetaWindow *window, + const char *reason) +{ + if (window->mapped) + { + meta_topic (META_DEBUG_WINDOW_STATE, + "%s actually needs unmap%s\n", + window->desc, reason); + meta_topic (META_DEBUG_WINDOW_STATE, + "Incrementing unmaps_pending on %s%s\n", + window->desc, reason); + window->mapped = FALSE; + window->unmaps_pending += 1; + meta_error_trap_push (window->display); + XUnmapWindow (window->display->xdisplay, window->xwindow); + meta_error_trap_pop (window->display, FALSE); + return TRUE; + } + else + return FALSE; +} + /* XXX META_EFFECT_*_MAP */ void meta_window_show (MetaWindow *window) @@ -2456,30 +2525,12 @@ meta_window_show (MetaWindow *window) /* Shaded means the frame is mapped but the window is not */ - if (window->frame && !window->frame->mapped) - { - meta_topic (META_DEBUG_WINDOW_STATE, - "Frame actually needs map\n"); - window->frame->mapped = TRUE; - meta_ui_map_frame (window->screen->ui, window->frame->xwindow); - did_show = TRUE; - } + if (map_frame (window)) + did_show = TRUE; if (window->shaded) { - if (window->mapped) - { - meta_topic (META_DEBUG_WINDOW_STATE, - "%s actually needs unmap (shaded)\n", window->desc); - meta_topic (META_DEBUG_WINDOW_STATE, - "Incrementing unmaps_pending on %s for shade\n", - window->desc); - window->mapped = FALSE; - window->unmaps_pending += 1; - meta_error_trap_push (window->display); - XUnmapWindow (window->display->xdisplay, window->xwindow); - meta_error_trap_pop (window->display, FALSE); - } + unmap_client_window (window, " (shading)"); if (!window->iconic) { @@ -2489,16 +2540,8 @@ meta_window_show (MetaWindow *window) } else { - if (!window->mapped) - { - meta_topic (META_DEBUG_WINDOW_STATE, - "%s actually needs map\n", window->desc); - window->mapped = TRUE; - meta_error_trap_push (window->display); - XMapWindow (window->display->xdisplay, window->xwindow); - meta_error_trap_pop (window->display, FALSE); - did_show = TRUE; - } + if (map_client_window (window)) + did_show = TRUE; if (meta_prefs_get_live_hidden_windows ()) { @@ -2607,20 +2650,11 @@ meta_window_hide (MetaWindow *window) if (window->hidden) return; - if (!window->mapped) - { - Window top_level_window; - meta_topic (META_DEBUG_WINDOW_STATE, - "%s actually needs map\n", window->desc); - window->mapped = TRUE; - meta_error_trap_push (window->display); - if (window->frame) - top_level_window = window->frame->xwindow; - else - top_level_window = window->xwindow; - XMapWindow (window->display->xdisplay, top_level_window); - meta_error_trap_pop (window->display, FALSE); - } + /* If this is the first time that we've calculating the showing + * state of the window, the frame and client window might not + * yet be mapped, so we need to map them now */ + map_frame (window); + map_client_window (window); meta_stack_freeze (window->screen->stack); window->hidden = TRUE; @@ -2641,28 +2675,13 @@ meta_window_hide (MetaWindow *window) meta_compositor_unmap_window (window->display->compositor, window); - if (window->frame && window->frame->mapped) - { - meta_topic (META_DEBUG_WINDOW_STATE, "Frame actually needs unmap\n"); - window->frame->mapped = FALSE; - meta_ui_unmap_frame (window->screen->ui, window->frame->xwindow); - did_hide = TRUE; - } - - if (window->mapped) - { - meta_topic (META_DEBUG_WINDOW_STATE, - "%s actually needs unmap\n", window->desc); - meta_topic (META_DEBUG_WINDOW_STATE, - "Incrementing unmaps_pending on %s for hide\n", - window->desc); - window->mapped = FALSE; - window->unmaps_pending += 1; - meta_error_trap_push (window->display); - XUnmapWindow (window->display->xdisplay, window->xwindow); - meta_error_trap_pop (window->display, FALSE); - did_hide = TRUE; - } + /* Unmapping the frame is enough to make the window disappear, + * but we need to hide the window itself so the client knows + * it has been hidden */ + if (unmap_frame (window)) + did_hide = TRUE; + if (unmap_client_window (window, " (hiding)")) + did_hide = TRUE; } if (!window->iconic)