[gnome-settings-daemon/gnome-3-10] xsettings: Don't mix GnomeRR and GDK information
- From: Owen Taylor <otaylor src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-settings-daemon/gnome-3-10] xsettings: Don't mix GnomeRR and GDK information
- Date: Fri, 14 Mar 2014 14:43:12 +0000 (UTC)
commit 4c215a3abd90240e231961a4c44dbf2969859a3c
Author: Owen W. Taylor <otaylor fishsoup net>
Date: Thu Mar 13 15:30:30 2014 -0400
xsettings: Don't mix GnomeRR and GDK information
If we don't mix information from GnomeRR and GDK, then the "changed"
signal on GnomeRRScreen is all we need to properly know when the
resolution of the system is changed - mixing them presents problems
because GDK may not yet have updated it's information from X when the
"changed" is triggered by a D-Bus signal.
We still use GDK information before we have a GnomeRRScreen to minimize
the chance of switching the window scale during startup.
https://bugzilla.gnome.org/show_bug.cgi?id=709859
plugins/xsettings/gsd-xsettings-manager.c | 79 +++++++++++++++++++++++------
1 files changed, 63 insertions(+), 16 deletions(-)
---
diff --git a/plugins/xsettings/gsd-xsettings-manager.c b/plugins/xsettings/gsd-xsettings-manager.c
index 6d04b52..366a55b 100644
--- a/plugins/xsettings/gsd-xsettings-manager.c
+++ b/plugins/xsettings/gsd-xsettings-manager.c
@@ -511,44 +511,91 @@ primary_monitor_should_skip_resolution_check (GnomeRROutput *primary)
return FALSE;
}
+static void
+get_dimensions_xrandr (GnomeRROutput *primary,
+ int *width,
+ int *height,
+ int *width_mm,
+ int *height_mm)
+{
+ GnomeRRMode *mode;
+
+ mode = gnome_rr_output_get_current_mode (primary);
+ *width = gnome_rr_mode_get_width (mode);
+ *height = gnome_rr_mode_get_height (mode);
+
+ gnome_rr_output_get_physical_size (primary,
+ width_mm,
+ height_mm);
+}
+
+static void
+get_dimensions_gdk (int *width,
+ int *height,
+ int *width_mm,
+ int *height_mm)
+{
+ GdkDisplay *display;
+ GdkScreen *screen;
+ GdkRectangle rect;
+ int primary;
+ int monitor_scale;
+
+ display = gdk_display_get_default ();
+ screen = gdk_display_get_default_screen (display);
+ primary = gdk_screen_get_primary_monitor (screen);
+ gdk_screen_get_monitor_geometry (screen, primary, &rect);
+ monitor_scale = gdk_screen_get_monitor_scale_factor (screen, primary);
+
+ *width = rect.width * monitor_scale;
+ *height = rect.height * monitor_scale;
+
+ *width_mm = gdk_screen_get_monitor_width_mm (screen, primary);
+ *height_mm = gdk_screen_get_monitor_height_mm (screen, primary);
+}
+
static int
get_window_scale (GnomeXSettingsManager *manager)
{
GSettings *interface_settings;
int window_scale;
- GdkRectangle rect;
- GdkDisplay *display;
- GdkScreen *screen;
+ int width, height;
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) {
- int primary;
GnomeRROutput *output = NULL;
window_scale = 1;
if (manager->priv->rr_screen)
output = get_primary_output (manager->priv->rr_screen);
- if (output && primary_monitor_should_skip_resolution_check (output))
- goto out;
- display = gdk_display_get_default ();
- screen = gdk_display_get_default_screen (display);
- primary = gdk_screen_get_primary_monitor (screen);
- gdk_screen_get_monitor_geometry (screen, primary, &rect);
- width_mm = gdk_screen_get_monitor_width_mm (screen, primary);
- height_mm = gdk_screen_get_monitor_height_mm (screen, primary);
- monitor_scale = gdk_screen_get_monitor_scale_factor (screen, primary);
+ if (output) {
+ if (primary_monitor_should_skip_resolution_check (output))
+ goto out;
+
+ get_dimensions_xrandr (output,
+ &width, &height,
+ &width_mm, &height_mm);
+ } else {
+ /* Before the D-Bus DisplayConfig service exported by
+ * Mutter becomes available, use the current information
+ * that GDK has from the X server; in simple cases, this
+ * will hopefully keep us from switching the window_scale
+ * during startup.
+ */
+ get_dimensions_gdk (&width, &height,
+ &width_mm, &height_mm);
+ }
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);
+ dpi_x = (double)width / (width_mm / 25.4);
+ dpi_y = (double)height / (height_mm / 25.4);
/* We don't completely trust these values so both
must be high, and never pick higher ratio than
2 automatically */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]