diff --git a/Dashboard.Common/Events/KeyboardEvents.cs b/Dashboard.Common/Events/KeyboardEvents.cs index 0d6d779..f0c4572 100644 --- a/Dashboard.Common/Events/KeyboardEvents.cs +++ b/Dashboard.Common/Events/KeyboardEvents.cs @@ -29,7 +29,7 @@ namespace Dashboard.Events public enum KeyCode { - // TODO: + // TODO: Keycode table. Keycodes are subject to change upstream. SeeAlso: Extensions.cs@KeyCode ToDashboard(this Key key) } public enum ScanCode @@ -160,10 +160,18 @@ namespace Dashboard.Events International4 = 0x79, International5 = 0x7B, International6 = 0x5C, + International7, + International8, + International9, Lang1 = 0x72, Lang2 = 0x71, Lang3 = 0x78, Lang4 = 0x77, + Lang5, + Lang6, + Lang7, + Lang8, + Lang9, LCtrl = 0x1D, LShift = 0x2A, LWin = 0xE05B, @@ -189,6 +197,9 @@ namespace Dashboard.Events Halt = 0xE068, Refresh = 0xE67, Bookmarks = 0xE066, + + NonUsSlashBar = 0xFF01, + Mute, } public class KeyboardButtonEventArgs(KeyCode keyCode, ScanCode scanCode, ModifierKeys modifierKeys, bool up) diff --git a/Dashboard.OpenTK/PAL2/Extensions.cs b/Dashboard.OpenTK/PAL2/Extensions.cs new file mode 100644 index 0000000..f3d6ae4 --- /dev/null +++ b/Dashboard.OpenTK/PAL2/Extensions.cs @@ -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, + }; + } +} diff --git a/Dashboard.OpenTK/PAL2/Pal2Application.cs b/Dashboard.OpenTK/PAL2/Pal2Application.cs index 324a3f2..80221f5 100644 --- a/Dashboard.OpenTK/PAL2/Pal2Application.cs +++ b/Dashboard.OpenTK/PAL2/Pal2Application.cs @@ -17,7 +17,7 @@ namespace Dashboard.OpenTK.PAL2 public override string DriverName => "Dashboard OpenTK PAL2.0 Driver"; public override string DriverVendor => "Dashboard"; 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 _windows = new List(); @@ -49,9 +49,8 @@ namespace Dashboard.OpenTK.PAL2 TK.Window.PostUserEvent(new ApplicationQuitEventArgs()); }); - Toolkit.Event.EventRaised += OnEventRaised; - - Toolkit.Init(options ?? new ToolkitOptions()); + TK.Event.EventRaised += OnEventRaised; + TK.Init(options ?? new ToolkitOptions()); } internal void RemoveWindow(PhysicalWindow window) @@ -115,40 +114,36 @@ namespace Dashboard.OpenTK.PAL2 } // TODO: fix this. - switch (PlatformEventType.UserMessage) + switch (args) { - case PlatformEventType.UserMessage: - if (args is ApplicationQuitEventArgs) - { - Quit = true; - return; - } - break; - // Mouse Events - case PlatformEventType.MouseDown: + case ApplicationQuitEventArgs: { - MouseButtonDownEventArgs down = (MouseButtonDownEventArgs)args; - MouseButtons buttons = (MouseButtons)(1 << (int)down.Button); - ModifierKeys modifierKeys = GetModifierKeys(down.Modifiers); + Quit = true; + return; + } + + // Mouse Events + case MouseButtonDownEventArgs mdown: + { + MouseButtons buttons = (MouseButtons)(1 << (int)mdown.Button); + ModifierKeys modifierKeys = mdown.Modifiers.ToDashboard(); // TODO: modifier keys MouseButtonEventArgs down2 = new MouseButtonEventArgs(info.MousePosition, buttons, modifierKeys, false); info.Window.SendEvent(this, down2); break; } - case PlatformEventType.MouseUp: + case MouseButtonUpEventArgs mup: { - MouseButtonUpEventArgs up = (MouseButtonUpEventArgs)args; - MouseButtons buttons = (MouseButtons)(1 << (int)up.Button); - ModifierKeys modifierKeys = GetModifierKeys(up.Modifiers); + MouseButtons buttons = (MouseButtons)(1 << (int)mup.Button); + ModifierKeys modifierKeys = mup.Modifiers.ToDashboard(); // TODO: modifier keys MouseButtonEventArgs up2 = new MouseButtonEventArgs(info.MousePosition, buttons, modifierKeys, true); info.Window.SendEvent(this, up2); break; } - case PlatformEventType.MouseMove: + case OPENTK.MouseMoveEventArgs mmove: { - OPENTK.MouseMoveEventArgs move = (OPENTK.MouseMoveEventArgs)args; - Vector2 position = new Vector2(move.ClientPosition.X, move.ClientPosition.Y); + Vector2 position = new Vector2(mmove.ClientPosition.X, mmove.ClientPosition.Y); DB.MouseMoveEventArgs move2 = new DB.MouseMoveEventArgs(position, position - info.MousePosition); info.MousePosition = position; @@ -156,73 +151,64 @@ namespace Dashboard.OpenTK.PAL2 info.Window.SendEvent(this, move2); break; } - case PlatformEventType.Scroll: + case ScrollEventArgs mscroll: { - ScrollEventArgs scroll = (ScrollEventArgs)args; - Vector2 distance = new Vector2(scroll.Distance.X, scroll.Distance.Y); - Vector2 delta = new Vector2(scroll.Delta.X, scroll.Delta.Y); + Vector2 distance = new Vector2(mscroll.Distance.X, mscroll.Distance.Y); + Vector2 delta = new Vector2(mscroll.Delta.X, mscroll.Delta.Y); MouseScrollEventArgs scroll2 = new MouseScrollEventArgs(distance, delta); info.Window.SendEvent(this, scroll2); break; } // Keyboard & Text Events - case PlatformEventType.KeyDown: + case KeyDownEventArgs kdown: { - KeyDownEventArgs down = (KeyDownEventArgs)args; - - ModifierKeys modifierKeys = GetModifierKeys(down.Modifiers); - KeyCode keyCode = GetKeyCode(down.Key); - ScanCode scanCode = GetScanCode(down.Scancode); + ModifierKeys modifierKeys = kdown.Modifiers.ToDashboard(); + KeyCode keyCode = kdown.Key.ToDashboard(); + ScanCode scanCode = kdown.Scancode.ToDashboard(); KeyboardButtonEventArgs up2 = new KeyboardButtonEventArgs(keyCode, scanCode, modifierKeys, false); info.Window.SendEvent(this, up2); break; } - case PlatformEventType.KeyUp: + case KeyUpEventArgs kup: { - KeyUpEventArgs up = (KeyUpEventArgs)args; - - ModifierKeys modifierKeys = GetModifierKeys(up.Modifiers); - KeyCode keyCode = GetKeyCode(up.Key); - ScanCode scanCode = GetScanCode(up.Scancode); + ModifierKeys modifierKeys = kup.Modifiers.ToDashboard(); + KeyCode keyCode = kup.Key.ToDashboard(); + ScanCode scanCode = kup.Scancode.ToDashboard(); KeyboardButtonEventArgs up2 = new KeyboardButtonEventArgs(keyCode, scanCode, modifierKeys, true); info.Window.SendEvent(this, up2); break; } - case PlatformEventType.TextInput: + case OPENTK.TextInputEventArgs textInput: { - OPENTK.TextInputEventArgs textInput = (OPENTK.TextInputEventArgs)args; DB.TextInputEventArgs textInput2 = new DB.TextInputEventArgs(textInput.Text); info.Window.SendEvent(this, textInput2); break; } - case PlatformEventType.TextEditing: + case TextEditingEventArgs textEditing: { - TextEditingEventArgs textEditing = (TextEditingEventArgs)args; TextEditEventArgs textEditing2 = new TextEditEventArgs(textEditing.Candidate, textEditing.Cursor, textEditing.Length); info.Window.SendEvent(this, textEditing2); break; } // Window/Surface related events. - case PlatformEventType.Close: + case CloseEventArgs: { info.Window.SendEvent(this, new WindowCloseEvent()); break; } - case PlatformEventType.WindowFramebufferResize: + case WindowFramebufferResizeEventArgs: { - var resize = (WindowFramebufferResizeEventArgs)args; info.Window.SendEvent(this, new ResizeEventArgs()); info.Window.SendEvent(this, new PaintEventArgs(info.Window.DeviceContext)); break; } - case PlatformEventType.WindowResize: + case WindowResizeEventArgs: { - var resize = (WindowResizeEventArgs)args; info.Window.SendEvent(this, new ResizeEventArgs()); info.Window.SendEvent(this, new PaintEventArgs(info.Window.DeviceContext)); 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) { 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