Skip to content

Commit 85c10f8

Browse files
committed
Use g_signal_connect_object() instead of g_signal_connect() in cases where user_data is a GObject.
This ensures that the signal is disconnected if the user_data GObject is destroyed. I don't think we would encounter that case here, but it's good practice to do this regardless. RpGtk.c: For GTK2/GTK3, use g_signal_connect_data() to ensure gfncbdata is freed, even if the signal isn't called. It usually is, so this is handling an edge case that probably won't ever happen, but better safe than sorry. Don't free gfncbdata from within the signal handler. ConfigDialog.cpp: Use g_clear_signal_handler() instead of g_signal_handler_disconnect(). - Don't use g_signal_connect_object() for this signal. glib-compat.h: Add g_clear_signal_handler() and G_CONNECT_DEFAULT. *MenuProvider.c: Use g_signal_connect_data() with a GClosureNotify function that calls nautilus_file_info_list_free() or equivalent. Don't free the list from rp_item_convert_to_png() or the ThreadFunc, since it will be freed by the closure. - NOTE: get_file_items() uses `transfer none` for the files list, so we need to make a deep copy using nautilus_file_info_list_copy(). Reference: https://blogs.gnome.org/mcatanzaro/2022/07/27/common-glib-programming-errors/
1 parent c1aae0e commit 85c10f8

29 files changed

Lines changed: 297 additions & 136 deletions

‎src/gtk/DragImage.cpp‎

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -210,19 +210,27 @@ rp_drag_image_init(RpDragImage *image)
210210
#endif /* GTK_CHECK_VERSION(4, 0, 0) */
211211

212212
// Pixmaps can only be updated once we have a valid size.
213-
g_signal_connect(G_OBJECT(image), "map", G_CALLBACK(rp_drag_image_map_signal_handler), nullptr);
214-
g_signal_connect(G_OBJECT(image), "notify::width-request", G_CALLBACK(rp_drag_image_notify_width_or_height_signal_handler), nullptr);
215-
g_signal_connect(G_OBJECT(image), "notify::height-request", G_CALLBACK(rp_drag_image_notify_width_or_height_signal_handler), nullptr);
213+
g_signal_connect(G_OBJECT(image), "map",
214+
G_CALLBACK(rp_drag_image_map_signal_handler), nullptr);
215+
g_signal_connect(G_OBJECT(image), "notify::width-request",
216+
G_CALLBACK(rp_drag_image_notify_width_or_height_signal_handler), nullptr);
217+
g_signal_connect(G_OBJECT(image), "notify::height-request",
218+
G_CALLBACK(rp_drag_image_notify_width_or_height_signal_handler), nullptr);
216219

217220
#if GTK_CHECK_VERSION(4, 0, 0)
218221
image->dragSource = gtk_drag_source_new();
219-
g_signal_connect(G_OBJECT(image->dragSource), "prepare", G_CALLBACK(rp_drag_image_drag_source_prepare), image);
220-
g_signal_connect(G_OBJECT(image->dragSource), "drag-begin", G_CALLBACK(rp_drag_image_drag_source_drag_begin), image);
221-
g_signal_connect(G_OBJECT(image->dragSource), "drag-end", G_CALLBACK(rp_drag_image_drag_source_drag_end), image);
222+
g_signal_connect_object(G_OBJECT(image->dragSource), "prepare",
223+
G_CALLBACK(rp_drag_image_drag_source_prepare), image, G_CONNECT_DEFAULT);
224+
g_signal_connect_object(G_OBJECT(image->dragSource), "drag-begin",
225+
G_CALLBACK(rp_drag_image_drag_source_drag_begin), image, G_CONNECT_DEFAULT);
226+
g_signal_connect_object(G_OBJECT(image->dragSource), "drag-end",
227+
G_CALLBACK(rp_drag_image_drag_source_drag_end), image, G_CONNECT_DEFAULT);
222228
gtk_widget_add_controller(GTK_WIDGET(image), GTK_EVENT_CONTROLLER(image->dragSource));
223229
#else /* !GTK_CHECK_VERSION(4, 0, 0) */
224-
g_signal_connect(G_OBJECT(image), "drag-begin", G_CALLBACK(rp_drag_image_drag_begin), nullptr);
225-
g_signal_connect(G_OBJECT(image), "drag-data-get", G_CALLBACK(rp_drag_image_drag_data_get), nullptr);
230+
g_signal_connect(G_OBJECT(image), "drag-begin",
231+
G_CALLBACK(rp_drag_image_drag_begin), nullptr);
232+
g_signal_connect(G_OBJECT(image), "drag-data-get",
233+
G_CALLBACK(rp_drag_image_drag_data_get), nullptr);
226234
#endif /* GTK_CHECK_VERSION(4, 0, 0) */
227235
}
228236

