[gtk+] Wayland: Read settings out of GSettings directly
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] Wayland: Read settings out of GSettings directly
- Date: Thu, 21 Mar 2013 11:15:31 +0000 (UTC)
commit 5f48934943b1c5b5b331fc84a6fdf3c67323c218
Author: Matthias Clasen <mclasen redhat com>
Date: Thu Mar 21 06:52:42 2013 -0400
Wayland: Read settings out of GSettings directly
Until we figure out where we want to go with settings under
Wayland, this makes GTK+ applications a lot easier to deal
with under Wayland.
Note that we are careful to deal with the absence of schemas,
so this does not introduce a dependency on GNOME settings.
gdk/wayland/gdkscreen-wayland.c | 206 ++++++++++++++++++++++++++++++++++----
1 files changed, 184 insertions(+), 22 deletions(-)
---
diff --git a/gdk/wayland/gdkscreen-wayland.c b/gdk/wayland/gdkscreen-wayland.c
index b69d783..15c4bd4 100644
--- a/gdk/wayland/gdkscreen-wayland.c
+++ b/gdk/wayland/gdkscreen-wayland.c
@@ -21,6 +21,7 @@
#include <string.h>
#include <glib.h>
+#include <gio/gio.h>
#include "gdkscreenprivate.h"
#include "gdkvisualprivate.h"
#include "gdkdisplay.h"
@@ -56,6 +57,8 @@ struct _GdkWaylandScreen
/* Xinerama/RandR 1.2 */
GPtrArray *monitors;
gint primary_monitor;
+
+ GHashTable *settings;
};
struct _GdkWaylandScreenClass
@@ -133,6 +136,8 @@ gdk_wayland_screen_finalize (GObject *object)
deinit_multihead (GDK_SCREEN (object));
+ g_hash_table_destroy (screen_wayland->settings);
+
G_OBJECT_CLASS (_gdk_wayland_screen_parent_class)->finalize (object);
}
@@ -274,35 +279,191 @@ gdk_wayland_screen_broadcast_client_message (GdkScreen *screen,
{
}
+typedef struct _TranslationEntry TranslationEntry;
+struct _TranslationEntry {
+ const gchar *schema;
+ const gchar *key;
+ const gchar *setting;
+ GType type;
+ const gchar *default_string;
+ gint default_int;
+};
+
+static TranslationEntry translations[] = {
+ { "org.gnome.desktop.interface", "gtk-theme", "gtk-theme-name" , G_TYPE_STRING, "Adwaita", 0 },
+ { "org.gnome.desktop.interface", "icon-theme", "gtk-icon-theme-name", G_TYPE_STRING, "gnome", 0 },
+ { "org.gnome.desktop.interface", "cursor-theme", "gtk-cursor-theme-name", G_TYPE_STRING, "Adwaita", 0 },
+ { "org.gnome.desktop.interface", "font-name", "gtk-font-name", G_TYPE_STRING, "Cantarell 11", 0 },
+ { "org.gnome.desktop.interface", "cursor-blink", "gtk-cursor-blink", G_TYPE_BOOLEAN, NULL, 1 },
+ { "org.gnome.desktop.interface", "cursor-blink-time", "gtk-cursor-blink-time", G_TYPE_INT, NULL, 1200 },
+ { "org.gnome.desktop.interface", "cursor-blink-timeout", "gtk-cursor-blink-timeout", G_TYPE_INT, NULL,
3600 },
+ { "org.gnome.desktop.interface", "menus-have-icons", "gtk-menu-images", G_TYPE_BOOLEAN, NULL, 0 },
+ { "org.gnome.desktop.interface", "buttons-have-icons", "gtk-button-images", G_TYPE_BOOLEAN, NULL, 0 },
+ { "org.gnome.desktop.interface", "gtk-im-module", "gtk-im-module", G_TYPE_STRING, "simple", 0 },
+ { "org.gnome.desktop.interface", "enable-animations", "gtk-enable-animations", G_TYPE_BOOLEAN, NULL, 1 },
+ { "org.gnome.desktop.interface", "show-input-method-menu", "gtk-show-input-method-menu", G_TYPE_BOOLEAN,
NULL, 0 },
+ { "org.gnome.desktop.interface", "show-unicode-menu", "gtk-show-unicode-menu", G_TYPE_BOOLEAN, NULL, 0 },
+ { "org.gnome.desktop.interface", "automatic-mnemonics", "gtk-auto-mnemonics", G_TYPE_BOOLEAN, NULL, 1 },
+ { "org.gnome.settings-daemon.peripherals.mouse", "double-click", "gtk-double-click-time", G_TYPE_INT,
NULL, 250 },
+ { "org.gnome.settings-daemon.peripherals.mouse", "drag-threshold", "gtk-dnd-drag-threshold", G_TYPE_INT,
NULL, 8 },
+ { "org.gnome.desktop.sound", "theme-name", "gtk-sound-theme-name", G_TYPE_STRING, "freedesktop", 0 },
+ { "org.gnome.desktop.sound", "event-sounds", "gtk-enable-event-sounds", G_TYPE_BOOLEAN, NULL, 1 },
+ { "org.gnome.desktop.sound", "input-feedback-sounds", "gtk-enable-input-feedback-sounds", G_TYPE_BOOLEAN,
NULL, 0 }
+};
+
+static TranslationEntry *
+find_translation_entry_by_key (GSettings *settings, const gchar *key)
+{
+ guint i;
+ gchar *schema;
+
+ g_object_get (settings, "schema", &schema, NULL);
+
+ for (i = 0; i < G_N_ELEMENTS (translations); i++)
+ {
+ if (g_str_equal (schema, translations[i].schema) &&
+ g_str_equal (key, translations[i].key))
+ {
+ g_free (schema);
+ return &translations[i];
+ }
+ }
+
+ g_free (schema);
+
+ return NULL;
+}
+
+static TranslationEntry *
+find_translation_entry_by_setting (const gchar *setting)
+{
+ guint i;
+
+ for (i = 0; i < G_N_ELEMENTS (translations); i++)
+ {
+ if (g_str_equal (setting, translations[i].setting))
+ return &translations[i];
+ }
+
+ return NULL;
+}
+
+static void
+settings_changed (GSettings *settings,
+ const gchar *key,
+ GdkScreen *screen)
+{
+ TranslationEntry *entry;
+
+ entry = find_translation_entry_by_key (settings, key);
+
+ if (entry != NULL)
+ {
+ GdkEvent event;
+ event.type = GDK_SETTING;
+ event.setting.window = gdk_screen_get_root_window (screen);
+ event.setting.send_event = FALSE;
+ event.setting.action = GDK_SETTING_ACTION_CHANGED;
+ event.setting.name = (gchar *)entry->setting;
+ gdk_event_put (&event);
+ }
+}
+
+static void
+init_settings (GdkScreen *screen)
+{
+ GdkWaylandScreen *screen_wayland = GDK_WAYLAND_SCREEN (screen);
+ GSettingsSchemaSource *source;
+ GSettingsSchema *schema;
+ GSettings *settings;
+ gint i;
+
+ screen_wayland->settings = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_object_unref);
+
+ source = g_settings_schema_source_get_default ();
+
+ for (i = 0; i < G_N_ELEMENTS (translations); i++)
+ {
+ if (g_hash_table_lookup (screen_wayland->settings, (gpointer)translations[i].schema) != NULL)
+ continue;
+
+ schema = g_settings_schema_source_lookup (source, translations[i].schema, FALSE);
+ if (schema != NULL)
+ {
+ settings = g_settings_new_full (schema, NULL, NULL);
+ g_signal_connect (settings, "changed",
+ G_CALLBACK (settings_changed), screen);
+ g_hash_table_insert (screen_wayland->settings, (gpointer)translations[i].schema, settings);
+ g_settings_schema_unref (schema);
+ }
+ }
+}
+
+static void
+set_value_from_entry (GdkScreen *screen,
+ TranslationEntry *entry,
+ GValue *value)
+{
+ GdkWaylandScreen *screen_wayland = GDK_WAYLAND_SCREEN (screen);
+ GSettings *settings;
+
+ settings = (GSettings *)g_hash_table_lookup (screen_wayland->settings, entry->schema);
+ if (settings != NULL)
+ {
+ gchar *s;
+ switch (entry->type)
+ {
+ case G_TYPE_STRING:
+ s = g_settings_get_string (settings, entry->key);
+ g_value_set_string (value, s);
+ g_free (s);
+ break;
+ case G_TYPE_INT:
+ g_value_set_int (value, g_settings_get_int (settings, entry->key));
+ break;
+ case G_TYPE_BOOLEAN:
+ g_value_set_boolean (value, g_settings_get_boolean (settings, entry->key));
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+ }
+ else
+ {
+ switch (entry->type)
+ {
+ case G_TYPE_STRING:
+ g_value_set_static_string (value, entry->default_string);
+ break;
+ case G_TYPE_INT:
+ g_value_set_int (value, entry->default_int);
+ break;
+ case G_TYPE_BOOLEAN:
+ g_value_set_boolean (value, entry->default_int);
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+ }
+}
+
static gboolean
gdk_wayland_screen_get_setting (GdkScreen *screen,
const gchar *name,
GValue *value)
{
+ TranslationEntry *entry;
+
g_return_val_if_fail (GDK_IS_SCREEN (screen), FALSE);
- if (strcmp ("gtk-theme-name", name) == 0)
+ entry = find_translation_entry_by_setting (name);
+ if (entry != NULL)
{
- const gchar *s = "Adwaita";
- GDK_NOTE(MISC, g_print("gdk_screen_get_setting(\"%s\") : %s\n", name, s));
- g_value_set_static_string (value, s);
+ set_value_from_entry (screen, entry, value);
return TRUE;
- }
- if (strcmp ("gtk-cursor-theme-name", name) == 0)
- {
- const gchar *s = "Adwaita";
- GDK_NOTE(MISC, g_print("gdk_screen_get_setting(\"%s\") : %s\n", name, s));
- g_value_set_static_string (value, s);
- return TRUE;
- }
- else if (strcmp ("gtk-icon-theme-name", name) == 0)
- {
- const gchar *s = "gnome";
- GDK_NOTE(MISC, g_print("gdk_screen_get_setting(\"%s\") : %s\n", name, s));
- g_value_set_static_string (value, s);
- return TRUE;
- }
- else if (strcmp ("gtk-double-click-time", name) == 0)
+ }
+
+ if (strcmp ("gtk-double-click-time", name) == 0)
{
gint i = 250;
GDK_NOTE(MISC, g_print("gdk_screen_get_setting(\"%s\") : %d\n", name, i));
@@ -332,13 +493,13 @@ gdk_wayland_screen_get_setting (GdkScreen *screen,
else if (strcmp ("gtk-alternative-button-order", name) == 0)
{
GDK_NOTE(MISC, g_print("gdk_screen_get_setting(\"%s\") : TRUE\n", name));
- g_value_set_boolean (value, TRUE);
+ g_value_set_boolean (value, FALSE);
return TRUE;
}
else if (strcmp ("gtk-alternative-sort-arrows", name) == 0)
{
GDK_NOTE(MISC, g_print("gdk_screen_get_setting(\"%s\") : TRUE\n", name));
- g_value_set_boolean (value, TRUE);
+ g_value_set_boolean (value, FALSE);
return TRUE;
}
else if (strcmp ("gtk-xft-dpi", name) == 0)
@@ -490,6 +651,7 @@ _gdk_wayland_screen_new (GdkDisplay *display)
screen_wayland->height);
init_multihead (screen);
+ init_settings (screen);
return screen;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]