[gnome-settings-daemon] xsettings: Add support for window-scaling



commit 047f030235972fdab5e15aff484006caf914216a
Author: Alexander Larsson <alexl redhat com>
Date:   Mon Jul 1 14:14:23 2013 +0200

    xsettings: Add support for window-scaling
    
    We read the scale-factor gsettings and propagate to gdk, including doing
    auto-detection if the setting is 0.
    
    NOTE: The auto-detection code is currently disabled as enabling
    scaling breaks gnome-shell. When this is fixed we want to enable this.
    
    We also scale the old Xft.DPI setting by the window scale so that old
    applications get a decent size on very high dpi monitors, plus we report the
    unscaled dpi so that window scale aware apps (like gtk) can avoid this
    dpi scaling.
    
    We also scale the cursor theme size so that you will get matching sizes
    for cursors.

 plugins/xsettings/gsd-xsettings-manager.c |   74 +++++++++++++++++++++++++++--
 1 files changed, 69 insertions(+), 5 deletions(-)
---
diff --git a/plugins/xsettings/gsd-xsettings-manager.c b/plugins/xsettings/gsd-xsettings-manager.c
index 35fb245..1620566 100644
--- a/plugins/xsettings/gsd-xsettings-manager.c
+++ b/plugins/xsettings/gsd-xsettings-manager.c
@@ -59,6 +59,8 @@
 #define GTK_MODULES_ENABLED_KEY  "enabled-gtk-modules"
 
 #define TEXT_SCALING_FACTOR_KEY "text-scaling-factor"
+#define SCALING_FACTOR_KEY "scaling-factor"
+#define CURSOR_SIZE_KEY "cursor-size"
 
 #define FONT_ANTIALIASING_KEY "antialiasing"
 #define FONT_HINTING_KEY      "hinting"
@@ -218,6 +220,8 @@
  */
 #define DPI_FALLBACK 96
 
