Commit 2521e497699b798585c6d96dde69d352a8814b37

Sam Lantinga 2013-12-23T17:55:06

Setting the mouse in relative mode implies grabbing the mouse. This fixes getting mouse button events in raw input relative mode on X11.

diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c
index ff80891..46f8ffc 100644
--- a/src/video/SDL_video.c
+++ b/src/video/SDL_video.c
@@ -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;
diff --git a/src/video/windows/SDL_windowsevents.c b/src/video/windows/SDL_windowsevents.c
index a06f11f..103a9bf 100644
--- a/src/video/windows/SDL_windowsevents.c
+++ b/src/video/windows/SDL_windowsevents.c
@@ -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)
 {
diff --git a/src/video/windows/SDL_windowswindow.c b/src/video/windows/SDL_windowswindow.c
index 990c0cb..8529cea 100644
--- a/src/video/windows/SDL_windowswindow.c
+++ b/src/video/windows/SDL_windowswindow.c
@@ -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: */
diff --git a/src/video/windows/SDL_windowswindow.h b/src/video/windows/SDL_windowswindow.h
index ed30445..1cf1145 100644
--- a/src/video/windows/SDL_windowswindow.h
+++ b/src/video/windows/SDL_windowswindow.h
@@ -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 */