summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Nocera <hadess@hadess.net>2013-11-20 13:08:21 +0100
committerOwen W. Taylor <otaylor@fishsoup.net>2014-03-14 10:39:18 -0400
commite03adb23e395d4023a96ba79180913d99438a115 (patch)
treecdf9bfbd20cb21e3fb3f2067a26e2949a5ac49ea
parent74ab091cee4cc16502cfc14bc317fb8cf2818dcf (diff)
downloadgnome-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.ac2
-rw-r--r--plugins/xsettings/gsd-xsettings-manager.c53
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;
}