diff --git a/Source/OpenTK/OpenTK.csproj b/Source/OpenTK/OpenTK.csproj
index eab2002c..333f516c 100644
--- a/Source/OpenTK/OpenTK.csproj
+++ b/Source/OpenTK/OpenTK.csproj
@@ -2,7 +2,7 @@
Local
- 8.0.50727
+ 8.0.30703
2.0
{A37A7E14-0000-0000-0000-000000000000}
Debug
@@ -783,21 +783,22 @@
Code
-
- Code
-
Code
-
- Code
-
+
+
+ Code
+
+
+ Code
+
@@ -827,4 +828,7 @@
+
+
+
\ No newline at end of file
diff --git a/Source/OpenTK/Platform/MacOS/Cocoa/NSApplication.cs b/Source/OpenTK/Platform/MacOS/Cocoa/NSApplication.cs
index 16738e46..30e61ce6 100644
--- a/Source/OpenTK/Platform/MacOS/Cocoa/NSApplication.cs
+++ b/Source/OpenTK/Platform/MacOS/Cocoa/NSApplication.cs
@@ -89,7 +89,7 @@ namespace OpenTK.Platform.MacOS
// Initialize and register the settings dictionary
settings =
Cocoa.SendIntPtr(settings, Selector.Get("initWithObjectsAndKeys:"),
- momentum_scrolling, Cocoa.ToNSString("AppleMomentumScrollSupported"),
+ //momentum_scrolling, Cocoa.ToNSString("AppleMomentumScrollSupported"),
press_and_hold, Cocoa.ToNSString("ApplePressAndHoldEnabled"),
IntPtr.Zero);
Cocoa.SendVoid(
diff --git a/Source/OpenTK/Platform/MacOS/CocoaNativeWindow.cs b/Source/OpenTK/Platform/MacOS/CocoaNativeWindow.cs
index 701b0bb7..f873ad3c 100644
--- a/Source/OpenTK/Platform/MacOS/CocoaNativeWindow.cs
+++ b/Source/OpenTK/Platform/MacOS/CocoaNativeWindow.cs
@@ -144,9 +144,6 @@ namespace OpenTK.Platform.MacOS
private bool cursorInsideWindow = true;
private MouseCursor selectedCursor = MouseCursor.Default; // user-selected cursor
- private const float scrollFactor = 10.0f;
- private const bool exclusiveFullscreen = false;
-
public CocoaNativeWindow(int x, int y, int width, int height, string title, GraphicsMode mode, GameWindowFlags options, DisplayDevice device)
{
// Create the window class
@@ -527,8 +524,8 @@ namespace OpenTK.Platform.MacOS
float dx, dy;
if (Cocoa.SendBool(e, selHasPreciseScrollingDeltas))
{
- dx = Cocoa.SendFloat(e, selScrollingDeltaX) / scrollFactor;
- dy = Cocoa.SendFloat(e, selScrollingDeltaY) / scrollFactor;
+ dx = Cocoa.SendFloat(e, selScrollingDeltaX) * MacOSFactory.ScrollFactor;
+ dy = Cocoa.SendFloat(e, selScrollingDeltaY) * MacOSFactory.ScrollFactor;
}
else
{
@@ -675,9 +672,9 @@ namespace OpenTK.Platform.MacOS
if (windowState == WindowState.Fullscreen)
{
SetMenuVisible(true);
- if (exclusiveFullscreen)
+ if (MacOSFactory.ExclusiveFullscreen)
{
- OpenTK.Platform.MacOS.Carbon.CG.DisplayReleaseAll();
+ CG.DisplayReleaseAll();
Cocoa.SendVoid(windowInfo.Handle, selSetLevel, normalLevel);
}
@@ -736,12 +733,12 @@ namespace OpenTK.Platform.MacOS
if (value == WindowState.Fullscreen)
{
- if (exclusiveFullscreen)
+ if (MacOSFactory.ExclusiveFullscreen)
{
normalLevel = Cocoa.SendInt(windowInfo.Handle, selLevel);
- var windowLevel = OpenTK.Platform.MacOS.Carbon.CG.ShieldingWindowLevel();
+ var windowLevel = CG.ShieldingWindowLevel();
- OpenTK.Platform.MacOS.Carbon.CG.CaptureAllDisplays();
+ CG.CaptureAllDisplays();
Cocoa.SendVoid(windowInfo.Handle, selSetLevel, windowLevel);
}
@@ -1074,7 +1071,7 @@ namespace OpenTK.Platform.MacOS
Mouse.SetPosition((int)p.X, (int)p.Y);
}
- Carbon.CG.AssociateMouseAndMouseCursorPosition(visible);
+ CG.AssociateMouseAndMouseCursorPosition(visible);
Cocoa.SendVoid(NSCursor, visible ? selUnhide : selHide);
}
diff --git a/Source/OpenTK/Platform/MacOS/HIDInput.cs b/Source/OpenTK/Platform/MacOS/HIDInput.cs
index ecfa3e3d..2483fde5 100755
--- a/Source/OpenTK/Platform/MacOS/HIDInput.cs
+++ b/Source/OpenTK/Platform/MacOS/HIDInput.cs
@@ -100,6 +100,10 @@ namespace OpenTK.Platform.MacOS
readonly MappedGamePadDriver mapped_gamepad = new MappedGamePadDriver();
+ IntPtr MouseEventTap;
+ IntPtr MouseEventTapSource;
+ MouseState CursorState;
+
NativeMethods.IOHIDDeviceCallback HandleDeviceAdded;
NativeMethods.IOHIDDeviceCallback HandleDeviceRemoved;
NativeMethods.IOHIDValueCallback HandleDeviceValueReceived;
@@ -118,14 +122,93 @@ namespace OpenTK.Platform.MacOS
HandleDeviceRemoved = DeviceRemoved;
HandleDeviceValueReceived = DeviceValueReceived;
+ // For retrieving input directly from the hardware
hidmanager = CreateHIDManager();
RegisterHIDCallbacks(hidmanager);
+
+ // For retrieving the global cursor position
+ RegisterMouseMonitor();
}
#endregion
#region Private Members
+ void RegisterMouseMonitor()
+ {
+ Debug.Write("Creating mouse event monitor... ");
+ MouseEventTapDelegate = MouseEventTapCallback;
+ MouseEventTap = CG.EventTapCreate(
+ CGEventTapLocation.HIDEventTap,
+ CGEventTapPlacement.HeadInsert,
+ CGEventTapOptions.ListenOnly,
+ CGEventMask.AllMouse,
+ MouseEventTapDelegate,
+ IntPtr.Zero);
+
+ if (MouseEventTap != IntPtr.Zero)
+ {
+ MouseEventTapSource = CF.MachPortCreateRunLoopSource(IntPtr.Zero, MouseEventTap, IntPtr.Zero);
+ CF.RunLoopAddSource(RunLoop, MouseEventTapSource, CF.RunLoopModeDefault);
+ }
+
+ Debug.WriteLine(
+ MouseEventTap != IntPtr.Zero && MouseEventTapSource != IntPtr.Zero ?
+ "success!" : "failed.");
+ }
+
+ CG.EventTapCallBack MouseEventTapDelegate;
+ IntPtr MouseEventTapCallback(
+ IntPtr proxy,
+ CGEventType type,
+ IntPtr @event,
+ IntPtr refcon)
+ {
+ CursorState.SetIsConnected(true);
+
+ switch (type)
+ {
+ case CGEventType.MouseMoved:
+ case CGEventType.LeftMouseDragged:
+ case CGEventType.RightMouseDragged:
+ case CGEventType.OtherMouseDragged:
+ {
+ Carbon.HIPoint p = CG.EventGetLocation(@event);
+ CursorState.X = (int)Math.Round(p.X);
+ CursorState.Y = (int)Math.Round(p.Y);
+ }
+ break;
+
+ case CGEventType.ScrollWheel:
+ CursorState.SetScrollRelative(
+ (float)CG.EventGetDoubleValueField(@event, CGEventField.ScrollWheelEventPointDeltaAxis2) * MacOSFactory.ScrollFactor,
+ (float)CG.EventGetDoubleValueField(@event, CGEventField.ScrollWheelEventPointDeltaAxis1) * MacOSFactory.ScrollFactor);
+ break;
+
+ case CGEventType.LeftMouseDown:
+ case CGEventType.RightMouseDown:
+ case CGEventType.OtherMouseDown:
+ {
+ int n = CG.EventGetIntegerValueField(@event, CGEventField.MouseEventButtonNumber);
+ MouseButton b = MouseButton.Left + n;
+ CursorState[b] = true;
+ }
+ break;
+
+ case CGEventType.LeftMouseUp:
+ case CGEventType.RightMouseUp:
+ case CGEventType.OtherMouseUp:
+ {
+ int n = CG.EventGetIntegerValueField(@event, CGEventField.MouseEventButtonNumber);
+ MouseButton b = MouseButton.Left + n;
+ CursorState[b] = false;
+ }
+ break;
+ }
+
+ return @event;
+ }
+
IOHIDManagerRef CreateHIDManager()
{
return NativeMethods.IOHIDManagerCreate(IntPtr.Zero, IntPtr.Zero);
@@ -836,10 +919,7 @@ namespace OpenTK.Platform.MacOS
MouseState IMouseDriver2.GetCursorState()
{
- var state = new MouseState();
- state.SetIsConnected(true);
-
- return state;
+ return CursorState;
}
void IMouseDriver2.SetPosition(double x, double y)
@@ -1658,6 +1738,17 @@ namespace OpenTK.Platform.MacOS
HandleDeviceAdded = null;
HandleDeviceRemoved = null;
HandleDeviceValueReceived = null;
+
+ if (MouseEventTap != IntPtr.Zero)
+ {
+ CF.CFRelease(MouseEventTap);
+ MouseEventTap = IntPtr.Zero;
+ }
+ if (MouseEventTapSource != IntPtr.Zero)
+ {
+ CF.CFRelease(MouseEventTapSource);
+ MouseEventTapSource = IntPtr.Zero;
+ }
}
else
{
diff --git a/Source/OpenTK/Platform/MacOS/MacOSFactory.cs b/Source/OpenTK/Platform/MacOS/MacOSFactory.cs
index d96b0a0b..9c79119b 100644
--- a/Source/OpenTK/Platform/MacOS/MacOSFactory.cs
+++ b/Source/OpenTK/Platform/MacOS/MacOSFactory.cs
@@ -37,6 +37,9 @@ namespace OpenTK.Platform.MacOS
class MacOSFactory : PlatformFactoryBase
{
+ internal const float ScrollFactor = 0.1f;
+ internal static bool ExclusiveFullscreen = false;
+
readonly IInputDriver2 InputDriver = new HIDInput();
#region IPlatformFactory Members
diff --git a/Source/OpenTK/Platform/MacOS/Carbon/CoreFoundation.cs b/Source/OpenTK/Platform/MacOS/Quartz/CoreFoundation.cs
similarity index 92%
rename from Source/OpenTK/Platform/MacOS/Carbon/CoreFoundation.cs
rename to Source/OpenTK/Platform/MacOS/Quartz/CoreFoundation.cs
index bec5c6f0..6b5c8818 100644
--- a/Source/OpenTK/Platform/MacOS/Carbon/CoreFoundation.cs
+++ b/Source/OpenTK/Platform/MacOS/Quartz/CoreFoundation.cs
@@ -32,10 +32,14 @@ using System.Text;
namespace OpenTK.Platform.MacOS.Carbon
{
+ using CFAllocatorRef = IntPtr;
using CFIndex = System.IntPtr;
using CFRunLoop = System.IntPtr;
+ using CFRunLoopRef = IntPtr;
+ using CFRunLoopSourceRef = IntPtr;
using CFStringRef = System.IntPtr;
using CFTypeRef = System.IntPtr;
+ using CFMachPortRef = IntPtr;
struct CFArray
{
@@ -214,5 +218,17 @@ namespace OpenTK.Platform.MacOS.Carbon
[DllImport(appServices)]
internal static extern CFRunLoopExitReason CFRunLoopRunInMode(
IntPtr cfstrMode, double interval, bool returnAfterSourceHandled);
+
+ [DllImport(appServices, EntryPoint = "CFMachPortCreateRunLoopSource")]
+ internal static extern CFRunLoopSourceRef MachPortCreateRunLoopSource(
+ CFAllocatorRef allocator,
+ CFMachPortRef port,
+ CFIndex order);
+
+ [DllImport(appServices, EntryPoint = "CFRunLoopAddSource")]
+ internal static extern void RunLoopAddSource(
+ CFRunLoopRef rl,
+ CFRunLoopSourceRef source,
+ CFStringRef mode);
}
}
diff --git a/Source/OpenTK/Platform/MacOS/Carbon/QuartzDisplayServicesAPI.cs b/Source/OpenTK/Platform/MacOS/Quartz/DisplayServices.cs
similarity index 72%
rename from Source/OpenTK/Platform/MacOS/Carbon/QuartzDisplayServicesAPI.cs
rename to Source/OpenTK/Platform/MacOS/Quartz/DisplayServices.cs
index c4aa0ea4..9a1b3d10 100644
--- a/Source/OpenTK/Platform/MacOS/Carbon/QuartzDisplayServicesAPI.cs
+++ b/Source/OpenTK/Platform/MacOS/Quartz/DisplayServices.cs
@@ -28,8 +28,9 @@
using System;
using System.Runtime.InteropServices;
using System.Diagnostics;
+using OpenTK.Platform.MacOS.Carbon;
-namespace OpenTK.Platform.MacOS.Carbon
+namespace OpenTK.Platform.MacOS
{
using CGDirectDisplayID = System.IntPtr;
@@ -55,18 +56,18 @@ namespace OpenTK.Platform.MacOS.Carbon
NoneAvailable = 1011,
}
- internal static class CG
+ partial class CG
{
- const string appServices = "/System/Library/Frameworks/ApplicationServices.framework/Versions/Current/ApplicationServices";
+ const string lib = "/System/Library/Frameworks/ApplicationServices.framework/Versions/Current/ApplicationServices";
// CGPoint -> HIPoint
// CGSize -> HISize
// CGRect -> HIRect
- [DllImport(appServices,EntryPoint="CGGetActiveDisplayList")]
+ [DllImport(lib,EntryPoint="CGGetActiveDisplayList")]
internal unsafe static extern CGDisplayErr GetActiveDisplayList(int maxDisplays, IntPtr* activeDspys, out int dspyCnt);
- [DllImport(appServices,EntryPoint="CGMainDisplayID")]
+ [DllImport(lib,EntryPoint="CGMainDisplayID")]
internal static extern IntPtr MainDisplayID();
// Note: sizeof(HIRect) == 16, which is larger than 8 bytes.
@@ -81,55 +82,55 @@ namespace OpenTK.Platform.MacOS.Carbon
return rect;
}
- [DllImport(appServices, EntryPoint = "CGDisplayBounds")]
+ [DllImport(lib, EntryPoint = "CGDisplayBounds")]
unsafe static extern void DisplayBounds(out HIRect rect, IntPtr display);
- [DllImport(appServices,EntryPoint="CGDisplayPixelsWide")]
+ [DllImport(lib,EntryPoint="CGDisplayPixelsWide")]
internal static extern int DisplayPixelsWide(IntPtr display);
- [DllImport(appServices,EntryPoint="CGDisplayPixelsHigh")]
+ [DllImport(lib,EntryPoint="CGDisplayPixelsHigh")]
internal static extern int DisplayPixelsHigh(IntPtr display);
- [DllImport(appServices,EntryPoint="CGDisplayCurrentMode")]
+ [DllImport(lib,EntryPoint="CGDisplayCurrentMode")]
internal static extern IntPtr DisplayCurrentMode(IntPtr display);
- [DllImport(appServices,EntryPoint="CGDisplayCapture")]
+ [DllImport(lib,EntryPoint="CGDisplayCapture")]
internal static extern CGDisplayErr DisplayCapture(IntPtr display);
- [DllImport(appServices,EntryPoint="CGCaptureAllDisplays")]
+ [DllImport(lib,EntryPoint="CGCaptureAllDisplays")]
internal static extern CGDisplayErr CaptureAllDisplays();
- [DllImport(appServices,EntryPoint="CGShieldingWindowLevel")]
+ [DllImport(lib,EntryPoint="CGShieldingWindowLevel")]
internal static extern uint ShieldingWindowLevel();
- [DllImport(appServices,EntryPoint="CGDisplayRelease")]
+ [DllImport(lib,EntryPoint="CGDisplayRelease")]
internal static extern CGDisplayErr DisplayRelease(IntPtr display);
- [DllImport(appServices,EntryPoint="CGReleaseAllDisplays")]
+ [DllImport(lib,EntryPoint="CGReleaseAllDisplays")]
internal static extern CGDisplayErr DisplayReleaseAll();
- [DllImport(appServices, EntryPoint = "CGDisplayAvailableModes")]
+ [DllImport(lib, EntryPoint = "CGDisplayAvailableModes")]
internal static extern IntPtr DisplayAvailableModes(IntPtr display);
- [DllImport(appServices, EntryPoint = "CGDisplaySwitchToMode")]
+ [DllImport(lib, EntryPoint = "CGDisplaySwitchToMode")]
internal static extern IntPtr DisplaySwitchToMode(IntPtr display, IntPtr displayMode);
- [DllImport(appServices, EntryPoint = "CGWarpMouseCursorPosition")]
+ [DllImport(lib, EntryPoint = "CGWarpMouseCursorPosition")]
internal static extern CGError WarpMouseCursorPosition(HIPoint newCursorPosition);
- [DllImport(appServices, EntryPoint = "CGCursorIsVisible")]
+ [DllImport(lib, EntryPoint = "CGCursorIsVisible")]
internal static extern bool CursorIsVisible();
- [DllImport(appServices, EntryPoint = "CGDisplayShowCursor")]
+ [DllImport(lib, EntryPoint = "CGDisplayShowCursor")]
internal static extern CGError DisplayShowCursor(CGDirectDisplayID display);
- [DllImport(appServices, EntryPoint = "CGDisplayHideCursor")]
+ [DllImport(lib, EntryPoint = "CGDisplayHideCursor")]
internal static extern CGError DisplayHideCursor(CGDirectDisplayID display);
- [DllImport(appServices, EntryPoint = "CGAssociateMouseAndMouseCursorPosition")]
+ [DllImport(lib, EntryPoint = "CGAssociateMouseAndMouseCursorPosition")]
internal static extern CGError AssociateMouseAndMouseCursorPosition(bool connected);
- [DllImport(appServices, EntryPoint="CGSetLocalEventsSuppressionInterval")]
+ [DllImport(lib, EntryPoint="CGSetLocalEventsSuppressionInterval")]
internal static extern CGError SetLocalEventsSuppressionInterval(double seconds);
}
}
diff --git a/Source/OpenTK/Platform/MacOS/Quartz/EventServices.cs b/Source/OpenTK/Platform/MacOS/Quartz/EventServices.cs
new file mode 100644
index 00000000..7e61bdd2
--- /dev/null
+++ b/Source/OpenTK/Platform/MacOS/Quartz/EventServices.cs
@@ -0,0 +1,198 @@
+#region License
+//
+// EventServices.cs
+//
+// Author:
+// Stefanos A.
+//
+// Copyright (c) 2006-2014 Stefanos Apostolopoulos
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+//
+#endregion
+
+using System;
+using System.Runtime.InteropServices;
+
+namespace OpenTK.Platform.MacOS
+{
+ using CGEventTapProxy = IntPtr;
+ using CGEventRef = IntPtr;
+ using CFMachPortRef = IntPtr;
+
+ partial class CG
+ {
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ public delegate CGEventRef EventTapCallBack(
+ CGEventTapProxy proxy,
+ CGEventType type,
+ CGEventRef @event,
+ IntPtr refcon);
+
+ [DllImport(lib, EntryPoint = "CGEventTapCreate")]
+ public static extern CFMachPortRef EventTapCreate(
+ CGEventTapLocation tap,
+ CGEventTapPlacement place,
+ CGEventTapOptions options,
+ CGEventMask eventsOfInterest,
+ [MarshalAs(UnmanagedType.FunctionPtr)]
+ EventTapCallBack callback,
+ IntPtr refcon);
+
+ [DllImport(lib, EntryPoint = "CGEventGetDoubleValueField")]
+ internal static extern double EventGetDoubleValueField(
+ CGEventRef @event,
+ CGEventField field);
+
+ [DllImport(lib, EntryPoint = "CGEventGetIntegerValueField")]
+ internal static extern int EventGetIntegerValueField(
+ CGEventRef @event,
+ CGEventField field);
+
+ [DllImport(lib, EntryPoint = "CGEventGetLocation")]
+ internal static extern Carbon.HIPoint EventGetLocation(CGEventRef @event);
+ }
+
+ enum CGEventTapLocation
+ {
+ HIDEventTap = 0,
+ SessionEventTap,
+ AnnotatedSessionEventTap
+ }
+
+ enum CGEventTapPlacement
+ {
+ HeadInsert = 0,
+ TailAppend
+ }
+
+ enum CGEventTapOptions
+ {
+ Default = 0x00000000,
+ ListenOnly = 0x00000001
+ }
+
+ [Flags]
+ enum CGEventMask : long
+ {
+ LeftMouseDown = 1 << CGEventType.LeftMouseDown,
+ LeftMouseUp = 1 << CGEventType.LeftMouseUp,
+ RightMouseDown = 1 << CGEventType.RightMouseDown,
+ RightMouseUp = 1 << CGEventType.RightMouseUp,
+ MouseMoved = 1 << CGEventType.MouseMoved,
+ LeftMouseDragged = 1 << CGEventType.LeftMouseDown,
+ RightMouseDragged = 1 << CGEventType.RightMouseDown,
+ KeyDown = 1 << CGEventType.KeyDown,
+ KeyUp = 1 << CGEventType.KeyUp,
+ FlagsChanged = 1 << CGEventType.FlagsChanged,
+ ScrollWheel = 1 << CGEventType.ScrollWheel,
+ TabletPointer = 1 << CGEventType.TabletPointer,
+ TabletProximity = 1 << CGEventType.TabletProximity,
+ OtherMouseDown = 1 << CGEventType.OtherMouseDown,
+ OtherMouseUp = 1 << CGEventType.OtherMouseUp,
+ OtherMouseDragged = 1 << CGEventType.OtherMouseDragged,
+ All = -1,
+ AllMouse =
+ LeftMouseDown | LeftMouseUp | LeftMouseDragged |
+ RightMouseDown | RightMouseUp | RightMouseDragged |
+ OtherMouseDown | OtherMouseUp | OtherMouseDragged |
+ ScrollWheel | MouseMoved
+ }
+
+ enum CGEventType
+ {
+ Null = 0,
+ LeftMouseDown = 1,
+ LeftMouseUp = 2,
+ RightMouseDown = 3,
+ RightMouseUp = 4,
+ MouseMoved = 5,
+ LeftMouseDragged = 6,
+ RightMouseDragged = 7,
+ KeyDown = 10,
+ KeyUp = 11,
+ FlagsChanged = 12,
+ ScrollWheel = 22,
+ TabletPointer = 23,
+ TabletProximity = 24,
+ OtherMouseDown = 25,
+ OtherMouseUp = 26,
+ OtherMouseDragged = 27,
+ TapDisabledByTimeout = -2,
+ TapDisabledByUserInput = -1
+ }
+
+ enum CGEventField
+ {
+ MouseEventNumber = 0,
+ MouseEventClickState = 1,
+ MouseEventPressure = 2,
+ MouseEventButtonNumber = 3,
+ MouseEventDeltaX = 4,
+ MouseEventDeltaY = 5,
+ MouseEventInstantMouser = 6,
+ MouseEventSubtype = 7,
+ KeyboardEventAutorepeat = 8,
+ KeyboardEventKeycode = 9,
+ KeyboardEventKeyboardType = 10,
+ ScrollWheelEventDeltaAxis1 = 11,
+ ScrollWheelEventDeltaAxis2 = 12,
+ ScrollWheelEventDeltaAxis3 = 13,
+ ScrollWheelEventFixedPtDeltaAxis1 = 93,
+ ScrollWheelEventFixedPtDeltaAxis2 = 94,
+ ScrollWheelEventFixedPtDeltaAxis3 = 95,
+ ScrollWheelEventPointDeltaAxis1 = 96,
+ ScrollWheelEventPointDeltaAxis2 = 97,
+ ScrollWheelEventPointDeltaAxis3 = 98,
+ ScrollWheelEventInstantMouser = 14,
+ TabletEventPointX = 15,
+ TabletEventPointY = 16,
+ TabletEventPointZ = 17,
+ TabletEventPointButtons = 18,
+ TabletEventPointPressure = 19,
+ TabletEventTiltX = 20,
+ TabletEventTiltY = 21,
+ TabletEventRotation = 22,
+ TabletEventTangentialPressure = 23,
+ TabletEventDeviceID = 24,
+ TabletEventVendor1 = 25,
+ TabletEventVendor2 = 26,
+ TabletEventVendor3 = 27,
+ TabletProximityEventVendorID = 28,
+ TabletProximityEventTabletID = 29,
+ TabletProximityEventPointerID = 30,
+ TabletProximityEventDeviceID = 31,
+ TabletProximityEventSystemTabletID = 32,
+ TabletProximityEventVendorPointerType = 33,
+ TabletProximityEventVendorPointerSerialNumber = 34,
+ TabletProximityEventVendorUniqueID = 35,
+ TabletProximityEventCapabilityMask = 36,
+ TabletProximityEventPointerType = 37,
+ TabletProximityEventEnterProximity = 38,
+ EventTargetProcessSerialNumber = 39,
+ EventTargetUnixProcessID = 40,
+ EventSourceUnixProcessID = 41,
+ EventSourceUserData = 42,
+ EventSourceUserID = 43,
+ EventSourceGroupID = 44,
+ EventSourceStateID = 45,
+ ScrollWheelEventIsContinuous = 88
+ }
+}
+