wayland: Transform mode values for native portrait displays

Portrait displays may have native, physical resolutions that are taller than wide. Reverse the mode dimensions when dealing with these displays as well as those rotated via software means.
This commit is contained in:
Frank Praznik 2023-02-04 10:59:17 -05:00
parent 02fbf2cf99
commit b2d8a1a58c

View file

@ -361,7 +361,7 @@ static const struct zxdg_output_v1_listener xdg_output_listener = {
xdg_output_handle_description,
};
static void AddEmulatedModes(SDL_DisplayData *dispdata, SDL_bool rot_90)
static void AddEmulatedModes(SDL_DisplayData *dispdata, int native_width, int native_height)
{
struct EmulatedMode
{
@ -414,8 +414,7 @@ static void AddEmulatedModes(SDL_DisplayData *dispdata, SDL_bool rot_90)
int i;
SDL_DisplayMode mode;
SDL_VideoDisplay *dpy = dispdata->display ? SDL_GetVideoDisplay(dispdata->display) : &dispdata->placeholder;
const int native_width = dispdata->pixel_width;
const int native_height = dispdata->pixel_height;
const SDL_bool rot_90 = native_width < native_height; /* Reverse width/height for portrait displays. */
for (i = 0; i < SDL_arraysize(mode_list); ++i) {
SDL_zero(mode);
@ -424,19 +423,18 @@ static void AddEmulatedModes(SDL_DisplayData *dispdata, SDL_bool rot_90)
mode.refresh_rate = dpy->desktop_mode.refresh_rate;
mode.driverdata = dpy->desktop_mode.driverdata;
if (rot_90) {
mode.pixel_w = mode_list[i].h;
mode.pixel_h = mode_list[i].w;
} else {
mode.pixel_w = mode_list[i].w;
mode.pixel_h = mode_list[i].h;
}
/* Only add modes that are smaller than the native mode. */
if ((mode_list[i].w < native_width && mode_list[i].h < native_height) ||
(mode_list[i].w < native_width && mode_list[i].h == native_height) ||
(mode_list[i].w == native_width && mode_list[i].h < native_height)) {
if (rot_90) {
mode.pixel_w = mode_list[i].h;
mode.pixel_h = mode_list[i].w;
} else {
mode.pixel_w = mode_list[i].w;
mode.pixel_h = mode_list[i].h;
}
if ((mode.pixel_w < native_width && mode.pixel_h < native_height) ||
(mode.pixel_w < native_width && mode.pixel_h == native_height) ||
(mode.pixel_w == native_width && mode.pixel_h < native_height)) {
SDL_AddFullscreenDisplayMode(dpy, &mode);
}
}
@ -614,11 +612,11 @@ static void display_handle_done(void *data,
/* Set the desktop display mode. */
SDL_SetDesktopDisplayMode(dpy, &desktop_mode);
/* ...expose the unscaled, native resolution if the scale is 1.0 or viewports are available... */
/* Expose the unscaled, native resolution if the scale is 1.0 or viewports are available... */
if (driverdata->scale_factor == 1.0f || video->viewporter != NULL) {
SDL_AddFullscreenDisplayMode(dpy, &native_mode);
} else {
/* ...if not, expose the integer scaled variants of the desktop resolution down to 1. */
/* ...otherwise expose the integer scaled variants of the desktop resolution down to 1. */
int i;
desktop_mode.pixel_w = 0;
@ -634,9 +632,8 @@ static void display_handle_done(void *data,
/* Add emulated modes if wp_viewporter is supported and mode emulation is enabled. */
if (video->viewporter && mode_emulation_enabled) {
const SDL_bool rot_90 = (driverdata->transform & WL_OUTPUT_TRANSFORM_90) ||
(driverdata->screen_width < driverdata->screen_height);
AddEmulatedModes(driverdata, rot_90);
/* The transformed display pixel width/height must be used here. */
AddEmulatedModes(driverdata, native_mode.pixel_w, native_mode.pixel_h);
}
/* Calculate the display DPI */