mirror of
https://github.com/TerryCavanagh/VVVVVV.git
synced 2025-07-07 11:35:00 +00:00
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:
parent
1de2078014
commit
0e31253876
2 changed files with 15 additions and 3 deletions
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
|
@ -101,7 +101,7 @@ jobs:
|
|||
runs-on: windows-latest
|
||||
|
||||
env:
|
||||
SDL_VERSION: 2.24.0
|
||||
SDL_VERSION: 2.26.0
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue