mirror of https://github.com/libsdl-org/SDL
Setting the mouse in relative mode implies grabbing the mouse.
This fixes getting mouse button events in raw input relative mode on X11.
This commit is contained in:
parent
7aef2350cf
commit
2521e49769
|
@ -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 */
|
||||
|
||||
|
|
Loading…
Reference in New Issue