From c366a44952e6c449ffbf6cef7c7ddaffa765643f Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Thu, 27 Nov 2008 21:53:18 +0000 Subject: [PATCH] Fixed mouse coordinate range on Mac OS X --- src/events/SDL_mouse.c | 42 +++++++++++++++---------------- src/events/SDL_mouse_c.h | 8 +++--- src/events/SDL_windowevents.c | 2 ++ src/video/win32/SDL_win32events.c | 6 ++--- src/video/x11/SDL_x11events.c | 10 ++------ 5 files changed, 32 insertions(+), 36 deletions(-) diff --git a/src/events/SDL_mouse.c b/src/events/SDL_mouse.c index 9bea98c59..1d8a6d378 100644 --- a/src/events/SDL_mouse.c +++ b/src/events/SDL_mouse.c @@ -34,7 +34,6 @@ static SDL_Mouse **SDL_mice = NULL; 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 @@ SDL_SetMouseFocus(int id, SDL_WindowID windowID) 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 @@ SDL_SendMouseMotion(int id, int relative, int x, int y, int pressure) 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 @@ SDL_SendMouseMotion(int id, int relative, int x, int y, int pressure) 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 { @@ -778,13 +785,6 @@ SDL_GetMouseName(int index) return mouse->name; } -void -SDL_UpdateCoordinates(int x, int y) -{ - x_max = x; - y_max = y; -} - void SDL_ChangeEnd(int id, int end) { diff --git a/src/events/SDL_mouse_c.h b/src/events/SDL_mouse_c.h index cc29eb5a4..640e64a66 100644 --- a/src/events/SDL_mouse_c.h +++ b/src/events/SDL_mouse_c.h @@ -66,8 +66,8 @@ struct SDL_Mouse /* 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 @@ extern void SDL_ResetMouse(int index); /* 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 int SDL_SendProximity(int id, int x, int y, int type); 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 --git a/src/events/SDL_windowevents.c b/src/events/SDL_windowevents.c index 9a0861b3a..7b131bbee 100644 --- a/src/events/SDL_windowevents.c +++ b/src/events/SDL_windowevents.c @@ -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 @@ SDL_SendWindowEvent(SDL_WindowID windowID, Uint8 windowevent, int data1, 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 --git a/src/video/win32/SDL_win32events.c b/src/video/win32/SDL_win32events.c index 02570afec..01abb86d5 100644 --- a/src/video/win32/SDL_win32events.c +++ b/src/video/win32/SDL_win32events.c @@ -240,13 +240,11 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 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 --git a/src/video/x11/SDL_x11events.c b/src/video/x11/SDL_x11events.c index e7f8f11c4..52b0b4cea 100644 --- a/src/video/x11/SDL_x11events.c +++ b/src/video/x11/SDL_x11events.c @@ -278,16 +278,10 @@ X11_DispatchEvent(_THIS) 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 */