diff --git a/src/Android/Avalonia.Android/Platform/Specific/Helpers/AndroidKeyboardEventsHelper.cs b/src/Android/Avalonia.Android/Platform/Specific/Helpers/AndroidKeyboardEventsHelper.cs
index 3dda301b6b..eed8069a93 100644
--- a/src/Android/Avalonia.Android/Platform/Specific/Helpers/AndroidKeyboardEventsHelper.cs
+++ b/src/Android/Avalonia.Android/Platform/Specific/Helpers/AndroidKeyboardEventsHelper.cs
@@ -53,6 +53,7 @@ namespace Avalonia.Android.Platform.Specific.Helpers
var physicalKey = AndroidKeyInterop.PhysicalKeyFromScanCode(e.ScanCode);
var keySymbol = GetKeySymbol(e.UnicodeChar, physicalKey);
+ var keyDeviceType = GetKeyDeviceType(e);
var rawKeyEvent = new RawKeyEventArgs(
AndroidKeyboardDevice.Instance!,
@@ -62,6 +63,7 @@ namespace Avalonia.Android.Platform.Specific.Helpers
AndroidKeyboardDevice.ConvertKey(e.KeyCode),
GetModifierKeys(e),
physicalKey,
+ keyDeviceType,
keySymbol);
_view.Input?.Invoke(rawKeyEvent);
@@ -124,6 +126,20 @@ namespace Avalonia.Android.Platform.Specific.Helpers
}
}
+ private KeyDeviceType GetKeyDeviceType(KeyEvent e)
+ {
+ var source = e.Device?.Sources ?? InputSourceType.Unknown;
+ if (source is InputSourceType.Joystick or
+ InputSourceType.ClassJoystick or
+ InputSourceType.Gamepad)
+ return KeyDeviceType.Gamepad;
+
+ if (source == InputSourceType.Dpad && e.Device?.KeyboardType == InputKeyboardType.NonAlphabetic)
+ return KeyDeviceType.Remote;
+
+ return KeyDeviceType.Keyboard;
+ }
+
public void Dispose()
{
HandleEvents = false;
diff --git a/src/Avalonia.Base/Input/Key.cs b/src/Avalonia.Base/Input/Key.cs
index 33e1e5df45..71f93e974f 100644
--- a/src/Avalonia.Base/Input/Key.cs
+++ b/src/Avalonia.Base/Input/Key.cs
@@ -1036,5 +1036,74 @@ namespace Avalonia.Input
/// OSX Platform-specific Fn+Down key
///
FnDownArrow = 10004,
+
+ ///
+ /// Remove control home button
+ ///
+ MediaHome = 100000,
+ ///
+ /// TV Channel up
+ ///
+ MediaChannelList = 100001,
+ ///
+ /// TV Channel up
+ ///
+ MediaChannelRaise = 100002,
+ ///
+ /// TV Channel down
+ ///
+ MediaChannelLower = 100003,
+ ///
+ /// TV Channel down
+ ///
+ MediaRecord = 100005,
+ ///
+ /// Remote control Red button
+ ///
+ MediaRed = 100010,
+ ///
+ /// Remote control Green button
+ ///
+ MediaGreen = 100011,
+ ///
+ /// Remote control Yellow button
+ ///
+ MediaYellow = 100012,
+ ///
+ /// Remote control Blue button
+ ///
+ MediaBlue = 100013,
+ ///
+ /// Remote control Menu button
+ ///
+ MediaMenu = 100020,
+ ///
+ /// Remote control dots button
+ ///
+ MediaMore = 100021,
+ ///
+ /// Remote control option button
+ ///
+ MediaOption = 100022,
+ ///
+ /// Remote control channel info button
+ ///
+ MediaInfo = 100023,
+ ///
+ /// Remote control search button
+ ///
+ MediaSearch = 100024,
+ ///
+ /// Remote control subtitle/caption button
+ ///
+ MediaSubtitle = 100025,
+ ///
+ /// Remote control Tv guide detail button
+ ///
+ MediaTvGuide = 100026,
+ ///
+ /// Remote control Previous Channel
+ ///
+ MediaPreviousChannel = 100027,
}
}
diff --git a/src/Avalonia.Base/Input/KeyDeviceType.cs b/src/Avalonia.Base/Input/KeyDeviceType.cs
new file mode 100644
index 0000000000..4e16e787f3
--- /dev/null
+++ b/src/Avalonia.Base/Input/KeyDeviceType.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Avalonia.Input
+{
+ public enum KeyDeviceType
+ {
+ Keyboard,
+ Gamepad,
+ Remote
+ }
+}
diff --git a/src/Avalonia.Base/Input/KeyEventArgs.cs b/src/Avalonia.Base/Input/KeyEventArgs.cs
index 3de078fb37..864aa02617 100644
--- a/src/Avalonia.Base/Input/KeyEventArgs.cs
+++ b/src/Avalonia.Base/Input/KeyEventArgs.cs
@@ -71,4 +71,9 @@ public class KeyEventArgs : RoutedEventArgs
///
///
public string? KeySymbol { get; init; }
+
+ ///
+ /// Type of the device that fire the event
+ ///
+ public KeyDeviceType KeyDeviceType { get; init; }
}
diff --git a/src/Avalonia.Base/Input/KeyboardDevice.cs b/src/Avalonia.Base/Input/KeyboardDevice.cs
index 0cee1bbc96..a6d2ab7a86 100644
--- a/src/Avalonia.Base/Input/KeyboardDevice.cs
+++ b/src/Avalonia.Base/Input/KeyboardDevice.cs
@@ -196,6 +196,7 @@ namespace Avalonia.Input
KeyModifiers = keyInput.Modifiers.ToKeyModifiers(),
PhysicalKey = keyInput.PhysicalKey,
KeySymbol = keyInput.KeySymbol,
+ KeyDeviceType = keyInput.KeyDeviceType,
Source = element
};
diff --git a/src/Avalonia.Base/Input/Raw/RawKeyEventArgs.cs b/src/Avalonia.Base/Input/Raw/RawKeyEventArgs.cs
index 339481ef63..3995e7765c 100644
--- a/src/Avalonia.Base/Input/Raw/RawKeyEventArgs.cs
+++ b/src/Avalonia.Base/Input/Raw/RawKeyEventArgs.cs
@@ -20,7 +20,7 @@ namespace Avalonia.Input.Raw
RawKeyEventType type,
Key key,
RawInputModifiers modifiers)
- : this(device, timestamp, root, type, key, modifiers, PhysicalKey.None, null)
+ : this(device, timestamp, root, type, key, modifiers, PhysicalKey.None, KeyDeviceType.Keyboard, null)
{
Key = key;
Type = type;
@@ -36,6 +36,18 @@ namespace Avalonia.Input.Raw
RawInputModifiers modifiers,
PhysicalKey physicalKey,
string? keySymbol)
+ : this(device, timestamp, root, type, key, modifiers, physicalKey, KeyDeviceType.Keyboard, keySymbol) { }
+
+ public RawKeyEventArgs(
+ IInputDevice device,
+ ulong timestamp,
+ IInputRoot root,
+ RawKeyEventType type,
+ Key key,
+ RawInputModifiers modifiers,
+ PhysicalKey physicalKey,
+ KeyDeviceType keyDeviceType,
+ string? keySymbol)
: base(device, timestamp, root)
{
Key = key;
@@ -43,6 +55,7 @@ namespace Avalonia.Input.Raw
Type = type;
PhysicalKey = physicalKey;
KeySymbol = keySymbol;
+ KeyDeviceType = keyDeviceType;
}
public Key Key { get; set; }
@@ -53,6 +66,8 @@ namespace Avalonia.Input.Raw
public PhysicalKey PhysicalKey { get; set; }
+ public KeyDeviceType KeyDeviceType { get; set; }
+
public string? KeySymbol { get; set; }
}
}
diff --git a/src/Avalonia.Controls/TopLevel.cs b/src/Avalonia.Controls/TopLevel.cs
index 5026896d41..46752446bb 100644
--- a/src/Avalonia.Controls/TopLevel.cs
+++ b/src/Avalonia.Controls/TopLevel.cs
@@ -291,6 +291,7 @@ namespace Avalonia.Controls
KeyModifiers = (KeyModifiers)rawKeyEventArgs.Modifiers,
Key = rawKeyEventArgs.Key,
PhysicalKey = rawKeyEventArgs.PhysicalKey,
+ KeyDeviceType= rawKeyEventArgs.KeyDeviceType,
KeySymbol = rawKeyEventArgs.KeySymbol
};
diff --git a/src/Tizen/Avalonia.Tizen/NuiKeyboardHandler.cs b/src/Tizen/Avalonia.Tizen/NuiKeyboardHandler.cs
index f0fbbbf563..52e062f6d8 100644
--- a/src/Tizen/Avalonia.Tizen/NuiKeyboardHandler.cs
+++ b/src/Tizen/Avalonia.Tizen/NuiKeyboardHandler.cs
@@ -1,4 +1,5 @@
-using Avalonia.Input;
+using System.Diagnostics;
+using Avalonia.Input;
using Avalonia.Input.Raw;
using Avalonia.Logging;
using Avalonia.Tizen.Platform.Input;
@@ -26,14 +27,10 @@ internal class NuiKeyboardHandler
if (ShouldSendKeyEvent(e, out var keyCode))
{
- var mapped = TizenKeyboardDevice.ConvertKey(keyCode);
- if (mapped == Input.Key.None)
- return;
-
Logger.TryGet(LogEventLevel.Debug, LogKey)?.Log(null, "Triggering key event {text}", e.Key.KeyString);
- SendKeyEvent(e, mapped);
+ SendKeyEvent(e, keyCode);
}
- else if (e.Key.State == Key.StateType.Up)
+ else if (e.Key.State == Key.StateType.Up && !string.IsNullOrEmpty(e.Key.KeyString))
{
Logger.TryGet(LogEventLevel.Debug, LogKey)?.Log(null, "Triggering text input {text}", e.Key.KeyString);
_view.TopLevelImpl.TextInput(e.Key.KeyString);
@@ -44,6 +41,7 @@ internal class NuiKeyboardHandler
{
var type = GetKeyEventType(e);
var modifiers = GetModifierKey(e);
+ var deviceType = GetDeviceType(e);
_view.TopLevelImpl.Input?.Invoke(
new RawKeyEventArgs(
@@ -52,22 +50,25 @@ internal class NuiKeyboardHandler
_view.InputRoot,
type,
mapped,
- modifiers));
+ modifiers,
+ PhysicalKey.None,
+ deviceType,
+ e.Key.KeyString
+ ));
}
- private bool ShouldSendKeyEvent(Window.KeyEventArgs e, out global::Tizen.Uix.InputMethod.KeyCode keyCode)
+ private bool ShouldSendKeyEvent(Window.KeyEventArgs e, out Input.Key keyCode)
{
- if (string.IsNullOrEmpty(e.Key.KeyString) ||
- e.Key.KeyPressedName is "Delete" or "BackSpace" ||
- e.Key.IsCtrlModifier() ||
- e.Key.IsAltModifier())
+ keyCode = TizenKeyboardDevice.GetSpecialKey(e.Key.KeyPressedName);
+ if (keyCode != Input.Key.None)
+ return true;
+
+ if ((e.Key.IsCtrlModifier() || e.Key.IsAltModifier()) && !string.IsNullOrEmpty(e.Key.KeyString))
{
- if (Enum.TryParse(e.Key.KeyPressedName, true, out keyCode) ||
- Enum.TryParse($"Keypad{e.Key.KeyPressedName}", true, out keyCode))
- return true;
+ var c = e.Key.KeyPressedName.Length == 1 ? e.Key.KeyPressedName[0] : (char)e.Key.KeyCode;
+ return (keyCode = TizenKeyboardDevice.GetAsciiKey(c)) != Input.Key.None;
}
- keyCode = 0;
return false;
}
@@ -99,4 +100,15 @@ internal class NuiKeyboardHandler
return modifiers;
}
+
+ private KeyDeviceType GetDeviceType(Window.KeyEventArgs ev)
+ {
+ if (ev.Key.DeviceClass == DeviceClassType.Gamepad)
+ return KeyDeviceType.Gamepad;
+
+ if (ev.Key.DeviceSubClass == DeviceSubClassType.Remocon)
+ return KeyDeviceType.Remote;
+
+ return KeyDeviceType.Keyboard;
+ }
}
diff --git a/src/Tizen/Avalonia.Tizen/Platform/Input/TizenKeyboardDevice.cs b/src/Tizen/Avalonia.Tizen/Platform/Input/TizenKeyboardDevice.cs
index 6d595014a1..1046134c43 100644
--- a/src/Tizen/Avalonia.Tizen/Platform/Input/TizenKeyboardDevice.cs
+++ b/src/Tizen/Avalonia.Tizen/Platform/Input/TizenKeyboardDevice.cs
@@ -4,218 +4,136 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Avalonia.Input;
+using Tizen.NUI.Components;
using Tizen.Uix.InputMethod;
+using static System.Net.Mime.MediaTypeNames;
namespace Avalonia.Tizen.Platform.Input;
-internal class TizenKeyboardDevice: KeyboardDevice, IKeyboardDevice
+internal class TizenKeyboardDevice : KeyboardDevice, IKeyboardDevice
{
- private static readonly Dictionary KeyDic = new Dictionary
- {
- // { KeyCode.Cancel?, Key.Cancel },
- { KeyCode.BackSpace, Key.Back },
- { KeyCode.Tab, Key.Tab },
- // { KeyCode.Linefeed?, Key.LineFeed },
- { KeyCode.Clear, Key.Clear },
- { KeyCode.Return, Key.Return },
- { KeyCode.Pause, Key.Pause },
- { KeyCode.CapsLock, Key.CapsLock },
- //{ KeyCode.?, Key.HangulMode }
- //{ KeyCode.?, Key.JunjaMode }
- //{ KeyCode.?, Key.FinalMode }
- //{ KeyCode.?, Key.KanjiMode }
- { KeyCode.Escape, Key.Escape },
- //{ KeyCode.?, Key.ImeConvert }
- //{ KeyCode.?, Key.ImeNonConvert }
- //{ KeyCode.?, Key.ImeAccept }
- //{ KeyCode.?, Key.ImeModeChange }
- { KeyCode.Space, Key.Space },
- { KeyCode.Page_Up, Key.Prior },
- { KeyCode.Page_Down, Key.PageDown },
- { KeyCode.End, Key.End },
- { KeyCode.Home, Key.Home },
- { KeyCode.Left, Key.Left },
- { KeyCode.Up, Key.Up },
- { KeyCode.Right, Key.Right },
- { KeyCode.Down, Key.Down },
- // { KeyCode.ButtonSelect?, Key.Select },
- // { KeyCode.print?, Key.Print },
- //{ KeyCode.execute?, Key.Execute },
- //{ KeyCode.snap?, Key.Snapshot }
- { KeyCode.Insert, Key.Insert },
- { KeyCode.Delete, Key.Delete },
- { KeyCode.Help, Key.Help },
- { KeyCode.Keypad0, Key.D0 },
- { KeyCode.Keypad1, Key.D1 },
- { KeyCode.Keypad2, Key.D2 },
- { KeyCode.Keypad3, Key.D3 },
- { KeyCode.Keypad4, Key.D4 },
- { KeyCode.Keypad5, Key.D5 },
- { KeyCode.Keypad6, Key.D6 },
- { KeyCode.Keypad7, Key.D7 },
- { KeyCode.Keypad8, Key.D8 },
- { KeyCode.Keypad9, Key.D9 },
- { KeyCode.KeypadA, Key.A },
- { KeyCode.KeypadB, Key.B },
- { KeyCode.KeypadC, Key.C },
- { KeyCode.KeypadD, Key.D },
- { KeyCode.KeypadE, Key.E },
- { KeyCode.KeypadF, Key.F },
- { KeyCode.KeypadG, Key.G },
- { KeyCode.KeypadH, Key.H },
- { KeyCode.KeypadI, Key.I },
- { KeyCode.KeypadJ, Key.J },
- { KeyCode.KeypadK, Key.K },
- { KeyCode.KeypadL, Key.L },
- { KeyCode.KeypadM, Key.M },
- { KeyCode.KeypadN, Key.N },
- { KeyCode.KeypadO, Key.O },
- { KeyCode.KeypadP, Key.P },
- { KeyCode.KeypadQ, Key.Q },
- { KeyCode.KeypadR, Key.R },
- { KeyCode.KeypadS, Key.S },
- { KeyCode.KeypadT, Key.T },
- { KeyCode.KeypadU, Key.U },
- { KeyCode.KeypadV, Key.V },
- { KeyCode.KeypadW, Key.W },
- { KeyCode.KeypadX, Key.X },
- { KeyCode.KeypadY, Key.Y },
- { KeyCode.KeypadZ, Key.Z },
- { KeyCode.Keypada, Key.A },
- { KeyCode.Keypadb, Key.B },
- { KeyCode.Keypadc, Key.C },
- { KeyCode.Keypadd, Key.D },
- { KeyCode.Keypade, Key.E },
- { KeyCode.Keypadf, Key.F },
- { KeyCode.Keypadg, Key.G },
- { KeyCode.Keypadh, Key.H },
- { KeyCode.Keypadi, Key.I },
- { KeyCode.Keypadj, Key.J },
- { KeyCode.Keypadk, Key.K },
- { KeyCode.Keypadl, Key.L },
- { KeyCode.Keypadm, Key.M },
- { KeyCode.Keypadn, Key.N },
- { KeyCode.Keypado, Key.O },
- { KeyCode.Keypadp, Key.P },
- { KeyCode.Keypadq, Key.Q },
- { KeyCode.Keypadr, Key.R },
- { KeyCode.Keypads, Key.S },
- { KeyCode.Keypadt, Key.T },
- { KeyCode.Keypadu, Key.U },
- { KeyCode.Keypadv, Key.V },
- { KeyCode.Keypadw, Key.W },
- { KeyCode.Keypadx, Key.X },
- { KeyCode.Keypady, Key.Y },
- { KeyCode.Keypadz, Key.Z },
- //{ KeyCode.?, Key.LWin }
- //{ KeyCode.?, Key.RWin }
- //{ KeyCode.?, Key.Apps }
- //{ KeyCode.Sle, Key.Sleep },
- { KeyCode.KP0, Key.NumPad0 },
- { KeyCode.KP1, Key.NumPad1 },
- { KeyCode.KP2, Key.NumPad2 },
- { KeyCode.KP3, Key.NumPad3 },
- { KeyCode.KP4, Key.NumPad4 },
- { KeyCode.KP5, Key.NumPad5 },
- { KeyCode.KP6, Key.NumPad6 },
- { KeyCode.KP7, Key.NumPad7 },
- { KeyCode.KP8, Key.NumPad8 },
- { KeyCode.KP9, Key.NumPad9 },
- { KeyCode.KPMultiply, Key.Multiply },
- { KeyCode.KPAdd, Key.Add },
- { KeyCode.KPSeparator, Key.Separator },
- { KeyCode.KPSubtract, Key.Subtract },
- { KeyCode.KPDecimal, Key.Decimal },
- { KeyCode.KPDivide, Key.Divide },
- { KeyCode.F1, Key.F1 },
- { KeyCode.F2, Key.F2 },
- { KeyCode.F3, Key.F3 },
- { KeyCode.F4, Key.F4 },
- { KeyCode.F5, Key.F5 },
- { KeyCode.F6, Key.F6 },
- { KeyCode.F7, Key.F7 },
- { KeyCode.F8, Key.F8 },
- { KeyCode.F9, Key.F9 },
- { KeyCode.F10, Key.F10 },
- { KeyCode.F11, Key.F11 },
- { KeyCode.F12, Key.F12 },
- //{ KeyCode.f13, Key.F13 },
- //{ KeyCode.F14, Key.F14 },
- //{ KeyCode.L5, Key.F15 },
- //{ KeyCode.F16, Key.F16 },
- //{ KeyCode.F17, Key.F17 },
- //{ KeyCode.L8, Key.F18 },
- //{ KeyCode.L9, Key.F19 },
- //{ KeyCode.L10, Key.F20 },
- //{ KeyCode.R1, Key.F21 },
- //{ KeyCode.R2, Key.F22 },
- //{ KeyCode.F23, Key.F23 },
- //{ KeyCode.R4, Key.F24 },
- { KeyCode.Num_Lock, Key.NumLock },
- { KeyCode.ScrollLock, Key.Scroll },
- { KeyCode.ShiftL, Key.LeftShift },
- { KeyCode.ShiftR, Key.RightShift },
- { KeyCode.ControlL, Key.LeftCtrl },
- { KeyCode.ControlR, Key.RightCtrl },
- { KeyCode.AltL, Key.LeftAlt },
- { KeyCode.AltR, Key.RightAlt },
- //{ KeyCode.?, Key.BrowserBack }
- //{ KeyCode.?, Key.BrowserForward }
- //{ KeyCode.?, Key.BrowserRefresh }
- //{ KeyCode.?, Key.BrowserStop }
- //{ KeyCode.?, Key.BrowserSearch }
- //{ KeyCode.?, Key.BrowserFavorites }
- //{ KeyCode.?, Key.BrowserHome }
- //{ KeyCode.?, Key.VolumeMute }
- //{ KeyCode.VolumeDown, Key.VolumeDown },
- //{ KeyCode.VolumeUp, Key.VolumeUp },
- //{ KeyCode.MediaNext, Key.MediaNextTrack },
- //{ KeyCode.MediaPrevious, Key.MediaPreviousTrack },
- //{ KeyCode.MediaStop, Key.MediaStop },
- //{ KeyCode.MediaPlayPause, Key.MediaPlayPause },
- //{ KeyCode.?, Key.LaunchMail }
- //{ KeyCode.?, Key.SelectMedia }
- //{ KeyCode.?, Key.LaunchApplication1 }
- //{ KeyCode.?, Key.LaunchApplication2 }
- { KeyCode.Semicolon, Key.OemSemicolon },
- { KeyCode.Plus, Key.OemPlus },
- { KeyCode.Comma, Key.OemComma },
- { KeyCode.Minus, Key.OemMinus },
- { KeyCode.Period, Key.OemPeriod },
- //{ KeyCode.?, Key.Oem2 }
- { KeyCode.Grave, Key.OemTilde },
- //{ KeyCode.?, Key.AbntC1 }
- //{ KeyCode.?, Key.AbntC2 }
- //{ KeyCode.?, Key.OemPipe }
- { KeyCode.Apostrophe, Key.OemQuotes },
- { KeyCode.Slash, Key.OemQuestion },
- { KeyCode.BraceLeft, Key.OemOpenBrackets },
- { KeyCode.BracketRight, Key.OemCloseBrackets },
- //{ KeyCode.?, Key.Oem7 }
- //{ KeyCode.?, Key.Oem8 }
- //{ KeyCode.?, Key.Oem102 }
- //{ KeyCode.?, Key.ImeProcessed }
- //{ KeyCode.?, Key.System }
- //{ KeyCode.?, Key.OemAttn }
- //{ KeyCode.?, Key.OemFinish }
- //{ KeyCode.?, Key.DbeHiragana }
- //{ KeyCode.?, Key.OemAuto }
- //{ KeyCode.?, Key.DbeDbcsChar }
- //{ KeyCode.?, Key.OemBackTab }
- //{ KeyCode.?, Key.Attn }
- //{ KeyCode.?, Key.DbeEnterWordRegisterMode }
- //{ KeyCode.?, Key.DbeEnterImeConfigureMode }
- //{ KeyCode.?, Key.EraseEof }
- //{ KeyCode.MediaPlay, Key.Play },
- //{ KeyCode.?, Key.Zoom }
- //{ KeyCode.?, Key.NoName }
- //{ KeyCode.?, Key.DbeEnterDialogConversionMode }
- //{ KeyCode.?, Key.OemClear }
- //{ KeyCode.?, Key.DeadCharProcessed }
- { KeyCode.Backslash, Key.OemBackslash }
- };
+ private static readonly Dictionary SpecialKeys = new Dictionary
+ {
+ // Media keys
+ { "XF86Red", Key.MediaRed },
+ { "XF86Green", Key.MediaGreen },
+ { "XF86Yellow", Key.MediaYellow },
+ { "XF86Blue", Key.MediaBlue },
+ { "XF86Info", Key.MediaInfo },
+ { "XF86SimpleMenu", Key.MediaMenu },
+ { "XF86Caption", Key.MediaSubtitle },
+ { "XF86MTS", Key.None },
+ { "XF86PictureSize", Key.None },
+ { "XF86More", Key.MediaMore },
+ { "XF86Search", Key.MediaSearch },
+ { "XF863D", Key.None },
+ { "XF86AudioRewind", Key.MediaPreviousTrack },
+ { "XF86AudioPause", Key.MediaPlayPause },
+ { "XF86AudioNext", Key.MediaNextTrack },
+ { "XF86AudioRecord", Key.MediaRecord },
+ { "XF86AudioPlay", Key.MediaPlayPause },
+ { "XF86AudioStop", Key.MediaStop },
+ { "XF86ChannelGuide", Key.MediaTvGuide },
+ { "XF86SysMenu", Key.Apps },
+ { "minus", Key.OemMinus },
+ { "XF86PreviousChannel", Key.MediaPreviousChannel },
+ { "XF86AudioMute", Key.VolumeMute },
+ { "XF86ChannelList", Key.MediaChannelList },
+ { "XF86RaiseChannel", Key.MediaChannelRaise },
+ { "XF86LowerChannel", Key.MediaChannelLower },
+ { "XF86AudioRaiseVolume", Key.VolumeUp },
+ { "XF86AudioLowerVolume", Key.VolumeDown },
+ { "XF86Display", Key.None },
+ { "XF86PowerOff", Key.Sleep },
+ { "XF86PlayBack", Key.MediaPlayPause },
+ { "XF86Home", Key.MediaHome },
+ { "XF86Back", Key.Back },
+ { "XF86Exit", Key.Cancel },
+
+ { "Shift_L", Key.LeftShift },
+ { "Control_L", Key.LeftCtrl },
+ { "Alt_L", Key.LeftAlt },
+ { "Super_L", Key.LWin },
+ { "Alt_R", Key.RightAlt },
+ { "Control_R", Key.RightCtrl },
+ { "Shift_R", Key.RightShift },
+ { "Super_R", Key.RWin },
+ { "Menu", Key.Apps },
+ { "Tab", Key.Tab },
+ { "BackSpace", Key.Back },
+ { "Return", Key.Return },
+ { "Delete", Key.Delete },
+ { "End", Key.End },
+ { "Next", Key.Next },
+ { "Prior", Key.Prior },
+ { "Home", Key.Home },
+ { "Insert", Key.Insert },
+ { "Num_Lock", Key.NumLock },
+ { "Left", Key.Left },
+ { "Up", Key.Up },
+ { "Right", Key.Right },
+ { "Down", Key.Down },
+ { "Escape", Key.Escape },
+ { "Caps_Lock", Key.CapsLock },
+ { "Pause", Key.Pause },
+ { "Scroll_Lock", Key.Scroll },
+ { "Scroll", Key.Scroll },
+
+ };
- internal static Key ConvertKey(KeyCode key)
+ internal static Key GetSpecialKey(string key)
{
- return KeyDic.TryGetValue(key, out var result) ? result : Key.None;
+ return SpecialKeys.TryGetValue(key, out var result) ? result : Key.None;
}
+
+ internal static Key GetAsciiKey(char keyCode) => keyCode switch
+ {
+ '`' or '~' => Key.Oem7,
+ '0' or ')' => Key.D0,
+ '1' or '!' => Key.D1,
+ '2' or '@' => Key.D2,
+ '3' or '#' => Key.D3,
+ '4' or '$' => Key.D4,
+ '5' or '%' => Key.D5,
+ '6' or '^' => Key.D6,
+ '7' or '&' => Key.D7,
+ '8' or '*' => Key.D8,
+ '9' or '(' => Key.D9,
+ '\'' or '"' => Key.OemQuotes,
+ '-' or '_' => Key.OemMinus,
+ '=' or '+' => Key.OemPlus,
+ '<' or ',' => Key.OemComma,
+ '>' or '.' => Key.OemPeriod,
+ ';' or ':' => Key.OemSemicolon,
+ '/' or '?' => Key.OemQuestion,
+ '[' or '{' => Key.OemOpenBrackets,
+ ']' or '}' => Key.OemCloseBrackets,
+ '\\' or '|' => Key.OemPipe,
+ 'a' or 'A' => Key.A,
+ 'b' or 'B' => Key.B,
+ 'c' or 'C' => Key.C,
+ 'd' or 'D' => Key.D,
+ 'e' or 'E' => Key.E,
+ 'f' or 'F' => Key.F,
+ 'g' or 'G' => Key.G,
+ 'h' or 'H' => Key.H,
+ 'i' or 'I' => Key.I,
+ 'j' or 'J' => Key.J,
+ 'k' or 'K' => Key.K,
+ 'l' or 'L' => Key.L,
+ 'm' or 'M' => Key.M,
+ 'n' or 'N' => Key.N,
+ 'o' or 'O' => Key.O,
+ 'p' or 'P' => Key.P,
+ 'q' or 'Q' => Key.Q,
+ 'r' or 'R' => Key.R,
+ 's' or 'S' => Key.S,
+ 't' or 'T' => Key.T,
+ 'u' or 'U' => Key.U,
+ 'v' or 'V' => Key.V,
+ 'w' or 'W' => Key.W,
+ 'x' or 'X' => Key.X,
+ 'y' or 'Y' => Key.Y,
+ 'z' or 'Z' => Key.Z,
+ _ => Key.None
+ };
}