[Gnucash-changes] r14322 - gnucash/trunk - Use UTF8_STRING for copy/pastes, as it's at least 4 whole characters better than just "STRING".

Joshua Sled jsled at cvs.gnucash.org
Sun Jun 4 17:43:46 EDT 2006


Author: jsled
Date: 2006-06-04 17:43:45 -0400 (Sun, 04 Jun 2006)
New Revision: 14322
Trac: http://svn.gnucash.org/trac/changeset/14322

Modified:
   gnucash/trunk/ChangeLog
   gnucash/trunk/src/register/register-gnome/gnucash-item-edit.c
Log:
Use UTF8_STRING for copy/pastes, as it's at least 4 whole characters better than just "STRING".


Modified: gnucash/trunk/ChangeLog
===================================================================
--- gnucash/trunk/ChangeLog	2006-06-04 21:02:26 UTC (rev 14321)
+++ gnucash/trunk/ChangeLog	2006-06-04 21:43:45 UTC (rev 14322)
@@ -6,6 +6,13 @@
 
 2006-06-04  Joshua Sled  <jsled at asynchronous.org>
 
+	* src/register/register-gnome/gnucash-item-edit.c (gnc_item_edit_selection_received) 
+	(gnc_item_edit_selection_get, gnc_item_edit_paste_clipboard) 
+	(gnc_item_edit_paste_primary, gnc_item_edit_new): Use the
+	selection type UTF8_STRING for copy/paste rather than the combination
+	of COMPOUND_TEXT, TEXT and STRING, as the LCD STRING is inadequate
+	for interesting characters, and it is what the rest of GTK does.
+
 	* src/register/register-gnome/gnucash-item-edit.c
 	(gnc_item_edit_selection_get),
 	(gnc_item_edit_selection_received): Handle selections more

Modified: gnucash/trunk/src/register/register-gnome/gnucash-item-edit.c
===================================================================
--- gnucash/trunk/src/register/register-gnome/gnucash-item-edit.c	2006-06-04 21:02:26 UTC (rev 14321)
+++ gnucash/trunk/src/register/register-gnome/gnucash-item-edit.c	2006-06-04 21:43:45 UTC (rev 14322)
@@ -54,6 +54,7 @@
 
 /* values for selection info */
 enum {
+        TARGET_UTF8_STRING,
         TARGET_STRING,
         TARGET_TEXT,
         TARGET_COMPOUND_TEXT
@@ -61,7 +62,6 @@
 
 static GnomeCanvasItemClass *gnc_item_edit_parent_class;
 static GdkAtom clipboard_atom = GDK_NONE;
-static GdkAtom ctext_atom = GDK_NONE;
 
 
 typedef struct _TextDrawInfo TextDrawInfo;
@@ -810,7 +810,6 @@
         gnc_item_edit_cut_copy_clipboard(item_edit, time, TRUE);
 }
 
-
 void
 gnc_item_edit_copy_clipboard (GncItemEdit *item_edit, guint32 time)
 {
@@ -824,11 +823,10 @@
         g_return_if_fail(item_edit != NULL);
         g_return_if_fail(GNC_IS_ITEM_EDIT(item_edit));
 
-        if (ctext_atom == GDK_NONE)
-                ctext_atom = gdk_atom_intern ("COMPOUND_TEXT", FALSE);
-
         gtk_selection_convert(GTK_WIDGET(item_edit->sheet), 
-                              clipboard_atom, ctext_atom, time);
+                              clipboard_atom,
+                              gdk_atom_intern("UTF8_STRING", FALSE),
+                              time);
 }
 
 
@@ -838,11 +836,10 @@
         g_return_if_fail(item_edit != NULL);
         g_return_if_fail(GNC_IS_ITEM_EDIT(item_edit));
 
-        if (ctext_atom == GDK_NONE)
-                ctext_atom = gdk_atom_intern ("COMPOUND_TEXT", FALSE);
-
         gtk_selection_convert(GTK_WIDGET(item_edit->sheet), 
-                              GDK_SELECTION_PRIMARY, ctext_atom, time);
+                              GDK_SELECTION_PRIMARY,
+                              gdk_atom_intern("UTF8_STRING", FALSE),
+                              time);
 }
 
 
