changeset 2558:a8db80c1aea2

Fix #302: possibility to copy exif field values from the info sidebar Copy info sidebar exif values to the clipboard.
author Colin Clark <colin.clark@cclark.uk>
date Fri, 14 Jul 2017 17:02:29 +0100
parents 20045d6aef1d
children 2b49bbaa9045
files src/bar_exif.c
diffstat 1 files changed, 37 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/bar_exif.c	Thu Jul 13 12:00:17 2017 +0100
+++ b/src/bar_exif.c	Fri Jul 14 17:02:29 2017 +0100
@@ -97,7 +97,8 @@
 static void bar_pane_exif_update(PaneExifData *ped);
 static gboolean bar_pane_exif_menu_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data);
 static void bar_pane_exif_notify_cb(FileData *fd, NotifyType type, gpointer data);
-
+static gboolean bar_pane_exif_mouse_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data);
+static gboolean bar_pane_exif_copy_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data);
 
 static void bar_pane_exif_entry_changed(GtkEntry *text_entry, gpointer data)
 {
@@ -185,6 +186,7 @@
 
 	bar_pane_exif_entry_dnd_init(ee->ebox);
 	g_signal_connect(ee->ebox, "button_release_event", G_CALLBACK(bar_pane_exif_menu_cb), ped);
+	g_signal_connect(ee->ebox, "button_press_event", G_CALLBACK(bar_pane_exif_copy_cb), ped);
 
 	bar_pane_exif_setup_entry_box(ped, ee);
 
@@ -598,6 +600,19 @@
 	gtk_widget_destroy(entry);
 }
 
+static void bar_pane_exif_copy_entry_cb(GtkWidget *menu_widget, gpointer data)
+{
+	GtkWidget *widget = data;
+	GtkClipboard *clipboard;
+	const gchar *value;
+	ExifEntry *ee;
+
+	ee = g_object_get_data(G_OBJECT(widget), "entry_data");
+	value = gtk_label_get_text(GTK_LABEL(ee->value_widget));
+	clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
+	gtk_clipboard_set_text(clipboard, value, -1);
+}
+
 static void bar_pane_exif_toggle_show_all_cb(GtkWidget *menu_widget, gpointer data)
 {
 	PaneExifData *ped = data;
@@ -619,9 +634,11 @@
 		/* for the entry */
 		gchar *conf = g_strdup_printf(_("Configure \"%s\""), ee->title);
 		gchar *del = g_strdup_printf(_("Remove \"%s\""), ee->title);
+		gchar *copy = g_strdup_printf(_("Copy \"%s\""), ee->title);
 
 		menu_item_add_stock(menu, conf, GTK_STOCK_EDIT, G_CALLBACK(bar_pane_exif_conf_dialog_cb), widget);
 		menu_item_add_stock(menu, del, GTK_STOCK_DELETE, G_CALLBACK(bar_pane_exif_delete_entry_cb), widget);
+		menu_item_add_stock(menu, copy, GTK_STOCK_COPY, G_CALLBACK(bar_pane_exif_copy_entry_cb), widget);
 		menu_item_add_divider(menu);
 
 		g_free(conf);
@@ -646,6 +663,25 @@
 	return FALSE;
 }
 
+static gboolean bar_pane_exif_copy_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
+{
+	const gchar *value;
+	GtkClipboard *clipboard;
+	ExifEntry *ee;
+
+	if (bevent->button == MOUSE_BUTTON_LEFT)
+		{
+		ee = g_object_get_data(G_OBJECT(widget), "entry_data");
+		value = gtk_label_get_text(GTK_LABEL(ee->value_widget));
+		clipboard = gtk_clipboard_get(GDK_SELECTION_PRIMARY);
+		gtk_clipboard_set_text(clipboard, value, -1);
+
+		return TRUE;
+		}
+
+	return FALSE;
+}
+
 
 
 static void bar_pane_exif_entry_write_config(GtkWidget *entry, GString *outstr, gint indent)