[Xfce4-commits] <xfce4-settings:master> Only disable CRTCs that won't fit in the new screen
Nick Schermer
noreply at xfce.org
Sun Oct 28 10:45:26 CET 2012
Updating branch refs/heads/master
to e746c3379c7955772f58445beb2796f9095f5063 (commit)
from b453760a7b8b174a71a6a30343d3c33e88a6e53c (commit)
commit e746c3379c7955772f58445beb2796f9095f5063
Author: Lionel Le Folgoc <lionel at lefolgoc.net>
Date: Wed Oct 24 15:14:58 2012 +0200
Only disable CRTCs that won't fit in the new screen
Signed-off-by: Simon Steinbeiss <simon.steinbeiss at elfenbeinturm.at>
xfsettingsd/displays.c | 57 +++++++++++++++++++++++++++++------------------
1 files changed, 35 insertions(+), 22 deletions(-)
diff --git a/xfsettingsd/displays.c b/xfsettingsd/displays.c
index 3d5e0f0..af6e6cd 100644
--- a/xfsettingsd/displays.c
+++ b/xfsettingsd/displays.c
@@ -450,6 +450,7 @@ xfce_displays_helper_channel_apply (XfceDisplaysHelper *helper,
Display *xdisplay;
GdkWindow *root_window;
XRRScreenResources *resources;
+ XRRCrtcInfo *crtc_info;
XfceRRCrtc *crtcs, *crtc;
gchar property[512];
gint min_width, min_height, max_width, max_height;
@@ -736,35 +737,47 @@ xfce_displays_helper_channel_apply (XfceDisplaysHelper *helper,
/* grab server to prevent clients from thinking no output is enabled */
gdk_x11_display_grab (display);
- /* second loop, normalization and global settings */
+ /* second loop, normalization and screen size calculation */
for (m = 0; m < resources->ncrtc; ++m)
{
/* ignore disabled outputs for size computations */
- if (crtcs[m].mode != None)
- {
- /* normalize positions to ensure the upper left corner is at (0,0) */
- if (min_x || min_y)
- {
- crtcs[m].x -= min_x;
- crtcs[m].y -= min_y;
- crtcs[m].changed = TRUE;
- }
-
- xfsettings_dbg (XFSD_DEBUG_DISPLAYS, "Normalized CRTC %lu: size=%dx%d, pos=%dx%d.",
- crtcs[m].id, crtcs[m].width, crtcs[m].height, crtcs[m].x, crtcs[m].y);
+ if (crtcs[m].mode == None)
+ continue;
- /* calculate the total screen size */
- xfce_displays_helper_process_screen_size (crtcs[m].width, crtcs[m].height,
- crtcs[m].x, crtcs[m].y, &width,
- &height, &mm_width, &mm_height);
+ /* normalize positions to ensure the upper left corner is at (0,0) */
+ if (min_x || min_y)
+ {
+ crtcs[m].x -= min_x;
+ crtcs[m].y -= min_y;
+ crtcs[m].changed = TRUE;
}
- /* disable the CRTC, it will be reenabled after size calculation, unless the user disabled it */
- if (xfce_displays_helper_disable_crtc (xdisplay, resources, crtcs[m].id) == RRSetConfigSuccess)
- crtcs[m].changed = (crtcs[m].mode != None);
- else
- g_warning ("Failed to disable CRTC %lu.", crtc->id);
+ xfsettings_dbg (XFSD_DEBUG_DISPLAYS, "Normalized CRTC %lu: size=%dx%d, pos=%dx%d.",
+ crtcs[m].id, crtcs[m].width, crtcs[m].height, crtcs[m].x, crtcs[m].y);
+ /* calculate the total screen size */
+ xfce_displays_helper_process_screen_size (crtcs[m].width, crtcs[m].height,
+ crtcs[m].x, crtcs[m].y, &width,
+ &height, &mm_width, &mm_height);
+ }
+
+ /* disable CRTCs that won't fit in the new screen */
+ for (m = 0; m < resources->ncrtc; ++m)
+ {
+ /* The CRTC needs to be disabled if its previous mode won't fit in the new screen.
+ It will be reenabled with its new mode (known to fit) after the screen size is
+ changed, unless the user disabled it (no need to reenable it then). */
+ crtc_info = XRRGetCrtcInfo (xdisplay, resources, crtcs[m].id);
+ if ((crtc_info->x + crtc_info->width > (guint) width) ||
+ (crtc_info->y + crtc_info->height > (guint) height))
+ {
+ xfsettings_dbg (XFSD_DEBUG_DISPLAYS, "CRTC %lu must be temporarily disabled.", crtcs[m].id);
+ if (xfce_displays_helper_disable_crtc (xdisplay, resources, crtcs[m].id) == RRSetConfigSuccess)
+ crtcs[m].changed = (crtcs[m].mode != None);
+ else
+ g_warning ("Failed to temporarily disable CRTC %lu.", crtc->id);
+ }
+ XRRFreeCrtcInfo (crtc_info);
}
/* set the screen size only if it's really needed and valid */
More information about the Xfce4-commits
mailing list