diff --git a/gdk/wayland/gdkscreen-wayland.c b/gdk/wayland/gdkscreen-wayland.c index 021dc0318f..8f4781117e 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; }