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 | |
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')
-rw-r--r-- | demos/gtk-demo/listview_settings.c | 143 | ||||
-rw-r--r-- | demos/gtk-demo/meson.build | 1 | ||||
-rw-r--r-- | demos/gtk-demo/settings-key.c | 165 | ||||
-rw-r--r-- | demos/gtk-demo/settings-key.h | 17 |
4 files changed, 190 insertions, 136 deletions
diff --git a/demos/gtk-demo/listview_settings.c b/demos/gtk-demo/listview_settings.c index 4e8e69bfbf..6a7779ba12 100644 --- a/demos/gtk-demo/listview_settings.c +++ b/demos/gtk-demo/listview_settings.c @@ -14,138 +14,7 @@ #include <gtk/gtk.h> -#include <stdlib.h> - -/* Create an object that wraps GSettingsSchemaKey because that's a boxed type */ -typedef struct _SettingsKey SettingsKey; -struct _SettingsKey -{ - GObject parent_instance; - - GSettings *settings; - GSettingsSchemaKey *key; -}; - -enum { - PROP_0, - PROP_NAME, - PROP_SUMMARY, - PROP_DESCRIPTION, - PROP_VALUE, - PROP_TYPE, - PROP_DEFAULT_VALUE, - - N_PROPS -}; - -#define SETTINGS_TYPE_KEY (settings_key_get_type ()) -G_DECLARE_FINAL_TYPE (SettingsKey, settings_key, SETTINGS, KEY, GObject); - -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; - - 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_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) -{ -} - -static 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; -} +#include "settings-key.h" static void item_value_changed (GtkEditableLabel *label, @@ -153,6 +22,7 @@ item_value_changed (GtkEditableLabel *label, GtkColumnViewCell *cell) { SettingsKey *self; + GSettingsSchemaKey *key; const char *text; const GVariantType *type; GVariant *variant; @@ -163,9 +33,10 @@ item_value_changed (GtkEditableLabel *label, text = gtk_editable_get_text (GTK_EDITABLE (label)); self = gtk_column_view_cell_get_item (cell); + key = settings_key_get_key (self); - type = g_settings_schema_key_get_value_type (self->key); - name = g_settings_schema_key_get_name (self->key); + type = g_settings_schema_key_get_value_type (key); + name = g_settings_schema_key_get_name (key); variant = g_variant_parse (type, text, NULL, NULL, &error); if (!variant) @@ -175,13 +46,13 @@ item_value_changed (GtkEditableLabel *label, goto revert; } - if (!g_settings_schema_key_range_check (self->key, variant)) + if (!g_settings_schema_key_range_check (key, variant)) { g_warning ("Not a valid value for %s", name); goto revert; } - g_settings_set_value (self->settings, name, variant); + g_settings_set_value (settings_key_get_settings (self), name, variant); g_variant_unref (variant); return; diff --git a/demos/gtk-demo/meson.build b/demos/gtk-demo/meson.build index c03beb3940..f1ce4ffc6b 100644 --- a/demos/gtk-demo/meson.build +++ b/demos/gtk-demo/meson.build @@ -131,6 +131,7 @@ extra_demo_sources = files([ 'demo4widget.c', 'pixbufpaintable.c', 'script-names.c', + 'settings-key.c', 'unicode-names.c', 'suggestionentry.c', 'language-names.c', 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; +} + diff --git a/demos/gtk-demo/settings-key.h b/demos/gtk-demo/settings-key.h new file mode 100644 index 0000000000..5260a84516 --- /dev/null +++ b/demos/gtk-demo/settings-key.h @@ -0,0 +1,17 @@ +#pragma once + +#include <gtk/gtk.h> + +#include <stdlib.h> + +/* Create an object that wraps GSettingsSchemaKey because that's a boxed type */ +typedef struct _SettingsKey SettingsKey; +#define SETTINGS_TYPE_KEY (settings_key_get_type ()) +G_DECLARE_FINAL_TYPE (SettingsKey, settings_key, SETTINGS, KEY, GObject); + +SettingsKey * settings_key_new (GSettings *settings, + GSettingsSchemaKey *key); + +GSettingsSchemaKey * settings_key_get_key (SettingsKey *self); +GSettings * settings_key_get_settings (SettingsKey *self); +char * settings_key_get_search_string (SettingsKey *self); |