Merge pull request #134 from thefiddler/scrollfix

[Mac][X11] Match win32 wheel coordinate system
This commit is contained in:
thefiddler 2014-06-11 07:41:38 +02:00
commit bc555efd03
4 changed files with 27 additions and 5 deletions

View file

@ -540,7 +540,10 @@ namespace OpenTK.Platform.MacOS
// Only raise wheel events when the user has actually scrolled // Only raise wheel events when the user has actually scrolled
if (dx != 0 || dy != 0) if (dx != 0 || dy != 0)
{ {
OnMouseWheel(dx, dy); // Note: OpenTK follows the win32 convention, where
// (+h, +v) = (right, up). MacOS reports (+h, +v) = (left, up)
// so we need to flip the horizontal scroll direction.
OnMouseWheel(-dx, dy);
} }
} }
break; break;

View file

@ -180,9 +180,14 @@ namespace OpenTK.Platform.MacOS
break; break;
case CGEventType.ScrollWheel: case CGEventType.ScrollWheel:
CursorState.SetScrollRelative( {
(float)CG.EventGetDoubleValueField(@event, CGEventField.ScrollWheelEventPointDeltaAxis2) * MacOSFactory.ScrollFactor, // Note: OpenTK follows the win32 convention, where
(float)CG.EventGetDoubleValueField(@event, CGEventField.ScrollWheelEventPointDeltaAxis1) * MacOSFactory.ScrollFactor); // (+h, +v) = (right, up). MacOS reports (+h, +v) = (left, up)
// so we need to flip the horizontal scroll direction.
double h = CG.EventGetDoubleValueField(@event, CGEventField.ScrollWheelEventPointDeltaAxis2) * MacOSFactory.ScrollFactor;
double v = CG.EventGetDoubleValueField(@event, CGEventField.ScrollWheelEventPointDeltaAxis1) * MacOSFactory.ScrollFactor;
CursorState.SetScrollRelative((float)(-h), (float)v);
}
break; break;
case CGEventType.LeftMouseDown: case CGEventType.LeftMouseDown:
@ -190,6 +195,7 @@ namespace OpenTK.Platform.MacOS
case CGEventType.OtherMouseDown: case CGEventType.OtherMouseDown:
{ {
int n = CG.EventGetIntegerValueField(@event, CGEventField.MouseEventButtonNumber); int n = CG.EventGetIntegerValueField(@event, CGEventField.MouseEventButtonNumber);
n = n == 1 ? 2 : n == 2 ? 1 : n; // flip middle and right button numbers to match OpenTK
MouseButton b = MouseButton.Left + n; MouseButton b = MouseButton.Left + n;
CursorState[b] = true; CursorState[b] = true;
} }
@ -200,6 +206,7 @@ namespace OpenTK.Platform.MacOS
case CGEventType.OtherMouseUp: case CGEventType.OtherMouseUp:
{ {
int n = CG.EventGetIntegerValueField(@event, CGEventField.MouseEventButtonNumber); int n = CG.EventGetIntegerValueField(@event, CGEventField.MouseEventButtonNumber);
n = n == 1 ? 2 : n == 2 ? 1 : n; // flip middle and right button numbers to match OpenTK
MouseButton b = MouseButton.Left + n; MouseButton b = MouseButton.Left + n;
CursorState[b] = false; CursorState[b] = false;
} }
@ -406,6 +413,11 @@ namespace OpenTK.Platform.MacOS
mouse.State.Y += v_int; mouse.State.Y += v_int;
break; break;
case HIDUsageGD.Z:
// Horizontal scrolling for apple mouse (old-style with trackball)
mouse.State.SetScrollRelative(v_int, 0);
break;
case HIDUsageGD.Wheel: case HIDUsageGD.Wheel:
mouse.State.SetScrollRelative(0, v_int); mouse.State.SetScrollRelative(0, v_int);
break; break;

View file

@ -37,6 +37,9 @@ namespace OpenTK.Platform.MacOS
class MacOSFactory : PlatformFactoryBase class MacOSFactory : PlatformFactoryBase
{ {
// Todo: we can query the exact amount via
// CGEventSourceGetPixelsPerLine. This is
// approximately 0.1f
internal const float ScrollFactor = 0.1f; internal const float ScrollFactor = 0.1f;
internal static bool ExclusiveFullscreen = false; internal static bool ExclusiveFullscreen = false;

View file

@ -544,7 +544,11 @@ namespace OpenTK.Platform.X11
d.State.X += (int)Math.Round(x); d.State.X += (int)Math.Round(x);
d.State.Y += (int)Math.Round(y); d.State.Y += (int)Math.Round(y);
d.State.SetScrollRelative((float)h, (float)v);
// Note: OpenTK follows the windows scrolling convention where
// (+h, +v) = (right, up). XI2 uses (+h, +v) = (right, down)
// instead, so we need to flip the vertical offset.
d.State.SetScrollRelative((float)h, (float)(-v));
} }
unsafe static double ReadRawValue(ref XIRawEvent raw, int bit) unsafe static double ReadRawValue(ref XIRawEvent raw, int bit)