[mutter/wip/surface-content: 3/13] Always map the client and frame windows



commit c116d9272b4f6ceb329024333815f062c008afca
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Tue Jan 21 15:51:46 2014 -0500

    Always map the client and frame windows
    
    Traditionally, WMs unmap windows when minimizing them, and map them
    when restoring them or wanting to show them for other reasons, like
    upon creation.
    
    However, as metacity morphed into mutter, we optionally chose to keep
    windows mapped for the lifetime of the window under the user option
    "live-window-previews", which makes the code keep windows mapped so it
    can show window preview for minimized windows in other places, like
    Alt-Tab and Expose.
    
    I removed this preference two years ago mechanically, by removing all
    the if statements, but never went through and cleaned up the code so
    that windows are simply mapped for the lifetime of the window -- the
    "architecture" of the old code that maps and unmaps on show/hide was
    still there.
    
    Remove this now.
    
    The one case we still need to be careful of is shaded windows, in which
    we do still unmap the client window. Theoretically, we might want to
    show previews of shaded windows in the overview and Alt-Tab, so we remove
    the complex unmap tracking for this later.

 src/compositor/meta-window-actor.c |    7 +-
 src/core/display.c                 |    2 +-
 src/core/frame.c                   |    3 +-
 src/core/frame.h                   |    1 -
 src/core/window.c                  |  200 +++++++++---------------------------
 src/meta/window.h                  |    2 -
 6 files changed, 56 insertions(+), 159 deletions(-)
---
diff --git a/src/compositor/meta-window-actor.c b/src/compositor/meta-window-actor.c
index e7a9220..8fcb7ea 100644
--- a/src/compositor/meta-window-actor.c
+++ b/src/compositor/meta-window-actor.c
@@ -1206,7 +1206,7 @@ meta_window_actor_after_effects (MetaWindowActor *self)
 
   if (!meta_is_wayland_compositor ())
     {
-      if (!meta_window_is_mapped (priv->window))
+      if (!priv->mapped)
         meta_window_actor_detach_x11_pixmap (self);
 
       if (priv->needs_pixmap)
@@ -1629,7 +1629,10 @@ meta_window_actor_new (MetaWindow *window)
                        NULL);
 
   priv = self->priv;
-  priv->mapped = meta_window_toplevel_is_mapped (priv->window);
+
+  /* We know that when the compositor first adds our window, it will
+   * be before the toplevel window is mapped. */
+  priv->mapped = FALSE;
 
   if (!meta_is_wayland_compositor ())
     {
diff --git a/src/core/display.c b/src/core/display.c
index 8a98cf5..a11836c 100644
--- a/src/core/display.c
+++ b/src/core/display.c
@@ -2777,7 +2777,7 @@ handle_other_xevent (MetaDisplay *display,
 
           if (display->grab_op != META_GRAB_OP_NONE &&
               display->grab_window == window &&
-              ((window->frame == NULL) || !window->frame->mapped))
+              window->frame == NULL)
             meta_display_end_grab_op (display, timestamp);
 
           if (!frame_was_receiver)
diff --git a/src/core/frame.c b/src/core/frame.c
index 5fa7bee..e54e862 100644
--- a/src/core/frame.c
+++ b/src/core/frame.c
@@ -62,7 +62,6 @@ meta_window_ensure_frame (MetaWindow *window)
   frame->right_width = 0;
   frame->current_cursor = 0;
 
-  frame->mapped = FALSE;
   frame->is_flashing = FALSE;
   frame->borders_cached = FALSE;
   
@@ -157,6 +156,8 @@ meta_window_ensure_frame (MetaWindow *window)
 
   /* Move keybindings to frame instead of window */
   meta_window_grab_keys (window);
+
+  meta_ui_map_frame (frame->window->screen->ui, frame->xwindow);
 }
 
 void
diff --git a/src/core/frame.h b/src/core/frame.h
index 0f1ebea..8ac1c26 100644
--- a/src/core/frame.h
+++ b/src/core/frame.h
@@ -47,7 +47,6 @@ struct _MetaFrame
   int right_width;
   int bottom_height;
 
