📄 img-view.c
字号:
imd = view_window_active_image(vw); file_util_copy(image_get_path(imd), NULL, NULL, imd->widget);}static void view_move_cb(GtkWidget *widget, gpointer data){ ViewWindow *vw = data; ImageWindow *imd; imd = view_window_active_image(vw); file_util_move(image_get_path(imd), NULL, NULL, imd->widget);}static void view_rename_cb(GtkWidget *widget, gpointer data){ ViewWindow *vw = data; ImageWindow *imd; imd = view_window_active_image(vw); file_util_rename(image_get_path(imd), NULL, imd->widget);}static void view_delete_cb(GtkWidget *widget, gpointer data){ ViewWindow *vw = data; ImageWindow *imd; imd = view_window_active_image(vw); file_util_delete(image_get_path(imd), NULL, imd->widget);}static void view_fullscreen_cb(GtkWidget *widget, gpointer data){ ViewWindow *vw = data; view_fullscreen_toggle(vw, FALSE);}static void view_slideshow_start_cb(GtkWidget *widget, gpointer data){ ViewWindow *vw = data; view_slideshow_start(vw);}static void view_slideshow_stop_cb(GtkWidget *widget, gpointer data){ ViewWindow *vw = data; view_slideshow_stop(vw);}static void view_slideshow_pause_cb(GtkWidget *widget, gpointer data){ ViewWindow *vw = data; slideshow_pause_toggle(vw->ss);}static void view_close_cb(GtkWidget *widget, gpointer data){ ViewWindow *vw = data; view_window_close(vw);}static GtkWidget *view_popup_menu(ViewWindow *vw){ GtkWidget *menu; GtkWidget *item; menu = popup_menu_short_lived(); menu_item_add_stock(menu, _("Zoom _in"), GTK_STOCK_ZOOM_IN, G_CALLBACK(view_zoom_in_cb), vw); menu_item_add_stock(menu, _("Zoom _out"), GTK_STOCK_ZOOM_OUT, G_CALLBACK(view_zoom_out_cb), vw); menu_item_add_stock(menu, _("Zoom _1:1"), GTK_STOCK_ZOOM_100, G_CALLBACK(view_zoom_1_1_cb), vw); menu_item_add_stock(menu, _("Fit image to _window"), GTK_STOCK_ZOOM_FIT, G_CALLBACK(view_zoom_fit_cb), vw); menu_item_add_divider(menu); item = submenu_add_edit(menu, NULL, G_CALLBACK(view_edit_cb), vw); menu_item_add_divider(item); menu_item_add(item, _("Set as _wallpaper"), G_CALLBACK(view_wallpaper_cb), vw); submenu_add_alter(menu, G_CALLBACK(view_alter_cb), vw); menu_item_add_stock(menu, _("_Properties"), GTK_STOCK_PROPERTIES, G_CALLBACK(view_info_cb), vw); menu_item_add_stock(menu, _("View in _new window"), GTK_STOCK_NEW, G_CALLBACK(view_new_window_cb), vw); menu_item_add_divider(menu); menu_item_add_stock(menu, _("_Copy..."), GTK_STOCK_COPY, G_CALLBACK(view_copy_cb), vw); menu_item_add(menu, _("_Move..."), G_CALLBACK(view_move_cb), vw); menu_item_add(menu, _("_Rename..."), G_CALLBACK(view_rename_cb), vw); menu_item_add_stock(menu, _("_Delete..."), GTK_STOCK_DELETE, G_CALLBACK(view_delete_cb), vw); menu_item_add_divider(menu); if (vw->ss) { menu_item_add(menu, _("_Stop slideshow"), G_CALLBACK(view_slideshow_stop_cb), vw); if (slideshow_paused(vw->ss)) { item = menu_item_add(menu, _("Continue slides_how"), G_CALLBACK(view_slideshow_pause_cb), vw); } else { item = menu_item_add(menu, _("Pause slides_how"), G_CALLBACK(view_slideshow_pause_cb), vw); } } else { item = menu_item_add(menu, _("_Start slideshow"), G_CALLBACK(view_slideshow_start_cb), vw); gtk_widget_set_sensitive(item, (vw->list != NULL) || view_window_contains_collection(vw)); item = menu_item_add(menu, _("Pause slides_how"), G_CALLBACK(view_slideshow_pause_cb), vw); gtk_widget_set_sensitive(item, FALSE); } if (vw->fs) { menu_item_add(menu, _("Exit _full screen"), G_CALLBACK(view_fullscreen_cb), vw); } else { menu_item_add(menu, _("_Full screen"), G_CALLBACK(view_fullscreen_cb), vw); } menu_item_add_divider(menu); menu_item_add_stock(menu, _("C_lose window"), GTK_STOCK_CLOSE, G_CALLBACK(view_close_cb), vw); return menu;}/* *------------------------------------------------------------------- * dnd confirm dir *------------------------------------------------------------------- */typedef struct { ViewWindow *vw; GList *list;} CViewConfirmD;static void view_dir_list_cancel(GtkWidget *widget, gpointer data){ /* do nothing */}static void view_dir_list_do(ViewWindow *vw, GList *list, gint skip, gint recurse){ GList *work; view_window_set_list(vw, NULL); work = list; while (work) { gchar *path = work->data; work = work->next; if (isdir(path)) { if (!skip) { GList *list = NULL; if (recurse) { list = path_list_recursive(path); } else { path_list(path, &list, NULL); list = path_list_sort(list); list = path_list_filter(list, FALSE); } if (list) vw->list = g_list_concat(vw->list, list); } } else { /* FIXME: no filtering here */ vw->list = g_list_append(vw->list, g_strdup(path)); } } if (vw->list) { gchar *path; vw->list_pointer = vw->list; path = vw->list->data; image_change_path(vw->imd, path, image_zoom_get_default(vw->imd, zoom_mode)); work = vw->list->next; if (enable_read_ahead && work) { path = work->data; image_prebuffer_set(vw->imd, path); } } else { image_change_path(vw->imd, NULL, image_zoom_get_default(vw->imd, zoom_mode)); }}static void view_dir_list_add(GtkWidget *widget, gpointer data){ CViewConfirmD *d = data; view_dir_list_do(d->vw, d->list, FALSE, FALSE);}static void view_dir_list_recurse(GtkWidget *widget, gpointer data){ CViewConfirmD *d = data; view_dir_list_do(d->vw, d->list, FALSE, TRUE);}static void view_dir_list_skip(GtkWidget *widget, gpointer data){ CViewConfirmD *d = data; view_dir_list_do(d->vw, d->list, TRUE, FALSE);}static void view_dir_list_destroy(GtkWidget *widget, gpointer data){ CViewConfirmD *d = data; path_list_free(d->list); g_free(d);}static GtkWidget *view_confirm_dir_list(ViewWindow *vw, GList *list){ GtkWidget *menu; CViewConfirmD *d; d = g_new(CViewConfirmD, 1); d->vw = vw; d->list = list; menu = popup_menu_short_lived(); g_signal_connect(G_OBJECT(menu), "destroy", G_CALLBACK(view_dir_list_destroy), d); menu_item_add_stock(menu, _("Dropped list includes folders."), GTK_STOCK_DND_MULTIPLE, NULL, NULL); menu_item_add_divider(menu); menu_item_add_stock(menu, _("_Add contents"), GTK_STOCK_OK, G_CALLBACK(view_dir_list_add), d); menu_item_add_stock(menu, _("Add contents _recursive"), GTK_STOCK_ADD, G_CALLBACK(view_dir_list_recurse), d); menu_item_add_stock(menu, _("_Skip folders"), GTK_STOCK_REMOVE, G_CALLBACK(view_dir_list_skip), d); menu_item_add_divider(menu); menu_item_add_stock(menu, _("Cancel"), GTK_STOCK_CANCEL, G_CALLBACK(view_dir_list_cancel), d); return menu;}/* *----------------------------------------------------------------------------- * image drag and drop routines *----------------------------------------------------------------------------- */static void view_window_get_dnd_data(GtkWidget *widget, GdkDragContext *context, gint x, gint y, GtkSelectionData *selection_data, guint info, guint time, gpointer data){ ViewWindow *vw = data; ImageWindow *imd; if (gtk_drag_get_source_widget(context) == vw->imd->pr) return; imd = vw->imd; if (info == TARGET_URI_LIST || info == TARGET_APP_COLLECTION_MEMBER) { CollectionData *source; GList *list; GList *info_list; if (info == TARGET_URI_LIST) { GList *work; list = uri_list_from_text(selection_data->data, TRUE); work = list; while (work) { if (isdir((gchar *)work->data)) { GtkWidget *menu; menu = view_confirm_dir_list(vw, list); gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 0, time); return; } work = work->next; } list = path_list_filter(list, FALSE); source = NULL; info_list = NULL; } else { source = collection_from_dnd_data((gchar *)selection_data->data, &list, &info_list); } if (list) { gchar *path; path = list->data; if (isfile(path)) { view_slideshow_stop(vw); view_window_set_list(vw, NULL); if (source && info_list) { image_change_from_collection(imd, source, info_list->data, image_zoom_get_default(imd, zoom_mode)); } else { if (list->next) { vw->list = list; list = NULL; vw->list_pointer = vw->list; } image_change_path(imd, path, image_zoom_get_default(imd, zoom_mode)); } } } path_list_free(list); g_list_free(info_list); }}static void view_window_set_dnd_data(GtkWidget *widget, GdkDragContext *context, GtkSelectionData *selection_data, guint info, guint time, gpointer data){ ViewWindow *vw = data; const gchar *path; path = image_get_path(vw->imd); if (path) { gchar *text = NULL; gint len; gint plain_text; GList *list; switch (info) { case TARGET_URI_LIST: plain_text = FALSE; break; case TARGET_TEXT_PLAIN: default: plain_text = TRUE; break; } list = g_list_append(NULL, (gchar *)path); text = uri_text_from_list(list, &len, plain_text); g_list_free(list); if (text) { gtk_selection_data_set (selection_data, selection_data->target, 8, text, len); g_free(text); } } else { gtk_selection_data_set (selection_data, selection_data->target, 8, NULL, 0); }}static void view_window_dnd_init(ViewWindow *vw){ ImageWindow *imd; imd = vw->imd; gtk_drag_source_set(imd->pr, GDK_BUTTON2_MASK, dnd_file_drag_types, dnd_file_drag_types_count, GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK); g_signal_connect(G_OBJECT(imd->pr), "drag_data_get", G_CALLBACK(view_window_set_dnd_data), vw); gtk_drag_dest_set(imd->pr, GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_DROP, dnd_file_drop_types, dnd_file_drop_types_count, GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK); g_signal_connect(G_OBJECT(imd->pr), "drag_data_received", G_CALLBACK(view_window_get_dnd_data), vw);}/* *----------------------------------------------------------------------------- * maintenance (for rename, move, remove) *----------------------------------------------------------------------------- */static void view_real_removed(ViewWindow *vw, const gchar *path, GList *ignore_list){ ImageWindow *imd; const gchar *image_path; imd = view_window_active_image(vw); image_path = image_get_path(imd); if (image_path && strcmp(image_path, path) == 0) { if (vw->list) { view_list_step(vw, TRUE); if (image_get_path(imd) == image_path) { view_list_step(vw, FALSE); } } else if (view_window_contains_collection(vw)) { view_collection_step(vw, TRUE); if (image_get_path(imd) == image_path) { view_collection_step(vw, FALSE); } } if (image_get_path(imd) == image_path) { image_change_path(imd, NULL, image_zoom_get_default(imd, zoom_mode)); } } if (vw->list) { GList *work; GList *old; old = vw->list_pointer; work = vw->list; while (work) { gchar *chk_path; GList *chk_link; chk_path = work->data; chk_link = work; work = work->next; if (strcmp(chk_path, path) == 0) { if (vw->list_pointer == chk_link) { vw->list_pointer = (chk_link->next) ? chk_link->next : chk_link->prev; } vw->list = g_list_remove(vw->list, chk_path); g_free(chk_path); } } /* handles stepping correctly when same image is in the list more than once */ if (old && old != vw->list_pointer) { gchar *path; if (vw->list_pointer) { path = vw->list_pointer->data; } else { path = NULL; } image_change_path(imd, path, image_zoom_get_default(imd, zoom_mode)); } } if (vw->overlay_id != -1) image_overlay_update(imd, vw->overlay_id);}static void view_real_moved(ViewWindow *vw, const gchar *source, const gchar *dest){ ImageWindow *imd; const gchar *image_path; imd = view_window_active_image(vw); image_path = image_get_path(imd); if (image_path && strcmp(image_path, source) == 0) { image_set_path(imd, dest); } if (vw->list) { GList *work; work = vw->list; while (work) { gchar *chk_path; chk_path = work->data; if (strcmp(chk_path, source) == 0) { work->data = g_strdup(dest); g_free(chk_path); } work = work->next; } }}void view_window_maint_removed(const gchar *path, GList *ignore_list){ GList *work = view_window_list; while (work) { ViewWindow *vw = work->data; work = work->next; view_real_removed(vw, path, ignore_list); }}void view_window_maint_moved(const gchar *source, const gchar *dest){ GList *work = view_window_list; while (work) { ViewWindow *vw = work->data; work = work->next; view_real_moved(vw, source, dest); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -