Ken Thomases : winemac: Consolidate scroll wheel handling into -[ WineApplicationController handleScrollWheel:].

Alexandre Julliard julliard at winehq.org
Tue May 7 15:54:05 CDT 2013


Module: wine
Branch: master
Commit: d9ae2f3e38663b4f8802b08c13b85da62cf4420b
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=d9ae2f3e38663b4f8802b08c13b85da62cf4420b

Author: Ken Thomases <ken at codeweavers.com>
Date:   Tue May  7 03:00:44 2013 -0500

winemac: Consolidate scroll wheel handling into -[WineApplicationController handleScrollWheel:].

---

 dlls/winemac.drv/cocoa_app.m    |   98 +++++++++++++++++++++++++++++++++++++--
 dlls/winemac.drv/cocoa_window.m |   79 -------------------------------
 2 files changed, 94 insertions(+), 83 deletions(-)

diff --git a/dlls/winemac.drv/cocoa_app.m b/dlls/winemac.drv/cocoa_app.m
index bba9859..c518b4e 100644
--- a/dlls/winemac.drv/cocoa_app.m
+++ b/dlls/winemac.drv/cocoa_app.m
@@ -1300,6 +1300,99 @@ int macdrv_err_on;
         forceNextMouseMoveAbsolute = TRUE;
     }
 
+    - (void) handleScrollWheel:(NSEvent*)theEvent
+    {
+        WineWindow* window = (WineWindow*)[theEvent window];
+
+        if ([window isKindOfClass:[WineWindow class]])
+        {
+            CGEventRef cgevent = [theEvent CGEvent];
+            CGPoint pt = CGEventGetLocation(cgevent);
+            NSPoint nspoint = [self flippedMouseLocation:NSPointFromCGPoint(pt)];
+            NSRect contentRect = [window contentRectForFrameRect:[window frame]];
+
+            // Only process the event if it was in the window's content area.
+            if (NSPointInRect(nspoint, contentRect))
+            {
+                macdrv_event* event;
+                CGFloat x, y;
+                BOOL continuous = FALSE;
+
+                event = macdrv_create_event(MOUSE_SCROLL, window);
+                event->mouse_scroll.x = pt.x;
+                event->mouse_scroll.y = pt.y;
+                event->mouse_scroll.time_ms = [self ticksForEventTime:[theEvent timestamp]];
+
+                if (CGEventGetIntegerValueField(cgevent, kCGScrollWheelEventIsContinuous))
+                {
+                    continuous = TRUE;
+
+                    /* Continuous scroll wheel events come from high-precision scrolling
+                       hardware like Apple's Magic Mouse, Mighty Mouse, and trackpads.
+                       For these, we can get more precise data from the CGEvent API. */
+                    /* Axis 1 is vertical, axis 2 is horizontal. */
+                    x = CGEventGetDoubleValueField(cgevent, kCGScrollWheelEventPointDeltaAxis2);
+                    y = CGEventGetDoubleValueField(cgevent, kCGScrollWheelEventPointDeltaAxis1);
+                }
+                else
+                {
+                    double pixelsPerLine = 10;
+                    CGEventSourceRef source;
+
+                    /* The non-continuous values are in units of "lines", not pixels. */
+                    if ((source = CGEventCreateSourceFromEvent(cgevent)))
+                    {
+                        pixelsPerLine = CGEventSourceGetPixelsPerLine(source);
+                        CFRelease(source);
+                    }
+
+                    x = pixelsPerLine * [theEvent deltaX];
+                    y = pixelsPerLine * [theEvent deltaY];
+                }
+
+                /* Mac: negative is right or down, positive is left or up.
+                   Win32: negative is left or down, positive is right or up.
+                   So, negate the X scroll value to translate. */
+                x = -x;
+
+                /* The x,y values so far are in pixels.  Win32 expects to receive some
+                   fraction of WHEEL_DELTA == 120.  By my estimation, that's roughly
+                   6 times the pixel value. */
+                event->mouse_scroll.x_scroll = 6 * x;
+                event->mouse_scroll.y_scroll = 6 * y;
+
+                if (!continuous)
+                {
+                    /* For non-continuous "clicky" wheels, if there was any motion, make
+                       sure there was at least WHEEL_DELTA motion.  This is so, at slow
+                       speeds where the system's acceleration curve is actually reducing the
+                       scroll distance, the user is sure to get some action out of each click.
+                       For example, this is important for rotating though weapons in a
+                       first-person shooter. */
+                    if (0 < event->mouse_scroll.x_scroll && event->mouse_scroll.x_scroll < 120)
+                        event->mouse_scroll.x_scroll = 120;
+                    else if (-120 < event->mouse_scroll.x_scroll && event->mouse_scroll.x_scroll < 0)
+                        event->mouse_scroll.x_scroll = -120;
+
+                    if (0 < event->mouse_scroll.y_scroll && event->mouse_scroll.y_scroll < 120)
+                        event->mouse_scroll.y_scroll = 120;
+                    else if (-120 < event->mouse_scroll.y_scroll && event->mouse_scroll.y_scroll < 0)
+                        event->mouse_scroll.y_scroll = -120;
+                }
+
+                if (event->mouse_scroll.x_scroll || event->mouse_scroll.y_scroll)
+                    [window.queue postEvent:event];
+
+                macdrv_release_event(event);
+
+                // Since scroll wheel events deliver absolute cursor position, the
+                // accumulating delta from move events is invalidated.  Make sure next
+                // mouse move event starts over from an absolute baseline.
+                forceNextMouseMoveAbsolute = TRUE;
+            }
+        }
+    }
+
     // Returns TRUE if the event was handled and caller should do nothing more
     // with it.  Returns FALSE if the caller should process it as normal and
     // then call -didSendEvent:.
