62 lines
2.6 KiB
C#
62 lines
2.6 KiB
C#
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;
|
|
}
|
|
}
|