Browse Source

Merge remote-tracking branch 'nc4rrillo/windowing-prototype' into windowing-prototype

thread-issue-repro
Dan Walmsley 8 years ago
parent
commit
7b8eb9cb70
  1. 4
      src/Avalonia.Windowing/Bindings/Events.cs
  2. 167
      src/Avalonia.Windowing/KeyTransform.cs
  3. 92
      src/Avalonia.Windowing/WindowImpl.cs

4
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)]

167
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)

92
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
)
);
}

Loading…
Cancel
Save