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

📄 layout_image.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 "layout_image.h"#include "collect.h"#include "dnd.h"#include "editors.h"#include "filelist.h"#include "fullscreen.h"#include "image.h"#include "image-overlay.h"#include "img-view.h"#include "info.h"#include "layout.h"#include "layout_util.h"#include "menu.h"#include "pixbuf_util.h"#include "utilops.h"#include "slideshow.h"#include "ui_bookmark.h"#include "ui_fileops.h"#include "ui_menu.h"#include <gdk/gdkkeysyms.h> /* for keyboard values */static GtkWidget *layout_image_pop_menu(LayoutWindow *lw);static void layout_image_set_buttons(LayoutWindow *lw);/* *---------------------------------------------------------------------------- * full screen overlay *---------------------------------------------------------------------------- */static void layout_image_overlay_set(LayoutWindow *lw, gint enable){	lw->full_screen_overlay_on = enable;	if (!lw->full_screen) return;	if (enable)		{		if (lw->full_screen_overlay_id == -1)			{			lw->full_screen_overlay_id = image_overlay_info_enable(lw->image);			}		}	else		{		if (lw->full_screen_overlay_id != -1)			{			image_overlay_info_disable(lw->image, lw->full_screen_overlay_id);			lw->full_screen_overlay_id = -1;			}		}}void layout_image_overlay_update(LayoutWindow *lw){	if (!lw || !lw->full_screen) return;	if (lw->full_screen_overlay_id != -1) image_overlay_update(lw->image, lw->full_screen_overlay_id);}/* *---------------------------------------------------------------------------- * full screen *---------------------------------------------------------------------------- */static void layout_image_fullscreen_menu_pos_cb(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer data){	LayoutWindow *lw = data;	if (!lw->full_screen) return;	gdk_window_get_origin(lw->full_screen->imd->pr->window, x, y);	popup_menu_position_clamp(menu, x, y, 0);}static void layout_image_full_screen_menu_popup(LayoutWindow *lw){	GtkWidget *menu;	menu = layout_image_pop_menu(lw);	gtk_menu_popup(GTK_MENU(menu), NULL, NULL, layout_image_fullscreen_menu_pos_cb, lw, 0, GDK_CURRENT_TIME);}static gint layout_image_full_screen_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpointer data){	LayoutWindow *lw = data;	gint stop_signal = FALSE;	gint x = 0;	gint y = 0;	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 '+': case '=': case GDK_KP_Add:			layout_image_zoom_adjust(lw, get_zoom_increment());			break;		case '-': case GDK_KP_Subtract:			layout_image_zoom_adjust(lw, -get_zoom_increment());			break;		case 'X': case 'x': case GDK_KP_Multiply:			layout_image_zoom_set(lw, 0.0);			break;		case 'Z': case 'z': case GDK_KP_Divide:		case '1':			layout_image_zoom_set(lw, 1.0);			break;		case '2':			layout_image_zoom_set(lw, 2.0);			break;		case '3':			layout_image_zoom_set(lw, 3.0);			break;		case '4':			layout_image_zoom_set(lw, 4.0);			break;		case '7':			layout_image_zoom_set(lw, -4.0);			break;		case '8':			layout_image_zoom_set(lw, -3.0);			break;		case '9':			layout_image_zoom_set(lw, -2.0);			break;		case 'W': case 'w':			layout_image_zoom_set_fill_geometry(lw, FALSE);			break;		case 'H': case 'h':			layout_image_zoom_set_fill_geometry(lw, TRUE);			break;		case GDK_Page_Up: case GDK_KP_Page_Up:		case GDK_BackSpace:		case 'B': case 'b':			layout_image_prev(lw);			stop_signal = TRUE;			break;		case GDK_Page_Down: case GDK_KP_Page_Down:		case GDK_space:		case 'N': case 'n':			layout_image_next(lw);			stop_signal = TRUE;			break;		case GDK_Home: case GDK_KP_Home:			layout_image_first(lw);			stop_signal = TRUE;			break;		case GDK_End: case GDK_KP_End:			layout_image_last(lw);			stop_signal = TRUE;			break;		case ']':			layout_image_alter(lw, ALTER_ROTATE_90);			stop_signal = TRUE;			break;		case '[':			layout_image_alter(lw, ALTER_ROTATE_90_CC);			stop_signal = TRUE;			break;		case GDK_Delete: case GDK_KP_Delete:			if (enable_delete_key)				{				file_util_delete(layout_image_get_path(lw), NULL, widget);				stop_signal = TRUE;				}			break;		case GDK_Escape:			layout_image_full_screen_stop(lw);			stop_signal = TRUE;			break;		case 'R': case 'r':			layout_refresh(lw);			break;		case 'S': case 's':			layout_image_slideshow_toggle(lw);			break;		case 'P': case 'p':			layout_image_slideshow_pause_toggle(lw);			break;		case 'F': case 'f':		case 'V': case 'v':			layout_image_full_screen_stop(lw);			break;		case GDK_Menu:		case GDK_F10:			layout_image_full_screen_menu_popup(lw);			stop_signal = TRUE;			break;		case 'I': case 'i':			layout_image_overlay_set(lw, !(lw->full_screen_overlay_on));			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(layout_image_get_path(lw), NULL, NULL, widget);				break;			case 'M': case 'm':				file_util_move(layout_image_get_path(lw), NULL, NULL, widget);				break;			case 'R': case 'r':				file_util_rename(layout_image_get_path(lw), NULL, widget);				break;			case 'D': case 'd':				file_util_delete(layout_image_get_path(lw), NULL, widget);				break;			case 'P': case 'p':				info_window_new(layout_image_get_path(lw), NULL);				break;			case 'Q': case 'q':				exit_gqview();				return FALSE;				break;			}		if (n != -1)			{			if (!editor_window_flag_set(n))				{				layout_image_full_screen_stop(lw);				}			start_editor_from_file(n, layout_image_get_path(lw));			}		}	else if (event->state & GDK_SHIFT_MASK)		{		switch (event->keyval)			{			case 'R': case 'r':				layout_image_alter(lw, ALTER_ROTATE_180);				stop_signal = TRUE;				break;			case 'M': case 'm':				layout_image_alter(lw, ALTER_MIRROR);				stop_signal = TRUE;				break;			case 'F': case 'f':				layout_image_alter(lw, ALTER_FLIP);				stop_signal = TRUE;				break;			default:				break;			}		x *= 3;		y *= 3;		}	if (x != 0 || y!= 0)		{		keyboard_scroll_calc(&x, &y, event);		layout_image_scroll(lw, x, y);		}	return stop_signal;}static void layout_image_full_screen_stop_func(FullScreenData *fs, gpointer data){	LayoutWindow *lw = data;	/* restore image window */	lw->image = fs->normal_imd;	if (lw->slideshow)		{		lw->slideshow->imd = lw->image;		}	lw->full_screen = NULL;	lw->full_screen_overlay_id = -1;}void layout_image_full_screen_start(LayoutWindow *lw){	if (!layout_valid(&lw)) return;	if (lw->full_screen) return;	lw->full_screen = fullscreen_start(lw->window, lw->image,					   layout_image_full_screen_stop_func, lw);	/* set to new image window */	lw->image = lw->full_screen->imd;	if (lw->slideshow)		{		lw->slideshow->imd = lw->image;		}	layout_image_set_buttons(lw);	g_signal_connect(G_OBJECT(lw->full_screen->window), "key_press_event",			 G_CALLBACK(layout_image_full_screen_key_press_cb), lw);#if 0	gtk_widget_set_sensitive(lw->window, FALSE);	if (lw->tools) gtk_widget_set_sensitive(lw->tools, FALSE);#endif	layout_image_overlay_set(lw, lw->full_screen_overlay_on);}void layout_image_full_screen_stop(LayoutWindow *lw){	if (!layout_valid(&lw)) return;	if (!lw->full_screen) return;	fullscreen_stop(lw->full_screen);#if 0	gtk_widget_set_sensitive(lw->window, TRUE);	if (lw->tools) gtk_widget_set_sensitive(lw->tools, TRUE);#endif}void layout_image_full_screen_toggle(LayoutWindow *lw){	if (!layout_valid(&lw)) return;	if (lw->full_screen)		{		layout_image_full_screen_stop(lw);		}	else		{		layout_image_full_screen_start(lw);		}}gint layout_image_full_screen_active(LayoutWindow *lw){	if (!layout_valid(&lw)) return FALSE;	return (lw->full_screen != NULL);}/* *---------------------------------------------------------------------------- * slideshow *---------------------------------------------------------------------------- */static void layout_image_slideshow_next(LayoutWindow *lw){	if (lw->slideshow) slideshow_next(lw->slideshow);}static void layout_image_slideshow_prev(LayoutWindow *lw){	if (lw->slideshow) slideshow_prev(lw->slideshow);}static void layout_image_slideshow_stop_func(SlideShowData *ss, gpointer data){	LayoutWindow *lw = data;	lw->slideshow = NULL;	layout_status_update_info(lw, NULL);}void layout_image_slideshow_start(LayoutWindow *lw){	CollectionData *cd;	CollectInfo *info;	if (!layout_valid(&lw)) return;	if (lw->slideshow) return;	cd = image_get_collection(lw->image, &info);	if (cd && info)		{		lw->slideshow = slideshow_start_from_collection(lw->image, cd,				layout_image_slideshow_stop_func, lw, info);		}	else		{		lw->slideshow = slideshow_start(lw->image, lw,				layout_list_get_index(lw, layout_image_get_path(lw)),				layout_image_slideshow_stop_func, lw);		}	layout_status_update_info(lw, NULL);}/* note that slideshow will take ownership of the list, do not free it */void layout_image_slideshow_start_from_list(LayoutWindow *lw, GList *list){	if (!layout_valid(&lw)) return;	if (lw->slideshow || !list)		{		path_list_free(list);		return;		}	lw->slideshow = slideshow_start_from_path_list(lw->image, list,						       layout_image_slideshow_stop_func, lw);	layout_status_update_info(lw, NULL);}void layout_image_slideshow_stop(LayoutWindow *lw){	if (!layout_valid(&lw)) return;	if (!lw->slideshow) return;	slideshow_free(lw->slideshow);	/* the stop_func sets lw->slideshow to NULL for us */}void layout_image_slideshow_toggle(LayoutWindow *lw){	if (!layout_valid(&lw)) return;

⌨️ 快捷键说明

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