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

📄 img-view.c

📁 Gqview,Linux下基于GTK+库写成的轻量级而能丰富的图像浏览程序。
💻 C
📖 第 1 页 / 共 3 页
字号:
			default:				break;			}		x *= 3;		y *= 3;		}	if (x != 0 || y!= 0)		{		keyboard_scroll_calc(&x, &y, event);		image_scroll(imd, x, y);		}	return stop_signal;}/* *----------------------------------------------------------------------------- * view window main routines *----------------------------------------------------------------------------- */ static void button_cb(ImageWindow *imd, gint button, guint32 time,		      gdouble x, gdouble y, guint state, gpointer data){	ViewWindow *vw = data;	GtkWidget *menu;	switch (button)		{		case 1:			view_step_next(vw);			break;		case 2:			view_step_prev(vw);			break;		case 3:			menu = view_popup_menu(vw);			gtk_menu_popup (GTK_MENU(menu), NULL, NULL, NULL, NULL, 3, time);			break;		default:			break;		}}static void scroll_cb(ImageWindow *imd, GdkScrollDirection direction, guint32 time,		      gdouble x, gdouble y, guint state, gpointer data){	ViewWindow *vw = data;	if (state & GDK_CONTROL_MASK)		{		switch (direction)			{			case GDK_SCROLL_UP:				image_zoom_adjust_at_point(imd, get_zoom_increment(), x, y);				break;			case GDK_SCROLL_DOWN:				image_zoom_adjust_at_point(imd, -get_zoom_increment(), x, y);				break;			default:				break;			}		}	else if ( (state & GDK_SHIFT_MASK) != (mousewheel_scrolls))		{		switch (direction)			{			case GDK_SCROLL_UP:				image_scroll(imd, 0, -MOUSEWHEEL_SCROLL_SIZE);				break;			case GDK_SCROLL_DOWN:				image_scroll(imd, 0, MOUSEWHEEL_SCROLL_SIZE);				break;			case GDK_SCROLL_LEFT:				image_scroll(imd, -MOUSEWHEEL_SCROLL_SIZE, 0);				break;			case GDK_SCROLL_RIGHT:				image_scroll(imd, MOUSEWHEEL_SCROLL_SIZE, 0);				break;			default:				break;			}		}	else		{		switch (direction)			{			case GDK_SCROLL_UP:				view_step_prev(vw);				break;			case GDK_SCROLL_DOWN:				view_step_next(vw);				break;			default:				break;			}		}}static void view_image_set_buttons(ViewWindow *vw, ImageWindow *imd){	image_set_button_func(imd, button_cb, vw);	image_set_scroll_func(imd, scroll_cb, vw);}static void view_fullscreen_stop_func(FullScreenData *fs, gpointer data){	ViewWindow *vw = data;	vw->fs = NULL;	if (vw->ss) vw->ss->imd = vw->imd;}static void view_fullscreen_toggle(ViewWindow *vw, gint force_off){	if (force_off && !vw->fs) return;	if (vw->fs)		{		fullscreen_stop(vw->fs);		if (vw->overlay_id != -1) vw->overlay_id = image_overlay_info_enable(vw->imd);		}	else		{		vw->fs = fullscreen_start(vw->window, vw->imd, view_fullscreen_stop_func, vw);		view_image_set_buttons(vw, vw->fs->imd);		g_signal_connect(G_OBJECT(vw->fs->window), "key_press_event",				 G_CALLBACK(view_window_key_press_cb), vw);		if (vw->ss) vw->ss->imd = vw->fs->imd;		if (vw->overlay_id != -1)			{			image_overlay_info_disable(vw->imd, vw->overlay_id);			vw->overlay_id = image_overlay_info_enable(vw->fs->imd);			}		}}static void view_overlay_toggle(ViewWindow *vw){	ImageWindow *imd;	imd = view_window_active_image(vw);	if (vw->overlay_id == -1)		{		vw->overlay_id = image_overlay_info_enable(imd);		}	else		{		image_overlay_info_disable(imd, vw->overlay_id);		vw->overlay_id = -1;		}}static void view_slideshow_next(ViewWindow *vw){	if (vw->ss) slideshow_next(vw->ss);}static void view_slideshow_prev(ViewWindow *vw){	if (vw->ss) slideshow_prev(vw->ss);}static void view_slideshow_stop_func(SlideShowData *fs, gpointer data){	ViewWindow *vw = data;	vw->ss = NULL;}static void view_slideshow_start(ViewWindow *vw){	if (!vw->ss)		{		CollectionData *cd;		CollectInfo *info;		if (vw->list)			{			vw->ss = slideshow_start_from_path_list(view_window_active_image(vw),								path_list_copy(vw->list),								view_slideshow_stop_func, vw);			vw->list_pointer = NULL;			return;			}		cd = image_get_collection(view_window_active_image(vw), &info);		if (cd && info)			{			vw->ss = slideshow_start_from_collection(view_window_active_image(vw), cd,								 view_slideshow_stop_func, vw, info);			}		}}static void view_slideshow_stop(ViewWindow *vw){	if (vw->ss) slideshow_free(vw->ss);}static void view_window_close(ViewWindow *vw){	view_window_list = g_list_remove(view_window_list, vw);	view_slideshow_stop(vw);	view_fullscreen_toggle(vw, TRUE);	gtk_widget_destroy(vw->window);	path_list_free(vw->list);	g_free(vw);}static gint view_window_delete_cb(GtkWidget *w, GdkEventAny *event, gpointer data){	ViewWindow *vw = data;	view_window_close(vw);	return TRUE;}static ViewWindow *real_view_window_new(const gchar *path, GList *list, CollectionData *cd, CollectInfo *info){	ViewWindow *vw;	GtkAllocation req_size;	GdkGeometry geometry;	gint w, h;	if (!path && !list && (!cd || !info)) return NULL;	vw = g_new0(ViewWindow, 1);	vw->fs = NULL;	vw->ss = NULL;	vw->list = NULL;	vw->list_pointer = NULL;	vw->overlay_id = -1;	vw->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);	geometry.min_width = 8;	geometry.min_height = 8;	gtk_window_set_geometry_hints(GTK_WINDOW(vw->window), NULL, &geometry, GDK_HINT_MIN_SIZE);	gtk_window_set_resizable(GTK_WINDOW(vw->window), TRUE);	gtk_window_set_title (GTK_WINDOW(vw->window), "GQview");        gtk_window_set_wmclass(GTK_WINDOW(vw->window), "view", "GQview");        gtk_container_set_border_width(GTK_CONTAINER(vw->window), 0);	window_set_icon(vw->window, (const gchar **)view_xpm, NULL);	vw->imd = image_new(FALSE);	if (black_window_background) image_background_set_black(vw->imd, TRUE);	image_attach_window(vw->imd, vw->window, NULL, "GQview", TRUE);	image_auto_refresh(vw->imd, 0);	image_top_window_set_sync(vw->imd, TRUE);	gtk_container_add(GTK_CONTAINER(vw->window), vw->imd->widget);	gtk_widget_show(vw->imd->widget);	view_window_dnd_init(vw);	view_image_set_buttons(vw, vw->imd);	g_signal_connect(G_OBJECT(vw->window), "delete_event",			 G_CALLBACK(view_window_delete_cb), vw);	g_signal_connect(G_OBJECT(vw->window), "key_press_event",			 G_CALLBACK(view_window_key_press_cb), vw);	if (cd && info)		{		image_change_from_collection(vw->imd, cd, info, image_zoom_get_default(NULL, zoom_mode));		if (enable_read_ahead)			{			CollectInfo * r_info = collection_next_by_info(cd, info);			if (!r_info) r_info = collection_prev_by_info(cd, info);			if (r_info) image_prebuffer_set(vw->imd, r_info->path);			}		}	else if (list)		{		view_window_set_list(vw, list);		vw->list_pointer = vw->list;		image_change_path(vw->imd, (gchar *)vw->list->data, image_zoom_get_default(NULL, zoom_mode));		if (enable_read_ahead)			{			GList *work = vw->list->next;			if (work) image_prebuffer_set(vw->imd, (gchar *)work->data);			}		}	else		{		image_change_path(vw->imd, path, image_zoom_get_default(NULL, zoom_mode));		}	if (image_zoom_get(vw->imd) == 0.0)		{		pixbuf_renderer_get_image_size(PIXBUF_RENDERER(vw->imd->pr), &w, &h);		}	else		{		pixbuf_renderer_get_scaled_size(PIXBUF_RENDERER(vw->imd->pr), &w, &h);		}	if (limit_window_size)		{		gint mw = gdk_screen_width() * max_window_size / 100;		gint mh = gdk_screen_height() * max_window_size / 100;		if (w > mw) w = mw;		if (h > mh) h = mh;		}	gtk_window_set_default_size(GTK_WINDOW(vw->window), w, h);	req_size.x = req_size.y = 0;	req_size.width = w;	req_size.height = h;	gtk_widget_size_allocate(GTK_WIDGET(vw->window), &req_size);	gtk_widget_set_size_request(vw->imd->pr, w, h);	gtk_widget_show(vw->window);	view_window_list = g_list_append(view_window_list, vw);	return vw;}static void view_window_collection_unref_cb(GtkWidget *widget, gpointer data){	CollectionData *cd = data;	collection_unref(cd);}void view_window_new(const gchar *path){	if (file_extension_match(path, ".gqv"))		{		ViewWindow *vw;		CollectionData *cd;		CollectInfo *info;		cd = collection_new(path);		if (collection_load(cd, path, FALSE))			{			info = collection_get_first(cd);			}		else			{			collection_unref(cd);			cd = NULL;			info = NULL;			}		vw = real_view_window_new(NULL, NULL, cd, info);		if (vw && cd)			{			g_signal_connect(G_OBJECT(vw->window), "destroy",					 G_CALLBACK(view_window_collection_unref_cb), cd);			}		}	else if (isdir(path))		{		GList *list = NULL;		if (path_list(path, &list, NULL))			{			list = path_list_sort(list);			list = path_list_filter(list, FALSE);			}		real_view_window_new(NULL, list, NULL, NULL);		path_list_free(list);		}	else		{		real_view_window_new(path, NULL, NULL, NULL);		}}void view_window_new_from_list(GList *list){	real_view_window_new(NULL, list, NULL, NULL);}void view_window_new_from_collection(CollectionData *cd, CollectInfo *info){	real_view_window_new(NULL, NULL, cd, info);}/* *----------------------------------------------------------------------------- * public *----------------------------------------------------------------------------- */void view_window_colors_update(void){	GList *work;	work = view_window_list;	while (work)		{		ViewWindow *vw = work->data;		work = work->next;		image_background_set_black(vw->imd, black_window_background);		}}gint view_window_find_image(ImageWindow *imd, gint *index, gint *total){	GList *work;	work = view_window_list;	while (work)		{		ViewWindow *vw = work->data;		work = work->next;		if (vw->imd == imd ||		    (vw->fs && vw->fs->imd == imd))			{			if (vw->ss)				{				gint n;				n = g_list_length(vw->ss->list_done);				if (index) *index = n - 1;				if (total) *total = n + g_list_length(vw->ss->list);				}			else				{				if (index) *index = g_list_position(vw->list, vw->list_pointer);				if (total) *total = g_list_length(vw->list);				}			return TRUE;			}		}	return FALSE;}/* *----------------------------------------------------------------------------- * view window menu routines and callbacks *----------------------------------------------------------------------------- */ static void view_new_window_cb(GtkWidget *widget, gpointer data){	ViewWindow *vw = data;	CollectionData *cd;	CollectInfo *info;	cd = image_get_collection(vw->imd, &info);	if (cd && info)		{		view_window_new_from_collection(cd, info);		}	else		{		view_window_new(image_get_path(vw->imd));		}}static void view_edit_cb(GtkWidget *widget, gpointer data){	ViewWindow *vw;	ImageWindow *imd;	gint n;	vw = submenu_item_get_data(widget);	n = GPOINTER_TO_INT(data);	if (!vw) return;	if (!editor_window_flag_set(n))		{		view_fullscreen_toggle(vw, TRUE);		}	imd = view_window_active_image(vw);	start_editor_from_file(n, image_get_path(imd));}static void view_alter_cb(GtkWidget *widget, gpointer data){	ViewWindow *vw;	AlterType type;	vw = submenu_item_get_data(widget);	type = GPOINTER_TO_INT(data);	if (!vw) return;	image_alter(vw->imd, type);}static void view_info_cb(GtkWidget *widget, gpointer data){	ViewWindow *vw = data;	ImageWindow *imd;	imd = view_window_active_image(vw);	info_window_new(image_get_path(imd), NULL);}static void view_wallpaper_cb(GtkWidget *widget, gpointer data){	ViewWindow *vw = data;	ImageWindow *imd;	imd = view_window_active_image(vw);	image_to_root_window(imd, (image_zoom_get(imd) == 0.0));}static void view_zoom_in_cb(GtkWidget *widget, gpointer data){	ViewWindow *vw = data;	image_zoom_adjust(view_window_active_image(vw), get_zoom_increment());}static void view_zoom_out_cb(GtkWidget *widget, gpointer data){	ViewWindow *vw = data;	image_zoom_adjust(view_window_active_image(vw), -get_zoom_increment());}static void view_zoom_1_1_cb(GtkWidget *widget, gpointer data){	ViewWindow *vw = data;	image_zoom_set(view_window_active_image(vw), 1.0);}static void view_zoom_fit_cb(GtkWidget *widget, gpointer data){	ViewWindow *vw = data;	image_zoom_set(view_window_active_image(vw), 0.0);}static void view_copy_cb(GtkWidget *widget, gpointer data){	ViewWindow *vw = data;	ImageWindow *imd;

⌨️ 快捷键说明

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