Move modifier and scan code tables to an ext class.

This commit is contained in:
2026-07-31 22:41:20 +03:00
parent 1457e32095
commit 449c398f05
3 changed files with 251 additions and 136 deletions
+12 -1
View File
@@ -29,7 +29,7 @@ namespace Dashboard.Events
public enum KeyCode public enum KeyCode
{ {
// TODO: // TODO: Keycode table. Keycodes are subject to change upstream. SeeAlso: Extensions.cs@KeyCode ToDashboard(this Key key)
} }
public enum ScanCode public enum ScanCode
@@ -160,10 +160,18 @@ namespace Dashboard.Events
International4 = 0x79, International4 = 0x79,
International5 = 0x7B, International5 = 0x7B,
International6 = 0x5C, International6 = 0x5C,
International7,
International8,
International9,
Lang1 = 0x72, Lang1 = 0x72,
Lang2 = 0x71, Lang2 = 0x71,
Lang3 = 0x78, Lang3 = 0x78,
Lang4 = 0x77, Lang4 = 0x77,
Lang5,
Lang6,
Lang7,
Lang8,
Lang9,
LCtrl = 0x1D, LCtrl = 0x1D,
LShift = 0x2A, LShift = 0x2A,
LWin = 0xE05B, LWin = 0xE05B,
@@ -189,6 +197,9 @@ namespace Dashboard.Events
Halt = 0xE068, Halt = 0xE068,
Refresh = 0xE67, Refresh = 0xE67,
Bookmarks = 0xE066, Bookmarks = 0xE066,
NonUsSlashBar = 0xFF01,
Mute,
} }
public class KeyboardButtonEventArgs(KeyCode keyCode, ScanCode scanCode, ModifierKeys modifierKeys, bool up) public class KeyboardButtonEventArgs(KeyCode keyCode, ScanCode scanCode, ModifierKeys modifierKeys, bool up)
+204
View File
@@ -0,0 +1,204 @@
using Dashboard.Events;
using OpenTK.Platform;
namespace Dashboard.OpenTK.PAL2
{
public static class Extensions
{
public static ModifierKeys ToDashboard(this KeyModifier modifier)
{
ModifierKeys keys = 0;
keys |= modifier.HasFlag(KeyModifier.NumLock) ? ModifierKeys.NumLock : 0;
keys |= modifier.HasFlag(KeyModifier.CapsLock) ? ModifierKeys.CapsLock : 0;
keys |= modifier.HasFlag(KeyModifier.ScrollLock) ? ModifierKeys.ScrollLock : 0;
keys |= modifier.HasFlag(KeyModifier.LeftShift) ? ModifierKeys.LeftShift : 0;
keys |= modifier.HasFlag(KeyModifier.LeftControl) ? ModifierKeys.LeftControl : 0;
keys |= modifier.HasFlag(KeyModifier.LeftAlt) ? ModifierKeys.LeftAlt : 0;
keys |= modifier.HasFlag(KeyModifier.LeftGUI) ? ModifierKeys.LeftMeta : 0;
keys |= modifier.HasFlag(KeyModifier.RightShift) ? ModifierKeys.RightShift : 0;
keys |= modifier.HasFlag(KeyModifier.RightControl) ? ModifierKeys.RightControl : 0;
keys |= modifier.HasFlag(KeyModifier.RightAlt) ? ModifierKeys.RightAlt : 0;
keys |= modifier.HasFlag(KeyModifier.RightGUI) ? ModifierKeys.RightMeta : 0;
keys |= modifier.HasFlag(KeyModifier.Shift) ? ModifierKeys.Shift : 0;
keys |= modifier.HasFlag(KeyModifier.Control) ? ModifierKeys.Control : 0;
keys |= modifier.HasFlag(KeyModifier.Alt) ? ModifierKeys.Alt : 0;
keys |= modifier.HasFlag(KeyModifier.GUI) ? ModifierKeys.Meta : 0;
// C# makes this cast as annoying as possible.
keys |= (ModifierKeys)((((int)keys >> (int)ModifierKeys.RightBitPos) & 0xF) |
(((int)keys >> (int)ModifierKeys.LeftBitPos) & 0xF));
return keys;
}
public static KeyCode ToDashboard(this Key key) => key switch
{
// TODO: Keycode table. Keycodes are subject to change upstream.
_ => (KeyCode)0,
};
public static ScanCode ToDashboard(this Scancode scanCode) => scanCode switch
{
// TODO: Revise this array.
Scancode.Unknown => ScanCode.Error,
Scancode.A => ScanCode.A,
Scancode.B => ScanCode.B,
Scancode.C => ScanCode.C,
Scancode.D => ScanCode.D,
Scancode.E => ScanCode.E,
Scancode.F => ScanCode.F,
Scancode.G => ScanCode.G,
Scancode.H => ScanCode.H,
Scancode.I => ScanCode.I,
Scancode.J => ScanCode.J,
Scancode.K => ScanCode.K,
Scancode.L => ScanCode.L,
Scancode.M => ScanCode.M,
Scancode.N => ScanCode.N,
Scancode.O => ScanCode.O,
Scancode.P => ScanCode.P,
Scancode.Q => ScanCode.Q,
Scancode.R => ScanCode.R,
Scancode.S => ScanCode.S,
Scancode.T => ScanCode.T,
Scancode.U => ScanCode.U,
Scancode.V => ScanCode.V,
Scancode.W => ScanCode.W,
Scancode.X => ScanCode.X,
Scancode.Y => ScanCode.Y,
Scancode.Z => ScanCode.Z,
Scancode.D0 => ScanCode.D0,
Scancode.D1 => ScanCode.D1,
Scancode.D2 => ScanCode.D2,
Scancode.D3 => ScanCode.D3,
Scancode.D4 => ScanCode.D4,
Scancode.D5 => ScanCode.D5,
Scancode.D6 => ScanCode.D6,
Scancode.D7 => ScanCode.D7,
Scancode.D8 => ScanCode.D8,
Scancode.D9 => ScanCode.D9,
Scancode.Return => ScanCode.Return,
Scancode.Escape => ScanCode.Esc,
Scancode.Backspace => ScanCode.Backspace,
Scancode.Tab => ScanCode.Tab,
Scancode.Spacebar => ScanCode.Space,
Scancode.Dash => ScanCode.Dash,
Scancode.Equals => ScanCode.Equals,
Scancode.LeftBrace => ScanCode.LBracket,
Scancode.RightBrace => ScanCode.RBracket,
Scancode.SemiColon => ScanCode.Semicolon,
Scancode.LeftApostrophe => ScanCode.Apostrophe,
Scancode.GraveAccent => ScanCode.Grave,
Scancode.Comma => ScanCode.Comma,
Scancode.Period => ScanCode.Period,
Scancode.CapsLock => ScanCode.CapsLock,
Scancode.F1 => ScanCode.F1,
Scancode.F2 => ScanCode.F2,
Scancode.F3 => ScanCode.F3,
Scancode.F4 => ScanCode.F4,
Scancode.F5 => ScanCode.F5,
Scancode.F6 => ScanCode.F6,
Scancode.F7 => ScanCode.F7,
Scancode.F8 => ScanCode.F8,
Scancode.F9 => ScanCode.F9,
Scancode.F10 => ScanCode.F10,
Scancode.F11 => ScanCode.F11,
Scancode.F12 => ScanCode.F12,
Scancode.F13 => ScanCode.F13,
Scancode.F14 => ScanCode.F14,
Scancode.F15 => ScanCode.F15,
Scancode.F16 => ScanCode.F16,
Scancode.F17 => ScanCode.F17,
Scancode.F18 => ScanCode.F18,
Scancode.F19 => ScanCode.F19,
Scancode.F20 => ScanCode.F20,
Scancode.F21 => ScanCode.F21,
Scancode.F22 => ScanCode.F22,
Scancode.F23 => ScanCode.F23,
Scancode.F24 => ScanCode.F24,
Scancode.PrintScreen => ScanCode.PrintScr,
Scancode.ScrollLock => ScanCode.ScrollLock,
Scancode.Pause => ScanCode.Pause,
Scancode.Insert => ScanCode.Insert,
Scancode.Home => ScanCode.Home,
Scancode.PageUp => ScanCode.PageUp,
Scancode.Delete => ScanCode.Delete,
Scancode.End => ScanCode.End,
Scancode.PageDown => ScanCode.PageDown,
Scancode.RightArrow => ScanCode.RightArrow,
Scancode.LeftArrow => ScanCode.LeftArrow,
Scancode.DownArrow => ScanCode.DownArrow,
Scancode.UpArrow => ScanCode.UpArrow,
Scancode.NumLock => ScanCode.NumLock,
Scancode.KeypadEnter => ScanCode.NumEnter,
Scancode.Keypad1 => ScanCode.Num1,
Scancode.Keypad2 => ScanCode.Num2,
Scancode.Keypad3 => ScanCode.Num3,
Scancode.Keypad4 => ScanCode.Num4,
Scancode.Keypad5 => ScanCode.Num5,
Scancode.Keypad6 => ScanCode.Num6,
Scancode.Keypad7 => ScanCode.Num7,
Scancode.Keypad8 => ScanCode.Num8,
Scancode.Keypad9 => ScanCode.Num9,
Scancode.Keypad0 => ScanCode.Num0,
Scancode.KeypadForwardSlash => ScanCode.NumDiv,
Scancode.KeypadPeriod => ScanCode.NumDecimal,
Scancode.KeypadStar => ScanCode.NumMul,
Scancode.KeypadDash => ScanCode.NumSub,
Scancode.KeypadPlus => ScanCode.NumAdd,
Scancode.KeypadEquals => ScanCode.NumEquals,
Scancode.KeypadComma => ScanCode.NumComma,
Scancode.Application => ScanCode.Application,
Scancode.International1 => ScanCode.International1,
Scancode.International2 => ScanCode.International2,
Scancode.International3 => ScanCode.International3,
Scancode.International4 => ScanCode.International4,
Scancode.International5 => ScanCode.International5,
Scancode.International6 => ScanCode.International6,
Scancode.LANG1 => ScanCode.Lang1,
Scancode.LANG2 => ScanCode.Lang2,
Scancode.LANG3 => ScanCode.Lang3,
Scancode.LANG4 => ScanCode.Lang4,
Scancode.LANG5 => ScanCode.Lang5,
Scancode.LeftControl => ScanCode.LCtrl,
Scancode.LeftShift => ScanCode.LShift,
Scancode.LeftAlt => ScanCode.LAlt,
Scancode.LeftGUI => ScanCode.LWin,
Scancode.RightControl => ScanCode.RCtrl,
Scancode.RightShift => ScanCode.RShift,
Scancode.RightAlt => ScanCode.RAlt,
Scancode.RightGUI => ScanCode.RWin,
Scancode.SystemPowerDown => ScanCode.SystemPowerDown,
Scancode.SystemSleep => ScanCode.SystemSleep,
Scancode.SystemWakeUp => ScanCode.SystemWakeUp,
Scancode.ScanNextTrack => ScanCode.NextTrack,
Scancode.ScanPreviousTrack => ScanCode.PrevTrack,
Scancode.Stop => ScanCode.Stop,
Scancode.PlayPause => ScanCode.PlayPause,
Scancode.Mute => ScanCode.Mute,
Scancode.VolumeIncrement => ScanCode.VolUp,
Scancode.VolumeDecrement => ScanCode.VolDown,
Scancode.NonUSSlashBar => ScanCode.NonUsSlashBar,
Scancode.Pipe => ScanCode.Backslash,
Scancode.QuestionMark => ScanCode.ForwardSlash,
_ => (ScanCode)0,
};
}
}
+30 -130
View File
@@ -17,7 +17,7 @@ namespace Dashboard.OpenTK.PAL2
public override string DriverName => "Dashboard OpenTK PAL2.0 Driver"; public override string DriverName => "Dashboard OpenTK PAL2.0 Driver";
public override string DriverVendor => "Dashboard"; public override string DriverVendor => "Dashboard";
public override Version DriverVersion => new Version(0, 1); public override Version DriverVersion => new Version(0, 1);
public GraphicsApiHints GraphicsApiHints { get; set; } = new OpenGLGraphicsApiHints(); public GraphicsApiHints GraphicsApiHints { get; init; } = new OpenGLGraphicsApiHints();
private readonly List<PhysicalWindow> _windows = new List<PhysicalWindow>(); private readonly List<PhysicalWindow> _windows = new List<PhysicalWindow>();
@@ -49,9 +49,8 @@ namespace Dashboard.OpenTK.PAL2
TK.Window.PostUserEvent(new ApplicationQuitEventArgs()); TK.Window.PostUserEvent(new ApplicationQuitEventArgs());
}); });
Toolkit.Event.EventRaised += OnEventRaised; TK.Event.EventRaised += OnEventRaised;
TK.Init(options ?? new ToolkitOptions());
Toolkit.Init(options ?? new ToolkitOptions());
} }
internal void RemoveWindow(PhysicalWindow window) internal void RemoveWindow(PhysicalWindow window)
@@ -115,40 +114,36 @@ namespace Dashboard.OpenTK.PAL2
} }
// TODO: fix this. // TODO: fix this.
switch (PlatformEventType.UserMessage) switch (args)
{ {
case PlatformEventType.UserMessage: case ApplicationQuitEventArgs:
if (args is ApplicationQuitEventArgs)
{ {
Quit = true; Quit = true;
return; return;
} }
break;
// Mouse Events // Mouse Events
case PlatformEventType.MouseDown: case MouseButtonDownEventArgs mdown:
{ {
MouseButtonDownEventArgs down = (MouseButtonDownEventArgs)args; MouseButtons buttons = (MouseButtons)(1 << (int)mdown.Button);
MouseButtons buttons = (MouseButtons)(1 << (int)down.Button); ModifierKeys modifierKeys = mdown.Modifiers.ToDashboard();
ModifierKeys modifierKeys = GetModifierKeys(down.Modifiers);
// TODO: modifier keys // TODO: modifier keys
MouseButtonEventArgs down2 = new MouseButtonEventArgs(info.MousePosition, buttons, modifierKeys, false); MouseButtonEventArgs down2 = new MouseButtonEventArgs(info.MousePosition, buttons, modifierKeys, false);
info.Window.SendEvent(this, down2); info.Window.SendEvent(this, down2);
break; break;
} }
case PlatformEventType.MouseUp: case MouseButtonUpEventArgs mup:
{ {
MouseButtonUpEventArgs up = (MouseButtonUpEventArgs)args; MouseButtons buttons = (MouseButtons)(1 << (int)mup.Button);
MouseButtons buttons = (MouseButtons)(1 << (int)up.Button); ModifierKeys modifierKeys = mup.Modifiers.ToDashboard();
ModifierKeys modifierKeys = GetModifierKeys(up.Modifiers);
// TODO: modifier keys // TODO: modifier keys
MouseButtonEventArgs up2 = new MouseButtonEventArgs(info.MousePosition, buttons, modifierKeys, true); MouseButtonEventArgs up2 = new MouseButtonEventArgs(info.MousePosition, buttons, modifierKeys, true);
info.Window.SendEvent(this, up2); info.Window.SendEvent(this, up2);
break; break;
} }
case PlatformEventType.MouseMove: case OPENTK.MouseMoveEventArgs mmove:
{ {
OPENTK.MouseMoveEventArgs move = (OPENTK.MouseMoveEventArgs)args; Vector2 position = new Vector2(mmove.ClientPosition.X, mmove.ClientPosition.Y);
Vector2 position = new Vector2(move.ClientPosition.X, move.ClientPosition.Y);
DB.MouseMoveEventArgs move2 = new DB.MouseMoveEventArgs(position, position - info.MousePosition); DB.MouseMoveEventArgs move2 = new DB.MouseMoveEventArgs(position, position - info.MousePosition);
info.MousePosition = position; info.MousePosition = position;
@@ -156,73 +151,64 @@ namespace Dashboard.OpenTK.PAL2
info.Window.SendEvent(this, move2); info.Window.SendEvent(this, move2);
break; break;
} }
case PlatformEventType.Scroll: case ScrollEventArgs mscroll:
{ {
ScrollEventArgs scroll = (ScrollEventArgs)args; Vector2 distance = new Vector2(mscroll.Distance.X, mscroll.Distance.Y);
Vector2 distance = new Vector2(scroll.Distance.X, scroll.Distance.Y); Vector2 delta = new Vector2(mscroll.Delta.X, mscroll.Delta.Y);
Vector2 delta = new Vector2(scroll.Delta.X, scroll.Delta.Y);
MouseScrollEventArgs scroll2 = new MouseScrollEventArgs(distance, delta); MouseScrollEventArgs scroll2 = new MouseScrollEventArgs(distance, delta);
info.Window.SendEvent(this, scroll2); info.Window.SendEvent(this, scroll2);
break; break;
} }
// Keyboard & Text Events // Keyboard & Text Events
case PlatformEventType.KeyDown: case KeyDownEventArgs kdown:
{ {
KeyDownEventArgs down = (KeyDownEventArgs)args; ModifierKeys modifierKeys = kdown.Modifiers.ToDashboard();
KeyCode keyCode = kdown.Key.ToDashboard();
ModifierKeys modifierKeys = GetModifierKeys(down.Modifiers); ScanCode scanCode = kdown.Scancode.ToDashboard();
KeyCode keyCode = GetKeyCode(down.Key);
ScanCode scanCode = GetScanCode(down.Scancode);
KeyboardButtonEventArgs up2 = new KeyboardButtonEventArgs(keyCode, scanCode, modifierKeys, false); KeyboardButtonEventArgs up2 = new KeyboardButtonEventArgs(keyCode, scanCode, modifierKeys, false);
info.Window.SendEvent(this, up2); info.Window.SendEvent(this, up2);
break; break;
} }
case PlatformEventType.KeyUp: case KeyUpEventArgs kup:
{ {
KeyUpEventArgs up = (KeyUpEventArgs)args; ModifierKeys modifierKeys = kup.Modifiers.ToDashboard();
KeyCode keyCode = kup.Key.ToDashboard();
ModifierKeys modifierKeys = GetModifierKeys(up.Modifiers); ScanCode scanCode = kup.Scancode.ToDashboard();
KeyCode keyCode = GetKeyCode(up.Key);
ScanCode scanCode = GetScanCode(up.Scancode);
KeyboardButtonEventArgs up2 = new KeyboardButtonEventArgs(keyCode, scanCode, modifierKeys, true); KeyboardButtonEventArgs up2 = new KeyboardButtonEventArgs(keyCode, scanCode, modifierKeys, true);
info.Window.SendEvent(this, up2); info.Window.SendEvent(this, up2);
break; break;
} }
case PlatformEventType.TextInput: case OPENTK.TextInputEventArgs textInput:
{ {
OPENTK.TextInputEventArgs textInput = (OPENTK.TextInputEventArgs)args;
DB.TextInputEventArgs textInput2 = new DB.TextInputEventArgs(textInput.Text); DB.TextInputEventArgs textInput2 = new DB.TextInputEventArgs(textInput.Text);
info.Window.SendEvent(this, textInput2); info.Window.SendEvent(this, textInput2);
break; break;
} }
case PlatformEventType.TextEditing: case TextEditingEventArgs textEditing:
{ {
TextEditingEventArgs textEditing = (TextEditingEventArgs)args;
TextEditEventArgs textEditing2 = new TextEditEventArgs(textEditing.Candidate, textEditing.Cursor, textEditing.Length); TextEditEventArgs textEditing2 = new TextEditEventArgs(textEditing.Candidate, textEditing.Cursor, textEditing.Length);
info.Window.SendEvent(this, textEditing2); info.Window.SendEvent(this, textEditing2);
break; break;
} }
// Window/Surface related events. // Window/Surface related events.
case PlatformEventType.Close: case CloseEventArgs:
{ {
info.Window.SendEvent(this, new WindowCloseEvent()); info.Window.SendEvent(this, new WindowCloseEvent());
break; break;
} }
case PlatformEventType.WindowFramebufferResize: case WindowFramebufferResizeEventArgs:
{ {
var resize = (WindowFramebufferResizeEventArgs)args;
info.Window.SendEvent(this, new ResizeEventArgs()); info.Window.SendEvent(this, new ResizeEventArgs());
info.Window.SendEvent(this, new PaintEventArgs(info.Window.DeviceContext)); info.Window.SendEvent(this, new PaintEventArgs(info.Window.DeviceContext));
break; break;
} }
case PlatformEventType.WindowResize: case WindowResizeEventArgs:
{ {
var resize = (WindowResizeEventArgs)args;
info.Window.SendEvent(this, new ResizeEventArgs()); info.Window.SendEvent(this, new ResizeEventArgs());
info.Window.SendEvent(this, new PaintEventArgs(info.Window.DeviceContext)); info.Window.SendEvent(this, new PaintEventArgs(info.Window.DeviceContext));
break; break;
@@ -234,96 +220,10 @@ namespace Dashboard.OpenTK.PAL2
} }
} }
private static ModifierKeys GetModifierKeys(KeyModifier modifier)
{
ModifierKeys keys = 0;
keys |= modifier.HasFlag(KeyModifier.NumLock) ? ModifierKeys.NumLock : 0;
keys |= modifier.HasFlag(KeyModifier.CapsLock) ? ModifierKeys.CapsLock : 0;
keys |= modifier.HasFlag(KeyModifier.ScrollLock) ? ModifierKeys.ScrollLock : 0;
keys |= modifier.HasFlag(KeyModifier.LeftShift) ? ModifierKeys.LeftShift : 0;
keys |= modifier.HasFlag(KeyModifier.LeftControl) ? ModifierKeys.LeftControl : 0;
keys |= modifier.HasFlag(KeyModifier.LeftAlt) ? ModifierKeys.LeftAlt : 0;
keys |= modifier.HasFlag(KeyModifier.LeftGUI) ? ModifierKeys.LeftMeta : 0;
keys |= modifier.HasFlag(KeyModifier.RightShift) ? ModifierKeys.RightShift : 0;
keys |= modifier.HasFlag(KeyModifier.RightControl) ? ModifierKeys.RightControl : 0;
keys |= modifier.HasFlag(KeyModifier.RightAlt) ? ModifierKeys.RightAlt : 0;
keys |= modifier.HasFlag(KeyModifier.RightGUI) ? ModifierKeys.RightMeta : 0;
keys |= modifier.HasFlag(KeyModifier.Shift) ? ModifierKeys.Shift : 0;
keys |= modifier.HasFlag(KeyModifier.Control) ? ModifierKeys.Control : 0;
keys |= modifier.HasFlag(KeyModifier.Alt) ? ModifierKeys.Alt : 0;
keys |= modifier.HasFlag(KeyModifier.GUI) ? ModifierKeys.Meta : 0;
// C# makes this cast as annoying as possible.
keys |= (ModifierKeys)((((int)keys >> (int)ModifierKeys.RightBitPos) & 0xF) |
(((int)keys >> (int)ModifierKeys.LeftBitPos) & 0xF));
return keys;
}
private record WindowExtraInfo(PhysicalWindow Window) private record WindowExtraInfo(PhysicalWindow Window)
{ {
public Vector2 MousePosition { get; set; } = Vector2.Zero; public Vector2 MousePosition { get; set; } = Vector2.Zero;
} }
// TODO: Keycode and scancode tables.
private static KeyCode GetKeyCode(Key key) => key switch
{
_ => (KeyCode)0,
};
private static ScanCode GetScanCode(Scancode scanCode) => scanCode switch
{
// TODO: Revise this array.
Scancode.A => ScanCode.A,
Scancode.B => ScanCode.B,
Scancode.C => ScanCode.C,
Scancode.D => ScanCode.D,
Scancode.E => ScanCode.E,
Scancode.F => ScanCode.F,
Scancode.G => ScanCode.G,
Scancode.H => ScanCode.H,
Scancode.I => ScanCode.I,
Scancode.J => ScanCode.J,
Scancode.K => ScanCode.K,
Scancode.L => ScanCode.L,
Scancode.M => ScanCode.M,
Scancode.N => ScanCode.N,
Scancode.O => ScanCode.O,
Scancode.P => ScanCode.P,
Scancode.Q => ScanCode.Q,
Scancode.R => ScanCode.R,
Scancode.S => ScanCode.S,
Scancode.T => ScanCode.T,
Scancode.U => ScanCode.U,
Scancode.V => ScanCode.V,
Scancode.W => ScanCode.W,
Scancode.X => ScanCode.X,
Scancode.Y => ScanCode.Y,
Scancode.Z => ScanCode.Z,
Scancode.D0 => ScanCode.D0,
Scancode.D1 => ScanCode.D1,
Scancode.D2 => ScanCode.D2,
Scancode.D3 => ScanCode.D3,
Scancode.D4 => ScanCode.D4,
Scancode.D5 => ScanCode.D5,
Scancode.D6 => ScanCode.D6,
Scancode.D7 => ScanCode.D7,
Scancode.D8 => ScanCode.D8,
Scancode.D9 => ScanCode.D9,
Scancode.UpArrow => ScanCode.UpArrow,
Scancode.DownArrow => ScanCode.DownArrow,
Scancode.LeftArrow => ScanCode.LeftArrow,
Scancode.RightArrow => ScanCode.RightArrow,
Scancode.Spacebar => ScanCode.Space,
Scancode.LeftShift => ScanCode.LShift,
Scancode.RightShift => ScanCode.RShift,
_ => (ScanCode)0,
};
} }
internal class ApplicationQuitEventArgs() : EventArgs internal class ApplicationQuitEventArgs() : EventArgs