[Xfce4-commits] <xfce4-session:nick/shutdown-cleanup> Improve fadeout code.

Nick Schermer noreply at xfce.org
Mon Nov 28 21:44:15 CET 2011


Updating branch refs/heads/nick/shutdown-cleanup
         to a38cdcf91a569a8a120aceb8e418a9debc262ee2 (commit)
       from 574ce9ee7826fb3df6b9430d2be4055fd8ff3f07 (commit)

commit a38cdcf91a569a8a120aceb8e418a9debc262ee2
Author: Nick Schermer <nick at xfce.org>
Date:   Sun Nov 27 15:31:23 2011 +0100

    Improve fadeout code.
    
    Don't use some random color, but use black since it the easiest
    on the users' eyes. Also use rgba if compositing is enable, this
    is not only faster but looks nicer too, since everything behind
    the dialog continues to work.

 xfce4-session/xfsm-fadeout.c |  110 +++++++++++++++++++-----------------------
 1 files changed, 50 insertions(+), 60 deletions(-)

diff --git a/xfce4-session/xfsm-fadeout.c b/xfce4-session/xfsm-fadeout.c
index dbfaf95..9ee4691 100644
--- a/xfce4-session/xfsm-fadeout.c
+++ b/xfce4-session/xfsm-fadeout.c
@@ -29,24 +29,9 @@
 
 
 
-#define COLOR "#b6c4d7"
-
-
-
-typedef struct _FoScreen FoScreen;
-
-
-
-struct _FoScreen
-{
-  GdkWindow *window;
-  GdkPixmap *backbuf;
-};
-
 struct _XfsmFadeout
 {
-  GdkColor color;
-  GList   *screens;
+  GSList *windows;
 };
 
 
@@ -58,15 +43,17 @@ xfsm_fadeout_new (GdkDisplay *display)
   XfsmFadeout   *fadeout;
   GdkWindow     *root;
   GdkCursor     *cursor;
-  FoScreen      *screen;
   cairo_t       *cr;
-  GList         *lp;
   gint           width;
   gint           height;
   gint           n;
+  GdkPixbuf     *root_pixbuf;
+  GdkPixmap     *backbuf;
+  GdkScreen     *gdk_screen;
+  GdkWindow     *window;
+  GdkColor       black = { 0, };
 
-  fadeout = g_new0 (XfsmFadeout, 1);
-  gdk_color_parse (COLOR, &fadeout->color);
+  fadeout = g_slice_new0 (XfsmFadeout);
 
   cursor = gdk_cursor_new (GDK_WATCH);
 
@@ -80,39 +67,50 @@ xfsm_fadeout_new (GdkDisplay *display)
 
   for (n = 0; n < gdk_display_get_n_screens (display); ++n)
     {
-      GdkPixbuf *root_pixbuf;
+      gdk_screen = gdk_display_get_screen (display, n);
 
-      screen = g_new (FoScreen, 1);
-
-      root = gdk_screen_get_root_window (gdk_display_get_screen (display, n));
+      root = gdk_screen_get_root_window (gdk_screen);
       gdk_drawable_get_size (GDK_DRAWABLE (root), &width, &height);
 
-      screen->backbuf = gdk_pixmap_new (GDK_DRAWABLE (root), width, height, -1);
-
-      /* Copy the root window */
-      root_pixbuf = gdk_pixbuf_get_from_drawable (NULL, GDK_DRAWABLE (root), NULL,
-                                                  0, 0, 0, 0, width, height);
-      cr = gdk_cairo_create (GDK_DRAWABLE (screen->backbuf));
-      gdk_cairo_set_source_pixbuf (cr, root_pixbuf, 0, 0);
-      cairo_paint (cr);
-      gdk_cairo_set_source_color (cr, &fadeout->color);
-      cairo_paint_with_alpha (cr, 0.5);
-
       attr.width = width;
       attr.height = height;
-
-      screen->window = gdk_window_new (root, &attr, GDK_WA_X | GDK_WA_Y
-                                       | GDK_WA_NOREDIR | GDK_WA_CURSOR);
-      gdk_window_set_back_pixmap (screen->window, screen->backbuf, FALSE);
-
-      g_object_unref (root_pixbuf);
-      cairo_destroy (cr);
-
-      fadeout->screens = g_list_append (fadeout->screens, screen);
+      window = gdk_window_new (root, &attr, GDK_WA_X | GDK_WA_Y
+                               | GDK_WA_NOREDIR | GDK_WA_CURSOR);
+
+      if (gdk_screen_is_composited (gdk_screen)
+          && gdk_screen_get_rgba_colormap (gdk_screen) != NULL)
+        {
+          /* transparent black window */
+          gdk_window_set_background (window, &black);
+          gdk_window_set_opacity (window, 0.50);
+        }
+      else
+        {
+          /* create background for window */
+          backbuf = gdk_pixmap_new (GDK_DRAWABLE (root), width, height, -1);
+          cr = gdk_cairo_create (GDK_DRAWABLE (backbuf));
+
+          /* make of copy of the root window */
+          root_pixbuf = gdk_pixbuf_get_from_drawable (NULL, GDK_DRAWABLE (root), NULL,
+                                                      0, 0, 0, 0, width, height);
+          gdk_cairo_set_source_pixbuf (cr, root_pixbuf, 0, 0);
+          cairo_paint (cr);
+          g_object_unref (G_OBJECT (root_pixbuf));
+
+          /* draw black layer */
+          gdk_cairo_set_source_color (cr, &black);
+          cairo_paint_with_alpha (cr, 0.50);
+          cairo_destroy (cr);
+
+          gdk_window_set_back_pixmap (window, backbuf, FALSE);
+          g_object_unref (G_OBJECT (backbuf));
+        }
+
+      fadeout->windows = g_slist_prepend (fadeout->windows, window);
     }
 
-  for (lp = fadeout->screens; lp != NULL; lp = lp->next)
-    gdk_window_show (((FoScreen *) lp->data)->window);
+  /* show all windows all at once */
+  g_slist_foreach (fadeout->windows, (GFunc) gdk_window_show, NULL);
 
   gdk_cursor_unref (cursor);
 
@@ -120,21 +118,13 @@ xfsm_fadeout_new (GdkDisplay *display)
 }
 
 
+
 void
 xfsm_fadeout_destroy (XfsmFadeout *fadeout)
 {
-  FoScreen *screen;
-  GList    *lp;
-
-  for (lp = fadeout->screens; lp != NULL; lp = lp->next)
-    {
-      screen = lp->data;
-
-      gdk_window_destroy (screen->window);
-      g_object_unref (G_OBJECT (screen->backbuf));
-      g_free (screen);
-    }
-
-  g_list_free (fadeout->screens);
-  g_free (fadeout);
+  g_slist_foreach (fadeout->windows, (GFunc) gdk_window_hide, NULL);
+  g_slist_foreach (fadeout->windows, (GFunc) gdk_window_destroy, NULL);
+  
+  g_slist_free (fadeout->windows);
+  g_slice_free (XfsmFadeout, fadeout);
 }


More information about the Xfce4-commits mailing list