@@ -494,7 +502,7 @@ void rp_drag_image_set_ecks_bawks(RpDragImage *image, bool new_ecks_bawks)
494502
fmt::format(FSTR("ecksbawks-{:d}"), i+1).c_str(), nullptr);
495503
g_simple_action_set_enabled(action, TRUE);
496504
g_object_set_qdata(G_OBJECT(action), ecksbawks_quark, GINT_TO_POINTER(i+1));
497-
g_signal_connect(action, "activate", G_CALLBACK(ecksbawks_action_triggered_signal_handler), image);
505+
g_signal_connect_object(action, "activate", G_CALLBACK(ecksbawks_action_triggered_signal_handler), image, G_CONNECT_DEFAULT);
498506
g_action_map_add_action(G_ACTION_MAP(image->actionGroup), G_ACTION(action));
499507
g_menu_append(image->menuEcksBawks, menu_items[i],
500508
fmt::format(FSTR("{:s}.ecksbawks-{:d}"), s_prefix, i+1).c_str());
@@ -521,7 +529,8 @@ void rp_drag_image_set_ecks_bawks(RpDragImage *image, bool new_ecks_bawks)
521529
GtkWidget *const action = gtk_menu_item_new_with_label(menu_items[i]);
522530
gtk_widget_set_name(action, fmt::format(FSTR("menuEcksBawks{:d}"), i).c_str());
523531
g_object_set_qdata(G_OBJECT(action), ecksbawks_quark, GINT_TO_POINTER(i+1));
524-
g_signal_connect(action, "activate", G_CALLBACK(ecksbawks_menuItem_triggered_signal_handler), image);
532+
g_signal_connect_object(action, "activate",
533+
G_CALLBACK(ecksbawks_menuItem_triggered_signal_handler), image, G_CONNECT_DEFAULT);
525534
gtk_widget_show(action);
526535
gtk_menu_shell_append(GTK_MENU_SHELL(image->menuEcksBawks), action);
527536
}
@@ -533,7 +542,8 @@ void rp_drag_image_set_ecks_bawks(RpDragImage *image, bool new_ecks_bawks)
533542
GtkGesture *const rightClickGesture = gtk_gesture_click_new();
534543
gtk_gesture_single_set_button(GTK_GESTURE_SINGLE(rightClickGesture), GDK_BUTTON_SECONDARY);
535544
gtk_widget_add_controller(GTK_WIDGET(image), GTK_EVENT_CONTROLLER(rightClickGesture));
536-
g_signal_connect(rightClickGesture, "pressed", G_CALLBACK(rp_drag_image_on_gesture_pressed_event), image);
545+
g_signal_connect_object(rightClickGesture, "pressed",
546+
G_CALLBACK(rp_drag_image_on_gesture_pressed_event), image, G_CONNECT_DEFAULT);
537547
#else /* !GTK_CHECK_VERSION(4, 0, 0) */
538548
// GTK2/GTK3: Show context menu on right-click.
539549
// NOTE: On my system, programs show context menus on mouse button down.

‎src/gtk/LanguageComboBox_gtk3.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ rp_language_combo_box_init_gtkX(struct _RpLanguageComboBox *widget)
6262
/** Signals **/
6363

6464
// Connect the "changed" signal.
65-
g_signal_connect(widget->comboBox, "changed", G_CALLBACK(rp_language_combo_box_changed_handler), widget);
65+
g_signal_connect_object(widget->comboBox, "changed", G_CALLBACK(rp_language_combo_box_changed_handler), widget, G_CONNECT_DEFAULT);
6666
}
6767

