[Xfce4-commits] <xfce4-session:nick/shutdown-cleanup> Improve fadeout code.
Nick Schermer
noreply at xfce.org
Sun Jan 15 10:22:03 CET 2012
Updating branch refs/heads/nick/shutdown-cleanup
to 9aa9090954e005c2eb9b199c950478184ae8d386 (commit)
from 36fd77a23750f6ff6014bfc4ef477c34321947cb (commit)
commit 9aa9090954e005c2eb9b199c950478184ae8d386
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