Fix missing popovers
Fixes: https://issues.redhat.com/browse/RHEL-53346
This commit is contained in:
parent
4aff0d3024
commit
d3534321ed
50
0001-popover-Take-shadow-size-into-account-in-measure.patch
Normal file
50
0001-popover-Take-shadow-size-into-account-in-measure.patch
Normal file
@ -0,0 +1,50 @@
|
||||
From ca05f10c2ce0312779cb39979ef06aa052d785d4 Mon Sep 17 00:00:00 2001
|
||||
From: Matthijs Velsink <mvelsink@gnome.org>
|
||||
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
|
||||
|
47
0002-popover-Fix-invalid-width-height-check-in-layout.patch
Normal file
47
0002-popover-Fix-invalid-width-height-check-in-layout.patch
Normal file
@ -0,0 +1,47 @@
|
||||
From 6b984977b86a8dce89a3d5b4f51a5154f3795200 Mon Sep 17 00:00:00 2001
|
||||
From: Matthijs Velsink <mvelsink@gnome.org>
|
||||
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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user