📄 img-view.c
字号:
/* * 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 + -