diff options
author | Benjamin Otte <otte@redhat.com> | 2023-04-11 04:46:40 +0200 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2023-05-09 17:01:20 +0200 |
commit | 435a405c553941e54a5b0ccf3556ab96a900fdfb (patch) | |
tree | 5d86f9daeb0ff5993652e54cadc5463d0b293192 /demos/gtk-demo/settings-key.c | |
parent | e1ed9f10c6b37badc3d99fd349d75f4c43e53d37 (diff) | |
download | gtk+-435a405c553941e54a5b0ccf3556ab96a900fdfb.tar.gz |
gtk-demo: Split out code from the settings demo
I want to add another demo using settings and share relevant code.
Diffstat (limited to 'demos/gtk-demo/settings-key.c')
-rw-r--r-- | demos/gtk-demo/settings-key.c | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/demos/gtk-demo/settings-key.c b/demos/gtk-demo/settings-key.c new file mode 100644 index 0000000000..13c0a5d559 --- /dev/null +++ b/demos/gtk-demo/settings-key.c @@ -0,0 +1,165 @@ +#include "settings-key.h" + +/* Create an object that wraps GSettingsSchemaKey because that's a boxed type */ +struct _SettingsKey +{ + GObject parent_instance; + + GSettings *settings; + GSettingsSchemaKey *key; +}; + +enum { + PROP_0, + PROP_NAME, + PROP_SETTINGS, + PROP_SUMMARY, + PROP_DESCRIPTION, + PROP_VALUE, + PROP_TYPE, + PROP_DEFAULT_VALUE, + + N_PROPS +}; + +G_DEFINE_TYPE (SettingsKey, settings_key, G_TYPE_OBJECT); +static GParamSpec *properties[N_PROPS] = { NULL, }; + +static void +settings_key_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + SettingsKey *self = SETTINGS_KEY (object); + + switch (property_id) + { + case PROP_DESCRIPTION: + g_value_set_string (value, g_settings_schema_key_get_description (self->key)); + break; + + case PROP_NAME: + g_value_set_string (value, g_settings_schema_key_get_name (self->key)); + break; + + case PROP_SUMMARY: + g_value_set_string (value, g_settings_schema_key_get_summary (self->key)); + break; + + case PROP_VALUE: + { + GVariant *variant = g_settings_get_value (self->settings, g_settings_schema_key_get_name (self->key)); + g_value_take_string (value, g_variant_print (variant, FALSE)); + g_variant_unref (variant); + } + break; + + case PROP_TYPE: + { + const GVariantType *type = g_settings_schema_key_get_value_type (self->key); + g_value_set_string (value, g_variant_type_peek_string (type)); + } + break; + + case PROP_DEFAULT_VALUE: + { + GVariant *variant = g_settings_schema_key_get_default_value (self->key); + g_value_take_string (value, g_variant_print (variant, FALSE)); + g_variant_unref (variant); + } + break; + + case PROP_SETTINGS: + g_value_set_object (value, self->settings); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +settings_key_finalize (GObject *object) +{ + SettingsKey *self = SETTINGS_KEY (object); + + g_object_unref (self->settings); + g_settings_schema_key_unref (self->key); + + G_OBJECT_CLASS (settings_key_parent_class)->finalize (object); +} + +static void +settings_key_class_init (SettingsKeyClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = settings_key_finalize; + gobject_class->get_property = settings_key_get_property; + + properties[PROP_DESCRIPTION] = + g_param_spec_string ("description", NULL, NULL, NULL, G_PARAM_READABLE); + properties[PROP_NAME] = + g_param_spec_string ("name", NULL, NULL, NULL, G_PARAM_READABLE); + properties[PROP_SETTINGS] = + g_param_spec_object ("settings", NULL, NULL, G_TYPE_SETTINGS, G_PARAM_READABLE); + properties[PROP_SUMMARY] = + g_param_spec_string ("summary", NULL, NULL, NULL, G_PARAM_READABLE); + properties[PROP_VALUE] = + g_param_spec_string ("value", NULL, NULL, NULL, G_PARAM_READABLE); + properties[PROP_TYPE] = + g_param_spec_string ("type", NULL, NULL, NULL, G_PARAM_READABLE); + properties[PROP_DEFAULT_VALUE] = + g_param_spec_string ("default-value", NULL, NULL, NULL, G_PARAM_READABLE); + + g_object_class_install_properties (gobject_class, N_PROPS, properties); +} + +static void +settings_key_init (SettingsKey *self) +{ +} + +SettingsKey * +settings_key_new (GSettings *settings, + GSettingsSchemaKey *key) +{ + SettingsKey *result = g_object_new (SETTINGS_TYPE_KEY, NULL); + + result->settings = g_object_ref (settings); + result->key = g_settings_schema_key_ref (key); + + return result; +} + +GSettingsSchemaKey * +settings_key_get_key (SettingsKey *self) +{ + return self->key; +} + +GSettings * +settings_key_get_settings (SettingsKey *self) +{ + return self->settings; +} + +char * +settings_key_get_search_string (SettingsKey *self) +{ + char *schema, *result; + + g_object_get (self->settings, "schema-id", &schema, NULL); + + result = g_strconcat (g_settings_schema_key_get_name (self->key), " ", + g_settings_schema_key_get_summary (self->key), " ", + schema, + NULL); + + g_free (schema); + + return result; +} + |