[Win] Separate keyboard/mouse & joystick drivers
authorStefanos A <stapostol@gmail.com>
Wed, 15 Jan 2014 22:40:28 +0000 (23:40 +0100)
committerthefiddler <stapostol@gmail.com>
Thu, 11 Sep 2014 10:51:45 +0000 (12:51 +0200)
Keyboard/mouse support comes through WinRawInput; joystick support
through CombinedJoystickDriver. These drivers are now instantiated
separately.

Source/OpenTK/Platform/Windows/WinFactory.cs

index 877377a..978c0d1 100644 (file)
@@ -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);