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

📄 img-view.c

📁 Gqview,Linux下基于GTK+库写成的轻量级而能丰富的图像浏览程序。
💻 C
📖 第 1 页 / 共 3 页
字号:
/* * GQview * (C) 2004 John Ellis * * Author: John Ellis * * This software is released under the GNU General Public License (GNU GPL). * Please read the included file COPYING for more information. * This software comes with no warranty of any kind, use at your own risk! */#include "gqview.h"#include "img-view.h"#include "collect.h"#include "collect-io.h"#include "dnd.h"#include "editors.h"#include "filelist.h"#include "fullscreen.h"#include "image.h"#include "image-overlay.h"#include "info.h"#include "menu.h"#include "pixbuf-renderer.h"#include "slideshow.h"#include "utilops.h"#include "ui_bookmark.h"#include "ui_fileops.h"#include "ui_menu.h"#include <gdk/gdkkeysyms.h> /* for keyboard values */#include "icons/view.xpm"typedef struct _ViewWindow ViewWindow;struct _ViewWindow{	GtkWidget *window;	ImageWindow *imd;	FullScreenData *fs;	SlideShowData *ss;	GList *list;	GList *list_pointer;	gint overlay_id;};static GList *view_window_list = NULL;static GtkWidget *view_popup_menu(ViewWindow *vw);static void view_fullscreen_toggle(ViewWindow *vw, gint force_off);static void view_overlay_toggle(ViewWindow *vw);static void view_slideshow_next(ViewWindow *vw);static void view_slideshow_prev(ViewWindow *vw);static void view_slideshow_start(ViewWindow *vw);static void view_slideshow_stop(ViewWindow *vw);static void view_window_close(ViewWindow *vw);static void view_window_dnd_init(ViewWindow *vw);/* *----------------------------------------------------------------------------- * misc *----------------------------------------------------------------------------- */ static ImageWindow *view_window_active_image(ViewWindow *vw){	if (vw->fs) return vw->fs->imd;	return vw->imd;}static void view_window_set_list(ViewWindow *vw, GList *list){	path_list_free(vw->list);	vw->list = NULL;	vw->list_pointer = NULL;	vw->list = path_list_copy(list);}static gint view_window_contains_collection(ViewWindow *vw){	CollectionData *cd;	CollectInfo *info;	cd = image_get_collection(view_window_active_image(vw), &info);	return (cd && info);}static void view_collection_step(ViewWindow *vw, gint next){	ImageWindow *imd = view_window_active_image(vw);	CollectionData *cd;	CollectInfo *info;	CollectInfo *read_ahead_info = NULL;	cd = image_get_collection(imd, &info);	if (!cd || !info) return;	if (next)		{		info = collection_next_by_info(cd, info);		if (enable_read_ahead)			{			read_ahead_info = collection_next_by_info(cd, info);			if (!read_ahead_info) read_ahead_info = collection_prev_by_info(cd, info);			}		}	else		{		info = collection_prev_by_info(cd, info);		if (enable_read_ahead)			{			read_ahead_info = collection_prev_by_info(cd, info);			if (!read_ahead_info) read_ahead_info = collection_next_by_info(cd, info);			}		}	if (info)		{		image_change_from_collection(imd, cd, info, image_zoom_get_default(imd, zoom_mode));		if (read_ahead_info) image_prebuffer_set(imd, read_ahead_info->path);		}	}static void view_collection_step_to_end(ViewWindow *vw, gint last){	ImageWindow *imd = view_window_active_image(vw);	CollectionData *cd;	CollectInfo *info;	CollectInfo *read_ahead_info = NULL;	cd = image_get_collection(imd, &info);	if (!cd || !info) return;	if (last)		{		info = collection_get_last(cd);		if (enable_read_ahead) read_ahead_info = collection_prev_by_info(cd, info);		}	else		{		info = collection_get_first(cd);		if (enable_read_ahead) read_ahead_info = collection_next_by_info(cd, info);		}	if (info)		{		image_change_from_collection(imd, cd, info, image_zoom_get_default(imd, zoom_mode));		if (read_ahead_info) image_prebuffer_set(imd, read_ahead_info->path);		}}static void view_list_step(ViewWindow *vw, gint next){	ImageWindow *imd = view_window_active_image(vw);	const gchar *path;	GList *work;	GList *work_ahead;	if (!vw->list) return;	path = image_get_path(imd);	if (!path) return;	if (g_list_position(vw->list, vw->list_pointer) >= 0)		{		work = vw->list_pointer;		}	else		{		gint found = FALSE;		work = vw->list;		while (work && !found)			{			gchar *temp;			temp = work->data;			if (strcmp(path, temp) == 0)				{				found = TRUE;				}			else				{				work = work->next;				}			}		}	if (!work) return;	work_ahead = NULL;	if (next)		{		work = work->next;		if (work) work_ahead = work->next;		}	else		{		work = work->prev;		if (work) work_ahead = work->prev;		}	if (!work) return;	vw->list_pointer = work;	path = work->data;	image_change_path(imd, path, image_zoom_get_default(imd, zoom_mode));	if (enable_read_ahead && work_ahead)		{		const gchar *next_path = work_ahead->data;		image_prebuffer_set(imd, next_path);		}}static void view_list_step_to_end(ViewWindow *vw, gint last){	ImageWindow *imd = view_window_active_image(vw);	const gchar *path;	GList *work;	GList *work_ahead;	if (!vw->list) return;	if (last)		{		work = g_list_last(vw->list);		work_ahead = work->prev;		}	else		{		work = vw->list;		work_ahead = work->next;		}	vw->list_pointer = work;	path = work->data;	image_change_path(imd, path, image_zoom_get_default(imd, zoom_mode));	if (enable_read_ahead && work_ahead)		{		const gchar *next_path = work_ahead->data;		image_prebuffer_set(imd, next_path);		}}static void view_step_next(ViewWindow *vw){	if (vw->ss)		{		view_slideshow_next(vw);		}	else if (vw->list)		{		view_list_step(vw, TRUE);		}	else		{		view_collection_step(vw, TRUE);		}}static void view_step_prev(ViewWindow *vw){	if (vw->ss)		{		view_slideshow_prev(vw);		}	else if (vw->list)		{		view_list_step(vw, FALSE);		}	else		{		view_collection_step(vw, FALSE);		}}static void view_step_to_end(ViewWindow *vw, gint last){	if (vw->list)		{		view_list_step_to_end(vw, last);		}	else		{		view_collection_step_to_end(vw, last);		}}/* *----------------------------------------------------------------------------- * view window keyboard *----------------------------------------------------------------------------- */static void view_window_menu_pos_cb(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer data){	ViewWindow *vw = data;	ImageWindow *imd;	imd = view_window_active_image(vw);	gdk_window_get_origin(imd->pr->window, x, y);	popup_menu_position_clamp(menu, x, y, 0);}static gint view_window_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpointer data){	ViewWindow *vw = data;	ImageWindow *imd;	gint stop_signal = FALSE;	GtkWidget *menu;	gint x = 0;	gint y = 0;	imd = view_window_active_image(vw);	switch (event->keyval)		{		case GDK_Left: case GDK_KP_Left:			x -= 1;			stop_signal = TRUE;			break;		case GDK_Right: case GDK_KP_Right:			x += 1;			stop_signal = TRUE;			break;		case GDK_Up: case GDK_KP_Up:			y -= 1;			stop_signal = TRUE;			break;		case GDK_Down: case GDK_KP_Down:			y += 1;			stop_signal = TRUE;			break;		}	if ( !(event->state & GDK_CONTROL_MASK) )	    switch (event->keyval)		{		case GDK_Page_Up: case GDK_KP_Page_Up:		case GDK_BackSpace:		case 'B': case 'b':			view_step_prev(vw);			stop_signal = TRUE;			break;		case GDK_Page_Down: case GDK_KP_Page_Down:		case GDK_space:		case 'N': case 'n':			view_step_next(vw);			stop_signal = TRUE;			break;		case GDK_Home: case GDK_KP_Home:			view_step_to_end(vw, FALSE);			stop_signal = TRUE;			break;		case GDK_End: case GDK_KP_End:			view_step_to_end(vw, TRUE);			stop_signal = TRUE;			break;		case '+': case '=': case GDK_KP_Add:			image_zoom_adjust(imd, get_zoom_increment());			break;		case '-': case GDK_KP_Subtract:			image_zoom_adjust(imd, -get_zoom_increment());			break;		case 'X': case 'x': case GDK_KP_Multiply:			image_zoom_set(imd, 0.0);			break;		case 'Z': case 'z': case GDK_KP_Divide: case '1':			image_zoom_set(imd, 1.0);			break;		case '2':			image_zoom_set(imd, 2.0);			break;		case '3':			image_zoom_set(imd, 3.0);			break;		case '4':			image_zoom_set(imd, 4.0);			break;		case '7':			image_zoom_set(imd, -4.0);			break;		case '8':			image_zoom_set(imd, -3.0);			break;		case '9':			image_zoom_set(imd, -2.0);			break;		case 'W': case 'w':			image_zoom_set_fill_geometry(imd, FALSE);			break;		case 'H': case 'h':			image_zoom_set_fill_geometry(imd, TRUE);			break;		case 'R': case 'r':			image_reload(imd);			break;		case 'S': case 's':			if (vw->ss)				view_slideshow_stop(vw);			else				view_slideshow_start(vw);			stop_signal = TRUE;			break;		case 'P': case 'p':			slideshow_pause_toggle(vw->ss);			break;		case 'F': case 'f':		case 'V': case 'v':			view_fullscreen_toggle(vw, FALSE);			stop_signal = TRUE;			break;		case 'I': case 'i':			view_overlay_toggle(vw);			break;		case ']':			image_alter(imd, ALTER_ROTATE_90);			stop_signal = TRUE;			break;		case '[':			image_alter(imd, ALTER_ROTATE_90_CC);			stop_signal = TRUE;			break;		case GDK_Delete: case GDK_KP_Delete:			if (enable_delete_key)				{				file_util_delete(image_get_path(imd), NULL, imd->widget);				stop_signal = TRUE;				}			break;		case GDK_Escape:			if (vw->fs)				{				view_fullscreen_toggle(vw, TRUE);				}			else				{				gtk_widget_destroy(vw->window);				}			stop_signal = TRUE;			break;		case GDK_Menu:		case GDK_F10:			menu = view_popup_menu(vw);			gtk_menu_popup(GTK_MENU(menu), NULL, NULL, view_window_menu_pos_cb, vw, 0, GDK_CURRENT_TIME);			stop_signal = TRUE;			break;		}	if (event->state & GDK_CONTROL_MASK)		{		gint n = -1;		switch (event->keyval)			{			case '1':				n = 0;				break;			case '2':				n = 1;				break;			case '3':				n = 2;				break;			case '4':				n = 3;				break;			case '5':				n = 4;				break;			case '6':				n = 5;				break;			case '7':				n = 6;				break;			case '8':				n = 7;				break;			case '9':				n = 8;				break;			case '0':				n = 9;				break;			case 'C': case 'c':				file_util_copy(image_get_path(imd), NULL, NULL, imd->widget);				stop_signal = TRUE;				break;			case 'M': case 'm':				file_util_move(image_get_path(imd), NULL, NULL, imd->widget);				stop_signal = TRUE;				break;			case 'R': case 'r':				file_util_rename(image_get_path(imd), NULL, imd->widget);				stop_signal = TRUE;				break;			case 'D': case 'd':				file_util_delete(image_get_path(imd), NULL, imd->widget);				stop_signal = TRUE;				break;			case 'P': case 'p':				info_window_new(image_get_path(imd), NULL);				stop_signal = TRUE;				break;			case 'W': case 'w':				view_window_close(vw);				break;			}		if (n != -1)			{			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));			}		}	else if (event->state & GDK_SHIFT_MASK)		{		switch (event->keyval)			{			case 'R': case 'r':				image_alter(imd, ALTER_ROTATE_180);				stop_signal = TRUE;				break;			case 'M': case 'm':				image_alter(imd, ALTER_MIRROR);				stop_signal = TRUE;				break;			case 'F': case 'f':				image_alter(imd, ALTER_FLIP);				stop_signal = TRUE;				break;

⌨️ 快捷键说明

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