[metacity] ui: always set the frame background to None



commit 78c283c646a69d86d0e708c39fed6dfa131663ab
Author: Giovanni Campagna <gcampagna src gnome org>
Date:   Thu Jul 31 17:41:39 2014 +0200

    ui: always set the frame background to None
    
    This way the xserver never paints the frame background, even if
    the client window is destroyed. This allows us to have clean
    destroy window animation.
    
    There is no problem with interactive resizing because applications
    are using the XSync protocol, so we're not painting unless the
    client has redrawn.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=734054

 src/core/frame.c |    9 ----
 src/include/ui.h |    7 ---
 src/ui/frames.c  |  112 ------------------------------------------------------
 src/ui/frames.h  |    7 ---
 src/ui/ui.c      |   29 ++++++--------
 5 files changed, 12 insertions(+), 152 deletions(-)
---
diff --git a/src/core/frame.c b/src/core/frame.c
index 99a43b9..cb9e2df 100644
--- a/src/core/frame.c
+++ b/src/core/frame.c
@@ -149,7 +149,6 @@ meta_window_ensure_frame (MetaWindow *window)
    * style and background.
    */
   meta_ui_update_frame_style (window->screen->ui, frame->xwindow);
-  meta_ui_reset_frame_bg (window->screen->ui, frame->xwindow);
 
   if (window->title)
     meta_ui_set_frame_title (window->screen->ui,
@@ -374,11 +373,6 @@ meta_frame_sync_to_window (MetaFrame *frame,
   /* set bg to none to avoid flicker */
   if (need_resize)
     {
-      meta_ui_unflicker_frame_bg (frame->window->screen->ui,
-                                  frame->xwindow,
-                                  frame->rect.width,
-                                  frame->rect.height);
-
       /* we need new shape if we're resized */
       frame->need_reapply_frame_shape = TRUE;
     }
@@ -400,9 +394,6 @@ meta_frame_sync_to_window (MetaFrame *frame,
 
   if (need_resize)
     {
-      meta_ui_reset_frame_bg (frame->window->screen->ui,
-                              frame->xwindow);
-
       /* If we're interactively resizing the frame, repaint
        * it immediately so we don't start to lag.
        */
diff --git a/src/include/ui.h b/src/include/ui.h
index fb8db68..8f1261c 100644
--- a/src/include/ui.h
+++ b/src/include/ui.h
@@ -88,13 +88,6 @@ void meta_ui_map_frame   (MetaUI *ui,
 void meta_ui_unmap_frame (MetaUI *ui,
                           Window  xwindow);
 
-void meta_ui_unflicker_frame_bg (MetaUI *ui,
-                                 Window  xwindow,
-                                 int     target_width,
-                                 int     target_height);
-void meta_ui_reset_frame_bg     (MetaUI *ui,
-                                 Window  xwindow);
-
 void meta_ui_apply_frame_shape  (MetaUI  *ui,
                                  Window   xwindow,
                                  int      new_window_width,
diff --git a/src/ui/frames.c b/src/ui/frames.c
index 74c9338..b26504c 100644
--- a/src/ui/frames.c
+++ b/src/ui/frames.c
@@ -71,9 +71,6 @@ static void meta_frames_paint (MetaFrames  *frames,
                                MetaUIFrame *frame,
                                cairo_t     *cr);
 
-static void meta_frames_set_window_background (MetaFrames   *frames,
-                                               MetaUIFrame  *frame);
-
 static void meta_frames_calc_geometry (MetaFrames        *frames,
                                        MetaUIFrame         *frame,
                                        MetaFrameGeometry *fgeom);
@@ -394,12 +391,6 @@ queue_recalc_func (gpointer key, gpointer value, gpointer data)
   frames = META_FRAMES (data);
   frame = value;
 
-  /* If a resize occurs it will cause a redraw, but the
-   * resize may not actually be needed so we always redraw
-   * in case of color change.
-   */
-  meta_frames_set_window_background (frames, frame);
-
   invalidate_whole_window (frames, frame);
   meta_core_queue_frame_resize (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
                                 frame->xwindow);
@@ -439,12 +430,6 @@ queue_draw_func (gpointer key, gpointer value, gpointer data)
   frames = META_FRAMES (data);
   frame = value;
 
-  /* If a resize occurs it will cause a redraw, but the
-   * resize may not actually be needed so we always redraw
-   * in case of color change.
-   */
-  meta_frames_set_window_background (frames, frame);
-
   invalidate_whole_window (frames, frame);
 }
 
@@ -685,11 +670,6 @@ meta_frames_manage_window (MetaFrames *frames,
   frame->shape_applied = FALSE;
   frame->prelit_control = META_FRAME_CONTROL_NONE;
 
-  /* Don't set the window background yet; we need frame->xwindow to be
-   * registered with its MetaWindow, which happens after this function
-   * and meta_ui_create_frame_window() return to meta_window_ensure_frame().
-   */
-
   meta_core_grab_buttons (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), frame->xwindow);
 
   g_hash_table_replace (frames->frames, &frame->xwindow, frame);
@@ -842,52 +822,6 @@ meta_frames_get_corner_radiuses (MetaFrames *frames,
                                      bottom_left, bottom_right);
 }
 
-void
-meta_frames_reset_bg (MetaFrames *frames,
-                      Window  xwindow)
-{
-  MetaUIFrame *frame;
-
-  frame = meta_frames_lookup_window (frames, xwindow);
-
-  meta_frames_set_window_background (frames, frame);
-}
-
-static void
-set_background_none (Display *xdisplay,
-                     Window   xwindow)
-{
-  XSetWindowAttributes attrs;
-
-  attrs.background_pixmap = None;
-  XChangeWindowAttributes (xdisplay, xwindow,
-                           CWBackPixmap, &attrs);
-}
-
-void
-meta_frames_unflicker_bg (MetaFrames *frames,
-                          Window      xwindow,
-                          int         target_width,
-                          int         target_height)
-{
-  MetaUIFrame *frame;
-
-  frame = meta_frames_lookup_window (frames, xwindow);
-  g_return_if_fail (frame != NULL);
-
-#if 0
-  pixmap = gdk_pixmap_new (frame->window,
-                           width, height,
-                           -1);
-
-  /* Oops, no way to get the background here */
-
-  meta_frames_paint_to_drawable (frames, frame, pixmap);
-#endif
-
-  set_background_none (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), frame->xwindow);
-}
-
 #ifdef HAVE_SHAPE
 static void
 apply_cairo_region_to_window (Display        *display,
@@ -2655,52 +2589,6 @@ meta_frames_paint (MetaFrames   *frames,
                          icon);
 }
 
-static void
-meta_frames_set_window_background (MetaFrames   *frames,
-                                   MetaUIFrame  *frame)
-{
-  MetaFrameFlags flags;
-  MetaFrameType type;
-  MetaFrameStyle *style;
-  gboolean frame_exists;
-
-  meta_core_get (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), frame->xwindow,
-                 META_CORE_WINDOW_HAS_FRAME, &frame_exists,
-                 META_CORE_GET_FRAME_FLAGS, &flags,
-                 META_CORE_GET_FRAME_TYPE, &type,
-                 META_CORE_GET_END);
-
-  if (frame_exists)
-    {
-      style = meta_theme_get_frame_style (meta_theme_get_current (),
-                                          type, flags);
-    }
-
-  if (frame_exists && style->window_background_color != NULL)
-    {
-      GdkRGBA color;
-      GdkVisual *visual;
-
-      meta_color_spec_render (style->window_background_color,
-                              frame->style,
-                              &color);
-
-      /* Set A in ARGB to window_background_alpha, if we have ARGB */
-
-      visual = gtk_widget_get_visual (GTK_WIDGET (frames));
-      if (gdk_visual_get_depth (visual) == 32) /* we have ARGB */
-        {
-          color.alpha = style->window_background_alpha / 255.0;
-        }
-
-      gdk_window_set_background_rgba (frame->window, &color);
-    }
-  else
-    {
-      gtk_style_context_set_background (frame->style, frame->window);
-    }
- }
-
 static gboolean
 meta_frames_enter_notify_event      (GtkWidget           *widget,
                                      GdkEventCrossing    *event)
diff --git a/src/ui/frames.h b/src/ui/frames.h
index ad6945a..4f8705e 100644
--- a/src/ui/frames.h
+++ b/src/ui/frames.h
@@ -136,13 +136,6 @@ void meta_frames_get_borders (MetaFrames *frames,
                               Window xwindow,
                               MetaFrameBorders *borders);
 
-void meta_frames_reset_bg     (MetaFrames *frames,
-                               Window      xwindow);
-void meta_frames_unflicker_bg (MetaFrames *frames,
-                               Window      xwindow,
-                               int         target_width,
-                               int         target_height);
-
 void meta_frames_apply_shapes (MetaFrames *frames,
                                Window      xwindow,
                                int         new_window_width,
diff --git a/src/ui/ui.c b/src/ui/ui.c
index 2cd8559..b2147e0 100644
--- a/src/ui/ui.c
+++ b/src/ui/ui.c
@@ -324,6 +324,17 @@ meta_ui_get_corner_radiuses (MetaUI *ui,
                                    bottom_left, bottom_right);
 }
 
+static void
+set_background_none (Display *xdisplay,
+                     Window   xwindow)
+{
+  XSetWindowAttributes attrs;
+
+  attrs.background_pixmap = None;
+  XChangeWindowAttributes (xdisplay, xwindow,
+                           CWBackPixmap, &attrs);
+}
+
 Window
 meta_ui_create_frame_window (MetaUI *ui,
                              Display *xdisplay,
@@ -383,6 +394,7 @@ meta_ui_create_frame_window (MetaUI *ui,
                    &attrs, attributes_mask);
 
   gdk_window_resize (window, width, height);
+  set_background_none (xdisplay, GDK_WINDOW_XID (window));
 
   meta_frames_manage_window (ui->frames, GDK_WINDOW_XID (window), window);
 
@@ -436,16 +448,6 @@ meta_ui_unmap_frame (MetaUI *ui,
 }
 
 void
-meta_ui_unflicker_frame_bg (MetaUI *ui,
-                            Window  xwindow,
-                            int     target_width,
-                            int     target_height)
-{
-  meta_frames_unflicker_bg (ui->frames, xwindow,
-                            target_width, target_height);
-}
-
-void
 meta_ui_update_frame_style (MetaUI *ui,
                             Window  xwindow)
 {
@@ -460,13 +462,6 @@ meta_ui_repaint_frame (MetaUI *ui,
 }
 
 void
-meta_ui_reset_frame_bg (MetaUI *ui,
-                        Window xwindow)
-{
-  meta_frames_reset_bg (ui->frames, xwindow);
-}
-
-void
 meta_ui_apply_frame_shape  (MetaUI  *ui,
                             Window   xwindow,
                             int      new_window_width,


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