summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Hergert <chergert@redhat.com>2023-03-17 14:44:12 -0700
committerChristian Hergert <chergert@redhat.com>2023-03-22 16:44:35 -0700
commit1fc7bcd0251fb02e41298c96a5c9184526c6a699 (patch)
tree0766070684181079a74d8a2d906fedb92c054fca
parentea348fc01180d135c4d3d59eede52e48ea906a43 (diff)
downloadlibpeas-1fc7bcd0251fb02e41298c96a5c9184526c6a699.tar.gz
plugin-info: expose various data as properties
This allows for data binding using g_object_bind_property() and similar in applications.
-rw-r--r--libpeas/peas-engine.c4
-rw-r--r--libpeas/peas-plugin-info.c147
-rw-r--r--tests/libpeas/plugin-info.c12
3 files changed, 163 insertions, 0 deletions
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)
{
@@ -93,11 +114,137 @@ peas_plugin_info_finalize (GObject *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