Setting the mouse in relative mode implies grabbing the mouse.
This fixes getting mouse button events in raw input relative mode on X11.
parent
7aef2350cf
commit
2521e49769
|
@ -2055,9 +2055,8 @@ SDL_UpdateWindowGrab(SDL_Window * window)
|
||||||
{
|
{
|
||||||
if (_this->SetWindowGrab) {
|
if (_this->SetWindowGrab) {
|
||||||
SDL_bool grabbed;
|
SDL_bool grabbed;
|
||||||
if (SDL_GetMouse()->relative_mode_warp ||
|
if ((SDL_GetMouse()->relative_mode || (window->flags & SDL_WINDOW_INPUT_GRABBED)) &&
|
||||||
((window->flags & SDL_WINDOW_INPUT_GRABBED) &&
|
(window->flags & SDL_WINDOW_INPUT_FOCUS)) {
|
||||||
(window->flags & SDL_WINDOW_INPUT_FOCUS))) {
|
|
||||||
grabbed = SDL_TRUE;
|
grabbed = SDL_TRUE;
|
||||||
} else {
|
} else {
|
||||||
grabbed = SDL_FALSE;
|
grabbed = SDL_FALSE;
|
||||||
|
|
|
@ -286,47 +286,6 @@ WIN_ConvertUTF32toUTF8(UINT32 codepoint, char * text)
|
||||||
return SDL_TRUE;
|
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
|
LRESULT CALLBACK
|
||||||
WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
#include "../SDL_sysvideo.h"
|
#include "../SDL_sysvideo.h"
|
||||||
#include "../SDL_pixels_c.h"
|
#include "../SDL_pixels_c.h"
|
||||||
#include "../../events/SDL_keyboard_c.h"
|
#include "../../events/SDL_keyboard_c.h"
|
||||||
|
#include "../../events/SDL_mouse_c.h"
|
||||||
|
|
||||||
#include "SDL_windowsvideo.h"
|
#include "SDL_windowsvideo.h"
|
||||||
#include "SDL_windowswindow.h"
|
#include "SDL_windowswindow.h"
|
||||||
|
@ -571,17 +572,7 @@ WIN_GetWindowGammaRamp(_THIS, SDL_Window * window, Uint16 * ramp)
|
||||||
void
|
void
|
||||||
WIN_SetWindowGrab(_THIS, SDL_Window * window, SDL_bool grabbed)
|
WIN_SetWindowGrab(_THIS, SDL_Window * window, SDL_bool grabbed)
|
||||||
{
|
{
|
||||||
HWND hwnd = ((SDL_WindowData *) window->driverdata)->hwnd;
|
WIN_UpdateClipCursor(window);
|
||||||
|
|
||||||
if (grabbed) {
|
|
||||||
RECT rect;
|
|
||||||
GetClientRect(hwnd, &rect);
|
|
||||||
ClientToScreen(hwnd, (LPPOINT) & rect);
|
|
||||||
ClientToScreen(hwnd, (LPPOINT) & rect + 1);
|
|
||||||
ClipCursor(&rect);
|
|
||||||
} else {
|
|
||||||
ClipCursor(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (window->flags & SDL_WINDOW_FULLSCREEN) {
|
if (window->flags & SDL_WINDOW_FULLSCREEN) {
|
||||||
UINT flags = SWP_NOCOPYBITS | SWP_NOMOVE | SWP_NOSIZE;
|
UINT flags = SWP_NOCOPYBITS | SWP_NOMOVE | SWP_NOSIZE;
|
||||||
|
@ -722,6 +713,48 @@ void WIN_OnWindowEnter(_THIS, SDL_Window * window)
|
||||||
#endif /* WM_MOUSELEAVE */
|
#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 */
|
#endif /* SDL_VIDEO_DRIVER_WINDOWS */
|
||||||
|
|
||||||
/* vi: set ts=4 sw=4 expandtab: */
|
/* 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,
|
extern SDL_bool WIN_GetWindowWMInfo(_THIS, SDL_Window * window,
|
||||||
struct SDL_SysWMinfo *info);
|
struct SDL_SysWMinfo *info);
|
||||||
extern void WIN_OnWindowEnter(_THIS, SDL_Window * window);
|
extern void WIN_OnWindowEnter(_THIS, SDL_Window * window);
|
||||||
|
extern void WIN_UpdateClipCursor(SDL_Window *window);
|
||||||
|
|
||||||
#endif /* _SDL_windowswindow_h */
|
#endif /* _SDL_windowswindow_h */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue