From 13557b39d0b27d4ec5cdb208aa06be8d0444401c Mon Sep 17 00:00:00 2001 From: Giovanni Campagna Date: Fri, 16 Aug 2013 17:39:07 +0200 Subject: [PATCH] MonitorXrandr: resize the framebuffer prior to setting the CRTC configuration Otherwise X11 will trim the new configuration and disable outputs outside the screen. https://bugzilla.gnome.org/show_bug.cgi?id=705670 --- src/core/monitor-xrandr.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/core/monitor-xrandr.c b/src/core/monitor-xrandr.c index 9040449a3..2a04993e4 100644 --- a/src/core/monitor-xrandr.c +++ b/src/core/monitor-xrandr.c @@ -44,6 +44,11 @@ #define ALL_WL_TRANSFORMS ((1 << (WL_OUTPUT_TRANSFORM_FLIPPED_270 + 1)) - 1) +/* Look for DPI_FALLBACK in: + * http://git.gnome.org/browse/gnome-settings-daemon/tree/plugins/xsettings/gsd-xsettings-manager.c + * for the reasoning */ +#define DPI_FALLBACK 96.0 + struct _MetaMonitorManagerXrandr { MetaMonitorManager parent_instance; @@ -651,9 +656,42 @@ meta_monitor_manager_xrandr_apply_configuration (MetaMonitorManager *manager, { MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (manager); unsigned i; + int width, height, width_mm, height_mm; meta_display_grab (meta_get_display ()); + width = 0; height = 0; + for (i = 0; i < n_crtcs; i++) + { + MetaCRTCInfo *crtc_info = crtcs[i]; + + if (crtc_info->mode == NULL) + continue; + + if (meta_monitor_transform_is_rotated (crtc_info->transform)) + { + width = MAX (width, crtc_info->x + crtc_info->mode->height); + height = MAX (height, crtc_info->y + crtc_info->mode->width); + } + else + { + width = MAX (width, crtc_info->x + crtc_info->mode->width); + height = MAX (height, crtc_info->y + crtc_info->mode->height); + } + } + + g_assert (width > 0 && height > 0); + /* The 'physical size' of an X screen is meaningless if that screen + * can consist of many monitors. So just pick a size that make the + * dpi 96. + * + * Firefox and Evince apparently believe what X tells them. + */ + width_mm = (width / DPI_FALLBACK) * 25.4 + 0.5; + height_mm = (height / DPI_FALLBACK) * 25.4 + 0.5; + XRRSetScreenSize (manager_xrandr->xdisplay, DefaultRootWindow (manager_xrandr->xdisplay), + width, height, width_mm, height_mm); + for (i = 0; i < n_crtcs; i++) { MetaCRTCInfo *crtc_info = crtcs[i];