From d3534321ed044b948b86303812f2f97e7c656520 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 4 Sep 2024 21:52:44 -0400 Subject: [PATCH] Fix missing popovers Fixes: https://issues.redhat.com/browse/RHEL-53346 --- ...-shadow-size-into-account-in-measure.patch | 50 +++++++++++++++++++ ...invalid-width-height-check-in-layout.patch | 47 +++++++++++++++++ gtk4.spec | 4 ++ 3 files changed, 101 insertions(+) create mode 100644 0001-popover-Take-shadow-size-into-account-in-measure.patch create mode 100644 0002-popover-Fix-invalid-width-height-check-in-layout.patch diff --git a/0001-popover-Take-shadow-size-into-account-in-measure.patch b/0001-popover-Take-shadow-size-into-account-in-measure.patch new file mode 100644 index 0000000..5291b9b --- /dev/null +++ b/0001-popover-Take-shadow-size-into-account-in-measure.patch @@ -0,0 +1,50 @@ +From ca05f10c2ce0312779cb39979ef06aa052d785d4 Mon Sep 17 00:00:00 2001 +From: Matthijs Velsink +Date: Tue, 2 Jul 2024 02:50:29 +0200 +Subject: [PATCH 1/2] popover: Take shadow size into account in measure + +Commit b9487997 introduced shadows for GtkPopover. These are correctly +subtracted while allocating the child widget, but the child is not +measured with those shadows subtracted (as is correctly done for the +arrow). This can give criticals, for example with some wrapping labels. + +To fix this, we subtract the shadow size from the `for_size` before +passing it to the measure() of the child widget. + +Closes #5782 +Fixes #6796 +--- + gtk/gtkpopover.c | 14 +++++++++++--- + 1 file changed, 11 insertions(+), 3 deletions(-) + +diff --git a/gtk/gtkpopover.c b/gtk/gtkpopover.c +index bdd66f2f8b..f93075d2a0 100644 +--- a/gtk/gtkpopover.c ++++ b/gtk/gtkpopover.c +@@ -1511,12 +1511,20 @@ gtk_popover_measure (GtkWidget *widget, + GtkCssStyle *style; + GtkBorder shadow_width; + +- if (for_size >= 0 && (POS_IS_VERTICAL (priv->position) == (orientation == GTK_ORIENTATION_HORIZONTAL))) +- for_size -= tail_height; +- + style = gtk_css_node_get_style (gtk_widget_get_css_node (GTK_WIDGET (priv->contents_widget))); + gtk_css_shadow_value_get_extents (style->used->box_shadow, &shadow_width); + ++ if (for_size >= 0) ++ { ++ if ((POS_IS_VERTICAL (priv->position) == (orientation == GTK_ORIENTATION_HORIZONTAL))) ++ for_size -= tail_height; ++ ++ if (orientation == GTK_ORIENTATION_HORIZONTAL) ++ for_size -= shadow_width.top + shadow_width.bottom; ++ else ++ for_size -= shadow_width.left + shadow_width.right; ++ } ++ + gtk_widget_measure (priv->contents_widget, + orientation, for_size, + minimum, natural, +-- +2.46.0 + diff --git a/0002-popover-Fix-invalid-width-height-check-in-layout.patch b/0002-popover-Fix-invalid-width-height-check-in-layout.patch new file mode 100644 index 0000000..00827eb --- /dev/null +++ b/0002-popover-Fix-invalid-width-height-check-in-layout.patch @@ -0,0 +1,47 @@ +From 6b984977b86a8dce89a3d5b4f51a5154f3795200 Mon Sep 17 00:00:00 2001 +From: Matthijs Velsink +Date: Tue, 2 Jul 2024 03:47:02 +0200 +Subject: [PATCH 2/2] popover: Fix invalid width/height check in layout + +Commit a4cc95b2 introduced a check in layout() that closes the popover +if the width or height is smaller than the minimum width or height, +respectively. However, that was using gtk_widget_get_preferred_size(), +which finds out the minimum height for the minimum width and vice versa, +but not the minimum height for the layout width and vice versa. So, +certain popovers were not showing, even though they would not have +generated a critical to begin with. + +To fix this, we copy the logic from gtk_widget_allocate() that generates +the criticals, and use that to check if we have a good width/height for +the popover native or not. + +Closes #6826 +--- + gtk/gtkpopover.c | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +diff --git a/gtk/gtkpopover.c b/gtk/gtkpopover.c +index f93075d2a0..4d8b5d13f6 100644 +--- a/gtk/gtkpopover.c ++++ b/gtk/gtkpopover.c +@@ -709,10 +709,14 @@ gtk_popover_native_layout (GtkNative *native, + GtkPopover *popover = GTK_POPOVER (native); + GtkPopoverPrivate *priv = gtk_popover_get_instance_private (popover); + GtkWidget *widget = GTK_WIDGET (popover); +- GtkRequisition min, nat; ++ int min_height_for_width, min_width_for_height; + +- gtk_widget_get_preferred_size (widget, &min, &nat); +- if (width < min.width || height < min.height) ++ gtk_widget_measure (widget, GTK_ORIENTATION_VERTICAL, width, ++ &min_height_for_width, NULL, NULL, NULL); ++ gtk_widget_measure (widget, GTK_ORIENTATION_HORIZONTAL, height, ++ &min_width_for_height, NULL, NULL, NULL); ++ ++ if (width < min_width_for_height || height < min_height_for_width) + { + gtk_popover_popdown (popover); + return; +-- +2.46.0 + diff --git a/gtk4.spec b/gtk4.spec index a3398df..2d0bc11 100644 --- a/gtk4.spec +++ b/gtk4.spec @@ -35,6 +35,10 @@ Source0: https://download.gnome.org/sources/gtk/4.15/gtk-%{version}.tar.x # Using objcopy for resources interferes with hardening Patch0: gtk4-no-objcopy.patch +# Upstream fixes for popovers gone missing +Patch1: 0001-popover-Take-shadow-size-into-account-in-measure.patch +Patch2: 0002-popover-Fix-invalid-width-height-check-in-layout.patch + BuildRequires: cups-devel BuildRequires: desktop-file-utils BuildRequires: docbook-style-xsl