[gtk] searchentry: Always measure and allocate icon



commit cc4b3798e53a3efc63c14b98d3f70488801a70a1
Author: Timm Bäder <mail baedert org>
Date:   Sat Apr 27 08:20:30 2019 +0200

    searchentry: Always measure and allocate icon
    
    Just measuring it (so the warning goes away) but then not using the
    values will later underallocate the text widget.
    Instead, always reserve space for the icon (which will inevitable be
    visible as soon as the searchentry is actually being used).
    
    Fixes #1831

 gtk/gtksearchentry.c | 42 +++++++++++++++++++++++++-----------------
 1 file changed, 25 insertions(+), 17 deletions(-)
---
diff --git a/gtk/gtksearchentry.c b/gtk/gtksearchentry.c
index 281a99fb61..bfd98571f3 100644
--- a/gtk/gtksearchentry.c
+++ b/gtk/gtksearchentry.c
@@ -220,7 +220,7 @@ gtk_search_entry_measure (GtkWidget      *widget,
                           int            *natural,
                           int            *minimum_baseline,
                           int            *natural_baseline)
-{ 
+{
   GtkSearchEntry *entry = GTK_SEARCH_ENTRY (widget);
   GtkSearchEntryPrivate *priv = gtk_search_entry_get_instance_private (entry);
   int icon_min = 0, icon_nat = 0;
@@ -229,10 +229,20 @@ gtk_search_entry_measure (GtkWidget      *widget,
                       minimum, natural,
                       minimum_baseline, natural_baseline);
 
-  if (priv->icon && gtk_widget_get_visible (priv->icon))
-    gtk_widget_measure (priv->icon, orientation, for_size,
-                        &icon_min, &icon_nat,
-                        NULL, NULL);
+  gtk_widget_measure (priv->icon, orientation, for_size,
+                      &icon_min, &icon_nat,
+                      NULL, NULL);
+
+  if (orientation == GTK_ORIENTATION_HORIZONTAL)
+    {
+      *minimum += icon_min;
+      *natural += icon_nat;
+    }
+  else
+    {
+      *minimum = MAX (*minimum, icon_min);
+      *natural = MAX (*natural, icon_nat);
+    }
 }
 
 static void
@@ -240,16 +250,15 @@ gtk_search_entry_size_allocate (GtkWidget *widget,
                                 int        width,
                                 int        height,
                                 int        baseline)
-{ 
+{
   GtkSearchEntry *entry = GTK_SEARCH_ENTRY (widget);
   GtkSearchEntryPrivate *priv = gtk_search_entry_get_instance_private (entry);
   int icon_min = 0, icon_nat = 0;
   int text_width;
 
-  if (priv->icon && gtk_widget_get_visible (priv->icon))
-    gtk_widget_measure (priv->icon, GTK_ORIENTATION_HORIZONTAL, -1,
-                        &icon_min, &icon_nat,
-                        NULL, NULL);
+  gtk_widget_measure (priv->icon, GTK_ORIENTATION_HORIZONTAL, -1,
+                      &icon_min, &icon_nat,
+                      NULL, NULL);
 
   text_width = width - icon_nat;
 
@@ -257,10 +266,9 @@ gtk_search_entry_size_allocate (GtkWidget *widget,
                             &(GtkAllocation) { 0, 0, text_width, height },
                             baseline);
 
-  if (priv->icon && gtk_widget_get_visible (priv->icon))
-    gtk_widget_size_allocate (priv->icon,
-                              &(GtkAllocation) { text_width, 0, icon_nat, height },
-                              baseline);
+  gtk_widget_size_allocate (priv->icon,
+                            &(GtkAllocation) { text_width, 0, icon_nat, height },
+                            baseline);
 }
 
 static AtkObject *
@@ -513,7 +521,7 @@ gtk_search_entry_changed (GtkEditable *editable,
 
   if (str == NULL || *str == '\0')
     {
-      gtk_widget_hide (priv->icon);
+      gtk_widget_set_child_visible (priv->icon, FALSE);
 
       if (priv->delayed_changed_id > 0)
         {
@@ -524,7 +532,7 @@ gtk_search_entry_changed (GtkEditable *editable,
     }
   else
     {
-      gtk_widget_show (priv->icon);
+      gtk_widget_set_child_visible (priv->icon, TRUE);
 
       /* Queue up the timeout */
       reset_timeout (entry);
@@ -569,7 +577,7 @@ gtk_search_entry_init (GtkSearchEntry *entry)
   priv->icon = gtk_image_new_from_icon_name ("edit-clear-symbolic");
   gtk_widget_set_tooltip_text (priv->icon, _("Clear entry"));
   gtk_widget_set_parent (priv->icon, GTK_WIDGET (entry));
-  gtk_widget_hide (priv->icon);
+  gtk_widget_set_child_visible (priv->icon, FALSE);
 
   press = gtk_gesture_multi_press_new ();
   g_signal_connect (press, "released", G_CALLBACK (gtk_search_entry_icon_release), entry);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]