From 0a16ebe4af634e00e6fec6dd82bb1916143213ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Wed, 12 Jun 2024 18:13:11 +0200 Subject: [PATCH] event: Make removing feedbacks more self contained If the feedback is in our list of feedbacks disconnect signals and drop the reference we hold. As we have removed the signal handler that would invoke `check_ended()` we invoke this manually when the list becomes empty. --- src/fbd-event.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/fbd-event.c b/src/fbd-event.c index 981e9ce..4868a00 100644 --- a/src/fbd-event.c +++ b/src/fbd-event.c @@ -361,10 +361,26 @@ fbd_event_get_feedbacks (FbdEvent *self) int fbd_event_remove_feedback (FbdEvent *self, FbdFeedbackBase *feedback) { + guint len; + g_return_val_if_fail (FBD_IS_EVENT (self), 0); + if (!self->feedbacks) + return 0; + + if (g_slist_index (self->feedbacks, feedback) >= 0) { + g_signal_handlers_disconnect_by_data (feedback, self); + /* Drop our reference, feedbacks end themselves when unref'ed */ + g_object_unref (feedback); + } + self->feedbacks = g_slist_remove (self->feedbacks, feedback); - return g_slist_length (self->feedbacks); + + len = g_slist_length (self->feedbacks); + if (!len) + check_ended (self); + + return len; } /**