diff --git a/gtk/gtkcenterlayout.c b/gtk/gtkcenterlayout.c index 2660a4d47c..a01522308d 100644 --- a/gtk/gtkcenterlayout.c +++ b/gtk/gtkcenterlayout.c @@ -282,6 +282,8 @@ gtk_center_layout_measure_opposite (GtkCenterLayout *self, int total_nat, above_nat, below_nat; GtkWidget *child[3]; GtkRequestedSize sizes[3]; + gboolean have_baseline = FALSE; + gboolean align_baseline = FALSE; int i; child[0] = self->start_widget; @@ -305,27 +307,33 @@ gtk_center_layout_measure_opposite (GtkCenterLayout *self, &child_min, &child_nat, &child_min_baseline, &child_nat_baseline); - if (child_min_baseline >= 0) + total_min = MAX (total_min, child_min); + total_nat = MAX (total_nat, child_nat); + + if (orientation == GTK_ORIENTATION_VERTICAL && child_min_baseline >= 0) { + have_baseline = TRUE; + if (gtk_widget_get_valign (child[i]) == GTK_ALIGN_BASELINE_FILL || + gtk_widget_get_valign (child[i]) == GTK_ALIGN_BASELINE_CENTER) + align_baseline = TRUE; + below_min = MAX (below_min, child_min - child_min_baseline); above_min = MAX (above_min, child_min_baseline); below_nat = MAX (below_nat, child_nat - child_nat_baseline); above_nat = MAX (above_nat, child_nat_baseline); } - else - { - total_min = MAX (total_min, child_min); - total_nat = MAX (total_nat, child_nat); - } } - if (above_min >= 0) + if (have_baseline) { int min_baseline = -1; int nat_baseline = -1; - total_min = MAX (total_min, above_min + below_min); - total_nat = MAX (total_nat, above_nat + below_nat); + if (align_baseline) + { + total_min = MAX (total_min, above_min + below_min); + total_nat = MAX (total_nat, above_nat + below_nat); + } switch (self->baseline_pos) { diff --git a/gtk/gtkentry.c b/gtk/gtkentry.c index 67281c2f36..30521f640c 100644 --- a/gtk/gtkentry.c +++ b/gtk/gtkentry.c @@ -1646,14 +1646,18 @@ gtk_entry_measure (GtkWidget *widget, { GtkEntry *entry = GTK_ENTRY (widget); GtkEntryPrivate *priv = gtk_entry_get_instance_private (entry); + int text_min, text_nat; int i; gtk_widget_measure (priv->text, orientation, for_size, - minimum, natural, + &text_min, &text_nat, minimum_baseline, natural_baseline); + *minimum = text_min; + *natural = text_nat; + for (i = 0; i < MAX_ICONS; i++) { EntryIconInfo *icon_info = priv->icons[i]; @@ -1691,6 +1695,14 @@ gtk_entry_measure (GtkWidget *widget, *minimum = MAX (*minimum, prog_min); *natural = MAX (*natural, prog_nat); } + + if (orientation == GTK_ORIENTATION_VERTICAL) + { + if (G_LIKELY (*minimum_baseline >= 0)) + *minimum_baseline += (*minimum - text_min) / 2; + if (G_LIKELY (*natural_baseline >= 0)) + *natural_baseline += (*natural - text_nat) / 2; + } } static void diff --git a/gtk/gtksearchentry.c b/gtk/gtksearchentry.c index 6191d1f01e..eb35fc1bd4 100644 --- a/gtk/gtksearchentry.c +++ b/gtk/gtksearchentry.c @@ -301,6 +301,7 @@ gtk_search_entry_measure (GtkWidget *widget, int *natural_baseline) { GtkSearchEntry *entry = GTK_SEARCH_ENTRY (widget); + int text_min, text_nat; int icon_min, icon_nat; int spacing; @@ -309,9 +310,12 @@ gtk_search_entry_measure (GtkWidget *widget, gtk_widget_measure (entry->entry, orientation, for_size, - minimum, natural, + &text_min, &text_nat, minimum_baseline, natural_baseline); + *minimum = text_min; + *natural = text_nat; + gtk_widget_measure (entry->search_icon, GTK_ORIENTATION_HORIZONTAL, -1, @@ -344,6 +348,11 @@ gtk_search_entry_measure (GtkWidget *widget, { *minimum = MAX (*minimum, icon_min); *natural = MAX (*natural, icon_nat); + + if (G_LIKELY (*minimum_baseline >= 0)) + *minimum_baseline += (*minimum - text_min) / 2; + if (G_LIKELY (*natural_baseline >= 0)) + *natural_baseline += (*natural - text_nat) / 2; } }