[Win] Initial implementation of WinRawJoystick
authorStefanos A <stapostol@gmail.com>
Fri, 17 Jan 2014 00:27:07 +0000 (01:27 +0100)
committerthefiddler <stapostol@gmail.com>
Thu, 11 Sep 2014 10:51:46 +0000 (12:51 +0200)
Source/OpenTK/OpenTK.csproj
Source/OpenTK/Platform/Windows/WinInputBase.cs
Source/OpenTK/Platform/Windows/WinRawInput.cs
Source/OpenTK/Platform/Windows/WinRawJoystick.cs [new file with mode: 0644]
Source/OpenTK/Platform/Windows/WinRawKeyboard.cs
Source/OpenTK/Platform/Windows/WinRawMouse.cs

index 3b608ee..2c75a37 100644 (file)
     <Compile Include="Platform\MappedGamePadDriver.cs" />
     <Compile Include="Platform\Windows\WinInputBase.cs" />
     <Compile Include="Platform\Windows\WinCombinedJoystick.cs" />
+    <Compile Include="Platform\Windows\WinRawJoystick.cs" />
     <Compile Include="Platform\Windows\XInputJoystick.cs" />
     <Compile Include="Platform\X11\Bindings\DL.cs" />
     <Compile Include="Platform\X11\Bindings\INotify.cs" />
index b0565ba..701abd0 100644 (file)
@@ -164,6 +164,8 @@ namespace OpenTK.Platform.Windows
 
         public abstract IKeyboardDriver2 KeyboardDriver { get; }
 
+        public abstract IJoystickDriver2 JoystickDriver { get; }
+
         #endregion
 
         #region IDisposable Members
index 0872e27..717e13f 100644 (file)
@@ -38,10 +38,10 @@ namespace OpenTK.Platform.Windows
         #region Fields
 
         // Input event data.
-        static RawInput data = new RawInput();
 
         WinRawKeyboard keyboard_driver;
         WinRawMouse mouse_driver;
+        WinRawJoystick joystick_driver;
 
         IntPtr DevNotifyHandle;
         static readonly Guid DeviceInterfaceHid = new Guid("4D1E55B2-F16F-11CF-88CB-001111000030");
@@ -86,7 +86,7 @@ namespace OpenTK.Platform.Windows
         #region WindowProcedure
 
         // Processes the input Windows Message, routing the buffer to the correct Keyboard, Mouse or HID.
-        protected override IntPtr WindowProcedure(
+        protected unsafe override IntPtr WindowProcedure(
             IntPtr handle, WindowMessage message, IntPtr wParam, IntPtr lParam)
         {
             switch (message)
@@ -97,23 +97,28 @@ namespace OpenTK.Platform.Windows
                     Functions.GetRawInputData(lParam, GetRawInputDataEnum.INPUT,
                         IntPtr.Zero, ref size, API.RawInputHeaderSize);
 
+                    void* data_ptr = stackalloc byte[size];
+                    RawInput* data = (RawInput*)data_ptr;
+
                     // Read the actual raw input structure
                     if (size == Functions.GetRawInputData(lParam, GetRawInputDataEnum.INPUT,
-                        out data, ref size, API.RawInputHeaderSize))
+                        (IntPtr)data_ptr, ref size, API.RawInputHeaderSize))
                     {
-                        switch (data.Header.Type)
+                        switch (data->Header.Type)
                         {
                             case RawInputDeviceType.KEYBOARD:
-                                if (((WinRawKeyboard)KeyboardDriver).ProcessKeyboardEvent(data))
+                                if (((WinRawKeyboard)KeyboardDriver).ProcessKeyboardEvent(ref *data))
                                     return IntPtr.Zero;
                                 break;
 
                             case RawInputDeviceType.MOUSE:
-                                if (((WinRawMouse)MouseDriver).ProcessMouseEvent(data))
+                                if (((WinRawMouse)MouseDriver).ProcessMouseEvent(ref *data))
                                     return IntPtr.Zero;
                                 break;
 
                             case RawInputDeviceType.HID:
+                                if (((WinRawJoystick)JoystickDriver).ProcessEvent(ref *data))
+                                    return IntPtr.Zero;
                                 break;
                         }
                     }
