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, }; } }