From 0cc94ed72e62f2e09d556d912ef5b4550f3c70ef Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 29 May 2019 03:07:02 +0000 Subject: [PATCH] Some entry completion fixes This gets popover-based entry completion closer to working as expected. And it drops a use of gdk_surface_get_origin. --- gtk/gtkentrycompletion.c | 50 ++++++---------------------------- gtk/theme/Adwaita/_common.scss | 4 +++ 2 files changed, 12 insertions(+), 42 deletions(-) diff --git a/gtk/gtkentrycompletion.c b/gtk/gtkentrycompletion.c index 4ec99e8f89..74572071fe 100644 --- a/gtk/gtkentrycompletion.c +++ b/gtk/gtkentrycompletion.c @@ -90,6 +90,7 @@ #include "gtkwindowprivate.h" #include "gtkwidgetprivate.h" #include "gtknative.h" +#include "gtkstylecontext.h" #include @@ -582,6 +583,9 @@ gtk_entry_completion_constructed (GObject *object) /* pack it all */ priv->popup_window = gtk_popover_new (NULL); gtk_popover_set_position (GTK_POPOVER (priv->popup_window), GTK_POS_BOTTOM); + gtk_popover_set_autohide (GTK_POPOVER (priv->popup_window), FALSE); + gtk_popover_set_has_arrow (GTK_POPOVER (priv->popup_window), FALSE); + gtk_style_context_add_class (gtk_widget_get_style_context (priv->popup_window), "entry-completion"); controller = gtk_event_controller_key_new (); g_signal_connect (controller, "key-pressed", @@ -1331,17 +1335,11 @@ void _gtk_entry_completion_resize_popup (GtkEntryCompletion *completion) { GtkAllocation allocation; - gint x, y; gint matches, actions, items, height; - GdkDisplay *display; - GdkMonitor *monitor; - GdkRectangle area; GdkSurface *surface; - GtkRequisition popup_req; GtkRequisition entry_req; GtkRequisition tree_req; GtkTreePath *path; - gboolean above; gint width; GtkTreeViewColumn *action_column; gint action_height; @@ -1358,10 +1356,6 @@ _gtk_entry_completion_resize_popup (GtkEntryCompletion *completion) gtk_widget_get_preferred_size (completion->priv->entry, &entry_req, NULL); - gdk_surface_get_origin (surface, &x, &y); - x += allocation.x; - y += allocation.y + (allocation.height - entry_req.height) / 2; - matches = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (completion->priv->filter_model), NULL); actions = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (completion->priv->actions), NULL); action_column = gtk_tree_view_get_column (GTK_TREE_VIEW (completion->priv->action_view), 0); @@ -1378,16 +1372,7 @@ _gtk_entry_completion_resize_popup (GtkEntryCompletion *completion) gtk_widget_realize (completion->priv->tree_view); - display = gtk_widget_get_display (GTK_WIDGET (completion->priv->entry)); - monitor = gdk_display_get_monitor_at_surface (display, surface); - gdk_monitor_get_workarea (monitor, &area); - - if (height == 0) - items = 0; - else if (y > area.height / 2) - items = MIN (matches, (((area.y + y) - (actions * action_height)) / height) - 1); - else - items = MIN (matches, (((area.height - y) - (actions * action_height)) / height) - 1); + items = MIN (matches, 10); if (items <= 0) gtk_widget_hide (completion->priv->scrolled_window); @@ -1395,7 +1380,7 @@ _gtk_entry_completion_resize_popup (GtkEntryCompletion *completion) gtk_widget_show (completion->priv->scrolled_window); if (completion->priv->popup_set_width) - width = MIN (allocation.width, area.width); + width = allocation.width; else width = -1; @@ -1409,33 +1394,14 @@ _gtk_entry_completion_resize_popup (GtkEntryCompletion *completion) else gtk_widget_hide (completion->priv->action_view); - gtk_widget_get_preferred_size (completion->priv->popup_window, - &popup_req, NULL); - - if (x < area.x) - x = area.x; - else if (x + popup_req.width > area.x + area.width) - x = area.x + area.width - popup_req.width; - - if (y + entry_req.height + popup_req.height <= area.y + area.height || - y - area.y < (area.y + area.height) - (y + entry_req.height)) - { - y += entry_req.height; - above = FALSE; - } - else - { - y -= popup_req.height; - above = TRUE; - } - if (matches > 0) { - path = gtk_tree_path_new_from_indices (above ? matches - 1 : 0, -1); + path = gtk_tree_path_new_from_indices (0, -1); gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (completion->priv->tree_view), path, NULL, FALSE, 0.0, 0.0); gtk_tree_path_free (path); } + gtk_native_check_resize (GTK_NATIVE (completion->priv->popup_window)); } static void diff --git a/gtk/theme/Adwaita/_common.scss b/gtk/theme/Adwaita/_common.scss index 19d47d2e8a..ecdaeccaaf 100644 --- a/gtk/theme/Adwaita/_common.scss +++ b/gtk/theme/Adwaita/_common.scss @@ -4699,3 +4699,7 @@ popover.emoji-completion contents row box { popover.emoji-completion .emoji:hover { background-color: $popover_hover_color; } + +popover.entry-completion contents { + padding: 0; +}