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>
This commit is contained in:
parent
10df0437a2
commit
88342353de
|
@ -313,8 +313,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 */
|
||||
|
@ -515,7 +518,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);
|
||||
|
|
Loading…
Reference in New Issue