@@ -1327,10 +1420,7 @@ int macdrv_err_on;
         }
         else if (type == NSScrollWheel)
         {
-            // Since scroll wheel events deliver absolute cursor position, the
-            // accumulating delta from move events is invalidated.  Make sure next
-            // mouse move event starts over from an absolute baseline.
-            forceNextMouseMoveAbsolute = TRUE;
+            [self handleScrollWheel:anEvent];
         }
         else if (type == NSKeyDown && ![anEvent isARepeat] && [anEvent keyCode] == kVK_Tab)
         {
diff --git a/dlls/winemac.drv/cocoa_window.m b/dlls/winemac.drv/cocoa_window.m
index 0a751bd..ae69479 100644
--- a/dlls/winemac.drv/cocoa_window.m
+++ b/dlls/winemac.drv/cocoa_window.m
@@ -1102,85 +1102,6 @@ static inline void fix_generic_modifiers_by_device(NSUInteger* modifiers)
         }
     }
 
-    - (void) scrollWheel:(NSEvent *)theEvent
-    {
-        CGPoint pt;
-        macdrv_event* event;
-        CGEventRef cgevent;
-        CGFloat x, y;
-        BOOL continuous = FALSE;
-
-        cgevent = [theEvent CGEvent];
-        pt = CGEventGetLocation(cgevent);
-
-        event = macdrv_create_event(MOUSE_SCROLL, self);
-        event->mouse_scroll.x = pt.x;
-        event->mouse_scroll.y = pt.y;
-        event->mouse_scroll.time_ms = [[WineApplicationController sharedController] ticksForEventTime:[theEvent timestamp]];
-
-        if (CGEventGetIntegerValueField(cgevent, kCGScrollWheelEventIsContinuous))
-        {
-            continuous = TRUE;
-
-            /* Continuous scroll wheel events come from high-precision scrolling
-               hardware like Apple's Magic Mouse, Mighty Mouse, and trackpads.
-               For these, we can get more precise data from the CGEvent API. */
-            /* Axis 1 is vertical, axis 2 is horizontal. */
-            x = CGEventGetDoubleValueField(cgevent, kCGScrollWheelEventPointDeltaAxis2);
-            y = CGEventGetDoubleValueField(cgevent, kCGScrollWheelEventPointDeltaAxis1);
-        }
-        else
-        {
-            double pixelsPerLine = 10;
-            CGEventSourceRef source;
-
-            /* The non-continuous values are in units of "lines", not pixels. */
-            if ((source = CGEventCreateSourceFromEvent(cgevent)))
-            {
-                pixelsPerLine = CGEventSourceGetPixelsPerLine(source);
-                CFRelease(source);
-            }
-
-            x = pixelsPerLine * [theEvent deltaX];
-            y = pixelsPerLine * [theEvent deltaY];
-        }
-
-        /* Mac: negative is right or down, positive is left or up.
-           Win32: negative is left or down, positive is right or up.
-           So, negate the X scroll value to translate. */
-        x = -x;
-
-        /* The x,y values so far are in pixels.  Win32 expects to receive some
-           fraction of WHEEL_DELTA == 120.  By my estimation, that's roughly
-           6 times the pixel value. */
-        event->mouse_scroll.x_scroll = 6 * x;
-        event->mouse_scroll.y_scroll = 6 * y;
-
-        if (!continuous)
-        {
-            /* For non-continuous "clicky" wheels, if there was any motion, make
-               sure there was at least WHEEL_DELTA motion.  This is so, at slow
-               speeds where the system's acceleration curve is actually reducing the
-               scroll distance, the user is sure to get some action out of each click.
-               For example, this is important for rotating though weapons in a
-               first-person shooter. */
-            if (0 < event->mouse_scroll.x_scroll && event->mouse_scroll.x_scroll < 120)
-                event->mouse_scroll.x_scroll = 120;
-            else if (-120 < event->mouse_scroll.x_scroll && event->mouse_scroll.x_scroll < 0)
-                event->mouse_scroll.x_scroll = -120;
-
-            if (0 < event->mouse_scroll.y_scroll && event->mouse_scroll.y_scroll < 120)
-                event->mouse_scroll.y_scroll = 120;
-            else if (-120 < event->mouse_scroll.y_scroll && event->mouse_scroll.y_scroll < 0)
-                event->mouse_scroll.y_scroll = -120;
-        }
-
-        if (event->mouse_scroll.x_scroll || event->mouse_scroll.y_scroll)
-            [queue postEvent:event];
-
-        macdrv_release_event(event);
-    }
-
 
     /*
      * ---------- NSWindowDelegate methods ----------




More information about the wine-cvs mailing list