Updating branch refs/heads/eric/settings-changes to 2f9278f47973b337f52619afece20cf498664fd6 (commit) from 715985a0cfdcabe4eacc391c8f37690d343351e7 (commit)
commit 2f9278f47973b337f52619afece20cf498664fd6 Author: Eric Koegel <eric.koe...@gmail.com> Date: Sun Oct 27 09:29:43 2013 +0300 Fix some memory leaks common/xfdesktop-thumbnailer.c | 38 +++++++++++++++++++++++++++--------- src/xfce-backdrop.c | 39 ++++++++++++++++++++++++++----------- src/xfce-desktop.c | 30 ++++++++++++++++------------ src/xfce-workspace.c | 2 ++ src/xfdesktop-file-icon-manager.c | 17 +++++++++++++--- 5 files changed, 91 insertions(+), 35 deletions(-) diff --git a/common/xfdesktop-thumbnailer.c b/common/xfdesktop-thumbnailer.c index 2416d8b..248a3c5 100644 --- a/common/xfdesktop-thumbnailer.c +++ b/common/xfdesktop-thumbnailer.c @@ -340,7 +340,7 @@ xfdesktop_thumbnailer_queue_thumbnail(XfdesktopThumbnailer *thumbnailer, if(g_slist_find(thumbnailer->priv->queue, file) == NULL) { thumbnailer->priv->queue = g_slist_prepend(thumbnailer->priv->queue, - file); + g_strdup(file)); } thumbnailer->priv->request_timer_id = g_timeout_add_full( @@ -370,6 +370,8 @@ void xfdesktop_thumbnailer_dequeue_thumbnail(XfdesktopThumbnailer *thumbnailer, gchar *file) { + GSList *item; + g_return_if_fail(XFDESKTOP_IS_THUMBNAILER(thumbnailer)); g_return_if_fail(file != NULL); @@ -392,9 +394,11 @@ xfdesktop_thumbnailer_dequeue_thumbnail(XfdesktopThumbnailer *thumbnailer, thumbnailer->priv->handle = 0; } - if(g_slist_find(thumbnailer->priv->queue, file) != NULL) { - thumbnailer->priv->queue = g_slist_remove_all(thumbnailer->priv->queue, - file); + item = g_slist_find(thumbnailer->priv->queue, file); + if(item != NULL) { + g_free(item->data); + thumbnailer->priv->queue = g_slist_remove(thumbnailer->priv->queue, + file); } thumbnailer->priv->request_timer_id = g_timeout_add_full( @@ -436,6 +440,7 @@ xfdesktop_thumbnailer_queue_request_timer(XfdesktopThumbnailer *thumbnailer) file = g_file_new_for_path(iter->data); uris[i] = g_file_get_uri(file); mimetypes[i] = xfdesktop_get_file_mimetype(iter->data); + g_object_unref(file); } iter = g_slist_next(iter); @@ -465,6 +470,18 @@ xfdesktop_thumbnailer_queue_request_timer(XfdesktopThumbnailer *thumbnailer) } } + /* Free the memory */ + i = 0; + iter = thumbnailer->priv->queue; + while(iter) { + if(iter->data) { + g_free(uris[i]); + g_free(mimetypes[i]); + } + iter = g_slist_next(iter); + i++; + } + g_free(uris); g_free(mimetypes); @@ -498,7 +515,7 @@ xfdesktop_thumbnailer_thumbnail_ready_dbus(DBusGProxy *proxy, gchar *thumbnail_location; GFile *file; GSList *iter = thumbnailer->priv->queue; - gchar *f_uri, *f_uri_checksum, *filename; + gchar *f_uri, *f_uri_checksum, *filename, *temp; gchar *thumbnail_flavor; gint x = 0; @@ -531,8 +548,8 @@ xfdesktop_thumbnailer_thumbnail_ready_dbus(DBusGProxy *proxy, filename, NULL); DBG("thumbnail-ready src: %s thumbnail: %s", - (char*)iter->data, - thumbnail_location); + (char*)iter->data, + thumbnail_location); g_signal_emit(G_OBJECT(thumbnailer), thumbnailer_signals[THUMBNAIL_READY], @@ -540,14 +557,17 @@ xfdesktop_thumbnailer_thumbnail_ready_dbus(DBusGProxy *proxy, iter->data, thumbnail_location); + temp = iter->data; thumbnailer->priv->queue = g_slist_remove(thumbnailer->priv->queue, - iter->data); + temp); iter = thumbnailer->priv->queue; x++; - + g_free(filename); g_free(f_uri_checksum); + g_free(thumbnail_location); + g_free(temp); } else { iter = g_slist_next(iter); } diff --git a/src/xfce-backdrop.c b/src/xfce-backdrop.c index 14ce700..929c6ee 100644 --- a/src/xfce-backdrop.c +++ b/src/xfce-backdrop.c @@ -240,29 +240,36 @@ xfce_backdrop_clear_cached_image(XfceBackdrop *backdrop) backdrop->priv->pix = NULL; } +/* Returns a GList of all the files in the parent directory of filename */ static GList * -list_files_in_dir(const gchar *path) +list_files_in_dir(const gchar *filename) { GDir *dir; gboolean needs_slash = TRUE; const gchar *file; GList *files = NULL; + gchar *dir_name; - dir = g_dir_open(path, 0, 0); - if(!dir) + dir_name = g_path_get_dirname(filename); + + dir = g_dir_open(dir_name, 0, 0); + if(!dir) { + g_free(dir_name); return NULL; + } - if(path[strlen(path)-1] == '/') + if(dir_name[strlen(dir_name)-1] == '/') needs_slash = FALSE; while((file = g_dir_read_name(dir))) { gchar *current_file = g_strdup_printf(needs_slash ? "%s/%s" : "%s%s", - path, file); + dir_name, file); files = g_list_insert_sorted(files, current_file, (GCompareFunc)g_strcmp0); } g_dir_close(dir); + g_free(dir_name); return files; } @@ -280,8 +287,10 @@ xfce_backdrop_choose_next(const gchar *filename) g_return_val_if_fail(filename, NULL); /* We don't cache the list at all. This way the user can add/remove items - * whenever they like without xfdesktop having to do anything */ - files = list_files_in_dir(g_path_get_dirname(filename)); + * whenever they like without xfdesktop having to do anything. If we start + * supporting sub-directories we may want to re-think that assumption */ + files = list_files_in_dir(filename); + if(!files) return NULL; @@ -331,8 +340,10 @@ xfce_backdrop_choose_random(const gchar *filename) g_return_val_if_fail(filename, NULL); /* We don't cache the list at all. This way the user can add/remove items - * whenever they like without xfdesktop having to do anything */ - files = list_files_in_dir(g_path_get_dirname(filename)); + * whenever they like without xfdesktop having to do anything. If we start + * supporting sub-directories we may want to re-think that assumption */ + files = list_files_in_dir(filename); + if(!files) return NULL; @@ -389,7 +400,8 @@ xfce_backdrop_choose_chronological(const gchar *filename) /* We don't cache the list at all. This way the user can add/remove items * whenever they like without xfdesktop having to do anything. If we start * supporting sub-directories we may want to re-think that assumption */ - files = list_files_in_dir(g_path_get_dirname(filename)); + files = list_files_in_dir(filename); + if(!files) return NULL; @@ -908,7 +920,7 @@ xfce_backdrop_get_image_style(XfceBackdrop *backdrop) * * Sets the image that should be used with the #XfceBackdrop. The image will * be composited on top of the color (or color gradient). To clear the image, - * use this call with a @filename argument of %NULL. + * use this call with a @filename argument of %NULL. Makes a copy of @filename. **/ void xfce_backdrop_set_image_filename(XfceBackdrop *backdrop, const gchar *filename) @@ -973,6 +985,8 @@ xfce_backdrop_cycle_backdrop(XfceBackdrop *backdrop) xfce_backdrop_set_image_filename(backdrop, new_backdrop); g_signal_emit(G_OBJECT(backdrop), backdrop_signals[BACKDROP_CYCLE], 0); } + + g_free(new_backdrop); } static gboolean @@ -1614,6 +1628,9 @@ xfce_backdrop_file_ready_cb(GObject *source_object, TRACE("entering"); + /* Finished with the file, clean it up */ + g_object_unref(file); + /* If this fails then close the loader, it will only display the selected * backdrop color */ if(input_stream == NULL) { diff --git a/src/xfce-desktop.c b/src/xfce-desktop.c index e7d5b45..d59a92a 100644 --- a/src/xfce-desktop.c +++ b/src/xfce-desktop.c @@ -366,7 +366,10 @@ backdrop_changed_cb(XfceBackdrop *backdrop, gpointer user_data) GdkRectangle rect; GdkRegion *clip_region = NULL; gint i, monitor = -1, current_workspace; - +#ifdef G_ENABLE_DEBUG + gchar *monitor_name = NULL; +#endif + TRACE("entering"); g_return_if_fail(XFCE_IS_DESKTOP(desktop)); @@ -395,9 +398,13 @@ backdrop_changed_cb(XfceBackdrop *backdrop, gpointer user_data) if(monitor == -1) return; +#ifdef G_ENABLE_DEBUG + monitor_name = gdk_screen_get_monitor_plug_name(gscreen, monitor); + + DBG("backdrop changed for workspace %d, monitor %d (%s)", current_workspace, monitor, monitor_name); - DBG("backdrop changed for workspace %d, monitor %d (%s)", - current_workspace, monitor, gdk_screen_get_monitor_plug_name(gscreen, monitor)); + g_free(monitor_name); +#endif if(xfce_desktop_get_n_monitors(desktop) > 1 && xfce_workspace_get_xinerama_stretch(desktop->priv->workspaces[current_workspace])) { @@ -864,7 +871,7 @@ static void xfce_desktop_finalize(GObject *object) { XfceDesktop *desktop = XFCE_DESKTOP(object); - + g_object_unref(G_OBJECT(desktop->priv->channel)); g_free(desktop->priv->property_prefix); @@ -1055,14 +1062,13 @@ xfce_desktop_unrealize(GtkWidget *widget) gchar property_name[128]; g_return_if_fail(XFCE_IS_DESKTOP(desktop)); - - if(gtk_major_version > 2 - || (gtk_major_version == 2 && gtk_minor_version >= 13)) - { - g_signal_handlers_disconnect_by_func(G_OBJECT(desktop->priv->gscreen), - G_CALLBACK(xfce_desktop_monitors_changed), - desktop); - } + + /* disconnect all the xfconf settings to this desktop */ + xfconf_g_property_unbind_all(G_OBJECT(desktop)); + + g_signal_handlers_disconnect_by_func(G_OBJECT(desktop->priv->gscreen), + G_CALLBACK(xfce_desktop_monitors_changed), + desktop); if(gtk_widget_get_mapped(widget)) gtk_widget_unmap(widget); diff --git a/src/xfce-workspace.c b/src/xfce-workspace.c index b9f5cf8..68339ef 100644 --- a/src/xfce-workspace.c +++ b/src/xfce-workspace.c @@ -160,6 +160,8 @@ xfce_workspace_change_backdrop(XfceWorkspace *workspace, } else { g_snprintf(buf, sizeof(buf), "%smonitor%s/workspace%d/last-image", workspace->priv->property_prefix, monitor_name, workspace->priv->workspace_num); + + g_free(monitor_name); } /* Update the property so that xfdesktop won't show the same image every diff --git a/src/xfdesktop-file-icon-manager.c b/src/xfdesktop-file-icon-manager.c index 815562f..63d00c4 100644 --- a/src/xfdesktop-file-icon-manager.c +++ b/src/xfdesktop-file-icon-manager.c @@ -2027,11 +2027,18 @@ xfdesktop_file_icon_manager_queue_thumbnail(XfdesktopFileIconManager *fmanager, GFile *temp = g_file_new_for_path(thumbnail_file); xfdesktop_icon_set_thumbnail_file(XFDESKTOP_ICON(icon), temp); } + + g_free(thumbnail_file); } else { xfdesktop_thumbnailer_queue_thumbnail(fmanager->priv->thumbnailer, path); } } + + if(path) { + g_free(path); + path = NULL; + } } /* Adds a single icon to the icon view, popping from the top of the stack. @@ -2688,6 +2695,8 @@ xfdesktop_file_icon_manager_files_ready(GFileEnumerator *enumerator, g_signal_connect(fmanager->priv->metadata_monitor, "changed", G_CALLBACK(xfdesktop_file_icon_manager_metadata_changed), fmanager); + + g_object_unref(metadata_location); g_free(location); } } else { @@ -2807,11 +2816,11 @@ static void xfdesktop_file_icon_manager_load_removable_media(XfdesktopFileIconManager *fmanager) { GList *volumes, *l; - + /* ensure we don't re-enter if we're already set up */ if(fmanager->priv->removable_icons) return; - + if(!fmanager->priv->volume_monitor) fmanager->priv->volume_monitor = g_volume_monitor_get(); @@ -3747,6 +3756,8 @@ xfdesktop_file_icon_manager_update_image(GtkWidget *widget, { g_object_unref(file); file = g_file_new_for_path(thumbfile); - xfdesktop_icon_set_thumbnail_file(icon, file); + xfdesktop_icon_set_thumbnail_file(icon, g_object_ref(file)); } + + g_object_unref(file); } _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org https://mail.xfce.org/mailman/listinfo/xfce4-commits