improved notification system
[geeqie.git] / src / cache_maint.c
index 53154ea..e317230 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Geeqie
  * (C) 2006 John Ellis
- * Copyright (C) 2008 The Geeqie Team
+ * Copyright (C) 2008 - 2009 The Geeqie Team
  *
  * Author: John Ellis
  *
@@ -15,6 +15,7 @@
 
 #include "cache.h"
 #include "filedata.h"
+#include "layout.h"
 #include "thumb.h"
 #include "thumb_standard.h"
 #include "ui_fileops.h"
@@ -35,8 +36,8 @@ struct _CMData
        GtkWidget *spinner;
        GtkWidget *button_stop;
        GtkWidget *button_close;
-       gint clear;
-       gint metadata;
+       gboolean clear;
+       gboolean metadata;
 };
 
 #define PURGE_DIALOG_WIDTH 400
@@ -48,6 +49,7 @@ struct _CMData
  *-------------------------------------------------------------------
  */
 
+#if 0
 static gint extension_truncate(gchar *path, const gchar *ext)
 {
        gint l;
@@ -64,6 +66,7 @@ static gint extension_truncate(gchar *path, const gchar *ext)
 
        return TRUE;
 }
+#endif
 
 static gchar *extension_find_dot(gchar *path)
 {
@@ -80,7 +83,7 @@ static gchar *extension_find_dot(gchar *path)
        return dot;
 }
 
-static gint isempty(const gchar *path)
+static gboolean isempty(const gchar *path)
 {
        DIR *dp;
        struct dirent *dir;
@@ -130,27 +133,27 @@ static void cache_maintain_home_stop(CMData *cm)
        gtk_widget_set_sensitive(cm->button_close, TRUE);
 }
 