6868
/**

‎src/gtk/LanguageComboBox_gtk4.cpp‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,8 @@ rp_language_combo_box_rebuild_icons(struct _RpLanguageComboBox *widget)
188188
// GtkDropDown doesn't have a "changed" signal, and its
189189
// GtkSelectionModel object isn't accessible.
190190
// Listen for GObject::notify for the "selected" property.
191-
g_signal_connect(widget->dropDown, "notify::selected", G_CALLBACK(rp_language_combo_box_notify_selected_handler), widget);
191+
g_signal_connect_object(widget->dropDown, "notify::selected",
192+
G_CALLBACK(rp_language_combo_box_notify_selected_handler), widget, G_CONNECT_DEFAULT);
192193
}
193194

194195
/** Property accessors / mutators **/

‎src/gtk/MessageWidget.c‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -349,11 +349,11 @@ rp_message_widget_init(RpMessageWidget *widget)
349349
# endif /* USE_GTK_REVEALER */
350350
#endif /* GTK_CHECK_VERSION(4, 0, 0) */
351351

352-
g_signal_connect(widget->close_button, "clicked",
353-
G_CALLBACK(rp_message_widget_close_button_clicked_handler), widget);
352+
g_signal_connect_object(widget->close_button, "clicked",
353+
G_CALLBACK(rp_message_widget_close_button_clicked_handler), widget, G_CONNECT_DEFAULT);
354354
#ifdef USE_GTK_REVEALER
355-
g_signal_connect(widget->revealer, "notify::child-revealed",
356-
G_CALLBACK(rp_message_widget_notify_child_revealed), widget);
355+
g_signal_connect_object(widget->revealer, "notify::child-revealed",
356+
G_CALLBACK(rp_message_widget_notify_child_revealed), widget, G_CONNECT_DEFAULT);
357357
#endif /* USE_GTK_REVEALER */
358358
}
359359

‎src/gtk/OptionsMenuButton.cpp‎

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -245,16 +245,19 @@ rp_options_menu_button_init(RpOptionsMenuButton *widget)
245245
// NOTE: GTK4 GtkMenuButton does not have a "clicked" signal.
246246
// TODO: Remove the wrapped "clicked" signal?
247247
#if !GTK_CHECK_VERSION(4, 0, 0)
248-
g_signal_connect(widget->menuButton, "clicked", G_CALLBACK(menuButton_clicked_signal_handler), widget);
248+
g_signal_connect_object(widget->menuButton, "clicked",
249+
G_CALLBACK(menuButton_clicked_signal_handler), widget, G_CONNECT_DEFAULT);
249250
#endif /* !GTK_CHECK_VERSION(4, 0, 0) */
250-
g_signal_connect(widget->menuButton, "activate", G_CALLBACK(menuButton_activate_signal_handler), widget);
251+
g_signal_connect_object(widget->menuButton, "activate",
252+
G_CALLBACK(menuButton_activate_signal_handler), widget, G_CONNECT_DEFAULT);
251253

252254
#ifndef USE_GTK_MENU_BUTTON
253255
// Connect the button's "event" signal.
254256
// NOTE: We need to pass the event details. Otherwise, we'll
255257
// end up with the menu getting "stuck" to the mouse.
256258
// Reference: https://developer.gnome.org/gtk-tutorial/stable/x1577.html
257-
g_signal_connect(widget->menuButton, "event", G_CALLBACK(btnOptions_event_signal_handler), widget);
259+
g_signal_connect_object(widget->menuButton, "event",
260+
G_CALLBACK(btnOptions_event_signal_handler), widget, G_CONNECT_DEFAULT);
258261
#endif /* !USE_GTK_MENU_BUTTON */
259262

260263
#if USE_G_MENU_MODEL
@@ -553,15 +556,16 @@ rp_options_menu_button_reinit_menu(RpOptionsMenuButton *widget,
553556
fmt::to_string(p.id).c_str(), nullptr);
554557
g_simple_action_set_enabled(action, TRUE);
555558
g_object_set_qdata(G_OBJECT(action), menuOptions_id_quark, GINT_TO_POINTER(p.id));
556-
g_signal_connect(action, "activate", G_CALLBACK(action_triggered_signal_handler), widget);
559+
g_signal_connect_object(action, "activate",
560+
G_CALLBACK(action_triggered_signal_handler), widget, G_CONNECT_DEFAULT);
557561
g_action_map_add_action(G_ACTION_MAP(actionGroup), G_ACTION(action));
558562

