diff options
author | Bastien Nocera <hadess@hadess.net> | 2013-11-20 13:08:21 +0100 |
---|---|---|
committer | Owen W. Taylor <otaylor@fishsoup.net> | 2014-03-14 10:39:18 -0400 |
commit | e03adb23e395d4023a96ba79180913d99438a115 (patch) | |
tree | cdf9bfbd20cb21e3fb3f2067a26e2949a5ac49ea | |
parent | 74ab091cee4cc16502cfc14bc317fb8cf2818dcf (diff) | |
download | gnome-settings-daemon-e03adb23e395d4023a96ba79180913d99438a115.tar.gz |
xsettings: Check native resolution for scaling factor
Check whether the panel is running at its native resolution before
applying the scaling factor. We don't want hi-dpi screens running
below native resolution to have a high scaling factor.
https://bugzilla.gnome.org/show_bug.cgi?id=709859
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | plugins/xsettings/gsd-xsettings-manager.c | 53 |
2 files changed, 54 insertions, 1 deletions
diff --git a/configure.ac b/configure.ac index 9f3b7ed8..05cc224a 100644 --- a/configure.ac +++ b/configure.ac @@ -173,7 +173,7 @@ dnl --------------------------------------------------------------------------- dnl - xsettings dnl --------------------------------------------------------------------------- -PKG_CHECK_MODULES(XSETTINGS, fontconfig) +PKG_CHECK_MODULES(XSETTINGS, fontconfig gnome-desktop-3.0 >= $GNOME_DESKTOP_REQUIRED_VERSION) dnl --------------------------------------------------------------------------- dnl - Keyboard plugin stuff diff --git a/plugins/xsettings/gsd-xsettings-manager.c b/plugins/xsettings/gsd-xsettings-manager.c index 180032d4..0f29a30e 100644 --- a/plugins/xsettings/gsd-xsettings-manager.c +++ b/plugins/xsettings/gsd-xsettings-manager.c @@ -38,6 +38,12 @@ #include <gdk/gdkx.h> #include <gtk/gtk.h> +#define GNOME_DESKTOP_USE_UNSTABLE_API + +#include <libgnome-desktop/gnome-rr-config.h> +#include <libgnome-desktop/gnome-rr.h> +#include <libgnome-desktop/gnome-pnp-ids.h> + #include "gnome-settings-profile.h" #include "gsd-enums.h" #include "gsd-xsettings-manager.h" @@ -424,6 +430,48 @@ get_dpi_from_gsettings (GnomeXSettingsManager *manager) return dpi * factor; } +static gboolean +primary_monitor_at_native_resolution (void) +{ + GnomeRRScreen *screen; + GnomeRROutput *primary = NULL; + GnomeRROutput **outputs; + int current_width, current_height; + int pref_width, pref_height; + gboolean native = TRUE; + GnomeRRMode *mode; + guint i; + + screen = gnome_rr_screen_new (gdk_screen_get_default (), NULL); + if (screen == NULL) + goto out; + + outputs = gnome_rr_screen_list_outputs (screen); + if (outputs == NULL || outputs[0] == NULL) + goto out; + for (i = 0; outputs[i] != NULL; i++) { + if (gnome_rr_output_get_is_primary (outputs[i])) { + primary = outputs[i]; + break; + } + } + if (primary == NULL) + primary = outputs[0]; + + mode = gnome_rr_output_get_current_mode (primary); + current_width = gnome_rr_mode_get_width (mode); + current_height = gnome_rr_mode_get_height (mode); + mode = gnome_rr_output_get_preferred_mode (primary); + pref_width = gnome_rr_mode_get_width (mode); + pref_height = gnome_rr_mode_get_height (mode); + if (current_width != pref_width || current_height != pref_height) + native = FALSE; + +out: + g_clear_object (&screen); + return native; +} + static int get_window_scale (GnomeXSettingsManager *manager) { @@ -442,6 +490,10 @@ get_window_scale (GnomeXSettingsManager *manager) if (window_scale == 0) { int primary; + window_scale = 1; + if (!primary_monitor_at_native_resolution ()) + goto out; + display = gdk_display_get_default (); screen = gdk_display_get_default_screen (display); primary = gdk_screen_get_primary_monitor (screen); @@ -462,6 +514,7 @@ get_window_scale (GnomeXSettingsManager *manager) } } +out: return window_scale; } |