libadwaita/0002-dialog-Handle-close-before-and-right-after-present.patch
Christian Hergert d0a41fdac7
Update to 1.6.6 with manual patching
Previously we had 1.6.1 but now there is 1.6.6. However after 1.6.2
libadwaita decided in a minor release to redo their build system to no
longer pre-generate CSS but instead push that on downstreams.

Ignoring the wisdom of doing this in a minor release, just work around
it by manually backporting the changes. They don't affect any CSS which
would need to be regenerated anyway.

Resolves: RHEL-86191
2025-04-29 13:19:21 -07:00

119 lines
3.2 KiB
Diff

From e711e7cd11ecdce824da8a29f8b9c51388bd307e Mon Sep 17 00:00:00 2001
From: Alice Mikhaylenko <alicem@gnome.org>
Date: Fri, 6 Dec 2024 18:27:33 +0400
Subject: [PATCH 02/33] dialog: Handle close() before and right after present()
Fixes https://gitlab.gnome.org/GNOME/libadwaita/-/issues/970
(cherry picked from commit 9bc2b37232d19ac7e6d3bf88076b49f07b1ab91a)
---
src/adw-bottom-sheet.c | 13 ++++++++++++-
src/adw-dialog.c | 11 +++++++++++
src/adw-floating-sheet.c | 14 +++++++++++++-
3 files changed, 36 insertions(+), 2 deletions(-)
diff --git a/src/adw-bottom-sheet.c b/src/adw-bottom-sheet.c
index d5876ac2..a9011eb0 100644
--- a/src/adw-bottom-sheet.c
+++ b/src/adw-bottom-sheet.c
@@ -137,6 +137,8 @@ struct _AdwBottomSheet
gboolean can_open;
gboolean can_close;
+ gboolean has_been_open;
+
AdwSwipeTracker *swipe_tracker;
gboolean swipe_detected;
gboolean swipe_active;
@@ -1550,8 +1552,17 @@ adw_bottom_sheet_set_open (AdwBottomSheet *self,
open = !!open;
- if (self->open == open)
+ if (self->open == open) {
+ if (!self->has_been_open && !open) {
+ if (self->closing_callback)
+ self->closing_callback (self, self->user_data);
+
+ if (self->closed_callback)
+ self->closed_callback (self, self->user_data);
+ }
+
return;
+ }
self->open = open;
diff --git a/src/adw-dialog.c b/src/adw-dialog.c
index 9609e400..c045a944 100644
--- a/src/adw-dialog.c
+++ b/src/adw-dialog.c
@@ -185,6 +185,12 @@ map_tick_cb (AdwDialog *self)
{
AdwDialogPrivate *priv = adw_dialog_get_instance_private (self);
+ if (priv->force_closing) {
+ priv->tick_cb_id = 0;
+ priv->ticks = 0;
+ return G_SOURCE_REMOVE;
+ }
+
priv->ticks++;
/* If we're showing a bottom sheet, it has changed after the initial map,
@@ -1877,6 +1883,11 @@ adw_dialog_close (AdwDialog *self)
priv = adw_dialog_get_instance_private (self);
+ if (!gtk_widget_get_parent (GTK_WIDGET (self))) {
+ g_critical ("Trying to close %s %p that's not presented", G_OBJECT_TYPE_NAME (self), self);
+ return FALSE;
+ }
+
if (!priv->can_close) {
g_signal_emit (self, signals[SIGNAL_CLOSE_ATTEMPT], 0);
return FALSE;
diff --git a/src/adw-floating-sheet.c b/src/adw-floating-sheet.c
index 341fa442..399fc392 100644
--- a/src/adw-floating-sheet.c
+++ b/src/adw-floating-sheet.c
@@ -45,6 +45,8 @@ struct _AdwFloatingSheet
AdwAnimation *open_animation;
double progress;
+ gboolean has_been_open;
+
GFunc closing_callback;
GFunc closed_callback;
gpointer user_data;
@@ -423,14 +425,24 @@ adw_floating_sheet_set_open (AdwFloatingSheet *self,
open = !!open;
- if (self->open == open)
+ if (self->open == open) {
+ if (!self->has_been_open && !open) {
+ if (self->closing_callback)
+ self->closing_callback (self, self->user_data);
+
+ if (self->closed_callback)
+ self->closed_callback (self, self->user_data);
+ }
+
return;
+ }
self->open = open;
if (open) {
gtk_widget_set_child_visible (self->dimming, TRUE);
gtk_widget_set_child_visible (self->sheet_bin, TRUE);
+ self->has_been_open = true;
}
gtk_widget_set_can_target (self->dimming, open);
--
2.47.1