559563
// Create the menu item.
560564
g_menu_append(menuStdActs, pgettext_expr("RomDataView|Options", p.desc),
561565
fmt::format(FSTR("{:s}.{:d}"), s_prefix, p.id).c_str());
562566
}
563567

564-
/** ROM operations. **/
568+
/** ROM operations **/
565569
const vector<RomData::RomOp> ops = romData->romOps();
566570
if (!ops.empty()) {
567571
// NOTE: The separator *does* show up properly with the KDE Breeze theme
@@ -576,7 +580,8 @@ rp_options_menu_button_reinit_menu(RpOptionsMenuButton *widget,
576580
fmt::to_string(i).c_str(), nullptr);
577581
g_simple_action_set_enabled(action, !!(op.flags & RomData::RomOp::ROF_ENABLED));
578582
g_object_set_qdata(G_OBJECT(action), menuOptions_id_quark, GINT_TO_POINTER(i));
579-
g_signal_connect(action, "activate", G_CALLBACK(action_triggered_signal_handler), widget);
583+
g_signal_connect_object(action, "activate",
584+
G_CALLBACK(action_triggered_signal_handler), widget, G_CONNECT_DEFAULT);
580585
g_action_map_add_action(G_ACTION_MAP(actionGroup), G_ACTION(action));
581586

582587
// Create the menu item.
@@ -598,7 +603,8 @@ rp_options_menu_button_reinit_menu(RpOptionsMenuButton *widget,
598603
pgettext_expr("RomDataView|Options", p.desc));
599604
// NOTE: No name for this GtkWidget.
600605
g_object_set_qdata(G_OBJECT(menuItem), menuOptions_id_quark, GINT_TO_POINTER(p.id));
601-
g_signal_connect(menuItem, "activate", G_CALLBACK(menuOptions_triggered_signal_handler), widget);
606+
g_signal_connect_object(menuItem, "activate",
607+
G_CALLBACK(menuOptions_triggered_signal_handler), widget, G_CONNECT_DEFAULT);
602608
gtk_widget_show(menuItem);
603609
gtk_menu_shell_append(GTK_MENU_SHELL(menuOptions), menuItem);
604610
}
@@ -622,7 +628,8 @@ rp_options_menu_button_reinit_menu(RpOptionsMenuButton *widget,
622628
// NOTE: No name for this GtkWidget.
623629
gtk_widget_set_sensitive(menuItem, !!(op.flags & RomData::RomOp::ROF_ENABLED));
624630
g_object_set_qdata(G_OBJECT(menuItem), menuOptions_id_quark, GINT_TO_POINTER(i));
625-
g_signal_connect(menuItem, "activate", G_CALLBACK(menuOptions_triggered_signal_handler), widget);
631+
g_signal_connect_object(menuItem, "activate",
632+
G_CALLBACK(menuOptions_triggered_signal_handler), widget, G_CONNECT_DEFAULT);
626633
gtk_widget_show(menuItem);
627634
gtk_menu_shell_append(GTK_MENU_SHELL(menuOptions), menuItem);
628635

‎src/gtk/RomDataView.cpp‎

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -968,7 +968,8 @@ rp_rom_data_view_init_bitfield(RpRomDataView *page,
968968
// NOTE: Unlike Qt, both the "clicked" and "toggled" signals are
969969
// emitted for both user and program modifications, so we have to
970970
// connect this signal *after* setting the initial value.
971-
g_signal_connect(checkBox, "toggled", G_CALLBACK(checkbox_no_toggle_signal_handler), page);
971+
g_signal_connect_object(checkBox, "toggled",
972+
G_CALLBACK(checkbox_no_toggle_signal_handler), page, G_CONNECT_DEFAULT);
972973

973974
#ifdef USE_GTK_GRID
974975
// TODO: GTK_FILL
@@ -1177,7 +1178,8 @@ rp_rom_data_view_update_multi(RpRomDataView *page, uint32_t user_lc)
11771178
rp_language_combo_box_set_selected_lc(RP_LANGUAGE_COMBO_BOX(page->cboLanguage), lc_to_set);
11781179

11791180
// Connect the notification for "selected-lc".
1180-
g_signal_connect(page->cboLanguage, "notify::selected-lc", G_CALLBACK(cboLanguage_notify_selected_lc_handler), page);
1181+
g_signal_connect_object(page->cboLanguage, "notify::selected-lc",
1182+
G_CALLBACK(cboLanguage_notify_selected_lc_handler), page, G_CONNECT_DEFAULT);
11811183
}
11821184
}
11831185

