From 6f6813b5b08644f7390f2826b4c33d6f9ad84485 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Mon, 4 Jun 2007 11:22:23 +0000 Subject: [PATCH] Better handling of multiple queued Cocoa mouse events. Thanks to Christian Walther for the patch. Fixes Bugzilla #353. --- src/video/quartz/SDL_QuartzEvents.m | 33 ++++++++++------------------- 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/src/video/quartz/SDL_QuartzEvents.m b/src/video/quartz/SDL_QuartzEvents.m index 3c0267e15..1647570b5 100644 --- a/src/video/quartz/SDL_QuartzEvents.m +++ b/src/video/quartz/SDL_QuartzEvents.m @@ -722,7 +722,6 @@ void QZ_PumpEvents (_THIS) { static Uint32 screensaverTicks = 0; Uint32 nowTicks; - int firstMouseEvent; CGMouseDelta dx, dy; NSDate *distantPast; @@ -748,10 +747,7 @@ void QZ_PumpEvents (_THIS) winRect = NSMakeRect (0, 0, SDL_VideoSurface->w, SDL_VideoSurface->h); - /* send the first mouse event in absolute coordinates */ - firstMouseEvent = 1; - - /* accumulate any additional mouse moved events into one SDL mouse event */ + /* while grabbed, accumulate all mouse moved events into one SDL mouse event */ dx = 0; dy = 0; @@ -853,29 +849,22 @@ void QZ_PumpEvents (_THIS) dx += dx1; dy += dy1; } - else if (firstMouseEvent) { + else { /* - Get the first mouse event in a possible - sequence of mouse moved events. Since we - use absolute coordinates, this serves to - compensate any inaccuracy in deltas, and - provides the first known mouse position, - since everything after this uses deltas + Get the absolute mouse location. This is not the + mouse location after the currently processed event, + but the *current* mouse location, i.e. after all + pending events. This means that if there are + multiple mouse moved events in the queue, we make + multiple identical calls to SDL_PrivateMouseMotion(), + but that's no problem since the latter only + generates SDL events for nonzero movements. In my + experience on PBG4/10.4.8, this rarely happens anyway. */ NSPoint p; QZ_GetMouseLocation (this, &p); SDL_PrivateMouseMotion (0, 0, p.x, p.y); - firstMouseEvent = 0; - } - else { - - /* - Get the amount moved since the last drag or move event, - add it on for one big move event at the end. - */ - dx += [ event deltaX ]; - dy += [ event deltaY ]; } /*