diff --git a/src/Avalonia.Windowing/Bindings/Events.cs b/src/Avalonia.Windowing/Bindings/Events.cs index a87d026e6d..c3dd817766 100644 --- a/src/Avalonia.Windowing/Bindings/Events.cs +++ b/src/Avalonia.Windowing/Bindings/Events.cs @@ -22,6 +22,10 @@ namespace Avalonia.Windowing.Bindings { public MouseEventType EventType { get; set; } public LogicalPosition Position { get; set; } + public byte Shift { get; set; } + public byte Control { get; set; } + public byte Alt { get; set; } + public byte Logo { get; set; } } [StructLayout(LayoutKind.Sequential)] diff --git a/src/Avalonia.Windowing/KeyTransform.cs b/src/Avalonia.Windowing/KeyTransform.cs index e28323d82d..9047e19f13 100644 --- a/src/Avalonia.Windowing/KeyTransform.cs +++ b/src/Avalonia.Windowing/KeyTransform.cs @@ -206,38 +206,6 @@ namespace Avalonia.Windowing [VirtualKeyCode.Key8] = Key.D8, [VirtualKeyCode.Key9] = Key.D9, - [VirtualKeyCode.Back] = Key.Back, - [VirtualKeyCode.Escape] = Key.Escape, - [VirtualKeyCode.Return] = Key.Return, - - [VirtualKeyCode.Down] = Key.Down, - [VirtualKeyCode.Up] = Key.Up, - [VirtualKeyCode.Right] = Key.Right, - [VirtualKeyCode.Left] = Key.Left, - - [VirtualKeyCode.Capital] = Key.CapsLock, - [VirtualKeyCode.LAlt] = Key.LeftAlt, - [VirtualKeyCode.RAlt] = Key.RightAlt, - [VirtualKeyCode.LControl] = Key.LeftCtrl, - [VirtualKeyCode.RControl] = Key.RightCtrl, - [VirtualKeyCode.LShift] = Key.LeftShift, - [VirtualKeyCode.RShift] = Key.RightShift, - [VirtualKeyCode.LWin] = Key.LWin, - [VirtualKeyCode.RWin] = Key.RWin, - [VirtualKeyCode.Numlock] = Key.NumLock, - - [VirtualKeyCode.Delete] = Key.Delete, - [VirtualKeyCode.LBracket] = Key.OemOpenBrackets, - [VirtualKeyCode.RBracket] = Key.OemCloseBrackets, - [VirtualKeyCode.Add] = Key.OemPlus, - [VirtualKeyCode.Minus] = Key.OemMinus, - [VirtualKeyCode.Subtract] = Key.Subtract, - [VirtualKeyCode.Backslash] = Key.OemBackslash, - [VirtualKeyCode.Colon] = Key.OemSemicolon, - [VirtualKeyCode.Comma] = Key.OemComma, - [VirtualKeyCode.Tab] = Key.Tab, - - [VirtualKeyCode.Space] = Key.Space, [VirtualKeyCode.A] = Key.A, [VirtualKeyCode.B] = Key.B, [VirtualKeyCode.C] = Key.C, @@ -264,6 +232,141 @@ namespace Avalonia.Windowing [VirtualKeyCode.X] = Key.X, [VirtualKeyCode.Y] = Key.Y, [VirtualKeyCode.Z] = Key.Z, + + [VirtualKeyCode.Escape] = Key.Escape, + + [VirtualKeyCode.F1] = Key.F1, + [VirtualKeyCode.F2] = Key.F2, + [VirtualKeyCode.F3] = Key.F3, + [VirtualKeyCode.F4] = Key.F4, + [VirtualKeyCode.F5] = Key.F5, + [VirtualKeyCode.F6] = Key.F6, + [VirtualKeyCode.F7] = Key.F7, + [VirtualKeyCode.F8] = Key.F8, + [VirtualKeyCode.F9] = Key.F9, + [VirtualKeyCode.F10] = Key.F10, + [VirtualKeyCode.F11] = Key.F11, + [VirtualKeyCode.F12] = Key.F12, + [VirtualKeyCode.F13] = Key.F13, + [VirtualKeyCode.F14] = Key.F14, + [VirtualKeyCode.F15] = Key.F15, + + /// Print Screen/SysRq. + [VirtualKeyCode.Snapshot] = Key.Snapshot, + /// Scroll Lock. + [VirtualKeyCode.Scroll] = Key.Scroll, + /// Pause/Break key, next to Scroll lock. + [VirtualKeyCode.Pause] = Key.Pause, + + /// `Insert`, next to Backspace. + [VirtualKeyCode.Insert] = Key.Insert, + [VirtualKeyCode.Home] = Key.Home, + [VirtualKeyCode.Delete] = Key.Delete, + [VirtualKeyCode.End] = Key.End, + [VirtualKeyCode.PageDown] = Key.PageDown, + [VirtualKeyCode.PageUp] = Key.PageUp, + + [VirtualKeyCode.Left] = Key.Left, + [VirtualKeyCode.Up] = Key.Up, + [VirtualKeyCode.Right] = Key.Right, + [VirtualKeyCode.Down] = Key.Down, + + /// The Backspace key, right over Enter. + // TODO: rename + [VirtualKeyCode.Back] = Key.Back, + /// The Enter key. + [VirtualKeyCode.Return] = Key.Return, + /// The space bar. + [VirtualKeyCode.Space] = Key.Space, + + /// The "Compose" key on Linux. + //[VirtualKeyCode.Compose] = Key.Compose, ??? + + //[VirtualKeyCode.Caret] = Key.Caret, + + [VirtualKeyCode.Numlock] = Key.NumLock, + [VirtualKeyCode.Numpad0] = Key.NumPad0, + [VirtualKeyCode.Numpad1] = Key.NumPad1, + [VirtualKeyCode.Numpad2] = Key.NumPad2, + [VirtualKeyCode.Numpad3] = Key.NumPad3, + [VirtualKeyCode.Numpad4] = Key.NumPad4, + [VirtualKeyCode.Numpad5] = Key.NumPad5, + [VirtualKeyCode.Numpad6] = Key.NumPad6, + [VirtualKeyCode.Numpad7] = Key.NumPad7, + [VirtualKeyCode.Numpad8] = Key.NumPad8, + [VirtualKeyCode.Numpad9] = Key.NumPad9, + + [VirtualKeyCode.AbntC1] = Key.AbntC1, + [VirtualKeyCode.AbntC2] = Key.AbntC2, + [VirtualKeyCode.Add] = Key.Add, + //[VirtualKeyCode.Apostrophe] = Key.oem, + [VirtualKeyCode.Apps] = Key.Apps, + //[VirtualKeyCode.At] , + //[VirtualKeyCode.Ax, + [VirtualKeyCode.Backslash] = Key.OemBackslash, + //[VirtualKeyCode.Calculator] = Key., + [VirtualKeyCode.Capital] = Key.Capital, + [VirtualKeyCode.Colon] = Key.OemSemicolon, + [VirtualKeyCode.Comma] = Key.OemComma, + [VirtualKeyCode.Convert] = Key.ImeConvert, + [VirtualKeyCode.Decimal] = Key.Decimal, + [VirtualKeyCode.Divide] = Key.Divide, + //[VirtualKeyCode.Equals] = Key., + //[VirtualKeyCode.Grave] = , + [VirtualKeyCode.Kana] = Key.KanaMode, + [VirtualKeyCode.Kanji] = Key.KanjiMode, + [VirtualKeyCode.LAlt] = Key.LeftAlt, + [VirtualKeyCode.LBracket] = Key.OemOpenBrackets, + [VirtualKeyCode.LControl] = Key.LeftCtrl, + [VirtualKeyCode.LShift] = Key.LeftShift, + [VirtualKeyCode.LWin] = Key.LWin, + [VirtualKeyCode.Mail] = Key.LaunchMail, + [VirtualKeyCode.MediaSelect] = Key.SelectMedia, + [VirtualKeyCode.MediaStop] = Key.MediaStop, + [VirtualKeyCode.Minus] = Key.OemMinus, + [VirtualKeyCode.Multiply] = Key.Multiply, + [VirtualKeyCode.Mute] = Key.VolumeMute, + //[VirtualKeyCode.MyComputer] = Key., + [VirtualKeyCode.NavigateForward] = Key.Prior, // also called "Prior" + [VirtualKeyCode.NavigateBackward] = Key.Next, // also called "Next" + [VirtualKeyCode.NextTrack] = Key.MediaNextTrack, + [VirtualKeyCode.NoConvert] = Key.ImeNonConvert, + [VirtualKeyCode.NumpadComma] = Key.OemComma, + [VirtualKeyCode.NumpadEnter] = Key.Enter, + //[VirtualKeyCode.NumpadEquals] = Key., + //[VirtualKeyCode.OEM102, + [VirtualKeyCode.Period] = Key.OemPeriod, + [VirtualKeyCode.PlayPause] = Key.MediaPlayPause, + //[VirtualKeyCode.Power] = , + [VirtualKeyCode.PrevTrack] = Key.MediaPreviousTrack, + [VirtualKeyCode.RAlt] = Key.RightAlt, + [VirtualKeyCode.RBracket] = Key.OemCloseBrackets, + [VirtualKeyCode.RControl] = Key.RightCtrl, + [VirtualKeyCode.RShift] = Key.RightShift, + [VirtualKeyCode.RWin] = Key.RWin, + [VirtualKeyCode.Semicolon] = Key.OemSemicolon, + [VirtualKeyCode.Slash] = Key.OemQuestion, + [VirtualKeyCode.Sleep] = Key.Sleep, + [VirtualKeyCode.Stop] = Key.MediaStop, + [VirtualKeyCode.Subtract] = Key.Subtract, + [VirtualKeyCode.Sysrq] = Key.System, + [VirtualKeyCode.Tab] = Key.Tab, + //[VirtualKeyCode.Underline] = Key, + //[VirtualKeyCode.Unlabeled] = Key.la, + [VirtualKeyCode.VolumeDown] = Key.VolumeUp, + [VirtualKeyCode.VolumeUp] = Key.VolumeDown, + //[VirtualKeyCode.Wake] = Key., + [VirtualKeyCode.WebBack] = Key.BrowserBack, + [VirtualKeyCode.WebFavorites] = Key.BrowserFavorites, + [VirtualKeyCode.WebForward] = Key.BrowserForward, + [VirtualKeyCode.WebHome ] = Key.BrowserHome, + [VirtualKeyCode.WebRefresh] = Key.BrowserRefresh, + [VirtualKeyCode.WebSearch] = Key.BrowserSearch, + [VirtualKeyCode.WebStop] = Key.BrowserStop, + //[VirtualKeyCode.Yen] = Key., + [VirtualKeyCode.Copy] = Key.OemCopy, + //[VirtualKeyCode.Paste] = Key.oem, + //[VirtualKeyCode.Cut] = Key.cut, }; public static Key? TransformKeyCode(VirtualKeyCode code) diff --git a/src/Avalonia.Windowing/WindowImpl.cs b/src/Avalonia.Windowing/WindowImpl.cs index 45b3cf612a..d5734b16f6 100644 --- a/src/Avalonia.Windowing/WindowImpl.cs +++ b/src/Avalonia.Windowing/WindowImpl.cs @@ -196,15 +196,18 @@ namespace Avalonia.Windowing Dispatcher.UIThread.RunJobs(DispatcherPriority.Input + 1); var timeStamp = (uint)Environment.TickCount; - Input - ( - new RawTextInputEventArgs + if (evt.Character >= 32) + { + Input ( - KeyboardDevice, - timeStamp, - evt.Character.ToString() - ) - ); + new RawTextInputEventArgs + ( + KeyboardDevice, + timeStamp, + evt.Character.ToString() + ) + ); + } } public void OnKeyboardEvent (KeyboardEvent evt) @@ -213,17 +216,44 @@ namespace Avalonia.Windowing var eventType = evt.Pressed == 1 ? RawKeyEventType.KeyDown : RawKeyEventType.KeyUp; var timeStamp = (uint)Environment.TickCount; - Input - ( - new RawKeyEventArgs + var modifiers = InputModifiers.None; + + if(evt.Control == 1) + { + modifiers |= InputModifiers.Control; + } + + if (evt.Alt == 1) + { + modifiers |= InputModifiers.Alt; + } + + if(evt.Shift == 1) + { + modifiers |= InputModifiers.Shift; + } + + if (evt.Logo == 1) + { + modifiers |= InputModifiers.Windows; + } + + var keyCode = KeyTransform.TransformKeyCode(evt.VirtualKeyCode); + + if (keyCode.HasValue) + { + Input ( - KeyboardDevice, - timeStamp, - eventType, - KeyTransform.TransformKeyCode(evt.VirtualKeyCode).Value, - InputModifiers.None - ) - ); + new RawKeyEventArgs + ( + KeyboardDevice, + timeStamp, + eventType, + keyCode.Value, + modifiers + ) + ); + } } public void OnMouseEvent(MouseEvent evt) @@ -234,6 +264,28 @@ namespace Avalonia.Windowing if (evt.EventType == MouseEventType.Move) _lastPosition = evt.Position; + + var modifiers = InputModifiers.None; + + if (evt.Control == 1) + { + modifiers |= InputModifiers.Control; + } + + if (evt.Alt == 1) + { + modifiers |= InputModifiers.Alt; + } + + if (evt.Shift == 1) + { + modifiers |= InputModifiers.Shift; + } + + if (evt.Logo == 1) + { + modifiers |= InputModifiers.Windows; + } Input ( @@ -245,7 +297,7 @@ namespace Avalonia.Windowing _inputRoot, eventType, new Point(_lastPosition.X, _lastPosition.Y), - InputModifiers.None + modifiers ) : new RawMouseWheelEventArgs @@ -255,7 +307,7 @@ namespace Avalonia.Windowing _inputRoot, new Point(_lastPosition.X, _lastPosition.Y), new Point(evt.Position.X, evt.Position.Y), - InputModifiers.None + modifiers ) ); }