diff options
author | Hans de Goede <hdegoede@redhat.com> | 2016-11-22 14:48:14 +0100 |
---|---|---|
committer | Hans de Goede <hdegoede@redhat.com> | 2016-12-05 11:21:48 +0100 |
commit | 3b624aa9a9df86dc7d48149e0f18ca223b4355f1 (patch) | |
tree | 6494c908c8cdf64ed0db251a76a5b65979458b3f /randr | |
parent | e1d30075c923f96a375895d74ea12a3c92a640c6 (diff) |
randr: rrCheckPixmapBounding: Do not substract crtc non 0 x,y from screen size
The purpose of rrCheckPixmapBounding is to make sure that the
screen_pixmap is large enough for the slave-output which crtc is
being configured.
This should include crtc->x and crtc->y, otherwise the crtc might
still end up scanning out an area outside of the screen-pixmap.
For example: Take a laptop with an external monitor on a slave-output at
1920x1080+0+0 and its internal-screen at 3840x2160+1920+0 and in
gnome-settings-daemon move the external monitor to be on the ri ght of
the internal screen rather then on the left. First g-s-d will do a
RRSetScreenSize to 5760*2160 (which is a nop), then it calls RRSetCrtc
to move the slave output to 1920x1080+3840+0, since this is a slave
output, rrCheckPixmapBounding gets called, since the 2 crtcs now overlap
the code before this commit would shrinks the screen_pixmap to 3180*2160.
Then g-s-d calls RRSetCrtc to move the internal screen to 3180*2160+0+0.
And we end up with the slave-output configured to scan-out an area
which completely falls outside of the screen-pixmap (and end up with
a black display on the external monitor).
This commit fixes this by not substracting the x1 and y1 coordinates
of the union-ed region when determining the new screen_pixmap size.
Cc: Nikhil Mahale <nmahale@nvidia.com>
Cc: Dave Airlie <airlied@redhat.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'randr')
-rw-r--r-- | randr/rrcrtc.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c index 5d404e84b..ac853eab6 100644 --- a/randr/rrcrtc.c +++ b/randr/rrcrtc.c @@ -686,8 +686,8 @@ rrCheckPixmapBounding(ScreenPtr pScreen, } newsize = RegionExtents(&total_region); - new_width = newsize->x2 - newsize->x1; - new_height = newsize->y2 - newsize->y1; + new_width = newsize->x2; + new_height = newsize->y2; if (new_width == screen_pixmap->drawable.width && new_height == screen_pixmap->drawable.height) { |