From fd5f6ef57f2a8bf64237fc8a7bca5f7ce62e9e44 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Tue, 23 Jun 2020 22:39:16 -0400 Subject: [PATCH 1/5] gtk-demo: Improve the entry completion demo Add more strings. --- demos/gtk-demo/entry_completion.c | 48 ++++++++++++++++++++++++------- 1 file changed, 37 insertions(+), 11 deletions(-) diff --git a/demos/gtk-demo/entry_completion.c b/demos/gtk-demo/entry_completion.c index 11ff063a42..a9949c2fc8 100644 --- a/demos/gtk-demo/entry_completion.c +++ b/demos/gtk-demo/entry_completion.c @@ -12,22 +12,48 @@ static GtkTreeModel * create_completion_model (void) { + const char *strings[] = { + "GNOME", + "gnominious", + "Gnomonic projection", + "Gnosophy", + "total", + "totally", + "toto", + "tottery", + "totterer", + "Totten trust", + "Tottenham hotspurs", + "totipotent", + "totipotency", + "totemism", + "totem pole", + "Totara", + "totalizer", + "totalizator", + "totalitarianism", + "total parenteral nutrition", + "total eclipse", + "Totipresence", + "Totipalmi", + "zombie", + "aæx", + "aæy", + "aæz", + NULL + }; + int i; GtkListStore *store; GtkTreeIter iter; store = gtk_list_store_new (1, G_TYPE_STRING); - /* Append one word */ - gtk_list_store_append (store, &iter); - gtk_list_store_set (store, &iter, 0, "GNOME", -1); - - /* Append another word */ - gtk_list_store_append (store, &iter); - gtk_list_store_set (store, &iter, 0, "total", -1); - - /* And another word */ - gtk_list_store_append (store, &iter); - gtk_list_store_set (store, &iter, 0, "totally", -1); + for (i = 0; strings[i]; i++) + { + /* Append one word */ + gtk_list_store_append (store, &iter); + gtk_list_store_set (store, &iter, 0, strings[i], -1); + } return GTK_TREE_MODEL (store); } From 3656994f82585e3b5b65072fb05736fa520b709d Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 24 Jun 2020 00:27:21 -0400 Subject: [PATCH 2/5] gtk-demo: Enable inline completion Enable inline completion in the entry completion demo, to have some code exercising this feature. It is broken. --- demos/gtk-demo/entry_completion.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/demos/gtk-demo/entry_completion.c b/demos/gtk-demo/entry_completion.c index a9949c2fc8..40d64bd8b6 100644 --- a/demos/gtk-demo/entry_completion.c +++ b/demos/gtk-demo/entry_completion.c @@ -107,6 +107,9 @@ do_entry_completion (GtkWidget *do_widget) /* Use model column 0 as the text column */ gtk_entry_completion_set_text_column (completion, 0); + + gtk_entry_completion_set_inline_completion (completion, TRUE); + gtk_entry_completion_set_inline_selection (completion, TRUE); } if (!gtk_widget_get_visible (window)) From bce518b214fe127aae6d3f14b480761d1105feee Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 24 Jun 2020 00:26:27 -0400 Subject: [PATCH 3/5] entrycompletion: Various fixes Fix various issues that prevented inline completion and inline selection from working reliably. We were passing byte counts to gtk_editable_select_region in one place, but that function expects char counts. We were listening for GtkEditable::insert-text on the GtkText widget, but that does not emit those signals, so listen for GtkEntryBuffer::inserted-text instead. Finally, we were not clearing the stored completion_prefix enough, leading to situations where the stored prefix does not match the text in the entry anymore. --- gtk/gtkentrycompletion.c | 50 ++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/gtk/gtkentrycompletion.c b/gtk/gtkentrycompletion.c index cfb4430ebf..3977d6bf51 100644 --- a/gtk/gtkentrycompletion.c +++ b/gtk/gtkentrycompletion.c @@ -1351,23 +1351,24 @@ gtk_entry_completion_insert_completion_text (GtkEntryCompletion *completion, { gint len; GtkText *text = gtk_entry_get_text_widget (GTK_ENTRY (completion->entry)); + GtkEntryBuffer *buffer = gtk_text_get_buffer (text); if (completion->changed_id > 0) g_signal_handler_block (text, completion->changed_id); if (completion->insert_text_id > 0) - g_signal_handler_block (text, completion->insert_text_id); + g_signal_handler_block (buffer, completion->insert_text_id); gtk_editable_set_text (GTK_EDITABLE (completion->entry), new_text); - len = strlen (completion->completion_prefix); + len = g_utf8_strlen (completion->completion_prefix, -1); gtk_editable_select_region (GTK_EDITABLE (completion->entry), len, -1); if (completion->changed_id > 0) g_signal_handler_unblock (text, completion->changed_id); if (completion->insert_text_id > 0) - g_signal_handler_unblock (text, completion->insert_text_id); + g_signal_handler_unblock (buffer, completion->insert_text_id); } static gboolean @@ -1403,9 +1404,10 @@ gtk_entry_completion_insert_prefix (GtkEntryCompletion *completion) gboolean done; gchar *prefix; GtkText *text = gtk_entry_get_text_widget (GTK_ENTRY (completion->entry)); + GtkEntryBuffer *buffer = gtk_text_get_buffer (text); if (completion->insert_text_id > 0) - g_signal_handler_block (text, completion->insert_text_id); + g_signal_handler_block (buffer, completion->insert_text_id); prefix = gtk_entry_completion_compute_prefix (completion, gtk_editable_get_text (GTK_EDITABLE (completion->entry))); @@ -1418,7 +1420,7 @@ gtk_entry_completion_insert_prefix (GtkEntryCompletion *completion) } if (completion->insert_text_id > 0) - g_signal_handler_unblock (text, completion->insert_text_id); + g_signal_handler_unblock (buffer, completion->insert_text_id); } /** @@ -1859,10 +1861,7 @@ gtk_entry_completion_key_pressed (GtkEventControllerKey *controller, keypress_completion_out: if (completion->inline_selection) - { - g_free (completion->completion_prefix); - completion->completion_prefix = NULL; - } + g_clear_pointer (&completion->completion_prefix, g_free); return retval; } @@ -1873,8 +1872,7 @@ keypress_completion_out: gtk_entry_reset_im_context (GTK_ENTRY (widget)); _gtk_entry_completion_popdown (completion); - g_free (completion->completion_prefix); - completion->completion_prefix = NULL; + g_clear_pointer (&completion->completion_prefix, g_free); return FALSE; } @@ -1925,12 +1923,13 @@ keypress_completion_out: retval = FALSE; } - g_free (completion->completion_prefix); - completion->completion_prefix = NULL; + g_clear_pointer (&completion->completion_prefix, g_free); return retval; } + g_clear_pointer (&completion->completion_prefix, g_free); + return FALSE; } @@ -2014,11 +2013,11 @@ text_focus_out (GtkEntryCompletion *completion) } static void -completion_insert_text_callback (GtkText *entry, - const gchar *text, - gint length, - gint position, - GtkEntryCompletion *completion) +completion_inserted_text_callback (GtkEntryBuffer *buffer, + guint position, + const char *text, + guint length, + GtkEntryCompletion *completion) { if (!completion->inline_completion) return; @@ -2041,6 +2040,7 @@ connect_completion_signals (GtkEntryCompletion *completion) { GtkEventController *controller; GtkText *text = gtk_entry_get_text_widget (GTK_ENTRY (completion->entry)); + GtkEntryBuffer *buffer = gtk_text_get_buffer (text); controller = completion->entry_key_controller = gtk_event_controller_key_new (); gtk_event_controller_set_name (controller, "gtk-entry-completion"); @@ -2055,10 +2055,10 @@ connect_completion_signals (GtkEntryCompletion *completion) completion->changed_id = g_signal_connect (text, "changed", G_CALLBACK (gtk_entry_completion_changed), completion); - completion->insert_text_id = - g_signal_connect (text, "insert-text", G_CALLBACK (completion_insert_text_callback), completion); - g_signal_connect (text, "notify", G_CALLBACK (clear_completion_callback), completion); - g_signal_connect_swapped (text, "activate", G_CALLBACK (accept_completion_callback), completion); + completion->insert_text_id = + g_signal_connect (buffer, "inserted-text", G_CALLBACK (completion_inserted_text_callback), completion); + g_signal_connect (text, "notify", G_CALLBACK (clear_completion_callback), completion); + g_signal_connect_swapped (text, "activate", G_CALLBACK (accept_completion_callback), completion); } static void @@ -2095,6 +2095,7 @@ static void disconnect_completion_signals (GtkEntryCompletion *completion) { GtkText *text = gtk_entry_get_text_widget (GTK_ENTRY (completion->entry)); + GtkEntryBuffer *buffer = gtk_text_get_buffer (text); gtk_widget_remove_controller (GTK_WIDGET (text), completion->entry_key_controller); gtk_widget_remove_controller (GTK_WIDGET (text), completion->entry_focus_controller); @@ -2106,12 +2107,11 @@ disconnect_completion_signals (GtkEntryCompletion *completion) completion->changed_id = 0; } if (completion->insert_text_id > 0 && - g_signal_handler_is_connected (text, completion->insert_text_id)) + g_signal_handler_is_connected (buffer, completion->insert_text_id)) { - g_signal_handler_disconnect (text, completion->insert_text_id); + g_signal_handler_disconnect (buffer, completion->insert_text_id); completion->insert_text_id = 0; } - g_signal_handlers_disconnect_by_func (text, G_CALLBACK (completion_insert_text_callback), completion); g_signal_handlers_disconnect_by_func (text, G_CALLBACK (clear_completion_callback), completion); g_signal_handlers_disconnect_by_func (text, G_CALLBACK (accept_completion_callback), completion); } From e834e51c0ffef9b6def7efd7853c8d9c3a278fb2 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 24 Jun 2020 13:01:34 -0400 Subject: [PATCH 4/5] Install gtkstringlist.h --- gtk/meson.build | 1 + 1 file changed, 1 insertion(+) diff --git a/gtk/meson.build b/gtk/meson.build index ac11bf9cb2..248e605a50 100644 --- a/gtk/meson.build +++ b/gtk/meson.build @@ -649,6 +649,7 @@ gtk_public_headers = files([ 'gtkstackswitcher.h', 'gtkstatusbar.h', 'gtkstringfilter.h', + 'gtkstringlist.h', 'gtkstringsorter.h', 'gtkstylecontext.h', 'gtkstyleprovider.h', From 455d91b0fc0bd23afa6f98a05ccd326e2781caa1 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 24 Jun 2020 14:06:50 -0400 Subject: [PATCH 5/5] testgtk: Update list of cursor names Use the standard names, since that is what we want everybody else to use too. --- tests/testgtk.c | 133 +++++++++++++----------------------------------- 1 file changed, 36 insertions(+), 97 deletions(-) diff --git a/tests/testgtk.c b/tests/testgtk.c index 32289d989d..c33fa708da 100644 --- a/tests/testgtk.c +++ b/tests/testgtk.c @@ -2812,103 +2812,42 @@ cursor_draw (GtkDrawingArea *darea, } static const gchar *cursor_names[] = { - "all-scroll", - "arrow", - "bd_double_arrow", - "boat", - "bottom_left_corner", - "bottom_right_corner", - "bottom_side", - "bottom_tee", - "box_spiral", - "center_ptr", - "circle", - "clock", - "coffee_mug", - "copy", - "cross", - "crossed_circle", - "cross_reverse", - "crosshair", - "diamond_cross", - "dnd-ask", - "dnd-copy", - "dnd-link", - "dnd-move", - "dnd-none", - "dot", - "dotbox", - "double_arrow", - "draft_large", - "draft_small", - "draped_box", - "exchange", - "fd_double_arrow", - "fleur", - "gobbler", - "gumby", - "grab", - "grabbing", - "hand", - "hand1", - "hand2", - "heart", - "h_double_arrow", - "help", - "icon", - "iron_cross", - "left_ptr", - "left_ptr_help", - "left_ptr_watch", - "left_side", - "left_tee", - "leftbutton", - "link", - "ll_angle", - "lr_angle", - "man", - "middlebutton", - "mouse", - "move", - "pencil", - "pirate", - "plus", - "question_arrow", - "right_ptr", - "right_side", - "right_tee", - "rightbutton", - "rtl_logo", - "sailboat", - "sb_down_arrow", - "sb_h_double_arrow", - "sb_left_arrow", - "sb_right_arrow", - "sb_up_arrow", - "sb_v_double_arrow", - "shuttle", - "sizing", - "spider", - "spraycan", - "star", - "target", - "tcross", - "top_left_arrow", - "top_left_corner", - "top_right_corner", - "top_side", - "top_tee", - "trek", - "ul_angle", - "umbrella", - "ur_angle", - "v_double_arrow", - "vertical-text", - "watch", - "X_cursor", - "xterm", - "zoom-in", - "zoom-out" + "none", + "default", + "help", + "pointer", + "context-menu", + "progress", + "wait", + "cell", + "crosshair", + "text", + "vertical-text", + "alias", + "copy", + "no-drop", + "move", + "not-allowed", + "grab", + "grabbing", + "all-scroll", + "col-resize", + "row-resize", + "n-resize", + "e-resize", + "s-resize", + "w-resize", + "ne-resize", + "nw-resize", + "sw-resize", + "se-resize", + "ew-resize", + "ns-resize", + "nesw-resize", + "nwse-resize", + "zoom-in", + "zoom-out", + NULL }; static GtkTreeModel *