From 1e4349f3409fd36a36a06fc3fea155e878177219 Mon Sep 17 00:00:00 2001 From: Evangelos Ribeiro Tzaras Date: Tue, 10 Sep 2024 19:06:03 +0200 Subject: [PATCH 01/12] tree: Ignore gdb history Part-of: --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 7494d4f6..1b9ae8d0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,11 @@ -_build *.swp *~ \#*# .\#* build +_build .buildconfig .flatpak-builder +.gdb_history po/calls.pot po/missing -- GitLab From 3f96639b810b4ebddf0f7d24ae089cad0ddd9508 Mon Sep 17 00:00:00 2001 From: Evangelos Ribeiro Tzaras Date: Wed, 11 Sep 2024 15:09:41 +0200 Subject: [PATCH 02/12] dir-locals: Update projectile commands We want to use meson, not ninja. Part-of: --- .dir-locals.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.dir-locals.el b/.dir-locals.el index c3037715..86f9a46f 100644 --- a/.dir-locals.el +++ b/.dir-locals.el @@ -1,7 +1,7 @@ ((nil . ((indent-tabs-mode . nil) - (projectile-project-compilation-cmd . "ninja -C _build") - (projectile-project-test-cmd . "ninja -C _build test") - (projectile-project-configure-cmd . "meson . _build") + (projectile-project-compilation-cmd . "meson compile -C _build") + (projectile-project-test-cmd . "meson test -C _build") + (projectile-project-configure-cmd . "meson _build --wipe") (projectile-project-compilation-dir . ".") (projectile-project-run-cmd . "_build/run -vvv") )) -- GitLab From 5473f03be936d2ed04671185ca4b54cf826edfcf Mon Sep 17 00:00:00 2001 From: Evangelos Ribeiro Tzaras Date: Wed, 11 Sep 2024 15:55:17 +0200 Subject: [PATCH 03/12] record-store: Remove unnecessary casts g_object_get() accepts gpointer, so casting is not needed. Part-of: --- src/calls-record-store.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/calls-record-store.c b/src/calls-record-store.c index 45c27dc5..8d06b3f8 100644 --- a/src/calls-record-store.c +++ b/src/calls-record-store.c @@ -522,13 +522,12 @@ update_cb (GomResource *resource, static void stamp_call (CallsCallRecord *record, - const gchar *stamp_name) + const char *stamp_name) { - GObject *record_obj = G_OBJECT (record); GDateTime *stamp = NULL; /* Check the call has not already been stamped */ - g_object_get (record_obj, + g_object_get (record, stamp_name, &stamp, NULL); if (stamp) @@ -537,7 +536,7 @@ stamp_call (CallsCallRecord *record, g_debug ("Stamping call `%s'", stamp_name); stamp = g_date_time_new_now_utc (); - g_object_set (record_obj, + g_object_set (record, stamp_name, stamp, NULL); g_date_time_unref (stamp); -- GitLab From 32b8995f2d4c7ffcb868cb50a3275aad9fa28c8f Mon Sep 17 00:00:00 2001 From: Evangelos Ribeiro Tzaras Date: Wed, 11 Sep 2024 15:07:40 +0200 Subject: [PATCH 04/12] record-row: Remove unnecessary cast g_object_get() wants a gpointer, so there is no need for casting to GObject*. Part-of: --- src/calls-call-record-row.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calls-call-record-row.c b/src/calls-call-record-row.c index 9e28c11a..a692c180 100644 --- a/src/calls-call-record-row.c +++ b/src/calls-call-record-row.c @@ -189,7 +189,7 @@ date_change_cb (CallsCallRecordRow *self) GDateTime *end; gboolean final; - g_object_get (G_OBJECT (self->record), + g_object_get (self->record, "end", &end, NULL); g_assert (end != NULL); -- GitLab From 87ad8acf399c1236715d6acb873de3c57d65f9f7 Mon Sep 17 00:00:00 2001 From: Evangelos Ribeiro Tzaras Date: Thu, 5 Sep 2024 22:59:05 +0200 Subject: [PATCH 05/12] record-row: Remove unused include Part-of: --- src/calls-call-record-row.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/calls-call-record-row.h b/src/calls-call-record-row.h index 84988081..5d189e72 100644 --- a/src/calls-call-record-row.h +++ b/src/calls-call-record-row.h @@ -26,7 +26,6 @@ #define CALLS_CALL_RECORD_ROW_H__ #include "calls-call-record.h" -#include "calls-new-call-box.h" #include -- GitLab From 9dfaac19cc2e69dbcc7b7e5111b2721bdcbf7869 Mon Sep 17 00:00:00 2001 From: Evangelos Ribeiro Tzaras Date: Wed, 11 Sep 2024 15:03:39 +0200 Subject: [PATCH 06/12] record-row: Define log domain Part-of: --- src/calls-call-record-row.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/calls-call-record-row.c b/src/calls-call-record-row.c index a692c180..666950d7 100644 --- a/src/calls-call-record-row.c +++ b/src/calls-call-record-row.c @@ -22,6 +22,8 @@ * */ +#define G_LOG_DOMAIN "CallsCallRecordRow" + #include "calls-call-record-row.h" #include "calls-best-match.h" #include "calls-contacts-provider.h" -- GitLab From 03a50260ec924eb46ad78d7de9b976406f2dca2c Mon Sep 17 00:00:00 2001 From: Evangelos Ribeiro Tzaras Date: Thu, 5 Sep 2024 21:37:01 +0200 Subject: [PATCH 07/12] history-box: Add debug statement This helps in debugging in debugging why the slice list model rebuilds the whole list when a single call gets added. Part-of: --- src/calls-call-record-row.c | 1 + src/calls-history-box.c | 3 +++ 2 files changed, 4 insertions(+) diff --git a/src/calls-call-record-row.c b/src/calls-call-record-row.c index 666950d7..d71f96cc 100644 --- a/src/calls-call-record-row.c +++ b/src/calls-call-record-row.c @@ -401,6 +401,7 @@ calls_call_record_row_button_press_event (GtkGestureClick* controller, GtkWidget *self) { GdkEvent *event = gtk_event_controller_get_current_event (GTK_EVENT_CONTROLLER (controller)); + if (gdk_event_triggers_context_menu (event)) { context_menu (self, (GdkEvent *) event); } diff --git a/src/calls-history-box.c b/src/calls-history-box.c index 1ffeb45c..ca8838e9 100644 --- a/src/calls-history-box.c +++ b/src/calls-history-box.c @@ -121,6 +121,9 @@ create_row_cb (CallsCallRecord *record, row_widget = GTK_WIDGET (calls_call_record_row_new (record)); + g_debug ("Created new row [%p] for record [%p]", + row_widget, record); + g_signal_connect (record, "call-delete", G_CALLBACK (delete_call_cb), -- GitLab From 3b1cf7b5ee0b91e8b35e8c64020eb518fa806337 Mon Sep 17 00:00:00 2001 From: Evangelos Ribeiro Tzaras Date: Wed, 11 Sep 2024 15:05:54 +0200 Subject: [PATCH 08/12] record-row: Prefer g_autoptr for GDateTime Part-of: --- src/calls-call-record-row.c | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/src/calls-call-record-row.c b/src/calls-call-record-row.c index d71f96cc..57f69c13 100644 --- a/src/calls-call-record-row.c +++ b/src/calls-call-record-row.c @@ -132,7 +132,9 @@ static gboolean date_change_cb (CallsCallRecordRow *self); static void setup_date_change_timeout (CallsCallRecordRow *self) { - GDateTime *gnow, *gnextday, *gtomorrow; + g_autoptr (GDateTime) gnow = NULL; + g_autoptr (GDateTime) gnextday = NULL; + g_autoptr (GDateTime) gtomorrow = NULL; struct timeval now, tomorrow, delta; int err; guint interval; @@ -142,7 +144,6 @@ setup_date_change_timeout (CallsCallRecordRow *self) // Get the next day gnextday = g_date_time_add_days (gnow, 1); - g_date_time_unref (gnow); // Get the start of the next day gtomorrow = @@ -153,12 +154,10 @@ setup_date_change_timeout (CallsCallRecordRow *self) 0, 0, 0.0); - g_date_time_unref (gnextday); // Convert to a timeval tomorrow.tv_sec = g_date_time_to_unix (gtomorrow); tomorrow.tv_usec = 0; - g_date_time_unref (gtomorrow); // Get the precise time now err = gettimeofday (&now, NULL); @@ -188,7 +187,7 @@ setup_date_change_timeout (CallsCallRecordRow *self) static gboolean date_change_cb (CallsCallRecordRow *self) { - GDateTime *end; + g_autoptr (GDateTime) end = NULL; gboolean final; g_object_get (self->record, @@ -197,7 +196,6 @@ date_change_cb (CallsCallRecordRow *self) g_assert (end != NULL); update_time_text (self, end, &final); - g_date_time_unref (end); if (final) self->date_change_timeout = 0; @@ -233,9 +231,9 @@ notify_time_cb (CallsCallRecordRow *self, GParamSpec *pspec, CallsCallRecord *record) { + g_autoptr (GDateTime) answered = NULL; + g_autoptr (GDateTime) end = NULL; gboolean inbound; - GDateTime *answered; - GDateTime *end; g_object_get (G_OBJECT (self->record), "inbound", &inbound, @@ -245,14 +243,11 @@ notify_time_cb (CallsCallRecordRow *self, update_time (self, inbound, answered, end); - if (answered) { - g_date_time_unref (answered); + if (answered) calls_clear_signal (record, &self->answered_notify_handler_id); - } - if (end) { - g_date_time_unref (end); + + if (end) calls_clear_signal (record, &self->end_notify_handler_id); - } } @@ -434,8 +429,8 @@ constructed (GObject *object) { CallsCallRecordRow *self = CALLS_CALL_RECORD_ROW (object); gboolean inbound; - GDateTime *answered; - GDateTime *end; + g_autoptr (GDateTime) answered = NULL; + g_autoptr (GDateTime) end = NULL; g_autofree char *protocol = NULL; g_autofree char *action_name = NULL; g_autofree char *target = NULL; @@ -466,8 +461,6 @@ constructed (GObject *object) "(ss)", target, ""); setup_time (self, inbound, answered, end); - calls_date_time_unref (answered); - calls_date_time_unref (end); setup_contact (self); } -- GitLab From 5eabbb2adac2d62c5d7e878c1cd196f50c1d1d50 Mon Sep 17 00:00:00 2001 From: Evangelos Ribeiro Tzaras Date: Wed, 11 Sep 2024 15:58:13 +0200 Subject: [PATCH 09/12] record-store: Simplify struct setup of record call data Just a mechanical change that results in -2 lines. Part-of: --- src/calls-record-store.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/calls-record-store.c b/src/calls-record-store.c index 8d06b3f8..56d2e6c1 100644 --- a/src/calls-record-store.c +++ b/src/calls-record-store.c @@ -487,10 +487,8 @@ record_call (CallsRecordStore *self, record, g_object_unref); data = g_new (struct CallsRecordCallData, 1); - g_object_ref (self); - g_object_ref (call); - data->self = self; - data->call = call; + data->self = g_object_ref (self); + data->call = g_object_ref (call); gom_resource_save_async (GOM_RESOURCE (record), (GAsyncReadyCallback) record_call_save_cb, -- GitLab From f810e0a9b1962a3a9f626c43ce40d1d4f81a9727 Mon Sep 17 00:00:00 2001 From: Evangelos Ribeiro Tzaras Date: Wed, 11 Sep 2024 16:31:25 +0200 Subject: [PATCH 10/12] tree: Remove custom clearing macros The macros was emulating g_clear_handle_id() and friends let's use the glib functions directly instead. Part-of: --- src/calls-call-record-row.c | 2 +- src/calls-util.h | 14 -------------- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/src/calls-call-record-row.c b/src/calls-call-record-row.c index 57f69c13..dfbc3050 100644 --- a/src/calls-call-record-row.c +++ b/src/calls-call-record-row.c @@ -494,7 +494,7 @@ dispose (GObject *object) g_clear_object (&self->contact); g_clear_object (&self->action_map); - calls_clear_source (&self->date_change_timeout); + g_clear_handle_id (&self->date_change_timeout, g_source_remove); calls_clear_signal (self->record, &self->answered_notify_handler_id); calls_clear_signal (self->record, &self->end_notify_handler_id); g_clear_object (&self->record); diff --git a/src/calls-util.h b/src/calls-util.h index 9a7e2848..9331ada7 100644 --- a/src/calls-util.h +++ b/src/calls-util.h @@ -89,13 +89,6 @@ G_BEGIN_DECLS CALLS_DEFINE_IFACE_GETTER_BASE(calls,iface,Calls,Iface,CALLS,IFACE,prop,rettype,errval) -#define calls_clear_source(source_id_ptr) \ - if (*source_id_ptr != 0) \ - { \ - g_source_remove (*source_id_ptr); \ - *source_id_ptr = 0; \ - } - #define calls_clear_signal(object,handler_id_ptr) \ if (*handler_id_ptr != 0) \ { \ @@ -103,13 +96,6 @@ G_BEGIN_DECLS *handler_id_ptr = 0; \ } -#define calls_date_time_unref(date_time) \ - if (date_time) \ - { \ - g_date_time_unref (date_time); \ - } - - gboolean calls_date_time_is_same_day (GDateTime *a, GDateTime *b); -- GitLab From d9e6fb3717fff3bcea1ad9d77585d86444251da4 Mon Sep 17 00:00:00 2001 From: Evangelos Ribeiro Tzaras Date: Wed, 11 Sep 2024 16:52:57 +0200 Subject: [PATCH 11/12] record-row: Prefer g_signal_connect_object() over a plain connect() Apparently the slice list model in the history box rebuilds the whole list when a single new record gets added. Additionally, the "pressed" signal gets emitted on the GtkGestureLongPress controller even when the call button is tapped (i.e. should not have been pressed down for longer than the required timeout). This then causes the callback to be invoked with a disposed record row. This commit ensures the signals get properly disconnected even in the face of unforeseen cleanup of the record row. Helps with https://gitlab.gnome.org/GNOME/calls/-/issues/666 Part-of: --- src/calls-call-record-row.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/calls-call-record-row.c b/src/calls-call-record-row.c index dfbc3050..83dffa29 100644 --- a/src/calls-call-record-row.c +++ b/src/calls-call-record-row.c @@ -653,12 +653,16 @@ calls_call_record_row_init (CallsCallRecordRow *self) gesture = gtk_gesture_click_new (); gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (gesture), GDK_BUTTON_SECONDARY); - g_signal_connect (gesture, "pressed", G_CALLBACK (calls_call_record_row_button_press_event), self); + g_signal_connect_object (gesture, "pressed", + G_CALLBACK (calls_call_record_row_button_press_event), + self, G_CONNECT_AFTER); gtk_widget_add_controller (GTK_WIDGET (self), GTK_EVENT_CONTROLLER (gesture)); gesture = gtk_gesture_long_press_new (); gtk_gesture_single_set_touch_only (GTK_GESTURE_SINGLE (gesture), TRUE); - g_signal_connect (gesture, "pressed", G_CALLBACK (on_long_pressed), self); + g_signal_connect_object (gesture, "pressed", + G_CALLBACK (on_long_pressed), + self, G_CONNECT_AFTER); gtk_widget_add_controller (GTK_WIDGET (self), GTK_EVENT_CONTROLLER (gesture)); } -- GitLab From b15d557106f35fe9dd0c9fc97339a269de276d72 Mon Sep 17 00:00:00 2001 From: Evangelos Ribeiro Tzaras Date: Fri, 13 Sep 2024 17:16:29 +0200 Subject: [PATCH 12/12] record-row: Only popup context menu if row is realized This works around the long press gesture (mis?) firing the "press" signal on a row that is not realized anymore (because the slice model in the history box currently rebuilds all rows when the items change). Fixes: https://gitlab.gnome.org/GNOME/calls/-/issues/666 Part-of: --- src/calls-call-record-row.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/calls-call-record-row.c b/src/calls-call-record-row.c index 83dffa29..e5dd2515 100644 --- a/src/calls-call-record-row.c +++ b/src/calls-call-record-row.c @@ -384,6 +384,11 @@ on_long_pressed (GtkGestureLongPress *gesture, gdouble y, GtkWidget *self) { + if (!gtk_widget_get_realized (self)) { + g_warning ("widget is not realized, why does it emit 'pressed'? Aborting.."); + return; + } + context_menu (self, NULL); } -- GitLab