diff --git a/gnome-desktop-2.24.0-fade.patch b/gnome-desktop-2.24.0-fade.patch index afb041d..d55931a 100644 --- a/gnome-desktop-2.24.0-fade.patch +++ b/gnome-desktop-2.24.0-fade.patch @@ -1,6 +1,6 @@ -diff -up gnome-desktop-2.24.0/libgnome-desktop/gnome-bg.c.fade gnome-desktop-2.24.0/libgnome-desktop/gnome-bg.c +diff -upb gnome-desktop-2.24.0/libgnome-desktop/gnome-bg.c.fade gnome-desktop-2.24.0/libgnome-desktop/gnome-bg.c --- gnome-desktop-2.24.0/libgnome-desktop/gnome-bg.c.fade 2008-09-22 17:01:45.000000000 -0400 -+++ gnome-desktop-2.24.0/libgnome-desktop/gnome-bg.c 2008-10-14 16:01:38.000000000 -0400 ++++ gnome-desktop-2.24.0/libgnome-desktop/gnome-bg.c 2008-10-15 11:12:56.000000000 -0400 @@ -37,11 +37,15 @@ Author: Soren Sandmann #include @@ -113,9 +113,24 @@ diff -up gnome-desktop-2.24.0/libgnome-desktop/gnome-bg.c.fade gnome-desktop-2.2 static void draw_color (GnomeBG *bg, GdkPixbuf *dest) { -@@ -1012,52 +1063,86 @@ gnome_bg_create_thumbnail (GnomeBG +@@ -1011,15 +1062,74 @@ gnome_bg_create_thumbnail (GnomeBG + return result; } ++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)); -/* Set the root pixmap, and properties pointing to it. We - * do this atomically with XGrabServer to make sure that @@ -125,108 +140,83 @@ diff -up gnome-desktop-2.24.0/libgnome-desktop/gnome-bg.c.fade gnome-desktop-2.2 - */ -void -gnome_bg_set_pixmap_as_root (GdkScreen *screen, GdkPixmap *pixmap) -+static GdkPixmap * ++ 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, -+ gboolean copy_old_root) ++ GdkPixmap *pixmap) { int result; gint format; - gulong nitems; - gulong bytes_after; -- guchar *data_esetroot; -+ guchar *data; - Pixmap pixmap_id; - Atom type; +@@ -1031,15 +1141,10 @@ gnome_bg_set_pixmap_as_root (GdkScreen * Display *display; int screen_num; -- + - g_return_if_fail (screen != NULL); - g_return_if_fail (pixmap != NULL); -+ GdkPixmap *old_root_pixmap; - +- screen_num = gdk_screen_get_number (screen); - -- data_esetroot = NULL; -+ old_root_pixmap = NULL; -+ data = NULL; - display = GDK_DISPLAY_XDISPLAY (gdk_screen_get_display (screen)); + data_esetroot = NULL; +- display = GDK_DISPLAY_XDISPLAY (gdk_screen_get_display (screen)); - XGrabServer (display); -+ if (copy_old_root) { -+ 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); -+ -+ 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); -+ -+ old_root_pixmap = gdk_pixmap_new (source_pixmap, width, height, -1); -+ -+ cr = gdk_cairo_create (old_root_pixmap); -+ gdk_cairo_set_source_pixmap (cr, source_pixmap, 0, 0); -+ pattern = cairo_get_source (cr); -+ cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REPEAT); -+ cairo_paint (cr); -+ -+ if (cairo_status (cr) != CAIRO_STATUS_SUCCESS) { -+ g_object_unref (old_root_pixmap); -+ old_root_pixmap = NULL; -+ } -+ cairo_destroy (cr); -+ -+ g_object_unref (source_pixmap); -+ } -+ XFree (data); -+ } -+ } ++ display = GDK_DISPLAY_XDISPLAY (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); -+ &data); - -- if (data_esetroot != NULL) { -+ if (data!= NULL) { - if (result == Success && type == XA_PIXMAP && - format == 32 && - nitems == 1) { - gdk_error_trap_push (); -- XKillClient (display, *(Pixmap *)data_esetroot); -+ XKillClient (display, *(Pixmap *)data); - gdk_flush (); - gdk_error_trap_pop (); - } -- XFree (data_esetroot); -+ XFree (data); - } - - pixmap_id = GDK_WINDOW_XWINDOW (pixmap); -@@ -1071,13 +1156,74 @@ gnome_bg_set_pixmap_as_root (GdkScreen * +@@ -1070,14 +1175,72 @@ gnome_bg_set_pixmap_as_root (GdkScreen * + gdk_x11_get_xatom_by_name ("_XROOTPMAP_ID"), XA_PIXMAP, 32, PropModeReplace, (guchar *) &pixmap_id, 1); - -- XSetWindowBackgroundPixmap (display, RootWindow (display, screen_num), -- pixmap_id); -- XClearWindow (display, RootWindow (display, screen_num)); -+ return old_root_pixmap; +} + +/* Set the root pixmap, and properties pointing to it. We @@ -240,27 +230,28 @@ diff -up gnome-desktop-2.24.0/libgnome-desktop/gnome-bg.c.fade gnome-desktop-2.2 +{ + Display *display; + int screen_num; - -- XUngrabServer (display); ++ + 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); + -+ gnome_bg_set_root_pixmap_id (screen, pixmap, FALSE); -+ -+ XSetWindowBackgroundPixmap (display, RootWindow (display, screen_num), ++ gnome_bg_set_root_pixmap_id (screen, pixmap); + + XSetWindowBackgroundPixmap (display, RootWindow (display, screen_num), +- pixmap_id); + GDK_PIXMAP_XID (pixmap)); -+ XClearWindow (display, RootWindow (display, screen_num)); -+ - XFlush (display); + XClearWindow (display, RootWindow (display, screen_num)); + ++ XFlush (display); + -+ XUngrabServer (display); + XUngrabServer (display); +} -+ + +- XFlush (display); +GnomeBGCrossfade * +gnome_bg_set_pixmap_as_root_with_crossfade (GdkScreen *screen, + GdkPixmap *pixmap, @@ -269,7 +260,6 @@ diff -up gnome-desktop-2.24.0/libgnome-desktop/gnome-bg.c.fade gnome-desktop-2.2 + GdkDisplay *display; + GdkWindow *root_window; + GdkPixmap *old_pixmap; -+ int screen_num; + int width, height; + GnomeBGCrossfade *fade; + @@ -285,8 +275,8 @@ diff -up gnome-desktop-2.24.0/libgnome-desktop/gnome-bg.c.fade gnome-desktop-2.2 + + display = gdk_screen_get_display (screen); + gdk_x11_display_grab (display); -+ old_pixmap = gnome_bg_set_root_pixmap_id (screen, pixmap, TRUE); -+ ++ 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); @@ -298,7 +288,7 @@ diff -up gnome-desktop-2.24.0/libgnome-desktop/gnome-bg.c.fade gnome-desktop-2.2 } -@@ -1343,7 +1489,7 @@ on_timeout (gpointer data) +@@ -1343,7 +1506,7 @@ on_timeout (gpointer data) bg->timeout_id = 0; @@ -307,9 +297,9 @@ diff -up gnome-desktop-2.24.0/libgnome-desktop/gnome-bg.c.fade gnome-desktop-2.2 return FALSE; } -diff -up /dev/null gnome-desktop-2.24.0/libgnome-desktop/gnome-bg-crossfade.c ---- /dev/null 2008-10-14 09:46:12.473279410 -0400 -+++ gnome-desktop-2.24.0/libgnome-desktop/gnome-bg-crossfade.c 2008-10-14 15:21:15.000000000 -0400 +diff -upb /dev/null gnome-desktop-2.24.0/libgnome-desktop/gnome-bg-crossfade.c +--- /dev/null 2008-10-15 05:19:06.472035468 -0400 ++++ gnome-desktop-2.24.0/libgnome-desktop/gnome-bg-crossfade.c 2008-10-15 08:58:43.000000000 -0400 @@ -0,0 +1,432 @@ +/* gnome-bg-crossfade.h - fade window background between two pixmaps + * @@ -488,8 +478,8 @@ diff -up /dev/null gnome-desktop-2.24.0/libgnome-desktop/gnome-bg-crossfade.c + signals[FINISHED] = g_signal_new ("finished", + G_OBJECT_CLASS_TYPE (gobject_class), + G_SIGNAL_RUN_LAST, 0, NULL, NULL, -+ g_cclosure_marshal_VOID__VOID, -+ G_TYPE_NONE, 0); ++ g_cclosure_marshal_VOID__OBJECT, ++ G_TYPE_NONE, 1, G_TYPE_OBJECT); + + g_type_class_add_private (gobject_class, sizeof (GnomeBGCrossfadePrivate)); +} @@ -514,7 +504,7 @@ diff -up /dev/null gnome-desktop-2.24.0/libgnome-desktop/gnome-bg-crossfade.c +} + +static GdkPixmap * -+copy_pixmap (GdkPixmap *pixmap, ++tile_pixmap (GdkPixmap *pixmap, + int width, + int height) +{ @@ -532,7 +522,6 @@ diff -up /dev/null gnome-desktop-2.24.0/libgnome-desktop/gnome-bg-crossfade.c + cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REPEAT); + } else { + GtkStyle *style; -+ sleep (30); + style = gtk_widget_get_default_style (); + gdk_cairo_set_source_color (cr, &style->bg[GTK_STATE_NORMAL]); + } @@ -559,7 +548,7 @@ diff -up /dev/null gnome-desktop-2.24.0/libgnome-desktop/gnome-bg-crossfade.c + fade->priv->fading_pixmap = NULL; + } + -+ fade->priv->fading_pixmap = copy_pixmap (pixmap, ++ fade->priv->fading_pixmap = tile_pixmap (pixmap, + fade->priv->width, + fade->priv->height); + @@ -577,7 +566,7 @@ diff -up /dev/null gnome-desktop-2.24.0/libgnome-desktop/gnome-bg-crossfade.c + fade->priv->end_pixmap = NULL; + } + -+ fade->priv->end_pixmap = copy_pixmap (pixmap, ++ fade->priv->end_pixmap = tile_pixmap (pixmap, + fade->priv->width, + fade->priv->height); + @@ -627,7 +616,6 @@ diff -up /dev/null gnome-desktop-2.24.0/libgnome-desktop/gnome-bg-crossfade.c + cairo_status_t status; + + g_return_val_if_fail (GNOME_IS_BG_CROSSFADE (fade), FALSE); -+ + now = get_current_time (); + + percent_done = (now - fade->priv->start_time) / .75; @@ -655,6 +643,7 @@ diff -up /dev/null gnome-desktop-2.24.0/libgnome-desktop/gnome-bg-crossfade.c + gdk_cairo_set_source_pixmap (cr, fade->priv->end_pixmap, + 0.0, 0.0); + cairo_paint_with_alpha (cr, percent_done); ++ + status = cairo_status (cr); + cairo_destroy (cr); + @@ -695,7 +684,7 @@ diff -up /dev/null gnome-desktop-2.24.0/libgnome-desktop/gnome-bg-crossfade.c + } + + fade->priv->timeout_id = 0; -+ g_signal_emit (fade, signals[FINISHED], 0); ++ g_signal_emit (fade, signals[FINISHED], 0, fade->priv->window); +} + +void @@ -710,8 +699,6 @@ diff -up /dev/null gnome-desktop-2.24.0/libgnome-desktop/gnome-bg-crossfade.c + g_return_if_fail (fade->priv->end_pixmap != NULL); + g_return_if_fail (!gnome_bg_crossfade_is_started (fade)); + -+ fade->priv->start_time = get_current_time (); -+ + source = g_timeout_source_new (1000 / 60.0); + g_source_set_callback (source, + (GSourceFunc) on_tick, @@ -724,6 +711,9 @@ diff -up /dev/null gnome-desktop-2.24.0/libgnome-desktop/gnome-bg-crossfade.c + gdk_window_set_back_pixmap (fade->priv->window, + fade->priv->fading_pixmap, + FALSE); ++ gdk_window_clear (fade->priv->window); ++ gdk_flush (); ++ fade->priv->start_time = get_current_time (); +} + +gboolean @@ -743,10 +733,10 @@ diff -up /dev/null gnome-desktop-2.24.0/libgnome-desktop/gnome-bg-crossfade.c + g_source_remove (fade->priv->timeout_id); + } +} -diff -up /dev/null gnome-desktop-2.24.0/libgnome-desktop/libgnomeui/gnome-bg-crossfade.h ---- /dev/null 2008-10-14 09:46:12.473279410 -0400 -+++ gnome-desktop-2.24.0/libgnome-desktop/libgnomeui/gnome-bg-crossfade.h 2008-10-14 15:21:15.000000000 -0400 -@@ -0,0 +1,79 @@ +diff -upb /dev/null gnome-desktop-2.24.0/libgnome-desktop/libgnomeui/gnome-bg-crossfade.h +--- /dev/null 2008-10-15 05:19:06.472035468 -0400 ++++ gnome-desktop-2.24.0/libgnome-desktop/libgnomeui/gnome-bg-crossfade.h 2008-10-15 08:57:26.000000000 -0400 +@@ -0,0 +1,76 @@ +/* gnome-bg-crossfade.h - fade window background between two pixmaps + + Copyright 2008, Red Hat, Inc. @@ -805,18 +795,15 @@ diff -up /dev/null gnome-desktop-2.24.0/libgnome-desktop/libgnomeui/gnome-bg-cro +{ + GObjectClass parent_class; + -+ void (* finished) (GnomeBGCrossfade *fade); ++ void (* finished) (GnomeBGCrossfade *fade, GdkWindow *window); +}; + +GType gnome_bg_crossfade_get_type (void); +GnomeBGCrossfade *gnome_bg_crossfade_new (int width, int height); -+gboolean gnome_bg_crossfade_set_start_pixmap (GnomeBGCrossfade *fade, ++gboolean gnome_bg_crossfade_set_start_pixmap (GnomeBGCrossfade *fade, + GdkPixmap *pixmap); -+ -+gboolean gnome_bg_crossfade_set_end_pixmap (GnomeBGCrossfade *fade, ++gboolean gnome_bg_crossfade_set_end_pixmap (GnomeBGCrossfade *fade, + GdkPixmap *pixmap); -+void gnome_bg_crossfade_set_context (GnomeBGCrossfade *fade, -+ GMainContext *context); +void gnome_bg_crossfade_start (GnomeBGCrossfade *fade, + GdkWindow *window, + GMainContext *context); @@ -826,9 +813,9 @@ diff -up /dev/null gnome-desktop-2.24.0/libgnome-desktop/libgnomeui/gnome-bg-cro +G_END_DECLS + +#endif -diff -up gnome-desktop-2.24.0/libgnome-desktop/libgnomeui/gnome-bg.h.fade gnome-desktop-2.24.0/libgnome-desktop/libgnomeui/gnome-bg.h +diff -upb gnome-desktop-2.24.0/libgnome-desktop/libgnomeui/gnome-bg.h.fade gnome-desktop-2.24.0/libgnome-desktop/libgnomeui/gnome-bg.h --- gnome-desktop-2.24.0/libgnome-desktop/libgnomeui/gnome-bg.h.fade 2008-09-22 17:01:45.000000000 -0400 -+++ gnome-desktop-2.24.0/libgnome-desktop/libgnomeui/gnome-bg.h 2008-10-14 15:21:15.000000000 -0400 ++++ gnome-desktop-2.24.0/libgnome-desktop/libgnomeui/gnome-bg.h 2008-10-14 17:49:44.000000000 -0400 @@ -33,6 +33,8 @@ #include #include @@ -847,19 +834,20 @@ diff -up gnome-desktop-2.24.0/libgnome-desktop/libgnomeui/gnome-bg.h.fade gnome- void gnome_bg_load_from_preferences (GnomeBG *bg, GConfClient *client); void gnome_bg_save_to_preferences (GnomeBG *bg, -@@ -109,6 +113,9 @@ gboolean gnome_bg_changes_with_s +@@ -109,6 +113,10 @@ gboolean gnome_bg_changes_with_s void gnome_bg_set_pixmap_as_root (GdkScreen *screen, GdkPixmap *pixmap); +GnomeBGCrossfade *gnome_bg_set_pixmap_as_root_with_crossfade (GdkScreen *screen, + GdkPixmap *pixmap, + GMainContext *context); ++GdkPixmap *gnome_bg_get_pixmap_from_root (GdkScreen *screen); G_END_DECLS -diff -up gnome-desktop-2.24.0/libgnome-desktop/libgnomeui/Makefile.am.fade gnome-desktop-2.24.0/libgnome-desktop/libgnomeui/Makefile.am +diff -upb gnome-desktop-2.24.0/libgnome-desktop/libgnomeui/Makefile.am.fade gnome-desktop-2.24.0/libgnome-desktop/libgnomeui/Makefile.am --- gnome-desktop-2.24.0/libgnome-desktop/libgnomeui/Makefile.am.fade 2008-09-22 17:01:45.000000000 -0400 -+++ gnome-desktop-2.24.0/libgnome-desktop/libgnomeui/Makefile.am 2008-10-14 15:21:15.000000000 -0400 ++++ gnome-desktop-2.24.0/libgnome-desktop/libgnomeui/Makefile.am 2008-10-14 17:49:44.000000000 -0400 @@ -3,6 +3,7 @@ libgnomeui_desktop_HEADERS = \ gnome-ditem-edit.h \ gnome-hint.h \ @@ -868,9 +856,9 @@ diff -up gnome-desktop-2.24.0/libgnome-desktop/libgnomeui/Makefile.am.fade gnome gnome-rr.h \ gnome-rr-config.h \ gnome-rr-labeler.h -diff -up gnome-desktop-2.24.0/libgnome-desktop/Makefile.am.fade gnome-desktop-2.24.0/libgnome-desktop/Makefile.am +diff -upb gnome-desktop-2.24.0/libgnome-desktop/Makefile.am.fade gnome-desktop-2.24.0/libgnome-desktop/Makefile.am --- gnome-desktop-2.24.0/libgnome-desktop/Makefile.am.fade 2008-09-22 17:01:45.000000000 -0400 -+++ gnome-desktop-2.24.0/libgnome-desktop/Makefile.am 2008-10-14 15:21:15.000000000 -0400 ++++ gnome-desktop-2.24.0/libgnome-desktop/Makefile.am 2008-10-14 17:49:44.000000000 -0400 @@ -21,6 +21,7 @@ libgnome_desktop_2_la_SOURCES = \ gnome-ditem-edit.c \ gnome-hint.c \ diff --git a/gnome-desktop.spec b/gnome-desktop.spec index 6ef8bf6..b94b353 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.24.0 -Release: 6%{?dist} +Release: 7%{?dist} URL: http://www.gnome.org Source0: http://download.gnome.org/sources/gnome-desktop/2.24/%{name}-%{version}.tar.bz2 License: GPLv2+ and LGPLv2+ @@ -126,6 +126,10 @@ rm -rf $RPM_BUILD_ROOT %doc %{_datadir}/gtk-doc/html/gnome-desktop/ %changelog +* Wed Oct 15 2008 Ray Strode - 2.24.0-7 +- Add new api for getting the root window pixmap +- Pass start window to crossfade "finished" signal + * Tue Oct 14 2008 Ray Strode - 2.24.0-6 - Hold off on settings daemon cross fade if nautilus is going to do it anyway. Grab the server while getting the initial