diff -up gnome-desktop-2.22.0/libgnome-desktop/gnome-bg.c.refcount-slideshow gnome-desktop-2.22.0/libgnome-desktop/gnome-bg.c
--- gnome-desktop-2.22.0/libgnome-desktop/gnome-bg.c.refcount-slideshow 2008-04-04 11:50:15.000000000 -0400
+++ gnome-desktop-2.22.0/libgnome-desktop/gnome-bg.c 2008-04-04 11:50:23.000000000 -0400
@@ -820,6 +820,7 @@ gnome_bg_set_pixmap_as_root (GdkScreen *
/* Implementation of the pixbuf cache */
struct _SlideShow
{
+ gint ref_count;
double start_time;
double total_duration;
@@ -834,7 +835,8 @@ struct _SlideShow
static SlideShow *read_slideshow_file (const char *filename,
GError **err);
-static void slideshow_free (SlideShow *show);
+static void slideshow_ref (SlideShow *show);
+static void slideshow_unref (SlideShow *show);
static double
now (void)
@@ -929,7 +931,7 @@ file_cache_entry_delete (FileCacheEntry
g_object_unref (ent->u.pixbuf);
break;
case SLIDESHOW:
- slideshow_free (ent->u.slideshow);
+ slideshow_unref (ent->u.slideshow);
break;
case THUMBNAIL:
g_object_unref (ent->u.thumbnail);
@@ -1198,7 +1200,11 @@ create_img_thumbnail (GnomeBG
if (show) {
double alpha;
- Slide *slide = get_current_slide (show, &alpha);
+ Slide *slide;
+
+ slideshow_ref (show);
+
+ slide = get_current_slide (show, &alpha);
if (slide->fixed) {
GdkPixbuf *tmp;
@@ -1238,6 +1244,8 @@ create_img_thumbnail (GnomeBG
}
ensure_timeout (bg, slide);
+
+ slideshow_unref (show);
}
}
@@ -1309,7 +1317,11 @@ get_pixbuf (GnomeBG *bg)
if (show) {
double alpha;
- Slide *slide = get_current_slide (show, &alpha);
+ Slide *slide;
+
+ slideshow_ref (show);
+
+ slide = get_current_slide (show, &alpha);
if (slide->fixed) {
FileSize *size;
@@ -1332,6 +1344,8 @@ get_pixbuf (GnomeBG *bg)
}
ensure_timeout (bg, slide);
+
+ slideshow_unref (show);
}
}
}
@@ -1819,12 +1833,22 @@ handle_text (GMarkupParseContext *contex
}
static void
-slideshow_free (SlideShow *show)
+slideshow_ref (SlideShow *show)
+{
+ show->ref_count++;
+}
+
+static void
+slideshow_unref (SlideShow *show)
{
GList *list;
GSList *slist;
FileSize *size;
+ show->ref_count--;
+ if (show->ref_count > 0)
+ return;
+
for (list = show->slides->head; list != NULL; list = list->next) {
Slide *slide = list->data;
for (slist = slide->file1; slist != NULL; slist = slist->next) {
@@ -1933,6 +1957,7 @@ read_slideshow_file (const char *uri,
g_object_unref (file);
show = g_new0 (SlideShow, 1);
+ show->ref_count = 1;
threadsafe_localtime ((time_t)0, &show->start_tm);
show->stack = g_queue_new ();
show->slides = g_queue_new ();
@@ -1940,13 +1965,13 @@ read_slideshow_file (const char *uri,
context = g_markup_parse_context_new (&parser, 0, show, NULL);
if (!g_markup_parse_context_parse (context, contents, len, err)) {
- slideshow_free (show);
+ slideshow_unref (show);
show = NULL;
}
if (show) {
if (!g_markup_parse_context_end_parse (context, err)) {
- slideshow_free (show);
+ slideshow_unref (show);
show = NULL;
}
}