using System; using Microsoft.UI.Input; using Windows.System; namespace LayersShell; /// Maps WinUI virtual keys to the `layers_key_event` named-code + text protocol. /// named: 0=Character, 1=Enter, 2=Escape, 3=Backspace, 4=Tab, /// 5=ArrowLeft, 6=ArrowRight, 7=ArrowUp, 8=ArrowDown, /// 9=Delete, 10=Home, 11=End. /// mods: 1=Shift, 2=Ctrl, 4=Alt, 8=Logo (Win). internal static class WinKeyMap { public static uint MapVirtualKey(VirtualKey key) => key switch { VirtualKey.Enter => 1, VirtualKey.Escape => 2, VirtualKey.Back => 3, VirtualKey.Tab => 4, VirtualKey.Left => 5, VirtualKey.Right => 6, VirtualKey.Up => 7, VirtualKey.Down => 8, VirtualKey.Delete => 9, VirtualKey.Home => 10, VirtualKey.End => 11, _ => 0, }; public static string? TextForKey(VirtualKey key) { // Letters + digits + punctuation produced by the shell directly. Shift/altgr composition // is left to the iced layer's text_input which re-evaluates the character path. if (key >= VirtualKey.A && key <= VirtualKey.Z) { char c = (char)('a' + (int)(key - VirtualKey.A)); return c.ToString(); } if (key >= VirtualKey.Number0 && key <= VirtualKey.Number9) { char c = (char)('0' + (int)(key - VirtualKey.Number0)); return c.ToString(); } return key switch { VirtualKey.Space => " ", _ => null, }; } public static uint CurrentModifiers() { uint m = 0; if ((InputKeyboardSource.GetKeyStateForCurrentThread(VirtualKey.Shift) & Windows.UI.Core.CoreVirtualKeyStates.Down) == Windows.UI.Core.CoreVirtualKeyStates.Down) m |= 1; if ((InputKeyboardSource.GetKeyStateForCurrentThread(VirtualKey.Control) & Windows.UI.Core.CoreVirtualKeyStates.Down) == Windows.UI.Core.CoreVirtualKeyStates.Down) m |= 2; if ((InputKeyboardSource.GetKeyStateForCurrentThread(VirtualKey.Menu) & Windows.UI.Core.CoreVirtualKeyStates.Down) == Windows.UI.Core.CoreVirtualKeyStates.Down) m |= 4; if ((InputKeyboardSource.GetKeyStateForCurrentThread(VirtualKey.LeftWindows) & Windows.UI.Core.CoreVirtualKeyStates.Down) == Windows.UI.Core.CoreVirtualKeyStates.Down) m |= 8; if ((InputKeyboardSource.GetKeyStateForCurrentThread(VirtualKey.RightWindows) & Windows.UI.Core.CoreVirtualKeyStates.Down) == Windows.UI.Core.CoreVirtualKeyStates.Down) m |= 8; return m; } }