[gnome-settings-daemon/gnome-3-10] xsettings: Check native resolution for scaling factor



commit e03adb23e395d4023a96ba79180913d99438a115
Author: Bastien Nocera <hadess hadess net>
Date:   Wed Nov 20 13:08:21 2013 +0100

    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

 configure.ac                              |    2 +-
 plugins/xsettings/gsd-xsettings-manager.c |   53 +++++++++++++++++++++++++++++
 2 files changed, 54 insertions(+), 1 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 9f3b7ed..05cc224 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 180032d..0f29a30 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;
 }
 


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