From 96aaef9b3747c780f37220ee15be6d01e4d72320 Mon Sep 17 00:00:00 2001 From: thefiddler Date: Sat, 10 May 2014 17:54:34 +0200 Subject: [PATCH] [Mac] Implemented Mouse.GetCursorState() --- Source/OpenTK/OpenTK.csproj | 18 +- .../OpenTK/Platform/MacOS/Cocoa/NSApplication.cs | 2 +- Source/OpenTK/Platform/MacOS/CocoaNativeWindow.cs | 19 +- Source/OpenTK/Platform/MacOS/HIDInput.cs | 99 ++++++++++- Source/OpenTK/Platform/MacOS/MacOSFactory.cs | 3 + .../MacOS/{Carbon => Quartz}/CoreFoundation.cs | 16 ++ .../DisplayServices.cs} | 45 ++--- .../OpenTK/Platform/MacOS/Quartz/EventServices.cs | 198 +++++++++++++++++++++ 8 files changed, 355 insertions(+), 45 deletions(-) rename Source/OpenTK/Platform/MacOS/{Carbon => Quartz}/CoreFoundation.cs (92%) rename Source/OpenTK/Platform/MacOS/{Carbon/QuartzDisplayServicesAPI.cs => Quartz/DisplayServices.cs} (72%) create mode 100644 Source/OpenTK/Platform/MacOS/Quartz/EventServices.cs diff --git a/Source/OpenTK/OpenTK.csproj b/Source/OpenTK/OpenTK.csproj index eab2002..333f516 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 16738e4..30e61ce 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 701b0bb..f873ad3 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 ecfa3e3..2483fde 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 d96b0a0..9c79119 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 bec5c6f..6b5c881 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 c4aa0ea..9a1b3d1 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 0000000..7e61bdd --- /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 + } +} + -- 2.7.4