From 06e63946cca059318b0bd4c7218a011782640851 Mon Sep 17 00:00:00 2001 From: Stefanos A Date: Wed, 15 Jan 2014 23:40:28 +0100 Subject: [PATCH] [Win] Separate keyboard/mouse & joystick drivers Keyboard/mouse support comes through WinRawInput; joystick support through CombinedJoystickDriver. These drivers are now instantiated separately. --- Source/OpenTK/Platform/Windows/WinFactory.cs | 46 ++++++++++++++++++++++------ 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/Source/OpenTK/Platform/Windows/WinFactory.cs b/Source/OpenTK/Platform/Windows/WinFactory.cs index 877377a..978c0d1 100644 --- a/Source/OpenTK/Platform/Windows/WinFactory.cs +++ b/Source/OpenTK/Platform/Windows/WinFactory.cs @@ -40,7 +40,12 @@ namespace OpenTK.Platform.Windows class WinFactory : PlatformFactoryBase { readonly object SyncRoot = new object(); - IInputDriver2 inputDriver; + + // The input drivers must be constructed lazily, *after* the + // WinFactory constructor has finished running. The reason is + // that they call WinFactory methods internally. + WinRawInput rawinput_driver; // For keyboard and mouse input + WinCombinedJoystick joystick_driver; // For joystick input internal static IntPtr OpenGLHandle { get; private set; } const string OpenGLName = "OPENGL32.DLL"; @@ -112,41 +117,61 @@ namespace OpenTK.Platform.Windows public override OpenTK.Input.IKeyboardDriver2 CreateKeyboardDriver() { - return InputDriver.KeyboardDriver; + return RawInputDriver.KeyboardDriver; } public override OpenTK.Input.IMouseDriver2 CreateMouseDriver() { - return InputDriver.MouseDriver; + return RawInputDriver.MouseDriver; } public override OpenTK.Input.IGamePadDriver CreateGamePadDriver() { - return InputDriver.GamePadDriver; + return new MappedGamePadDriver(); } public override IJoystickDriver2 CreateJoystickDriver() { - return InputDriver.JoystickDriver; + return CombinedJoystickDriver; } #endregion - IInputDriver2 InputDriver + #region Private Members + + WinRawInput RawInputDriver { get { lock (SyncRoot) { - if (inputDriver == null) + if (rawinput_driver == null) { - inputDriver = new WinRawInput(); + rawinput_driver = new WinRawInput(); } - return inputDriver; + return rawinput_driver; } } } + WinCombinedJoystick CombinedJoystickDriver + { + get + { + lock (SyncRoot) + { + if (joystick_driver == null) + { + joystick_driver = new WinCombinedJoystick( + new XInputJoystick(), new WinMMJoystick()); + } + return joystick_driver; + } + } + } + + #endregion + #region IDisposable Members protected override void Dispose(bool manual) @@ -155,7 +180,8 @@ namespace OpenTK.Platform.Windows { if (manual) { - InputDriver.Dispose(); + rawinput_driver.Dispose(); + joystick_driver.Dispose(); } base.Dispose(manual); -- 2.7.4