From ccdb0b9711d0e6cb097f6322e40f2a152c2872c7 Mon Sep 17 00:00:00 2001 From: Diogo Trindade Date: Thu, 9 Dec 2021 07:18:24 -0800 Subject: [PATCH] Linux - Added intiial input provider --- src/Avalonia/Artemis.UI.Linux/App.axaml.cs | 10 + .../Providers/Input/LinuxAbsoluteAxis.cs | 34 + .../Providers/Input/LinuxInputDevice.cs | 93 +++ .../Providers/Input/LinuxInputDeviceFinder.cs | 42 ++ .../Providers/Input/LinuxInputDeviceReader.cs | 60 ++ .../Providers/Input/LinuxInputEventArgs.cs | 12 + .../Providers/Input/LinuxInputEventType.cs | 68 ++ .../Providers/Input/LinuxInputProvider.cs | 119 ++++ .../Providers/Input/LinuxKeyboardKeyCodes.cs | 620 +++++++++++++++++ .../Providers/Input/LinuxRelativeAxis.cs | 16 + .../Utilities/InputUtilities.cs | 621 ++++++++++++++++++ 11 files changed, 1695 insertions(+) create mode 100644 src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxAbsoluteAxis.cs create mode 100644 src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputDevice.cs create mode 100644 src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputDeviceFinder.cs create mode 100644 src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputDeviceReader.cs create mode 100644 src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputEventArgs.cs create mode 100644 src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputEventType.cs create mode 100644 src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputProvider.cs create mode 100644 src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxKeyboardKeyCodes.cs create mode 100644 src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxRelativeAxis.cs create mode 100644 src/Avalonia/Artemis.UI.Linux/Utilities/InputUtilities.cs diff --git a/src/Avalonia/Artemis.UI.Linux/App.axaml.cs b/src/Avalonia/Artemis.UI.Linux/App.axaml.cs index 4d79f7afc..6a0f198c9 100644 --- a/src/Avalonia/Artemis.UI.Linux/App.axaml.cs +++ b/src/Avalonia/Artemis.UI.Linux/App.axaml.cs @@ -1,3 +1,5 @@ +using Artemis.Core.Services; +using Artemis.UI.Linux.Providers.Input; using Avalonia; using Avalonia.Markup.Xaml; using Avalonia.Threading; @@ -17,6 +19,8 @@ namespace Artemis.UI.Linux _kernel = ArtemisBootstrapper.Bootstrap(this); RxApp.MainThreadScheduler = AvaloniaScheduler.Instance; AvaloniaXamlLoader.Load(this); + + RegisterProviders(); } public override void OnFrameworkInitializationCompleted() @@ -25,5 +29,11 @@ namespace Artemis.UI.Linux if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) _applicationStateManager = new ApplicationStateManager(_kernel!, desktop.Args); } + + private void RegisterProviders() + { + IInputService inputService = _kernel.Get(); + inputService.AddInputProvider(_kernel.Get()); + } } } \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxAbsoluteAxis.cs b/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxAbsoluteAxis.cs new file mode 100644 index 000000000..60e3fbbb7 --- /dev/null +++ b/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxAbsoluteAxis.cs @@ -0,0 +1,34 @@ +namespace Artemis.UI.Linux.Providers.Input +{ + public enum LinuxAbsoluteAxis + { + ABS_X = 0x00, + ABS_Y = 0x01, + ABS_Z = 0x02, + ABS_RX = 0x03, + ABS_RY = 0x04, + ABS_RZ = 0x05, + ABS_THROTTLE = 0x06, + ABS_RUDDER = 0x07, + ABS_WHEEL = 0x08, + ABS_GAS = 0x09, + ABS_BRAKE = 0x0a, + ABS_HAT0X = 0x10, + ABS_HAT0Y = 0x11, + ABS_HAT1X = 0x12, + ABS_HAT1Y = 0x13, + ABS_HAT2X = 0x14, + ABS_HAT2Y = 0x15, + ABS_HAT3X = 0x16, + ABS_HAT3Y = 0x17, + ABS_PRESSURE = 0x18, + ABS_DISTANCE = 0x19, + ABS_TILT_X = 0x1a, + ABS_TILT_Y = 0x1b, + ABS_TOOL_WIDTH = 0x1c, + + ABS_VOLUME = 0x20, + + ABS_MISC = 0x28, + } +} \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputDevice.cs b/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputDevice.cs new file mode 100644 index 000000000..b944da4d4 --- /dev/null +++ b/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputDevice.cs @@ -0,0 +1,93 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Reflection.Metadata; +using Humanizer; + +namespace Artemis.UI.Linux.Providers.Input +{ + /// + /// Data transfer object representing a device read from /proc/bus/input/devices + /// + public class LinuxInputDevice + { + public string InputId { get; } + public string? Bus { get; } + public string? Vendor { get; } + public string? Product { get; } + public string? Version { get; } + public string? Name { get; } + public string? Phys { get; } + public string? Sysfs { get; } + public string? Uniq { get; } + public string[]? Handlers { get; } + public bool IsMouse => Handlers.Any(h => h.Contains("mouse")); + public bool IsKeyboard => Handlers.Any(h => h.Contains("kbd")); + public bool IsGamePad => Handlers.Any(h => h.Contains("js")); + public string EventPath => $"/dev/input/{Handlers.First(h => h.Contains("event"))}"; + + public LinuxInputDevice(IEnumerable lines) + { + foreach (string line in lines) + { + char dataType = line.First(); + string data = line.Substring(3); + //get the first character in each line and set the according property with relevant data + switch (dataType) + { + case 'I': + InputId = data; + foreach (string component in data.Split(" ")) + { + string?[] parts = component.Split('='); + switch (parts[0]) + { + case "Bus": + Bus = parts[1]; + break; + case "Vendor": + Vendor = parts[1]; + break; + case "Product": + Product = parts[1]; + break; + case "Version": + Version = parts[1]; + break; + default: + break; + } + } + break; + case 'N': + Name = data.Replace("\"", "") + .Replace("Name=", ""); + break; + case 'P': + Phys = data.Replace("Phys=", ""); + break; + case 'S': + Sysfs = data.Replace("Sysfs=", ""); + break; + case 'H': + Handlers = data.Replace("Handlers=", "").Split(" "); + break; + case 'U': + Uniq = data.Replace("Uniq=", ""); + break; + default: + //do we need any more of this data? + break; + } + } + } + + #region Overrides of Object + + /// + public override string ToString() => $"{Name} - {EventPath}"; + + #endregion + } +} \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputDeviceFinder.cs b/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputDeviceFinder.cs new file mode 100644 index 000000000..7268b1ee4 --- /dev/null +++ b/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputDeviceFinder.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace Artemis.UI.Linux.Providers.Input +{ + public static class LinuxInputDeviceFinder + { + private const string DEVICES_FILE = "/proc/bus/input/devices"; + + public static IEnumerable Find() + { + return File.ReadAllLines(DEVICES_FILE) + .PartitionBy(s => s == "") //split on empty lines + .Select(lineGroup => new LinuxInputDevice(lineGroup)); + } + + //https://stackoverflow.com/questions/56623354 + private static IEnumerable> PartitionBy(this IEnumerable a, Func predicate) + { + int groupNumber = 0; + Func getGroupNumber = skip => + { + if (skip) + { + // prepare next group, we don't care if we increment more than once + // we only want to split groups + groupNumber++; + // null, to be able to filter out group separators + return null; + } + return groupNumber; + }; + return a + .Select(x => new { Value = x, GroupNumber = getGroupNumber(predicate(x))} ) + .Where(x => x.GroupNumber != null) + .GroupBy(x => x.GroupNumber) + .Select(g => g.Select(x => x.Value)); + } + } +} \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputDeviceReader.cs b/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputDeviceReader.cs new file mode 100644 index 000000000..81e4bd6c2 --- /dev/null +++ b/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputDeviceReader.cs @@ -0,0 +1,60 @@ +using System; +using System.IO; +using System.Runtime.InteropServices; +using System.Threading; +using System.Threading.Tasks; +using Artemis.UI.Linux.Utilities; + +namespace Artemis.UI.Linux.Providers.Input +{ + internal class LinuxInputDeviceReader + { + private readonly FileStream _stream; + private readonly Task _task; + private readonly CancellationTokenSource _cts; + private readonly byte[] _buffer; + internal event EventHandler? InputEvent; + + public LinuxInputDevice InputDevice { get; } + + public LinuxInputDeviceReader(LinuxInputDevice inputDevice) + { + InputDevice = inputDevice; + + _buffer = new byte[Marshal.SizeOf()]; + _stream = new FileStream(InputDevice.EventPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, 2048, FileOptions.Asynchronous); + _cts = new CancellationTokenSource(); + _task = Task.Run(Read, _cts.Token); + } + + private async Task Read() + { + while (!_cts.IsCancellationRequested) + { + try + { + int readBytes = await _stream.ReadAsync(_buffer, _cts.Token); + if (readBytes == 0) + continue; + + InputEvent?.Invoke(this, MemoryMarshal.Read(_buffer)); + } + catch + { + // ignored + } + } + } + + public void Dispose() + { + _cts.Cancel(); + + _stream.Flush(); + _stream.Dispose(); + + //_task.Wait(); //TODO: fix this, it hangs + _cts.Dispose(); + } + } +} \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputEventArgs.cs b/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputEventArgs.cs new file mode 100644 index 000000000..765d7b514 --- /dev/null +++ b/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputEventArgs.cs @@ -0,0 +1,12 @@ +namespace Artemis.UI.Linux.Providers.Input +{ + //https://www.kernel.org/doc/Documentation/input/input.txt + internal readonly struct LinuxInputEventArgs + { + internal readonly long TimeSeconds; + internal readonly long TimeMicroseconds; + internal readonly LinuxInputEventType Type; + internal readonly short Code; + internal readonly int Value; + } +} \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputEventType.cs b/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputEventType.cs new file mode 100644 index 000000000..dadeb76aa --- /dev/null +++ b/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputEventType.cs @@ -0,0 +1,68 @@ +namespace Artemis.UI.Linux.Providers.Input +{ + /// + /// https://www.kernel.org/doc/Documentation/input/event-codes.txt + /// + internal enum LinuxInputEventType : ushort + { + /// + /// Used as markers to separate events. Events may be separated in time or in space, such as with the multitouch protocol. + /// + SYN = 0x00, + + /// + /// Used to describe state changes of keyboards, buttons, or other key-like devices. + /// + KEY = 0x01, + + /// + /// Used to describe relative axis value changes, e.g. moving the mouse 5 units to the left. + /// + REL = 0x02, + + /// + /// Used to describe absolute axis value changes, e.g. describing the coordinates of a touch on a touchscreen. + /// + ABS = 0x03, + + /// + /// Used to describe miscellaneous input data that do not fit into other types. + /// + MSC = 0x04, + + /// + /// Used to describe binary state input switches. + /// + SW = 0x05, + + /// + /// Used to turn LEDs on devices on and off. + /// + LED = 0x11, + + /// + /// Used to output sound to devices. + /// + SND = 0x12, + + /// + /// Used for autorepeating devices. + /// + REP = 0x14, + + /// + /// Used to send force feedback commands to an input device. + /// + FF = 0x15, + + /// + /// A special type for power button and switch input. + /// + PWR = 0x16, + + /// + /// Used to receive force feedback device status. + /// + FF_STATUS = 0x17, + } +} \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputProvider.cs b/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputProvider.cs new file mode 100644 index 000000000..ea8baa816 --- /dev/null +++ b/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputProvider.cs @@ -0,0 +1,119 @@ +using System; +using System.Collections.Generic; +using Artemis.Core.Services; +using Artemis.UI.Linux.Utilities; +using Serilog; + +namespace Artemis.UI.Linux.Providers.Input +{ + public class LinuxInputProvider : InputProvider + { + private readonly IInputService _inputService; + private readonly ILogger _logger; + private readonly List _readers; + + public LinuxInputProvider(ILogger logger, IInputService inputService) + { + _logger = logger; + _inputService = inputService; + _readers = new List(); + + foreach (LinuxInputDevice deviceDefinition in LinuxInputDeviceFinder.Find()) + { + LinuxInputDeviceReader? reader = new LinuxInputDeviceReader(deviceDefinition); + reader.InputEvent += OnInputEvent; + _readers.Add(reader); + } + } + + private void OnInputEvent(object? sender, LinuxInputEventArgs e) + { + if (sender is not LinuxInputDeviceReader reader) + return; + + if (reader.InputDevice.IsKeyboard) + { + HandleKeyboardData(reader.InputDevice, e); + } + else if (reader.InputDevice.IsMouse) + { + HandleMouseData(reader.InputDevice, e); + } + else if (reader.InputDevice.IsGamePad) + { + //TODO: handle game pad input? + } + } + + private void HandleKeyboardData(LinuxInputDevice keyboard, LinuxInputEventArgs e) + { + switch (e.Type) + { + case LinuxInputEventType.KEY: + KeyboardKey key = InputUtilities.KeyFromKeyCode((LinuxKeyboardKeyCodes) e.Code); + bool isDown = e.Value != 0; + + _logger.Verbose($"Keyboard Key: {(LinuxKeyboardKeyCodes) e.Code} | Down: {isDown}"); + + //TODO: identify + + OnKeyboardDataReceived(null, key, isDown); + break; + default: + _logger.Verbose($"Unknown keyboard event type: {e.Type}"); + break; + } + } + + private void HandleMouseData(LinuxInputDevice mouse, LinuxInputEventArgs e) + { + switch (e.Type) + { + case LinuxInputEventType.KEY: + bool isDown = e.Value != 0; + MouseButton button = InputUtilities.MouseButtonFromButtonCode((LinuxKeyboardKeyCodes)e.Code); + + _logger.Verbose($"Mouse Button: {(LinuxKeyboardKeyCodes) e.Code} | Down: {isDown}"); + + //TODO: identify + + OnMouseButtonDataReceived(null, button, isDown); + break; + + case LinuxInputEventType.ABS: + LinuxAbsoluteAxis absoluteAxis = (LinuxAbsoluteAxis) e.Code; + _logger.Verbose($"Absolute mouse: axis={absoluteAxis} | value={e.Value}"); + break; + case LinuxInputEventType.REL: + LinuxRelativeAxis relativeAxis = (LinuxRelativeAxis) e.Code; + _logger.Verbose($"Relative mouse: axis={relativeAxis} | value={e.Value}"); + + //TODO: handle mouse movement + break; + default: + _logger.Verbose($"Unknown mouse event type: {e.Type}"); + break; + } + } + + #region Overrides of InputProvider + + /// + protected override void Dispose(bool disposing) + { + if (disposing) + { + for (int i = _readers.Count - 1; i >= 0; i--) + { + _readers[i].InputEvent -= OnInputEvent; + _readers[i].Dispose(); + _readers.RemoveAt(i); + } + } + + base.Dispose(disposing); + } + + #endregion + } +} \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxKeyboardKeyCodes.cs b/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxKeyboardKeyCodes.cs new file mode 100644 index 000000000..56a6f41ef --- /dev/null +++ b/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxKeyboardKeyCodes.cs @@ -0,0 +1,620 @@ +namespace Artemis.UI.Linux.Providers.Input +{ + //https://github.com/torvalds/linux/blob/master/include/uapi/linux/input-event-codes.h + public enum LinuxKeyboardKeyCodes + { + KEY_RESERVED = 0, + KEY_ESC = 1, + KEY_1 = 2, + KEY_2 = 3, + KEY_3 = 4, + KEY_4 = 5, + KEY_5 = 6, + KEY_6 = 7, + KEY_7 = 8, + KEY_8 = 9, + KEY_9 = 10, + KEY_0 = 11, + KEY_MINUS = 12, + KEY_EQUAL = 13, + KEY_BACKSPACE = 14, + KEY_TAB = 15, + KEY_Q = 16, + KEY_W = 17, + KEY_E = 18, + KEY_R = 19, + KEY_T = 20, + KEY_Y = 21, + KEY_U = 22, + KEY_I = 23, + KEY_O = 24, + KEY_P = 25, + KEY_LEFTBRACE = 26, + KEY_RIGHTBRACE = 27, + KEY_ENTER = 28, + KEY_LEFTCTRL = 29, + KEY_A = 30, + KEY_S = 31, + KEY_D = 32, + KEY_F = 33, + KEY_G = 34, + KEY_H = 35, + KEY_J = 36, + KEY_K = 37, + KEY_L = 38, + KEY_SEMICOLON = 39, + KEY_APOSTROPHE = 40, + KEY_GRAVE = 41, + KEY_LEFTSHIFT = 42, + KEY_BACKSLASH = 43, + KEY_Z = 44, + KEY_X = 45, + KEY_C = 46, + KEY_V = 47, + KEY_B = 48, + KEY_N = 49, + KEY_M = 50, + KEY_COMMA = 51, + KEY_DOT = 52, + KEY_SLASH = 53, + KEY_RIGHTSHIFT = 54, + KEY_KPASTERISK = 55, + KEY_LEFTALT = 56, + KEY_SPACE = 57, + KEY_CAPSLOCK = 58, + KEY_F1 = 59, + KEY_F2 = 60, + KEY_F3 = 61, + KEY_F4 = 62, + KEY_F5 = 63, + KEY_F6 = 64, + KEY_F7 = 65, + KEY_F8 = 66, + KEY_F9 = 67, + KEY_F10 = 68, + KEY_NUMLOCK = 69, + KEY_SCROLLLOCK = 70, + KEY_KP7 = 71, + KEY_KP8 = 72, + KEY_KP9 = 73, + KEY_KPMINUS = 74, + KEY_KP4 = 75, + KEY_KP5 = 76, + KEY_KP6 = 77, + KEY_KPPLUS = 78, + KEY_KP1 = 79, + KEY_KP2 = 80, + KEY_KP3 = 81, + KEY_KP0 = 82, + KEY_KPDOT = 83, + KEY_ZENKAKUHANKAKU = 85, + KEY_102ND = 86, + KEY_F11 = 87, + KEY_F12 = 88, + KEY_RO = 89, + KEY_KATAKANA = 90, + KEY_HIRAGANA = 91, + KEY_HENKAN = 92, + KEY_KATAKANAHIRAGANA = 93, + KEY_MUHENKAN = 94, + KEY_KPJPCOMMA = 95, + KEY_KPENTER = 96, + KEY_RIGHTCTRL = 97, + KEY_KPSLASH = 98, + KEY_SYSRQ = 99, + KEY_RIGHTALT = 100, + KEY_LINEFEED = 101, + KEY_HOME = 102, + KEY_UP = 103, + KEY_PAGEUP = 104, + KEY_LEFT = 105, + KEY_RIGHT = 106, + KEY_END = 107, + KEY_DOWN = 108, + KEY_PAGEDOWN = 109, + KEY_INSERT = 110, + KEY_DELETE = 111, + KEY_MACRO = 112, + KEY_MUTE = 113, + KEY_VOLUMEDOWN = 114, + KEY_VOLUMEUP = 115, + KEY_POWER = 116, /* SC System Power Down */ + KEY_KPEQUAL = 117, + KEY_KPPLUSMINUS = 118, + KEY_PAUSE = 119, + KEY_SCALE = 120, /* AL Compiz Scale (Expose) */ + KEY_KPCOMMA = 121, + KEY_HANGEUL = 122, + KEY_HANGUEL = KEY_HANGEUL, + KEY_HANJA = 123, + KEY_YEN = 124, + KEY_LEFTMETA = 125, + KEY_RIGHTMETA = 126, + KEY_COMPOSE = 127, + KEY_STOP = 128, /* AC Stop */ + KEY_AGAIN = 129, + KEY_PROPS = 130, /* AC Properties */ + KEY_UNDO = 131, /* AC Undo */ + KEY_FRONT = 132, + KEY_COPY = 133, /* AC Copy */ + KEY_OPEN = 134, /* AC Open */ + KEY_PASTE = 135, /* AC Paste */ + KEY_FIND = 136, /* AC Search */ + KEY_CUT = 137, /* AC Cut */ + KEY_HELP = 138, /* AL Integrated Help Center */ + KEY_MENU = 139, /* Menu (show menu) */ + KEY_CALC = 140, /* AL Calculator */ + KEY_SETUP = 141, + KEY_SLEEP = 142, /* SC System Sleep */ + KEY_WAKEUP = 143, /* System Wake Up */ + KEY_FILE = 144, /* AL Local Machine Browser */ + KEY_SENDFILE = 145, + KEY_DELETEFILE = 146, + KEY_XFER = 147, + KEY_PROG1 = 148, + KEY_PROG2 = 149, + KEY_WWW = 150, /* AL Internet Browser */ + KEY_MSDOS = 151, + KEY_COFFEE = 152, /* AL Terminal Lock/Screensaver */ + KEY_SCREENLOCK = KEY_COFFEE, + KEY_ROTATE_DISPLAY = 153, /* Display orientation for e.g. tablets */ + KEY_DIRECTION = KEY_ROTATE_DISPLAY, + KEY_CYCLEWINDOWS = 154, + KEY_MAIL = 155, + KEY_BOOKMARKS = 156, /* AC Bookmarks */ + KEY_COMPUTER = 157, + KEY_BACK = 158, /* AC Back */ + KEY_FORWARD = 159, /* AC Forward */ + KEY_CLOSECD = 160, + KEY_EJECTCD = 161, + KEY_EJECTCLOSECD = 162, + KEY_NEXTSONG = 163, + KEY_PLAYPAUSE = 164, + KEY_PREVIOUSSONG = 165, + KEY_STOPCD = 166, + KEY_RECORD = 167, + KEY_REWIND = 168, + KEY_PHONE = 169, /* Media Select Telephone */ + KEY_ISO = 170, + KEY_CONFIG = 171, /* AL Consumer Control Configuration */ + KEY_HOMEPAGE = 172, /* AC Home */ + KEY_REFRESH = 173, /* AC Refresh */ + KEY_EXIT = 174, /* AC Exit */ + KEY_MOVE = 175, + KEY_EDIT = 176, + KEY_SCROLLUP = 177, + KEY_SCROLLDOWN = 178, + KEY_KPLEFTPAREN = 179, + KEY_KPRIGHTPAREN = 180, + KEY_NEW = 181, /* AC New */ + KEY_REDO = 182, /* AC Redo/Repeat */ + KEY_F13 = 183, + KEY_F14 = 184, + KEY_F15 = 185, + KEY_F16 = 186, + KEY_F17 = 187, + KEY_F18 = 188, + KEY_F19 = 189, + KEY_F20 = 190, + KEY_F21 = 191, + KEY_F22 = 192, + KEY_F23 = 193, + KEY_F24 = 194, + KEY_PLAYCD = 200, + KEY_PAUSECD = 201, + KEY_PROG3 = 202, + KEY_PROG4 = 203, + KEY_DASHBOARD = 204, /* AL Dashboard */ + KEY_SUSPEND = 205, + KEY_CLOSE = 206, /* AC Close */ + KEY_PLAY = 207, + KEY_FASTFORWARD = 208, + KEY_BASSBOOST = 209, + KEY_PRINT = 210, /* AC Print */ + KEY_HP = 211, + KEY_CAMERA = 212, + KEY_SOUND = 213, + KEY_QUESTION = 214, + KEY_EMAIL = 215, + KEY_CHAT = 216, + KEY_SEARCH = 217, + KEY_CONNECT = 218, + KEY_FINANCE = 219, /* AL Checkbook/Finance */ + KEY_SPORT = 220, + KEY_SHOP = 221, + KEY_ALTERASE = 222, + KEY_CANCEL = 223, /* AC Cancel */ + KEY_BRIGHTNESSDOWN = 224, + KEY_BRIGHTNESSUP = 225, + KEY_MEDIA = 226, + KEY_SWITCHVIDEOMODE = 227, + KEY_KBDILLUMTOGGLE = 228, + KEY_KBDILLUMDOWN = 229, + KEY_KBDILLUMUP = 230, + KEY_SEND = 231, /* AC Send */ + KEY_REPLY = 232, /* AC Reply */ + KEY_FORWARDMAIL = 233, /* AC Forward Msg */ + KEY_SAVE = 234, /* AC Save */ + KEY_DOCUMENTS = 235, + KEY_BATTERY = 236, + KEY_BLUETOOTH = 237, + KEY_WLAN = 238, + KEY_UWB = 239, + KEY_UNKNOWN = 240, + KEY_VIDEO_NEXT = 241, /* drive next video source */ + KEY_VIDEO_PREV = 242, /* drive previous video source */ + KEY_BRIGHTNESS_CYCLE = 243, /* brightness up, after max is min */ + KEY_BRIGHTNESS_AUTO = 244, /* Set Auto Brightness: manual + KEY_BRIGHTNESS_ZERO = KEY_BRIGHTNESS_AUTO, + KEY_DISPLAY_OFF = 245, /* display device to off state */ + KEY_WWAN = 246, /* Wireless WAN (LTE, UMTS, GSM, etc.) */ + KEY_WIMAX = KEY_WWAN, + KEY_RFKILL = 247, /* Key that controls all radios */ + KEY_MICMUTE = 248, /* Mute / unmute the microphone */ + BTN_MISC = 0x100, + BTN_0 = 0x100, + BTN_1 = 0x101, + BTN_2 = 0x102, + BTN_3 = 0x103, + BTN_4 = 0x104, + BTN_5 = 0x105, + BTN_6 = 0x106, + BTN_7 = 0x107, + BTN_8 = 0x108, + BTN_9 = 0x109, + BTN_MOUSE = 0x110, + BTN_LEFT = 0x110, + BTN_RIGHT = 0x111, + BTN_MIDDLE = 0x112, + BTN_SIDE = 0x113, + BTN_EXTRA = 0x114, + BTN_FORWARD = 0x115, + BTN_BACK = 0x116, + BTN_TASK = 0x117, + BTN_JOYSTICK = 0x120, + BTN_TRIGGER = 0x120, + BTN_THUMB = 0x121, + BTN_THUMB2 = 0x122, + BTN_TOP = 0x123, + BTN_TOP2 = 0x124, + BTN_PINKIE = 0x125, + BTN_BASE = 0x126, + BTN_BASE2 = 0x127, + BTN_BASE3 = 0x128, + BTN_BASE4 = 0x129, + BTN_BASE5 = 0x12a, + BTN_BASE6 = 0x12b, + BTN_DEAD = 0x12f, + BTN_GAMEPAD = 0x130, + BTN_SOUTH = 0x130, + BTN_A = BTN_SOUTH, + BTN_EAST = 0x131, + BTN_B = BTN_EAST, + BTN_C = 0x132, + BTN_NORTH = 0x133, + BTN_X = BTN_NORTH, + BTN_WEST = 0x134, + BTN_Y = BTN_WEST, + BTN_Z = 0x135, + BTN_TL = 0x136, + BTN_TR = 0x137, + BTN_TL2 = 0x138, + BTN_TR2 = 0x139, + BTN_SELECT = 0x13a, + BTN_START = 0x13b, + BTN_MODE = 0x13c, + BTN_THUMBL = 0x13d, + BTN_THUMBR = 0x13e, + BTN_DIGI = 0x140, + BTN_TOOL_PEN = 0x140, + BTN_TOOL_RUBBER = 0x141, + BTN_TOOL_BRUSH = 0x142, + BTN_TOOL_PENCIL = 0x143, + BTN_TOOL_AIRBRUSH = 0x144, + BTN_TOOL_FINGER = 0x145, + BTN_TOOL_MOUSE = 0x146, + BTN_TOOL_LENS = 0x147, + BTN_TOOL_QUINTTAP = 0x148, /* Five fingers on trackpad */ + BTN_STYLUS3 = 0x149, + BTN_TOUCH = 0x14a, + BTN_STYLUS = 0x14b, + BTN_STYLUS2 = 0x14c, + BTN_TOOL_DOUBLETAP = 0x14d, + BTN_TOOL_TRIPLETAP = 0x14e, + BTN_TOOL_QUADTAP = 0x14f, /* Four fingers on trackpad */ + BTN_WHEEL = 0x150, + BTN_GEAR_DOWN = 0x150, + BTN_GEAR_UP = 0x151, + KEY_OK = 0x160, + KEY_SELECT = 0x161, + KEY_GOTO = 0x162, + KEY_CLEAR = 0x163, + KEY_POWER2 = 0x164, + KEY_OPTION = 0x165, + KEY_INFO = 0x166, /* AL OEM Features/Tips/Tutorial */ + KEY_TIME = 0x167, + KEY_VENDOR = 0x168, + KEY_ARCHIVE = 0x169, + KEY_PROGRAM = 0x16a, /* Media Select Program Guide */ + KEY_CHANNEL = 0x16b, + KEY_FAVORITES = 0x16c, + KEY_EPG = 0x16d, + KEY_PVR = 0x16e, /* Media Select Home */ + KEY_MHP = 0x16f, + KEY_LANGUAGE = 0x170, + KEY_TITLE = 0x171, + KEY_SUBTITLE = 0x172, + KEY_ANGLE = 0x173, + KEY_FULL_SCREEN = 0x174, /* AC View Toggle */ + KEY_ZOOM = KEY_FULL_SCREEN, + KEY_MODE = 0x175, + KEY_KEYBOARD = 0x176, + KEY_ASPECT_RATIO = 0x177, /* HUTRR37: Aspect */ + KEY_SCREEN = KEY_ASPECT_RATIO, + KEY_PC = 0x178, /* Media Select Computer */ + KEY_TV = 0x179, /* Media Select TV */ + KEY_TV2 = 0x17a, /* Media Select Cable */ + KEY_VCR = 0x17b, /* Media Select VCR */ + KEY_VCR2 = 0x17c, /* VCR Plus */ + KEY_SAT = 0x17d, /* Media Select Satellite */ + KEY_SAT2 = 0x17e, + KEY_CD = 0x17f, /* Media Select CD */ + KEY_TAPE = 0x180, /* Media Select Tape */ + KEY_RADIO = 0x181, + KEY_TUNER = 0x182, /* Media Select Tuner */ + KEY_PLAYER = 0x183, + KEY_TEXT = 0x184, + KEY_DVD = 0x185, /* Media Select DVD */ + KEY_AUX = 0x186, + KEY_MP3 = 0x187, + KEY_AUDIO = 0x188, /* AL Audio Browser */ + KEY_VIDEO = 0x189, /* AL Movie Browser */ + KEY_DIRECTORY = 0x18a, + KEY_LIST = 0x18b, + KEY_MEMO = 0x18c, /* Media Select Messages */ + KEY_CALENDAR = 0x18d, + KEY_RED = 0x18e, + KEY_GREEN = 0x18f, + KEY_YELLOW = 0x190, + KEY_BLUE = 0x191, + KEY_CHANNELUP = 0x192, /* Channel Increment */ + KEY_CHANNELDOWN = 0x193, /* Channel Decrement */ + KEY_FIRST = 0x194, + KEY_LAST = 0x195, /* Recall Last */ + KEY_AB = 0x196, + KEY_NEXT = 0x197, + KEY_RESTART = 0x198, + KEY_SLOW = 0x199, + KEY_SHUFFLE = 0x19a, + KEY_BREAK = 0x19b, + KEY_PREVIOUS = 0x19c, + KEY_DIGITS = 0x19d, + KEY_TEEN = 0x19e, + KEY_TWEN = 0x19f, + KEY_VIDEOPHONE = 0x1a0, /* Media Select Video Phone */ + KEY_GAMES = 0x1a1, /* Media Select Games */ + KEY_ZOOMIN = 0x1a2, /* AC Zoom In */ + KEY_ZOOMOUT = 0x1a3, /* AC Zoom Out */ + KEY_ZOOMRESET = 0x1a4, /* AC Zoom */ + KEY_WORDPROCESSOR = 0x1a5, /* AL Word Processor */ + KEY_EDITOR = 0x1a6, /* AL Text Editor */ + KEY_SPREADSHEET = 0x1a7, /* AL Spreadsheet */ + KEY_GRAPHICSEDITOR = 0x1a8, /* AL Graphics Editor */ + KEY_PRESENTATION = 0x1a9, /* AL Presentation App */ + KEY_DATABASE = 0x1aa, /* AL Database App */ + KEY_NEWS = 0x1ab, /* AL Newsreader */ + KEY_VOICEMAIL = 0x1ac, /* AL Voicemail */ + KEY_ADDRESSBOOK = 0x1ad, /* AL Contacts/Address Book */ + KEY_MESSENGER = 0x1ae, /* AL Instant Messaging */ + KEY_DISPLAYTOGGLE = 0x1af, /* Turn display (LCD) on and off */ + KEY_BRIGHTNESS_TOGGLE = KEY_DISPLAYTOGGLE, + KEY_SPELLCHECK = 0x1b0, /* AL Spell Check */ + KEY_LOGOFF = 0x1b1, /* AL Logoff */ + KEY_DOLLAR = 0x1b2, + KEY_EURO = 0x1b3, + KEY_FRAMEBACK = 0x1b4, /* Consumer - transport controls */ + KEY_FRAMEFORWARD = 0x1b5, + KEY_CONTEXT_MENU = 0x1b6, /* GenDesc - system context menu */ + KEY_MEDIA_REPEAT = 0x1b7, /* Consumer - transport control */ + KEY_10CHANNELSUP = 0x1b8, /* 10 channels up (10+) */ + KEY_10CHANNELSDOWN = 0x1b9, /* 10 channels down (10-) */ + KEY_IMAGES = 0x1ba, /* AL Image Browser */ + KEY_NOTIFICATION_CENTER = 0x1bc, /* Show/hide the notification center */ + KEY_PICKUP_PHONE = 0x1bd, /* Answer incoming call */ + KEY_HANGUP_PHONE = 0x1be, /* Decline incoming call */ + KEY_DEL_EOL = 0x1c0, + KEY_DEL_EOS = 0x1c1, + KEY_INS_LINE = 0x1c2, + KEY_DEL_LINE = 0x1c3, + KEY_FN = 0x1d0, + KEY_FN_ESC = 0x1d1, + KEY_FN_F1 = 0x1d2, + KEY_FN_F2 = 0x1d3, + KEY_FN_F3 = 0x1d4, + KEY_FN_F4 = 0x1d5, + KEY_FN_F5 = 0x1d6, + KEY_FN_F6 = 0x1d7, + KEY_FN_F7 = 0x1d8, + KEY_FN_F8 = 0x1d9, + KEY_FN_F9 = 0x1da, + KEY_FN_F10 = 0x1db, + KEY_FN_F11 = 0x1dc, + KEY_FN_F12 = 0x1dd, + KEY_FN_1 = 0x1de, + KEY_FN_2 = 0x1df, + KEY_FN_D = 0x1e0, + KEY_FN_E = 0x1e1, + KEY_FN_F = 0x1e2, + KEY_FN_S = 0x1e3, + KEY_FN_B = 0x1e4, + KEY_FN_RIGHT_SHIFT = 0x1e5, + KEY_BRL_DOT1 = 0x1f1, + KEY_BRL_DOT2 = 0x1f2, + KEY_BRL_DOT3 = 0x1f3, + KEY_BRL_DOT4 = 0x1f4, + KEY_BRL_DOT5 = 0x1f5, + KEY_BRL_DOT6 = 0x1f6, + KEY_BRL_DOT7 = 0x1f7, + KEY_BRL_DOT8 = 0x1f8, + KEY_BRL_DOT9 = 0x1f9, + KEY_BRL_DOT10 = 0x1fa, + KEY_NUMERIC_0 = 0x200, /* used by phones, remote controls, */ + KEY_NUMERIC_1 = 0x201, /* and other keypads */ + KEY_NUMERIC_2 = 0x202, + KEY_NUMERIC_3 = 0x203, + KEY_NUMERIC_4 = 0x204, + KEY_NUMERIC_5 = 0x205, + KEY_NUMERIC_6 = 0x206, + KEY_NUMERIC_7 = 0x207, + KEY_NUMERIC_8 = 0x208, + KEY_NUMERIC_9 = 0x209, + KEY_NUMERIC_STAR = 0x20a, + KEY_NUMERIC_POUND = 0x20b, + KEY_NUMERIC_A = 0x20c, /* Phone key A - HUT Telephony 0xb9 */ + KEY_NUMERIC_B = 0x20d, + KEY_NUMERIC_C = 0x20e, + KEY_NUMERIC_D = 0x20f, + KEY_CAMERA_FOCUS = 0x210, + KEY_WPS_BUTTON = 0x211, /* WiFi Protected Setup key */ + KEY_TOUCHPAD_TOGGLE = 0x212, /* Request switch touchpad on or off */ + KEY_TOUCHPAD_ON = 0x213, + KEY_TOUCHPAD_OFF = 0x214, + KEY_CAMERA_ZOOMIN = 0x215, + KEY_CAMERA_ZOOMOUT = 0x216, + KEY_CAMERA_UP = 0x217, + KEY_CAMERA_DOWN = 0x218, + KEY_CAMERA_LEFT = 0x219, + KEY_CAMERA_RIGHT = 0x21a, + KEY_ATTENDANT_ON = 0x21b, + KEY_ATTENDANT_OFF = 0x21c, + KEY_ATTENDANT_TOGGLE = 0x21d, /* Attendant call on or off */ + KEY_LIGHTS_TOGGLE = 0x21e, /* Reading light on or off */ + BTN_DPAD_UP = 0x220, + BTN_DPAD_DOWN = 0x221, + BTN_DPAD_LEFT = 0x222, + BTN_DPAD_RIGHT = 0x223, + KEY_ALS_TOGGLE = 0x230, /* Ambient light sensor */ + KEY_ROTATE_LOCK_TOGGLE = 0x231, /* Display rotation lock */ + KEY_BUTTONCONFIG = 0x240, /* AL Button Configuration */ + KEY_TASKMANAGER = 0x241, /* AL Task/Project Manager */ + KEY_JOURNAL = 0x242, /* AL Log/Journal/Timecard */ + KEY_CONTROLPANEL = 0x243, /* AL Control Panel */ + KEY_APPSELECT = 0x244, /* AL Select Task/Application */ + KEY_SCREENSAVER = 0x245, /* AL Screen Saver */ + KEY_VOICECOMMAND = 0x246, /* Listening Voice Command */ + KEY_ASSISTANT = 0x247, /* AL Context-aware desktop assistant */ + KEY_KBD_LAYOUT_NEXT = 0x248, /* AC Next Keyboard Layout Select */ + KEY_EMOJI_PICKER = 0x249, /* Show/hide emoji picker (HUTRR101) */ + KEY_BRIGHTNESS_MIN = 0x250, /* Set Brightness to Minimum */ + KEY_BRIGHTNESS_MAX = 0x251, /* Set Brightness to Maximum */ + KEY_KBDINPUTASSIST_PREV = 0x260, + KEY_KBDINPUTASSIST_NEXT = 0x261, + KEY_KBDINPUTASSIST_PREVGROUP = 0x262, + KEY_KBDINPUTASSIST_NEXTGROUP = 0x263, + KEY_KBDINPUTASSIST_ACCEPT = 0x264, + KEY_KBDINPUTASSIST_CANCEL = 0x265, + KEY_RIGHT_UP = 0x266, + KEY_RIGHT_DOWN = 0x267, + KEY_LEFT_UP = 0x268, + KEY_LEFT_DOWN = 0x269, + KEY_ROOT_MENU = 0x26a, /* Show Device's Root Menu */ + KEY_MEDIA_TOP_MENU = 0x26b, + KEY_NUMERIC_11 = 0x26c, + KEY_NUMERIC_12 = 0x26d, + KEY_AUDIO_DESC = 0x26e, + KEY_3D_MODE = 0x26f, + KEY_NEXT_FAVORITE = 0x270, + KEY_STOP_RECORD = 0x271, + KEY_PAUSE_RECORD = 0x272, + KEY_VOD = 0x273, /* Video on Demand */ + KEY_UNMUTE = 0x274, + KEY_FASTREVERSE = 0x275, + KEY_SLOWREVERSE = 0x276, + KEY_DATA = 0x277, + KEY_ONSCREEN_KEYBOARD = 0x278, + KEY_PRIVACY_SCREEN_TOGGLE = 0x279, + KEY_SELECTIVE_SCREENSHOT = 0x27a, + KEY_MACRO1 = 0x290, + KEY_MACRO2 = 0x291, + KEY_MACRO3 = 0x292, + KEY_MACRO4 = 0x293, + KEY_MACRO5 = 0x294, + KEY_MACRO6 = 0x295, + KEY_MACRO7 = 0x296, + KEY_MACRO8 = 0x297, + KEY_MACRO9 = 0x298, + KEY_MACRO10 = 0x299, + KEY_MACRO11 = 0x29a, + KEY_MACRO12 = 0x29b, + KEY_MACRO13 = 0x29c, + KEY_MACRO14 = 0x29d, + KEY_MACRO15 = 0x29e, + KEY_MACRO16 = 0x29f, + KEY_MACRO17 = 0x2a0, + KEY_MACRO18 = 0x2a1, + KEY_MACRO19 = 0x2a2, + KEY_MACRO20 = 0x2a3, + KEY_MACRO21 = 0x2a4, + KEY_MACRO22 = 0x2a5, + KEY_MACRO23 = 0x2a6, + KEY_MACRO24 = 0x2a7, + KEY_MACRO25 = 0x2a8, + KEY_MACRO26 = 0x2a9, + KEY_MACRO27 = 0x2aa, + KEY_MACRO28 = 0x2ab, + KEY_MACRO29 = 0x2ac, + KEY_MACRO30 = 0x2ad, + KEY_MACRO_RECORD_START = 0x2b0, + KEY_MACRO_RECORD_STOP = 0x2b1, + KEY_MACRO_PRESET_CYCLE = 0x2b2, + KEY_MACRO_PRESET1 = 0x2b3, + KEY_MACRO_PRESET2 = 0x2b4, + KEY_MACRO_PRESET3 = 0x2b5, + KEY_KBD_LCD_MENU1 = 0x2b8, + KEY_KBD_LCD_MENU2 = 0x2b9, + KEY_KBD_LCD_MENU3 = 0x2ba, + KEY_KBD_LCD_MENU4 = 0x2bb, + KEY_KBD_LCD_MENU5 = 0x2bc, + BTN_TRIGGER_HAPPY = 0x2c0, + BTN_TRIGGER_HAPPY1 = 0x2c0, + BTN_TRIGGER_HAPPY2 = 0x2c1, + BTN_TRIGGER_HAPPY3 = 0x2c2, + BTN_TRIGGER_HAPPY4 = 0x2c3, + BTN_TRIGGER_HAPPY5 = 0x2c4, + BTN_TRIGGER_HAPPY6 = 0x2c5, + BTN_TRIGGER_HAPPY7 = 0x2c6, + BTN_TRIGGER_HAPPY8 = 0x2c7, + BTN_TRIGGER_HAPPY9 = 0x2c8, + BTN_TRIGGER_HAPPY10 = 0x2c9, + BTN_TRIGGER_HAPPY11 = 0x2ca, + BTN_TRIGGER_HAPPY12 = 0x2cb, + BTN_TRIGGER_HAPPY13 = 0x2cc, + BTN_TRIGGER_HAPPY14 = 0x2cd, + BTN_TRIGGER_HAPPY15 = 0x2ce, + BTN_TRIGGER_HAPPY16 = 0x2cf, + BTN_TRIGGER_HAPPY17 = 0x2d0, + BTN_TRIGGER_HAPPY18 = 0x2d1, + BTN_TRIGGER_HAPPY19 = 0x2d2, + BTN_TRIGGER_HAPPY20 = 0x2d3, + BTN_TRIGGER_HAPPY21 = 0x2d4, + BTN_TRIGGER_HAPPY22 = 0x2d5, + BTN_TRIGGER_HAPPY23 = 0x2d6, + BTN_TRIGGER_HAPPY24 = 0x2d7, + BTN_TRIGGER_HAPPY25 = 0x2d8, + BTN_TRIGGER_HAPPY26 = 0x2d9, + BTN_TRIGGER_HAPPY27 = 0x2da, + BTN_TRIGGER_HAPPY28 = 0x2db, + BTN_TRIGGER_HAPPY29 = 0x2dc, + BTN_TRIGGER_HAPPY30 = 0x2dd, + BTN_TRIGGER_HAPPY31 = 0x2de, + BTN_TRIGGER_HAPPY32 = 0x2df, + BTN_TRIGGER_HAPPY33 = 0x2e0, + BTN_TRIGGER_HAPPY34 = 0x2e1, + BTN_TRIGGER_HAPPY35 = 0x2e2, + BTN_TRIGGER_HAPPY36 = 0x2e3, + BTN_TRIGGER_HAPPY37 = 0x2e4, + BTN_TRIGGER_HAPPY38 = 0x2e5, + BTN_TRIGGER_HAPPY39 = 0x2e6, + BTN_TRIGGER_HAPPY40 = 0x2e7, + } +} \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxRelativeAxis.cs b/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxRelativeAxis.cs new file mode 100644 index 000000000..c209bb920 --- /dev/null +++ b/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxRelativeAxis.cs @@ -0,0 +1,16 @@ +namespace Artemis.UI.Linux.Providers.Input +{ + public enum LinuxRelativeAxis + { + REL_X = 0x00, + REL_Y = 0x01, + REL_Z = 0x02, + REL_RX = 0x03, + REL_RY = 0x04, + REL_RZ = 0x05, + REL_HWHEEL = 0x06, + REL_DIAL = 0x07, + REL_WHEEL = 0x08, + REL_MISC = 0x09, + } +} \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.Linux/Utilities/InputUtilities.cs b/src/Avalonia/Artemis.UI.Linux/Utilities/InputUtilities.cs new file mode 100644 index 000000000..3fd33fbcb --- /dev/null +++ b/src/Avalonia/Artemis.UI.Linux/Utilities/InputUtilities.cs @@ -0,0 +1,621 @@ +using System; +using Artemis.Core.Services; +using Artemis.UI.Linux.Providers.Input; + +namespace Artemis.UI.Linux.Utilities +{ + public static class InputUtilities + { + public static KeyboardKey KeyFromKeyCode(LinuxKeyboardKeyCodes code) => code switch + { + LinuxKeyboardKeyCodes.KEY_ESC => KeyboardKey.Escape, + LinuxKeyboardKeyCodes.KEY_1 => KeyboardKey.D1, + LinuxKeyboardKeyCodes.KEY_2 => KeyboardKey.D2, + LinuxKeyboardKeyCodes.KEY_3 => KeyboardKey.D3, + LinuxKeyboardKeyCodes.KEY_4 => KeyboardKey.D4, + LinuxKeyboardKeyCodes.KEY_5 => KeyboardKey.D5, + LinuxKeyboardKeyCodes.KEY_6 => KeyboardKey.D6, + LinuxKeyboardKeyCodes.KEY_7 => KeyboardKey.D7, + LinuxKeyboardKeyCodes.KEY_8 => KeyboardKey.D8, + LinuxKeyboardKeyCodes.KEY_9 => KeyboardKey.D9, + LinuxKeyboardKeyCodes.KEY_0 => KeyboardKey.D0, + LinuxKeyboardKeyCodes.KEY_MINUS => KeyboardKey.OemMinus, + LinuxKeyboardKeyCodes.KEY_EQUAL => KeyboardKey.OemPlus, + LinuxKeyboardKeyCodes.KEY_BACKSPACE => KeyboardKey.Back, + LinuxKeyboardKeyCodes.KEY_TAB => KeyboardKey.Tab, + LinuxKeyboardKeyCodes.KEY_Q => KeyboardKey.Q, + LinuxKeyboardKeyCodes.KEY_W => KeyboardKey.W, + LinuxKeyboardKeyCodes.KEY_E => KeyboardKey.E, + LinuxKeyboardKeyCodes.KEY_R => KeyboardKey.R, + LinuxKeyboardKeyCodes.KEY_T => KeyboardKey.T, + LinuxKeyboardKeyCodes.KEY_Y => KeyboardKey.Y, + LinuxKeyboardKeyCodes.KEY_U => KeyboardKey.U, + LinuxKeyboardKeyCodes.KEY_I => KeyboardKey.I, + LinuxKeyboardKeyCodes.KEY_O => KeyboardKey.O, + LinuxKeyboardKeyCodes.KEY_P => KeyboardKey.P, + LinuxKeyboardKeyCodes.KEY_LEFTBRACE => KeyboardKey.OemOpenBrackets, + LinuxKeyboardKeyCodes.KEY_RIGHTBRACE => KeyboardKey.OemCloseBrackets, + LinuxKeyboardKeyCodes.KEY_ENTER => KeyboardKey.Enter, + LinuxKeyboardKeyCodes.KEY_LEFTCTRL => KeyboardKey.LeftCtrl, + LinuxKeyboardKeyCodes.KEY_A => KeyboardKey.A, + LinuxKeyboardKeyCodes.KEY_S => KeyboardKey.S, + LinuxKeyboardKeyCodes.KEY_D => KeyboardKey.D, + LinuxKeyboardKeyCodes.KEY_F => KeyboardKey.F, + LinuxKeyboardKeyCodes.KEY_G => KeyboardKey.G, + LinuxKeyboardKeyCodes.KEY_H => KeyboardKey.H, + LinuxKeyboardKeyCodes.KEY_J => KeyboardKey.J, + LinuxKeyboardKeyCodes.KEY_K => KeyboardKey.K, + LinuxKeyboardKeyCodes.KEY_L => KeyboardKey.L, + LinuxKeyboardKeyCodes.KEY_SEMICOLON => KeyboardKey.OemSemicolon, + LinuxKeyboardKeyCodes.KEY_APOSTROPHE => KeyboardKey.OemQuotes, + LinuxKeyboardKeyCodes.KEY_GRAVE => KeyboardKey.OemTilde, + LinuxKeyboardKeyCodes.KEY_LEFTSHIFT => KeyboardKey.LeftShift, + LinuxKeyboardKeyCodes.KEY_BACKSLASH => KeyboardKey.OemBackslash, + LinuxKeyboardKeyCodes.KEY_Z => KeyboardKey.Z, + LinuxKeyboardKeyCodes.KEY_X => KeyboardKey.X, + LinuxKeyboardKeyCodes.KEY_C => KeyboardKey.C, + LinuxKeyboardKeyCodes.KEY_V => KeyboardKey.V, + LinuxKeyboardKeyCodes.KEY_B => KeyboardKey.B, + LinuxKeyboardKeyCodes.KEY_N => KeyboardKey.N, + LinuxKeyboardKeyCodes.KEY_M => KeyboardKey.M, + LinuxKeyboardKeyCodes.KEY_COMMA => KeyboardKey.OemComma, + LinuxKeyboardKeyCodes.KEY_DOT => KeyboardKey.OemPeriod, + LinuxKeyboardKeyCodes.KEY_SLASH => KeyboardKey.OemQuestion, + LinuxKeyboardKeyCodes.KEY_RIGHTSHIFT => KeyboardKey.RightShift, + //LinuxKeyboardKeyCodes.KEY_KPASTERISK => , + LinuxKeyboardKeyCodes.KEY_LEFTALT => KeyboardKey.LeftAlt, + LinuxKeyboardKeyCodes.KEY_SPACE => KeyboardKey.Space, + LinuxKeyboardKeyCodes.KEY_CAPSLOCK => KeyboardKey.CapsLock, + LinuxKeyboardKeyCodes.KEY_F1 => KeyboardKey.F1, + LinuxKeyboardKeyCodes.KEY_F2 => KeyboardKey.F2, + LinuxKeyboardKeyCodes.KEY_F3 => KeyboardKey.F3, + LinuxKeyboardKeyCodes.KEY_F4 => KeyboardKey.F4, + LinuxKeyboardKeyCodes.KEY_F5 => KeyboardKey.F5, + LinuxKeyboardKeyCodes.KEY_F6 => KeyboardKey.F6, + LinuxKeyboardKeyCodes.KEY_F7 => KeyboardKey.F7, + LinuxKeyboardKeyCodes.KEY_F8 => KeyboardKey.F8, + LinuxKeyboardKeyCodes.KEY_F9 => KeyboardKey.F9, + LinuxKeyboardKeyCodes.KEY_F10 => KeyboardKey.F10, + LinuxKeyboardKeyCodes.KEY_NUMLOCK => KeyboardKey.NumLock, + LinuxKeyboardKeyCodes.KEY_SCROLLLOCK => KeyboardKey.Scroll, + LinuxKeyboardKeyCodes.KEY_KP7 => KeyboardKey.NumPad7, + LinuxKeyboardKeyCodes.KEY_KP8 => KeyboardKey.NumPad8, + LinuxKeyboardKeyCodes.KEY_KP9 => KeyboardKey.NumPad9, + LinuxKeyboardKeyCodes.KEY_KPMINUS => KeyboardKey.Subtract, + LinuxKeyboardKeyCodes.KEY_KP4 => KeyboardKey.NumPad4, + LinuxKeyboardKeyCodes.KEY_KP5 => KeyboardKey.NumPad5, + LinuxKeyboardKeyCodes.KEY_KP6 => KeyboardKey.NumPad6, + LinuxKeyboardKeyCodes.KEY_KPPLUS => KeyboardKey.Add, + LinuxKeyboardKeyCodes.KEY_KP1 => KeyboardKey.NumPad1, + LinuxKeyboardKeyCodes.KEY_KP2 => KeyboardKey.NumPad2, + LinuxKeyboardKeyCodes.KEY_KP3 => KeyboardKey.NumPad3, + LinuxKeyboardKeyCodes.KEY_KP0 => KeyboardKey.NumPad0, + LinuxKeyboardKeyCodes.KEY_KPDOT => KeyboardKey.Decimal, + // LinuxKeyboardKeyCodes.KEY_ZENKAKUHANKAKU => expr, + // LinuxKeyboardKeyCodes.KEY_102ND => expr, + LinuxKeyboardKeyCodes.KEY_F11 => KeyboardKey.F11, + LinuxKeyboardKeyCodes.KEY_F12 => KeyboardKey.F12, + //LinuxKeyboardKeyCodes.KEY_RO => expr, + // LinuxKeyboardKeyCodes.KEY_KATAKANA => expr, + // LinuxKeyboardKeyCodes.KEY_HIRAGANA => expr, + // LinuxKeyboardKeyCodes.KEY_HENKAN => expr, + // LinuxKeyboardKeyCodes.KEY_KATAKANAHIRAGANA => expr, + // LinuxKeyboardKeyCodes.KEY_MUHENKAN => expr, + // LinuxKeyboardKeyCodes.KEY_KPJPCOMMA => expr, + LinuxKeyboardKeyCodes.KEY_KPENTER => KeyboardKey.NumPadEnter, + LinuxKeyboardKeyCodes.KEY_RIGHTCTRL => KeyboardKey.RightCtrl, + LinuxKeyboardKeyCodes.KEY_KPSLASH => KeyboardKey.Divide, + LinuxKeyboardKeyCodes.KEY_SYSRQ => KeyboardKey.System,//TODO:? + LinuxKeyboardKeyCodes.KEY_RIGHTALT => KeyboardKey.RightAlt, + LinuxKeyboardKeyCodes.KEY_LINEFEED => KeyboardKey.LineFeed, + LinuxKeyboardKeyCodes.KEY_HOME => KeyboardKey.Home, + LinuxKeyboardKeyCodes.KEY_UP => KeyboardKey.Up, + LinuxKeyboardKeyCodes.KEY_PAGEUP => KeyboardKey.PageUp, + LinuxKeyboardKeyCodes.KEY_LEFT => KeyboardKey.Left, + LinuxKeyboardKeyCodes.KEY_RIGHT => KeyboardKey.Right, + LinuxKeyboardKeyCodes.KEY_END => KeyboardKey.End, + LinuxKeyboardKeyCodes.KEY_DOWN => KeyboardKey.Down, + LinuxKeyboardKeyCodes.KEY_PAGEDOWN => KeyboardKey.PageDown, + LinuxKeyboardKeyCodes.KEY_INSERT => KeyboardKey.Insert, + LinuxKeyboardKeyCodes.KEY_DELETE => KeyboardKey.Delete, + // LinuxKeyboardKeyCodes.KEY_MACRO => KeyboardKey.macro, + LinuxKeyboardKeyCodes.KEY_MUTE => KeyboardKey.VolumeMute, + LinuxKeyboardKeyCodes.KEY_VOLUMEDOWN => KeyboardKey.VolumeDown, + LinuxKeyboardKeyCodes.KEY_VOLUMEUP => KeyboardKey.VolumeUp, + // LinuxKeyboardKeyCodes.KEY_POWER => KeyboardKey.power, + LinuxKeyboardKeyCodes.KEY_KPEQUAL => KeyboardKey.NumPadEnter,//todo: ? + // LinuxKeyboardKeyCodes.KEY_KPPLUSMINUS => KeyboardKey.numpad, + LinuxKeyboardKeyCodes.KEY_PAUSE => KeyboardKey.Pause, + // LinuxKeyboardKeyCodes.KEY_SCALE => KeyboardKey.scal, + // LinuxKeyboardKeyCodes.KEY_KPCOMMA => KeyboardKey.ke, + // LinuxKeyboardKeyCodes.KEY_HANGEUL => expr, + // LinuxKeyboardKeyCodes.KEY_HANJA => expr, + // LinuxKeyboardKeyCodes.KEY_YEN => expr, + LinuxKeyboardKeyCodes.KEY_LEFTMETA => KeyboardKey.LWin, + LinuxKeyboardKeyCodes.KEY_RIGHTMETA => KeyboardKey.RWin, + // LinuxKeyboardKeyCodes.KEY_COMPOSE => , + LinuxKeyboardKeyCodes.KEY_STOP => KeyboardKey.MediaStop, + // LinuxKeyboardKeyCodes.KEY_AGAIN => , + // LinuxKeyboardKeyCodes.KEY_PROPS => expr, + // LinuxKeyboardKeyCodes.KEY_UNDO => expr, + // LinuxKeyboardKeyCodes.KEY_FRONT => expr, + // LinuxKeyboardKeyCodes.KEY_COPY => expr, + // LinuxKeyboardKeyCodes.KEY_OPEN => expr, + // LinuxKeyboardKeyCodes.KEY_PASTE => expr, + // LinuxKeyboardKeyCodes.KEY_FIND => expr, + // LinuxKeyboardKeyCodes.KEY_CUT => expr, + // LinuxKeyboardKeyCodes.KEY_HELP => expr, + // LinuxKeyboardKeyCodes.KEY_MENU => expr, + // LinuxKeyboardKeyCodes.KEY_CALC => expr, + // LinuxKeyboardKeyCodes.KEY_SETUP => expr, + // LinuxKeyboardKeyCodes.KEY_SLEEP => expr, + // LinuxKeyboardKeyCodes.KEY_WAKEUP => expr, + // LinuxKeyboardKeyCodes.KEY_FILE => expr, + // LinuxKeyboardKeyCodes.KEY_SENDFILE => expr, + // LinuxKeyboardKeyCodes.KEY_DELETEFILE => expr, + // LinuxKeyboardKeyCodes.KEY_XFER => expr, + // LinuxKeyboardKeyCodes.KEY_PROG1 => expr, + // LinuxKeyboardKeyCodes.KEY_PROG2 => expr, + // LinuxKeyboardKeyCodes.KEY_WWW => expr, + // LinuxKeyboardKeyCodes.KEY_MSDOS => expr, + // LinuxKeyboardKeyCodes.KEY_COFFEE => expr, + // LinuxKeyboardKeyCodes.KEY_ROTATE_DISPLAY => expr, + // LinuxKeyboardKeyCodes.KEY_CYCLEWINDOWS => expr, + // LinuxKeyboardKeyCodes.KEY_MAIL => expr, + // LinuxKeyboardKeyCodes.KEY_BOOKMARKS => expr, + // LinuxKeyboardKeyCodes.KEY_COMPUTER => expr, + // LinuxKeyboardKeyCodes.KEY_BACK => expr, + // LinuxKeyboardKeyCodes.KEY_FORWARD => expr, + // LinuxKeyboardKeyCodes.KEY_CLOSECD => expr, + // LinuxKeyboardKeyCodes.KEY_EJECTCD => expr, + // LinuxKeyboardKeyCodes.KEY_EJECTCLOSECD => expr, + // LinuxKeyboardKeyCodes.KEY_NEXTSONG => expr, + // LinuxKeyboardKeyCodes.KEY_PLAYPAUSE => expr, + // LinuxKeyboardKeyCodes.KEY_PREVIOUSSONG => expr, + // LinuxKeyboardKeyCodes.KEY_STOPCD => expr, + // LinuxKeyboardKeyCodes.KEY_RECORD => expr, + // LinuxKeyboardKeyCodes.KEY_REWIND => expr, + // LinuxKeyboardKeyCodes.KEY_PHONE => expr, + // LinuxKeyboardKeyCodes.KEY_ISO => expr, + // LinuxKeyboardKeyCodes.KEY_CONFIG => expr, + // LinuxKeyboardKeyCodes.KEY_HOMEPAGE => expr, + // LinuxKeyboardKeyCodes.KEY_REFRESH => expr, + // LinuxKeyboardKeyCodes.KEY_EXIT => expr, + // LinuxKeyboardKeyCodes.KEY_MOVE => expr, + // LinuxKeyboardKeyCodes.KEY_EDIT => expr, + // LinuxKeyboardKeyCodes.KEY_SCROLLUP => expr, + // LinuxKeyboardKeyCodes.KEY_SCROLLDOWN => expr, + // LinuxKeyboardKeyCodes.KEY_KPLEFTPAREN => expr, + // LinuxKeyboardKeyCodes.KEY_KPRIGHTPAREN => expr, + // LinuxKeyboardKeyCodes.KEY_NEW => expr, + // LinuxKeyboardKeyCodes.KEY_REDO => expr, + // LinuxKeyboardKeyCodes.KEY_F13 => expr, + // LinuxKeyboardKeyCodes.KEY_F14 => expr, + // LinuxKeyboardKeyCodes.KEY_F15 => expr, + // LinuxKeyboardKeyCodes.KEY_F16 => expr, + // LinuxKeyboardKeyCodes.KEY_F17 => expr, + // LinuxKeyboardKeyCodes.KEY_F18 => expr, + // LinuxKeyboardKeyCodes.KEY_F19 => expr, + // LinuxKeyboardKeyCodes.KEY_F20 => expr, + // LinuxKeyboardKeyCodes.KEY_F21 => expr, + // LinuxKeyboardKeyCodes.KEY_F22 => expr, + // LinuxKeyboardKeyCodes.KEY_F23 => expr, + // LinuxKeyboardKeyCodes.KEY_F24 => expr, + // LinuxKeyboardKeyCodes.KEY_PLAYCD => expr, + // LinuxKeyboardKeyCodes.KEY_PAUSECD => expr, + // LinuxKeyboardKeyCodes.KEY_PROG3 => expr, + // LinuxKeyboardKeyCodes.KEY_PROG4 => expr, + // LinuxKeyboardKeyCodes.KEY_DASHBOARD => expr, + // LinuxKeyboardKeyCodes.KEY_SUSPEND => expr, + // LinuxKeyboardKeyCodes.KEY_CLOSE => expr, + // LinuxKeyboardKeyCodes.KEY_PLAY => expr, + // LinuxKeyboardKeyCodes.KEY_FASTFORWARD => expr, + // LinuxKeyboardKeyCodes.KEY_BASSBOOST => expr, + // LinuxKeyboardKeyCodes.KEY_PRINT => expr, + // LinuxKeyboardKeyCodes.KEY_HP => expr, + // LinuxKeyboardKeyCodes.KEY_CAMERA => expr, + // LinuxKeyboardKeyCodes.KEY_SOUND => expr, + // LinuxKeyboardKeyCodes.KEY_QUESTION => expr, + // LinuxKeyboardKeyCodes.KEY_EMAIL => expr, + // LinuxKeyboardKeyCodes.KEY_CHAT => expr, + // LinuxKeyboardKeyCodes.KEY_SEARCH => expr, + // LinuxKeyboardKeyCodes.KEY_CONNECT => expr, + // LinuxKeyboardKeyCodes.KEY_FINANCE => expr, + // LinuxKeyboardKeyCodes.KEY_SPORT => expr, + // LinuxKeyboardKeyCodes.KEY_SHOP => expr, + // LinuxKeyboardKeyCodes.KEY_ALTERASE => expr, + // LinuxKeyboardKeyCodes.KEY_CANCEL => expr, + // LinuxKeyboardKeyCodes.KEY_BRIGHTNESSDOWN => expr, + // LinuxKeyboardKeyCodes.KEY_BRIGHTNESSUP => expr, + // LinuxKeyboardKeyCodes.KEY_MEDIA => expr, + // LinuxKeyboardKeyCodes.KEY_SWITCHVIDEOMODE => expr, + // LinuxKeyboardKeyCodes.KEY_KBDILLUMTOGGLE => expr, + // LinuxKeyboardKeyCodes.KEY_KBDILLUMDOWN => expr, + // LinuxKeyboardKeyCodes.KEY_KBDILLUMUP => expr, + // LinuxKeyboardKeyCodes.KEY_SEND => expr, + // LinuxKeyboardKeyCodes.KEY_REPLY => expr, + // LinuxKeyboardKeyCodes.KEY_FORWARDMAIL => expr, + // LinuxKeyboardKeyCodes.KEY_SAVE => expr, + // LinuxKeyboardKeyCodes.KEY_DOCUMENTS => expr, + // LinuxKeyboardKeyCodes.KEY_BATTERY => expr, + // LinuxKeyboardKeyCodes.KEY_BLUETOOTH => expr, + // LinuxKeyboardKeyCodes.KEY_WLAN => expr, + // LinuxKeyboardKeyCodes.KEY_UWB => expr, + // LinuxKeyboardKeyCodes.KEY_UNKNOWN => expr, + // LinuxKeyboardKeyCodes.KEY_VIDEO_NEXT => expr, + // LinuxKeyboardKeyCodes.KEY_VIDEO_PREV => expr, + // LinuxKeyboardKeyCodes.KEY_BRIGHTNESS_CYCLE => expr, + // LinuxKeyboardKeyCodes.KEY_BRIGHTNESS_AUTO => expr, + // LinuxKeyboardKeyCodes.KEY_WWAN => expr, + // LinuxKeyboardKeyCodes.KEY_RFKILL => expr, + // LinuxKeyboardKeyCodes.KEY_MICMUTE => expr, + // LinuxKeyboardKeyCodes.BTN_MISC => expr, + // LinuxKeyboardKeyCodes.BTN_1 => expr, + // LinuxKeyboardKeyCodes.BTN_2 => expr, + // LinuxKeyboardKeyCodes.BTN_3 => expr, + // LinuxKeyboardKeyCodes.BTN_4 => expr, + // LinuxKeyboardKeyCodes.BTN_5 => expr, + // LinuxKeyboardKeyCodes.BTN_6 => expr, + // LinuxKeyboardKeyCodes.BTN_7 => expr, + // LinuxKeyboardKeyCodes.BTN_8 => expr, + // LinuxKeyboardKeyCodes.BTN_9 => expr, + // LinuxKeyboardKeyCodes.BTN_MOUSE => expr, + // LinuxKeyboardKeyCodes.BTN_RIGHT => expr, + // LinuxKeyboardKeyCodes.BTN_MIDDLE => expr, + // LinuxKeyboardKeyCodes.BTN_SIDE => expr, + // LinuxKeyboardKeyCodes.BTN_EXTRA => expr, + // LinuxKeyboardKeyCodes.BTN_FORWARD => expr, + // LinuxKeyboardKeyCodes.BTN_BACK => expr, + // LinuxKeyboardKeyCodes.BTN_TASK => expr, + // LinuxKeyboardKeyCodes.BTN_JOYSTICK => expr, + // LinuxKeyboardKeyCodes.BTN_THUMB => expr, + // LinuxKeyboardKeyCodes.BTN_THUMB2 => expr, + // LinuxKeyboardKeyCodes.BTN_TOP => expr, + // LinuxKeyboardKeyCodes.BTN_TOP2 => expr, + // LinuxKeyboardKeyCodes.BTN_PINKIE => expr, + // LinuxKeyboardKeyCodes.BTN_BASE => expr, + // LinuxKeyboardKeyCodes.BTN_BASE2 => expr, + // LinuxKeyboardKeyCodes.BTN_BASE3 => expr, + // LinuxKeyboardKeyCodes.BTN_BASE4 => expr, + // LinuxKeyboardKeyCodes.BTN_BASE5 => expr, + // LinuxKeyboardKeyCodes.BTN_BASE6 => expr, + // LinuxKeyboardKeyCodes.BTN_DEAD => expr, + // LinuxKeyboardKeyCodes.BTN_GAMEPAD => expr, + // LinuxKeyboardKeyCodes.BTN_EAST => expr, + // LinuxKeyboardKeyCodes.BTN_C => expr, + // LinuxKeyboardKeyCodes.BTN_NORTH => expr, + // LinuxKeyboardKeyCodes.BTN_WEST => expr, + // LinuxKeyboardKeyCodes.BTN_Z => expr, + // LinuxKeyboardKeyCodes.BTN_TL => expr, + // LinuxKeyboardKeyCodes.BTN_TR => expr, + // LinuxKeyboardKeyCodes.BTN_TL2 => expr, + // LinuxKeyboardKeyCodes.BTN_TR2 => expr, + // LinuxKeyboardKeyCodes.BTN_SELECT => expr, + // LinuxKeyboardKeyCodes.BTN_START => expr, + // LinuxKeyboardKeyCodes.BTN_MODE => expr, + // LinuxKeyboardKeyCodes.BTN_THUMBL => expr, + // LinuxKeyboardKeyCodes.BTN_THUMBR => expr, + // LinuxKeyboardKeyCodes.BTN_DIGI => expr, + // LinuxKeyboardKeyCodes.BTN_TOOL_RUBBER => expr, + // LinuxKeyboardKeyCodes.BTN_TOOL_BRUSH => expr, + // LinuxKeyboardKeyCodes.BTN_TOOL_PENCIL => expr, + // LinuxKeyboardKeyCodes.BTN_TOOL_AIRBRUSH => expr, + // LinuxKeyboardKeyCodes.BTN_TOOL_FINGER => expr, + // LinuxKeyboardKeyCodes.BTN_TOOL_MOUSE => expr, + // LinuxKeyboardKeyCodes.BTN_TOOL_LENS => expr, + // LinuxKeyboardKeyCodes.BTN_TOOL_QUINTTAP => expr, + // LinuxKeyboardKeyCodes.BTN_STYLUS3 => expr, + // LinuxKeyboardKeyCodes.BTN_TOUCH => expr, + // LinuxKeyboardKeyCodes.BTN_STYLUS => expr, + // LinuxKeyboardKeyCodes.BTN_STYLUS2 => expr, + // LinuxKeyboardKeyCodes.BTN_TOOL_DOUBLETAP => expr, + // LinuxKeyboardKeyCodes.BTN_TOOL_TRIPLETAP => expr, + // LinuxKeyboardKeyCodes.BTN_TOOL_QUADTAP => expr, + // LinuxKeyboardKeyCodes.BTN_WHEEL => expr, + // LinuxKeyboardKeyCodes.BTN_GEAR_UP => expr, + // LinuxKeyboardKeyCodes.KEY_OK => expr, + // LinuxKeyboardKeyCodes.KEY_SELECT => expr, + // LinuxKeyboardKeyCodes.KEY_GOTO => expr, + // LinuxKeyboardKeyCodes.KEY_CLEAR => expr, + // LinuxKeyboardKeyCodes.KEY_POWER2 => expr, + // LinuxKeyboardKeyCodes.KEY_OPTION => expr, + // LinuxKeyboardKeyCodes.KEY_INFO => expr, + // LinuxKeyboardKeyCodes.KEY_TIME => expr, + // LinuxKeyboardKeyCodes.KEY_VENDOR => expr, + // LinuxKeyboardKeyCodes.KEY_ARCHIVE => expr, + // LinuxKeyboardKeyCodes.KEY_PROGRAM => expr, + // LinuxKeyboardKeyCodes.KEY_CHANNEL => expr, + // LinuxKeyboardKeyCodes.KEY_FAVORITES => expr, + // LinuxKeyboardKeyCodes.KEY_EPG => expr, + // LinuxKeyboardKeyCodes.KEY_PVR => expr, + // LinuxKeyboardKeyCodes.KEY_MHP => expr, + // LinuxKeyboardKeyCodes.KEY_LANGUAGE => expr, + // LinuxKeyboardKeyCodes.KEY_TITLE => expr, + // LinuxKeyboardKeyCodes.KEY_SUBTITLE => expr, + // LinuxKeyboardKeyCodes.KEY_ANGLE => expr, + // LinuxKeyboardKeyCodes.KEY_FULL_SCREEN => expr, + // LinuxKeyboardKeyCodes.KEY_MODE => expr, + // LinuxKeyboardKeyCodes.KEY_KEYBOARD => expr, + // LinuxKeyboardKeyCodes.KEY_ASPECT_RATIO => expr, + // LinuxKeyboardKeyCodes.KEY_PC => expr, + // LinuxKeyboardKeyCodes.KEY_TV => expr, + // LinuxKeyboardKeyCodes.KEY_TV2 => expr, + // LinuxKeyboardKeyCodes.KEY_VCR => expr, + // LinuxKeyboardKeyCodes.KEY_VCR2 => expr, + // LinuxKeyboardKeyCodes.KEY_SAT => expr, + // LinuxKeyboardKeyCodes.KEY_SAT2 => expr, + // LinuxKeyboardKeyCodes.KEY_CD => expr, + // LinuxKeyboardKeyCodes.KEY_TAPE => expr, + // LinuxKeyboardKeyCodes.KEY_RADIO => expr, + // LinuxKeyboardKeyCodes.KEY_TUNER => expr, + // LinuxKeyboardKeyCodes.KEY_PLAYER => expr, + // LinuxKeyboardKeyCodes.KEY_TEXT => expr, + // LinuxKeyboardKeyCodes.KEY_DVD => expr, + // LinuxKeyboardKeyCodes.KEY_AUX => expr, + // LinuxKeyboardKeyCodes.KEY_MP3 => expr, + // LinuxKeyboardKeyCodes.KEY_AUDIO => expr, + // LinuxKeyboardKeyCodes.KEY_VIDEO => expr, + // LinuxKeyboardKeyCodes.KEY_DIRECTORY => expr, + // LinuxKeyboardKeyCodes.KEY_LIST => expr, + // LinuxKeyboardKeyCodes.KEY_MEMO => expr, + // LinuxKeyboardKeyCodes.KEY_CALENDAR => expr, + // LinuxKeyboardKeyCodes.KEY_RED => expr, + // LinuxKeyboardKeyCodes.KEY_GREEN => expr, + // LinuxKeyboardKeyCodes.KEY_YELLOW => expr, + // LinuxKeyboardKeyCodes.KEY_BLUE => expr, + // LinuxKeyboardKeyCodes.KEY_CHANNELUP => expr, + // LinuxKeyboardKeyCodes.KEY_CHANNELDOWN => expr, + // LinuxKeyboardKeyCodes.KEY_FIRST => expr, + // LinuxKeyboardKeyCodes.KEY_LAST => expr, + // LinuxKeyboardKeyCodes.KEY_AB => expr, + // LinuxKeyboardKeyCodes.KEY_NEXT => expr, + // LinuxKeyboardKeyCodes.KEY_RESTART => expr, + // LinuxKeyboardKeyCodes.KEY_SLOW => expr, + // LinuxKeyboardKeyCodes.KEY_SHUFFLE => expr, + // LinuxKeyboardKeyCodes.KEY_BREAK => expr, + // LinuxKeyboardKeyCodes.KEY_PREVIOUS => expr, + // LinuxKeyboardKeyCodes.KEY_DIGITS => expr, + // LinuxKeyboardKeyCodes.KEY_TEEN => expr, + // LinuxKeyboardKeyCodes.KEY_TWEN => expr, + // LinuxKeyboardKeyCodes.KEY_VIDEOPHONE => expr, + // LinuxKeyboardKeyCodes.KEY_GAMES => expr, + // LinuxKeyboardKeyCodes.KEY_ZOOMIN => expr, + // LinuxKeyboardKeyCodes.KEY_ZOOMOUT => expr, + // LinuxKeyboardKeyCodes.KEY_ZOOMRESET => expr, + // LinuxKeyboardKeyCodes.KEY_WORDPROCESSOR => expr, + // LinuxKeyboardKeyCodes.KEY_EDITOR => expr, + // LinuxKeyboardKeyCodes.KEY_SPREADSHEET => expr, + // LinuxKeyboardKeyCodes.KEY_GRAPHICSEDITOR => expr, + // LinuxKeyboardKeyCodes.KEY_PRESENTATION => expr, + // LinuxKeyboardKeyCodes.KEY_DATABASE => expr, + // LinuxKeyboardKeyCodes.KEY_NEWS => expr, + // LinuxKeyboardKeyCodes.KEY_VOICEMAIL => expr, + // LinuxKeyboardKeyCodes.KEY_ADDRESSBOOK => expr, + // LinuxKeyboardKeyCodes.KEY_MESSENGER => expr, + // LinuxKeyboardKeyCodes.KEY_DISPLAYTOGGLE => expr, + // LinuxKeyboardKeyCodes.KEY_SPELLCHECK => expr, + // LinuxKeyboardKeyCodes.KEY_LOGOFF => expr, + // LinuxKeyboardKeyCodes.KEY_DOLLAR => expr, + // LinuxKeyboardKeyCodes.KEY_EURO => expr, + // LinuxKeyboardKeyCodes.KEY_FRAMEBACK => expr, + // LinuxKeyboardKeyCodes.KEY_FRAMEFORWARD => expr, + // LinuxKeyboardKeyCodes.KEY_CONTEXT_MENU => expr, + // LinuxKeyboardKeyCodes.KEY_MEDIA_REPEAT => expr, + // LinuxKeyboardKeyCodes.KEY_10CHANNELSUP => expr, + // LinuxKeyboardKeyCodes.KEY_10CHANNELSDOWN => expr, + // LinuxKeyboardKeyCodes.KEY_IMAGES => expr, + // LinuxKeyboardKeyCodes.KEY_NOTIFICATION_CENTER => expr, + // LinuxKeyboardKeyCodes.KEY_PICKUP_PHONE => expr, + // LinuxKeyboardKeyCodes.KEY_HANGUP_PHONE => expr, + // LinuxKeyboardKeyCodes.KEY_DEL_EOL => expr, + // LinuxKeyboardKeyCodes.KEY_DEL_EOS => expr, + // LinuxKeyboardKeyCodes.KEY_INS_LINE => expr, + // LinuxKeyboardKeyCodes.KEY_DEL_LINE => expr, + // LinuxKeyboardKeyCodes.KEY_FN => expr, + // LinuxKeyboardKeyCodes.KEY_FN_ESC => expr, + // LinuxKeyboardKeyCodes.KEY_FN_F1 => expr, + // LinuxKeyboardKeyCodes.KEY_FN_F2 => expr, + // LinuxKeyboardKeyCodes.KEY_FN_F3 => expr, + // LinuxKeyboardKeyCodes.KEY_FN_F4 => expr, + // LinuxKeyboardKeyCodes.KEY_FN_F5 => expr, + // LinuxKeyboardKeyCodes.KEY_FN_F6 => expr, + // LinuxKeyboardKeyCodes.KEY_FN_F7 => expr, + // LinuxKeyboardKeyCodes.KEY_FN_F8 => expr, + // LinuxKeyboardKeyCodes.KEY_FN_F9 => expr, + // LinuxKeyboardKeyCodes.KEY_FN_F10 => expr, + // LinuxKeyboardKeyCodes.KEY_FN_F11 => expr, + // LinuxKeyboardKeyCodes.KEY_FN_F12 => expr, + // LinuxKeyboardKeyCodes.KEY_FN_1 => expr, + // LinuxKeyboardKeyCodes.KEY_FN_2 => expr, + // LinuxKeyboardKeyCodes.KEY_FN_D => expr, + // LinuxKeyboardKeyCodes.KEY_FN_E => expr, + // LinuxKeyboardKeyCodes.KEY_FN_F => expr, + // LinuxKeyboardKeyCodes.KEY_FN_S => expr, + // LinuxKeyboardKeyCodes.KEY_FN_B => expr, + // LinuxKeyboardKeyCodes.KEY_FN_RIGHT_SHIFT => expr, + // LinuxKeyboardKeyCodes.KEY_BRL_DOT1 => expr, + // LinuxKeyboardKeyCodes.KEY_BRL_DOT2 => expr, + // LinuxKeyboardKeyCodes.KEY_BRL_DOT3 => expr, + // LinuxKeyboardKeyCodes.KEY_BRL_DOT4 => expr, + // LinuxKeyboardKeyCodes.KEY_BRL_DOT5 => expr, + // LinuxKeyboardKeyCodes.KEY_BRL_DOT6 => expr, + // LinuxKeyboardKeyCodes.KEY_BRL_DOT7 => expr, + // LinuxKeyboardKeyCodes.KEY_BRL_DOT8 => expr, + // LinuxKeyboardKeyCodes.KEY_BRL_DOT9 => expr, + // LinuxKeyboardKeyCodes.KEY_BRL_DOT10 => expr, + // LinuxKeyboardKeyCodes.KEY_NUMERIC_0 => expr, + // LinuxKeyboardKeyCodes.KEY_NUMERIC_1 => expr, + // LinuxKeyboardKeyCodes.KEY_NUMERIC_2 => expr, + // LinuxKeyboardKeyCodes.KEY_NUMERIC_3 => expr, + // LinuxKeyboardKeyCodes.KEY_NUMERIC_4 => expr, + // LinuxKeyboardKeyCodes.KEY_NUMERIC_5 => expr, + // LinuxKeyboardKeyCodes.KEY_NUMERIC_6 => expr, + // LinuxKeyboardKeyCodes.KEY_NUMERIC_7 => expr, + // LinuxKeyboardKeyCodes.KEY_NUMERIC_8 => expr, + // LinuxKeyboardKeyCodes.KEY_NUMERIC_9 => expr, + // LinuxKeyboardKeyCodes.KEY_NUMERIC_STAR => expr, + // LinuxKeyboardKeyCodes.KEY_NUMERIC_POUND => expr, + // LinuxKeyboardKeyCodes.KEY_NUMERIC_A => expr, + // LinuxKeyboardKeyCodes.KEY_NUMERIC_B => expr, + // LinuxKeyboardKeyCodes.KEY_NUMERIC_C => expr, + // LinuxKeyboardKeyCodes.KEY_NUMERIC_D => expr, + // LinuxKeyboardKeyCodes.KEY_CAMERA_FOCUS => expr, + // LinuxKeyboardKeyCodes.KEY_WPS_BUTTON => expr, + // LinuxKeyboardKeyCodes.KEY_TOUCHPAD_TOGGLE => expr, + // LinuxKeyboardKeyCodes.KEY_TOUCHPAD_ON => expr, + // LinuxKeyboardKeyCodes.KEY_TOUCHPAD_OFF => expr, + // LinuxKeyboardKeyCodes.KEY_CAMERA_ZOOMIN => expr, + // LinuxKeyboardKeyCodes.KEY_CAMERA_ZOOMOUT => expr, + // LinuxKeyboardKeyCodes.KEY_CAMERA_UP => expr, + // LinuxKeyboardKeyCodes.KEY_CAMERA_DOWN => expr, + // LinuxKeyboardKeyCodes.KEY_CAMERA_LEFT => expr, + // LinuxKeyboardKeyCodes.KEY_CAMERA_RIGHT => expr, + // LinuxKeyboardKeyCodes.KEY_ATTENDANT_ON => expr, + // LinuxKeyboardKeyCodes.KEY_ATTENDANT_OFF => expr, + // LinuxKeyboardKeyCodes.KEY_ATTENDANT_TOGGLE => expr, + // LinuxKeyboardKeyCodes.KEY_LIGHTS_TOGGLE => expr, + // LinuxKeyboardKeyCodes.BTN_DPAD_UP => expr, + // LinuxKeyboardKeyCodes.BTN_DPAD_DOWN => expr, + // LinuxKeyboardKeyCodes.BTN_DPAD_LEFT => expr, + // LinuxKeyboardKeyCodes.BTN_DPAD_RIGHT => expr, + // LinuxKeyboardKeyCodes.KEY_ALS_TOGGLE => expr, + // LinuxKeyboardKeyCodes.KEY_ROTATE_LOCK_TOGGLE => expr, + // LinuxKeyboardKeyCodes.KEY_BUTTONCONFIG => expr, + // LinuxKeyboardKeyCodes.KEY_TASKMANAGER => expr, + // LinuxKeyboardKeyCodes.KEY_JOURNAL => expr, + // LinuxKeyboardKeyCodes.KEY_CONTROLPANEL => expr, + // LinuxKeyboardKeyCodes.KEY_APPSELECT => expr, + // LinuxKeyboardKeyCodes.KEY_SCREENSAVER => expr, + // LinuxKeyboardKeyCodes.KEY_VOICECOMMAND => expr, + // LinuxKeyboardKeyCodes.KEY_ASSISTANT => expr, + // LinuxKeyboardKeyCodes.KEY_KBD_LAYOUT_NEXT => expr, + // LinuxKeyboardKeyCodes.KEY_EMOJI_PICKER => expr, + // LinuxKeyboardKeyCodes.KEY_BRIGHTNESS_MIN => expr, + // LinuxKeyboardKeyCodes.KEY_BRIGHTNESS_MAX => expr, + // LinuxKeyboardKeyCodes.KEY_KBDINPUTASSIST_PREV => expr, + // LinuxKeyboardKeyCodes.KEY_KBDINPUTASSIST_NEXT => expr, + // LinuxKeyboardKeyCodes.KEY_KBDINPUTASSIST_PREVGROUP => expr, + // LinuxKeyboardKeyCodes.KEY_KBDINPUTASSIST_NEXTGROUP => expr, + // LinuxKeyboardKeyCodes.KEY_KBDINPUTASSIST_ACCEPT => expr, + // LinuxKeyboardKeyCodes.KEY_KBDINPUTASSIST_CANCEL => expr, + // LinuxKeyboardKeyCodes.KEY_RIGHT_UP => expr, + // LinuxKeyboardKeyCodes.KEY_RIGHT_DOWN => expr, + // LinuxKeyboardKeyCodes.KEY_LEFT_UP => expr, + // LinuxKeyboardKeyCodes.KEY_LEFT_DOWN => expr, + // LinuxKeyboardKeyCodes.KEY_ROOT_MENU => expr, + // LinuxKeyboardKeyCodes.KEY_MEDIA_TOP_MENU => expr, + // LinuxKeyboardKeyCodes.KEY_NUMERIC_11 => expr, + // LinuxKeyboardKeyCodes.KEY_NUMERIC_12 => expr, + // LinuxKeyboardKeyCodes.KEY_AUDIO_DESC => expr, + // LinuxKeyboardKeyCodes.KEY_3D_MODE => expr, + // LinuxKeyboardKeyCodes.KEY_NEXT_FAVORITE => expr, + // LinuxKeyboardKeyCodes.KEY_STOP_RECORD => expr, + // LinuxKeyboardKeyCodes.KEY_PAUSE_RECORD => expr, + // LinuxKeyboardKeyCodes.KEY_VOD => expr, + // LinuxKeyboardKeyCodes.KEY_UNMUTE => expr, + // LinuxKeyboardKeyCodes.KEY_FASTREVERSE => expr, + // LinuxKeyboardKeyCodes.KEY_SLOWREVERSE => expr, + // LinuxKeyboardKeyCodes.KEY_DATA => expr, + // LinuxKeyboardKeyCodes.KEY_ONSCREEN_KEYBOARD => expr, + // LinuxKeyboardKeyCodes.KEY_PRIVACY_SCREEN_TOGGLE => expr, + // LinuxKeyboardKeyCodes.KEY_SELECTIVE_SCREENSHOT => expr, + // LinuxKeyboardKeyCodes.KEY_MACRO1 => expr, + // LinuxKeyboardKeyCodes.KEY_MACRO2 => expr, + // LinuxKeyboardKeyCodes.KEY_MACRO3 => expr, + // LinuxKeyboardKeyCodes.KEY_MACRO4 => expr, + // LinuxKeyboardKeyCodes.KEY_MACRO5 => expr, + // LinuxKeyboardKeyCodes.KEY_MACRO6 => expr, + // LinuxKeyboardKeyCodes.KEY_MACRO7 => expr, + // LinuxKeyboardKeyCodes.KEY_MACRO8 => expr, + // LinuxKeyboardKeyCodes.KEY_MACRO9 => expr, + // LinuxKeyboardKeyCodes.KEY_MACRO10 => expr, + // LinuxKeyboardKeyCodes.KEY_MACRO11 => expr, + // LinuxKeyboardKeyCodes.KEY_MACRO12 => expr, + // LinuxKeyboardKeyCodes.KEY_MACRO13 => expr, + // LinuxKeyboardKeyCodes.KEY_MACRO14 => expr, + // LinuxKeyboardKeyCodes.KEY_MACRO15 => expr, + // LinuxKeyboardKeyCodes.KEY_MACRO16 => expr, + // LinuxKeyboardKeyCodes.KEY_MACRO17 => expr, + // LinuxKeyboardKeyCodes.KEY_MACRO18 => expr, + // LinuxKeyboardKeyCodes.KEY_MACRO19 => expr, + // LinuxKeyboardKeyCodes.KEY_MACRO20 => expr, + // LinuxKeyboardKeyCodes.KEY_MACRO21 => expr, + // LinuxKeyboardKeyCodes.KEY_MACRO22 => expr, + // LinuxKeyboardKeyCodes.KEY_MACRO23 => expr, + // LinuxKeyboardKeyCodes.KEY_MACRO24 => expr, + // LinuxKeyboardKeyCodes.KEY_MACRO25 => expr, + // LinuxKeyboardKeyCodes.KEY_MACRO26 => expr, + // LinuxKeyboardKeyCodes.KEY_MACRO27 => expr, + // LinuxKeyboardKeyCodes.KEY_MACRO28 => expr, + // LinuxKeyboardKeyCodes.KEY_MACRO29 => expr, + // LinuxKeyboardKeyCodes.KEY_MACRO30 => expr, + // LinuxKeyboardKeyCodes.KEY_MACRO_RECORD_START => expr, + // LinuxKeyboardKeyCodes.KEY_MACRO_RECORD_STOP => expr, + // LinuxKeyboardKeyCodes.KEY_MACRO_PRESET_CYCLE => expr, + // LinuxKeyboardKeyCodes.KEY_MACRO_PRESET1 => expr, + // LinuxKeyboardKeyCodes.KEY_MACRO_PRESET2 => expr, + // LinuxKeyboardKeyCodes.KEY_MACRO_PRESET3 => expr, + // LinuxKeyboardKeyCodes.KEY_KBD_LCD_MENU1 => expr, + // LinuxKeyboardKeyCodes.KEY_KBD_LCD_MENU2 => expr, + // LinuxKeyboardKeyCodes.KEY_KBD_LCD_MENU3 => expr, + // LinuxKeyboardKeyCodes.KEY_KBD_LCD_MENU4 => expr, + // LinuxKeyboardKeyCodes.KEY_KBD_LCD_MENU5 => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY2 => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY3 => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY4 => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY5 => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY6 => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY7 => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY8 => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY9 => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY10 => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY11 => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY12 => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY13 => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY14 => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY15 => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY16 => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY17 => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY18 => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY19 => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY20 => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY21 => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY22 => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY23 => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY24 => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY25 => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY26 => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY27 => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY28 => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY29 => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY30 => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY31 => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY32 => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY33 => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY34 => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY35 => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY36 => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY37 => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY38 => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY39 => expr, + // LinuxKeyboardKeyCodes.BTN_TRIGGER_HAPPY40 => expr, + _ => KeyboardKey.None + }; + + + public static MouseButton MouseButtonFromButtonCode(LinuxKeyboardKeyCodes eCode) => eCode switch + { + LinuxKeyboardKeyCodes.BTN_LEFT => MouseButton.Left, + LinuxKeyboardKeyCodes.BTN_RIGHT => MouseButton.Right, + LinuxKeyboardKeyCodes.BTN_MIDDLE => MouseButton.Middle, + //todo: figure these out + // LinuxKeyboardKeyCodes.BTN_SIDE => expr, + // LinuxKeyboardKeyCodes.BTN_EXTRA => expr, + // LinuxKeyboardKeyCodes.BTN_FORWARD => expr, + // LinuxKeyboardKeyCodes.BTN_BACK => expr, + // LinuxKeyboardKeyCodes.BTN_TASK => expr, + _ => throw new ArgumentOutOfRangeException(nameof(eCode), eCode, null) + }; + } +} \ No newline at end of file