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
+}