xserver: Branch 'master' - 2 commits

Adam Jackson ajax at kemper.freedesktop.org
Wed Feb 8 18:32:55 UTC 2017


 hw/xwayland/xwayland-output.c |   37 ++++++++++++++++++++++++-------------
 1 file changed, 24 insertions(+), 13 deletions(-)

New commits:
commit 058809c43ec578a407cf40d4c3e54a42503e3562
Author: Olivier Fourdan <ofourdan at redhat.com>
Date:   Wed Feb 8 09:23:20 2017 +0100

    xwayland: Apply output rotation for screen size
    
    Previously, we would swap the width/height of the Xwayland output based
    on the output rotation, so that the overall screen size would match the
    actual rotation of each output.
    
    Problem is the RandR's ConstrainCursorHarder() handler will also apply
    the output rotation, meaning that when the output is rotated, the
    pointer will be constrained within the wrong dimension.
    
    Moreover, XRandR assumes the original output width/height are unchanged
    when the output is rotated, so by changing the Xwayland output width and
    height based on rotation, Xwayland causes XRandr to report the wrong
    output sizes (an output of size 1024x768 rotated left or right should
    remain 1024x768, not 768x1024).
    
    So to avoid this issue and keep things consistent between Wayland and
    Xwayland outputs, leave the actual width/height unchanged but apply the
    rotation when computing the screen size. This fixes both the output size
    being wrong in "xrandr -q" and the pointer being constrained in the
    wrong dimension with rotated with weston.
    
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=99663
    Signed-off-by: Olivier Fourdan <ofourdan at redhat.com>
    Reviewed-by: Adam Jackson <ajax at redhat.com>

diff --git a/hw/xwayland/xwayland-output.c b/hw/xwayland/xwayland-output.c
index fb46448..d9047c5 100644
--- a/hw/xwayland/xwayland-output.c
+++ b/hw/xwayland/xwayland-output.c
@@ -108,14 +108,8 @@ output_handle_mode(void *data, struct wl_output *wl_output, uint32_t flags,
     if (!(flags & WL_OUTPUT_MODE_CURRENT))
         return;
 
-    if (xwl_output->rotation & (RR_Rotate_0 | RR_Rotate_180)) {
-        xwl_output->width = width;
-        xwl_output->height = height;
-    } else {
-        xwl_output->width = height;
-        xwl_output->height = width;
-    }
-
+    xwl_output->width = width;
+    xwl_output->height = height;
     xwl_output->refresh = refresh;
 }
 
@@ -123,11 +117,21 @@ static inline void
 output_get_new_size(struct xwl_output *xwl_output,
                     int *height, int *width)
 {
-    if (*width < xwl_output->x + xwl_output->width)
-        *width = xwl_output->x + xwl_output->width;
+    int output_width, output_height;
+
+    if (xwl_output->rotation & (RR_Rotate_0 | RR_Rotate_180)) {
+        output_width = xwl_output->width;
+        output_height = xwl_output->height;
+    } else {
+        output_width = xwl_output->height;
+        output_height = xwl_output->width;
+    }
+
+    if (*width < xwl_output->x + output_width)
+        *width = xwl_output->x + output_width;
 
-    if (*height < xwl_output->y + xwl_output->height)
-        *height = xwl_output->y + xwl_output->height;
+    if (*height < xwl_output->y + output_height)
+        *height = xwl_output->y + output_height;
 }
 
 /* Approximate some kind of mmpd (m.m. per dot) of the screen given the outputs
commit afeace27d3818274b75d59375771dc964d2f56bb
Author: Olivier Fourdan <ofourdan at redhat.com>
Date:   Tue Feb 7 15:31:22 2017 +0100

    xwayland: CRTC should support all rotations
    
    If the Wayland compositor sets a rotation on the output, Xwayland
    translates the transformation as an xrandr rotation for the given
    output.
    
    However, if the rotation is not supported by the CRTC, this is not
    a valid setup and xrandr queries will fail.
    
    Pretend we support all rotations and reflections so that the
    configuration remains a valid xrandr setup.
    
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=99663
    Signed-off-by: Olivier Fourdan <ofourdan at redhat.com>
    Reviewed-by: Adam Jackson <ajax at redhat.com>

diff --git a/hw/xwayland/xwayland-output.c b/hw/xwayland/xwayland-output.c
index d13a728..fb46448 100644
--- a/hw/xwayland/xwayland-output.c
+++ b/hw/xwayland/xwayland-output.c
@@ -31,6 +31,12 @@
 #include <randrstr.h>
 
 #define DEFAULT_DPI 96
+#define ALL_ROTATIONS (RR_Rotate_0   | \
+                       RR_Rotate_90  | \
+                       RR_Rotate_180 | \
+                       RR_Rotate_270 | \
+                       RR_Reflect_X  | \
+                       RR_Reflect_Y)
 
 static Rotation
 wl_transform_to_xrandr(enum wl_output_transform transform)
@@ -266,6 +272,7 @@ xwl_output_create(struct xwl_screen *xwl_screen, uint32_t id)
         ErrorF("Failed creating RandR CRTC\n");
         goto err;
     }
+    RRCrtcSetRotations (xwl_output->randr_crtc, ALL_ROTATIONS);
 
     xwl_output->randr_output = RROutputCreate(xwl_screen->screen, name,
                                               strlen(name), xwl_output);
@@ -317,7 +324,7 @@ xwl_output_remove(struct xwl_output *xwl_output)
 static Bool
 xwl_randr_get_info(ScreenPtr pScreen, Rotation * rotations)
 {
-    *rotations = 0;
+    *rotations = ALL_ROTATIONS;
 
     return TRUE;
 }


More information about the xorg-commit mailing list