+#define HIDPI_LIMIT (DPI_FALLBACK * 2)
+
 typedef struct _TranslationEntry TranslationEntry;
 typedef void (* TranslationFunc) (GnomeXSettingsManager *manager,
                                   TranslationEntry      *trans,
@@ -371,7 +375,7 @@ static TranslationEntry translations [] = {
         { "org.gnome.desktop.interface", "menubar-accel",          "Gtk/MenuBarAccel",        
translate_string_string },
         { "org.gnome.desktop.interface", "enable-animations",      "Gtk/EnableAnimations",    
translate_bool_int },
         { "org.gnome.desktop.interface", "cursor-theme",           "Gtk/CursorThemeName",     
translate_string_string },
-        { "org.gnome.desktop.interface", "cursor-size",            "Gtk/CursorThemeSize",     
translate_int_int },
+        /* cursor-size is handled via the Xft side as it needs the scaling factor */
 
         { "org.gnome.desktop.sound", "theme-name",                 "Net/SoundThemeName",            
translate_string_string },
         { "org.gnome.desktop.sound", "event-sounds",               "Net/EnableEventSounds" ,        
translate_bool_int },
@@ -417,10 +421,56 @@ get_dpi_from_gsettings (GnomeXSettingsManager *manager)
         return dpi * factor;
 }
 
+static int
+get_window_scale (GnomeXSettingsManager *manager)
+{
+       GSettings  *interface_settings;
+        int window_scale;
+        GdkRectangle rect;
+        GdkDisplay *display;
+        GdkScreen *screen;
+        int width_mm, height_mm;
+        int monitor_scale;
+        double dpi_x, dpi_y;
+
+       interface_settings = g_hash_table_lookup (manager->priv->settings, INTERFACE_SETTINGS_SCHEMA);
+        window_scale =
+                g_settings_get_uint (interface_settings, SCALING_FACTOR_KEY);
+        if (window_scale == 0) {
+                display = gdk_display_get_default ();
+                screen = gdk_display_get_default_screen (display);
+                gdk_screen_get_monitor_geometry (screen, 0, &rect);
+                width_mm = gdk_screen_get_monitor_width_mm (screen, 0);
+                height_mm = gdk_screen_get_monitor_height_mm (screen, 0);
+                monitor_scale = gdk_screen_get_monitor_scale_factor (screen, 0);
+
+                window_scale = 1;
+                if (width_mm > 0 && height_mm > 0) {
+                        dpi_x = (double)rect.width * monitor_scale / (width_mm / 25.4);
+                        dpi_y = (double)rect.height * monitor_scale / (height_mm / 25.4);
+                        /* We don't completely trust these values so both
+                           must be high, and never pick higher ratio than
+                           2 automatically */
+                        if (dpi_x > HIDPI_LIMIT && dpi_y > HIDPI_LIMIT)
+                                window_scale = 2;
+                }
+
+                /* TODO: For now we don't support automatic scale picking, because it
+                   any scale but 1 breaks gnome-shell. Remove this when gnome-shell
+                   is fixed. */
+                window_scale = 1;
+        }
+
+        return window_scale;
+}
+
 typedef struct {
         gboolean    antialias;
         gboolean    hinting;
+        int         scaled_dpi;
         int         dpi;
+        int         window_scale;
+        int         cursor_size;
         const char *rgba;
         const char *hintstyle;
 } GnomeXftSettings;
@@ -430,10 +480,15 @@ static void
 xft_settings_get (GnomeXSettingsManager *manager,
                   GnomeXftSettings      *settings)
 {
+       GSettings  *interface_settings;
         GsdFontAntialiasingMode antialiasing;
         GsdFontHinting hinting;
         GsdFontRgbaOrder order;
         gboolean use_rgba = FALSE;
+        double dpi;
+        int cursor_size;
+
+       interface_settings = g_hash_table_lookup (manager->priv->settings, INTERFACE_SETTINGS_SCHEMA);
 
         antialiasing = g_settings_get_enum (manager->priv->plugin_settings, FONT_ANTIALIASING_KEY);
         hinting = g_settings_get_enum (manager->priv->plugin_settings, FONT_HINTING_KEY);
@@ -441,7 +496,12 @@ xft_settings_get (GnomeXSettingsManager *manager,
 
         settings->antialias = (antialiasing != GSD_FONT_ANTIALIASING_MODE_NONE);
         settings->hinting = (hinting != GSD_FONT_HINTING_NONE);
-        settings->dpi = get_dpi_from_gsettings (manager) * 1024; /* Xft wants 1/1024ths of an inch */
+        settings->window_scale = get_window_scale (manager);
+        dpi = get_dpi_from_gsettings (manager);
+        settings->dpi = dpi * 1024; /* Xft wants 1/1024ths of an inch */
+        settings->scaled_dpi = dpi * settings->window_scale * 1024;
+        cursor_size = g_settings_get_int (interface_settings, CURSOR_SIZE_KEY);
+        settings->cursor_size = cursor_size * settings->window_scale;
         settings->rgba = "rgb";
         settings->hintstyle = "hintfull";
 
@@ -507,8 +567,11 @@ xft_settings_set_xsettings (GnomeXSettingsManager *manager,
                 xsettings_manager_set_int (manager->priv->managers [i], "Xft/Antialias", 
settings->antialias);
                 xsettings_manager_set_int (manager->priv->managers [i], "Xft/Hinting", settings->hinting);
                 xsettings_manager_set_string (manager->priv->managers [i], "Xft/HintStyle", 
settings->hintstyle);
-                xsettings_manager_set_int (manager->priv->managers [i], "Xft/DPI", settings->dpi);
+                xsettings_manager_set_int (manager->priv->managers [i], "Gdk/WindowScalingFactor", 
settings->window_scale);
+                xsettings_manager_set_int (manager->priv->managers [i], "Gdk/UnscaledDPI", settings->dpi);
+                xsettings_manager_set_int (manager->priv->managers [i], "Xft/DPI", settings->scaled_dpi);
                 xsettings_manager_set_string (manager->priv->managers [i], "Xft/RGBA", settings->rgba);
+                xsettings_manager_set_int (manager->priv->managers [i], "Gtk/CursorThemeSize", 
settings->cursor_size);
         }
         gnome_settings_profile_end (NULL);
 }
@@ -561,7 +624,7 @@ xft_settings_set_xresources (GnomeXftSettings *settings)
         g_debug("xft_settings_set_xresources: orig res '%s'", add_string->str);
 
         update_property (add_string, "Xft.dpi",
-                                g_ascii_dtostr (dpibuf, sizeof (dpibuf), (double) settings->dpi / 1024.0));
+                                g_ascii_dtostr (dpibuf, sizeof (dpibuf), (double) settings->scaled_dpi / 
1024.0));
         update_property (add_string, "Xft.antialias",
                                 settings->antialias ? "1" : "0");
         update_property (add_string, "Xft.hinting",
@@ -789,7 +852,8 @@ xsettings_callback (GSettings             *settings,
         guint             i;
         GVariant         *value;
 
-        if (g_str_equal (key, TEXT_SCALING_FACTOR_KEY)) {
+        if (g_str_equal (key, TEXT_SCALING_FACTOR_KEY) ||
+            g_str_equal (key, SCALING_FACTOR_KEY)) {
                xft_callback (NULL, key, manager);
                return;
        }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]