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

📄 img-view.c

📁 Gqview,Linux下基于GTK+库写成的轻量级而能丰富的图像浏览程序。
💻 C
📖 第 1 页 / 共 3 页
字号:
	imd = view_window_active_image(vw);	file_util_copy(image_get_path(imd), NULL, NULL, imd->widget);}static void view_move_cb(GtkWidget *widget, gpointer data){	ViewWindow *vw = data;	ImageWindow *imd;	imd = view_window_active_image(vw);	file_util_move(image_get_path(imd), NULL, NULL, imd->widget);}static void view_rename_cb(GtkWidget *widget, gpointer data){	ViewWindow *vw = data;	ImageWindow *imd;	imd = view_window_active_image(vw);	file_util_rename(image_get_path(imd), NULL, imd->widget);}static void view_delete_cb(GtkWidget *widget, gpointer data){	ViewWindow *vw = data;	ImageWindow *imd;	imd = view_window_active_image(vw);	file_util_delete(image_get_path(imd), NULL, imd->widget);}static void view_fullscreen_cb(GtkWidget *widget, gpointer data){	ViewWindow *vw = data;	view_fullscreen_toggle(vw, FALSE);}static void view_slideshow_start_cb(GtkWidget *widget, gpointer data){	ViewWindow *vw = data;	view_slideshow_start(vw);}static void view_slideshow_stop_cb(GtkWidget *widget, gpointer data){	ViewWindow *vw = data;	view_slideshow_stop(vw);}static void view_slideshow_pause_cb(GtkWidget *widget, gpointer data){	ViewWindow *vw = data;	slideshow_pause_toggle(vw->ss);}static void view_close_cb(GtkWidget *widget, gpointer data){	ViewWindow *vw = data;	view_window_close(vw);}static GtkWidget *view_popup_menu(ViewWindow *vw){	GtkWidget *menu;	GtkWidget *item;	menu = popup_menu_short_lived();	menu_item_add_stock(menu, _("Zoom _in"), GTK_STOCK_ZOOM_IN, G_CALLBACK(view_zoom_in_cb), vw);	menu_item_add_stock(menu, _("Zoom _out"), GTK_STOCK_ZOOM_OUT, G_CALLBACK(view_zoom_out_cb), vw);	menu_item_add_stock(menu, _("Zoom _1:1"), GTK_STOCK_ZOOM_100, G_CALLBACK(view_zoom_1_1_cb), vw);	menu_item_add_stock(menu, _("Fit image to _window"), GTK_STOCK_ZOOM_FIT, G_CALLBACK(view_zoom_fit_cb), vw);	menu_item_add_divider(menu);	item = submenu_add_edit(menu, NULL, G_CALLBACK(view_edit_cb), vw);	menu_item_add_divider(item);	menu_item_add(item, _("Set as _wallpaper"), G_CALLBACK(view_wallpaper_cb), vw);	submenu_add_alter(menu, G_CALLBACK(view_alter_cb), vw);	menu_item_add_stock(menu, _("_Properties"), GTK_STOCK_PROPERTIES, G_CALLBACK(view_info_cb), vw);	menu_item_add_stock(menu, _("View in _new window"), GTK_STOCK_NEW, G_CALLBACK(view_new_window_cb), vw);	menu_item_add_divider(menu);	menu_item_add_stock(menu, _("_Copy..."), GTK_STOCK_COPY, G_CALLBACK(view_copy_cb), vw);	menu_item_add(menu, _("_Move..."), G_CALLBACK(view_move_cb), vw);	menu_item_add(menu, _("_Rename..."), G_CALLBACK(view_rename_cb), vw);	menu_item_add_stock(menu, _("_Delete..."), GTK_STOCK_DELETE, G_CALLBACK(view_delete_cb), vw);	menu_item_add_divider(menu);	if (vw->ss)		{		menu_item_add(menu, _("_Stop slideshow"), G_CALLBACK(view_slideshow_stop_cb), vw);		if (slideshow_paused(vw->ss))			{			item = menu_item_add(menu, _("Continue slides_how"),					     G_CALLBACK(view_slideshow_pause_cb), vw);			}		else			{			item = menu_item_add(menu, _("Pause slides_how"),					     G_CALLBACK(view_slideshow_pause_cb), vw);			}		}	else		{		item = menu_item_add(menu, _("_Start slideshow"), G_CALLBACK(view_slideshow_start_cb), vw);		gtk_widget_set_sensitive(item, (vw->list != NULL) || view_window_contains_collection(vw));		item = menu_item_add(menu, _("Pause slides_how"), G_CALLBACK(view_slideshow_pause_cb), vw);		gtk_widget_set_sensitive(item, FALSE);		}	if (vw->fs)		{		menu_item_add(menu, _("Exit _full screen"), G_CALLBACK(view_fullscreen_cb), vw);		}	else		{		menu_item_add(menu, _("_Full screen"), G_CALLBACK(view_fullscreen_cb), vw);		}	menu_item_add_divider(menu);	menu_item_add_stock(menu, _("C_lose window"), GTK_STOCK_CLOSE, G_CALLBACK(view_close_cb), vw);	return menu;}/* *------------------------------------------------------------------- * dnd confirm dir *------------------------------------------------------------------- */typedef struct {	ViewWindow *vw;	GList *list;} CViewConfirmD;static void view_dir_list_cancel(GtkWidget *widget, gpointer data){	/* do nothing */}static void view_dir_list_do(ViewWindow *vw, GList *list, gint skip, gint recurse){	GList *work;	view_window_set_list(vw, NULL);	work = list;	while (work)		{		gchar *path = work->data;		work = work->next;		if (isdir(path))			{			if (!skip)				{				GList *list = NULL;				if (recurse)					{					list = path_list_recursive(path);					}				else					{					path_list(path, &list, NULL);					list = path_list_sort(list);					list = path_list_filter(list, FALSE);					}				if (list) vw->list = g_list_concat(vw->list, list);				}			}		else			{			/* FIXME: no filtering here */			vw->list = g_list_append(vw->list, g_strdup(path));			}		}	if (vw->list)		{		gchar *path;		vw->list_pointer = vw->list;		path = vw->list->data;		image_change_path(vw->imd, path, image_zoom_get_default(vw->imd, zoom_mode));		work = vw->list->next;		if (enable_read_ahead && work)			{			path = work->data;			image_prebuffer_set(vw->imd, path);			}		}	else		{		image_change_path(vw->imd, NULL, image_zoom_get_default(vw->imd, zoom_mode));		}}static void view_dir_list_add(GtkWidget *widget, gpointer data){	CViewConfirmD *d = data;	view_dir_list_do(d->vw, d->list, FALSE, FALSE);}static void view_dir_list_recurse(GtkWidget *widget, gpointer data){	CViewConfirmD *d = data;	view_dir_list_do(d->vw, d->list, FALSE, TRUE);}static void view_dir_list_skip(GtkWidget *widget, gpointer data){	CViewConfirmD *d = data;	view_dir_list_do(d->vw, d->list, TRUE, FALSE);}static void view_dir_list_destroy(GtkWidget *widget, gpointer data){	CViewConfirmD *d = data;        path_list_free(d->list);        g_free(d);}static GtkWidget *view_confirm_dir_list(ViewWindow *vw, GList *list){	GtkWidget *menu;	CViewConfirmD *d;	d = g_new(CViewConfirmD, 1);	d->vw = vw;	d->list = list;	menu = popup_menu_short_lived();	g_signal_connect(G_OBJECT(menu), "destroy",			 G_CALLBACK(view_dir_list_destroy), d);	menu_item_add_stock(menu, _("Dropped list includes folders."), GTK_STOCK_DND_MULTIPLE, NULL, NULL);	menu_item_add_divider(menu);	menu_item_add_stock(menu, _("_Add contents"), GTK_STOCK_OK, G_CALLBACK(view_dir_list_add), d);	menu_item_add_stock(menu, _("Add contents _recursive"), GTK_STOCK_ADD, G_CALLBACK(view_dir_list_recurse), d);	menu_item_add_stock(menu, _("_Skip folders"), GTK_STOCK_REMOVE, G_CALLBACK(view_dir_list_skip), d);	menu_item_add_divider(menu);	menu_item_add_stock(menu, _("Cancel"), GTK_STOCK_CANCEL, G_CALLBACK(view_dir_list_cancel), d);	return menu;}/* *----------------------------------------------------------------------------- * image drag and drop routines *----------------------------------------------------------------------------- */static void view_window_get_dnd_data(GtkWidget *widget, GdkDragContext *context,				     gint x, gint y,				     GtkSelectionData *selection_data, guint info,				     guint time, gpointer data){	ViewWindow *vw = data;	ImageWindow *imd;	if (gtk_drag_get_source_widget(context) == vw->imd->pr) return;	imd = vw->imd;	if (info == TARGET_URI_LIST || info == TARGET_APP_COLLECTION_MEMBER)		{		CollectionData *source;		GList *list;		GList *info_list;		if (info == TARGET_URI_LIST)			{			GList *work;			list = uri_list_from_text(selection_data->data, TRUE);			work = list;			while (work)				{				if (isdir((gchar *)work->data))					{					GtkWidget *menu;					menu = view_confirm_dir_list(vw, list);					gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 0, time);					return;					}				work = work->next;				}			list = path_list_filter(list, FALSE);			source = NULL;			info_list = NULL;			}		else			{			source = collection_from_dnd_data((gchar *)selection_data->data, &list, &info_list);			}		if (list)			{			gchar *path;			path = list->data;			if (isfile(path))				{				view_slideshow_stop(vw);				view_window_set_list(vw, NULL);				if (source && info_list)					{					image_change_from_collection(imd, source, info_list->data, image_zoom_get_default(imd, zoom_mode));					}				else					{					if (list->next)						{						vw->list = list;						list = NULL;						vw->list_pointer = vw->list;						}					image_change_path(imd, path, image_zoom_get_default(imd, zoom_mode));					}				}			}		path_list_free(list);		g_list_free(info_list);		}}static void view_window_set_dnd_data(GtkWidget *widget, GdkDragContext *context,				     GtkSelectionData *selection_data, guint info,				     guint time, gpointer data){	ViewWindow *vw = data;	const gchar *path;	path = image_get_path(vw->imd);	if (path)		{		gchar *text = NULL;		gint len;		gint plain_text;		GList *list;		switch (info)			{			case TARGET_URI_LIST:				plain_text = FALSE;				break;			case TARGET_TEXT_PLAIN:			default:				plain_text = TRUE;				break;			}		list = g_list_append(NULL, (gchar *)path);		text = uri_text_from_list(list, &len, plain_text);		g_list_free(list);		if (text)			{			gtk_selection_data_set (selection_data, selection_data->target,						8, text, len);			g_free(text);			}		}	else		{		gtk_selection_data_set (selection_data, selection_data->target,					8, NULL, 0);		}}static void view_window_dnd_init(ViewWindow *vw){	ImageWindow *imd;	imd = vw->imd;	gtk_drag_source_set(imd->pr, GDK_BUTTON2_MASK,			    dnd_file_drag_types, dnd_file_drag_types_count,			    GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);	g_signal_connect(G_OBJECT(imd->pr), "drag_data_get",			 G_CALLBACK(view_window_set_dnd_data), vw);	gtk_drag_dest_set(imd->pr,			  GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_DROP,			  dnd_file_drop_types, dnd_file_drop_types_count,                          GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);	g_signal_connect(G_OBJECT(imd->pr), "drag_data_received",			 G_CALLBACK(view_window_get_dnd_data), vw);}/* *----------------------------------------------------------------------------- * maintenance (for rename, move, remove) *----------------------------------------------------------------------------- */static void view_real_removed(ViewWindow *vw, const gchar *path, GList *ignore_list){	ImageWindow *imd;	const gchar *image_path;	imd = view_window_active_image(vw);	image_path = image_get_path(imd);	if (image_path && strcmp(image_path, path) == 0)		{		if (vw->list)			{			view_list_step(vw, TRUE);			if (image_get_path(imd) == image_path)				{				view_list_step(vw, FALSE);				}			}		else if (view_window_contains_collection(vw))			{			view_collection_step(vw, TRUE);			if (image_get_path(imd) == image_path)				{				view_collection_step(vw, FALSE);				}			}		if (image_get_path(imd) == image_path)			{			image_change_path(imd, NULL, image_zoom_get_default(imd, zoom_mode));			}		}	if (vw->list)		{		GList *work;		GList *old;		old = vw->list_pointer;		work = vw->list;		while (work)			{			gchar *chk_path;			GList *chk_link;			chk_path = work->data;			chk_link = work;			work = work->next;			if (strcmp(chk_path, path) == 0)				{				if (vw->list_pointer == chk_link)					{					vw->list_pointer = (chk_link->next) ? chk_link->next : chk_link->prev;					}				vw->list = g_list_remove(vw->list, chk_path);				g_free(chk_path);				}			}		/* handles stepping correctly when same image is in the list more than once */		if (old && old != vw->list_pointer)			{			gchar *path;			if (vw->list_pointer)				{				path = vw->list_pointer->data;				}			else				{				path = NULL;				}			image_change_path(imd, path, image_zoom_get_default(imd, zoom_mode));			}		}	if (vw->overlay_id != -1) image_overlay_update(imd, vw->overlay_id);}static void view_real_moved(ViewWindow *vw, const gchar *source, const gchar *dest){	ImageWindow *imd;	const gchar *image_path;	imd = view_window_active_image(vw);	image_path = image_get_path(imd);	if (image_path && strcmp(image_path, source) == 0)		{		image_set_path(imd, dest);		}	if (vw->list)		{		GList *work;		work = vw->list;		while (work)			{			gchar *chk_path;			chk_path = work->data;			if (strcmp(chk_path, source) == 0)				{				work->data = g_strdup(dest);				g_free(chk_path);				}			work = work->next;			}		}}void view_window_maint_removed(const gchar *path, GList *ignore_list){	GList *work = view_window_list;	while (work)		{		ViewWindow *vw = work->data;		work = work->next;		view_real_removed(vw, path, ignore_list);		}}void view_window_maint_moved(const gchar *source, const gchar *dest){	GList *work = view_window_list;	while (work)		{		ViewWindow *vw = work->data;		work = work->next;		view_real_moved(vw, source, dest);		}}

⌨️ 快捷键说明

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