mirror of https://github.com/encounter/SDL.git
Improved fix for bug 4748 - Calling WIN_UpdateClipCursor() / WIN_UpdateClipCursorForWindows() on WIN_PumpEvents() causes beeping and choppy mouse cursor movement, right-click doesn't work
This commit is contained in:
parent
afb70f2681
commit
e261bd4205
|
@ -909,7 +909,7 @@ WIN_UpdateClipCursor(SDL_Window *window)
|
||||||
{
|
{
|
||||||
SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
|
SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
|
||||||
SDL_Mouse *mouse = SDL_GetMouse();
|
SDL_Mouse *mouse = SDL_GetMouse();
|
||||||
RECT rect;
|
RECT rect, clipped_rect;
|
||||||
|
|
||||||
if (data->in_title_click || data->focus_click_pending) {
|
if (data->in_title_click || data->focus_click_pending) {
|
||||||
return;
|
return;
|
||||||
|
@ -918,38 +918,43 @@ WIN_UpdateClipCursor(SDL_Window *window)
|
||||||
data->skip_update_clipcursor = SDL_FALSE;
|
data->skip_update_clipcursor = SDL_FALSE;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (!GetClipCursor(&clipped_rect)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if ((mouse->relative_mode || (window->flags & SDL_WINDOW_INPUT_GRABBED)) &&
|
if ((mouse->relative_mode || (window->flags & SDL_WINDOW_INPUT_GRABBED)) &&
|
||||||
(window->flags & SDL_WINDOW_INPUT_FOCUS)) {
|
(window->flags & SDL_WINDOW_INPUT_FOCUS)) {
|
||||||
if (mouse->relative_mode && !mouse->relative_mode_warp) {
|
if (mouse->relative_mode && !mouse->relative_mode_warp) {
|
||||||
LONG cx, cy;
|
if (GetWindowRect(data->hwnd, &rect)) {
|
||||||
GetWindowRect(data->hwnd, &rect);
|
LONG cx, cy;
|
||||||
|
|
||||||
cx = (rect.left + rect.right) / 2;
|
cx = (rect.left + rect.right) / 2;
|
||||||
cy = (rect.top + rect.bottom) / 2;
|
cy = (rect.top + rect.bottom) / 2;
|
||||||
|
|
||||||
/* Make an absurdly small clip rect */
|
/* Make an absurdly small clip rect */
|
||||||
rect.left = cx - 1;
|
rect.left = cx - 1;
|
||||||
rect.right = cx + 1;
|
rect.right = cx + 1;
|
||||||
rect.top = cy - 1;
|
rect.top = cy - 1;
|
||||||
rect.bottom = cy + 1;
|
rect.bottom = cy + 1;
|
||||||
|
|
||||||
if (ClipCursor(&rect)) {
|
if (SDL_memcmp(&rect, &clipped_rect, sizeof(rect)) != 0) {
|
||||||
data->cursor_clipped_rect = rect;
|
if (ClipCursor(&rect)) {
|
||||||
|
data->cursor_clipped_rect = rect;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
RECT clipped_rect;
|
|
||||||
if (GetClientRect(data->hwnd, &rect) && !IsRectEmpty(&rect)) {
|
if (GetClientRect(data->hwnd, &rect) && !IsRectEmpty(&rect)) {
|
||||||
ClientToScreen(data->hwnd, (LPPOINT) & rect);
|
ClientToScreen(data->hwnd, (LPPOINT) & rect);
|
||||||
ClientToScreen(data->hwnd, (LPPOINT) & rect + 1);
|
ClientToScreen(data->hwnd, (LPPOINT) & rect + 1);
|
||||||
if (!GetClipCursor(&clipped_rect) || SDL_memcmp(&rect, &clipped_rect, sizeof(rect)) != 0) {
|
if (SDL_memcmp(&rect, &clipped_rect, sizeof(rect)) != 0) {
|
||||||
if (ClipCursor(&rect)) {
|
if (ClipCursor(&rect)) {
|
||||||
data->cursor_clipped_rect = rect;
|
data->cursor_clipped_rect = rect;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (GetClipCursor(&rect) && SDL_memcmp(&rect, &data->cursor_clipped_rect, sizeof(rect)) == 0) {
|
} else if (SDL_memcmp(&clipped_rect, &data->cursor_clipped_rect, sizeof(clipped_rect)) == 0) {
|
||||||
ClipCursor(NULL);
|
ClipCursor(NULL);
|
||||||
SDL_zero(data->cursor_clipped_rect);
|
SDL_zero(data->cursor_clipped_rect);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue