📄 layout_image.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 "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 + -