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

📄 utilops.c

📁 Gqview,Linux下基于GTK+库写成的轻量级而能丰富的图像浏览程序。
💻 C
📖 第 1 页 / 共 5 页
字号:
	else if (source_list->next)		{		multiple = TRUE;		}	else		{		path = g_strdup(source_list->data);		path_list_free(source_list);		source_list = NULL;		multiple = FALSE;		}	if (copy)		{		title = _("Copy - GQview");		op_text = _("_Copy");		if (path)			{			text = _("Copy file");			}		else			{			text = _("Copy multiple files");			}		stock_id = GTK_STOCK_COPY;		}	else		{		title = _("Move - GQview");		op_text = _("_Move");		if (path)			{			text = _("Move file");			}		else			{			text = _("Move multiple files");			}		stock_id = GTK_STOCK_OK;		}	fd = file_util_file_dlg(title, "GQview", "dlg_copymove", parent,				file_util_move_cancel_cb, NULL);	generic_dialog_add_message(GENERIC_DIALOG(fd), NULL, text, NULL);	if (path)		{		GtkWidget *box;		box = pref_box_new(GENERIC_DIALOG(fd)->vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);		pref_label_new(box, _("File name:"));		pref_label_new(box, filename_from_path(path));		}	label = pref_label_new(GENERIC_DIALOG(fd)->vbox, _("Choose the destination folder."));	gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);	pref_spacer(GENERIC_DIALOG(fd)->vbox, 0);	file_dialog_add_button(fd, stock_id, op_text, file_util_move_cb, TRUE);	file_dialog_add_path_widgets(fd, NULL, dest_path, "move_copy", NULL, NULL);	fd->type = copy;	fd->source_path = path;	fd->source_list = source_list;	fd->multiple_files = multiple;	gtk_widget_show(GENERIC_DIALOG(fd)->dialog);}void file_util_move(const gchar *source_path, GList *source_list, const gchar *dest_path, GtkWidget *parent){	real_file_util_move(source_path, source_list, dest_path, FALSE, parent);}void file_util_copy(const gchar *source_path, GList *source_list, const gchar *dest_path, GtkWidget *parent){	real_file_util_move(source_path, source_list, dest_path, TRUE, parent);}void file_util_move_simple(GList *list, const gchar *dest_path){	if (!list) return;	if (!dest_path)		{		path_list_free(list);		return;		}	if (!list->next)		{		const gchar *source;		gchar *dest;		source = list->data;		dest = concat_dir_and_file(dest_path, filename_from_path(source));		file_util_move_single(file_data_single_new(source, dest, FALSE));		g_free(dest);		path_list_free(list);		return;		}	file_util_move_multiple(file_data_multiple_new(list, dest_path, FALSE));}void file_util_copy_simple(GList *list, const gchar *dest_path){	if (!list) return;	if (!dest_path)		{		path_list_free(list);		return;		}	if (!list->next)		{		const gchar *source;		gchar *dest;		source = list->data;		dest = concat_dir_and_file(dest_path, filename_from_path(source));		file_util_move_single(file_data_single_new(source, dest, TRUE));		g_free(dest);		path_list_free(list);		return;		}	file_util_move_multiple(file_data_multiple_new(list, dest_path, TRUE));}/* *-------------------------------------------------------------------------- * Safe Delete *-------------------------------------------------------------------------- */static gint file_util_safe_number(gint64 free_space){	gint n = 0;	gint64 total = 0;	GList *list;	GList *work;	gint sorted = FALSE;	gint warned = FALSE;	if (!filelist_read(safe_delete_path, &list, NULL)) return 0;	work = list;	while (work)		{		FileData *fd;		gint v;	       		fd = work->data;		work = work->next;		v = (gint)strtol(fd->name, NULL, 10);		if (v >= n) n = v + 1;		total += fd->size;		}	while (list &&	       (free_space < 0 || total + free_space > (gint64)safe_delete_size * 1048576) )		{		FileData *fd;		if (!sorted)			{			list = filelist_sort(list, SORT_NAME, TRUE);			sorted = TRUE;			}		fd = list->data;		list = g_list_remove(list, fd);		if (debug) printf("expunging from trash for space: %s\n", fd->name);		if (!unlink_file(fd->path) && !warned)			{			file_util_warning_dialog(_("Delete failed"),						 _("Unable to remove old file from trash folder"),						 GTK_STOCK_DIALOG_WARNING, NULL);			warned = TRUE;			}		total -= fd->size;		file_data_free(fd);		}	filelist_free(list);	return n;}void file_util_trash_clear(void){	file_util_safe_number(-1);}static gchar *file_util_safe_dest(const gchar *path){	gint n;	n = file_util_safe_number(filesize(path));	return g_strdup_printf("%s/%06d_%s", safe_delete_path, n, filename_from_path(path));}static void file_util_safe_del_toggle_cb(GtkWidget *button, gpointer data){	safe_delete_enable = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button));}static void file_util_safe_del_close_cb(GtkWidget *dialog, gpointer data){	GenericDialog **gd = data;	*gd = NULL;}static gint file_util_unlink(const gchar *path){	static GenericDialog *gd = NULL;	gchar *result = NULL;	gint success = TRUE;	if (!isfile(path)) return FALSE;	if (!safe_delete_enable)		{		return unlink_file(path);		}	if (!isdir(safe_delete_path))		{		if (debug) printf("creating trash: %s\n", safe_delete_path);		if (!safe_delete_path || !mkdir_utf8(safe_delete_path, 0755))			{			result = _("Could not create folder");			success = FALSE;			}		}	if (success)		{		gchar *dest;		dest = file_util_safe_dest(path);		if (dest)			{			if (debug) printf("safe deleting %s to %s\n", path, dest);			success = move_file(path, dest);			}		else			{			success = FALSE;			}		if (!success && !access_file(path, W_OK))			{			result = _("Permission denied");			}		g_free(dest);		}	if (result && !gd)		{		GtkWidget *button;		gchar *buf;		buf = g_strdup_printf(_("Unable to access or create the trash folder.\n\"%s\""), safe_delete_path);		gd = file_util_warning_dialog(result, buf, GTK_STOCK_DIALOG_WARNING, NULL);		g_free(buf);		button = gtk_check_button_new_with_label(_("Turn off safe delete"));		g_signal_connect(G_OBJECT(button), "toggled",				 G_CALLBACK(file_util_safe_del_toggle_cb), NULL);		gtk_box_pack_start(GTK_BOX(gd->vbox), button, FALSE, FALSE, 0);		gtk_widget_show(button);		g_signal_connect(G_OBJECT(gd->dialog), "destroy",				 G_CALLBACK(file_util_safe_del_close_cb), &gd);		}	return success;}static void box_append_safe_delete_status(GenericDialog *gd){	GtkWidget *label;	gchar *buf;	buf = g_strdup_printf(_("Safe delete: %s"), (safe_delete_enable) ? _("on") : _("off"));	label = pref_label_new(gd->vbox, buf);	g_free(buf);	gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);	gtk_widget_set_sensitive(label, FALSE);}/* *-------------------------------------------------------------------------- * Delete routines *-------------------------------------------------------------------------- *//* * delete multiple files */static void file_util_delete_multiple_ok_cb(GenericDialog *gd, gpointer data);static void file_util_delete_multiple_cancel_cb(GenericDialog *gd, gpointer data);static void file_util_delete_multiple_ok_cb(GenericDialog *gd, gpointer data){	GList *source_list = data;	while (source_list)		{		gchar *path = source_list->data;		source_list = g_list_remove(source_list, path);		if (!file_util_unlink(path))			{			if (source_list)				{				GenericDialog *d;				gchar *text;				d = file_util_gen_dlg(_("Delete failed"), "GQview", "dlg_confirm",						      NULL, TRUE,						      file_util_delete_multiple_cancel_cb, source_list);				text = g_strdup_printf(_("Unable to delete file:\n %s\n Continue multiple delete operation?"), path);				generic_dialog_add_message(d, GTK_STOCK_DIALOG_WARNING, NULL, text);				g_free(text);				generic_dialog_add_button(d, GTK_STOCK_GO_FORWARD, _("Co_ntinue"),							  file_util_delete_multiple_ok_cb, TRUE);				gtk_widget_show(d->dialog);				}			else				{				gchar *text;								text = g_strdup_printf(_("Unable to delete file:\n%s"), path);				file_util_warning_dialog(_("Delete failed"), text, GTK_STOCK_DIALOG_ERROR, NULL);				g_free(text);				}			g_free(path);			return;			}		else			{			file_maint_removed(path, source_list);			}		g_free(path);		}}static void file_util_delete_multiple_cancel_cb(GenericDialog *gd, gpointer data){	GList *source_list = data;	path_list_free(source_list);}static void file_util_delete_multiple_review_skip(GenericDialog *gd, gint next){	GtkWidget *button_back;	GtkWidget *button_next;	GtkWidget *button_label;	GList *list;	GList *list_point;	const gchar *path;	gchar *buf;	list = gd->data;	button_back = g_object_get_data(G_OBJECT(gd->dialog), "button_back");	button_next = g_object_get_data(G_OBJECT(gd->dialog), "button_next");	button_label = g_object_get_data(G_OBJECT(gd->dialog), "button_label");	list_point = g_object_get_data(G_OBJECT(gd->dialog), "list_point");	if (!list || !button_label) return;	if (list_point)		{		if (next)			{			if (list_point->next) list_point = list_point->next;			}		else			{			if (list_point->prev) list_point = list_point->prev;			}		}	else		{		list_point = list;		}	if (!list_point) return;	path = list_point->data;	buf = g_strdup_printf(_("File %d of %d"),			      g_list_index(list, (gpointer)path) + 1,			      g_list_length(list));	gtk_label_set_text(GTK_LABEL(button_label), buf);	g_free(buf);	gtk_widget_set_sensitive(button_back, (list_point->prev != NULL) );	gtk_widget_set_sensitive(button_next, (list_point->next != NULL) );	generic_dialog_image_set(gd, path);	g_object_set_data(G_OBJECT(gd->dialog), "list_point", list_point);}static void file_util_delete_multiple_review_back(GtkWidget *button, gpointer data){	GenericDialog *gd = data;	file_util_delete_multiple_review_skip(gd, FALSE);}static void file_util_delete_multiple_review_next(GtkWidget *button, gpointer data){	GenericDialog *gd = data;	file_util_delete_multiple_review_skip(gd, TRUE);}static void file_util_delete_multiple_review_button_cb(ImageWindow *imd, gint button, guint32 time,						       gdouble x, gdouble y, guint state, gpointer data){	if (button == 1)		{		file_util_delete_multiple_review_next(NULL, data);		}	else if (button == 2 || button == 3)		{		file_util_delete_multiple_review_back(NULL, data);		}}static void file_util_delete_multiple_review_scroll_cb(ImageWindow *imd, GdkScrollDirection direction, guint32 time,						       gdouble x, gdouble y, guint state, gpointer data){	if (direction == GDK_SCROLL_UP)		{		file_util_delete_multiple_review_back(NULL, data);		}	else if (direction == GDK_SCROLL_DOWN)		{		file_util_delete_multiple_review_next(NULL, data);		}}static void file_util_delete_multiple(GList *source_list, GtkWidget *parent){	if (!confirm_delete)		{		file_util_delete_multiple_ok_cb(NULL, source_list);		}	else		{		GenericDialog *gd;		GtkWidget *hbox;		GtkWidget *button;		GtkWidget *label;		ImageWindow *imd;		gchar *buf;		gd = file_util_gen_dlg(_("Delete files - GQview"),					"GQview", "dlg_confirm", parent, TRUE,					file_util_delete_multiple_cancel_cb, source_list);		generic_dialog_add_message(gd, NULL, _("Delete multiple files"), NULL);		generic_dialog_add_image(gd, NULL, NULL, NULL, NULL, TRUE);		imd = g_object_get_data(G_OBJECT(gd->dialog), "img_image");		image_set_button_func(imd, file_util_delete_multiple_review_button_cb, gd);		image_set_scroll_func(imd, file_util_delete_multiple_review_scroll_cb, gd);		hbox = pref_box_new(gd->vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_BUTTON_GAP);		button = pref_button_new(hbox, GTK_STOCK_GO_BACK, NULL, TRUE,					 G_CALLBACK(file_util_delete_multiple_review_back), gd);		gtk_widget_set_sensitive(button, FALSE);		g_object_set_data(G_OBJECT(gd->dialog), "button_back", button);		button = pref_button_new(hbox, GTK_STOCK_GO_FORWARD, NULL, TRUE,					 G_CALLBACK(file_util_delete_multiple_review_next), gd);		g_object_set_data(G_OBJECT(gd->dialog), "button_next", button);		buf = g_strdup_printf(_("Review %d files"), g_list_length(source_list) );		label = pref_label_new(hbox, buf);		g_free(buf);		g_object_set_data(G_OBJECT(gd->dialog), "button_label", label);

⌨️ 快捷键说明

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