[Xfce4-commits] [xfce/xfdesktop] 01/01: Don't load an image list unless we're cycling (Bug #11817)
noreply at xfce.org
noreply at xfce.org
Mon May 11 15:55:11 CEST 2015
This is an automated email from the git hooks/post-receive script.
eric pushed a commit to branch master
in repository xfce/xfdesktop.
commit b66e848e4806354b5731def32def11641eba3406
Author: Eric Koegel <eric.koegel at gmail.com>
Date: Mon May 11 14:07:02 2015 +0300
Don't load an image list unless we're cycling (Bug #11817)
There's no need to waste the CPU/memory keeping track of all the
images in a folder unless we're going to cycle over that list in
the future. This patch loads the list on demand as the wallpaper
cycling gets toggled.
---
src/xfce-backdrop.c | 113 +++++++++++++++++++++++++++++++--------------------
1 file changed, 69 insertions(+), 44 deletions(-)
diff --git a/src/xfce-backdrop.c b/src/xfce-backdrop.c
index 10da9da..c0d40d3 100644
--- a/src/xfce-backdrop.c
+++ b/src/xfce-backdrop.c
@@ -92,6 +92,12 @@ gchar *xfce_backdrop_choose_next (XfceBackdrop *backdrop);
gchar *xfce_backdrop_choose_random (XfceBackdrop *backdrop);
gchar *xfce_backdrop_choose_chronological(XfceBackdrop *backdrop);
+static void cb_xfce_backdrop_image_files_changed(GFileMonitor *monitor,
+ GFile *file,
+ GFile *other_file,
+ GFileMonitorEvent event,
+ gpointer user_data);
+
struct _XfceBackdropPriv
{
gint width, height;
@@ -248,6 +254,21 @@ xfce_backdrop_clear_cached_image(XfceBackdrop *backdrop)
backdrop->priv->pix = NULL;
}
+static void
+xfdesktop_backdrop_clear_directory_monitor(XfceBackdrop *backdrop)
+{
+ g_return_if_fail(XFCE_IS_BACKDROP(backdrop));
+
+ if(backdrop->priv->monitor) {
+ g_signal_handlers_disconnect_by_func(G_OBJECT(backdrop->priv->monitor),
+ G_CALLBACK(cb_xfce_backdrop_image_files_changed),
+ backdrop);
+
+ g_object_unref(backdrop->priv->monitor);
+ backdrop->priv->monitor = NULL;
+ }
+}
+
/* we compare by the collate key so the image listing is the same as how
* xfdesktop-settings displays the images */
static gint
@@ -266,11 +287,11 @@ compare_by_collate_key(const gchar *a, const gchar *b)
}
static void
-cb_xfce_backdrop__image_files_changed(GFileMonitor *monitor,
- GFile *file,
- GFile *other_file,
- GFileMonitorEvent event,
- gpointer user_data)
+cb_xfce_backdrop_image_files_changed(GFileMonitor *monitor,
+ GFile *file,
+ GFile *other_file,
+ GFileMonitorEvent event,
+ gpointer user_data)
{
XfceBackdrop *backdrop = XFCE_BACKDROP(user_data);
gchar *changed_file = NULL;
@@ -278,6 +299,11 @@ cb_xfce_backdrop__image_files_changed(GFileMonitor *monitor,
switch(event) {
case G_FILE_MONITOR_EVENT_CREATED:
+ if(!xfce_backdrop_get_cycle_backdrop(backdrop)) {
+ /* If we're not cycling, do nothing, it's faster :) */
+ break;
+ }
+
changed_file = g_file_get_path(file);
XF_DEBUG("file added: %s", changed_file);
@@ -303,6 +329,11 @@ cb_xfce_backdrop__image_files_changed(GFileMonitor *monitor,
(GCompareFunc)compare_by_collate_key);
break;
case G_FILE_MONITOR_EVENT_DELETED:
+ if(!xfce_backdrop_get_cycle_backdrop(backdrop)) {
+ /* If we're not cycling, do nothing, it's faster :) */
+ break;
+ }
+
changed_file = g_file_get_path(file);
XF_DEBUG("file deleted: %s", changed_file);
@@ -415,26 +446,26 @@ xfce_backdrop_load_image_files(XfceBackdrop *backdrop)
{
TRACE("entering");
- /* generate the image_files list if it doesn't exist and monitor that
- * directory so we can update the list */
- if(backdrop->priv->image_files == NULL && backdrop->priv->image_path) {
- gchar *dir_name = g_path_get_dirname(backdrop->priv->image_path);
- GFile *gfile = g_file_new_for_path(dir_name);
-
+ /* generate the image_files list if it doesn't exist and we're cycling
+ * backdrops */
+ if(backdrop->priv->image_files == NULL &&
+ backdrop->priv->image_path &&
+ xfce_backdrop_get_cycle_backdrop(backdrop)) {
backdrop->priv->image_files = list_image_files_in_dir(backdrop->priv->image_path);
- if(backdrop->priv->monitor) {
- g_signal_handlers_disconnect_by_func(G_OBJECT(backdrop->priv->monitor),
- G_CALLBACK(cb_xfce_backdrop__image_files_changed),
- backdrop);
+ xfdesktop_backdrop_clear_directory_monitor(backdrop);
+ }
- g_object_unref(backdrop->priv->monitor);
- }
+ /* Always monitor the directory even if we aren't cycling so we know if
+ * our current wallpaper has changed by an external program/script */
+ if(backdrop->priv->image_path && !backdrop->priv->monitor) {
+ gchar *dir_name = g_path_get_dirname(backdrop->priv->image_path);
+ GFile *gfile = g_file_new_for_path(dir_name);
- /* monitor the new directory for changes */
+ /* monitor the directory for changes */
backdrop->priv->monitor = g_file_monitor(gfile, G_FILE_MONITOR_NONE, NULL, NULL);
g_signal_connect(backdrop->priv->monitor, "changed",
- G_CALLBACK(cb_xfce_backdrop__image_files_changed),
+ G_CALLBACK(cb_xfce_backdrop_image_files_changed),
backdrop);
g_free(dir_name);
@@ -695,14 +726,7 @@ xfce_backdrop_finalize(GObject *object)
xfce_backdrop_clear_cached_image(backdrop);
- if(backdrop->priv->monitor) {
- g_signal_handlers_disconnect_by_func(G_OBJECT(backdrop->priv->monitor),
- G_CALLBACK(cb_xfce_backdrop__image_files_changed),
- backdrop);
-
- g_object_unref(backdrop->priv->monitor);
- backdrop->priv->monitor = NULL;
- }
+ xfdesktop_backdrop_clear_directory_monitor(backdrop);
/* Free the image files list */
if(backdrop->priv->image_files) {
@@ -1056,26 +1080,22 @@ xfce_backdrop_set_image_filename(XfceBackdrop *backdrop, const gchar *filename)
return;
/* We need to free the image_files if image_path changed directories */
- if(backdrop->priv->image_files) {
+ if(backdrop->priv->image_files || backdrop->priv->monitor) {
if(backdrop->priv->image_path)
old_dir = g_path_get_dirname(backdrop->priv->image_path);
if(filename)
new_dir = g_path_get_dirname(filename);
- /* Directories did change, free list */
+ /* Directories did change */
if(g_strcmp0(old_dir, new_dir) != 0) {
- g_list_free_full(backdrop->priv->image_files, g_free);
- backdrop->priv->image_files = NULL;
+ /* Free the image list if we had one */
+ if(backdrop->priv->image_files) {
+ g_list_free_full(backdrop->priv->image_files, g_free);
+ backdrop->priv->image_files = NULL;
+ }
/* release the directory monitor */
- if(backdrop->priv->monitor) {
- g_signal_handlers_disconnect_by_func(G_OBJECT(backdrop->priv->monitor),
- G_CALLBACK(cb_xfce_backdrop__image_files_changed),
- backdrop);
-
- g_object_unref(backdrop->priv->monitor);
- backdrop->priv->monitor = NULL;
- }
+ xfdesktop_backdrop_clear_directory_monitor(backdrop);
}
g_free(old_dir);
@@ -1334,12 +1354,17 @@ xfce_backdrop_set_cycle_backdrop(XfceBackdrop *backdrop,
/* Start or stop the backdrop changing */
xfce_backdrop_set_cycle_timer(backdrop,
xfce_backdrop_get_cycle_timer(backdrop));
- }
- /* If we're not cycling anymore, free the image files list */
- if(!backdrop->priv->cycle_backdrop && backdrop->priv->image_files) {
- g_list_free_full(backdrop->priv->image_files, g_free);
- backdrop->priv->image_files = NULL;
+ if(cycle_backdrop) {
+ /* We're cycling now, so load up an image list */
+ xfce_backdrop_load_image_files(backdrop);
+ }
+ else if(backdrop->priv->image_files)
+ {
+ /* we're not cycling anymore, free the image files list */
+ g_list_free_full(backdrop->priv->image_files, g_free);
+ backdrop->priv->image_files = NULL;
+ }
}
}
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the Xfce4-commits
mailing list