diff --git a/src/adw-bottom-sheet.c b/src/adw-bottom-sheet.c index 1f0479f3a43b16951e3fc47828ab1f8f6fbfdcf1..effffaf17fde82275427a3ce4b517d9f9138b35a 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 bf8d29b656ad9538a533661945d2d75a309ed78b..ee9872a3f41d029099d15d9118af8f98397ce31b 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 9b2e8130345f420c2d044139845d91b59d1bba49..0846762f3934a7bccc629f9cd5febb5f44985355 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);