diff --git a/Ryujinx.HLE/Input/HidHotkeyButtons.cs b/Ryujinx.HLE/Input/HidHotkeyButtons.cs new file mode 100644 index 00000000..7fa6ed6d --- /dev/null +++ b/Ryujinx.HLE/Input/HidHotkeyButtons.cs @@ -0,0 +1,10 @@ +using System; + +namespace Ryujinx.HLE.Input +{ + [Flags] + public enum HidHotkeyButtons + { + ToggleVSync = 1 << 0, + } +} diff --git a/Ryujinx/Config.jsonc b/Ryujinx/Config.jsonc index 151756f4..376cf502 100644 --- a/Ryujinx/Config.jsonc +++ b/Ryujinx/Config.jsonc @@ -84,6 +84,10 @@ "button_plus": "Plus", "button_r": "U", "button_zr": "O" + }, + + "hotkeys": { + "toggle_vsync": "Tab" } }, diff --git a/Ryujinx/Ui/GLScreen.cs b/Ryujinx/Ui/GLScreen.cs index c7aaea23..d9661237 100644 --- a/Ryujinx/Ui/GLScreen.cs +++ b/Ryujinx/Ui/GLScreen.cs @@ -22,6 +22,8 @@ namespace Ryujinx private IGalRenderer _renderer; + private HidHotkeyButtons _prevHotkeyButtons = 0; + private KeyboardState? _keyboard = null; private MouseState? _mouse = null; @@ -128,6 +130,7 @@ namespace Ryujinx private new void UpdateFrame() { + HidHotkeyButtons currentHotkeyButtons = 0; HidControllerButtons currentButton = 0; HidJoystickPosition leftJoystick; HidJoystickPosition rightJoystick; @@ -142,10 +145,10 @@ namespace Ryujinx { KeyboardState keyboard = _keyboard.Value; - currentButton = Configuration.Instance.KeyboardControls.GetButtons(keyboard); - - (leftJoystickDx, leftJoystickDy) = Configuration.Instance.KeyboardControls.GetLeftStick(keyboard); + currentHotkeyButtons = Configuration.Instance.KeyboardControls.GetHotkeyButtons(keyboard); + currentButton = Configuration.Instance.KeyboardControls.GetButtons(keyboard); + (leftJoystickDx, leftJoystickDy) = Configuration.Instance.KeyboardControls.GetLeftStick(keyboard); (rightJoystickDx, rightJoystickDy) = Configuration.Instance.KeyboardControls.GetRightStick(keyboard); } @@ -238,6 +241,15 @@ namespace Ryujinx HidControllerBase controller = _device.Hid.PrimaryController; controller.SendInput(currentButton, leftJoystick, rightJoystick); + + // Toggle vsync + if (currentHotkeyButtons.HasFlag(HidHotkeyButtons.ToggleVSync) && + !_prevHotkeyButtons.HasFlag(HidHotkeyButtons.ToggleVSync)) + { + _device.EnableDeviceVsync = !_device.EnableDeviceVsync; + } + + _prevHotkeyButtons = currentHotkeyButtons; } private new void RenderFrame() diff --git a/Ryujinx/Ui/NpadKeyboard.cs b/Ryujinx/Ui/NpadKeyboard.cs index 1604da5b..8d003c2c 100644 --- a/Ryujinx/Ui/NpadKeyboard.cs +++ b/Ryujinx/Ui/NpadKeyboard.cs @@ -35,6 +35,11 @@ namespace Ryujinx.UI.Input public Key ButtonZr; } + public struct KeyboardHotkeys + { + public Key ToggleVsync; + } + public class NpadKeyboard { /// @@ -47,6 +52,11 @@ namespace Ryujinx.UI.Input /// public NpadKeyboardRight RightJoycon { get; private set; } + /// + /// Hotkey Keyboard Bindings + /// + public KeyboardHotkeys Hotkeys { get; private set; } + public HidControllerButtons GetButtons(KeyboardState keyboard) { HidControllerButtons buttons = 0; @@ -97,5 +107,14 @@ namespace Ryujinx.UI.Input return (dx, dy); } + + public HidHotkeyButtons GetHotkeyButtons(KeyboardState keyboard) + { + HidHotkeyButtons buttons = 0; + + if (keyboard[(Key)Hotkeys.ToggleVsync]) buttons |= HidHotkeyButtons.ToggleVSync; + + return buttons; + } } } diff --git a/Ryujinx/_schema.json b/Ryujinx/_schema.json index 11eff12b..d06c8e91 100644 --- a/Ryujinx/_schema.json +++ b/Ryujinx/_schema.json @@ -636,9 +636,24 @@ "default": "O" } } + }, + "hotkeys": { + "$id": "#/properties/keyboard_controls/properties/hotkeys", + "type": "object", + "title": "Hotkey Controls", + "required": [ + "toggle_vsync" + ], + "properties": { + "toggle_vsync": { + "$id": "#/properties/keyboard_controls/properties/hotkeys/properties/toggle_vsync", + "$ref": "#/definitions/key", + "title": "Toggle VSync", + "default": "Tab" + } + } } - } - }, + }, "gamepad_controls": { "$id": "#/properties/gamepad_controls", "type": "object", @@ -843,4 +858,4 @@ } } } -} \ No newline at end of file +}