static PeasPluginInfo * ide_application_locate_tool (IdeApplication *self, const gchar *tool_name) { PeasEngine *engine; const GList *list; g_assert (IDE_IS_APPLICATION (self)); g_assert (tool_name != NULL); engine = peas_engine_get_default (); list = peas_engine_get_plugin_list (engine); for (; list != NULL; list = list->next) { PeasPluginInfo *plugin_info = list->data; const gchar *name; name = peas_plugin_info_get_external_data (plugin_info, "Tool-Name"); if (g_strcmp0 (name, tool_name) == 0) return plugin_info; } return NULL; }
static PeasPluginInfo * ide_application_locate_worker (IdeApplication *self, const gchar *worker_name) { PeasEngine *engine; const GList *list; g_assert (IDE_IS_APPLICATION (self)); g_assert (worker_name != NULL); engine = peas_engine_get_default (); list = peas_engine_get_plugin_list (engine); for (; list != NULL; list = list->next) { PeasPluginInfo *plugin_info = list->data; const gchar *name; name = peas_plugin_info_get_module_name (plugin_info); if (g_strcmp0 (name, worker_name) == 0) return plugin_info; } return NULL; }
static void peas_extension_set_constructed (GObject *object) { PeasExtensionSet *set = PEAS_EXTENSION_SET (object); GList *plugins, *l; if (set->priv->engine == NULL) set->priv->engine = peas_engine_get_default (); g_object_ref (set->priv->engine); plugins = (GList *) peas_engine_get_plugin_list (set->priv->engine); for (l = plugins; l; l = l->next) add_extension (set, (PeasPluginInfo *) l->data); set->priv->load_handler_id = g_signal_connect_data (set->priv->engine, "load-plugin", G_CALLBACK (add_extension), set, NULL, G_CONNECT_AFTER | G_CONNECT_SWAPPED); set->priv->unload_handler_id = g_signal_connect_data (set->priv->engine, "unload-plugin", G_CALLBACK (remove_extension), set, NULL, G_CONNECT_SWAPPED); G_OBJECT_CLASS (peas_extension_set_parent_class)->constructed (object); }
static void on_plugin_list_notify(PeasEngine *engine, GParamSpec *pspec, gpointer user_data) { const GList *plugins = peas_engine_get_plugin_list(engine); while (plugins != NULL) { PeasPluginInfo *info = PEAS_PLUGIN_INFO(plugins->data); peas_engine_load_plugin(engine, info); plugins = plugins->next; } }
void ide_application_load_plugins (IdeApplication *self) { PeasEngine *engine; const GList *list; g_return_if_fail (IDE_IS_APPLICATION (self)); engine = peas_engine_get_default (); list = peas_engine_get_plugin_list (engine); for (; list; list = list->next) { PeasPluginInfo *plugin_info = list->data; GSettings *settings; const gchar *module_name; module_name = peas_plugin_info_get_module_name (plugin_info); settings = _ide_application_plugin_get_settings (self, module_name); g_object_set_data (G_OBJECT (settings), "PEAS_PLUGIN_INFO", plugin_info); g_signal_connect_object (settings, "changed::enabled", G_CALLBACK (ide_application_plugins_enabled_changed), self, G_CONNECT_SWAPPED); if (!g_settings_get_boolean (settings, "enabled")) continue; /* * If we are running the unit tests, we don't want to load plugins here, * but defer until the test is loading to perform the loading. However, * we do want all of the other machinery above to be setup. */ if (self->mode == IDE_APPLICATION_MODE_TESTS) continue; if (ide_application_can_load_plugin (self, plugin_info)) { g_debug ("Loading plugin \"%s\"", peas_plugin_info_get_module_name (plugin_info)); peas_engine_load_plugin (engine, plugin_info); } } }
static gchar * ide_application_get_command_help (IdeApplication *self, gboolean long_form) { PeasEngine *engine; const GList *list; GString *str; gint count = 0; g_assert (IDE_IS_APPLICATION (self)); engine = peas_engine_get_default (); list = peas_engine_get_plugin_list (engine); str = g_string_new (NULL); if (long_form) g_string_append_printf (str, "%s\n", _("Commands:")); for (; list != NULL; list = list->next) { PeasPluginInfo *plugin_info = list->data; const gchar *name; const gchar *desc; name = peas_plugin_info_get_external_data (plugin_info, "Tool-Name"); desc = peas_plugin_info_get_external_data (plugin_info, "Tool-Description"); if (name != NULL) { if (long_form) g_string_append_printf (str, " %-25s %s\n", name, desc); else g_string_append_printf (str, "%s\n", name); count++; } } if (count == 0) { g_string_free (str, TRUE); return NULL; } return g_strstrip (g_string_free (str, FALSE)); }
void ide_application_init_plugin_accessories (IdeApplication *self) { const GList *list; PeasEngine *engine; g_assert (IDE_IS_APPLICATION (self)); self->plugin_gresources = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify)g_resource_unref); engine = peas_engine_get_default (); g_signal_connect_object (engine, "load-plugin", G_CALLBACK (ide_application_load_plugin_resources), self, G_CONNECT_AFTER | G_CONNECT_SWAPPED); g_signal_connect_object (engine, "unload-plugin", G_CALLBACK (ide_application_unload_plugin_resources), self, G_CONNECT_SWAPPED); list = peas_engine_get_plugin_list (engine); for (; list != NULL; list = list->next) { PeasPluginInfo *plugin_info = list->data; const gchar *module_name; GSettings *settings; module_name = peas_plugin_info_get_module_name (plugin_info); settings = _ide_application_plugin_get_settings (self, module_name); if (!g_settings_get_boolean (settings, "enabled")) continue; ide_application_load_plugin_resources (self, plugin_info, engine); } }
static void ide_preferences_builtin_register_plugins (IdePreferences *preferences) { PeasEngine *engine; const GList *list; guint i = 0; g_assert (IDE_IS_PREFERENCES (preferences)); engine = peas_engine_get_default (); list = peas_engine_get_plugin_list (engine); ide_preferences_add_page (preferences, "plugins", _("Extensions"), 700); ide_preferences_add_list_group (preferences, "plugins", "installed", _("Installed Extensions"), 0); ide_preferences_add_list_group (preferences, "plugins", "builtin", _("Bundled Extensions"), 100); for (; list; list = list->next, i++) { g_autofree gchar *path = NULL; PeasPluginInfo *plugin_info = list->data; const gchar *desc; const gchar *name; const gchar *group; if (peas_plugin_info_is_hidden (plugin_info)) continue; name = peas_plugin_info_get_name (plugin_info); desc = peas_plugin_info_get_description (plugin_info); path = g_strdup_printf ("/org/gnome/builder/plugins/%s/", peas_plugin_info_get_module_name (plugin_info)); if (peas_plugin_info_is_builtin (plugin_info)) group = "builtin"; else group = "installed"; ide_preferences_add_switch (preferences, "plugins", group, "org.gnome.builder.plugin", "enabled", path, NULL, name, desc, NULL, i); } }
void ide_application_discover_plugins (IdeApplication *self) { PeasEngine *engine = peas_engine_get_default (); const GList *list; gchar *path; g_autoptr(GError) error = NULL; g_return_if_fail (IDE_IS_APPLICATION (self)); if (g_getenv ("GB_IN_TREE_PLUGINS") != NULL) { GDir *dir; g_irepository_prepend_search_path (BUILDDIR"/src/gstyle"); g_irepository_prepend_search_path (BUILDDIR"/src/libide"); if ((dir = g_dir_open (BUILDDIR"/src/plugins", 0, NULL))) { const gchar *name; while ((name = g_dir_read_name (dir))) { path = g_build_filename (BUILDDIR, "src", "plugins", name, NULL); peas_engine_prepend_search_path (engine, path, path); g_free (path); } g_dir_close (dir); } } else { g_irepository_prepend_search_path (PACKAGE_LIBDIR"/gnome-builder/girepository-1.0"); peas_engine_prepend_search_path (engine, PACKAGE_LIBDIR"/gnome-builder/plugins", PACKAGE_DATADIR"/gnome-builder/plugins"); } /* * We have access to ~/.local/share/gnome-builder/ for plugins even when we are * bundled with flatpak, so might as well use it. */ if (ide_is_flatpak ()) { g_autofree gchar *plugins_dir = g_build_filename (g_get_home_dir (), ".local", "share", "gnome-builder", "plugins", NULL); g_irepository_prepend_search_path (plugins_dir); peas_engine_prepend_search_path (engine, plugins_dir, plugins_dir); } if (!g_irepository_require (NULL, "Ide", "1.0", 0, &error) || !g_irepository_require (NULL, "Gtk", "3.0", 0, &error) || !g_irepository_require (NULL, "Dazzle", "1.0", 0, &error)) g_warning ("Cannot enable Python 3 plugins: %s", error->message); else { /* Avoid spamming stderr with Ide import tracebacks */ peas_engine_enable_loader (engine, "python3"); } peas_engine_prepend_search_path (engine, "resource:///org/gnome/builder/plugins/", NULL); path = g_build_filename (g_get_user_data_dir (), "gnome-builder", "plugins", NULL); peas_engine_prepend_search_path (engine, path, NULL); g_free (path); list = peas_engine_get_plugin_list (engine); for (; list; list = list->next) { PeasPluginInfo *plugin_info = list->data; g_debug ("Discovered plugin \"%s\"", peas_plugin_info_get_module_name (plugin_info)); } }
static void ide_keybindings_reload (IdeKeybindings *self) { GdkScreen *screen; PeasEngine *engine; const GList *list; IDE_ENTRY; g_assert (IDE_IS_KEYBINDINGS (self)); { g_autofree gchar *path = NULL; g_autoptr(GBytes) bytes = NULL; g_autoptr(GError) error = NULL; if (self->mode == NULL) self->mode = g_strdup ("default"); IDE_TRACE_MSG ("Loading %s keybindings", self->mode); path = g_strdup_printf ("/org/gnome/builder/keybindings/%s.css", self->mode); bytes = g_resources_lookup_data (path, G_RESOURCE_LOOKUP_FLAGS_NONE, &error); if (error == NULL) { /* * We use -1 for the length so that the CSS provider knows that the * string is \0 terminated. This is guaranteed to us by GResources so * that interned data can be used as C strings. */ gtk_css_provider_load_from_data (self->css_provider, g_bytes_get_data (bytes, NULL), -1, &error); } if (error) g_warning ("%s", error->message); } engine = peas_engine_get_default (); screen = gdk_screen_get_default (); if (self->plugin_providers != NULL) { GHashTableIter iter; GtkStyleProvider *provider; g_hash_table_iter_init (&iter, self->plugin_providers); while (g_hash_table_iter_next (&iter, NULL, (gpointer *)&provider)) gtk_style_context_remove_provider_for_screen (screen, provider); g_clear_pointer (&self->plugin_providers, g_hash_table_unref); } self->plugin_providers = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); list = peas_engine_get_plugin_list (engine); for (; list != NULL; list = list->next) { PeasPluginInfo *plugin_info = list->data; if (!peas_plugin_info_is_loaded (plugin_info)) continue; ide_keybindings_load_plugin (self, plugin_info, engine); } IDE_EXIT; }
static void mnb_home_new_widget_dialog_init (MnbHomeNewWidgetDialog *self) { ClutterActor *table, *itemview; MnbHomeNewWidgetDialogItemFactory *factory; MnbHomePluginsEngine *engine; const GList *l; self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, MNB_TYPE_HOME_NEW_WIDGET_DIALOG, MnbHomeNewWidgetDialogPrivate); /* set up model and view */ self->priv->items = clutter_list_model_new (ITEMS_N_COLUMNS, G_TYPE_STRING, "Module", /* ITEMS_MODULE */ G_TYPE_STRING, "Name", /* ITEMS_NAME */ G_TYPE_STRING, "Icon" /* ITEMS_ICON */); table = mx_table_new (); mx_bin_set_child (MX_BIN (self), table); factory = g_object_new (MNB_TYPE_HOME_NEW_WIDGET_DIALOG_ITEM_FACTORY, NULL); factory->dialog = self; itemview = mx_item_view_new (); mx_table_add_actor (MX_TABLE (table), itemview, 0, 1); mx_item_view_set_model (MX_ITEM_VIEW (itemview), self->priv->items); mx_item_view_set_factory (MX_ITEM_VIEW (itemview), MX_ITEM_FACTORY (factory)); mx_item_view_add_attribute (MX_ITEM_VIEW (itemview), "module", ITEMS_MODULE); mx_item_view_add_attribute (MX_ITEM_VIEW (itemview), "label", ITEMS_NAME); mx_item_view_add_attribute (MX_ITEM_VIEW (itemview), "icon", ITEMS_ICON); clutter_actor_show_all (table); /* find plugins */ /* FIXME: should we monitor for new plugins on the fly? */ engine = mnb_home_plugins_engine_dup (); for (l = peas_engine_get_plugin_list (PEAS_ENGINE (engine)); l != NULL; l = g_list_next (l)) { PeasPluginInfo *info = l->data; char *icon; if (!peas_plugin_info_is_available (info, NULL)) continue; icon = g_build_filename ( peas_plugin_info_get_module_dir (info), peas_plugin_info_get_icon_name (info), NULL); clutter_model_append (self->priv->items, ITEMS_MODULE, peas_plugin_info_get_module_name (info), ITEMS_NAME, peas_plugin_info_get_name (info), ITEMS_ICON, icon, -1); g_free (icon); } /* add actions */ mx_dialog_add_action (MX_DIALOG (self), mx_action_new_full ("cancel", _("Cancel"), G_CALLBACK (home_new_widget_dialog_cancel), self)); g_object_unref (engine); g_object_unref (factory); }
void gb_plugins_init (void) { PeasEngine *engine; const GList *list; /* * Ensure plugin-extensible types are registered. * This allows libgnome-builder.la to be linked and not drop * important symbols. */ g_type_ensure (GB_TYPE_APPLICATION); g_type_ensure (GB_TYPE_DOCUMENT); g_type_ensure (GB_TYPE_TREE); g_type_ensure (GB_TYPE_TREE_BUILDER); g_type_ensure (GB_TYPE_TREE_NODE); g_type_ensure (GB_TYPE_VIEW); g_type_ensure (GB_TYPE_VIEW_GRID); g_type_ensure (GB_TYPE_WORKBENCH); g_type_ensure (GB_TYPE_WORKSPACE); engine = peas_engine_get_default (); peas_engine_enable_loader (engine, "python3"); if (g_getenv ("GB_IN_TREE_PLUGINS") != NULL) { GDir *dir; g_irepository_require_private (g_irepository_get_default (), BUILDDIR"/libide", "Ide", "1.0", 0, NULL); if ((dir = g_dir_open (BUILDDIR"/plugins", 0, NULL))) { const gchar *name; while ((name = g_dir_read_name (dir))) { gchar *path; path = g_build_filename (BUILDDIR, "plugins", name, NULL); peas_engine_prepend_search_path (engine, path, path); g_free (path); } g_dir_close (dir); } } else { peas_engine_prepend_search_path (engine, PACKAGE_LIBDIR"/gnome-builder/plugins", PACKAGE_DATADIR"/gnome-builder/plugins"); } list = peas_engine_get_plugin_list (engine); for (; list; list = list->next) { if (peas_plugin_info_is_builtin (list->data)) peas_engine_load_plugin (engine, list->data); } }