mirror of
https://github.com/Relintai/sdl2_frt.git
synced 2024-12-25 09:17:12 +01:00
Simplify ClipCursor behaviour when RelativeMouseMode is enabled
The implementation of clip logic for relative mode seemed to unnecessarily limit the usable area to the middle of the window, in a 2x2 pixel region. This has the adverse side effect of moving the operating system cursor to that location, even if it is in a valid location in the window. While in most scenarios this is handled correctly (by storing the original position of the cursor in the window and restoring when leaving relative mode), there are edge cases where this clip operation can cause WM_MOUSEMOVE to fire at a point in time where it counts as a relative delta from SDL's perspective.
This commit is contained in:
parent
3720e254c4
commit
4359a47b3e
@ -992,33 +992,12 @@ WIN_UpdateClipCursor(SDL_Window *window)
|
|||||||
|
|
||||||
if ((mouse->relative_mode || (window->flags & SDL_WINDOW_MOUSE_GRABBED)) &&
|
if ((mouse->relative_mode || (window->flags & SDL_WINDOW_MOUSE_GRABBED)) &&
|
||||||
(window->flags & SDL_WINDOW_INPUT_FOCUS)) {
|
(window->flags & SDL_WINDOW_INPUT_FOCUS)) {
|
||||||
if (mouse->relative_mode && !mouse->relative_mode_warp) {
|
if (GetClientRect(data->hwnd, &rect) && !IsRectEmpty(&rect)) {
|
||||||
if (GetWindowRect(data->hwnd, &rect)) {
|
ClientToScreen(data->hwnd, (LPPOINT) & rect);
|
||||||
LONG cx, cy;
|
ClientToScreen(data->hwnd, (LPPOINT) & rect + 1);
|
||||||
|
if (SDL_memcmp(&rect, &clipped_rect, sizeof(rect)) != 0) {
|
||||||
cx = (rect.left + rect.right) / 2;
|
if (ClipCursor(&rect)) {
|
||||||
cy = (rect.top + rect.bottom) / 2;
|
data->cursor_clipped_rect = rect;
|
||||||
|
|
||||||
/* Make an absurdly small clip rect */
|
|
||||||
rect.left = cx - 1;
|
|
||||||
rect.right = cx + 1;
|
|
||||||
rect.top = cy - 1;
|
|
||||||
rect.bottom = cy + 1;
|
|
||||||
|
|
||||||
if (SDL_memcmp(&rect, &clipped_rect, sizeof(rect)) != 0) {
|
|
||||||
if (ClipCursor(&rect)) {
|
|
||||||
data->cursor_clipped_rect = rect;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (GetClientRect(data->hwnd, &rect) && !IsRectEmpty(&rect)) {
|
|
||||||
ClientToScreen(data->hwnd, (LPPOINT) & rect);
|
|
||||||
ClientToScreen(data->hwnd, (LPPOINT) & rect + 1);
|
|
||||||
if (SDL_memcmp(&rect, &clipped_rect, sizeof(rect)) != 0) {
|
|
||||||
if (ClipCursor(&rect)) {
|
|
||||||
data->cursor_clipped_rect = rect;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user