From 9bc2b37232d19ac7e6d3bf88076b49f07b1ab91a Mon Sep 17 00:00:00 2001 From: Alice Mikhaylenko Date: Fri, 6 Dec 2024 18:27:33 +0400 Subject: [PATCH] dialog: Handle close() before and right after present() Fixes https://gitlab.gnome.org/GNOME/libadwaita/-/issues/970 --- 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 1f0479f3a..effffaf17 100644 --- a/src/adw-bottom-sheet.c +++ b/src/adw-bottom-sheet.c @@ -146,6 +146,8 @@ struct _AdwBottomSheet gboolean can_open; gboolean can_close; + gboolean has_been_open; + AdwSwipeTracker *swipe_tracker; gboolean swipe_detected; gboolean swipe_active; @@ -1628,8 +1630,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 bf8d29b65..ee9872a3f 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 9b2e81303..0846762f3 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); -- GitLab