- Add eel crossfade patch
This commit is contained in:
parent
2e94f3f771
commit
b6d30ede32
405
eel-2.24.0-fade.patch
Normal file
405
eel-2.24.0-fade.patch
Normal file
@ -0,0 +1,405 @@
|
|||||||
|
============================================================
|
||||||
|
Listen for new "transitioned" signal and react
|
||||||
|
|
||||||
|
We now emit "transitioned" when switching frames
|
||||||
|
in a slide show instead of "changed" so we could
|
||||||
|
potentially apply a crossfade when switching
|
||||||
|
backgrounds but not interfere with the slide
|
||||||
|
show transitions.
|
||||||
|
|
||||||
|
diff --git a/eel/eel-background.c b/eel/eel-background.c
|
||||||
|
--- a/eel/eel-background.c
|
||||||
|
+++ b/eel/eel-background.c
|
||||||
|
@@ -143,6 +143,13 @@ on_bg_changed (GnomeBG *bg, EelBackground *background)
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
+on_bg_transitioned (GnomeBG *bg, EelBackground *background)
|
||||||
|
+{
|
||||||
|
+ g_signal_emit (G_OBJECT (background),
|
||||||
|
+ signals[APPEARANCE_CHANGED], 0);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
eel_background_init (gpointer object, gpointer klass)
|
||||||
|
{
|
||||||
|
EelBackground *background;
|
||||||
|
@@ -157,6 +164,8 @@ eel_background_init (gpointer object, gpointer klass)
|
||||||
|
|
||||||
|
g_signal_connect (background->details->bg, "changed",
|
||||||
|
G_CALLBACK (on_bg_changed), background);
|
||||||
|
+ g_signal_connect (background->details->bg, "transitioned",
|
||||||
|
+ G_CALLBACK (on_bg_transitioned), background);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
============================================================
|
||||||
|
Move root window setup to independent function
|
||||||
|
|
||||||
|
Previously it was called open coded in
|
||||||
|
eel_background_set_up_widget (). We're going to
|
||||||
|
need to delay calling it in some cases later
|
||||||
|
when we add the cross fade transitions, so better
|
||||||
|
to factor it out now.
|
||||||
|
|
||||||
|
diff --git a/eel/eel-background.c b/eel/eel-background.c
|
||||||
|
--- a/eel/eel-background.c
|
||||||
|
+++ b/eel/eel-background.c
|
||||||
|
@@ -620,11 +620,38 @@ eel_background_reset (EelBackground *background)
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
+set_root_pixmap (EelBackground *background,
|
||||||
|
+ GdkWindow *window)
|
||||||
|
+{
|
||||||
|
+ GdkPixmap *pixmap, *root_pixmap;
|
||||||
|
+ GdkScreen *screen;
|
||||||
|
+ GdkColor color;
|
||||||
|
+ gboolean changes_with_size;
|
||||||
|
+
|
||||||
|
+ pixmap = eel_background_get_pixmap_and_color (background,
|
||||||
|
+ window,
|
||||||
|
+ &color,
|
||||||
|
+ &changes_with_size);
|
||||||
|
+ screen = gdk_drawable_get_screen (window);
|
||||||
|
+
|
||||||
|
+ if (background->details->use_common_pixmap) {
|
||||||
|
+ root_pixmap = g_object_ref (pixmap);
|
||||||
|
+ } else {
|
||||||
|
+ root_pixmap = gnome_bg_create_pixmap (background->details->bg, window,
|
||||||
|
+ gdk_screen_get_width (screen), gdk_screen_get_height (screen), TRUE);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ gnome_bg_set_pixmap_as_root (screen, pixmap);
|
||||||
|
+
|
||||||
|
+ g_object_unref (pixmap);
|
||||||
|
+ g_object_unref (root_pixmap);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
eel_background_set_up_widget (EelBackground *background, GtkWidget *widget)
|
||||||
|
{
|
||||||
|
GtkStyle *style;
|
||||||
|
GdkPixmap *pixmap;
|
||||||
|
- GdkPixmap *root_pixmap;
|
||||||
|
GdkColor color;
|
||||||
|
|
||||||
|
int window_width;
|
||||||
|
@@ -666,18 +693,7 @@ eel_background_set_up_widget (EelBackground *background, GtkWidget *widget)
|
||||||
|
gnome_bg_changes_with_size (background->details->bg);
|
||||||
|
|
||||||
|
if (background->details->is_desktop) {
|
||||||
|
-
|
||||||
|
- root_pixmap = NULL;
|
||||||
|
-
|
||||||
|
- if (background->details->use_common_pixmap) {
|
||||||
|
- root_pixmap = g_object_ref (pixmap);
|
||||||
|
- } else {
|
||||||
|
- root_pixmap = gnome_bg_create_pixmap (background->details->bg, window,
|
||||||
|
- window_width, window_height, TRUE);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- gnome_bg_set_pixmap_as_root (gdk_drawable_get_screen (window), root_pixmap);
|
||||||
|
- g_object_unref (root_pixmap);
|
||||||
|
+ set_root_pixmap (background, window);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pixmap) {
|
||||||
|
|
||||||
|
============================================================
|
||||||
|
Compress multiple background change requests into 1
|
||||||
|
|
||||||
|
We may end up in a situation where we need to deal
|
||||||
|
with a few different things trying to change the
|
||||||
|
background at the same time in quick succession.
|
||||||
|
This change avoids duplicated effort by deferring
|
||||||
|
the work to an idle handler.
|
||||||
|
|
||||||
|
diff --git a/eel/eel-background.c b/eel/eel-background.c
|
||||||
|
--- a/eel/eel-background.c
|
||||||
|
+++ b/eel/eel-background.c
|
||||||
|
@@ -90,6 +90,7 @@ struct EelBackgroundDetails {
|
||||||
|
gulong screen_size_handler;
|
||||||
|
/* Can we use common pixmap for root window and desktop window */
|
||||||
|
gboolean use_common_pixmap;
|
||||||
|
+ guint change_idle_id;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
@@ -701,13 +702,35 @@ eel_background_set_up_widget (EelBackground *background, GtkWidget *widget)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void
|
||||||
|
-eel_widget_background_changed (GtkWidget *widget, EelBackground *background)
|
||||||
|
+static gboolean
|
||||||
|
+on_background_changed (GtkWidget *widget)
|
||||||
|
{
|
||||||
|
+ EelBackground *background;
|
||||||
|
+
|
||||||
|
+ background = eel_get_widget_background (widget);
|
||||||
|
+
|
||||||
|
+ background->details->change_idle_id = 0;
|
||||||
|
+
|
||||||
|
eel_background_unrealize (background);
|
||||||
|
eel_background_set_up_widget (background, widget);
|
||||||
|
|
||||||
|
gtk_widget_queue_draw (widget);
|
||||||
|
+
|
||||||
|
+ return FALSE;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+eel_widget_queue_background_change (GtkWidget *widget)
|
||||||
|
+{
|
||||||
|
+ EelBackground *background;
|
||||||
|
+
|
||||||
|
+ background = eel_get_widget_background (widget);
|
||||||
|
+
|
||||||
|
+ if (background->details->change_idle_id > 0) {
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ background->details->change_idle_id = g_idle_add ((GSourceFunc) on_background_changed, widget);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Callback used when the style of a widget changes. We have to regenerate its
|
||||||
|
@@ -720,7 +743,7 @@ widget_style_set_cb (GtkWidget *widget, GtkStyle *previous_style, gpointer data)
|
||||||
|
|
||||||
|
background = EEL_BACKGROUND (data);
|
||||||
|
|
||||||
|
- eel_widget_background_changed (widget, background);
|
||||||
|
+ eel_widget_queue_background_change (widget);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
@@ -844,8 +867,8 @@ eel_get_widget_background (GtkWidget *widget)
|
||||||
|
|
||||||
|
/* Arrange to get the signal whenever the background changes. */
|
||||||
|
g_signal_connect_object (background, "appearance_changed",
|
||||||
|
- G_CALLBACK (eel_widget_background_changed), widget, G_CONNECT_SWAPPED);
|
||||||
|
- eel_widget_background_changed (widget, background);
|
||||||
|
+ G_CALLBACK (eel_widget_queue_background_change), widget, G_CONNECT_SWAPPED);
|
||||||
|
+ eel_widget_queue_background_change (widget);
|
||||||
|
|
||||||
|
g_signal_connect_object (widget, "style_set",
|
||||||
|
G_CALLBACK (widget_style_set_cb),
|
||||||
|
|
||||||
|
============================================================
|
||||||
|
Store widget in background details
|
||||||
|
|
||||||
|
It will get used in various places, so keeping
|
||||||
|
it around simplifies things. Note, backgrounds
|
||||||
|
are already tied to the lifetime of their widgets
|
||||||
|
by a g_object_set_data_full call, so we don't need
|
||||||
|
to worry about nullifying the assignment later,
|
||||||
|
or taking a reference.
|
||||||
|
|
||||||
|
diff --git a/eel/eel-background.c b/eel/eel-background.c
|
||||||
|
--- a/eel/eel-background.c
|
||||||
|
+++ b/eel/eel-background.c
|
||||||
|
@@ -74,6 +74,7 @@ struct EelBackgroundDetails {
|
||||||
|
char *color;
|
||||||
|
|
||||||
|
GnomeBG *bg;
|
||||||
|
+ GtkWidget *widget;
|
||||||
|
|
||||||
|
/* Realized data: */
|
||||||
|
gboolean background_changes_with_size;
|
||||||
|
@@ -864,6 +865,7 @@ eel_get_widget_background (GtkWidget *widget)
|
||||||
|
gtk_object_sink (GTK_OBJECT (background));
|
||||||
|
g_object_set_data_full (G_OBJECT (widget), "eel_background",
|
||||||
|
background, g_object_unref);
|
||||||
|
+ background->details->widget = widget;
|
||||||
|
|
||||||
|
/* Arrange to get the signal whenever the background changes. */
|
||||||
|
g_signal_connect_object (background, "appearance_changed",
|
||||||
|
|
||||||
|
============================================================
|
||||||
|
Add the crossfade transition
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/eel/eel-background.c b/eel/eel-background.c
|
||||||
|
--- a/eel/eel-background.c
|
||||||
|
+++ b/eel/eel-background.c
|
||||||
|
@@ -54,6 +54,9 @@ static GdkPixmap *eel_background_get_pixmap_and_color (EelBackground *backg
|
||||||
|
gboolean *changes_with_size);
|
||||||
|
static void set_image_properties (EelBackground *background);
|
||||||
|
|
||||||
|
+static void init_fade (EelBackground *background, GtkWidget *widget);
|
||||||
|
+static void free_fade (EelBackground *background);
|
||||||
|
+
|
||||||
|
EEL_CLASS_BOILERPLATE (EelBackground, eel_background, GTK_TYPE_OBJECT)
|
||||||
|
|
||||||
|
enum {
|
||||||
|
@@ -79,6 +82,7 @@ struct EelBackgroundDetails {
|
||||||
|
/* Realized data: */
|
||||||
|
gboolean background_changes_with_size;
|
||||||
|
GdkPixmap *background_pixmap;
|
||||||
|
+ GnomeBGCrossfade *fade;
|
||||||
|
int background_entire_width;
|
||||||
|
int background_entire_height;
|
||||||
|
GdkColor default_color;
|
||||||
|
@@ -140,6 +144,7 @@ eel_background_class_init (gpointer klass)
|
||||||
|
static void
|
||||||
|
on_bg_changed (GnomeBG *bg, EelBackground *background)
|
||||||
|
{
|
||||||
|
+ init_fade (background, background->details->widget);
|
||||||
|
g_signal_emit (G_OBJECT (background),
|
||||||
|
signals[APPEARANCE_CHANGED], 0);
|
||||||
|
}
|
||||||
|
@@ -147,6 +152,7 @@ on_bg_changed (GnomeBG *bg, EelBackground *background)
|
||||||
|
static void
|
||||||
|
on_bg_transitioned (GnomeBG *bg, EelBackground *background)
|
||||||
|
{
|
||||||
|
+ free_fade (background);
|
||||||
|
g_signal_emit (G_OBJECT (background),
|
||||||
|
signals[APPEARANCE_CHANGED], 0);
|
||||||
|
}
|
||||||
|
@@ -186,6 +192,15 @@ eel_background_remove_current_image (EelBackground *background)
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
+free_fade (EelBackground *background)
|
||||||
|
+{
|
||||||
|
+ if (background->details->fade != NULL) {
|
||||||
|
+ g_object_unref (background->details->fade);
|
||||||
|
+ background->details->fade = NULL;
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
eel_background_finalize (GObject *object)
|
||||||
|
{
|
||||||
|
EelBackground *background;
|
||||||
|
@@ -200,6 +215,8 @@ eel_background_finalize (GObject *object)
|
||||||
|
background->details->background_pixmap = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ free_fade (background);
|
||||||
|
+
|
||||||
|
g_free (background->details);
|
||||||
|
|
||||||
|
EEL_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
|
||||||
|
@@ -649,6 +666,33 @@ set_root_pixmap (EelBackground *background,
|
||||||
|
g_object_unref (root_pixmap);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static gboolean
|
||||||
|
+fade_to_pixmap (EelBackground *background,
|
||||||
|
+ GdkWindow *window,
|
||||||
|
+ GdkPixmap *pixmap)
|
||||||
|
+{
|
||||||
|
+ if (background->details->fade == NULL) {
|
||||||
|
+ return FALSE;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (!gnome_bg_crossfade_set_end_pixmap (background->details->fade,
|
||||||
|
+ pixmap)) {
|
||||||
|
+ return FALSE;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (!gnome_bg_crossfade_is_started (background->details->fade)) {
|
||||||
|
+ gnome_bg_crossfade_start (background->details->fade, window, NULL);
|
||||||
|
+ if (background->details->is_desktop) {
|
||||||
|
+ g_signal_connect_swapped (background->details->fade,
|
||||||
|
+ "finished",
|
||||||
|
+ G_CALLBACK (set_root_pixmap), background);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return gnome_bg_crossfade_is_started (background->details->fade);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
static void
|
||||||
|
eel_background_set_up_widget (EelBackground *background, GtkWidget *widget)
|
||||||
|
{
|
||||||
|
@@ -661,6 +705,7 @@ eel_background_set_up_widget (EelBackground *background, GtkWidget *widget)
|
||||||
|
|
||||||
|
GdkWindow *window;
|
||||||
|
gboolean changes_with_size;
|
||||||
|
+ gboolean in_fade;
|
||||||
|
|
||||||
|
if (!GTK_WIDGET_REALIZED (widget)) {
|
||||||
|
return;
|
||||||
|
@@ -683,18 +728,25 @@ eel_background_set_up_widget (EelBackground *background, GtkWidget *widget)
|
||||||
|
window = widget->window;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (background->details->fade != NULL) {
|
||||||
|
+ in_fade = fade_to_pixmap (background, window, pixmap);
|
||||||
|
+ } else {
|
||||||
|
+ in_fade = FALSE;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (!in_fade) {
|
||||||
|
if (!changes_with_size || background->details->is_desktop) {
|
||||||
|
gdk_window_set_back_pixmap (window, pixmap, FALSE);
|
||||||
|
} else {
|
||||||
|
gdk_window_set_back_pixmap (window, NULL, FALSE);
|
||||||
|
gdk_window_set_background (window, &color);
|
||||||
|
}
|
||||||
|
+ }
|
||||||
|
|
||||||
|
-
|
||||||
|
background->details->background_changes_with_size =
|
||||||
|
gnome_bg_changes_with_size (background->details->bg);
|
||||||
|
|
||||||
|
- if (background->details->is_desktop) {
|
||||||
|
+ if (background->details->is_desktop && !in_fade) {
|
||||||
|
set_root_pixmap (background, window);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -707,7 +759,7 @@ static gboolean
|
||||||
|
on_background_changed (GtkWidget *widget)
|
||||||
|
{
|
||||||
|
EelBackground *background;
|
||||||
|
-
|
||||||
|
+
|
||||||
|
background = eel_get_widget_background (widget);
|
||||||
|
|
||||||
|
background->details->change_idle_id = 0;
|
||||||
|
@@ -721,10 +773,40 @@ on_background_changed (GtkWidget *widget)
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
+init_fade (EelBackground *background, GtkWidget *widget)
|
||||||
|
+{
|
||||||
|
+ if (widget == NULL || !GTK_WIDGET_REALIZED (widget))
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ if (background->details->fade == NULL) {
|
||||||
|
+ int old_width, old_height, width, height;
|
||||||
|
+
|
||||||
|
+ /* If this was the result of a screen size change,
|
||||||
|
+ * we don't want to crossfade
|
||||||
|
+ */
|
||||||
|
+ gdk_drawable_get_size (widget->window, &old_width, &old_height);
|
||||||
|
+ drawable_get_adjusted_size (background, widget->window,
|
||||||
|
+ &width, &height);
|
||||||
|
+ if (old_width == width && old_height == height) {
|
||||||
|
+ background->details->fade = gnome_bg_crossfade_new (width, height);
|
||||||
|
+ g_signal_connect_swapped (background->details->fade,
|
||||||
|
+ "finished",
|
||||||
|
+ G_CALLBACK (free_fade),
|
||||||
|
+ background);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (background->details->fade != NULL && !gnome_bg_crossfade_is_started (background->details->fade)) {
|
||||||
|
+ gnome_bg_crossfade_set_start_pixmap (background->details->fade,
|
||||||
|
+ background->details->background_pixmap);
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
eel_widget_queue_background_change (GtkWidget *widget)
|
||||||
|
{
|
||||||
|
EelBackground *background;
|
||||||
|
-
|
||||||
|
+
|
||||||
|
background = eel_get_widget_background (widget);
|
||||||
|
|
||||||
|
if (background->details->change_idle_id > 0) {
|
@ -16,7 +16,7 @@
|
|||||||
Name: nautilus
|
Name: nautilus
|
||||||
Summary: File manager for GNOME
|
Summary: File manager for GNOME
|
||||||
Version: 2.25.2
|
Version: 2.25.2
|
||||||
Release: 3%{?dist}
|
Release: 4%{?dist}
|
||||||
License: GPLv2+
|
License: GPLv2+
|
||||||
Group: User Interface/Desktops
|
Group: User Interface/Desktops
|
||||||
Source: http://download.gnome.org/sources/%{name}/2.25/%{name}-%{version}.tar.bz2
|
Source: http://download.gnome.org/sources/%{name}/2.25/%{name}-%{version}.tar.bz2
|
||||||
@ -89,6 +89,9 @@ Patch15: nautilus-2.22.0-treeview-xds-dnd-2.patch
|
|||||||
# http://bugzilla.gnome.org/show_bug.cgi?id=519743
|
# http://bugzilla.gnome.org/show_bug.cgi?id=519743
|
||||||
Patch17: nautilus-filetype-symlink-fix.patch
|
Patch17: nautilus-filetype-symlink-fix.patch
|
||||||
|
|
||||||
|
# http://bugzilla.gnome.org/show_bug.cgi?id=552859
|
||||||
|
Patch18: eel-2.24.0-fade.patch
|
||||||
|
|
||||||
|
|
||||||
%description
|
%description
|
||||||
Nautilus is the file manager and graphical shell for the GNOME desktop
|
Nautilus is the file manager and graphical shell for the GNOME desktop
|
||||||
@ -128,6 +131,7 @@ for developing nautilus extensions.
|
|||||||
%patch10 -p1 -b .gvfs-desktop-key
|
%patch10 -p1 -b .gvfs-desktop-key
|
||||||
%patch15 -p1 -b .xds
|
%patch15 -p1 -b .xds
|
||||||
%patch17 -p0 -b .symlink
|
%patch17 -p0 -b .symlink
|
||||||
|
%patch18 -p0 -b .fade
|
||||||
|
|
||||||
%build
|
%build
|
||||||
|
|
||||||
@ -259,6 +263,9 @@ fi
|
|||||||
|
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Thu Dec 18 2008 - Ray Strode <rstrode@redhat.com> - 2.25.2-4
|
||||||
|
- Add eel crossfade patch
|
||||||
|
|
||||||
* Wed Dec 17 2008 - Bastien Nocera <bnocera@redhat.com> - 2.25.2-3
|
* Wed Dec 17 2008 - Bastien Nocera <bnocera@redhat.com> - 2.25.2-3
|
||||||
- Rebuild for new libgnome-desktop
|
- Rebuild for new libgnome-desktop
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user