From edf554dcf09b20bfc1cc2087d800cee8ba80aba0 Mon Sep 17 00:00:00 2001 From: Christian Hergert Date: Fri, 17 Mar 2023 14:44:12 -0700 Subject: plugin-info: expose various data as properties This allows for data binding using g_object_bind_property() and similar in applications. --- libpeas/peas-engine.c | 4 ++ libpeas/peas-plugin-info.c | 147 ++++++++++++++++++++++++++++++++++++++++++++ tests/libpeas/plugin-info.c | 12 ++++ 3 files changed, 163 insertions(+) diff --git a/libpeas/peas-engine.c b/libpeas/peas-engine.c index d48b247..2e4c878 100644 --- a/libpeas/peas-engine.c +++ b/libpeas/peas-engine.c @@ -1195,6 +1195,8 @@ peas_engine_load_plugin_real (PeasEngine *engine, g_debug ("Loaded plugin '%s'", peas_plugin_info_get_module_name (info)); + g_object_notify (G_OBJECT (info), "loaded"); + g_object_notify_by_pspec (G_OBJECT (engine), properties[PROP_LOADED_PLUGINS]); @@ -1272,6 +1274,8 @@ peas_engine_unload_plugin_real (PeasEngine *engine, g_debug ("Unloaded plugin '%s'", peas_plugin_info_get_module_name (info)); + g_object_notify (G_OBJECT (info), "loaded"); + /* Don't notify while in dispose so the * loaded plugins can easily be kept in GSettings */ diff --git a/libpeas/peas-plugin-info.c b/libpeas/peas-plugin-info.c index fbf4db9..9bfb749 100644 --- a/libpeas/peas-plugin-info.c +++ b/libpeas/peas-plugin-info.c @@ -38,6 +38,8 @@ #define OS_HELP_KEY "Help-GNOME" #endif +#define I_(s) g_intern_string(s) + /** * PeasPluginInfo: * @@ -66,6 +68,25 @@ G_DEFINE_QUARK (peas-plugin-info-error, peas_plugin_info_error) G_DEFINE_FINAL_TYPE (PeasPluginInfo, peas_plugin_info, G_TYPE_OBJECT) +enum { + PROP_0, + PROP_AUTHORS, + PROP_COPYRIGHT, + PROP_DEPENDENCIES, + PROP_DESCRIPTION, + PROP_HELP_URI, + PROP_ICON_NAME, + PROP_LOADED, + PROP_MODULE_DIR, + PROP_MODULE_NAME, + PROP_NAME, + PROP_VERSION, + PROP_WEBSITE, + N_PROPS +}; + +static GParamSpec *properties [N_PROPS]; + static void peas_plugin_info_finalize (GObject *object) { @@ -92,12 +113,138 @@ peas_plugin_info_finalize (GObject *object) G_OBJECT_CLASS (peas_plugin_info_parent_class)->finalize (object); } +static void +peas_plugin_info_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + PeasPluginInfo *info = PEAS_PLUGIN_INFO (object); + + switch (prop_id) + { + case PROP_AUTHORS: + g_value_set_boxed (value, peas_plugin_info_get_authors (info)); + break; + + case PROP_COPYRIGHT: + g_value_set_string (value, peas_plugin_info_get_copyright (info)); + break; + + case PROP_DEPENDENCIES: + g_value_set_boxed (value, peas_plugin_info_get_dependencies (info)); + break; + + case PROP_DESCRIPTION: + g_value_set_string (value, peas_plugin_info_get_description (info)); + break; + + case PROP_HELP_URI: + g_value_set_string (value, peas_plugin_info_get_help_uri (info)); + break; + + case PROP_ICON_NAME: + g_value_set_string (value, peas_plugin_info_get_icon_name (info)); + break; + + case PROP_LOADED: + g_value_set_boolean (value, peas_plugin_info_is_loaded (info)); + break; + + case PROP_MODULE_DIR: + g_value_set_string (value, peas_plugin_info_get_module_dir (info)); + break; + + case PROP_MODULE_NAME: + g_value_set_string (value, peas_plugin_info_get_module_name (info)); + break; + + case PROP_NAME: + g_value_set_string (value, peas_plugin_info_get_name (info)); + break; + + case PROP_VERSION: + g_value_set_string (value, peas_plugin_info_get_version (info)); + break; + + case PROP_WEBSITE: + g_value_set_string (value, peas_plugin_info_get_website (info)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + static void peas_plugin_info_class_init (PeasPluginInfoClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); object_class->finalize = peas_plugin_info_finalize; + object_class->get_property = peas_plugin_info_get_property; + + properties[PROP_LOADED] = + g_param_spec_boolean (I_("loaded"), NULL, NULL, + FALSE, + (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + properties[PROP_MODULE_NAME] = + g_param_spec_string (I_("module-name"), NULL, NULL, + NULL, + (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + properties[PROP_MODULE_DIR] = + g_param_spec_string (I_("module-dir"), NULL, NULL, + NULL, + (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + properties[PROP_NAME] = + g_param_spec_string (I_("name"), NULL, NULL, + NULL, + (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + properties[PROP_COPYRIGHT] = + g_param_spec_string (I_("copyright"), NULL, NULL, + NULL, + (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + properties[PROP_DESCRIPTION] = + g_param_spec_string (I_("description"), NULL, NULL, + NULL, + (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + properties[PROP_ICON_NAME] = + g_param_spec_string (I_("icon-name"), NULL, NULL, + NULL, + (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + properties[PROP_WEBSITE] = + g_param_spec_string (I_("website"), NULL, NULL, + NULL, + (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + properties[PROP_VERSION] = + g_param_spec_string (I_("version"), NULL, NULL, + NULL, + (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + properties[PROP_HELP_URI] = + g_param_spec_string (I_("help-uri"), NULL, NULL, + NULL, + (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + properties[PROP_DEPENDENCIES] = + g_param_spec_boxed (I_("dependencies"), NULL, NULL, + G_TYPE_STRV, + (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + properties[PROP_AUTHORS] = + g_param_spec_boxed (I_("authors"), NULL, NULL, + G_TYPE_STRV, + (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_properties (object_class, N_PROPS, properties); } static void diff --git a/tests/libpeas/plugin-info.c b/tests/libpeas/plugin-info.c index 75a58d3..8253811 100644 --- a/tests/libpeas/plugin-info.c +++ b/tests/libpeas/plugin-info.c @@ -93,6 +93,18 @@ test_plugin_info_verify_full_info (PeasEngine *engine) g_assert_cmpstr (peas_plugin_info_get_external_data (info, "External"), ==, "external data"); g_assert_cmpstr (peas_plugin_info_get_external_data (info, "X-External"), ==, "external data"); + + { + static const char *strprops[] = { "name", "description", "icon-name", "website", "copyright", "version", "help-uri", NULL }; + + for (guint i = 0; strprops[i]; i++) + { + char *str = NULL; + g_object_get (info, strprops[i], &str, NULL); + g_assert_nonnull (str); + g_free (str); + } + } } static void -- cgit v1.2.1