From 18ae67cb592b385d66cfe83f8cc794bcabcd949e Mon Sep 17 00:00:00 2001 From: Michael Catanzaro Date: Sat, 14 Sep 2019 11:41:14 -0500 Subject: [PATCH] Use more g_signal_connect_object() Most of these are probably paranoid, not bugs. I haven't done an exhaustive review to see what really needs it: that would be time-consuming and require significant familiarity with the Calendar codebase. This was just a quick check. Anyway, I vote for paranoid when it comes to using g_signal_connect() regardless. It's dangerous, and there's no reason to ever leave a signal connected after the user data object has been destroyed. Fixes #423 --- src/core/gcal-clock.c | 9 +++++---- src/core/gcal-manager.c | 17 ++++++++-------- src/core/gcal-shell-search-provider.c | 12 +++++------ .../calendar-management/gcal-calendars-page.c | 9 +++++---- src/gui/gcal-calendar-popover.c | 8 ++++---- src/gui/gcal-date-chooser-day.c | 9 +++++---- src/gui/gcal-date-chooser.c | 9 +++++---- src/gui/gcal-edit-dialog.c | 20 ++++++++++--------- src/gui/gcal-event-widget.c | 18 +++++++++-------- src/views/gcal-month-popover.c | 9 +++++---- src/views/gcal-month-view.c | 8 ++++---- src/views/gcal-week-header.c | 2 +- src/views/gcal-week-view.c | 9 +++++---- src/views/gcal-year-view.c | 4 ++-- src/weather/gcal-weather-service.c | 18 +++++++++-------- 15 files changed, 87 insertions(+), 74 deletions(-) diff --git a/src/core/gcal-clock.c b/src/core/gcal-clock.c index affeb4fb..0d8869b4 100644 --- a/src/core/gcal-clock.c +++ b/src/core/gcal-clock.c @@ -173,10 +173,11 @@ login_proxy_acquired_cb (GObject *source, return; } - g_signal_connect (self->proxy, - "g-signal", - G_CALLBACK (logind_signal_received_cb), - self); + g_signal_connect_object (self->proxy, + "g-signal", + G_CALLBACK (logind_signal_received_cb), + self, + 0); g_debug ("Successfully acquired logind DBus proxy"); } diff --git a/src/core/gcal-manager.c b/src/core/gcal-manager.c index 3b073581..7f051632 100644 --- a/src/core/gcal-manager.c +++ b/src/core/gcal-manager.c @@ -883,10 +883,11 @@ gcal_manager_setup_shell_search (GcalManager *self, return; self->shell_search_data_model = e_cal_data_model_new (gcal_thread_submit_job); - g_signal_connect_swapped (self->shell_search_data_model, - "view-state-changed", - G_CALLBACK (model_state_changed), - self); + g_signal_connect_object (self->shell_search_data_model, + "view-state-changed", + G_CALLBACK (model_state_changed), + self, + G_CONNECT_SWAPPED); e_cal_data_model_set_expand_recurrences (self->shell_search_data_model, TRUE); e_cal_data_model_set_timezone (self->shell_search_data_model, e_cal_util_get_system_timezone ()); @@ -1608,13 +1609,13 @@ gcal_manager_startup (GcalManager *self) /* The eds_credentials_prompter responses to REQUIRED and REJECTED reasons, the SSL_FAILED should be handled elsewhere. */ - g_signal_connect (self->source_registry, "credentials-required", G_CALLBACK (source_credentials_required_cb), self); + g_signal_connect_object (self->source_registry, "credentials-required", G_CALLBACK (source_credentials_required_cb), self, 0); e_credentials_prompter_process_awaiting_credentials (self->credentials_prompter); - g_signal_connect_swapped (self->source_registry, "source-added", G_CALLBACK (load_source), self); - g_signal_connect_swapped (self->source_registry, "source-removed", G_CALLBACK (remove_source), self); - g_signal_connect_swapped (self->source_registry, "source-changed", G_CALLBACK (source_changed), self); + g_signal_connect_object (self->source_registry, "source-added", G_CALLBACK (load_source), self, G_CONNECT_SWAPPED); + g_signal_connect_object (self->source_registry, "source-removed", G_CALLBACK (remove_source), self, G_CONNECT_SWAPPED); + g_signal_connect_object (self->source_registry, "source-changed", G_CALLBACK (source_changed), self, G_CONNECT_SWAPPED); /* create data model */ self->e_data_model = e_cal_data_model_new (gcal_thread_submit_job); diff --git a/src/core/gcal-shell-search-provider.c b/src/core/gcal-shell-search-provider.c index 7e8edb22..1ab0390a 100644 --- a/src/core/gcal-shell-search-provider.c +++ b/src/core/gcal-shell-search-provider.c @@ -428,7 +428,7 @@ gcal_shell_search_provider_set_property (GObject *object, GcalManager *manager = gcal_context_get_manager (self->context); gcal_manager_setup_shell_search (manager, E_CAL_DATA_MODEL_SUBSCRIBER (self)); - g_signal_connect_swapped (manager, "query-completed", G_CALLBACK (query_completed_cb), self); + g_signal_connect_object (manager, "query-completed", G_CALLBACK (query_completed_cb), self, G_CONNECT_SWAPPED); g_object_notify_by_pspec (object, properties[PROP_CONTEXT]); } @@ -463,11 +463,11 @@ gcal_shell_search_provider_init (GcalShellSearchProvider *self) self->events = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); self->skel = gcal_shell_search_provider2_skeleton_new (); - g_signal_connect_swapped (self->skel, "handle-get-initial-result-set", G_CALLBACK (get_initial_result_set_cb), self); - g_signal_connect_swapped (self->skel, "handle-get-subsearch-result-set", G_CALLBACK (get_subsearch_result_set_cb), self); - g_signal_connect_swapped (self->skel, "handle-get-result-metas", G_CALLBACK (get_result_metas_cb), self); - g_signal_connect_swapped (self->skel, "handle-activate-result", G_CALLBACK (activate_result_cb), self); - g_signal_connect_swapped (self->skel, "handle-launch-search", G_CALLBACK (launch_search_cb), self); + g_signal_connect_object (self->skel, "handle-get-initial-result-set", G_CALLBACK (get_initial_result_set_cb), self, G_CONNECT_SWAPPED); + g_signal_connect_object (self->skel, "handle-get-subsearch-result-set", G_CALLBACK (get_subsearch_result_set_cb), self, G_CONNECT_SWAPPED); + g_signal_connect_object (self->skel, "handle-get-result-metas", G_CALLBACK (get_result_metas_cb), self, G_CONNECT_SWAPPED); + g_signal_connect_object (self->skel, "handle-activate-result", G_CALLBACK (activate_result_cb), self, G_CONNECT_SWAPPED); + g_signal_connect_object (self->skel, "handle-launch-search", G_CALLBACK (launch_search_cb), self, G_CONNECT_SWAPPED); } GcalShellSearchProvider* diff --git a/src/gui/calendar-management/gcal-calendars-page.c b/src/gui/calendar-management/gcal-calendars-page.c index 3a337359..a3fd1065 100644 --- a/src/gui/calendar-management/gcal-calendars-page.c +++ b/src/gui/calendar-management/gcal-calendars-page.c @@ -103,10 +103,11 @@ make_calendar_row (GcalCalendarsPage *self, top_label = GTK_WIDGET (gtk_builder_get_object (builder, "title")); gtk_label_set_label (GTK_LABEL (top_label), gcal_calendar_get_name (calendar)); g_object_bind_property (calendar, "name", top_label, "label", G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE); - g_signal_connect_swapped (calendar, - "notify::name", - G_CALLBACK (gtk_list_box_invalidate_sort), - self->listbox); + g_signal_connect_object (calendar, + "notify::name", + G_CALLBACK (gtk_list_box_invalidate_sort), + self->listbox, + G_CONNECT_SWAPPED); g_signal_connect_object (calendar, "notify::color", diff --git a/src/gui/gcal-calendar-popover.c b/src/gui/gcal-calendar-popover.c index 234ce60d..079f0bf7 100644 --- a/src/gui/gcal-calendar-popover.c +++ b/src/gui/gcal-calendar-popover.c @@ -317,10 +317,10 @@ gcal_calendar_popover_set_property (GObject *object, "sensitive", G_BINDING_INVERT_BOOLEAN | G_BINDING_SYNC_CREATE); - g_signal_connect (manager, "calendar-added", G_CALLBACK (on_manager_calendar_added_cb), object); - g_signal_connect (manager, "calendar-removed", G_CALLBACK (on_manager_calendar_removed_cb), object); - g_signal_connect (manager, "calendar-changed", G_CALLBACK (on_manager_calendar_changed_cb), object); - g_signal_connect (manager, "notify::synchronizing", G_CALLBACK (on_manager_synchronizing_changed_cb), object); + g_signal_connect_object (manager, "calendar-added", G_CALLBACK (on_manager_calendar_added_cb), object, 0); + g_signal_connect_object (manager, "calendar-removed", G_CALLBACK (on_manager_calendar_removed_cb), object, 0); + g_signal_connect_object (manager, "calendar-changed", G_CALLBACK (on_manager_calendar_changed_cb), object, 0); + g_signal_connect_object (manager, "notify::synchronizing", G_CALLBACK (on_manager_synchronizing_changed_cb), object, 0); } break; diff --git a/src/gui/gcal-date-chooser-day.c b/src/gui/gcal-date-chooser-day.c index 7886d8ac..6f819c06 100644 --- a/src/gui/gcal-date-chooser-day.c +++ b/src/gui/gcal-date-chooser-day.c @@ -392,10 +392,11 @@ gcal_date_chooser_day_init (GcalDateChooserDay *self) self->multipress_gesture = gtk_gesture_multi_press_new (widget); gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (self->multipress_gesture), 0); - g_signal_connect (self->multipress_gesture, - "pressed", - G_CALLBACK (day_pressed), - self); + g_signal_connect_object (self->multipress_gesture, + "pressed", + G_CALLBACK (day_pressed), + self, + 0); } GtkWidget* diff --git a/src/gui/gcal-date-chooser.c b/src/gui/gcal-date-chooser.c index b51c25b6..9b568cbe 100644 --- a/src/gui/gcal-date-chooser.c +++ b/src/gui/gcal-date-chooser.c @@ -623,10 +623,11 @@ gcal_date_chooser_init (GcalDateChooser *self) { self->days[row][col] = gcal_date_chooser_day_new (); - g_signal_connect (self->days[row][col], - "selected", - G_CALLBACK (day_selected_cb), - self); + g_signal_connect_object (self->days[row][col], + "selected", + G_CALLBACK (day_selected_cb), + self, + 0); gtk_widget_show (self->days[row][col]); gtk_grid_attach (GTK_GRID (self->day_grid), self->days[row][col], col, row, 1, 1); diff --git a/src/gui/gcal-edit-dialog.c b/src/gui/gcal-edit-dialog.c index 4123d0fa..b66047a8 100644 --- a/src/gui/gcal-edit-dialog.c +++ b/src/gui/gcal-edit-dialog.c @@ -586,15 +586,16 @@ create_row_for_alarm (GcalEvent *event, has_sound ? "audio-volume-high-symbolic" : "audio-volume-muted-symbolic", GTK_ICON_SIZE_BUTTON); - g_signal_connect (volume_button, "toggled", G_CALLBACK (on_sound_toggle_changed_cb), row); + g_signal_connect_object (volume_button, "toggled", G_CALLBACK (on_sound_toggle_changed_cb), row, 0); /* Remove button */ remove_button = WID ("remove_button"); - g_signal_connect (remove_button, - "clicked", - G_CALLBACK (on_remove_alarm_button_clicked), - row); + g_signal_connect_object (remove_button, + "clicked", + G_CALLBACK (on_remove_alarm_button_clicked), + row, + 0); main_box = WID ("main_box"); gtk_container_add (GTK_CONTAINER (row), main_box); @@ -1155,10 +1156,11 @@ gcal_edit_dialog_constructed (GObject* object) G_ACTION_GROUP (self->action_group)); /* Watch the main window and adapt the maximum size */ - g_signal_connect_swapped (gtk_window_get_transient_for (GTK_WINDOW (self)), - "size-allocate", - G_CALLBACK (transient_size_allocate_cb), - self); + g_signal_connect_object (gtk_window_get_transient_for (GTK_WINDOW (self)), + "size-allocate", + G_CALLBACK (transient_size_allocate_cb), + self, + G_CONNECT_SWAPPED); } static void diff --git a/src/gui/gcal-event-widget.c b/src/gui/gcal-event-widget.c index dc830114..77992251 100644 --- a/src/gui/gcal-event-widget.c +++ b/src/gui/gcal-event-widget.c @@ -498,15 +498,17 @@ gcal_event_widget_set_event_internal (GcalEventWidget *self, /* Update color */ update_color (self); - g_signal_connect_swapped (event, - "notify::color", - G_CALLBACK (update_color), - self); + g_signal_connect_object (event, + "notify::color", + G_CALLBACK (update_color), + self, + G_CONNECT_SWAPPED); - g_signal_connect_swapped (event, - "notify::summary", - G_CALLBACK (gtk_widget_queue_draw), - self); + g_signal_connect_object (event, + "notify::summary", + G_CALLBACK (gtk_widget_queue_draw), + self, + G_CONNECT_SWAPPED); /* Tooltip */ gcal_event_widget_set_event_tooltip (self, event); diff --git a/src/views/gcal-month-popover.c b/src/views/gcal-month-popover.c index 9ec74f05..711bc835 100644 --- a/src/views/gcal-month-popover.c +++ b/src/views/gcal-month-popover.c @@ -354,10 +354,11 @@ update_event_list (GcalMonthPopover *self) gtk_container_add (GTK_CONTAINER (self->listbox), event_widget); - g_signal_connect (event_widget, - "activate", - G_CALLBACK (event_activated_cb), - self); + g_signal_connect_object (event_widget, + "activate", + G_CALLBACK (event_activated_cb), + self, + 0); } gtk_widget_show_all (self->listbox); diff --git a/src/views/gcal-month-view.c b/src/views/gcal-month-view.c index e7c41418..cde8062b 100644 --- a/src/views/gcal-month-view.c +++ b/src/views/gcal-month-view.c @@ -188,8 +188,8 @@ setup_child_widget (GcalMonthView *self, if (!gtk_widget_get_parent (widget)) gtk_widget_set_parent (widget, GTK_WIDGET (self)); - g_signal_connect (widget, "activate", G_CALLBACK (on_event_activated_cb), self); - g_signal_connect (widget, "notify::visible", G_CALLBACK (on_event_widget_visibility_changed_cb), self); + g_signal_connect_object (widget, "activate", G_CALLBACK (on_event_activated_cb), self, 0); + g_signal_connect_object (widget, "notify::visible", G_CALLBACK (on_event_widget_visibility_changed_cb), self, 0); } static gboolean @@ -861,7 +861,7 @@ setup_month_grid (GcalMonthView *self, cell = gcal_month_cell_new (); - g_signal_connect (cell, "show-overflow", G_CALLBACK (on_month_cell_show_overflow_popover_cb), self); + g_signal_connect_object (cell, "show-overflow", G_CALLBACK (on_month_cell_show_overflow_popover_cb), self, 0); self->month_cell[row][col] = cell; @@ -2343,6 +2343,6 @@ gcal_month_view_init (GcalMonthView *self) "context", G_BINDING_DEFAULT); - g_signal_connect (self->overflow_popover, "event-activated", G_CALLBACK (on_month_popover_event_activated_cb), self); + g_signal_connect_object (self->overflow_popover, "event-activated", G_CALLBACK (on_month_popover_event_activated_cb), self, 0); } diff --git a/src/views/gcal-week-header.c b/src/views/gcal-week-header.c index 41c55402..a0d0820f 100644 --- a/src/views/gcal-week-header.c +++ b/src/views/gcal-week-header.c @@ -221,7 +221,7 @@ setup_event_widget (GcalWeekHeader *self, GtkWidget *widget) { gtk_widget_set_margin_end (widget, 6); - g_signal_connect (widget, "activate", G_CALLBACK (on_event_widget_activated), self); + g_signal_connect_object (widget, "activate", G_CALLBACK (on_event_widget_activated), self, 0); } static inline void diff --git a/src/views/gcal-week-view.c b/src/views/gcal-week-view.c index 1622ecf7..9d9b7111 100644 --- a/src/views/gcal-week-view.c +++ b/src/views/gcal-week-view.c @@ -118,10 +118,11 @@ update_grid_scroll_position (GcalWeekView *self) stack = gtk_widget_get_ancestor (GTK_WIDGET (self), GTK_TYPE_STACK); - g_signal_connect (stack, - "notify::visible-child", - G_CALLBACK (stack_visible_child_changed_cb), - self); + g_signal_connect_object (stack, + "notify::visible-child", + G_CALLBACK (stack_visible_child_changed_cb), + self, + 0); self->scroll_grid_timeout_id = 0; diff --git a/src/views/gcal-year-view.c b/src/views/gcal-year-view.c index 9d853ead..a0292415 100644 --- a/src/views/gcal-year-view.c +++ b/src/views/gcal-year-view.c @@ -492,7 +492,7 @@ update_sidebar (GcalYearView *year_view) { child_widget = l->data; gtk_widget_show (child_widget); - g_signal_connect (child_widget, "activate", G_CALLBACK (event_activated), year_view); + g_signal_connect_object (child_widget, "activate", G_CALLBACK (event_activated), year_view, 0); g_object_set_data (G_OBJECT (child_widget), "shift", GINT_TO_POINTER (i)); gtk_container_add (GTK_CONTAINER (year_view->events_sidebar), child_widget); } @@ -2118,7 +2118,7 @@ gcal_year_view_init (GcalYearView *self) /* bind GNOME Shell' show week numbers property to GNOME Calendar's one */ self->calendar_settings = g_settings_new ("org.gnome.desktop.calendar"); g_settings_bind (self->calendar_settings, "show-weekdate", self, "show-week-numbers", G_SETTINGS_BIND_DEFAULT); - g_signal_connect_swapped (self->calendar_settings, "changed::show-weekdate", G_CALLBACK (gtk_widget_queue_draw), self); + g_signal_connect_object (self->calendar_settings, "changed::show-weekdate", G_CALLBACK (gtk_widget_queue_draw), self, G_CONNECT_SWAPPED); /* layout */ self->number_of_columns = 4; diff --git a/src/weather/gcal-weather-service.c b/src/weather/gcal-weather-service.c index 1d09b088..994b7654 100644 --- a/src/weather/gcal-weather-service.c +++ b/src/weather/gcal-weather-service.c @@ -759,16 +759,18 @@ on_gclue_simple_creation_cb (GClueSimple *_source, { update_gclue_location (self, location); - g_signal_connect (location, - "notify::location", - G_CALLBACK (on_gclue_location_changed_cb), - self); + g_signal_connect_object (location, + "notify::location", + G_CALLBACK (on_gclue_location_changed_cb), + self, + 0); } - g_signal_connect (client, - "notify::active", - G_CALLBACK (on_gclue_client_activity_changed_cb), - self); + g_signal_connect_object (client, + "notify::active", + G_CALLBACK (on_gclue_client_activity_changed_cb), + self, + 0); GCAL_EXIT; }