[gtk+] wayland: Pick up more settings
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] wayland: Pick up more settings
- Date: Sat, 23 Mar 2013 17:01:47 +0000 (UTC)
commit d2c8b65fd95f0dec83c5cefb1f80fae1591b1b33
Author: Matthias Clasen <mclasen redhat com>
Date: Sat Mar 23 12:56:54 2013 -0400
wayland: Pick up more settings
With this commit, we pick up xft settings from GSettings
as well. Among other things, this makes the Large Text
setting work. Still to do: pick up fontconfig changes without
having all clients use up inotify watches for all font
directories.
gdk/wayland/gdkscreen-wayland.c | 353 +++++++++++++++++++++++++++------------
1 files changed, 249 insertions(+), 104 deletions(-)
---
diff --git a/gdk/wayland/gdkscreen-wayland.c b/gdk/wayland/gdkscreen-wayland.c
index 021dc03..8f47811 100644
--- a/gdk/wayland/gdkscreen-wayland.c
+++ b/gdk/wayland/gdkscreen-wayland.c
@@ -39,6 +39,14 @@ typedef struct _GdkWaylandScreenClass GdkWaylandScreenClass;
#define GDK_IS_WAYLAND_SCREEN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_WAYLAND_SCREEN))
#define GDK_WAYLAND_SCREEN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_WAYLAND_SCREEN,
GdkWaylandScreenClass))
+typedef struct {
+ gboolean antialias;
+ gboolean hinting;
+ gint dpi;
+ const gchar *rgba;
+ const gchar *hintstyle;
+} GsdXftSettings;
+
typedef struct _GdkWaylandMonitor GdkWaylandMonitor;
struct _GdkWaylandScreen
@@ -59,6 +67,7 @@ struct _GdkWaylandScreen
gint primary_monitor;
GHashTable *settings;
+ GsdXftSettings xft_settings;
};
struct _GdkWaylandScreenClass
@@ -279,37 +288,216 @@ gdk_wayland_screen_broadcast_client_message (GdkScreen *screen,
{
}
+static void
+notify_setting (GdkScreen *screen,
+ const gchar *setting)
+{
+ 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 *)setting;
+ gdk_event_put (&event);
+}
+
+typedef enum
+{
+ GSD_FONT_ANTIALIASING_MODE_NONE,
+ GSD_FONT_ANTIALIASING_MODE_GRAYSCALE,
+ GSD_FONT_ANTIALIASING_MODE_RGBA
+} GsdFontAntialiasingMode;
+
+typedef enum
+{
+ GSD_FONT_HINTING_NONE,
+ GSD_FONT_HINTING_SLIGHT,
+ GSD_FONT_HINTING_MEDIUM,
+ GSD_FONT_HINTING_FULL
+} GsdFontHinting;
+
+typedef enum
+{
+ GSD_FONT_RGBA_ORDER_RGBA,
+ GSD_FONT_RGBA_ORDER_RGB,
+ GSD_FONT_RGBA_ORDER_BGR,
+ GSD_FONT_RGBA_ORDER_VRGB,
+ GSD_FONT_RGBA_ORDER_VBGR
+} GsdFontRgbaOrder;
+
+static gdouble
+get_dpi_from_gsettings (GdkWaylandScreen *screen_wayland)
+{
+ GSettings *interface_settings;
+ gdouble factor;
+
+ interface_settings = g_hash_table_lookup (screen_wayland->settings,
+ "org.gnome.desktop.interface");
+ if (interface_settings != NULL)
+ factor = g_settings_get_double (interface_settings, "text-scaling-factor");
+ else
+ factor = 1.0;
+
+ return 96.0 * factor;
+}
+
+static void
+update_xft_settings (GdkScreen *screen)
+{
+ GdkWaylandScreen *screen_wayland = GDK_WAYLAND_SCREEN (screen);
+ GSettings *settings;
+ GsdFontAntialiasingMode antialiasing;
+ GsdFontHinting hinting;
+ GsdFontRgbaOrder order;
+ gboolean use_rgba = FALSE;
+ GsdXftSettings xft_settings;
+
+ settings = g_hash_table_lookup (screen_wayland->settings, "org.gnome.settings-daemon.plugins.xsettings");
+
+ if (settings)
+ {
+ antialiasing = g_settings_get_enum (settings, "antialiasing");
+ hinting = g_settings_get_enum (settings, "hinting");
+ order = g_settings_get_enum (settings, "rgba-order");
+ }
+ else
+ {
+ antialiasing = GSD_FONT_ANTIALIASING_MODE_GRAYSCALE;
+ hinting = GSD_FONT_HINTING_MEDIUM;
+ order = GSD_FONT_RGBA_ORDER_RGB;
+ }
+
+ xft_settings.antialias = (antialiasing != GSD_FONT_ANTIALIASING_MODE_NONE);
+ xft_settings.hinting = (hinting != GSD_FONT_HINTING_NONE);
+ xft_settings.dpi = get_dpi_from_gsettings (screen_wayland) * 1024; /* Xft wants 1/1024ths of an inch */
+ xft_settings.rgba = "rgb";
+ xft_settings.hintstyle = "hintfull";
+
+ switch (hinting)
+ {
+ case GSD_FONT_HINTING_NONE:
+ xft_settings.hintstyle = "hintnone";
+ break;
+ case GSD_FONT_HINTING_SLIGHT:
+ xft_settings.hintstyle = "hintslight";
+ break;
+ case GSD_FONT_HINTING_MEDIUM:
+ xft_settings.hintstyle = "hintmedium";
+ break;
+ case GSD_FONT_HINTING_FULL:
+ xft_settings.hintstyle = "hintfull";
+ break;
+ }
+
+ switch (order)
+ {
+ case GSD_FONT_RGBA_ORDER_RGBA:
+ xft_settings.rgba = "rgba";
+ break;
+ case GSD_FONT_RGBA_ORDER_RGB:
+ xft_settings.rgba = "rgb";
+ break;
+ case GSD_FONT_RGBA_ORDER_BGR:
+ xft_settings.rgba = "bgr";
+ break;
+ case GSD_FONT_RGBA_ORDER_VRGB:
+ xft_settings.rgba = "vrgb";
+ break;
+ case GSD_FONT_RGBA_ORDER_VBGR:
+ xft_settings.rgba = "vbgr";
+ break;
+ }
+
+ switch (antialiasing)
+ {
+ case GSD_FONT_ANTIALIASING_MODE_NONE:
+ xft_settings.antialias = FALSE;
+ break;
+ case GSD_FONT_ANTIALIASING_MODE_GRAYSCALE:
+ xft_settings.antialias = TRUE;
+ break;
+ case GSD_FONT_ANTIALIASING_MODE_RGBA:
+ xft_settings.antialias = TRUE;
+ use_rgba = TRUE;
+ }
+
+ if (!use_rgba)
+ xft_settings.rgba = "none";
+
+ if (screen_wayland->xft_settings.antialias != xft_settings.antialias)
+ {
+ screen_wayland->xft_settings.antialias = xft_settings.antialias;
+ notify_setting (screen, "gtk-xft-antialias");
+ }
+
+ if (screen_wayland->xft_settings.hinting != xft_settings.hinting)
+ {
+ screen_wayland->xft_settings.hinting = xft_settings.hinting;
+ notify_setting (screen, "gtk-xft-hinting");
+ }
+
+ if (screen_wayland->xft_settings.hintstyle != xft_settings.hintstyle)
+ {
+ screen_wayland->xft_settings.hintstyle = xft_settings.hintstyle;
+ notify_setting (screen, "gtk-xft-hintstyle");
+ }
+
+ if (screen_wayland->xft_settings.rgba != xft_settings.rgba)
+ {
+ screen_wayland->xft_settings.rgba = xft_settings.rgba;
+ notify_setting (screen, "gtk-xft-rgba");
+ }
+
+ if (screen_wayland->xft_settings.dpi != xft_settings.dpi)
+ {
+ screen_wayland->xft_settings.dpi = xft_settings.dpi;
+ notify_setting (screen, "gtk-xft-dpi");
+ }
+}
+
typedef struct _TranslationEntry TranslationEntry;
struct _TranslationEntry {
const gchar *schema;
const gchar *key;
const gchar *setting;
GType type;
- const gchar *default_string;
- gint default_int;
+ union {
+ const gchar *s;
+ gint i;
+ gboolean b;
+ } fallback;
};
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", "cursor-size", "gtk-cursor-theme-size", G_TYPE_INT, NULL, 32 },
- { "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 }
+ { "org.gnome.desktop.interface", "gtk-theme", "gtk-theme-name" , G_TYPE_STRING, { .s = "Adwaita" } },
+ { "org.gnome.desktop.interface", "icon-theme", "gtk-icon-theme-name", G_TYPE_STRING, { .s = "gnome" } },
+ { "org.gnome.desktop.interface", "cursor-theme", "gtk-cursor-theme-name", G_TYPE_STRING, { .s = "Adwaita"
} },
+ { "org.gnome.desktop.interface", "cursor-size", "gtk-cursor-theme-size", G_TYPE_INT, { .i = 32 } },
+ { "org.gnome.desktop.interface", "font-name", "gtk-font-name", G_TYPE_STRING, { .s = "Cantarell 11" } },
+ { "org.gnome.desktop.interface", "cursor-blink", "gtk-cursor-blink", G_TYPE_BOOLEAN, { .b = TRUE } },
+ { "org.gnome.desktop.interface", "cursor-blink-time", "gtk-cursor-blink-time", G_TYPE_INT, { .i = 1200 } },
+ { "org.gnome.desktop.interface", "cursor-blink-timeout", "gtk-cursor-blink-timeout", G_TYPE_INT, { .i =
3600 } },
+ { "org.gnome.desktop.interface", "menus-have-icons", "gtk-menu-images", G_TYPE_BOOLEAN, { .b = FALSE } },
+ { "org.gnome.desktop.interface", "buttons-have-icons", "gtk-button-images", G_TYPE_BOOLEAN, { .b = FALSE }
},
+ { "org.gnome.desktop.interface", "gtk-im-module", "gtk-im-module", G_TYPE_STRING, { .s = "simple" } },
+ { "org.gnome.desktop.interface", "enable-animations", "gtk-enable-animations", G_TYPE_BOOLEAN, { .b = TRUE
} },
+ { "org.gnome.desktop.interface", "show-input-method-menu", "gtk-show-input-method-menu", G_TYPE_BOOLEAN, {
.b = FALSE } },
+ { "org.gnome.desktop.interface", "show-unicode-menu", "gtk-show-unicode-menu", G_TYPE_BOOLEAN, { .b =
FALSE } },
+ { "org.gnome.desktop.interface", "automatic-mnemonics", "gtk-auto-mnemonics", G_TYPE_BOOLEAN, { .b = TRUE
} },
+ { "org.gnome.settings-daemon.peripherals.mouse", "double-click", "gtk-double-click-time", G_TYPE_INT, { .i
= 250 } },
+ { "org.gnome.settings-daemon.peripherals.mouse", "drag-threshold", "gtk-dnd-drag-threshold", G_TYPE_INT,
{.i = 8 } },
+ { "org.gnome.desktop.sound", "theme-name", "gtk-sound-theme-name", G_TYPE_STRING, { .s = "freedesktop" } },
+ { "org.gnome.desktop.sound", "event-sounds", "gtk-enable-event-sounds", G_TYPE_BOOLEAN, { .b = TRUE } },
+ { "org.gnome.desktop.sound", "input-feedback-sounds", "gtk-enable-input-feedback-sounds", G_TYPE_BOOLEAN,
{ . b = FALSE } },
+ { "org.gnome.desktop.privacy", "recent-files-max-age", "gtk-recent-files-max-age", G_TYPE_INT, { .i = 30 }
},
+ { "org.gnome.desktop.privacy", "remember-recent-files", "gtk-recent-files-enabled", G_TYPE_BOOLEAN, {
.b = TRUE } },
+ { "org.gnome.settings-daemon.plugins.xsettings", "antialiasing", "gtk-xft-antialias", G_TYPE_NONE, { .i =
0 } },
+ { "org.gnome.settings-daemon.plugins.xsettings", "hinting", "gtk-xft-hinting", G_TYPE_NONE, { .i = 0 } },
+ { "org.gnome.settings-daemon.plugins.xsettings", "hinting", "gtk-xft-hintstyle", G_TYPE_NONE, { .i = 0 } },
+ { "org.gnome.settings-daemon.plugins.xsettings", "rgba-order", "gtk-xft-rgba", G_TYPE_NONE, { .i = 0 } },
+ { "org.gnome.desktop.interface", "text-scaling-factor", "gtk-xft-dpi" , G_TYPE_NONE, { .i = 0 } },
+
};
static TranslationEntry *
@@ -360,13 +548,10 @@ settings_changed (GSettings *settings,
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);
+ if (entry->type != G_TYPE_NONE)
+ notify_setting (screen, entry->setting);
+ else
+ update_xft_settings (screen);
}
}
@@ -398,6 +583,8 @@ init_settings (GdkScreen *screen)
g_settings_schema_unref (schema);
}
}
+
+ update_xft_settings (screen);
}
static void
@@ -409,42 +596,47 @@ set_value_from_entry (GdkScreen *screen,
GSettings *settings;
settings = (GSettings *)g_hash_table_lookup (screen_wayland->settings, entry->schema);
- if (settings != NULL)
+ switch (entry->type)
{
- gchar *s;
- switch (entry->type)
+ case G_TYPE_STRING:
+ if (settings)
{
- case G_TYPE_STRING:
+ gchar *s;
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)
+ else
{
- 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 ();
+ g_value_set_static_string (value, entry->fallback.s);
}
+ break;
+ case G_TYPE_INT:
+ g_value_set_int (value, settings != NULL
+ ? g_settings_get_int (settings, entry->key)
+ : entry->fallback.i);
+ break;
+ case G_TYPE_BOOLEAN:
+ g_value_set_boolean (value, settings != NULL
+ ? g_settings_get_boolean (settings, entry->key)
+ : entry->fallback.b);
+ break;
+ case G_TYPE_NONE:
+ if (g_str_equal (entry->setting, "gtk-xft-antialias"))
+ g_value_set_int (value, screen_wayland->xft_settings.antialias);
+ else if (g_str_equal (entry->setting, "gtk-xft-hinting"))
+ g_value_set_int (value, screen_wayland->xft_settings.hinting);
+ else if (g_str_equal (entry->setting, "gtk-xft-hintstyle"))
+ g_value_set_static_string (value, screen_wayland->xft_settings.hintstyle);
+ else if (g_str_equal (entry->setting, "gtk-xft-rgba"))
+ g_value_set_static_string (value, screen_wayland->xft_settings.rgba);
+ else if (g_str_equal (entry->setting, "gtk-xft-dpi"))
+ g_value_set_int (value, screen_wayland->xft_settings.dpi);
+ else
+ g_assert_not_reached ();
+ break;
+ default:
+ g_assert_not_reached ();
}
}
@@ -464,53 +656,6 @@ gdk_wayland_screen_get_setting (GdkScreen *screen,
return TRUE;
}
- 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));
- g_value_set_int (value, i);
- return TRUE;
- }
- else if (strcmp ("gtk-double-click-distance", name) == 0)
- {
- gint i = 5;
- GDK_NOTE(MISC, g_print("gdk_screen_get_setting(\"%s\") : %d\n", name, i));
- g_value_set_int (value, i);
- return TRUE;
- }
- else if (strcmp ("gtk-dnd-drag-threshold", name) == 0)
- {
- gint i = 8;
- GDK_NOTE(MISC, g_print("gdk_screen_get_setting(\"%s\") : %d\n", name, i));
- g_value_set_int (value, i);
- return TRUE;
- }
- else if (strcmp ("gtk-split-cursor", name) == 0)
- {
- GDK_NOTE(MISC, g_print("gdk_screen_get_setting(\"%s\") : FALSE\n", name));
- g_value_set_boolean (value, FALSE);
- return TRUE;
- }
- 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, 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, FALSE);
- return TRUE;
- }
- else if (strcmp ("gtk-xft-dpi", name) == 0)
- {
- gint i = 96*1024;
- GDK_NOTE(MISC, g_print("gdk_screen_get_setting(\"%s\") : TRUE\n", name));
- g_value_set_int (value, i);
- return TRUE;
- }
-
return FALSE;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]