gnucash maint: Bug 796734 - Auto-complete entry not highlighting to allow...

John Ralls jralls at code.gnucash.org
Tue Sep 4 18:12:27 EDT 2018


Updated	 via  https://github.com/Gnucash/gnucash/commit/75ccd57d (commit)
	from  https://github.com/Gnucash/gnucash/commit/f6d873dc (commit)



commit 75ccd57dbf8d26eb0d393a81f48b2337324fb7f3
Author: John Ralls <jralls at ceridwen.us>
Date:   Tue Sep 4 11:08:25 2018 -0700

    Bug 796734 - Auto-complete entry not highlighting to allow...
    
    for incremental entry.
    
    Because the Quartz Input Method module (imquartz.c) messes with the
    selected text, so we cache it in the gnucash_sheet object and restore it
    after the input module is done with the keypress.

diff --git a/gnucash/register/register-gnome/gnucash-sheet.c b/gnucash/register/register-gnome/gnucash-sheet.c
index d3f68ac..7e22642 100644
--- a/gnucash/register/register-gnome/gnucash-sheet.c
+++ b/gnucash/register/register-gnome/gnucash-sheet.c
@@ -1040,6 +1040,9 @@ gnucash_sheet_insert_cb (GtkWidget *widget,
 
     if (start_sel != end_sel)
         gtk_editable_select_region(editable, start_sel, end_sel);
+    /* Save the selected region in case the input module eats it. */
+    sheet->start_sel = start_sel;
+    sheet->end_sel = end_sel;
 
     g_string_free (new_text_gs, TRUE);
     g_string_free (change_text_gs, TRUE);
@@ -1810,10 +1813,17 @@ gnucash_sheet_key_press_event_internal (GtkWidget *widget, GdkEventKey *event)
     if (pass_on)
     {
         gboolean result = FALSE;
-        // If sheet is readonly, entry is not realized
-        if (gtk_widget_get_realized (GTK_WIDGET(sheet->entry)))
-            result = gtk_widget_event (sheet->entry, (GdkEvent *) event);
+        GtkEditable *editable = GTK_EDITABLE(sheet->entry);
 
+        // If sheet is readonly, entry is not realized
+        if (gtk_widget_get_realized (GTK_WIDGET(editable)))
+            result = gtk_widget_event (GTK_WIDGET(editable), (GdkEvent*)event);
+        /* Restore the stored selection in case it was eaten by the input
+         * module.
+         */
+        if (sheet->start_sel != sheet->end_sel)
+            gtk_editable_select_region(editable, sheet->start_sel,
+                                       sheet->end_sel);
         return result;
     }
 
@@ -1834,13 +1844,15 @@ static gint
 gnucash_sheet_key_press_event (GtkWidget *widget, GdkEventKey *event)
 {
     GnucashSheet *sheet;
+    GtkEditable *editable = NULL;
+    int start_sel = 0, end_sel = 0;
 
     g_return_val_if_fail(widget != NULL, TRUE);
     g_return_val_if_fail(GNUCASH_IS_SHEET(widget), TRUE);
     g_return_val_if_fail(event != NULL, TRUE);
 
     sheet = GNUCASH_SHEET (widget);
-
+    editable = GTK_EDITABLE(sheet->entry);
     /* bug#60582 comment#27 2
            save shift state to enable <shift minus> and <shift equal>
        bug#618434
@@ -1861,6 +1873,9 @@ gnucash_sheet_key_press_event (GtkWidget *widget, GdkEventKey *event)
         sheet->shift_state = event->state & GDK_SHIFT_MASK;
         sheet->keyval_state = (event->keyval == GDK_KEY_KP_Decimal) ? GDK_KEY_KP_Decimal : 0;
     }
+
+    gtk_editable_get_selection_bounds (editable, &start_sel, &end_sel);
+
     if (gtk_im_context_filter_keypress (sheet->im_context, event))
     {
         sheet->need_im_reset = TRUE;
@@ -2590,6 +2605,7 @@ gnucash_sheet_init (GnucashSheet *sheet)
     sheet->delete_surrounding_signal = 0;
     sheet->shift_state = 0;
     sheet->keyval_state = 0;
+    sheet->start_sel = sheet->end_sel = 0;
 }
 
 
diff --git a/gnucash/register/register-gnome/gnucash-sheetP.h b/gnucash/register/register-gnome/gnucash-sheetP.h
index bd2ec3c..8881068 100644
--- a/gnucash/register/register-gnome/gnucash-sheetP.h
+++ b/gnucash/register/register-gnome/gnucash-sheetP.h
@@ -112,6 +112,7 @@ struct _GnucashSheet
 
     guint shift_state;
     guint keyval_state;
+    int start_sel, end_sel;
 
 };
 



Summary of changes:
 gnucash/register/register-gnome/gnucash-sheet.c  | 24 ++++++++++++++++++++----
 gnucash/register/register-gnome/gnucash-sheetP.h |  1 +
 2 files changed, 21 insertions(+), 4 deletions(-)



More information about the gnucash-changes mailing list