Просмотр исходного кода

Fix direct keyboard not working when using a Controller. (#6716)

* Fix direct keyboard not working when connected with a controller

- Pass KeyboardDriver to NpadController.GetHLEKeyboardInput().
- Always fetch all keyboards if Direct Keyboard is turned on.
- Remove unnecessary return null.

* Get Keyboard Inputs outside of the controller loop.

- Moved GetHLEKeyboardInput outside of the controller loop.
- Made GetHLEKeyboardInput public static from public

* Removed extra newline

* Update src/Ryujinx.Input/HLE/NpadManager.cs

Co-authored-by: gdkchan <gab.dark.100@gmail.com>

* Update src/Ryujinx.Input/HLE/NpadController.cs

Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com>

---------

Co-authored-by: gdkchan <gab.dark.100@gmail.com>
Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com>
MaxLastBreath 2 лет назад
Родитель
Сommit
5976a5161b
2 измененных файлов с 24 добавлено и 27 удалено
  1. 19 22
      src/Ryujinx.Input/HLE/NpadController.cs
  2. 5 5
      src/Ryujinx.Input/HLE/NpadManager.cs

+ 19 - 22
src/Ryujinx.Input/HLE/NpadController.cs

@@ -487,38 +487,35 @@ namespace Ryujinx.Input.HLE
             return value;
         }
 
-        public KeyboardInput? GetHLEKeyboardInput()
+        public static KeyboardInput GetHLEKeyboardInput(IGamepadDriver KeyboardDriver)
         {
-            if (_gamepad is IKeyboard keyboard)
-            {
-                KeyboardStateSnapshot keyboardState = keyboard.GetKeyboardStateSnapshot();
+            var keyboard = KeyboardDriver.GetGamepad("0") as IKeyboard;
 
-                KeyboardInput hidKeyboard = new()
-                {
-                    Modifier = 0,
-                    Keys = new ulong[0x4],
-                };
+            KeyboardStateSnapshot keyboardState = keyboard.GetKeyboardStateSnapshot();
 
-                foreach (HLEKeyboardMappingEntry entry in _keyMapping)
-                {
-                    ulong value = keyboardState.IsPressed(entry.TargetKey) ? 1UL : 0UL;
+            KeyboardInput hidKeyboard = new()
+            {
+                Modifier = 0,
+                Keys = new ulong[0x4],
+            };
 
-                    hidKeyboard.Keys[entry.Target / 0x40] |= (value << (entry.Target % 0x40));
-                }
+            foreach (HLEKeyboardMappingEntry entry in _keyMapping)
+            {
+                ulong value = keyboardState.IsPressed(entry.TargetKey) ? 1UL : 0UL;
 
-                foreach (HLEKeyboardMappingEntry entry in _keyModifierMapping)
-                {
-                    int value = keyboardState.IsPressed(entry.TargetKey) ? 1 : 0;
+                hidKeyboard.Keys[entry.Target / 0x40] |= (value << (entry.Target % 0x40));
+            }
 
-                    hidKeyboard.Modifier |= value << entry.Target;
-                }
+            foreach (HLEKeyboardMappingEntry entry in _keyModifierMapping)
+            {
+                int value = keyboardState.IsPressed(entry.TargetKey) ? 1 : 0;
 
-                return hidKeyboard;
+                hidKeyboard.Modifier |= value << entry.Target;
             }
 
-            return null;
-        }
+            return hidKeyboard;
 
+        }
 
         protected virtual void Dispose(bool disposing)
         {

+ 5 - 5
src/Ryujinx.Input/HLE/NpadManager.cs

@@ -231,11 +231,6 @@ namespace Ryujinx.Input.HLE
                         var altMotionState = isJoyconPair ? controller.GetHLEMotionState(true) : default;
 
                         motionState = (controller.GetHLEMotionState(), altMotionState);
-
-                        if (_enableKeyboard)
-                        {
-                            hleKeyboardInput = controller.GetHLEKeyboardInput();
-                        }
                     }
                     else
                     {
@@ -257,6 +252,11 @@ namespace Ryujinx.Input.HLE
                     }
                 }
 
+                if (!_blockInputUpdates && _enableKeyboard)
+                {
+                    hleKeyboardInput = NpadController.GetHLEKeyboardInput(_keyboardDriver);
+                }
+
                 _device.Hid.Npads.Update(hleInputStates);
                 _device.Hid.Npads.UpdateSixAxis(hleMotionStates);