File pinentry-0.8.1-allow_paste_gtk2.patch of Package pinentry

Index: pinentry-0.8.1/gtk+-2/gtksecentry.c
===================================================================
--- pinentry-0.8.1.orig/gtk+-2/gtksecentry.c	2010-04-19 13:25:38.000000000 +0200
+++ pinentry-0.8.1/gtk+-2/gtksecentry.c	2011-09-16 15:07:38.317559117 +0200
@@ -56,6 +56,7 @@
     ACTIVATE,
     MOVE_CURSOR,
     INSERT_AT_CURSOR,
+    PASTE_CLIPBOARD,
     DELETE_FROM_CURSOR,
     LAST_SIGNAL
 };
@@ -166,6 +167,7 @@
 					 gboolean extend_selection);
 static void gtk_secure_entry_insert_at_cursor(GtkSecureEntry * entry,
 					      const gchar * str);
+static void gtk_secure_entry_paste_clipboard(GtkSecureEntry * entry);
 static void gtk_secure_entry_delete_from_cursor(GtkSecureEntry * entry,
 						GtkDeleteType type,
 						gint count);
@@ -422,6 +424,7 @@
 
     class->move_cursor = gtk_secure_entry_move_cursor;
     class->insert_at_cursor = gtk_secure_entry_insert_at_cursor;
+    class->paste_clipboard = gtk_secure_entry_paste_clipboard;
     class->delete_from_cursor = gtk_secure_entry_delete_from_cursor;
     class->activate = gtk_secure_entry_real_activate;
 
@@ -530,6 +533,14 @@
 		     _gtk_marshal_VOID__STRING, G_TYPE_NONE, 1,
 		     G_TYPE_STRING);
 
+    signals[PASTE_CLIPBOARD] =
+	g_signal_new("paste_clipboard",
+		     G_OBJECT_CLASS_TYPE(gobject_class),
+		     G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+		     G_STRUCT_OFFSET(GtkSecureEntryClass, paste_clipboard),
+		     NULL, NULL,
+		     _gtk_marshal_VOID__VOID, G_TYPE_NONE, 0);
+
     signals[DELETE_FROM_CURSOR] =
 	g_signal_new("delete_from_cursor",
 		     G_OBJECT_CLASS_TYPE(gobject_class),
@@ -650,6 +661,13 @@
 				 GDK_CONTROL_MASK, "delete_from_cursor", 2,
 				 G_TYPE_ENUM, GTK_DELETE_WORD_ENDS,
 				 G_TYPE_INT, -1);
+
+    /* activate clipboard */
+    /* TODO: mouse middle button */
+    gtk_binding_entry_add_signal (binding_set, GDK_v, GDK_CONTROL_MASK,
+                                 "paste_clipboard", 0);
+    gtk_binding_entry_add_signal (binding_set, GDK_Insert, GDK_SHIFT_MASK,
+                                 "paste_clipboard", 0);
 }
 
 static void
@@ -1253,6 +1271,7 @@
 gtk_secure_entry_key_press(GtkWidget * widget, GdkEventKey * event)
 {
     GtkSecureEntry *entry = GTK_SECURE_ENTRY(widget);
+    GtkEditable *editable = GTK_EDITABLE (widget);
 
     gtk_secure_entry_pend_cursor_blink(entry);
 
@@ -1804,6 +1823,36 @@
 }
 
 static void
+paste_from_clipboard (GtkClipboard *clipboard,
+                      const gchar *text, gpointer data)
+{
+    GtkSecureEntry *entry = GTK_SECURE_ENTRY(data);
+    GtkEditable *editable = GTK_EDITABLE(entry);
+    gint length;
+
+    if (!text) return;
+
+    length = strlen(text);
+    gint pos = entry->current_pos + length;
+
+    gtk_secure_entry_insert_text(entry, text, length, &pos);
+    gtk_editable_set_position(editable, pos);
+}
+
+/* TODO: gtk_secure_entry_copy_clipboard (editable); */
+/* TODO: gtk_secure_entry_cut_clipboard (editable); */
+static void
+gtk_secure_entry_paste_clipboard(GtkSecureEntry * entry)
+{
+    GtkEditable *editable = GTK_EDITABLE(entry);
+    gtk_secure_entry_reset_im_context(entry);
+
+    /* TODO: different clipboards */
+    gtk_clipboard_request_text (gtk_widget_get_clipboard (GTK_WIDGET (entry), GDK_SELECTION_CLIPBOARD),
+		                paste_from_clipboard, entry);
+}
+
+static void
 gtk_secure_entry_delete_from_cursor(GtkSecureEntry * entry,
 				    GtkDeleteType type, gint count)
 {
Index: pinentry-0.8.1/gtk+-2/gtksecentry.h
===================================================================
--- pinentry-0.8.1.orig/gtk+-2/gtksecentry.h	2010-05-12 17:33:52.000000000 +0200
+++ pinentry-0.8.1/gtk+-2/gtksecentry.h	2011-09-15 09:50:39.717727093 +0200
@@ -121,6 +121,7 @@
 			 GtkMovementStep step,
 			 gint count, gboolean extend_selection);
     void (*insert_at_cursor) (GtkSecureEntry * entry, const gchar * str);
+    void (*paste_clipboard) (GtkSecureEntry * entry);
     void (*delete_from_cursor) (GtkSecureEntry * entry,
 				GtkDeleteType type, gint count);
openSUSE Build Service is sponsored by