forked from AuroraMiddleware/gtk
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.
This commit is contained in:
parent
76dabc8551
commit
d2c8b65fd9
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user