@@ -1142,9 +1139,10 @@
 gnc_item_edit_new (GnomeCanvasGroup *parent, GnucashSheet *sheet, GtkWidget *entry)
 {
         static const GtkTargetEntry targets[] = {
-                { "STRING", 0, TARGET_STRING },
+                { "UTF8_STRING", 0, TARGET_UTF8_STRING },
+                { "COMPOUND_TEXT", 0, TARGET_COMPOUND_TEXT },
                 { "TEXT",   0, TARGET_TEXT }, 
-                { "COMPOUND_TEXT", 0, TARGET_COMPOUND_TEXT }
+                { "STRING", 0, TARGET_STRING },
         };
         static const gint n_targets = sizeof(targets) / sizeof(targets[0]);
 
@@ -1461,44 +1459,16 @@
                 str = gtk_editable_get_chars(editable, start_pos, end_pos);
         }
         else /* CLIPBOARD */
+        {
                 str = item_edit->clipboard;
+        }
 
         if (str == NULL)
                 return;
 
         length = strlen(str);
-  
-        if (info == TARGET_STRING)
-        {
-                gtk_selection_data_set (selection_data,
-                                        GDK_SELECTION_TYPE_STRING,
-                                        8 * sizeof(gchar), (guchar *) str,
-                                        length);
-        }
-        else if ((info == TARGET_TEXT) || (info == TARGET_COMPOUND_TEXT))
-        {
-                guchar *text;
-                gchar c;
-                GdkAtom encoding;
-                gint format;
-                gint new_length;
+        gtk_selection_data_set_text(selection_data, str, length);
 
-                c = str[length];
-                str[length] = '\0';
-
-                gdk_utf8_to_compound_text(str, &encoding, &format,
-                                          &text, &new_length);
-                // for some reason, format is set to '0', which makes GTK
-                // complain. -- jsled
-                format = 8;
-                gtk_selection_data_set(selection_data, encoding,
-                                       format, text, new_length);
-
-                gdk_free_compound_text(text);
-
-                str[length] = c;
-        }
-
         if (str != item_edit->clipboard)
                 g_free(str);
 }
@@ -1514,20 +1484,22 @@
         gint old_pos;
         gint tmp_pos;
 	gint start_sel, end_sel;
-        enum {INVALID, STRING, CTEXT} type;
+        enum {INVALID, CTEXT} type;
 
         g_return_if_fail(item_edit != NULL);
         g_return_if_fail(GNC_IS_ITEM_EDIT(item_edit));
 
         editable = GTK_EDITABLE(item_edit->editor);
 
-        if (selection_data->type == GDK_TARGET_STRING)
+        /* @fixme: this should implement the fallback logic from
+         * gtkclipboard.c:request_text_received_func.  It'd be nice to have a
+         * good way to test the various request types. :( --jsled **/
+
+        if (selection_data->type == GDK_TARGET_STRING
+            || selection_data->type == gdk_atom_intern("UTF8_STRING", FALSE)
+            || selection_data->type == gdk_atom_intern("COMPOUND_TEXT", FALSE)
+            || selection_data->type == gdk_atom_intern("TEXT", FALSE))
         {
-                type = STRING;
-        }
-        else if (selection_data->type == gdk_atom_intern("COMPOUND_TEXT", FALSE)
-                 || selection_data->type == gdk_atom_intern("TEXT", FALSE))
-        {
                 type = CTEXT;
         }
         else
@@ -1559,45 +1531,19 @@
 
         tmp_pos = old_pos = gtk_editable_get_position (editable);
 
-        switch (type)
         {
-                case STRING:
-                        selection_data->data[selection_data->length] = 0;
-
-                        gtk_editable_insert_text
-                                (editable, (gchar *) selection_data->data,
-                                 strlen((gchar *)selection_data->data),
-                                 &tmp_pos);
-
+                guchar *sel = gtk_selection_data_get_text(selection_data);
+        
+                if (sel)
+                {
+                        gtk_editable_insert_text(editable,
+                                                 sel, strlen(sel),
+                                                 &tmp_pos);
                         gtk_editable_set_position(editable, tmp_pos);
-                        break;
-                case CTEXT: {
-                        gchar **list;
-                        gint count;
-                        gint i;
-
-                        count = gdk_text_property_to_utf8_list
-                                (selection_data->type, selection_data->format, 
-                                 selection_data->data, selection_data->length,
-                                 &list);
-
-                        for (i = 0; i < count; i++) 
-                        {
-                                gtk_editable_insert_text(editable,
-                                                         list[i],
-                                                         strlen(list[i]),
-                                                         &tmp_pos);
-                                gtk_editable_set_position(editable, tmp_pos);
-                        }
-
-                        if (count > 0)
-                                gdk_free_text_list(list);
+                        g_free(sel);
                 }
-                break;
-                case INVALID: /* quiet compiler */
-                        break;
         }
-
+        
         if (!reselect)
                 return;
 



More information about the gnucash-changes mailing list