From 1a22712cc9a067bb47f2cf4a12261a847c63ff12 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Dec 04 2008 19:59:13 +0000 Subject: - Rebase fade-in patch to latest from upstream report --- diff --git a/gnome-desktop-2.25.1.1-fade.patch b/gnome-desktop-2.25.1.1-fade.patch index 973f1b2..6f8dea4 100644 --- a/gnome-desktop-2.25.1.1-fade.patch +++ b/gnome-desktop-2.25.1.1-fade.patch @@ -1,39 +1,28 @@ -diff -up gnome-desktop-2.25.1.1/libgnome-desktop/gnome-bg.c.fade gnome-desktop-2.25.1.1/libgnome-desktop/gnome-bg.c ---- gnome-desktop-2.25.1.1/libgnome-desktop/gnome-bg.c.fade 2008-11-05 07:51:36.000000000 -0500 -+++ gnome-desktop-2.25.1.1/libgnome-desktop/gnome-bg.c 2008-11-13 01:02:30.000000000 -0500 -@@ -38,10 +38,14 @@ Author: Soren Sandmann - #include - -+#include -+#include -+ - #include - - #define GNOME_DESKTOP_USE_UNSTABLE_API - #include -+#include - - #define BG_KEY_DRAW_BACKGROUND GNOME_BG_KEY_DIR "/draw_background" - #define BG_KEY_PRIMARY_COLOR GNOME_BG_KEY_DIR "/primary_color" -@@ -98,6 +102,7 @@ struct _GnomeBG +============================================================ + Emit "transitioned" not "changed" for new frames + + Previously, "changed" would get emitted when switching +backgrounds AND when switching slides in an animated +background. The two actions are conceptually different, +so this commit splits the signal into two signals. This +will allow us to add a cross fade effect when switching +backgrounds (and not add the cross fade effect when +switching slides that have their own transition effect) + +diff --git a/libgnome-desktop/gnome-bg.c b/libgnome-desktop/gnome-bg.c +--- a/libgnome-desktop/gnome-bg.c ++++ b/libgnome-desktop/gnome-bg.c +@@ -98,7 +98,8 @@ struct _GnomeBG GFileMonitor * file_monitor; guint changed_id; +- + guint transitioned_id; - ++ /* Cached information, only access through cache accessor functions */ SlideShow * slideshow; -@@ -106,6 +111,8 @@ struct _GnomeBG - int timeout_id; - - GList * file_cache; -+ -+ guint ignore_changes : 1; - }; - - struct _GnomeBGClass -@@ -115,6 +122,7 @@ struct _GnomeBGClass + time_t file_mtime; +@@ -115,6 +116,7 @@ struct _GnomeBGClass enum { CHANGED, @@ -41,18 +30,7 @@ diff -up gnome-desktop-2.25.1.1/libgnome-desktop/gnome-bg.c.fade gnome-desktop-2 N_SIGNALS }; -@@ -264,6 +272,10 @@ do_changed (GnomeBG *bg) - static void - queue_changed (GnomeBG *bg) - { -+ if (bg->ignore_changes) { -+ return; -+ } -+ - if (bg->changed_id > 0) { - g_source_remove (bg->changed_id); - } -@@ -275,6 +287,30 @@ queue_changed (GnomeBG *bg) +@@ -275,6 +277,30 @@ queue_changed (GnomeBG *bg) NULL); } @@ -83,7 +61,7 @@ diff -up gnome-desktop-2.25.1.1/libgnome-desktop/gnome-bg.c.fade gnome-desktop-2 void gnome_bg_load_from_preferences (GnomeBG *bg, GConfClient *client) -@@ -414,6 +450,14 @@ gnome_bg_class_init (GnomeBGClass *klass +@@ -419,6 +445,14 @@ gnome_bg_class_init (GnomeBGClass *klass) NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); @@ -98,105 +76,90 @@ diff -up gnome-desktop-2.25.1.1/libgnome-desktop/gnome-bg.c.fade gnome-desktop-2 } GnomeBG * -@@ -547,6 +591,13 @@ gnome_bg_set_filename (GnomeBG *bg, - } +@@ -1352,7 +1386,7 @@ on_timeout (gpointer data) + + bg->timeout_id = 0; + +- queue_changed (bg); ++ queue_transitioned (bg); + + return FALSE; } + +============================================================ + Use gdk functions to grab server and flush client + + It looks a little nicer this way. + +diff --git a/libgnome-desktop/gnome-bg.c b/libgnome-desktop/gnome-bg.c +--- a/libgnome-desktop/gnome-bg.c ++++ b/libgnome-desktop/gnome-bg.c +@@ -1056,7 +1056,7 @@ gnome_bg_create_thumbnail (GnomeBG *bg, -+void -+gnome_bg_ignore_changes (GnomeBG *bg, -+ gboolean should_ignore) -+{ -+ bg->ignore_changes = should_ignore; -+} + + /* Set the root pixmap, and properties pointing to it. We +- * do this atomically with XGrabServer to make sure that ++ * do this atomically with a server grab to make sure that + * we won't leak the pixmap if somebody else it setting + * it at the same time. (This assumes that they follow the + * same conventions we do) +@@ -1082,7 +1082,7 @@ gnome_bg_set_pixmap_as_root (GdkScreen *screen, GdkPixmap *pixmap) + data_esetroot = NULL; + display = GDK_DISPLAY_XDISPLAY (gdk_screen_get_display (screen)); + +- XGrabServer (display); ++ gdk_x11_display_grab (gdk_screen_get_display (screen)); + + result = XGetWindowProperty ( + display, RootWindow (display, screen_num), +@@ -1117,10 +1117,9 @@ gnome_bg_set_pixmap_as_root (GdkScreen *screen, GdkPixmap *pixmap) + XSetWindowBackgroundPixmap (display, RootWindow (display, screen_num), + pixmap_id); + XClearWindow (display, RootWindow (display, screen_num)); +- +- XUngrabServer (display); +- +- XFlush (display); + - static void - draw_color (GnomeBG *bg, GdkPixbuf *dest) - { -@@ -1015,15 +1066,75 @@ gnome_bg_create_thumbnail (GnomeBG - return result; ++ gdk_x11_display_ungrab (gdk_screen_get_display (screen)); ++ gdk_display_flush (gdk_screen_get_display (screen)); } -+GdkPixmap * -+gnome_bg_get_pixmap_from_root (GdkScreen *screen) -+{ -+ int result; -+ gint format; -+ gulong nitems; -+ gulong bytes_after; -+ guchar *data; -+ Atom type; -+ Display *display; -+ int screen_num; -+ GdkPixmap *pixmap; -+ -+ display = GDK_DISPLAY_XDISPLAY (gdk_screen_get_display (screen)); -+ screen_num = gdk_screen_get_number (screen); + +============================================================ + Move part of set_pixmap_as_root to set_root_pixmap_id + + The meatiest part of set_pixmap_as_root takes the passed +in pixmap and stores it on the root window in the +ESETROOT_PMAP_ID and _XROOTPMAP_ID properties. That +functionality stands on its own, and should be factored +out so it can get reused later when adding crossfade +transitions on background changes. + +diff --git a/libgnome-desktop/gnome-bg.c b/libgnome-desktop/gnome-bg.c +--- a/libgnome-desktop/gnome-bg.c ++++ b/libgnome-desktop/gnome-bg.c +@@ -1054,15 +1054,9 @@ gnome_bg_create_thumbnail (GnomeBG *bg, + return result; + } + +- -/* Set the root pixmap, and properties pointing to it. We -- * do this atomically with XGrabServer to make sure that +- * do this atomically with a server grab to make sure that - * we won't leak the pixmap if somebody else it setting - * it at the same time. (This assumes that they follow the - * same conventions we do) - */ -void -gnome_bg_set_pixmap_as_root (GdkScreen *screen, GdkPixmap *pixmap) -+ result = XGetWindowProperty (display, -+ RootWindow (display, screen_num), -+ gdk_x11_get_xatom_by_name ("_XROOTPMAP_ID"), -+ 0L, 1L, False, XA_PIXMAP, -+ &type, &format, &nitems, &bytes_after, -+ &data); -+ pixmap = NULL; -+ -+ if (data != NULL) { -+ if (result == Success && type == XA_PIXMAP && -+ format == 32 && nitems == 1) { -+ GdkPixmap *source_pixmap; -+ int width, height; -+ cairo_t *cr; -+ cairo_pattern_t *pattern; -+ -+ source_pixmap = gdk_pixmap_foreign_new (*(Pixmap *) data); -+ gdk_drawable_set_colormap (source_pixmap, gdk_screen_get_default_colormap (screen)); -+ -+ width = gdk_screen_get_width (screen); -+ height = gdk_screen_get_width (screen); -+ -+ pixmap = gdk_pixmap_new (source_pixmap != NULL? source_pixmap : -+ gdk_screen_get_root_window (screen), -+ width, height, -1); -+ -+ cr = gdk_cairo_create (pixmap); -+ if (source_pixmap != NULL) { -+ gdk_cairo_set_source_pixmap (cr, source_pixmap, 0, 0); -+ pattern = cairo_get_source (cr); -+ cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REPEAT); -+ } else { -+ cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); -+ } -+ cairo_paint (cr); -+ -+ if (cairo_status (cr) != CAIRO_STATUS_SUCCESS) { -+ g_object_unref (pixmap); -+ pixmap = NULL; -+ } -+ cairo_destroy (cr); -+ -+ g_object_unref (source_pixmap); -+ } -+ XFree (data); -+ } -+ -+ return pixmap; -+} -+ +static void +gnome_bg_set_root_pixmap_id (GdkScreen *screen, + GdkPixmap *pixmap) { int result; gint format; -@@ -1034,24 +1145,19 @@ gnome_bg_set_pixmap_as_root (GdkScreen * +@@ -1073,24 +1067,20 @@ gnome_bg_set_pixmap_as_root (GdkScreen *screen, GdkPixmap *pixmap) Atom type; Display *display; int screen_num; @@ -211,57 +174,54 @@ diff -up gnome-desktop-2.25.1.1/libgnome-desktop/gnome-bg.c.fade gnome-desktop-2 + display = GDK_DISPLAY_XDISPLAY (gdk_screen_get_display (screen)); - -- XGrabServer (display); +- gdk_x11_display_grab (gdk_screen_get_display (screen)); - -+ - result = XGetWindowProperty ( - display, RootWindow (display, screen_num), - gdk_x11_get_xatom_by_name ("ESETROOT_PMAP_ID"), - 0L, 1L, False, XA_PIXMAP, - &type, &format, &nitems, &bytes_after, - &data_esetroot); +- result = XGetWindowProperty ( +- display, RootWindow (display, screen_num), +- gdk_x11_get_xatom_by_name ("ESETROOT_PMAP_ID"), +- 0L, 1L, False, XA_PIXMAP, +- &type, &format, &nitems, &bytes_after, +- &data_esetroot); - + ++ result = XGetWindowProperty (display, ++ RootWindow (display, screen_num), ++ gdk_x11_get_xatom_by_name ("ESETROOT_PMAP_ID"), ++ 0L, 1L, False, XA_PIXMAP, ++ &type, &format, &nitems, ++ &bytes_after, ++ &data_esetroot); ++ if (data_esetroot != NULL) { if (result == Success && type == XA_PIXMAP && format == 32 && -@@ -1063,9 +1169,9 @@ gnome_bg_set_pixmap_as_root (GdkScreen * - } - XFree (data_esetroot); - } -- -+ - pixmap_id = GDK_WINDOW_XWINDOW (pixmap); -- -+ - XChangeProperty (display, RootWindow (display, screen_num), - gdk_x11_get_xatom_by_name ("ESETROOT_PMAP_ID"), - XA_PIXMAP, 32, PropModeReplace, -@@ -1074,14 +1180,72 @@ gnome_bg_set_pixmap_as_root (GdkScreen * +@@ -1113,9 +1103,33 @@ gnome_bg_set_pixmap_as_root (GdkScreen *screen, GdkPixmap *pixmap) gdk_x11_get_xatom_by_name ("_XROOTPMAP_ID"), XA_PIXMAP, 32, PropModeReplace, (guchar *) &pixmap_id, 1); +- +} + +/* Set the root pixmap, and properties pointing to it. We -+ * do this atomically with XGrabServer to make sure that ++ * do this atomically with a server grab to make sure that + * we won't leak the pixmap if somebody else it setting + * it at the same time. (This assumes that they follow the + * same conventions we do) + */ -+void ++void +gnome_bg_set_pixmap_as_root (GdkScreen *screen, GdkPixmap *pixmap) +{ + Display *display; + int screen_num; -+ ++ + g_return_if_fail (screen != NULL); + g_return_if_fail (pixmap != NULL); - ++ + screen_num = gdk_screen_get_number (screen); ++ + display = GDK_DISPLAY_XDISPLAY (gdk_screen_get_display (screen)); + -+ XGrabServer (display); ++ gdk_x11_display_grab (gdk_screen_get_display (screen)); + + gnome_bg_set_root_pixmap_id (screen, pixmap); + @@ -269,64 +229,33 @@ diff -up gnome-desktop-2.25.1.1/libgnome-desktop/gnome-bg.c.fade gnome-desktop-2 - pixmap_id); + GDK_PIXMAP_XID (pixmap)); XClearWindow (display, RootWindow (display, screen_num)); -- -- XUngrabServer (display); -- -+ - XFlush (display); -+ -+ XUngrabServer (display); -+} -+ -+GnomeBGCrossfade * -+gnome_bg_set_pixmap_as_root_with_crossfade (GdkScreen *screen, -+ GdkPixmap *pixmap, -+ GMainContext *context) -+{ -+ GdkDisplay *display; -+ GdkWindow *root_window; -+ GdkPixmap *old_pixmap; -+ int width, height; -+ GnomeBGCrossfade *fade; -+ -+ g_return_val_if_fail (screen != NULL, 0); -+ g_return_val_if_fail (pixmap != NULL, 0); -+ -+ root_window = gdk_screen_get_root_window (screen); -+ -+ width = gdk_screen_get_width (screen); -+ height = gdk_screen_get_height (screen); -+ -+ fade = gnome_bg_crossfade_new (width, height); -+ -+ display = gdk_screen_get_display (screen); -+ gdk_x11_display_grab (display); -+ old_pixmap = gnome_bg_get_pixmap_from_root (screen); -+ gnome_bg_set_root_pixmap_id (screen, pixmap); -+ gnome_bg_crossfade_set_start_pixmap (fade, old_pixmap); -+ gnome_bg_crossfade_set_end_pixmap (fade, pixmap); -+ gdk_display_flush (display); -+ gdk_x11_display_ungrab (display); -+ g_object_unref (old_pixmap); -+ gnome_bg_crossfade_start (fade, root_window, context); -+ -+ return fade; - } - - -@@ -1347,7 +1511,7 @@ on_timeout (gpointer data) - - bg->timeout_id = 0; - -- queue_changed (bg); -+ queue_transitioned (bg); - return FALSE; - } -diff -up /dev/null gnome-desktop-2.25.1.1/libgnome-desktop/gnome-bg-crossfade.c ---- /dev/null 2008-11-12 15:48:32.607088093 -0500 -+++ gnome-desktop-2.25.1.1/libgnome-desktop/gnome-bg-crossfade.c 2008-11-13 01:02:30.000000000 -0500 -@@ -0,0 +1,451 @@ + gdk_x11_display_ungrab (gdk_screen_get_display (screen)); + +============================================================ + Add Crossfade class + + This adds a helper class to manage doing crossfades on a window. +It will be leveraged by gnome_bg and nautilus to do a fade +transition when changing backgrounds on the desktop or in nautilus +windows. + +diff --git a/libgnome-desktop/Makefile.am b/libgnome-desktop/Makefile.am +--- a/libgnome-desktop/Makefile.am ++++ b/libgnome-desktop/Makefile.am +@@ -22,6 +22,7 @@ libgnome_desktop_2_la_SOURCES = \ + gnome-desktop-thumbnail.c \ + gnome-thumbnail-pixbuf-utils.c \ + gnome-bg.c \ ++ gnome-bg-crossfade.c \ + display-name.c \ + gnome-rr.c \ + gnome-rr-config.c \ +diff --git a/libgnome-desktop/gnome-bg-crossfade.c b/libgnome-desktop/gnome-bg-crossfade.c +new file mode 100644 +--- /dev/null ++++ b/libgnome-desktop/gnome-bg-crossfade.c +@@ -0,0 +1,541 @@ +/* gnome-bg-crossfade.h - fade window background between two pixmaps + * + * Copyright (C) 2008 Red Hat, Inc. @@ -359,28 +288,26 @@ diff -up /dev/null gnome-desktop-2.25.1.1/libgnome-desktop/gnome-bg-crossfade.c +#include +#include +#include ++#include + +#include +#include + -+#include -+ +#define GNOME_DESKTOP_USE_UNSTABLE_API +#include +#include "libgnomeui/gnome-bg-crossfade.h" + +struct _GnomeBGCrossfadePrivate +{ -+ GObject parent_instance; -+ GdkWindow *window; -+ int width; -+ int height; -+ GdkPixmap *fading_pixmap; -+ GdkPixmap *end_pixmap; -+ gdouble start_time; -+ gdouble total_duration; -+ guint timeout_id; -+ guint is_first_frame : 1; ++ GdkWindow *window; ++ int width; ++ int height; ++ GdkPixmap *fading_pixmap; ++ GdkPixmap *end_pixmap; ++ gdouble start_time; ++ gdouble total_duration; ++ guint timeout_id; ++ guint is_first_frame : 1; +}; + +enum { @@ -489,6 +416,12 @@ diff -up /dev/null gnome-desktop-2.25.1.1/libgnome-desktop/gnome-bg-crossfade.c + gobject_class->set_property = gnome_bg_crossfade_set_property; + gobject_class->finalize = gnome_bg_crossfade_finalize; + ++ /** ++ * GnomeBGCrossfade:width: ++ * ++ * When a crossfade is running, this is width of the fading ++ * pixmap. ++ */ + g_object_class_install_property (gobject_class, + PROP_WIDTH, + g_param_spec_int ("width", @@ -497,12 +430,28 @@ diff -up /dev/null gnome-desktop-2.25.1.1/libgnome-desktop/gnome-bg-crossfade.c + 0, G_MAXINT, 0, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE)); + ++ /** ++ * GnomeBGCrossfade:height: ++ * ++ * When a crossfade is running, this is height of the fading ++ * pixmap. ++ */ + g_object_class_install_property (gobject_class, + PROP_HEIGHT, + g_param_spec_int ("height", "Window Height", + "Height of window to fade on", + 0, G_MAXINT, 0, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE)); ++ ++ /** ++ * GnomeBGCrossfade::finished: ++ * @fade: the #GnomeBGCrossfade that received the signal ++ * @window: the #GdkWindow the crossfade happend on. ++ * ++ * When a crossfade finishes, @window will have a copy ++ * of the end pixmap as its background, and this signal will ++ * get emitted. ++ */ + signals[FINISHED] = g_signal_new ("finished", + G_OBJECT_CLASS_TYPE (gobject_class), + G_SIGNAL_RUN_LAST, 0, NULL, NULL, @@ -516,8 +465,22 @@ diff -up /dev/null gnome-desktop-2.25.1.1/libgnome-desktop/gnome-bg-crossfade.c +gnome_bg_crossfade_init (GnomeBGCrossfade *fade) +{ + fade->priv = GNOME_BG_CROSSFADE_GET_PRIVATE (fade); ++ ++ fade->priv->fading_pixmap = NULL; ++ fade->priv->end_pixmap = NULL; ++ fade->priv->timeout_id = 0; +} + ++/** ++ * gnome_bg_crossfade_new: ++ * @width: The width of the crossfading window ++ * @height: The height of the crossfading window ++ * ++ * Creates a new object to manage crossfading a ++ * window background between two #GdkPixmap drawables. ++ * ++ * Return value: the new #GnomeBGCrossfade ++ **/ +GnomeBGCrossfade * +gnome_bg_crossfade_new (int width, + int height) @@ -565,6 +528,18 @@ diff -up /dev/null gnome-desktop-2.25.1.1/libgnome-desktop/gnome-bg-crossfade.c + return copy; +} + ++/** ++ * gnome_bg_crossfade_set_start_pixmap: ++ * @fade: a #GnomeBGCrossfade ++ * @pixmap: The #GdkPixmap to fade from ++ * ++ * Before initiating a crossfade with gnome_bg_crossfade_start() ++ * a start and end pixmap have to be set. This function sets ++ * the pixmap shown at the beginning of the crossfade effect. ++ * ++ * Return value: %TRUE if successful, or %FALSE if the pixmap ++ * could not be copied. ++ **/ +gboolean +gnome_bg_crossfade_set_start_pixmap (GnomeBGCrossfade *fade, + GdkPixmap *pixmap) @@ -583,6 +558,18 @@ diff -up /dev/null gnome-desktop-2.25.1.1/libgnome-desktop/gnome-bg-crossfade.c + return fade->priv->fading_pixmap != NULL; +} + ++/** ++ * gnome_bg_crossfade_set_end_pixmap: ++ * @fade: a #GnomeBGCrossfade ++ * @pixmap: The #GdkPixmap to fade to ++ * ++ * Before initiating a crossfade with gnome_bg_crossfade_start() ++ * a start and end pixmap have to be set. This function sets ++ * the pixmap shown at the end of the crossfade effect. ++ * ++ * Return value: %TRUE if successful, or %FALSE if the pixmap ++ * could not be copied. ++ **/ +gboolean +gnome_bg_crossfade_set_end_pixmap (GnomeBGCrossfade *fade, + GdkPixmap *pixmap) @@ -604,9 +591,9 @@ diff -up /dev/null gnome-desktop-2.25.1.1/libgnome-desktop/gnome-bg-crossfade.c +static gdouble +get_current_time (void) +{ -+ const double microseconds_per_second = 1000000.0; -+ double timestamp; -+ GTimeVal now; ++ const double microseconds_per_second = (double) G_USEC_PER_SEC; ++ double timestamp; ++ GTimeVal now; + + g_get_current_time (&now); + @@ -623,9 +610,7 @@ diff -up /dev/null gnome-desktop-2.25.1.1/libgnome-desktop/gnome-bg-crossfade.c + GdkScreen *screen; + gboolean are_enabled; + -+ if (fade->priv->window == NULL) { -+ return FALSE; -+ } ++ g_assert (fade->priv->window != NULL); + + screen = gdk_drawable_get_screen (fade->priv->window); + @@ -666,7 +651,7 @@ diff -up /dev/null gnome-desktop-2.25.1.1/libgnome-desktop/gnome-bg-crossfade.c + percent_done = CLAMP (percent_done, 0.0, 1.0); + + /* If it's taking a long time to get to the first frame, -+ * then double the duration, so the user will get to see ++ * then lengthen the duration, so the user will get to see + * the effect. + */ + if (fade->priv->is_first_frame && percent_done > .33) { @@ -709,27 +694,38 @@ diff -up /dev/null gnome-desktop-2.25.1.1/libgnome-desktop/gnome-bg-crossfade.c +static void +on_finished (GnomeBGCrossfade *fade) +{ -+ if (fade->priv->end_pixmap != NULL) { -+ gdk_window_set_back_pixmap (fade->priv->window, -+ fade->priv->end_pixmap, -+ FALSE); -+ draw_background (fade); -+ } ++ g_assert (fade->priv->end_pixmap != NULL); + -+ if (fade->priv->fading_pixmap != NULL) { -+ g_object_unref (fade->priv->fading_pixmap); -+ fade->priv->fading_pixmap = NULL; -+ } ++ gdk_window_set_back_pixmap (fade->priv->window, ++ fade->priv->end_pixmap, ++ FALSE); ++ draw_background (fade); + -+ if (fade->priv->end_pixmap != NULL) { -+ g_object_unref (fade->priv->end_pixmap); -+ fade->priv->end_pixmap = NULL; -+ } ++ g_object_unref (fade->priv->end_pixmap); ++ fade->priv->end_pixmap = NULL; ++ ++ g_assert (fade->priv->fading_pixmap != NULL); ++ ++ g_object_unref (fade->priv->fading_pixmap); ++ fade->priv->fading_pixmap = NULL; + + fade->priv->timeout_id = 0; + g_signal_emit (fade, signals[FINISHED], 0, fade->priv->window); +} + ++/** ++ * gnome_bg_crossfade_start: ++ * @fade: a #GnomeBGCrossfade ++ * @window: The #GdkWindow to draw crossfade on ++ * @context: a #GMainContext to handle animation timeouts ++ * or %NULL for default context ++ * ++ * This function initiates a quick crossfade between two pixmaps on ++ * the background of @window. Before initiating the crossfade both ++ * gnome_bg_crossfade_start() and gnome_bg_crossfade_end() need to ++ * be called. If animations are disabled, the crossfade is skipped, ++ * and the window background is set immediately to the end pixmap. ++ **/ +void +gnome_bg_crossfade_start (GnomeBGCrossfade *fade, + GdkWindow *window, @@ -738,6 +734,7 @@ diff -up /dev/null gnome-desktop-2.25.1.1/libgnome-desktop/gnome-bg-crossfade.c + GSource *source; + + g_return_if_fail (GNOME_IS_BG_CROSSFADE (fade)); ++ g_return_if_fail (window != NULL); + g_return_if_fail (fade->priv->fading_pixmap != NULL); + g_return_if_fail (fade->priv->end_pixmap != NULL); + g_return_if_fail (!gnome_bg_crossfade_is_started (fade)); @@ -754,13 +751,24 @@ diff -up /dev/null gnome-desktop-2.25.1.1/libgnome-desktop/gnome-bg-crossfade.c + gdk_window_set_back_pixmap (fade->priv->window, + fade->priv->fading_pixmap, + FALSE); -+ draw_background (fade); ++ draw_background (fade); + + fade->priv->is_first_frame = TRUE; + fade->priv->total_duration = .75; + fade->priv->start_time = get_current_time (); +} + ++ ++/** ++ * gnome_bg_crossfade_is_started: ++ * @fade: a #GnomeBGCrossfade ++ * ++ * This function reveals whether or not @fade is currently ++ * running on a window. See gnome_bg_crossfade_start() for ++ * information on how to initiate a crossfade. ++ * ++ * Return value: %TRUE if fading, or %FALSE if not fading ++ **/ +gboolean +gnome_bg_crossfade_is_started (GnomeBGCrossfade *fade) +{ @@ -769,19 +777,42 @@ diff -up /dev/null gnome-desktop-2.25.1.1/libgnome-desktop/gnome-bg-crossfade.c + return fade->priv->timeout_id != 0; +} + ++/** ++ * gnome_bg_crossfade_stop: ++ * @fade: a #GnomeBGCrossfade ++ * ++ * This function stops any in progress crossfades that may be ++ * happening. It's harmless to call this function if @fade is ++ * already stopped. ++ **/ +void +gnome_bg_crossfade_stop (GnomeBGCrossfade *fade) +{ + g_return_if_fail (GNOME_IS_BG_CROSSFADE (fade)); + -+ if (fade->priv->timeout_id != 0) { -+ g_source_remove (fade->priv->timeout_id); -+ } ++ if (!gnome_bg_crossfade_is_started (fade)) ++ return; ++ ++ g_assert (fade->priv->timeout_id != 0); ++ g_source_remove (fade->priv->timeout_id); ++ fade->priv->timeout_id = 0; +} -diff -up /dev/null gnome-desktop-2.25.1.1/libgnome-desktop/libgnomeui/gnome-bg-crossfade.h ---- /dev/null 2008-11-12 15:48:32.607088093 -0500 -+++ gnome-desktop-2.25.1.1/libgnome-desktop/libgnomeui/gnome-bg-crossfade.h 2008-11-13 01:02:30.000000000 -0500 -@@ -0,0 +1,76 @@ +diff --git a/libgnome-desktop/libgnomeui/Makefile.am b/libgnome-desktop/libgnomeui/Makefile.am +--- a/libgnome-desktop/libgnomeui/Makefile.am ++++ b/libgnome-desktop/libgnomeui/Makefile.am +@@ -1,6 +1,7 @@ + libgnomeui_desktopdir = $(includedir)/gnome-desktop-2.0/libgnomeui + libgnomeui_desktop_HEADERS = \ + gnome-bg.h \ ++ gnome-bg-crossfade.h \ + gnome-desktop-thumbnail.h \ + gnome-rr.h \ + gnome-rr-config.h \ +diff --git a/libgnome-desktop/libgnomeui/gnome-bg-crossfade.h b/libgnome-desktop/libgnomeui/gnome-bg-crossfade.h +new file mode 100644 +--- /dev/null ++++ b/libgnome-desktop/libgnomeui/gnome-bg-crossfade.h +@@ -0,0 +1,75 @@ +/* gnome-bg-crossfade.h - fade window background between two pixmaps + + Copyright 2008, Red Hat, Inc. @@ -792,12 +823,12 @@ diff -up /dev/null gnome-desktop-2.25.1.1/libgnome-desktop/libgnomeui/gnome-bg-c + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. -+ ++ + The Gnome Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. -+ ++ + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, @@ -813,7 +844,6 @@ diff -up /dev/null gnome-desktop-2.25.1.1/libgnome-desktop/libgnomeui/gnome-bg-c +#error GnomeBGCrossfade is unstable API. You must define GNOME_DESKTOP_USE_UNSTABLE_API before including gnome-bg-crossfade.h +#endif + -+ +#include + +G_BEGIN_DECLS @@ -858,27 +888,227 @@ diff -up /dev/null gnome-desktop-2.25.1.1/libgnome-desktop/libgnomeui/gnome-bg-c +G_END_DECLS + +#endif -diff -up gnome-desktop-2.25.1.1/libgnome-desktop/libgnomeui/gnome-bg.h.fade gnome-desktop-2.25.1.1/libgnome-desktop/libgnomeui/gnome-bg.h ---- gnome-desktop-2.25.1.1/libgnome-desktop/libgnomeui/gnome-bg.h.fade 2008-11-05 07:51:36.000000000 -0500 -+++ gnome-desktop-2.25.1.1/libgnome-desktop/libgnomeui/gnome-bg.h 2008-11-13 01:02:30.000000000 -0500 -@@ -31,6 +31,7 @@ + +============================================================ + Add docstring for gnome_bg_set_pixmap_as_root + + I'm going to be adding a parallel api that references +this function in the docs, so we should document this +one as well. + +diff --git a/libgnome-desktop/gnome-bg.c b/libgnome-desktop/gnome-bg.c +--- a/libgnome-desktop/gnome-bg.c ++++ b/libgnome-desktop/gnome-bg.c +@@ -1105,12 +1105,18 @@ gnome_bg_set_root_pixmap_id (GdkScreen *screen, + (guchar *) &pixmap_id, 1); + } - #include +-/* Set the root pixmap, and properties pointing to it. We ++/** ++ * gnome_bg_set_pixmap_as_root: ++ * @screen: the #GdkScreen to change root background on ++ * @pixmap: the #GdkPixmap to set root background from ++ * ++ * Set the root pixmap, and properties pointing to it. We + * do this atomically with a server grab to make sure that + * we won't leak the pixmap if somebody else it setting + * it at the same time. (This assumes that they follow the +- * same conventions we do) +- */ ++ * same conventions we do). @pixmap should come from a call ++ * to gnome_bg_create_pixmap(). ++ **/ + void + gnome_bg_set_pixmap_as_root (GdkScreen *screen, GdkPixmap *pixmap) + { + +============================================================ + Add gnome_bg_set_pixmap_as_root_with_crossfade + + This implements a crossfade transition when switching +backgrounds. To actually get the fade, though, requires +changes to gnome-settings-daemon to use this function +instead of gnome_bg_set_pixmap_as_root. + +We also expose gnome_bg_get_pixmap_from_root which will +be useful for eel when it gets changed to do fading. + +diff --git a/libgnome-desktop/gnome-bg.c b/libgnome-desktop/gnome-bg.c +--- a/libgnome-desktop/gnome-bg.c ++++ b/libgnome-desktop/gnome-bg.c +@@ -38,10 +38,13 @@ Author: Soren Sandmann + #include + #include + ++#include ++ #include + + #define GNOME_DESKTOP_USE_UNSTABLE_API + #include +#include + + #define BG_KEY_DRAW_BACKGROUND GNOME_BG_KEY_DIR "/draw_background" + #define BG_KEY_PRIMARY_COLOR GNOME_BG_KEY_DIR "/primary_color" +@@ -1054,6 +1057,91 @@ gnome_bg_create_thumbnail (GnomeBG *bg, + return result; + } + ++/** ++ * gnome_bg_get_pixmap_from_root: ++ * @screen: a #GdkScreen ++ * ++ * This function queries the _XROOTPMAP_ID property from ++ * the root window associated with @screen to determine ++ * the current root window background pixmap and returns ++ * a copy of it. If the _XROOTPMAP_ID is not set, then ++ * a black pixmap is returned. ++ * ++ * Return value: a #GdkPixmap if successful or %NULL ++ **/ ++GdkPixmap * ++gnome_bg_get_pixmap_from_root (GdkScreen *screen) ++{ ++ int result; ++ gint format; ++ gulong nitems; ++ gulong bytes_after; ++ guchar *data; ++ Atom type; ++ Display *display; ++ int screen_num; ++ GdkPixmap *pixmap; ++ GdkPixmap *source_pixmap; ++ int width, height; ++ cairo_t *cr; ++ cairo_pattern_t *pattern; ++ ++ display = GDK_DISPLAY_XDISPLAY (gdk_screen_get_display (screen)); ++ screen_num = gdk_screen_get_number (screen); ++ ++ result = XGetWindowProperty (display, ++ RootWindow (display, screen_num), ++ gdk_x11_get_xatom_by_name ("_XROOTPMAP_ID"), ++ 0L, 1L, False, XA_PIXMAP, ++ &type, &format, &nitems, &bytes_after, ++ &data); ++ pixmap = NULL; ++ source_pixmap = NULL; ++ ++ if (result != Success || type != XA_PIXMAP || ++ format != 32 || nitems != 1) { ++ XFree (data); ++ data = NULL; ++ } ++ ++ if (data != NULL) { ++ source_pixmap = gdk_pixmap_foreign_new (*(Pixmap *) data); ++ gdk_drawable_set_colormap (source_pixmap, ++ gdk_screen_get_default_colormap (screen)); ++ } ++ ++ width = gdk_screen_get_width (screen); ++ height = gdk_screen_get_width (screen); ++ ++ pixmap = gdk_pixmap_new (source_pixmap != NULL? source_pixmap : ++ gdk_screen_get_root_window (screen), ++ width, height, -1); ++ ++ cr = gdk_cairo_create (pixmap); ++ if (source_pixmap != NULL) { ++ gdk_cairo_set_source_pixmap (cr, source_pixmap, 0, 0); ++ pattern = cairo_get_source (cr); ++ cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REPEAT); ++ } else { ++ cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); ++ } ++ cairo_paint (cr); ++ ++ if (cairo_status (cr) != CAIRO_STATUS_SUCCESS) { ++ g_object_unref (pixmap); ++ pixmap = NULL; ++ } ++ cairo_destroy (cr); ++ ++ if (source_pixmap != NULL) ++ g_object_unref (source_pixmap); ++ ++ if (data != NULL) ++ XFree (data); ++ ++ return pixmap; ++} ++ + static void + gnome_bg_set_root_pixmap_id (GdkScreen *screen, + GdkPixmap *pixmap) +@@ -1142,6 +1230,54 @@ gnome_bg_set_pixmap_as_root (GdkScreen *screen, GdkPixmap *pixmap) + gdk_display_flush (gdk_screen_get_display (screen)); + } + ++/** ++ * gnome_bg_set_pixmap_as_root_with_crossfade: ++ * @screen: the #GdkScreen to change root background on ++ * @pixmap: the #GdkPixmap to set root background from ++ * @context: a #GMainContext or %NULL ++ * ++ * Set the root pixmap, and properties pointing to it. ++ * This function differs from gnome_bg_set_pixmap_as_root() ++ * in that it adds a subtle crossfade animation from the ++ * current root pixmap to the new one. ++ * same conventions we do). ++ * ++ * Return value: a #GnomeBGCrossfade object ++ **/ ++GnomeBGCrossfade * ++gnome_bg_set_pixmap_as_root_with_crossfade (GdkScreen *screen, ++ GdkPixmap *pixmap, ++ GMainContext *context) ++{ ++ GdkDisplay *display; ++ GdkWindow *root_window; ++ GdkPixmap *old_pixmap; ++ int width, height; ++ GnomeBGCrossfade *fade; ++ ++ g_return_val_if_fail (screen != NULL, NULL); ++ g_return_val_if_fail (pixmap != NULL, NULL); ++ ++ root_window = gdk_screen_get_root_window (screen); ++ ++ width = gdk_screen_get_width (screen); ++ height = gdk_screen_get_height (screen); ++ ++ fade = gnome_bg_crossfade_new (width, height); ++ ++ display = gdk_screen_get_display (screen); ++ gdk_x11_display_grab (display); ++ old_pixmap = gnome_bg_get_pixmap_from_root (screen); ++ gnome_bg_set_root_pixmap_id (screen, pixmap); ++ gnome_bg_crossfade_set_start_pixmap (fade, old_pixmap); ++ gnome_bg_crossfade_set_end_pixmap (fade, pixmap); ++ gdk_display_flush (display); ++ gdk_x11_display_ungrab (display); ++ ++ gnome_bg_crossfade_start (fade, root_window, context); ++ ++ return fade; ++} + + /* Implementation of the pixbuf cache */ + struct _SlideShow +diff --git a/libgnome-desktop/libgnomeui/gnome-bg.h b/libgnome-desktop/libgnomeui/gnome-bg.h +--- a/libgnome-desktop/libgnomeui/gnome-bg.h ++++ b/libgnome-desktop/libgnomeui/gnome-bg.h +@@ -32,6 +32,7 @@ + #include + #include #include ++#include G_BEGIN_DECLS -@@ -63,6 +64,8 @@ typedef enum { - GType gnome_bg_get_type (void); - GnomeBG * gnome_bg_new (void); -+void gnome_bg_ignore_changes (GnomeBG *bg, -+ gboolean should_ignore); - void gnome_bg_load_from_preferences (GnomeBG *bg, - GConfClient *client); - void gnome_bg_save_to_preferences (GnomeBG *bg, -@@ -109,6 +112,10 @@ gboolean gnome_bg_changes_with_s +@@ -109,6 +110,10 @@ gboolean gnome_bg_changes_with_size (GnomeBG *bg); void gnome_bg_set_pixmap_as_root (GdkScreen *screen, GdkPixmap *pixmap); @@ -889,25 +1119,59 @@ diff -up gnome-desktop-2.25.1.1/libgnome-desktop/libgnomeui/gnome-bg.h.fade gnom G_END_DECLS -diff -up gnome-desktop-2.25.1.1/libgnome-desktop/libgnomeui/Makefile.am.fade gnome-desktop-2.25.1.1/libgnome-desktop/libgnomeui/Makefile.am ---- gnome-desktop-2.25.1.1/libgnome-desktop/libgnomeui/Makefile.am.fade 2008-11-13 02:21:06.000000000 -0500 -+++ gnome-desktop-2.25.1.1/libgnome-desktop/libgnomeui/Makefile.am 2008-11-13 02:21:18.000000000 -0500 -@@ -1,6 +1,7 @@ - libgnomeui_desktopdir = $(includedir)/gnome-desktop-2.0/libgnomeui - libgnomeui_desktop_HEADERS = \ - gnome-bg.h \ -+ gnome-bg-crossfade.h \ - gnome-desktop-thumbnail.h \ - gnome-rr.h \ - gnome-rr-config.h \ -diff -up gnome-desktop-2.25.1.1/libgnome-desktop/Makefile.am.fade gnome-desktop-2.25.1.1/libgnome-desktop/Makefile.am ---- gnome-desktop-2.25.1.1/libgnome-desktop/Makefile.am.fade 2008-11-05 07:51:36.000000000 -0500 -+++ gnome-desktop-2.25.1.1/libgnome-desktop/Makefile.am 2008-11-13 01:02:30.000000000 -0500 -@@ -22,6 +22,7 @@ libgnome_desktop_2_la_SOURCES = \ - gnome-desktop-thumbnail.c \ - gnome-thumbnail-pixbuf-utils.c \ - gnome-bg.c \ -+ gnome-bg-crossfade.c \ - display-name.c \ - gnome-rr.c \ - gnome-rr-config.c \ + +============================================================ + add new gnome_bg_ignore_changes api + + This will prevent the "changed" signal from getting +emitted before gnome-settings-daemon is ready for it. + +diff --git a/libgnome-desktop/gnome-bg.c b/libgnome-desktop/gnome-bg.c +--- a/libgnome-desktop/gnome-bg.c ++++ b/libgnome-desktop/gnome-bg.c +@@ -110,6 +110,8 @@ struct _GnomeBG + int timeout_id; + + GList * file_cache; ++ ++ guint ignore_changes : 1; + }; + + struct _GnomeBGClass +@@ -269,6 +271,10 @@ do_changed (GnomeBG *bg) + static void + queue_changed (GnomeBG *bg) + { ++ if (bg->ignore_changes) { ++ return; ++ } ++ + if (bg->changed_id > 0) { + g_source_remove (bg->changed_id); + } +@@ -589,6 +595,13 @@ gnome_bg_set_filename (GnomeBG *bg, + } + } + ++void ++gnome_bg_ignore_changes (GnomeBG *bg, ++ gboolean should_ignore) ++{ ++ bg->ignore_changes = should_ignore; ++} ++ + static void + draw_color (GnomeBG *bg, GdkPixbuf *dest) + { +diff --git a/libgnome-desktop/libgnomeui/gnome-bg.h b/libgnome-desktop/libgnomeui/gnome-bg.h +--- a/libgnome-desktop/libgnomeui/gnome-bg.h ++++ b/libgnome-desktop/libgnomeui/gnome-bg.h +@@ -64,6 +64,8 @@ typedef enum { + + GType gnome_bg_get_type (void); + GnomeBG * gnome_bg_new (void); ++void gnome_bg_ignore_changes (GnomeBG *bg, ++ gboolean should_ignore); + void gnome_bg_load_from_preferences (GnomeBG *bg, + GConfClient *client); + void gnome_bg_save_to_preferences (GnomeBG *bg, diff --git a/gnome-desktop.spec b/gnome-desktop.spec index a7517e1..190620d 100644 --- a/gnome-desktop.spec +++ b/gnome-desktop.spec @@ -12,7 +12,7 @@ Summary: Package containing code shared among gnome-panel, gnome-session, nautilus, etc Name: gnome-desktop Version: 2.25.2 -Release: 2%{?dist} +Release: 3%{?dist} URL: http://www.gnome.org Source0: http://download.gnome.org/sources/gnome-desktop/2.25/%{name}-%{version}.tar.bz2 License: GPLv2+ and LGPLv2+ @@ -127,6 +127,9 @@ rm -rf $RPM_BUILD_ROOT %doc %{_datadir}/gtk-doc/html/gnome-desktop/ %changelog +* Thu Dec 4 2008 Ray Strode - 2.25.2-3 +- Rebase fade-in patch to latest from upstream report + * Thu Dec 4 2008 Matthias Clasen - 2.25.2-2 - Update to 2.25.2