--- a/gplugin/gplugin-manager.c Sat Sep 17 23:34:03 2022 -0500
+++ b/gplugin/gplugin-manager.c Sun Sep 18 00:13:36 2022 -0500
@@ -57,6 +57,8 @@
+ SIG_LOADER_UNREGISTERED, @@ -435,6 +437,50 @@
+ * GPluginManager::loader-registered: + * @manager: The [class@GPlugin.Manager] instance. + * @loader: The [class@GPlugin.Loader] instance that was registered. + * Emitted when @loader has been registered with @manager via + * [method@GPlugin.Manager.register_loader]. + signals[SIG_LOADER_REGISTERED] = g_signal_new_class_handler( + G_OBJECT_CLASS_TYPE(klass), + * GPluginManager::loader-unregistered: + * @manager: The [class@GPlugin.Manager] instance. + * @loader: The [class@GPlugin.Loader] instance that was unregistered. + * Emitted when @loader has been unregistered from @manager via + * [method@GPlugin.Manager.unregister_loader]. + signals[SIG_LOADER_UNREGISTERED] = g_signal_new_class_handler( + G_OBJECT_CLASS_TYPE(klass), @@ -813,6 +859,8 @@
/* make a note that we need to refresh */
manager->refresh_needed = TRUE;
+ g_signal_emit(manager, signals[SIG_LOADER_REGISTERED], 0, loader); @@ -894,7 +942,16 @@
- g_hash_table_remove(manager->loaders, id);
+ /* Temporarily add a reference to loader so we can emit the signal if it + * was removed from our table correctly. + if(g_hash_table_remove(manager->loaders, id)) { + g_signal_emit(manager, signals[SIG_LOADER_UNREGISTERED], 0, loader); + g_clear_object(&loader); --- a/gplugin/tests/test-loader-registration.c Sat Sep 17 23:34:03 2022 -0500
+++ b/gplugin/tests/test-loader-registration.c Sun Sep 18 00:13:36 2022 -0500
@@ -99,6 +99,21 @@
+/****************************************************************************** + *****************************************************************************/ +test_gplugin_manager_loader_registration_counter( + G_GNUC_UNUSED GPluginManager *manager, + G_GNUC_UNUSED GPluginLoader *loader, + *counter = *counter + 1; /******************************************************************************
*****************************************************************************/
@@ -109,11 +124,22 @@
GPluginLoader *loader = NULL;
+ gint registrations = 0, unregistrations = 0; gplugin_manager_private_uninit();
gplugin_manager_private_init(TRUE);
manager = gplugin_manager_get_default();
+ G_CALLBACK(test_gplugin_manager_loader_registration_counter), + G_CALLBACK(test_gplugin_manager_loader_registration_counter), loader = test_gplugin_loader_new();
@@ -125,6 +151,9 @@
g_assert_no_error(error);
+ g_assert_cmpuint(registrations, ==, 1); + g_assert_cmpuint(unregistrations, ==, 1); @@ -135,11 +164,22 @@
GPluginLoader *loader = NULL;
+ guint registrations = 0, unregistrations = 0; gplugin_manager_private_uninit();
gplugin_manager_private_init(TRUE);
manager = gplugin_manager_get_default();
+ G_CALLBACK(test_gplugin_manager_loader_registration_counter), + G_CALLBACK(test_gplugin_manager_loader_registration_counter), loader = test_gplugin_loader_new();
@@ -156,6 +196,9 @@
g_assert_no_error(error);
+ g_assert_cmpuint(registrations, ==, 1); + g_assert_cmpuint(unregistrations, ==, 1); @@ -166,11 +209,22 @@
GPluginLoader *loader = NULL;
+ guint registrations = 0, unregistrations = 0; gplugin_manager_private_uninit();
gplugin_manager_private_init(TRUE);
manager = gplugin_manager_get_default();
+ G_CALLBACK(test_gplugin_manager_loader_registration_counter), + G_CALLBACK(test_gplugin_manager_loader_registration_counter), loader = test_gplugin_loader_new();
@@ -187,6 +241,9 @@
g_assert_error(error, GPLUGIN_DOMAIN, 0);
+ g_assert_cmpuint(registrations, ==, 1); + g_assert_cmpuint(unregistrations, ==, 1);