Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Setting the mouse in relative mode implies grabbing the mouse.
This fixes getting mouse button events in raw input relative mode on X11.
- Loading branch information
|
@@ -2055,9 +2055,8 @@ SDL_UpdateWindowGrab(SDL_Window * window) |
|
|
{ |
|
|
if (_this->SetWindowGrab) { |
|
|
SDL_bool grabbed; |
|
|
if (SDL_GetMouse()->relative_mode_warp || |
|
|
((window->flags & SDL_WINDOW_INPUT_GRABBED) && |
|
|
(window->flags & SDL_WINDOW_INPUT_FOCUS))) { |
|
|
if ((SDL_GetMouse()->relative_mode || (window->flags & SDL_WINDOW_INPUT_GRABBED)) && |
|
|
(window->flags & SDL_WINDOW_INPUT_FOCUS)) { |
|
|
grabbed = SDL_TRUE; |
|
|
} else { |
|
|
grabbed = SDL_FALSE; |
|
|
|
@@ -286,47 +286,6 @@ WIN_ConvertUTF32toUTF8(UINT32 codepoint, char * text) |
|
|
return SDL_TRUE; |
|
|
} |
|
|
|
|
|
static void |
|
|
WIN_UpdateClipCursor(SDL_Window *window) |
|
|
{ |
|
|
SDL_WindowData *data = (SDL_WindowData *) window->driverdata; |
|
|
SDL_Mouse *mouse = SDL_GetMouse(); |
|
|
|
|
|
/* Don't clip the cursor while we're in the modal resize or move loop */ |
|
|
if (data->in_modal_loop) { |
|
|
ClipCursor(NULL); |
|
|
return; |
|
|
} |
|
|
|
|
|
if (mouse->relative_mode && !mouse->relative_mode_warp) { |
|
|
LONG cx, cy; |
|
|
RECT rect; |
|
|
GetWindowRect(data->hwnd, &rect); |
|
|
|
|
|
cx = (rect.left + rect.right) / 2; |
|
|
cy = (rect.top + rect.bottom) / 2; |
|
|
|
|
|
/* Make an absurdly small clip rect */ |
|
|
rect.left = cx-1; |
|
|
rect.right = cx+1; |
|
|
rect.top = cy-1; |
|
|
rect.bottom = cy+1; |
|
|
|
|
|
ClipCursor(&rect); |
|
|
} else if (mouse->relative_mode_warp || |
|
|
((window->flags & SDL_WINDOW_INPUT_GRABBED) && |
|
|
(window->flags & SDL_WINDOW_INPUT_FOCUS))) { |
|
|
RECT rect; |
|
|
if (GetClientRect(data->hwnd, &rect) && !IsRectEmpty(&rect)) { |
|
|
ClientToScreen(data->hwnd, (LPPOINT) & rect); |
|
|
ClientToScreen(data->hwnd, (LPPOINT) & rect + 1); |
|
|
ClipCursor(&rect); |
|
|
} |
|
|
} else { |
|
|
ClipCursor(NULL); |
|
|
} |
|
|
} |
|
|
|
|
|
LRESULT CALLBACK |
|
|
WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) |
|
|
{ |
|
|
|
@@ -28,6 +28,7 @@ |
|
|
#include "../SDL_sysvideo.h" |
|
|
#include "../SDL_pixels_c.h" |
|
|
#include "../../events/SDL_keyboard_c.h" |
|
|
#include "../../events/SDL_mouse_c.h" |
|
|
|
|
|
#include "SDL_windowsvideo.h" |
|
|
#include "SDL_windowswindow.h" |
|
@@ -571,17 +572,7 @@ WIN_GetWindowGammaRamp(_THIS, SDL_Window * window, Uint16 * ramp) |
|
|
void |
|
|
WIN_SetWindowGrab(_THIS, SDL_Window * window, SDL_bool grabbed) |
|
|
{ |
|
|
HWND hwnd = ((SDL_WindowData *) window->driverdata)->hwnd; |
|
|
|
|
|
if (grabbed) { |
|
|
RECT rect; |
|
|
GetClientRect(hwnd, &rect); |
|
|
ClientToScreen(hwnd, (LPPOINT) & rect); |
|
|
ClientToScreen(hwnd, (LPPOINT) & rect + 1); |
|
|
ClipCursor(&rect); |
|
|
} else { |
|
|
ClipCursor(NULL); |
|
|
} |
|
|
WIN_UpdateClipCursor(window); |
|
|
|
|
|
if (window->flags & SDL_WINDOW_FULLSCREEN) { |
|
|
UINT flags = SWP_NOCOPYBITS | SWP_NOMOVE | SWP_NOSIZE; |
|
@@ -722,6 +713,48 @@ void WIN_OnWindowEnter(_THIS, SDL_Window * window) |
|
|
#endif /* WM_MOUSELEAVE */ |
|
|
} |
|
|
|
|
|
void |
|
|
WIN_UpdateClipCursor(SDL_Window *window) |
|
|
{ |
|
|
SDL_WindowData *data = (SDL_WindowData *) window->driverdata; |
|
|
SDL_Mouse *mouse = SDL_GetMouse(); |
|
|
|
|
|
/* Don't clip the cursor while we're in the modal resize or move loop */ |
|
|
if (data->in_modal_loop) { |
|
|
ClipCursor(NULL); |
|
|
return; |
|
|
} |
|
|
|
|
|
if ((mouse->relative_mode || (window->flags & SDL_WINDOW_INPUT_GRABBED)) && |
|
|
(window->flags & SDL_WINDOW_INPUT_FOCUS)) { |
|
|
if (mouse->relative_mode && !mouse->relative_mode_warp) { |
|
|
LONG cx, cy; |
|
|
RECT rect; |
|
|
GetWindowRect(data->hwnd, &rect); |
|
|
|
|
|
cx = (rect.left + rect.right) / 2; |
|
|
cy = (rect.top + rect.bottom) / 2; |
|
|
|
|
|
/* Make an absurdly small clip rect */ |
|
|
rect.left = cx - 1; |
|
|
rect.right = cx + 1; |
|
|
rect.top = cy - 1; |
|
|
rect.bottom = cy + 1; |
|
|
|
|
|
ClipCursor(&rect); |
|
|
} else { |
|
|
RECT rect; |
|
|
if (GetClientRect(data->hwnd, &rect) && !IsRectEmpty(&rect)) { |
|
|
ClientToScreen(data->hwnd, (LPPOINT) & rect); |
|
|
ClientToScreen(data->hwnd, (LPPOINT) & rect + 1); |
|
|
ClipCursor(&rect); |
|
|
} |
|
|
} |
|
|
} else { |
|
|
ClipCursor(NULL); |
|
|
} |
|
|
} |
|
|
|
|
|
#endif /* SDL_VIDEO_DRIVER_WINDOWS */ |
|
|
|
|
|
/* vi: set ts=4 sw=4 expandtab: */ |
|
@@ -66,6 +66,7 @@ extern void WIN_DestroyWindow(_THIS, SDL_Window * window); |
|
|
extern SDL_bool WIN_GetWindowWMInfo(_THIS, SDL_Window * window, |
|
|
struct SDL_SysWMinfo *info); |
|
|
extern void WIN_OnWindowEnter(_THIS, SDL_Window * window); |
|
|
extern void WIN_UpdateClipCursor(SDL_Window *window); |
|
|
|
|
|
#endif /* _SDL_windowswindow_h */ |
|
|
|
|
|