r21886 - gnucash/branches/2.4 - [Bug #667900] no clipboard editing in Release 2.4.9

John Ralls jralls at code.gnucash.org
Wed Jan 25 01:04:30 EST 2012


Author: jralls
Date: 2012-01-25 01:04:30 -0500 (Wed, 25 Jan 2012)
New Revision: 21886
Trac: http://svn.gnucash.org/trac/changeset/21886

Modified:
   gnucash/branches/2.4/packaging/win32/defaults.sh
   gnucash/branches/2.4/src/register/register-gnome/gnucash-item-edit.c
Log:
[Bug #667900] no clipboard editing in Release 2.4.9

Update Gtk+ to 2.24.8 for Windows, to pick up da756d51 (win32: fix gdk clipboard).
Rewrite gnc_item_edit_cut_copy_clipboard and gnc_item_edit_paste_clipboard to use gtk_clipboard functions instead of the lower level gtk_selection functions.

Modified: gnucash/branches/2.4/packaging/win32/defaults.sh
===================================================================
--- gnucash/branches/2.4/packaging/win32/defaults.sh	2012-01-24 14:00:00 UTC (rev 21885)
+++ gnucash/branches/2.4/packaging/win32/defaults.sh	2012-01-25 06:04:30 UTC (rev 21886)
@@ -260,7 +260,7 @@
 set_default GLIB_DEV_URL            "$GNOME_WIN32_URL/glib/2.28/glib-dev_2.28.1-1_win32.zip"
 set_default GNOME_VFS_URL           "$GNOME_WIN32_URL/gnome-vfs/2.24/gnome-vfs_2.24.1-1_win32.zip"
 set_default GNOME_VFS_DEV_URL       "$GNOME_WIN32_URL/gnome-vfs/2.24/gnome-vfs-dev_2.24.1-1_win32.zip"
-GTK_VERSION="2.24.0"
+GTK_VERSION="2.24.8"
 set_default GTK_URL                 "$GNOME_WIN32_URL/gtk+/2.24/gtk+_${GTK_VERSION}-1_win32.zip"
 set_default GTK_DEV_URL             "$GNOME_WIN32_URL/gtk+/2.24/gtk+-dev_${GTK_VERSION}-1_win32.zip"
 set_default GTK_DOC_URL             "$GNOME_MIRROR/sources/gtk-doc/1.13/gtk-doc-1.13.tar.bz2"

Modified: gnucash/branches/2.4/src/register/register-gnome/gnucash-item-edit.c
===================================================================
--- gnucash/branches/2.4/src/register/register-gnome/gnucash-item-edit.c	2012-01-24 14:00:00 UTC (rev 21885)
+++ gnucash/branches/2.4/src/register/register-gnome/gnucash-item-edit.c	2012-01-25 06:04:30 UTC (rev 21886)
@@ -59,7 +59,6 @@
     TARGET_UTF8_STRING,
     TARGET_STRING,
     TARGET_TEXT,
-    TARGET_COMPOUND_TEXT
 };
 
 static GnomeCanvasItemClass *gnc_item_edit_parent_class;
@@ -831,6 +830,7 @@
 gnc_item_edit_cut_copy_clipboard (GncItemEdit *item_edit, guint32 time, gboolean cut)
 {
     GtkEditable *editable;
+    GtkClipboard *clipboard;
     gint start_sel, end_sel;
     gchar *clip;
 
@@ -842,16 +842,14 @@
     if (!gtk_editable_get_selection_bounds (editable, &start_sel, &end_sel))
         return;
 
-    g_free(item_edit->clipboard);
+    clipboard = gtk_widget_get_clipboard (GTK_WIDGET (editable),
+					  clipboard_atom);
+    g_return_if_fail (clipboard != NULL);
+    g_return_if_fail (GTK_IS_CLIPBOARD (clipboard));
+    clip = gtk_editable_get_chars (editable, start_sel, end_sel);
+    gtk_clipboard_set_text (clipboard, clip, -1);
+    g_free (clip);
 
-    if (gtk_selection_owner_set (GTK_WIDGET(item_edit->sheet),
-                                 clipboard_atom, time))
-        clip = gtk_editable_get_chars (editable, start_sel, end_sel);
-    else
-        clip = NULL;
-
-    item_edit->clipboard = clip;
-
     if (!cut)
         return;
 
@@ -873,17 +871,49 @@
     gnc_item_edit_cut_copy_clipboard(item_edit, time, FALSE);
 }
 
+static void
+paste_received (GtkClipboard *clipboard, const gchar *text, gpointer data)
+{
+    GtkEditable *editable = GTK_EDITABLE (data);
+    gboolean reselect = FALSE;
+    gint old_pos, tmp_pos;
+    gint start_sel, end_sel;
 
+    if (text == NULL)
+	return;
+    if (gtk_editable_get_selection_bounds (editable, &start_sel, &end_sel))
+    {
+	reselect = TRUE;
+	gtk_editable_delete_text (editable, start_sel, end_sel);
+    }
+
+    tmp_pos = old_pos = gtk_editable_get_position (editable);
+
+    gtk_editable_insert_text (editable, text, -1, &tmp_pos);
+    gtk_editable_set_position (editable, tmp_pos);
+
+    if (!reselect)
+	return;
+
+    gtk_editable_select_region (editable, old_pos,
+				gtk_editable_get_position (editable));
+
+}
+
 void
 gnc_item_edit_paste_clipboard (GncItemEdit *item_edit, guint32 time)
 {
+    GtkClipboard *clipboard;
     g_return_if_fail(item_edit != NULL);
     g_return_if_fail(GNC_IS_ITEM_EDIT(item_edit));
 
-    gtk_selection_convert(GTK_WIDGET(item_edit->sheet),
-                          clipboard_atom,
-                          gdk_atom_intern("UTF8_STRING", FALSE),
-                          time);
+    clipboard = gtk_widget_get_clipboard (GTK_WIDGET (item_edit->sheet),
+					  clipboard_atom);
+
+    g_return_if_fail (clipboard != NULL);
+    g_return_if_fail (GTK_IS_CLIPBOARD (clipboard));
+
+    gtk_clipboard_request_text (clipboard, paste_received, item_edit->editor);
 }
 
 
@@ -1202,7 +1232,6 @@
     static const GtkTargetEntry targets[] =
     {
         { "UTF8_STRING", 0, TARGET_UTF8_STRING },
-        { "COMPOUND_TEXT", 0, TARGET_COMPOUND_TEXT },
         { "TEXT",   0, TARGET_TEXT },
         { "STRING", 0, TARGET_STRING },
     };
@@ -1505,6 +1534,7 @@
 
     gint start_pos;
     gint end_pos;
+    GdkAtom selection = selection_data->selection;
 
     gchar *str;
     gint length;
@@ -1514,7 +1544,7 @@
 
     editable = GTK_EDITABLE (item_edit->editor);
 
-    if (selection_data->selection == GDK_SELECTION_PRIMARY)
+    if (selection == GDK_SELECTION_PRIMARY)
     {
         gtk_editable_get_selection_bounds (editable, &start_pos, &end_pos);
 



More information about the gnucash-changes mailing list