Fixed mouse coordinate range on Mac OS X
authorSam Lantinga <slouken@libsdl.org>
Thu, 27 Nov 2008 21:53:18 +0000
changeset 2794 f7872b7a8732
parent 2793 b14f672b2857
child 2795 9e7ce3069096
Fixed mouse coordinate range on Mac OS X
src/events/SDL_mouse.c
src/events/SDL_mouse_c.h
src/events/SDL_windowevents.c
src/video/win32/SDL_win32events.c
src/video/x11/SDL_x11events.c
--- a/src/events/SDL_mouse.c	Thu Nov 27 05:29:12 2008 +0000
+++ b/src/events/SDL_mouse.c	Thu Nov 27 21:53:18 2008 +0000
@@ -34,7 +34,6 @@
 static int *SDL_IdIndex = NULL;
 static int SDL_highestId = -1;
 static int last_x, last_y;      /* the last reported x and y coordinates by the system cursor */
-int x_max, y_max;               /* current window width and height */
 
 
 /* Public functions */
@@ -365,6 +364,21 @@
         if (!focus) {
             SDL_SendWindowEvent(mouse->focus, SDL_WINDOWEVENT_ENTER, 0, 0);
         }
+        SDL_GetWindowSize(windowID, &mouse->x_max, &mouse->y_max);
+    }
+}
+
+void
+SDL_SetMouseFocusSize(SDL_WindowID windowID, int w, int h)
+{
+    int i;
+
+    for (i = 0; i < SDL_num_mice; ++i) {
+        SDL_Mouse *mouse = SDL_GetMouse(i);
+        if (mouse && mouse->focus == windowID) {
+            mouse->x_max = w;
+            mouse->y_max = h;
+        }
     }
 }
 
@@ -407,15 +421,6 @@
     int xrel;
     int yrel;
 
-    /* while using the relative mode and many windows, we have to be sure,
-       that the pointers find themselves inside the windows */
-    if (x > x_max) {
-        x = x_max;
-    }
-    if (y > y_max) {
-        y = y_max;
-    }
-
     if (!mouse || mouse->flush_motion) {
         return 0;
     }
@@ -445,15 +450,17 @@
         mouse->x = x;
         mouse->y = y;
     } else {
-        if (mouse->x + xrel > x_max) {
-            mouse->x = x_max;
+        /* while using the relative mode and many windows, we have to be
+           sure that the pointers find themselves inside the windows */
+        if (mouse->x + xrel > mouse->x_max) {
+            mouse->x = mouse->x_max;
         } else if (mouse->x + xrel < 0) {
             mouse->x = 0;
         } else {
             mouse->x += xrel;
         }
-        if (mouse->y + yrel > y_max) {
-            mouse->y = y_max;
+        if (mouse->y + yrel > mouse->y_max) {
+            mouse->y = mouse->y_max;
         } else if (mouse->y + yrel < 0) {
             mouse->y = 0;
         } else {
@@ -779,13 +786,6 @@
 }
 
 void
-SDL_UpdateCoordinates(int x, int y)
-{
-    x_max = x;
-    y_max = y;
-}
-
-void
 SDL_ChangeEnd(int id, int end)
 {
     int index = SDL_GetMouseIndexId(id);
--- a/src/events/SDL_mouse_c.h	Thu Nov 27 05:29:12 2008 +0000
+++ b/src/events/SDL_mouse_c.h	Thu Nov 27 21:53:18 2008 +0000
@@ -66,8 +66,8 @@
     /* Data common to all mice */
     SDL_WindowID focus;
     int which;
-    int x;
-    int y;
+    int x, x_max;
+    int y, y_max;
     int z;                      /* for future use */
     int xdelta;
     int ydelta;
@@ -112,6 +112,9 @@
 /* Set the mouse focus window */
 extern void SDL_SetMouseFocus(int id, SDL_WindowID windowID);
 
+/* Set the size of the mouse focus window */
+extern void SDL_SetMouseFocusSize(SDL_WindowID windowID, int w, int h);
+
 /* Send a mouse motion event for a mouse */
 extern int SDL_SendMouseMotion(int id, int relative, int x, int y, int z);
 
@@ -128,7 +131,6 @@
 extern void SDL_MouseQuit(void);
 
 /* FIXME: Where do these functions go in this header? */
-extern void SDL_UpdateCoordinates(int x, int y);
 extern void SDL_ChangeEnd(int id, int end);
 
 #endif /* _SDL_mouse_c_h */
--- a/src/events/SDL_windowevents.c	Thu Nov 27 05:29:12 2008 +0000
+++ b/src/events/SDL_windowevents.c	Thu Nov 27 21:53:18 2008 +0000
@@ -25,6 +25,7 @@
 
 #include "SDL_events.h"
 #include "SDL_events_c.h"
+#include "SDL_mouse_c.h"
 #include "../video/SDL_sysvideo.h"
 
 int
@@ -73,6 +74,7 @@
         window->w = data1;
         window->h = data2;
         SDL_OnWindowResized(window);
+        SDL_SetMouseFocusSize(windowID, window->w, window->h);
         break;
     case SDL_WINDOWEVENT_MINIMIZED:
         if (window->flags & SDL_WINDOW_MINIMIZED) {
--- a/src/video/win32/SDL_win32events.c	Thu Nov 27 05:29:12 2008 +0000
+++ b/src/video/win32/SDL_win32events.c	Thu Nov 27 21:53:18 2008 +0000
@@ -240,13 +240,11 @@
                     break;
                 }
             }
+/* FIXME: Doesn't this defeat the point of using raw input? */
             GetCursorPos(&point);
-            ScreenToClient(hwnd, &point);
-            SDL_GetWindowSize(data->windowID, &w, &h);
-            SDL_UpdateCoordinates(w, h);        /* we're updating the current window size */
 
             /* if the message was sent by a tablet we have to send also pressure */
-            if (i == tablet) {
+            if (index == tablet) {
                 SDL_SendMouseMotion(index, 0, point.x, point.y, pressure);
             } else {
                 SDL_SendMouseMotion(index, 0, point.x, point.y, 0);
--- a/src/video/x11/SDL_x11events.c	Thu Nov 27 05:29:12 2008 +0000
+++ b/src/video/x11/SDL_x11events.c	Thu Nov 27 21:53:18 2008 +0000
@@ -278,16 +278,10 @@
 
     default:{
             if (xevent.type == motion) {        /* MotionNotify */
+                XDeviceMotionEvent *move = (XDeviceMotionEvent *) & xevent;
 #ifdef DEBUG_MOTION
-                printf("X11 motion: %d,%d\n", xevent.xmotion.x,
-                       xevent.xmotion.y);
+                printf("X11 motion: %d,%d\n", move->x, move->y);
 #endif
-                XWindowAttributes attrib;
-                XGetWindowAttributes(videodata->display,
-                                     ((XAnyEvent *) & xevent)->window,
-                                     &attrib);
-                SDL_UpdateCoordinates(attrib.width, attrib.height);
-                XDeviceMotionEvent *move = (XDeviceMotionEvent *) & xevent;
                 SDL_SendMouseMotion(move->deviceid, 0, move->x,
                                     move->y, move->axis_data[2]);
             } else if (xevent.type == button_pressed) { /* ButtonPress */