From 75ccd57dbf8d26eb0d393a81f48b2337324fb7f3 Mon Sep 17 00:00:00 2001 From: John Ralls Date: Tue, 4 Sep 2018 11:08:25 -0700 Subject: [PATCH] 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. --- .../register/register-gnome/gnucash-sheet.c | 24 +++++++++++++++---- .../register/register-gnome/gnucash-sheetP.h | 1 + 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/gnucash/register/register-gnome/gnucash-sheet.c b/gnucash/register/register-gnome/gnucash-sheet.c index d3f68aca6c..7e226424c8 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 and 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 bd2ec3c2cb..888106832d 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; };