gtk-demo: Split out code from the settings demo
authorBenjamin Otte <otte@redhat.com>
Tue, 11 Apr 2023 02:46:40 +0000 (04:46 +0200)
committerBenjamin Otte <otte@redhat.com>
Tue, 9 May 2023 15:01:20 +0000 (17:01 +0200)
I want to add another demo using settings and share relevant code.

demos/gtk-demo/listview_settings.c
demos/gtk-demo/meson.build
demos/gtk-demo/settings-key.c [new file with mode: 0644]
demos/gtk-demo/settings-key.h [new file with mode: 0644]

index 4e8e69bfbf4b8dd9548360e99fcaa623e0ca205d..6a7779ba12b0690777e5c88143d48238a100ee74 100644 (file)
 
 #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;
 
index c03beb39409d18db2e93801b7d6c6d5c4eced859..f1ce4ffc6bcec17eb4fbf4a505dd1826a05bb4b5 100644 (file)
@@ -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 (file)
index 0000000..13c0a5d
--- /dev/null
@@ -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 (file)
index 0000000..5260a84
--- /dev/null
@@ -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);