[gnome-settings-daemon] xsettings: Add support for window-scaling
- From: Alexander Larsson <alexl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-settings-daemon] xsettings: Add support for window-scaling
- Date: Thu, 8 Aug 2013 11:19:17 +0000 (UTC)
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]