-static gint cache_maintain_home_cb(gpointer data)
+static gboolean cache_maintain_home_cb(gpointer data)
 {
        CMData *cm = data;
        GList *dlist = NULL;
        GList *list = NULL;
        FileData *fd;
-       gint just_done = FALSE;
-       gint still_have_a_file = TRUE;
-       gint base_length;
+       gboolean just_done = FALSE;
+       gboolean still_have_a_file = TRUE;
+       gsize base_length;
        const gchar *cache_folder;
 
        if (cm->metadata)
                {
-               cache_folder = GQ_CACHE_RC_METADATA;
+               cache_folder = get_metadata_cache_dir();
                }
        else
                {
-               cache_folder = GQ_CACHE_RC_THUMB;
+               cache_folder = get_thumbnails_cache_dir();
                }
 
-       base_length = strlen(homedir()) + strlen("/") + strlen(cache_folder);
+       base_length = strlen(cache_folder);
 
        if (!cm->list)
                {
@@ -168,7 +171,7 @@ static gint cache_maintain_home_cb(gpointer data)
                {
                cm->done_list = g_list_prepend(cm->done_list, fd);
 
-               if (filelist_read(fd->path, &list, &dlist))
+               if (filelist_read(fd, &list, &dlist))
                        {
                        GList *work;
 
@@ -179,7 +182,7 @@ static gint cache_maintain_home_cb(gpointer data)
                        while (work)
                                {
                                FileData *fd_list = work->data;
-                               gchar *path_buf = strdup(fd_list->path);
+                               gchar *path_buf = g_strdup(fd_list->path);
                                gchar *dot;
 
                                dot = extension_find_dot(path_buf);
@@ -189,7 +192,7 @@ static gint cache_maintain_home_cb(gpointer data)
                                    (strlen(path_buf) > base_length && !isfile(path_buf + base_length)) )
                                        {
                                        if (dot) *dot = '.';
-                                       if (!unlink_file(path_buf)) printf("failed to delete:%s\n", path_buf);
+                                       if (!unlink_file(path_buf)) log_printf("failed to delete:%s\n", path_buf);
                                        }
                                else
                                        {
@@ -212,7 +215,7 @@ static gint cache_maintain_home_cb(gpointer data)
                        {
                        if (!still_have_a_file && !dlist && cm->list->next && !rmdir_utf8(fd->path))
                                {
-                               printf("Unable to delete dir: %s\n", fd->path);
+                               log_printf("Unable to delete dir: %s\n", fd->path);
                                }
                        }
                else
@@ -220,7 +223,7 @@ static gint cache_maintain_home_cb(gpointer data)
                        /* must re-check for an empty dir */
                        if (isempty(fd->path) && cm->list->next && !rmdir_utf8(fd->path))
                                {
-                               printf("Unable to delete dir: %s\n", fd->path);
+                               log_printf("Unable to delete dir: %s\n", fd->path);
                                }
                        }
 
@@ -266,33 +269,32 @@ static void cache_maintain_home_stop_cb(GenericDialog *gd, gpointer data)
 }
 
 /* sorry for complexity (cm->done_list), but need it to remove empty dirs */
-void cache_maintain_home(gint metadata, gint clear, GtkWidget *parent)
+void cache_maintain_home(gboolean metadata, gboolean clear, GtkWidget *parent)
 {
        CMData *cm;
-       GList *dlist = NULL;
-       gchar *base;
+       GList *dlist;
+       FileData *dir_fd;
        const gchar *msg;
        const gchar *cache_folder;
        GtkWidget *hbox;
 
        if (metadata)
                {
-               cache_folder = GQ_CACHE_RC_METADATA;
+               cache_folder = get_metadata_cache_dir();
                }
        else
                {
-               cache_folder = GQ_CACHE_RC_THUMB;
+               cache_folder = get_thumbnails_cache_dir();
                }
 
-       base = g_strconcat(homedir(), "/", cache_folder, NULL);
-
-       if (!filelist_read(base, NULL, &dlist))
+       dir_fd = file_data_new_simple(cache_folder);
+       if (!filelist_read(dir_fd, NULL, &dlist))
                {
-               g_free(base);
+               file_data_unref(dir_fd);
                return;
                }
 
-       dlist = g_list_append(dlist, file_data_new_simple(base));
+       dlist = g_list_append(dlist, dir_fd);
 
        cm = g_new0(CMData, 1);
        cm->list = dlist;
@@ -314,7 +316,7 @@ void cache_maintain_home(gint metadata, gint clear, GtkWidget *parent)
                }
 
        cm->gd = generic_dialog_new(_("Maintenance"),
-                                   GQ_WMCLASS, "main_maintenance",
+                                   "main_maintenance",
                                    parent, FALSE,
                                    NULL, cm);
        cm->gd->cancel_cb = cache_maintain_home_close_cb;
@@ -346,6 +348,7 @@ void cache_maintain_home(gint metadata, gint clear, GtkWidget *parent)
        cm->idle_id = g_idle_add(cache_maintain_home_cb, cm);
 }
 
+#if 0
 /* This checks all files in ~/GQ_RC_DIR/thumbnails and
  * removes them if thay have no source counterpart.
  * (this assumes all cache files have an extension of 4 chars including '.')
@@ -355,6 +358,7 @@ gint cache_maintain_home_dir(const gchar *dir, gint recursive, gint clear)
        gchar *base;
        gint base_length;
        GList *dlist = NULL;
+       FileData *dir_fd;
        GList *flist = NULL;
        gint still_have_a_file = FALSE;
 
@@ -362,8 +366,10 @@ gint cache_maintain_home_dir(const gchar *dir, gint recursive, gint clear)
 
        base_length = strlen(homedir()) + strlen("/") + strlen(GQ_CACHE_RC_THUMB);
        base = g_strconcat(homedir(), "/", GQ_CACHE_RC_THUMB, dir, NULL);
+       dir_fd = file_data_new_simple(base);
+       g_free(base);
 
-       if (filelist_read(base, &flist, &dlist))
+       if (filelist_read(dir_fd, &flist, &dlist))
                {
                GList *work;
 
@@ -377,7 +383,7 @@ gint cache_maintain_home_dir(const gchar *dir, gint recursive, gint clear)
                                DEBUG_1("Deleting thumb dir: %s", fd->path);
                                if (!rmdir_utf8(fd->path))
                                        {
-                                       printf("Unable to delete dir: %s\n", fd->path);
+                                       log_printf("Unable to delete dir: %s\n", fd->path);
                                        }
                                }
                        else
@@ -401,7 +407,7 @@ gint cache_maintain_home_dir(const gchar *dir, gint recursive, gint clear)
                            (strlen(path) > base_length && !isfile(path + base_length)) )
                                {
                                if (dot) *dot = '.';
-                               if (!unlink_file(path)) printf("failed to delete:%s\n", path);
+                               if (!unlink_file(path)) log_printf("failed to delete:%s\n", path);
                                }
                        else
                                {
@@ -415,7 +421,7 @@ gint cache_maintain_home_dir(const gchar *dir, gint recursive, gint clear)
 
        filelist_free(dlist);
        filelist_free(flist);
-       g_free(base);
+       file_data_unref(dir_fd);
 
        return still_have_a_file;
 }
@@ -423,16 +429,19 @@ gint cache_maintain_home_dir(const gchar *dir, gint recursive, gint clear)
 /* This checks relative caches in dir/.thumbnails and
  * removes them if they have no source counterpart.
  */
-gint cache_maintain_dir(const gchar *dir, gint recursive, gint clear)
+gint cache_maintain_dir(FileData *dir_fd, gint recursive, gint clear)
 {
        GList *list = NULL;
        gchar *cachedir;
+       FileData *cachedir_fd;
        gint still_have_a_file = FALSE;
        GList *work;
 
-       cachedir = g_strconcat(dir, "/", GQ_CACHE_LOCAL_THUMB, NULL);
+       cachedir = g_build_filename(dir, GQ_CACHE_LOCAL_THUMB, NULL);
+       cachedir_fd = file_data_new_simple(cachedir);
+       g_free(cachedir);
 
-       filelist_read(cachedir, &list, NULL);
+       filelist_read(cachedir_fd, &list, NULL);
        work = list;
 
        while (work)
@@ -443,7 +452,7 @@ gint cache_maintain_dir(const gchar *dir, gint recursive, gint clear)
                fd = work->data;
                work = work->next;
 
-               source = g_strconcat(dir, "/", fd->name, NULL);
+               source = g_build_filename(dir->path, fd->name, NULL);
 
                if (clear ||
                    extension_truncate(source, GQ_CACHE_EXT_THUMB) ||
@@ -470,13 +479,13 @@ gint cache_maintain_dir(const gchar *dir, gint recursive, gint clear)
                }
 
        filelist_free(list);
-       g_free(cachedir);
+       file_data_unref(cachedir_fd);
 
        if (recursive)
                {
                list = NULL;
 
-               filelist_read(dir, NULL, &list);
+               filelist_read(dir_fd, NULL, &list);
                work = list;
                while (work)
                        {
@@ -491,6 +500,7 @@ gint cache_maintain_dir(const gchar *dir, gint recursive, gint clear)
 
        return still_have_a_file;
 }
+#endif
 
 static void cache_file_move(const gchar *src, const gchar *dest)
 {
@@ -504,7 +514,7 @@ static void cache_file_move(const gchar *src, const gchar *dest)
                }
 }
 
-void cache_maint_moved(FileData *fd)
+static void cache_maint_moved(FileData *fd)
 {
        gchar *base;
        mode_t mode = 0755;
@@ -514,7 +524,7 @@ void cache_maint_moved(FileData *fd)
        if (!src || !dest) return;
 
        base = cache_get_location(CACHE_TYPE_THUMB, dest, FALSE, &mode);
-       if (cache_ensure_dir_exists(base, mode))
+       if (recursive_mkdir_if_not_exists(base, mode))
                {
                gchar *buf;
                gchar *d;
@@ -533,12 +543,12 @@ void cache_maint_moved(FileData *fd)
                }
        else
                {
-               printf("Failed to create cache dir for move %s\n", base);
+               log_printf("Failed to create cache dir for move %s\n", base);
                }
        g_free(base);
 
        base = cache_get_location(CACHE_TYPE_METADATA, dest, FALSE, &mode);
-       if (cache_ensure_dir_exists(base, mode))
+       if (recursive_mkdir_if_not_exists(base, mode))
                {
                gchar *buf;
                gchar *d;
@@ -563,7 +573,7 @@ static void cache_file_remove(const gchar *path)
                }
 }
 
-void cache_maint_removed(FileData *fd)
+static void cache_maint_removed(FileData *fd)
 {
        gchar *buf;
 
@@ -583,7 +593,7 @@ void cache_maint_removed(FileData *fd)
                thumb_std_maint_removed(fd->path);
 }
 
-void cache_maint_copied(FileData *fd)
+static void cache_maint_copied(FileData *fd)
 {
        gchar *dest_base;
        gchar *src_cache;
@@ -593,7 +603,7 @@ void cache_maint_copied(FileData *fd)
        if (!src_cache) return;
 
        dest_base = cache_get_location(CACHE_TYPE_METADATA, fd->change->dest, FALSE, &mode);
-       if (cache_ensure_dir_exists(dest_base, mode))
+       if (recursive_mkdir_if_not_exists(dest_base, mode))
                {
                gchar *path;
 
@@ -609,6 +619,29 @@ void cache_maint_copied(FileData *fd)
        g_free(src_cache);
 }
 
+void cache_notify_cb(FileData *fd, NotifyType type, gpointer data)
+{
+       if (!(type & NOTIFY_CHANGE) || !fd->change) return;
+       
+       switch (fd->change->type)
+               {
+               case FILEDATA_CHANGE_MOVE:
+               case FILEDATA_CHANGE_RENAME:
+                       cache_maint_moved(fd);
+                       break;
+               case FILEDATA_CHANGE_COPY:
+                       cache_maint_copied(fd);
+                       break;
+               case FILEDATA_CHANGE_DELETE:
+                       cache_maint_removed(fd);
+                       break;
+               case FILEDATA_CHANGE_UNSPECIFIED:
+               case FILEDATA_CHANGE_WRITE_METADATA:
+                       break;
+               }
+}
+
+
 /*
  *-------------------------------------------------------------------
  * new cache maintenance utilities
@@ -638,7 +671,7 @@ struct _CleanData
        GList *list_dir;
 
        gint days;
-       gint clear;
+       gboolean clear;
 
        GtkWidget *button_close;
        GtkWidget *button_stop;
@@ -652,8 +685,8 @@ struct _CleanData
        gint count_total;
        gint count_done;
 
-       gint local;
-       gint recurse;
+       gboolean local;
+       gboolean recurse;
 
        gint idle_id;
 };
@@ -701,18 +734,18 @@ static void cache_manager_render_stop_cb(GenericDialog *fd, gpointer data)
        cache_manager_render_finish(cd);
 }
 
-static void cache_manager_render_folder(CleanData *cd, const gchar *path)
+static void cache_manager_render_folder(CleanData *cd, FileData *dir_fd)
 {
        GList *list_d = NULL;
        GList *list_f = NULL;
 
        if (cd->recurse)
                {
-               filelist_read(path, &list_f, &list_d);
+               filelist_read(dir_fd, &list_f, &list_d);
                }
        else
                {
-               filelist_read(path, &list_f, NULL);
+               filelist_read(dir_fd, &list_f, NULL);
                }
 
        list_f = filelist_filter(list_f, FALSE);
@@ -722,7 +755,7 @@ static void cache_manager_render_folder(CleanData *cd, const gchar *path)
        cd->list_dir = g_list_concat(list_d, cd->list_dir);
 }
 
-static gint cache_manager_render_file(CleanData *cd);
+static gboolean cache_manager_render_file(CleanData *cd);
 
 static void cache_manager_render_thumb_done_cb(ThumbLoader *tl, gpointer data)
 {
@@ -734,7 +767,7 @@ static void cache_manager_render_thumb_done_cb(ThumbLoader *tl, gpointer data)
        while (cache_manager_render_file(cd));
 }
 
-static gint cache_manager_render_file(CleanData *cd)
+static gboolean cache_manager_render_file(CleanData *cd)
 {
        if (cd->list)
                {
@@ -750,7 +783,7 @@ static gint cache_manager_render_file(CleanData *cd)
                                           cache_manager_render_thumb_done_cb,
                                           NULL, cd);
                thumb_loader_set_cache((ThumbLoader *)cd->tl, TRUE, cd->local, TRUE);
-               success = thumb_loader_start((ThumbLoader *)cd->tl, fd->path);
+               success = thumb_loader_start((ThumbLoader *)cd->tl, fd);
                if (success)
                        {
                        gtk_entry_set_text(GTK_ENTRY(cd->progress), fd->path);
@@ -772,7 +805,7 @@ static gint cache_manager_render_file(CleanData *cd)
                fd = cd->list_dir->data;
                cd->list_dir = g_list_remove(cd->list_dir, fd);
 
-               cache_manager_render_folder(cd, fd->path);
+               cache_manager_render_folder(cd, fd);
 
                file_data_unref(fd);
 
@@ -802,6 +835,7 @@ static void cache_manager_render_start_cb(GenericDialog *fd, gpointer data)
                }
        else
                {
+               FileData *dir_fd;
                gtk_widget_set_sensitive(cd->group, FALSE);
                gtk_widget_set_sensitive(cd->button_start, FALSE);
                gtk_widget_set_sensitive(cd->button_stop, TRUE);
@@ -809,7 +843,9 @@ static void cache_manager_render_start_cb(GenericDialog *fd, gpointer data)
 
                spinner_set_interval(cd->spinner, SPINNER_SPEED);
 
-               cache_manager_render_folder(cd, path);
+               dir_fd = file_data_new_simple(path);
+               cache_manager_render_folder(cd, dir_fd);
+               file_data_unref(dir_fd);
                while (cache_manager_render_file(cd));
                }
 
@@ -826,7 +862,7 @@ static void cache_manager_render_dialog(GtkWidget *widget, const gchar *path)
        cd = g_new0(CleanData, 1);
 
        cd->gd = generic_dialog_new(_("Create thumbnails"),
-                                   GQ_WMCLASS, "create_thumbnails",
+                                   "create_thumbnails",
                                    widget, FALSE,
                                    NULL, cd);
        gtk_window_set_default_size(GTK_WINDOW(cd->gd->dialog), PURGE_DIALOG_WIDTH, -1);
@@ -951,7 +987,7 @@ static gint cache_manager_standard_clean_clear_cb(gpointer data)
        return FALSE;
 }
 
-static void cache_manager_standard_clean_valid_cb(const gchar *path, gint valid, gpointer data)
+static void cache_manager_standard_clean_valid_cb(const gchar *path, gboolean valid, gpointer data)
 {
        CleanData *cd = data;
 
@@ -994,6 +1030,7 @@ static void cache_manager_standard_clean_start_cb(GenericDialog *gd, gpointer da
        CleanData *cd = data;
        GList *list;
        gchar *path;
+       FileData *dir_fd;
 
        if (cd->list || !GTK_WIDGET_SENSITIVE(cd->button_start)) return;
 
@@ -1003,22 +1040,25 @@ static void cache_manager_standard_clean_start_cb(GenericDialog *gd, gpointer da
 
        gtk_progress_bar_set_text(GTK_PROGRESS_BAR(cd->progress), _("running..."));
 
-       path = g_strconcat(homedir(), "/", THUMB_FOLDER_GLOBAL, "/", THUMB_FOLDER_NORMAL, NULL);
-       list = NULL;
-       filelist_read(path, &list, NULL);
+       path = g_build_filename(homedir(), THUMB_FOLDER_GLOBAL, THUMB_FOLDER_NORMAL, NULL);
+       dir_fd = file_data_new_simple(path);
+       filelist_read(dir_fd, &list, NULL);
        cd->list = list;
+       file_data_unref(dir_fd);
        g_free(path);
 
-       path = g_strconcat(homedir(), "/", THUMB_FOLDER_GLOBAL, "/", THUMB_FOLDER_LARGE, NULL);
-       list = NULL;
-       filelist_read(path, &list, NULL);
+       path = g_build_filename(homedir(), THUMB_FOLDER_GLOBAL, THUMB_FOLDER_LARGE, NULL);
+       dir_fd = file_data_new_simple(path);
+       filelist_read(dir_fd, &list, NULL);
        cd->list = g_list_concat(cd->list, list);
+       file_data_unref(dir_fd);
        g_free(path);
 
-       path = g_strconcat(homedir(), "/", THUMB_FOLDER_GLOBAL, "/", THUMB_FOLDER_FAIL, NULL);
-       list = NULL;
-       filelist_read(path, &list, NULL);
+       path = g_build_filename(homedir(), THUMB_FOLDER_GLOBAL, THUMB_FOLDER_FAIL, NULL);
+       dir_fd = file_data_new_simple(path);
+       filelist_read(dir_fd, &list, NULL);
        cd->list = g_list_concat(cd->list, list);
+       file_data_unref(dir_fd);
        g_free(path);
 
        cd->count_total = g_list_length(cd->list);
@@ -1035,7 +1075,7 @@ static void cache_manager_standard_clean_start_cb(GenericDialog *gd, gpointer da
                }
 }
 
-static void cache_manager_standard_process(GtkWidget *widget, gint clear)
+static void cache_manager_standard_process(GtkWidget *widget, gboolean clear)
 {
        CleanData *cd;
        const gchar *stock_id;
@@ -1056,7 +1096,7 @@ static void cache_manager_standard_process(GtkWidget *widget, gint clear)
                }
 
        cd->gd = generic_dialog_new(_("Maintenance"),
-                                   GQ_WMCLASS, "standard_maintenance",
+                                   "standard_maintenance",
                                    widget, FALSE,
                                    NULL, cd);
        cd->gd->cancel_cb = cache_manager_standard_clean_close_cb;
@@ -1114,7 +1154,7 @@ void cache_manager_main_clear_confirm(GtkWidget *parent)
        GenericDialog *gd;
 
        gd = generic_dialog_new(_("Clear cache"),
-                               GQ_WMCLASS, "clear_cache", parent, TRUE,
+                               "clear_cache", parent, TRUE,
                                dummy_cancel_cb, NULL);
        generic_dialog_add_message(gd, GTK_STOCK_DIALOG_QUESTION, _("Clear cache"),
                                   _("This will remove all thumbnails that have\nbeen saved to disk, continue?"));
@@ -1130,7 +1170,10 @@ static void cache_manager_main_clear_cb(GtkWidget *widget, gpointer data)
 
 static void cache_manager_render_cb(GtkWidget *widget, gpointer data)
 {
-       cache_manager_render_dialog(widget, homedir());
+       const gchar *path = layout_get_path(NULL);
+
+       if (!path || !*path) path = homedir();
+       cache_manager_render_dialog(widget, path);
 }
 
 static void cache_manager_metadata_clean_cb(GtkWidget *widget, gpointer data)
@@ -1149,16 +1192,29 @@ static void cache_manager_close_cb(GenericDialog *gd, gpointer data)
        cache_manager = NULL;
 }
 
+static GtkWidget *cache_manager_location_label(GtkWidget *group, const gchar *subdir)
+{
+       GtkWidget *label;
+       gchar *buf;
+       gchar *path;
+
+       path = g_build_filename(homedir(), subdir, NULL);
+       buf = g_strdup_printf(_("Location: %s"), path);
+       g_free(path);
+       label = pref_label_new(group, buf);
+       g_free(buf);
+       gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+       
+       return label;
+}
+
 void cache_manager_show(void)
 {
        GenericDialog *gd;
        GtkWidget *group;
        GtkWidget *button;
-       GtkWidget *label;
        GtkWidget *table;
        GtkSizeGroup *sizegroup;
-       gchar *buf;
-       gchar *title;
 
        if (cache_manager)
                {
@@ -1168,12 +1224,10 @@ void cache_manager_show(void)
 
        cache_manager = g_new0(CacheManager, 1);
 
-       title = g_strdup_printf("%s - %s", _("Cache Maintenance"), GQ_APPNAME);
-       cache_manager->dialog = generic_dialog_new(title,
-                                                  GQ_WMCLASS, "cache_manager",
+       cache_manager->dialog = generic_dialog_new(_("Cache Maintenance"),
+                                                  "cache_manager",
                                                   NULL, FALSE,
                                                   NULL, cache_manager);
-       g_free(title);
        gd = cache_manager->dialog;
 
        gd->cancel_cb = cache_manager_close_cb;
@@ -1186,10 +1240,7 @@ void cache_manager_show(void)
 
        group = pref_group_new(gd->vbox, FALSE, _("Thumbnail cache"), GTK_ORIENTATION_VERTICAL);
 
-       buf = g_strconcat(_("Location:"), " ", homedir(), "/", GQ_CACHE_RC_THUMB, NULL);
-       label = pref_label_new(group, buf);
-       gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-       g_free(buf);
+       cache_manager_location_label(group, get_thumbnails_cache_dir());
 
        table = pref_table_new(group, 2, 2, FALSE, FALSE);
 
@@ -1206,10 +1257,7 @@ void cache_manager_show(void)
 
        group = pref_group_new(gd->vbox, FALSE, _("Shared thumbnail cache"), GTK_ORIENTATION_VERTICAL);
 
-       buf = g_strconcat(_("Location:"), " ", homedir(), "/", THUMB_FOLDER_GLOBAL, NULL);
-       label = pref_label_new(group, buf);
-       gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-       g_free(buf);
+       cache_manager_location_label(group, THUMB_FOLDER_GLOBAL);
 
        table = pref_table_new(group, 2, 2, FALSE, FALSE);
 
@@ -1234,10 +1282,7 @@ void cache_manager_show(void)
 
        group = pref_group_new(gd->vbox, FALSE, _("Metadata"), GTK_ORIENTATION_VERTICAL);
 
-       buf = g_strconcat(_("Location:"), " ", homedir(), "/", GQ_CACHE_RC_METADATA, NULL);
-       label = pref_label_new(group, buf);
-       gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-       g_free(buf);
+       cache_manager_location_label(group, get_metadata_cache_dir());
 
        table = pref_table_new(group, 2, 1, FALSE, FALSE);
 
@@ -1248,3 +1293,4 @@ void cache_manager_show(void)
 
        gtk_widget_show(cache_manager->dialog->dialog);
 }
+/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */