static void cache_manager_standard_clean_start_cb(GenericDialog *gd, gpointer data) { CleanData *cd = data; GList *list; gchar *path; FileData *dir_fd; if (cd->list || !gtk_widget_get_sensitive(cd->button_start)) return; gtk_widget_set_sensitive(cd->button_start, FALSE); gtk_widget_set_sensitive(cd->button_stop, TRUE); gtk_widget_set_sensitive(cd->button_close, FALSE); gtk_progress_bar_set_text(GTK_PROGRESS_BAR(cd->progress), _("running...")); path = g_build_filename(homedir(), THUMB_FOLDER_GLOBAL, THUMB_FOLDER_NORMAL, NULL); dir_fd = file_data_new_dir(path); filelist_read(dir_fd, &list, NULL); cd->list = list; file_data_unref(dir_fd); g_free(path); path = g_build_filename(homedir(), THUMB_FOLDER_GLOBAL, THUMB_FOLDER_LARGE, NULL); dir_fd = file_data_new_dir(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_build_filename(homedir(), THUMB_FOLDER_GLOBAL, THUMB_FOLDER_FAIL, NULL); dir_fd = file_data_new_dir(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); cd->count_done = 0; /* start iterating */ if (cd->clear) { cd->idle_id = g_idle_add(cache_manager_standard_clean_clear_cb, cd); } else { cache_manager_standard_clean_valid_cb(NULL, TRUE, cd); } }
static void cache_manager_render_start_cb(GenericDialog *fd, gpointer data) { CleanData *cd = data; gchar *path; if (cd->list || !gtk_widget_get_sensitive(cd->button_start)) return; path = remove_trailing_slash((gtk_entry_get_text(GTK_ENTRY(cd->entry)))); parse_out_relatives(path); if (!isdir(path)) { warning_dialog(_("Invalid folder"), _("The specified folder can not be found."), GTK_STOCK_DIALOG_WARNING, cd->gd->dialog); } 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); gtk_widget_set_sensitive(cd->button_close, FALSE); spinner_set_interval(cd->spinner, SPINNER_SPEED); dir_fd = file_data_new_dir(path); cache_manager_render_folder(cd, dir_fd); file_data_unref(dir_fd); while (cache_manager_render_file(cd)); } g_free(path); }
static void collect_manager_refresh(void) { GList *list; GList *work; FileData *dir_fd; dir_fd = file_data_new_dir(get_collections_dir()); filelist_read(dir_fd, &list, NULL); file_data_unref(dir_fd); work = collection_manager_entry_list; while (work && list) { CollectManagerEntry *entry; GList *list_step; entry = work->data; work = work->next; list_step = list; while (list_step && entry) { FileData *fd; fd = list_step->data; list_step = list_step->next; if (strcmp(fd->path, entry->path) == 0) { list = g_list_remove(list, fd); file_data_unref(fd); entry = NULL; } else { collect_manager_entry_free(entry); } } } work = list; while (work) { FileData *fd; fd = work->data; work = work->next; collect_manager_entry_new(fd->path); } filelist_free(list); }
static void vdtree_setup_root(ViewDir *vd) { const gchar *path = G_DIR_SEPARATOR_S; FileData *fd; fd = file_data_new_dir(path); vdtree_add_by_data(vd, fd, NULL); vdtree_expand_by_data(vd, fd, TRUE); vdtree_populate_path(vd, fd, FALSE, FALSE); }
static void vd_rename_finished_cb(gboolean success, const gchar *new_path, gpointer data) { ViewDir *vd = data; if (success) { FileData *fd = file_data_new_dir(new_path); GtkTreeIter iter; if (vd_find_row(vd, fd, &iter)) { tree_view_row_make_visible(GTK_TREE_VIEW(vd->view), &iter, TRUE); } file_data_unref(fd); } }
gboolean vdtree_populate_path_by_iter(ViewDir *vd, GtkTreeIter *iter, gboolean force, FileData *target_fd) { GtkTreeModel *store; GList *list; GList *work; GList *old; time_t current_time; GtkTreeIter child; NodeData *nd; gboolean add_hidden = FALSE; gchar *link = NULL; store = gtk_tree_view_get_model(GTK_TREE_VIEW(vd->view)); gtk_tree_model_get(store, iter, DIR_COLUMN_POINTER, &nd, -1); if (!nd) return FALSE; current_time = time(NULL); if (nd->expanded) { if (!nd->fd || !isdir(nd->fd->path)) { if (vd->click_fd == nd->fd) vd->click_fd = NULL; if (vd->drop_fd == nd->fd) vd->drop_fd = NULL; gtk_tree_store_remove(GTK_TREE_STORE(store), iter); vdtree_node_free(nd); return FALSE; } if (!force && current_time - nd->last_update < 2) { DEBUG_1("Too frequent update of %s", nd->fd->path); return TRUE; } file_data_check_changed_files(nd->fd); /* make sure we have recent info */ } /* when hidden files are not enabled, and the user enters a hidden path, * allow the tree to display that path by specifically inserting the hidden entries */ if (!options->file_filter.show_hidden_files && target_fd && strncmp(nd->fd->path, target_fd->path, strlen(nd->fd->path)) == 0) { gint n; n = strlen(nd->fd->path); if (target_fd->path[n] == G_DIR_SEPARATOR && target_fd->path[n+1] == '.') add_hidden = TRUE; } if (nd->expanded && (!force && !add_hidden) && nd->fd->version == nd->version) return TRUE; vdtree_busy_push(vd); filelist_read(nd->fd, NULL, &list); if (add_hidden) { gint n; gchar *name8; n = strlen(nd->fd->path) + 1; while (target_fd->path[n] != '\0' && target_fd->path[n] != G_DIR_SEPARATOR) n++; name8 = g_strndup(target_fd->path, n); if (isdir(name8)) { list = g_list_prepend(list, file_data_new_dir(name8)); } g_free(name8); } old = NULL; if (gtk_tree_model_iter_children(store, &child, iter)) { do { NodeData *cnd; gtk_tree_model_get(store, &child, DIR_COLUMN_POINTER, &cnd, -1); old = g_list_prepend(old, cnd); } while (gtk_tree_model_iter_next(store, &child)); } work = list; while (work) { FileData *fd; fd = work->data; work = work->next; if (strcmp(fd->name, ".") == 0 || strcmp(fd->name, "..") == 0) { file_data_unref(fd); } else { NodeData *cnd; cnd = vdtree_find_iter_by_fd(vd, iter, fd, &child); if (cnd) { if (cnd->expanded && cnd->version != fd->version) { vdtree_populate_path_by_iter(vd, &child, FALSE, target_fd); } gtk_tree_store_set(GTK_TREE_STORE(store), &child, DIR_COLUMN_NAME, fd->name, -1); if (islink(fd->path)) { link = realpath(fd->path, NULL); } else { link = NULL; } gtk_tree_store_set(GTK_TREE_STORE(store), &child, DIR_COLUMN_LINK, link, -1); cnd->version = fd->version; old = g_list_remove(old, cnd); file_data_unref(fd); } else { vdtree_add_by_data(vd, fd, iter); } } } work = old; while (work) { NodeData *cnd = work->data; work = work->next; if (vd->click_fd == cnd->fd) vd->click_fd = NULL; if (vd->drop_fd == cnd->fd) vd->drop_fd = NULL; if (vdtree_find_iter_by_data(vd, iter, cnd, &child)) { gtk_tree_store_remove(GTK_TREE_STORE(store), &child); vdtree_node_free(cnd); } } g_list_free(old); g_list_free(list); vdtree_busy_pop(vd); nd->expanded = TRUE; nd->last_update = current_time; g_free(link); return TRUE; }
/* sorry for complexity (cm->done_list), but need it to remove empty dirs */ void cache_maintain_home(gboolean metadata, gboolean clear, GtkWidget *parent) { CMData *cm; GList *dlist; FileData *dir_fd; const gchar *msg; const gchar *cache_folder; GtkWidget *hbox; if (metadata) { cache_folder = get_metadata_cache_dir(); } else { cache_folder = get_thumbnails_cache_dir(); } dir_fd = file_data_new_dir(cache_folder); if (!filelist_read(dir_fd, NULL, &dlist)) { file_data_unref(dir_fd); return; } dlist = g_list_append(dlist, dir_fd); cm = g_new0(CMData, 1); cm->list = dlist; cm->done_list = NULL; cm->clear = clear; cm->metadata = metadata; if (metadata) { msg = _("Removing old metadata..."); } else if (clear) { msg = _("Clearing cached thumbnails..."); } else { msg = _("Removing old thumbnails..."); } cm->gd = generic_dialog_new(_("Maintenance"), "main_maintenance", parent, FALSE, NULL, cm); cm->gd->cancel_cb = cache_maintain_home_close_cb; cm->button_close = generic_dialog_add_button(cm->gd, GTK_STOCK_CLOSE, NULL, cache_maintain_home_close_cb, FALSE); gtk_widget_set_sensitive(cm->button_close, FALSE); cm->button_stop = generic_dialog_add_button(cm->gd, GTK_STOCK_STOP, NULL, cache_maintain_home_stop_cb, FALSE); generic_dialog_add_message(cm->gd, NULL, msg, NULL); gtk_window_set_default_size(GTK_WINDOW(cm->gd->dialog), PURGE_DIALOG_WIDTH, -1); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(cm->gd->vbox), hbox, FALSE, FALSE, 5); gtk_widget_show(hbox); cm->entry = gtk_entry_new(); gtk_widget_set_can_focus(cm->entry, FALSE); gtk_editable_set_editable(GTK_EDITABLE(cm->entry), FALSE); gtk_box_pack_start(GTK_BOX(hbox), cm->entry, TRUE, TRUE, 0); gtk_widget_show(cm->entry); cm->spinner = spinner_new(NULL, SPINNER_SPEED); gtk_box_pack_start(GTK_BOX(hbox), cm->spinner, FALSE, FALSE, 0); gtk_widget_show(cm->spinner); gtk_widget_show(cm->gd->dialog); cm->idle_id = g_idle_add(cache_maintain_home_cb, cm); }
static gboolean vdlist_populate(ViewDir *vd, gboolean clear) { GtkListStore *store; GList *work; GtkTreeIter iter; gboolean valid; gchar *filepath; GList *old_list; gboolean ret; FileData *fd; SortType sort_type = SORT_NAME; gboolean sort_ascend = TRUE; old_list = VDLIST(vd)->list; ret = filelist_read(vd->dir_fd, NULL, &VDLIST(vd)->list); VDLIST(vd)->list = filelist_sort(VDLIST(vd)->list, sort_type, sort_ascend); /* add . and .. */ if (options->file_filter.show_parent_directory && strcmp(vd->dir_fd->path, G_DIR_SEPARATOR_S) != 0) { filepath = g_build_filename(vd->dir_fd->path, "..", NULL); fd = file_data_new_dir(filepath); VDLIST(vd)->list = g_list_prepend(VDLIST(vd)->list, fd); g_free(filepath); } if (options->file_filter.show_dot_directory) { filepath = g_build_filename(vd->dir_fd->path, ".", NULL); fd = file_data_new_dir(filepath); VDLIST(vd)->list = g_list_prepend(VDLIST(vd)->list, fd); g_free(filepath); } store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(vd->view))); if (clear) gtk_list_store_clear(store); valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(store), &iter, NULL); work = VDLIST(vd)->list; while (work) { gint match; GdkPixbuf *pixbuf; const gchar *date = ""; gboolean done = FALSE; fd = work->data; if (access_file(fd->path, R_OK | X_OK) && fd->name) { if (fd->name[0] == '.' && fd->name[1] == '\0') { pixbuf = vd->pf->open; } else if (fd->name[0] == '.' && fd->name[1] == '.' && fd->name[2] == '\0') { pixbuf = vd->pf->parent; } else { pixbuf = vd->pf->close; if (vd->layout && vd->layout->options.show_directory_date) date = text_from_time(fd->date); } } else { pixbuf = vd->pf->deny; } while (!done) { FileData *old_fd = NULL; if (valid) { gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, DIR_COLUMN_POINTER, &old_fd, -1); if (fd == old_fd) { match = 0; } else { match = filelist_sort_compare_filedata_full(fd, old_fd, sort_type, sort_ascend); if (match == 0) g_warning("multiple fd for the same path"); } } else { match = -1; } if (match < 0) { GtkTreeIter new; if (valid) { gtk_list_store_insert_before(store, &new, &iter); } else { gtk_list_store_append(store, &new); } gtk_list_store_set(store, &new, DIR_COLUMN_POINTER, fd, DIR_COLUMN_ICON, pixbuf, DIR_COLUMN_NAME, fd->name, DIR_COLUMN_DATE, date, -1); done = TRUE; } else if (match > 0)