From 18c02db7b0623112795e12ae5741974005ecacf7 Mon Sep 17 00:00:00 2001 From: Stefanos A Date: Fri, 17 Jan 2014 01:27:07 +0100 Subject: [PATCH] [Win] Initial implementation of WinRawJoystick --- Source/OpenTK/OpenTK.csproj | 1 + .../OpenTK/Platform/Windows/WinInputBase.cs | 2 + Source/OpenTK/Platform/Windows/WinRawInput.cs | 25 ++++-- .../OpenTK/Platform/Windows/WinRawJoystick.cs | 82 +++++++++++++++++++ .../OpenTK/Platform/Windows/WinRawKeyboard.cs | 2 +- Source/OpenTK/Platform/Windows/WinRawMouse.cs | 2 +- 6 files changed, 105 insertions(+), 9 deletions(-) create mode 100644 Source/OpenTK/Platform/Windows/WinRawJoystick.cs diff --git a/Source/OpenTK/OpenTK.csproj b/Source/OpenTK/OpenTK.csproj index 3b608ee7..2c75a379 100644 --- a/Source/OpenTK/OpenTK.csproj +++ b/Source/OpenTK/OpenTK.csproj @@ -168,6 +168,7 @@ + diff --git a/Source/OpenTK/Platform/Windows/WinInputBase.cs b/Source/OpenTK/Platform/Windows/WinInputBase.cs index b0565ba2..701abd02 100644 --- a/Source/OpenTK/Platform/Windows/WinInputBase.cs +++ b/Source/OpenTK/Platform/Windows/WinInputBase.cs @@ -164,6 +164,8 @@ namespace OpenTK.Platform.Windows public abstract IKeyboardDriver2 KeyboardDriver { get; } + public abstract IJoystickDriver2 JoystickDriver { get; } + #endregion #region IDisposable Members diff --git a/Source/OpenTK/Platform/Windows/WinRawInput.cs b/Source/OpenTK/Platform/Windows/WinRawInput.cs index 0872e279..717e13f3 100644 --- a/Source/OpenTK/Platform/Windows/WinRawInput.cs +++ b/Source/OpenTK/Platform/Windows/WinRawInput.cs @@ -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 index 00000000..38cf50ae --- /dev/null +++ b/Source/OpenTK/Platform/Windows/WinRawJoystick.cs @@ -0,0 +1,82 @@ +#region License +// +// WinRawJoystick.cs +// +// Author: +// Stefanos A. +// +// 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(); + } + } +} diff --git a/Source/OpenTK/Platform/Windows/WinRawKeyboard.cs b/Source/OpenTK/Platform/Windows/WinRawKeyboard.cs index fcfc4a6b..ac319794 100644 --- a/Source/OpenTK/Platform/Windows/WinRawKeyboard.cs +++ b/Source/OpenTK/Platform/Windows/WinRawKeyboard.cs @@ -152,7 +152,7 @@ namespace OpenTK.Platform.Windows } } - public bool ProcessKeyboardEvent(RawInput rin) + public bool ProcessKeyboardEvent(ref RawInput rin) { bool processed = false; diff --git a/Source/OpenTK/Platform/Windows/WinRawMouse.cs b/Source/OpenTK/Platform/Windows/WinRawMouse.cs index c942a36f..3add448a 100644 --- a/Source/OpenTK/Platform/Windows/WinRawMouse.cs +++ b/Source/OpenTK/Platform/Windows/WinRawMouse.cs @@ -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);