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