@@ -122,7 +127,7 @@ namespace OpenTK.Platform.Windows
                 case WindowMessage.DEVICECHANGE:
                     ((WinRawKeyboard)KeyboardDriver).RefreshDevices();
                     ((WinRawMouse)MouseDriver).RefreshDevices();
-                    ((WinMMJoystick)JoystickDriver).RefreshDevices();
+                    ((WinRawJoystick)JoystickDriver).RefreshDevices();
                     break;
             }
             return base.WindowProcedure(handle, message, wParam, lParam);
@@ -136,6 +141,7 @@ namespace OpenTK.Platform.Windows
         {
             keyboard_driver = new WinRawKeyboard(Parent.Handle);
             mouse_driver = new WinRawMouse(Parent.Handle);
+            joystick_driver = new WinRawJoystick(Parent.Handle);
             DevNotifyHandle = RegisterForDeviceNotifications(Parent);
         }
 
@@ -178,6 +184,11 @@ namespace OpenTK.Platform.Windows
             get { return mouse_driver; }
         }
 
+        public override IJoystickDriver2 JoystickDriver
+        {
+            get { return joystick_driver; }
+        }
+
         #endregion
     }
 }
diff --git a/Source/OpenTK/Platform/Windows/WinRawJoystick.cs b/Source/OpenTK/Platform/Windows/WinRawJoystick.cs
new file mode 100644 (file)
index 0000000..38cf50a
--- /dev/null
@@ -0,0 +1,82 @@
+#region License
+//
+// WinRawJoystick.cs
+//
+// Author:
+//       Stefanos A. <stapostol@gmail.com>
+//
+// Copyright (c) 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.Collections.Generic;
+using System.Diagnostics;
+using System.Text;
+using OpenTK.Input;
+
+namespace OpenTK.Platform.Windows
+{
+    class WinRawJoystick : IJoystickDriver2
+    {
+        readonly IntPtr Window;
+        readonly object UpdateLock = new object();
+
+        public WinRawJoystick(IntPtr window)
+        {
+            Debug.WriteLine("Using WinRawMouse.");
+            Debug.Indent();
+
+            if (window == IntPtr.Zero)
+                throw new ArgumentNullException("window");
+
+            Window = window;
+            RefreshDevices();
+
+            Debug.Unindent();
+        }
+
+        public void RefreshDevices()
+        {
+            
+        }
+
+        public bool ProcessEvent(ref RawInput data)
+        {
+            throw new NotImplementedException();
+        }
+
+        public JoystickState GetState(int index)
+        {
+            throw new NotImplementedException();
+        }
+
+        public JoystickCapabilities GetCapabilities(int index)
+        {
+            throw new NotImplementedException();
+        }
+
+        public Guid GetGuid(int index)
+        {
+            throw new NotImplementedException();
+        }
+    }
+}
index fcfc4a6..ac31979 100644 (file)
@@ -152,7 +152,7 @@ namespace OpenTK.Platform.Windows
             }
         }
 
-        public bool ProcessKeyboardEvent(RawInput rin)
+        public bool ProcessKeyboardEvent(ref RawInput rin)
         {
             bool processed = false;
 
index c942a36..3add448 100644 (file)
@@ -154,7 +154,7 @@ namespace OpenTK.Platform.Windows
             }
         }
 
-        public bool ProcessMouseEvent(RawInput rin)
+        public bool ProcessMouseEvent(ref RawInput rin)
         {
             RawMouse raw = rin.Data.Mouse;
             ContextHandle handle = new ContextHandle(rin.Header.Device);