[gtk+] wayland: Pick up more settings



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]