[gnome-shell/wip/carlosg/cleanup-gtk-usage: 11/17] st: Add StSettings object



commit 2677af06899c8cd9c66ceba56ace1f11cf2abe8e
Author: Carlos Garnacho <carlosg gnome org>
Date:   Wed Jan 30 21:33:33 2019 +0100

    st: Add StSettings object
    
    This is a GtkSettings lookalike, so the shell can fetch the relevant
    settings.

 src/st/meson.build   |   2 +
 src/st/st-settings.c | 211 +++++++++++++++++++++++++++++++++++++++++++++++++++
 src/st/st-settings.h |  34 +++++++++
 3 files changed, 247 insertions(+)
---
diff --git a/src/st/meson.build b/src/st/meson.build
index 97ce6134d..21756eb07 100644
--- a/src/st/meson.build
+++ b/src/st/meson.build
@@ -17,6 +17,7 @@ st_headers = [
   'st-scrollable.h',
   'st-scroll-bar.h',
   'st-scroll-view.h',
+  'st-settings.h',
   'st-shadow.h',
   'st-texture-cache.h',
   'st-theme.h',
@@ -70,6 +71,7 @@ st_sources = [
   'st-scrollable.c',
   'st-scroll-bar.c',
   'st-scroll-view.c',
+  'st-settings.c',
   'st-shadow.c',
   'st-texture-cache.c',
   'st-theme.c',
diff --git a/src/st/st-settings.c b/src/st/st-settings.c
new file mode 100644
index 000000000..08220f027
--- /dev/null
+++ b/src/st/st-settings.c
@@ -0,0 +1,211 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+/*
+ * st-settings.c: Global settings
+ *
+ * Copyright 2019 Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU Lesser General Public License,
+ * version 2.1, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gio/gio.h>
+
+#include "st-settings.h"
+
+#define KEY_ENABLE_ANIMATIONS "enable-animations"
+#define KEY_PRIMARY_PASTE     "gtk-enable-primary-paste"
+#define KEY_DRAG_THRESHOLD    "drag-threshold"
+#define KEY_GTK_THEME         "gtk-theme"
+
+enum {
+  PROP_0,
+  PROP_ENABLE_ANIMATIONS,
+  PROP_PRIMARY_PASTE,
+  PROP_DRAG_THRESHOLD,
+  PROP_GTK_THEME,
+  N_PROPS
+};
+
+GParamSpec *props[N_PROPS] = { 0 };
+
+struct _StSettings
+{
+  GObject parent_object;
+  GSettings *interface_settings;
+  GSettings *mouse_settings;
+
+  gchar *gtk_theme;
+  gboolean enable_animations;
+  gboolean primary_paste;
+  gint drag_threshold;
+};
+
+G_DEFINE_TYPE (StSettings, st_settings, G_TYPE_OBJECT)
+
+static void
+st_settings_finalize (GObject *object)
+{
+  StSettings *settings = ST_SETTINGS (object);
+
+  g_object_unref (settings->interface_settings);
+  g_object_unref (settings->mouse_settings);
+  g_free (settings->gtk_theme);
+
+  G_OBJECT_CLASS (st_settings_parent_class)->finalize (object);
+}
+
+static void
+st_settings_set_property (GObject      *object,
+                          guint         prop_id,
+                          const GValue *value,
+                          GParamSpec   *pspec)
+{
+  G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+}
+
+static void
+st_settings_get_property (GObject    *object,
+                          guint       prop_id,
+                          GValue     *value,
+                          GParamSpec *pspec)
+{
+  StSettings *settings = ST_SETTINGS (object);
+
+  switch (prop_id)
+    {
+    case PROP_ENABLE_ANIMATIONS:
+      g_value_set_boolean (value, settings->enable_animations);
+      break;
+    case PROP_PRIMARY_PASTE:
+      g_value_set_boolean (value, settings->primary_paste);
+      break;
+    case PROP_DRAG_THRESHOLD:
+      g_value_set_int (value, settings->drag_threshold);
+      break;
+    case PROP_GTK_THEME:
+      g_value_set_string (value, settings->gtk_theme);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+st_settings_class_init (StSettingsClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+  object_class->finalize = st_settings_finalize;
+  object_class->set_property = st_settings_set_property;
+  object_class->get_property = st_settings_get_property;
+
+  props[PROP_ENABLE_ANIMATIONS] = g_param_spec_boolean ("enable-animations",
+                                                        "Enable animations",
+                                                        "Enable animations",
+                                                        TRUE,
+                                                        G_PARAM_READABLE);
+  props[PROP_PRIMARY_PASTE] = g_param_spec_boolean ("primary-paste",
+                                                    "Primary paste",
+                                                    "Primary paste",
+                                                    TRUE,
+                                                    G_PARAM_READABLE);
+  props[PROP_DRAG_THRESHOLD] = g_param_spec_int ("drag-threshold",
+                                                 "Drag threshold",
+                                                 "Drag threshold",
+                                                 0, G_MAXINT, 8,
+                                                 G_PARAM_READABLE);
+  props[PROP_GTK_THEME] = g_param_spec_string ("gtk-theme",
+                                               "GTK+ Theme",
+                                               "GTK+ Theme",
+                                               "",
+                                               G_PARAM_READABLE);
+
+  g_object_class_install_properties (object_class, N_PROPS, props);
+}
+
+static void
+on_interface_settings_changed (GSettings   *g_settings,
+                               const gchar *key,
+                               StSettings  *settings)
+{
+  if (g_str_equal (key, KEY_ENABLE_ANIMATIONS))
+    {
+      settings->enable_animations = g_settings_get_boolean (g_settings, key);
+      g_object_notify_by_pspec (G_OBJECT (settings), props[PROP_ENABLE_ANIMATIONS]);
+    }
+  else if (g_str_equal (key, KEY_PRIMARY_PASTE))
+    {
+      settings->primary_paste = g_settings_get_boolean (g_settings, key);
+      g_object_notify_by_pspec (G_OBJECT (settings), props[PROP_PRIMARY_PASTE]);
+    }
+  else if (g_str_equal (key, KEY_GTK_THEME))
+    {
+      g_free (settings->gtk_theme);
+      settings->gtk_theme = g_settings_get_string (g_settings, key);
+      g_object_notify_by_pspec (G_OBJECT (settings), props[PROP_GTK_THEME]);
+    }
+}
+
+static void
+on_mouse_settings_changed (GSettings   *g_settings,
+                           const gchar *key,
+                           StSettings  *settings)
+{
+  if (g_str_equal (key, KEY_DRAG_THRESHOLD))
+    {
+      settings->drag_threshold = g_settings_get_int (g_settings, key);
+      g_object_notify_by_pspec (G_OBJECT (settings), props[PROP_DRAG_THRESHOLD]);
+    }
+}
+
+static void
+st_settings_init (StSettings *settings)
+{
+  settings->interface_settings = g_settings_new ("org.gnome.desktop.interface");
+  g_signal_connect (settings->interface_settings, "changed",
+                    G_CALLBACK (on_interface_settings_changed), settings);
+
+  settings->mouse_settings = g_settings_new ("org.gnome.settings-daemon.peripherals.mouse");
+  g_signal_connect (settings->interface_settings, "changed",
+                    G_CALLBACK (on_mouse_settings_changed), settings);
+
+  settings->enable_animations = g_settings_get_boolean (settings->interface_settings,
+                                                        KEY_ENABLE_ANIMATIONS);
+  settings->primary_paste = g_settings_get_boolean (settings->interface_settings,
+                                                    KEY_PRIMARY_PASTE);
+  settings->gtk_theme = g_settings_get_string (settings->interface_settings,
+                                               KEY_GTK_THEME);
+  settings->drag_threshold = g_settings_get_int (settings->mouse_settings,
+                                                 KEY_DRAG_THRESHOLD);
+}
+
+/**
+ * st_settings_get:
+ *
+ * Gets the #StSettings
+ *
+ * Returns: (transfer none): a settings object
+ **/
+StSettings *
+st_settings_get (void)
+{
+  static StSettings *settings = NULL;
+
+  if (!settings)
+    settings = g_object_new (ST_TYPE_SETTINGS, NULL);
+
+  return settings;
+}
diff --git a/src/st/st-settings.h b/src/st/st-settings.h
new file mode 100644
index 000000000..a57885c40
--- /dev/null
+++ b/src/st/st-settings.h
@@ -0,0 +1,34 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+/*
+ * st-settings.h: Global settings
+ *
+ * Copyright 2019 Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU Lesser General Public License,
+ * version 2.1, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#if !defined(ST_H_INSIDE) && !defined(ST_COMPILATION)
+#error "Only <st/st.h> can be included directly.h"
+#endif
+
+#ifndef __ST_SETTINGS_H__
+#define __ST_SETTINGS_H__
+
+G_BEGIN_DECLS
+
+#define ST_TYPE_SETTINGS (st_settings_get_type ())
+G_DECLARE_FINAL_TYPE (StSettings, st_settings, ST, SETTINGS, GObject)
+
+StSettings * st_settings_get (void);
+
+#endif /* __ST_SETTINGS_H__ */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]