Browse Source

Add key device type and implmentation for tizen (#14027)

* Add key device type and implmentation for tizen #12992

* Add device key type to Android

* Resolve comments

---------

Co-authored-by: Max Katz <maxkatz6@outlook.com>
pull/14162/head
Omid Mafakher 3 years ago
committed by GitHub
parent
commit
3ac61937e2
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 16
      src/Android/Avalonia.Android/Platform/Specific/Helpers/AndroidKeyboardEventsHelper.cs
  2. 69
      src/Avalonia.Base/Input/Key.cs
  3. 15
      src/Avalonia.Base/Input/KeyDeviceType.cs
  4. 5
      src/Avalonia.Base/Input/KeyEventArgs.cs
  5. 1
      src/Avalonia.Base/Input/KeyboardDevice.cs
  6. 17
      src/Avalonia.Base/Input/Raw/RawKeyEventArgs.cs
  7. 1
      src/Avalonia.Controls/TopLevel.cs
  8. 46
      src/Tizen/Avalonia.Tizen/NuiKeyboardHandler.cs
  9. 332
      src/Tizen/Avalonia.Tizen/Platform/Input/TizenKeyboardDevice.cs

16
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;

69
src/Avalonia.Base/Input/Key.cs

@ -1036,5 +1036,74 @@ namespace Avalonia.Input
/// OSX Platform-specific Fn+Down key
/// </summary>
FnDownArrow = 10004,
/// <summary>
/// Remove control home button
/// </summary>
MediaHome = 100000,
/// <summary>
/// TV Channel up
/// </summary>
MediaChannelList = 100001,
/// <summary>
/// TV Channel up
/// </summary>
MediaChannelRaise = 100002,
/// <summary>
/// TV Channel down
/// </summary>
MediaChannelLower = 100003,
/// <summary>
/// TV Channel down
/// </summary>
MediaRecord = 100005,
/// <summary>
/// Remote control Red button
/// </summary>
MediaRed = 100010,
/// <summary>
/// Remote control Green button
/// </summary>
MediaGreen = 100011,
/// <summary>
/// Remote control Yellow button
/// </summary>
MediaYellow = 100012,
/// <summary>
/// Remote control Blue button
/// </summary>
MediaBlue = 100013,
/// <summary>
/// Remote control Menu button
/// </summary>
MediaMenu = 100020,
/// <summary>
/// Remote control dots button
/// </summary>
MediaMore = 100021,
/// <summary>
/// Remote control option button
/// </summary>
MediaOption = 100022,
/// <summary>
/// Remote control channel info button
/// </summary>
MediaInfo = 100023,
/// <summary>
/// Remote control search button
/// </summary>
MediaSearch = 100024,
/// <summary>
/// Remote control subtitle/caption button
/// </summary>
MediaSubtitle = 100025,
/// <summary>
/// Remote control Tv guide detail button
/// </summary>
MediaTvGuide = 100026,
/// <summary>
/// Remote control Previous Channel
/// </summary>
MediaPreviousChannel = 100027,
}
}

15
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
}
}

5
src/Avalonia.Base/Input/KeyEventArgs.cs

@ -71,4 +71,9 @@ public class KeyEventArgs : RoutedEventArgs
/// <see cref="Key"/>
/// <see cref="PhysicalKey"/>
public string? KeySymbol { get; init; }
/// <summary>
/// Type of the device that fire the event
/// </summary>
public KeyDeviceType KeyDeviceType { get; init; }
}

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

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

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

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

332
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<KeyCode, Key> KeyDic = new Dictionary<KeyCode, Key>
{
// { 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<string, Key> SpecialKeys = new Dictionary<string, Key>
{
// 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
};
}

Loading…
Cancel
Save