-  guint mapped : 1;
   guint need_reapply_frame_shape : 1;
   guint is_flashing : 1; /* used by the visual bell flash */
   guint borders_cached : 1;
diff --git a/src/core/window.c b/src/core/window.c
index b4a845d..0ac94fa 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -792,6 +792,41 @@ meta_window_should_attach_to_parent (MetaWindow *window)
     }
 }
 
+static gboolean
+client_window_should_be_mapped (MetaWindow *window)
+{
+  return !window->shaded;
+}
+
+static void
+sync_client_window_mapped (MetaWindow *window)
+{
+  gboolean should_be_mapped = client_window_should_be_mapped (window);
+
+  if (window->mapped == should_be_mapped)
+    return;
+
+  window->mapped = should_be_mapped;
+
+  meta_error_trap_push (window->display);
+  if (should_be_mapped)
+    {
+      XMapWindow (window->display->xdisplay, window->xwindow);
+
+      if (window->display->compositor)
+        meta_compositor_window_mapped (window->display->compositor, window);
+    }
+  else
+    {
+      XUnmapWindow (window->display->xdisplay, window->xwindow);
+      window->unmaps_pending ++;
+
+      if (window->display->compositor)
+        meta_compositor_window_unmapped (window->display->compositor, window);
+    }
+  meta_error_trap_pop (window->display);
+}
+
 static MetaWindow*
 meta_window_new_shared (MetaDisplay         *display,
                         MetaScreen          *screen,
@@ -1303,6 +1338,8 @@ meta_window_new_shared (MetaDisplay         *display,
   /* disable show desktop mode unless we're a desktop component */
   maybe_leave_show_desktop_mode (window);
 
+  sync_client_window_mapped (window);
+
   meta_window_queue (window, META_QUEUE_CALC_SHOWING);
   /* See bug 303284; a transient of the given window can already exist, in which
    * case we think it should probably be shown.
@@ -2346,6 +2383,8 @@ implement_showing (MetaWindow *window,
   meta_verbose ("Implement showing = %d for window %s\n",
                 showing, window->desc);
 
+  sync_client_window_mapped (window);
+
   if (!showing)
     {
       /* When we manage a new window, we normally delay placing it
@@ -2934,94 +2973,6 @@ 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
-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);
-
-      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);
-
-      return TRUE;
-    }
-  else
-    return FALSE;
-}
-
-/**
- * meta_window_is_mapped:
- * @window: a #MetaWindow
- *
- * Determines whether the X window for the MetaWindow is mapped.
- */
-gboolean
-meta_window_is_mapped (MetaWindow  *window)
-{
-  return window->mapped;
-}
-
-/**
- * meta_window_toplevel_is_mapped:
- * @window: a #MetaWindow
- *
- * Determines whether the toplevel X window for the MetaWindow is
- * mapped. (The frame window is mapped even without the client window
- * when a window is shaded.)
- *
- * Return Value: %TRUE if the toplevel is mapped.
- */
-gboolean
-meta_window_toplevel_is_mapped (MetaWindow *window)
-{
-  /* The frame is mapped but not the client window when the window
-   * is shaded.
-   */
-  return window->mapped || (window->frame && window->frame->mapped);
-}
-
 static void
 meta_window_force_placement (MetaWindow *window)
 {
@@ -3060,16 +3011,12 @@ meta_window_show (MetaWindow *window)
   gboolean place_on_top_on_map;
   gboolean needs_stacking_adjustment;
   MetaWindow *focus_window;
-  gboolean toplevel_was_mapped;
-  gboolean toplevel_now_mapped;
   gboolean notify_demands_attention = FALSE;
 
   meta_topic (META_DEBUG_WINDOW_STATE,
               "Showing window %s, shaded: %d iconic: %d placed: %d\n",
               window->desc, window->shaded, window->iconic, window->placed);
 
-  toplevel_was_mapped = meta_window_toplevel_is_mapped (window);
-
   focus_window = window->display->focus_window;  /* May be NULL! */
   did_show = FALSE;
   window_state_on_map (window, &takes_focus_on_map, &place_on_top_on_map);
@@ -3196,46 +3143,18 @@ meta_window_show (MetaWindow *window)
         }
     }
 
-  /* Shaded means the frame is mapped but the window is not */
-
-  if (map_frame (window))
-    did_show = TRUE;
-
-  if (window->shaded)
+  if (window->hidden)
     {
-      unmap_client_window (window, " (shading)");
-
-      if (!window->iconic)
-        {
-          window->iconic = TRUE;
-          set_wm_state (window, IconicState);
-        }
-    }
-  else
-    {
-      if (map_client_window (window))
-        did_show = TRUE;
-
-      if (window->hidden)
-        {
-          meta_stack_freeze (window->screen->stack);
-          window->hidden = FALSE;
-          meta_stack_thaw (window->screen->stack);
-          did_show = TRUE;
-        }
-
-      if (window->iconic)
-        {
-          window->iconic = FALSE;
-          set_wm_state (window, NormalState);
-        }
+      meta_stack_freeze (window->screen->stack);
+      window->hidden = FALSE;
+      meta_stack_thaw (window->screen->stack);
+      did_show = TRUE;
     }
 
-  toplevel_now_mapped = meta_window_toplevel_is_mapped (window);
-  if (toplevel_now_mapped != toplevel_was_mapped)
+  if (window->iconic)
     {
-      if (window->display->compositor)
-        meta_compositor_window_mapped (window->display->compositor, window);
+      window->iconic = FALSE;
+      set_wm_state (window, NormalState);
     }
 
   if (!window->visible_to_compositor)
@@ -3327,14 +3246,10 @@ static void
 meta_window_hide (MetaWindow *window)
 {
   gboolean did_hide;
-  gboolean toplevel_was_mapped;
-  gboolean toplevel_now_mapped;
 
   meta_topic (META_DEBUG_WINDOW_STATE,
               "Hiding window %s\n", window->desc);
 
-  toplevel_was_mapped = meta_window_toplevel_is_mapped (window);
-
   if (window->visible_to_compositor)
     {
       window->visible_to_compositor = FALSE;
@@ -3362,12 +3277,6 @@ meta_window_hide (MetaWindow *window)
 
   did_hide = 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);
-
   if (!window->hidden)
     {
       meta_stack_freeze (window->screen->stack);
@@ -3383,19 +3292,6 @@ meta_window_hide (MetaWindow *window)
       set_wm_state (window, IconicState);
     }
 
-  toplevel_now_mapped = meta_window_toplevel_is_mapped (window);
-  if (toplevel_now_mapped != toplevel_was_mapped)
-    {
-      if (window->display->compositor)
-        {
-          /* As above, we may be *mapping* live hidden windows */
-          if (toplevel_now_mapped)
-            meta_compositor_window_mapped (window->display->compositor, window);
-          else
-            meta_compositor_window_unmapped (window->display->compositor, window);
-        }
-    }
-
   set_net_wm_state (window);
 
   if (did_hide && window->struts)
@@ -8217,7 +8113,7 @@ redraw_icon (MetaWindow *window)
   /* We could probably be smart and just redraw the icon here,
    * instead of the whole frame.
    */
-  if (window->frame && (window->mapped || window->frame->mapped))
+  if (window->frame)
     meta_ui_queue_frame_draw (window->screen->ui, window->frame->xwindow);
 }
 
diff --git a/src/meta/window.h b/src/meta/window.h
index ff2d037..430dc6b 100644
--- a/src/meta/window.h
+++ b/src/meta/window.h
@@ -189,8 +189,6 @@ gboolean          meta_window_requested_bypass_compositor (MetaWindow *window);
 gboolean          meta_window_requested_dont_bypass_compositor (MetaWindow *window);
 gint             *meta_window_get_all_monitors (MetaWindow *window, gsize *length);
 
-gboolean meta_window_is_mapped (MetaWindow  *window);
-gboolean meta_window_toplevel_is_mapped (MetaWindow  *window);
 gboolean meta_window_get_icon_geometry (MetaWindow    *window,
                                         MetaRectangle *rect);
 void meta_window_set_icon_geometry (MetaWindow    *window,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]