diff --git a/src/calls-call-holder.c b/src/calls-call-holder.c index 56f8905..9b99940 100644 --- a/src/calls-call-holder.c +++ b/src/calls-call-holder.c @@ -97,8 +97,11 @@ set_call (CallsCallHolder *self, CallsCall *call) g_object_unref (party); self->display = calls_call_display_new (self->data); + g_object_ref_sink (self->display); + self->selector_item = calls_call_selector_item_new (self); + g_object_ref_sink (self->selector_item); } @@ -134,10 +137,17 @@ dispose (GObject *object) GObjectClass *parent_class = g_type_class_peek (G_TYPE_OBJECT); CallsCallHolder *self = CALLS_CALL_HOLDER (object); - g_clear_object (&self->selector_item); + // Mutual reference + if (self->selector_item) + { + GObject *selector_item = G_OBJECT (self->selector_item); + self->selector_item = NULL; + g_object_unref (selector_item); + } + g_clear_object (&self->display); g_clear_object (&self->data); - + parent_class->dispose (object); } diff --git a/src/calls-call-selector-item.c b/src/calls-call-selector-item.c index 7560e53..f95c01b 100644 --- a/src/calls-call-selector-item.c +++ b/src/calls-call-selector-item.c @@ -191,7 +191,13 @@ dispose (GObject *object) GObjectClass *parent_class = g_type_class_peek (GTK_TYPE_EVENT_BOX); CallsCallSelectorItem *self = CALLS_CALL_SELECTOR_ITEM (object); - g_clear_object (&self->holder); + // Mutual reference + if (self->holder) + { + GObject *holder = G_OBJECT (self->holder); + self->holder = NULL; + g_object_unref (holder); + } parent_class->dispose (object); } diff --git a/src/calls-call-window.c b/src/calls-call-window.c index 12b926d..f6c124d 100644 --- a/src/calls-call-window.c +++ b/src/calls-call-window.c @@ -43,7 +43,6 @@ struct _CallsCallWindow GtkApplicationWindow parent_instance; GListStore *call_holders; - CallsCallHolder *focus; GtkInfoBar *info; GtkLabel *info_label; @@ -111,7 +110,10 @@ static GtkWidget * call_holders_create_widget_cb (CallsCallHolder *holder, CallsCallWindow *self) { - return GTK_WIDGET (calls_call_holder_get_selector_item (holder)); + CallsCallSelectorItem *item = + calls_call_holder_get_selector_item (holder); + g_object_ref (G_OBJECT (item)); + return GTK_WIDGET (item); } @@ -160,6 +162,7 @@ find_call_holder (CallsCallWindow *self, for (position = 0; position < n_items; ++position) { holder = CALLS_CALL_HOLDER (g_list_model_get_item (model, position)); + g_object_unref (G_OBJECT (holder)); if (predicate (holder, user_data)) { @@ -187,20 +190,6 @@ static void set_focus (CallsCallWindow *self, CallsCallHolder *holder) { - if (!holder) - { - holder = g_list_model_get_item (G_LIST_MODEL (self->call_holders), 0); - - if (!holder) - { - /* No calls */ - self->focus = NULL; - return; - } - } - - self->focus = holder; - gtk_stack_set_visible_child_name (self->main_stack, "active-call"); gtk_stack_set_visible_child_name (self->header_bar_stack, "active-call"); gtk_stack_set_visible_child @@ -228,7 +217,6 @@ call_selector_child_activated_cb (GtkFlowBox *box, CallsCallSelectorItem *item = CALLS_CALL_SELECTOR_ITEM (widget); CallsCallHolder *holder = calls_call_selector_item_get_holder (item); - update_visibility (self); set_focus (self, holder); } @@ -253,6 +241,7 @@ add_call (CallsCallWindow *self, calls_call_get_number (call)); g_list_store_append (self->call_holders, holder); + g_object_unref (holder); update_visibility (self); set_focus (self, holder); @@ -265,15 +254,11 @@ remove_call_holder (CallsCallWindow *self, guint position, CallsCallHolder *holder) { - g_list_store_remove (self->call_holders, position); gtk_container_remove (GTK_CONTAINER (self->call_stack), GTK_WIDGET (calls_call_holder_get_display (holder))); + g_list_store_remove (self->call_holders, position); update_visibility (self); - if (self->focus == holder) - { - set_focus (self, NULL); - } } void