⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cache_maint.c

📁 Gqview,Linux下基于GTK+库写成的轻量级而能丰富的图像浏览程序。
💻 C
📖 第 1 页 / 共 2 页
字号:
};typedef struct _CleanData CleanData;struct _CleanData{	GenericDialog *gd;	ThumbLoaderStd *tl;	GList *list;	GList *list_dir;	gint days;	gint clear;	GtkWidget *button_close;	GtkWidget *button_stop;	GtkWidget *button_start;	GtkWidget *progress;	GtkWidget *spinner;	GtkWidget *group;	GtkWidget *entry;	gint count_total;	gint count_done;	gint local;	gint recurse;	gint idle_id;};static void cache_manager_render_reset(CleanData *cd){	path_list_free(cd->list);	cd->list = NULL;	path_list_free(cd->list_dir);	cd->list_dir = NULL;	thumb_loader_free((ThumbLoader *)cd->tl);	cd->tl = NULL;}static void cache_manager_render_close_cb(GenericDialog *fd, gpointer data){	CleanData *cd = data;	if (!GTK_WIDGET_SENSITIVE(cd->button_close)) return;	cache_manager_render_reset(cd);	generic_dialog_close(cd->gd);	g_free(cd);}static void cache_manager_render_finish(CleanData *cd){	cache_manager_render_reset(cd);	gtk_entry_set_text(GTK_ENTRY(cd->progress), _("done"));	spinner_set_interval(cd->spinner, -1);	gtk_widget_set_sensitive(cd->group, TRUE);	gtk_widget_set_sensitive(cd->button_start, TRUE);	gtk_widget_set_sensitive(cd->button_stop, FALSE);	gtk_widget_set_sensitive(cd->button_close, TRUE);}static void cache_manager_render_stop_cb(GenericDialog *fd, gpointer data){	CleanData *cd = data;	cache_manager_render_finish(cd);}static void cache_manager_render_folder(CleanData *cd, const gchar *path){	GList *list_d = NULL;	GList *list_f = NULL;	if (cd->recurse)		{		path_list(path, &list_f, &list_d);		}	else		{		path_list(path, &list_f, NULL);		}	list_f = path_list_filter(list_f, FALSE);	list_d = path_list_filter(list_d, TRUE);	cd->list = g_list_concat(list_f, cd->list);	cd->list_dir = g_list_concat(list_d, cd->list_dir);}static gint cache_manager_render_file(CleanData *cd);static void cache_manager_render_thumb_done_cb(ThumbLoader *tl, gpointer data){	CleanData *cd = data;	thumb_loader_free((ThumbLoader *)cd->tl);	cd->tl = NULL;	while (cache_manager_render_file(cd));}static gint cache_manager_render_file(CleanData *cd){	if (cd->list)		{		gchar *path;		gint success;		path = cd->list->data;		cd->list = g_list_remove(cd->list, path);		cd->tl = (ThumbLoaderStd *)thumb_loader_new(thumb_max_width, thumb_max_height);		thumb_loader_set_callbacks((ThumbLoader *)cd->tl,					   cache_manager_render_thumb_done_cb,					   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, path);		if (success)			{			gtk_entry_set_text(GTK_ENTRY(cd->progress), path);			}		else			{			thumb_loader_free((ThumbLoader *)cd->tl);			cd->tl = NULL;			}		g_free(path);		return (!success);		}	else if (cd->list_dir)		{		gchar *path;		path = cd->list_dir->data;		cd->list_dir = g_list_remove(cd->list_dir, path);		cache_manager_render_folder(cd, path);		g_free(path);		return TRUE;		}	cache_manager_render_finish(cd);	return FALSE;}static void cache_manager_render_start_cb(GenericDialog *fd, gpointer data){	CleanData *cd = data;	gchar *path;	if (cd->list || !GTK_WIDGET_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		{		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);		cache_manager_render_folder(cd, path);		while (cache_manager_render_file(cd));		}	g_free(path);}static void cache_manager_render_dialog(GtkWidget *widget, const gchar *path){	CleanData *cd;	GtkWidget *hbox;	GtkWidget *label;	GtkWidget *button;	cd = g_new0(CleanData, 1);	cd->gd = generic_dialog_new(_("Create thumbnails"),				    "GQview", "create_thumbnails",				    widget, FALSE,				    NULL, cd);	gtk_window_set_default_size(GTK_WINDOW(cd->gd->dialog), PURGE_DIALOG_WIDTH, -1);	cd->gd->cancel_cb = cache_manager_render_close_cb;	cd->button_close = generic_dialog_add_button(cd->gd, GTK_STOCK_CLOSE, NULL,						     cache_manager_render_close_cb, FALSE);	cd->button_start = generic_dialog_add_button(cd->gd, GTK_STOCK_OK, _("S_tart"),						     cache_manager_render_start_cb, FALSE);	cd->button_stop = generic_dialog_add_button(cd->gd, GTK_STOCK_STOP, NULL,						    cache_manager_render_stop_cb, FALSE);	gtk_widget_set_sensitive(cd->button_stop, FALSE);	generic_dialog_add_message(cd->gd, NULL, _("Create thumbnails"), NULL);	hbox = pref_box_new(cd->gd->vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, 0);	pref_spacer(hbox, PREF_PAD_INDENT);	cd->group = pref_box_new(hbox, TRUE, GTK_ORIENTATION_VERTICAL, PREF_PAD_GAP);	hbox = pref_box_new(cd->group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);	pref_label_new(hbox, _("Folder:"));	label = tab_completion_new(&cd->entry, path, NULL, NULL);	tab_completion_add_select_button(cd->entry,_("Select folder") , TRUE);	gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);	gtk_widget_show(label);	pref_checkbox_new_int(cd->group, _("Include subfolders"), FALSE, &cd->recurse);	button = pref_checkbox_new_int(cd->group, _("Store thumbnails local to source images"), FALSE, &cd->local);	gtk_widget_set_sensitive(button, thumbnail_spec_standard);	pref_line(cd->gd->vbox, PREF_PAD_SPACE);	hbox = pref_box_new(cd->gd->vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);	cd->progress = gtk_entry_new();	GTK_WIDGET_UNSET_FLAGS(cd->progress, GTK_CAN_FOCUS);	gtk_editable_set_editable(GTK_EDITABLE(cd->progress), FALSE);	gtk_entry_set_text(GTK_ENTRY(cd->progress), _("click start to begin"));	gtk_box_pack_start(GTK_BOX(hbox), cd->progress, TRUE, TRUE, 0);	gtk_widget_show(cd->progress);	cd->spinner = spinner_new(NULL, -1);	gtk_box_pack_start(GTK_BOX(hbox), cd->spinner, FALSE, FALSE, 0);	gtk_widget_show(cd->spinner);	cd->list = NULL;	gtk_widget_show(cd->gd->dialog);}static void cache_manager_standard_clean_close_cb(GenericDialog *gd, gpointer data){	CleanData *cd = data;	if (!GTK_WIDGET_SENSITIVE(cd->button_close)) return;	generic_dialog_close(cd->gd);	thumb_loader_std_thumb_file_validate_cancel(cd->tl);	path_list_free(cd->list);	g_free(cd);}static void cache_manager_standard_clean_done(CleanData *cd){	gtk_widget_set_sensitive(cd->button_stop, FALSE);	gtk_widget_set_sensitive(cd->button_close, TRUE);	gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(cd->progress), 1.0);	gtk_progress_bar_set_text(GTK_PROGRESS_BAR(cd->progress), _("done"));	if (cd->idle_id != -1)		{		g_source_remove(cd->idle_id);		cd->idle_id = -1;		}	thumb_loader_std_thumb_file_validate_cancel(cd->tl);	cd->tl = NULL;	path_list_free(cd->list);	cd->list = NULL;}static void cache_manager_standard_clean_stop_cb(GenericDialog *gd, gpointer data){	CleanData *cd = data;	cache_manager_standard_clean_done(cd);}static gint cache_manager_standard_clean_clear_cb(gpointer data){	CleanData *cd = data;	if (cd->list)		{		gchar *next_path;		next_path = cd->list->data;		cd->list = g_list_remove(cd->list, next_path);		if (debug) printf("thumb removed: %s\n", next_path);		unlink_file(next_path);		g_free(next_path);		cd->count_done++;		if (cd->count_total != 0)			{			gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(cd->progress),						      (gdouble)cd->count_done / cd->count_total);			}		return TRUE;		}	cd->idle_id = -1;	cache_manager_standard_clean_done(cd);	return FALSE;}static void cache_manager_standard_clean_valid_cb(const gchar *path, gint valid, gpointer data){	CleanData *cd = data;	if (path)		{		if (!valid)			{			if (debug) printf("thumb cleaned: %s\n", path);			unlink_file(path);			}		cd->count_done++;		if (cd->count_total != 0)			{			gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(cd->progress),						      (gdouble)cd->count_done / cd->count_total);			}		}	cd->tl = NULL;	if (cd->list)		{		gchar *next_path;		next_path = cd->list->data;		cd->list = g_list_remove(cd->list, next_path);			cd->tl = thumb_loader_std_thumb_file_validate(next_path, cd->days,							      cache_manager_standard_clean_valid_cb, cd);		g_free(next_path);		}	else		{		cache_manager_standard_clean_done(cd);		}}static void cache_manager_standard_clean_start_cb(GenericDialog *gd, gpointer data){	CleanData *cd = data;	GList *list;	gchar *path;	if (cd->list || !GTK_WIDGET_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_strconcat(homedir(), "/", THUMB_FOLDER, "/", THUMB_FOLDER_NORMAL, NULL);	list = NULL;	path_list(path, &list, NULL);	cd->list = list;	g_free(path);	path = g_strconcat(homedir(), "/", THUMB_FOLDER, "/", THUMB_FOLDER_LARGE, NULL);	list = NULL;	path_list(path, &list, NULL);	cd->list = g_list_concat(cd->list, list);	g_free(path);	path = g_strconcat(homedir(), "/", THUMB_FOLDER, "/", THUMB_FOLDER_FAIL, NULL);	list = NULL;	path_list(path, &list, NULL);	cd->list = g_list_concat(cd->list, list);	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_standard_process(GtkWidget *widget, gint clear){	CleanData *cd;	const gchar *stock_id;	const gchar *msg;	cd = g_new0(CleanData, 1);	cd->clear = clear;	if (clear)		{		stock_id = GTK_STOCK_DELETE;		msg = _("Clearing thumbnails...");		}	else		{		stock_id = GTK_STOCK_CLEAR;		msg = _("Removing old thumbnails...");		}	cd->gd = generic_dialog_new(_("Maintenance"),				    "GQview", "standard_maintenance",				    widget, FALSE,				    NULL, cd);	cd->gd->cancel_cb = cache_manager_standard_clean_close_cb;	cd->button_close = generic_dialog_add_button(cd->gd, GTK_STOCK_CLOSE, NULL,						     cache_manager_standard_clean_close_cb, FALSE);	cd->button_start = generic_dialog_add_button(cd->gd, GTK_STOCK_OK, _("S_tart"),						     cache_manager_standard_clean_start_cb, FALSE);	cd->button_stop = generic_dialog_add_button(cd->gd, GTK_STOCK_STOP, NULL,						    cache_manager_standard_clean_stop_cb, FALSE);	gtk_widget_set_sensitive(cd->button_stop, FALSE);	generic_dialog_add_message(cd->gd, stock_id, msg, NULL);	cd->progress = gtk_progress_bar_new();	gtk_progress_bar_set_text(GTK_PROGRESS_BAR(cd->progress), _("click start to begin"));	gtk_box_pack_start(GTK_BOX(cd->gd->vbox), cd->progress, FALSE, FALSE, 0);	gtk_widget_show(cd->progress);	cd->days = 30;	cd->tl = NULL;	cd->idle_id = -1;	gtk_widget_show(cd->gd->dialog);}static void cache_manager_standard_clean_cb(GtkWidget *widget, gpointer data){	cache_manager_standard_process(widget, FALSE);}static void cache_manager_standard_clear_cb(GtkWidget *widget, gpointer data){	cache_manager_standard_process(widget, TRUE);}static void cache_manager_gqview_clean_cb(GtkWidget *widget, gpointer data){	cache_maintain_home(FALSE, FALSE, widget);}static void dummy_cancel_cb(GenericDialog *gd, gpointer data){	/* no op, only so cancel button appears */}static void cache_manager_gqview_clear_ok_cb(GenericDialog *gd, gpointer data){	cache_maintain_home(FALSE, TRUE, NULL);}void cache_manager_gqview_clear_confirm(GtkWidget *parent){	GenericDialog *gd;	gd = generic_dialog_new(_("Clear cache"),				"GQview", "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?"));	generic_dialog_add_button(gd, GTK_STOCK_OK, NULL, cache_manager_gqview_clear_ok_cb, TRUE);	gtk_widget_show(gd->dialog);}static void cache_manager_gqview_clear_cb(GtkWidget *widget, gpointer data){	cache_manager_gqview_clear_confirm(widget);}static void cache_manager_render_cb(GtkWidget *widget, gpointer data){	cache_manager_render_dialog(widget, homedir());}static void cache_manager_metadata_clean_cb(GtkWidget *widget, gpointer data){	cache_maintain_home(TRUE, FALSE, widget);}static CacheManager *cache_manager = NULL;static void cache_manager_close_cb(GenericDialog *gd, gpointer data){	generic_dialog_close(gd);	g_free(cache_manager);	cache_manager = NULL;}void cache_manager_show(void){	GenericDialog *gd;	GtkWidget *group;	GtkWidget *button;	GtkWidget *label;	GtkWidget *table;	GtkSizeGroup *sizegroup;	gchar *buf;	if (cache_manager)		{		gtk_window_present(GTK_WINDOW(cache_manager->dialog->dialog));		return;		}	cache_manager = g_new0(CacheManager, 1);	cache_manager->dialog = generic_dialog_new(_("Cache Maintenance - GQview"),						   "GQiew", "cache_manager",						   NULL, FALSE,						   NULL, cache_manager);	gd = cache_manager->dialog;	gd->cancel_cb = cache_manager_close_cb;	generic_dialog_add_button(gd, GTK_STOCK_CLOSE, NULL,				  cache_manager_close_cb, FALSE);	generic_dialog_add_message(gd, NULL, _("Cache and Data Maintenance"), NULL);	sizegroup = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);	group = pref_group_new(gd->vbox, FALSE, _("GQview thumbnail cache"), GTK_ORIENTATION_VERTICAL);	buf = g_strconcat(_("Location:"), " ", homedir(), "/", GQVIEW_CACHE_RC_THUMB, NULL);	label = pref_label_new(group, buf);	gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);	g_free(buf);	table = pref_table_new(group, 2, 2, FALSE, FALSE);	button = pref_table_button(table, 0, 0, GTK_STOCK_CLEAR, _("Clean up"), FALSE,				   G_CALLBACK(cache_manager_gqview_clean_cb), cache_manager);	gtk_size_group_add_widget(sizegroup, button);	pref_table_label(table, 1, 0, _("Remove orphaned or outdated thumbnails."), 0.0);	button = pref_table_button(table, 0, 1, GTK_STOCK_DELETE, _("Clear cache"), FALSE,				   G_CALLBACK(cache_manager_gqview_clear_cb), cache_manager);	gtk_size_group_add_widget(sizegroup, button);	pref_table_label(table, 1, 1, _("Delete all cached thumbnails."), 0.0);	group = pref_group_new(gd->vbox, FALSE, _("Shared thumbnail cache"), GTK_ORIENTATION_VERTICAL);	buf = g_strconcat(_("Location:"), " ", homedir(), "/", THUMB_FOLDER, NULL);	label = pref_label_new(group, buf);	gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);	g_free(buf);	table = pref_table_new(group, 2, 2, FALSE, FALSE);	button = pref_table_button(table, 0, 0, GTK_STOCK_CLEAR, _("Clean up"), FALSE,				   G_CALLBACK(cache_manager_standard_clean_cb), cache_manager);	gtk_size_group_add_widget(sizegroup, button);	pref_table_label(table, 1, 0, _("Remove orphaned or outdated thumbnails."), 0.0);	button = pref_table_button(table, 0, 1, GTK_STOCK_DELETE, _("Clear cache"), FALSE,				   G_CALLBACK(cache_manager_standard_clear_cb), cache_manager);	gtk_size_group_add_widget(sizegroup, button);	pref_table_label(table, 1, 1, _("Delete all cached thumbnails."), 0.0);	group = pref_group_new(gd->vbox, FALSE, _("Create thumbnails"), GTK_ORIENTATION_VERTICAL);	table = pref_table_new(group, 2, 1, FALSE, FALSE);	button = pref_table_button(table, 0, 1, GTK_STOCK_EXECUTE, _("Render"), FALSE,				   G_CALLBACK(cache_manager_render_cb), cache_manager);	gtk_size_group_add_widget(sizegroup, button);	pref_table_label(table, 1, 1, _("Render thumbnails for a specific folder."), 0.0);	group = pref_group_new(gd->vbox, FALSE, _("Metadata"), GTK_ORIENTATION_VERTICAL);		buf = g_strconcat(_("Location:"), " ", homedir(), "/", GQVIEW_CACHE_RC_METADATA, NULL);	label = pref_label_new(group, buf);	gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);	g_free(buf);	table = pref_table_new(group, 2, 1, FALSE, FALSE);	button = pref_table_button(table, 0, 0, GTK_STOCK_CLEAR, _("Clean up"), FALSE,				   G_CALLBACK(cache_manager_metadata_clean_cb), cache_manager);	gtk_size_group_add_widget(sizegroup, button);	pref_table_label(table, 1, 0, _("Remove orphaned keywords and comments."), 0.0);	gtk_widget_show(cache_manager->dialog->dialog);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -