64 lines
2.6 KiB
Diff
64 lines
2.6 KiB
Diff
|
From 958b34ce3cab02219457d5dcc25217e7c9a0beba Mon Sep 17 00:00:00 2001
|
||
|
From: Hans de Goede <hdegoede@redhat.com>
|
||
|
Date: Mon, 7 Oct 2019 14:27:49 +0200
|
||
|
Subject: [PATCH xserver 21/24] xwayland: Fix emulated modes not being removed
|
||
|
when screen rotation is used
|
||
|
|
||
|
The code building the mode-list does the following to deal with screen
|
||
|
rotation:
|
||
|
|
||
|
if (need_rotate || 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;
|
||
|
}
|
||
|
|
||
|
This means we need to do something similar in xwl_output_set_emulated_mode()
|
||
|
to determine if the mode being set is the actual (not-emulated) output mode
|
||
|
and we this should remove any emulated modes set by the client.
|
||
|
|
||
|
All callers of xwl_output_set_emulated_mode always pass a mode pointer
|
||
|
to a member of xwl_output->randr_output->modes, so we do not need to
|
||
|
duplicate this code, instead we can simply check that the passed in mode
|
||
|
is modes[0] which always is the actual output mode.
|
||
|
|
||
|
Acked-by: Olivier Fourdan <ofourdan@redhat.com>
|
||
|
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||
|
(cherry picked from commit 88342353de45e64f408c38bb10cd1506ba0f159a)
|
||
|
---
|
||
|
hw/xwayland/xwayland-output.c | 8 ++++++--
|
||
|
1 file changed, 6 insertions(+), 2 deletions(-)
|
||
|
|
||
|
diff --git a/hw/xwayland/xwayland-output.c b/hw/xwayland/xwayland-output.c
|
||
|
index 0d6b9ac9f..4bc9cd6b8 100644
|
||
|
--- a/hw/xwayland/xwayland-output.c
|
||
|
+++ b/hw/xwayland/xwayland-output.c
|
||
|
@@ -272,8 +272,11 @@ xwl_output_remove_emulated_mode_for_client(struct xwl_output *xwl_output,
|
||
|
struct xwl_emulated_mode *emulated_mode;
|
||
|
|
||
|
emulated_mode = xwl_output_get_emulated_mode_for_client(xwl_output, client);
|
||
|
- if (emulated_mode)
|
||
|
+ if (emulated_mode) {
|
||
|
+ DebugF("XWAYLAND: xwl_output_remove_emulated_mode: %dx%d\n",
|
||
|
+ emulated_mode->width, emulated_mode->height);
|
||
|
memset(emulated_mode, 0, sizeof(*emulated_mode));
|
||
|
+ }
|
||
|
}
|
||
|
|
||
|
/* From hw/xfree86/common/xf86DefModeSet.c with some obscure modes dropped */
|
||
|
@@ -474,7 +477,8 @@ xwl_output_set_emulated_mode(struct xwl_output *xwl_output, ClientPtr client,
|
||
|
from_vidmode ? "vidmode" : "randr",
|
||
|
mode->mode.width, mode->mode.height);
|
||
|
|
||
|
- if (mode->mode.width == xwl_output->width && mode->mode.height == xwl_output->height)
|
||
|
+ /* modes[0] is the actual (not-emulated) output mode */
|
||
|
+ if (mode == xwl_output->randr_output->modes[0])
|
||
|
xwl_output_remove_emulated_mode_for_client(xwl_output, client);
|
||
|
else
|
||
|
xwl_output_add_emulated_mode_for_client(xwl_output, client, mode, from_vidmode);
|
||
|
--
|
||
|
2.26.2
|
||
|
|