From 656ecb1635d903edac2c57d1308dd6938063ad5c Mon Sep 17 00:00:00 2001 From: Roland Pfeifer Date: Apr 20, 2020 6:01:11 PM allow copy 2 clipboard diff --git a/src/image_viewer.c b/src/image_viewer.c index ebacd73..f561d32 100644 --- a/src/image_viewer.c +++ b/src/image_viewer.c @@ -1991,6 +1991,42 @@ } +gboolean +rstto_image_viewer_copy_to_clipboard ( + RsttoImageViewer *viewer, + GtkWidget *window) +{ + GtkWidget *widget = GTK_WIDGET (viewer); + + if (viewer->priv->pixbuf) + { + gboolean load = TRUE; + guint width = gdk_pixbuf_get_width (viewer->priv->pixbuf); + guint height = gdk_pixbuf_get_height (viewer->priv->pixbuf); + // might also be helpful n_channels = gdk_pixbuf_get_n_channels (pixbuf); + // gdk_pixbuf_get_bits_per_sample (pixbuf) + if (width >= 1000 && height >= 1000) // Warn only for larger images + { + GtkWidget *dialog = gtk_message_dialog_new ( + GTK_WINDOW (window), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_QUESTION, + GTK_BUTTONS_YES_NO, + _( "Copying image to clipboard may consume a large amount of memory (even if application is terminated).\nDo you want to continue?" )); + int response = gtk_dialog_run (GTK_DIALOG (dialog)); + load = (response == GTK_RESPONSE_YES); + gtk_widget_destroy (dialog); + } + if (load) + { + GdkDisplay *display = gtk_widget_get_display (widget); + GtkClipboard *clipboard = gtk_clipboard_get_default (display); + gtk_clipboard_set_image (clipboard, viewer->priv->pixbuf); + } + return TRUE; + } + return FALSE; +} /************************/ /** CALLBACK FUNCTIONS **/ diff --git a/src/image_viewer.h b/src/image_viewer.h index 7ce0615..471c760 100644 --- a/src/image_viewer.h +++ b/src/image_viewer.h @@ -124,6 +124,10 @@ rstto_image_viewer_is_busy ( RsttoImageViewer *viewer ); +gboolean +rstto_image_viewer_copy_to_clipboard ( + RsttoImageViewer *viewer, + GtkWidget *window); G_END_DECLS diff --git a/src/main_window.c b/src/main_window.c index 7978f79..664550f 100644 --- a/src/main_window.c +++ b/src/main_window.c @@ -389,6 +389,8 @@ GParamSpec *pspec, gpointer user_data); +static void +cb_rstto_main_window_copy_to_clipboard (GtkWidget *widget, RsttoMainWindow *window); static GtkWidgetClass *parent_class = NULL; @@ -438,6 +440,12 @@ "Q", /* Keyboard shortcut */ N_ ("Quit Ristretto"), /* Tooltip text */ G_CALLBACK (cb_rstto_main_window_quit), }, + { "copy-to-clipboard", + "edit-copy", /* Icon-name */ + N_ ("_Copy"), /* Label-text */ + "C", /* Keyboard shortcut */ + N_ ("Copy image to clipboard"), /* Tooltip text */ + G_CALLBACK (cb_rstto_main_window_copy_to_clipboard), }, /* Edit Menu */ { "edit-menu", NULL, @@ -836,6 +844,7 @@ GClosure *quit_closure = g_cclosure_new ((GCallback)cb_rstto_main_window_quit, window, NULL); GClosure *delete_closure = g_cclosure_new ((GCallback)cb_rstto_main_window_delete, window, NULL); GClosure *refresh_closure = g_cclosure_new ((GCallback)cb_rstto_main_window_refresh, window, NULL); + GClosure *copy_to_clipboard_closure = g_cclosure_new ((GCallback)cb_rstto_main_window_copy_to_clipboard, window, NULL); guint navigationbar_position = 3; guint thumbnail_size = 3; @@ -924,6 +933,7 @@ gtk_accel_group_connect_by_path (accel_group, "/quit", quit_closure); gtk_accel_group_connect_by_path (accel_group, "/delete", delete_closure); gtk_accel_group_connect_by_path (accel_group, "/refresh", refresh_closure); + gtk_accel_group_connect_by_path (accel_group, "/copy-to-clipboard", copy_to_clipboard_closure); /* Set default accelerators */ @@ -1706,7 +1716,8 @@ //"/main-menu/file-menu/print", "/main-menu/file-menu/properties", "/main-menu/file-menu/close", - "/main-menu/edit-menu/delete" + "/main-menu/edit-menu/delete", + "/main-menu/edit-menu/copy-to-clipboard" }; for (i = 0; i < G_N_ELEMENTS (actions); ++i) @@ -1775,7 +1786,8 @@ "/image-viewer-menu/zoom-in", "/image-viewer-menu/zoom-out", "/image-viewer-menu/zoom-100", - "/image-viewer-menu/zoom-fit" + "/image-viewer-menu/zoom-fit", + "/image-viewer-menu/copy-to-clipboard" }; for (i = 0; i < G_N_ELEMENTS (actions); ++i) @@ -3644,6 +3656,25 @@ gtk_widget_hide (window->priv->warning); } +static void +cb_rstto_main_window_copy_to_clipboard ( + GtkWidget *widget, + RsttoMainWindow *window) +{ + if (!rstto_image_viewer_copy_to_clipboard ( + RSTTO_IMAGE_VIEWER( window->priv->image_viewer ), GTK_WIDGET( window ))) + { + GtkWidget *dialog = gtk_message_dialog_new ( + GTK_WINDOW (window), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_OK, + _("An error occurred when copying image to clipboard.") ); + gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy (dialog); + } +} + /** * cb_rstto_main_window_edit: * @widget: diff --git a/src/main_window_ui.xml b/src/main_window_ui.xml index 600da60..6d5853a 100644 --- a/src/main_window_ui.xml +++ b/src/main_window_ui.xml @@ -25,6 +25,8 @@ + + @@ -106,6 +108,7 @@ +