@@ -1360,7 +1362,8 @@ rp_rom_data_view_create_options_button(RpRomDataView *page)
13601362
}
13611363

13621364
// Connect the RpOptionsMenuButton's triggered(int) signal.
1363-
g_signal_connect(page->btnOptions, "triggered", G_CALLBACK(btnOptions_triggered_signal_handler), page);
1365+
g_signal_connect_object(page->btnOptions, "triggered",
1366+
G_CALLBACK(btnOptions_triggered_signal_handler), page, G_CONNECT_DEFAULT);
13641367

13651368
// Initialize the menu options.
13661369
rp_options_menu_button_reinit_menu(RP_OPTIONS_MENU_BUTTON(page->btnOptions), page->cxx->romData.get());

‎src/gtk/RomDataView_gtk3.cpp‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -532,7 +532,8 @@ rp_rom_data_view_init_listdata(RpRomDataView *page, const RomFields::Field &fiel
532532
// (Windows uses 5.)
533533
g_object_set_qdata(G_OBJECT(treeView), RFT_LISTDATA_rows_visible_quark, GINT_TO_POINTER(listDataDesc.rows_visible));
534534
if (listDataDesc.rows_visible > 0) {
535-
g_signal_connect(treeView, "realize", G_CALLBACK(tree_view_realize_signal_handler), page);
535+
g_signal_connect_object(treeView, "realize",
536+
G_CALLBACK(tree_view_realize_signal_handler), page, G_CONNECT_DEFAULT);
536537
}
537538

538539
if (isMulti) {

‎src/gtk/RomDataView_gtk4.cpp‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -502,7 +502,8 @@ rp_rom_data_view_init_listdata(RpRomDataView *page, const RomFields::Field &fiel
502502
// (Windows uses 5.)
503503
g_object_set_qdata(G_OBJECT(treeView), RFT_LISTDATA_rows_visible_quark, GINT_TO_POINTER(listDataDesc.rows_visible));
504504
if (listDataDesc.rows_visible > 0) {
505-
g_signal_connect(treeView, "realize", G_CALLBACK(tree_view_realize_signal_handler), page);
505+
g_signal_connect_object(treeView, "realize",
506+
G_CALLBACK(tree_view_realize_signal_handler), page, G_CONNECT_DEFAULT);
506507
}
507508
#endif
508509

‎src/gtk/RpGtk.c‎

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
// for bool
1717
#include "stdboolx.h"
1818

19+
// for G_CONNECT_DEFAULT on older glib
20+
#include "glib-compat.h"
21+
1922
// Use the new GtkFileDialog class on GTK 4.10 and later.
2023
#if GTK_CHECK_VERSION(4, 9, 1)
2124
# define USE_GTK4_FILE_DIALOG 1
@@ -255,6 +258,13 @@ rpGtk_getFileName_fileDialog_response(GtkFileChooserDialog *fileDialog, gint res
255258
file = gtk_file_chooser_get_file(GTK_FILE_CHOOSER(fileDialog));
256259
}
257260

261+
// NOTE: gfncbdata is automatically freed by the g_free()
262+
// closure specified when calling g_signal_connect_data()
263+
// when the fileDialog is deleted.
264+
// Copy the required data here.
265+
const rpGtk_fileDialogCallback callback = gfncbdata->callback;
266+
const gpointer user_data = gfncbdata->user_data;
267+
258268
// Dialog is no longer needed.
259269
#if GTK_CHECK_VERSION(4, 0, 0)
260270
gtk_window_destroy(GTK_WINDOW(fileDialog));
@@ -264,8 +274,20 @@ rpGtk_getFileName_fileDialog_response(GtkFileChooserDialog *fileDialog, gint res
264274

265275
// Run the callback.
266276
// NOTE: Callback function takes ownership of the GFile.
267-
gfncbdata->callback(file, gfncbdata->user_data);
268-
g_free(gfncbdata);
277+
callback(file, user_data);
278+
}
279+
280+
/**
281+
* GClosureNotify wrapper for g_free, since our compiler warning
282+
* settings don't simply allow us to cast g_free to GClosureNotify.
283+
* @param ptr
284+
* @param closure
285+
*/
286+
static void
287+
rp_GClosureNotify_g_free(gpointer ptr, GClosure *closure)
288+
{
289+
((void)closure); // RP_UNUSED() is in common.h
290+
g_free(ptr);
269291
}
270292
#endif /* !USE_GTK4_FILE_DIALOG */
271293

@@ -362,6 +384,7 @@ static int rpGtk_getFileName_int(const rpGtk_getFileName_t *gfndata, bool bSave)
362384

363385
// Prompt for a filename.
364386
#ifdef USE_GTK4_FILE_DIALOG
387+
// GTK4: gfncbdata is freed by rpGtk_getFileName_AsyncReadyCallback().
365388
gtk_file_dialog_set_modal(fileDialog, true);
366389
if (bSave) {
367390
gtk_file_dialog_save(fileDialog, gfndata->parent, NULL,
@@ -371,7 +394,10 @@ static int rpGtk_getFileName_int(const rpGtk_getFileName_t *gfndata, bool bSave)
371394
(GAsyncReadyCallback)rpGtk_getFileName_AsyncReadyCallback, gfncbdata);
372395
}
373396
#else /* !USE_GTK4_FILE_DIALOG */
374-
g_signal_connect(fileDialog, "response", G_CALLBACK(rpGtk_getFileName_fileDialog_response), gfncbdata);
397+
// GTK2/GTK3: Use g_signal_connect_data() to ensure gfncbdata is freed.
398+
// It is *not* freed by rpGtk_getFileName_fileDialog_response().
399+
g_signal_connect_data(fileDialog, "response",
400+
G_CALLBACK(rpGtk_getFileName_fileDialog_response), gfncbdata, rp_GClosureNotify_g_free, G_CONNECT_DEFAULT);
375401
gtk_window_set_transient_for(GTK_WINDOW(fileDialog), gfndata->parent);
376402
gtk_window_set_modal(GTK_WINDOW(fileDialog), true);
377403
gtk_widget_set_visible(GTK_WIDGET(fileDialog), true);

‎src/gtk/config/AboutTab.cpp‎

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,7 @@ rp_about_tab_init(RpAboutTab *tab)
367367

368368
// Connect signals
369369
#ifdef ENABLE_UPDATE_CHECK
370-
g_signal_connect(tab, "realize", G_CALLBACK(rp_about_tab_realize_event), 0);
370+
g_signal_connect(tab, "realize", G_CALLBACK(rp_about_tab_realize_event), nullptr);
371371
#endif /* ENABLE_UPDATE_CHECK */
372372
}
373373

@@ -882,8 +882,10 @@ rp_about_tab_realize_event(GtkWidget *self,
882882
// Run the update checker.
883883
if (!tab->updChecker) {
884884
tab->updChecker = rp_update_checker_new();
885-
g_signal_connect(tab->updChecker, "error", G_CALLBACK(updChecker_error), tab);
886-
g_signal_connect(tab->updChecker, "retrieved", G_CALLBACK(updChecker_retrieved), tab);
885+
g_signal_connect_object(tab->updChecker, "error",
886+
G_CALLBACK(updChecker_error), tab, G_CONNECT_DEFAULT);
887+
g_signal_connect_object(tab->updChecker, "retrieved",
888+
G_CALLBACK(updChecker_retrieved), tab, G_CONNECT_DEFAULT);
887889
}
888890
rp_update_checker_run(tab->updChecker);
889891
}

0 commit comments

Comments
 (0)