diff --git a/src/libide/gui/ide-application-plugins.c b/src/libide/gui/ide-application-plugins.c index 9cdbe63f212c85a46d549424be619d88f12bee01..61b2f7324ef4eacdcb1f69b6ac96a781d45fbf7f 100644 --- a/src/libide/gui/ide-application-plugins.c +++ b/src/libide/gui/ide-application-plugins.c @@ -28,15 +28,32 @@ #include "ide-application-addin.h" #include "ide-application-private.h" +static void +_ide_application_changed_plugin (GSettings *settings, + const gchar *key, + gpointer user_data) +{ + PeasPluginInfo *plugin = user_data; + PeasEngine *engine = peas_engine_get_default (); + + if (!g_settings_get_boolean (settings, key)) + peas_engine_unload_plugin (engine, plugin); + else + peas_engine_load_plugin (engine, plugin); +} + static GSettings * _ide_application_plugin_get_settings (IdeApplication *self, - const gchar *module_name) + PeasPluginInfo *plugin_info) { GSettings *settings; + const gchar *module_name; g_assert (IDE_IS_MAIN_THREAD ()); g_assert (IDE_IS_APPLICATION (self)); - g_assert (module_name != NULL); + g_assert (plugin_info != NULL); + + module_name = peas_plugin_info_get_module_name (plugin_info); if G_UNLIKELY (self->plugin_settings == NULL) self->plugin_settings = @@ -49,6 +66,11 @@ _ide_application_plugin_get_settings (IdeApplication *self, path = g_strdup_printf ("/org/gnome/builder/plugins/%s/", module_name); settings = g_settings_new_with_path ("org.gnome.builder.plugin", path); g_hash_table_insert (self->plugin_settings, g_strdup (module_name), settings); + + g_signal_connect (settings, + "changed::enabled", + G_CALLBACK (_ide_application_changed_plugin), + plugin_info); } return settings; @@ -88,7 +110,7 @@ ide_application_can_load_plugin (IdeApplication *self, g_hash_table_add (circular, (gpointer)module_name); /* Make sure the plugin has not been disabled in settings. */ - settings = _ide_application_plugin_get_settings (self, module_name); + settings = _ide_application_plugin_get_settings (self, plugin_info); if (!g_settings_get_boolean (settings, "enabled")) return FALSE;