From 8d3ec069eb7e3f2a81e7784c2a5c8a0a3ba1b1a9 Mon Sep 17 00:00:00 2001 From: Bob Ham Date: Tue, 9 Oct 2018 13:30:59 +0000 Subject: [PATCH 1/8] call-window: Don't update visibility unnecessarily We only need to update visibility when the number of calls changes. --- src/calls-call-window.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/calls-call-window.c b/src/calls-call-window.c index 12b926d..c5fd6e5 100644 --- a/src/calls-call-window.c +++ b/src/calls-call-window.c @@ -228,7 +228,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); } From f60187c5472e771fb8e1a777d439f407394b0438 Mon Sep 17 00:00:00 2001 From: Bob Ham Date: Mon, 8 Oct 2018 11:18:12 +0000 Subject: [PATCH 2/8] call-window: Fix leak of references returned by g_list_model_get_item() Closes #18 --- src/calls-call-window.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/calls-call-window.c b/src/calls-call-window.c index c5fd6e5..aab09c4 100644 --- a/src/calls-call-window.c +++ b/src/calls-call-window.c @@ -160,6 +160,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)) { From 88e11d62b5a73e0d8434005113d16028865b2515 Mon Sep 17 00:00:00 2001 From: Bob Ham Date: Tue, 9 Oct 2018 13:29:39 +0000 Subject: [PATCH 3/8] call-window: Don't maintain unneeded focus pointer Closes #19 --- src/calls-call-window.c | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/src/calls-call-window.c b/src/calls-call-window.c index aab09c4..74cddce 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; @@ -188,20 +187,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 @@ -270,10 +255,6 @@ remove_call_holder (CallsCallWindow *self, GTK_WIDGET (calls_call_holder_get_display (holder))); update_visibility (self); - if (self->focus == holder) - { - set_focus (self, NULL); - } } void From 903782d90d4407be946ef70bbf9f97f61bf6efcf Mon Sep 17 00:00:00 2001 From: Bob Ham Date: Mon, 8 Oct 2018 11:44:27 +0000 Subject: [PATCH 4/8] call-window: Fix leak of initial CallHolder reference Closes #20 --- src/calls-call-window.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/calls-call-window.c b/src/calls-call-window.c index 74cddce..825978f 100644 --- a/src/calls-call-window.c +++ b/src/calls-call-window.c @@ -238,6 +238,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); From e88156380e54146419cf299ab539541d612b8d59 Mon Sep 17 00:00:00 2001 From: Bob Ham Date: Mon, 8 Oct 2018 11:44:27 +0000 Subject: [PATCH 5/8] call-holder: Fix widget references The display and selector item have floating references when created, not normal references. Therefore we need to sink both floating references. --- src/calls-call-holder.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/calls-call-holder.c b/src/calls-call-holder.c index 56f8905..c15c4d9 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); } From 224ab410d0cfc436c1214f7e07ed085f0664c2bd Mon Sep 17 00:00:00 2001 From: Bob Ham Date: Wed, 10 Oct 2018 08:51:58 +0000 Subject: [PATCH 6/8] call-holder,call-selector-item: Dispose mutual references properly --- src/calls-call-holder.c | 11 +++++++++-- src/calls-call-selector-item.c | 8 +++++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/calls-call-holder.c b/src/calls-call-holder.c index c15c4d9..9b99940 100644 --- a/src/calls-call-holder.c +++ b/src/calls-call-holder.c @@ -137,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); } From ef976cee04d089b04c76540082a424c6625e0080 Mon Sep 17 00:00:00 2001 From: Bob Ham Date: Wed, 10 Oct 2018 09:12:11 +0000 Subject: [PATCH 7/8] call-window: Remove display and holder in the right order In the current order, the holder is finalized before we can get the display, causing an error. We just have to switch the two around --- src/calls-call-window.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calls-call-window.c b/src/calls-call-window.c index 825978f..d2a8626 100644 --- a/src/calls-call-window.c +++ b/src/calls-call-window.c @@ -251,9 +251,9 @@ 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); } From 3917edbcdb24427bad500bca34031cbbdf98e1b1 Mon Sep 17 00:00:00 2001 From: Bob Ham Date: Wed, 10 Oct 2018 09:07:13 +0000 Subject: [PATCH 8/8] call-window: Reference selector item widget in creation callback The return value of this callback, used for the call selector flow box, should have a reference added to it. The callback's return value is annotated as "transfer full". --- src/calls-call-window.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/calls-call-window.c b/src/calls-call-window.c index d2a8626..f6c124d 100644 --- a/src/calls-call-window.c +++ b/src/calls-call-window.c @@ -110,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); }