[PATCH xserver] xwayland: rotate logical size for RRMode

Olivier Fourdan ofourdan at redhat.com
Fri Jul 13 10:18:57 UTC 2018


Hi,

On Wed, Jul 11, 2018 at 9:22 AM Simon Ser <contact at emersion.fr> wrote:
>
> From: emersion <contact at emersion.fr>
>
> The logical size is the size of the output in the global compositor
> space. The mode width/height should be scaled as in the logical
> size, but shouldn't be transformed. Thus we need to rotate back
> the logical size to be able to use it as the mode width/height.
>
> This fixes issues with pointer input on transformed outputs.
>
> Signed-Off-By: Simon Ser <contact at emersion.fr>
> ---
> This supersedes my previous patch [1], and rotates the logical size
> instead of using the raw wl_output mode (so that scaling still
> works).
>
> [1]: https://lists.x.org/archives/xorg-devel/2018-July/057285.html
>
>  hw/xwayland/xwayland-output.c | 12 +++++++++++-
>  1 file changed, 11 insertions(+), 1 deletion(-)
>
> diff --git a/hw/xwayland/xwayland-output.c b/hw/xwayland/xwayland-output.c
> index 379062549..26e055867 100644
> --- a/hw/xwayland/xwayland-output.c
> +++ b/hw/xwayland/xwayland-output.c
> @@ -213,6 +213,7 @@ apply_output_change(struct xwl_output *xwl_output)
>  {
>      struct xwl_screen *xwl_screen = xwl_output->xwl_screen;
>      struct xwl_output *it;
> +    int mode_width, mode_height;
>      int width = 0, height = 0, has_this_output = 0;
>      RRModePtr randr_mode;
>      Bool need_rotate;
> @@ -224,7 +225,16 @@ apply_output_change(struct xwl_output *xwl_output)
>      /* xdg-output sends output size in compositor space. so already rotated */
>      need_rotate = (xwl_output->xdg_output == NULL);
>
> -    randr_mode = xwayland_cvt(xwl_output->width, xwl_output->height,
> +    /* We need to rotate back the logical size for the mode */
> +    if (xwl_output->rotation & (RR_Rotate_0 | RR_Rotate_180)) {
> +        mode_width = xwl_output->width;
> +        mode_height = xwl_output->height;
> +    } else {
> +        mode_width = xwl_output->height;
> +        mode_height = xwl_output->width;
> +    }

But shouldn't this check `need_rotate` as well?

I mean, we should not do this in the case of `xdg-output` not being available.

> +
> +    randr_mode = xwayland_cvt(mode_width, mode_height,
>                                xwl_output->refresh / 1000.0, 0, 0);
>      RROutputSetModes(xwl_output->randr_output, &randr_mode, 1, 1);
>      RRCrtcNotify(xwl_output->randr_crtc, randr_mode,
> --

This is where I get surprised, because if I understand the problem,
you where stating that the pointer events stopped working below a
certain limit.

Those are limited by the actual “screen size” as set by
`update_desktop_dimensions()` at the end of `update_screen_size()`, I
don't see how changing the size passed to compute the randr mode will
help with the bug you're trying to address here...

Cheers,
Olivier


More information about the xorg-devel mailing list