# HG changeset patch # User Sam Lantinga # Date 1227822798 0 # Node ID f7872b7a87325abaec672784b866fdec239750f4 # Parent b14f672b2857c8ac79c94e76ba774f92177af27f Fixed mouse coordinate range on Mac OS X diff -r b14f672b2857 -r f7872b7a8732 src/events/SDL_mouse.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); diff -r b14f672b2857 -r f7872b7a8732 src/events/SDL_mouse_c.h --- 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 */ diff -r b14f672b2857 -r f7872b7a8732 src/events/SDL_windowevents.c --- 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) { diff -r b14f672b2857 -r f7872b7a8732 src/video/win32/SDL_win32events.c --- 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); diff -r b14f672b2857 -r f7872b7a8732 src/video/x11/SDL_x11events.c --- 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 */