Fix mouse coordinates being wrong on HiDPI displays

When writing the initial stretch mode code, the existence of HiDPI
displays completely slipped my mind -- or at least I didn't realize
that they'd be a problem.

We implement scaling modes ourselves, so transforming the mouse
coordinates to our 320x240 viewport is done manually. Unfortunately,
that code did not take into account HiDPI scaling whatsoever, meaning
that all of the math which assumes the window size and the renderer
size is wrong.

To fix this, we use `SDL_GetWindowSizeInPixels` and `SDL_GetWindow` to
find the scaling factor, and then apply that to the mouse coordinates
to get the mouse coordinates in the pixel-space instead, and then we do
all of our normal logic after.

Due to our usage of `SDL_GetWindowSizeInPixels`, this bumps the minimum
SDL version to 2.26.0.

Closes #1235.
This commit is contained in:
NyakoFox 2025-05-03 15:29:24 -03:00 committed by Ethan Lee
parent 53bb45e01d
commit cd785316b6
2 changed files with 15 additions and 3 deletions

View file

@ -106,7 +106,7 @@ jobs:
runs-on: windows-latest
env:
SDL_VERSION: 2.24.0
SDL_VERSION: 2.26.0
steps:
- uses: actions/checkout@v1

View file

@ -571,8 +571,20 @@ void KeyPoll::Poll(void)
SDL_Rect rect;
graphics.get_stretch_info(&rect);
mousex = (raw_mousex - rect.x) * SCREEN_WIDTH_PIXELS / rect.w;
mousey = (raw_mousey - rect.y) * SCREEN_HEIGHT_PIXELS / rect.h;
int window_width;
int window_height;
SDL_GetWindowSizeInPixels(gameScreen.m_window, &window_width, &window_height);
int scaled_window_width;
int scaled_window_height;
SDL_GetWindowSize(gameScreen.m_window, &scaled_window_width, &scaled_window_height);
float scale_x = (float)window_width / (float)scaled_window_width;
float scale_y = (float)window_height / (float)scaled_window_height;
// Use screen stretch information to modify the coordinates (as we implement stretching manually)
mousex = ((raw_mousex * scale_x) - rect.x) * SCREEN_WIDTH_PIXELS / rect.w;
mousey = ((raw_mousey * scale_y) - rect.y) * SCREEN_HEIGHT_PIXELS / rect.h;
active_input_device_changed = keyboard_was_active != BUTTONGLYPHS_keyboard_is_active();
should_recompute_textboxes |= active_input_device_changed;