Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
InputManager.Windows.WindowsRuntime.cs
Go to the documentation of this file.
1 // Copyright (c) 2014 Silicon Studio Corp. (http://siliconstudio.co.jp)
2 // This file is distributed under GPL v3. See LICENSE.md for details.
3 #if SILICONSTUDIO_PLATFORM_WINDOWS_RUNTIME
4 using System;
5 using System.Collections.Generic;
6 using SiliconStudio.Core;
7 using SiliconStudio.Core.Mathematics;
8 using SiliconStudio.Paradox.Games;
9 using Windows.Foundation;
10 using Windows.System;
11 using Windows.UI.Core;
12 using Windows.UI.Xaml;
13 using Windows.UI.Xaml.Controls;
14 using Windows.UI.Xaml.Input;
15 using Windows.UI.Xaml.Media;
16 using Windows.UI.Input;
18 using WinRTPointerDeviceType = Windows.Devices.Input.PointerDeviceType;
19 using WinRTPointerPoint = Windows.UI.Input.PointerPoint;
20 
21 namespace SiliconStudio.Paradox.Input
22 {
23  public partial class InputManager
24  {
25  // mapping between WinRT keys and toolkit keys
26  private static readonly Dictionary<VirtualKey, Keys> mapKeys;
27 
28  // TODO: Support for MultiTouchEnabled on Windows Runtime
29  public override bool MultiTouchEnabled { get { return true; } set { } }
30 
31  static InputManager()
32  {
33  mapKeys = new Dictionary<VirtualKey, Keys>();
34  // this dictionary was built from Desktop version (VirtualKey are compatible with WinForms keys)
35  AddKeys(WinFormsKeys.None, Keys.None);
36  AddKeys(WinFormsKeys.Cancel, Keys.Cancel);
37  AddKeys(WinFormsKeys.Back, Keys.Back);
38  AddKeys(WinFormsKeys.Tab, Keys.Tab);
39  AddKeys(WinFormsKeys.LineFeed, Keys.LineFeed);
40  AddKeys(WinFormsKeys.Clear, Keys.Clear);
41  AddKeys(WinFormsKeys.Enter, Keys.Enter);
42  AddKeys(WinFormsKeys.Return, Keys.Return);
43  AddKeys(WinFormsKeys.Pause, Keys.Pause);
44  AddKeys(WinFormsKeys.Capital, Keys.Capital);
45  AddKeys(WinFormsKeys.CapsLock, Keys.CapsLock);
46  AddKeys(WinFormsKeys.HangulMode, Keys.HangulMode);
47  AddKeys(WinFormsKeys.KanaMode, Keys.KanaMode);
48  AddKeys(WinFormsKeys.JunjaMode, Keys.JunjaMode);
49  AddKeys(WinFormsKeys.FinalMode, Keys.FinalMode);
50  AddKeys(WinFormsKeys.HanjaMode, Keys.HanjaMode);
51  AddKeys(WinFormsKeys.KanjiMode, Keys.KanjiMode);
52  AddKeys(WinFormsKeys.Escape, Keys.Escape);
53  AddKeys(WinFormsKeys.IMEConvert, Keys.ImeConvert);
54  AddKeys(WinFormsKeys.IMENonconvert, Keys.ImeNonConvert);
55  AddKeys(WinFormsKeys.IMEAccept, Keys.ImeAccept);
56  AddKeys(WinFormsKeys.IMEModeChange, Keys.ImeModeChange);
57  AddKeys(WinFormsKeys.Space, Keys.Space);
58  AddKeys(WinFormsKeys.PageUp, Keys.PageUp);
59  AddKeys(WinFormsKeys.Prior, Keys.Prior);
60  AddKeys(WinFormsKeys.Next, Keys.Next);
61  AddKeys(WinFormsKeys.PageDown, Keys.PageDown);
62  AddKeys(WinFormsKeys.End, Keys.End);
63  AddKeys(WinFormsKeys.Home, Keys.Home);
64  AddKeys(WinFormsKeys.Left, Keys.Left);
65  AddKeys(WinFormsKeys.Up, Keys.Up);
66  AddKeys(WinFormsKeys.Right, Keys.Right);
67  AddKeys(WinFormsKeys.Down, Keys.Down);
68  AddKeys(WinFormsKeys.Select, Keys.Select);
69  AddKeys(WinFormsKeys.Print, Keys.Print);
70  AddKeys(WinFormsKeys.Execute, Keys.Execute);
71  AddKeys(WinFormsKeys.PrintScreen, Keys.PrintScreen);
72  AddKeys(WinFormsKeys.Snapshot, Keys.Snapshot);
73  AddKeys(WinFormsKeys.Insert, Keys.Insert);
74  AddKeys(WinFormsKeys.Delete, Keys.Delete);
75  AddKeys(WinFormsKeys.Help, Keys.Help);
76  AddKeys(WinFormsKeys.D0, Keys.D0);
77  AddKeys(WinFormsKeys.D1, Keys.D1);
78  AddKeys(WinFormsKeys.D2, Keys.D2);
79  AddKeys(WinFormsKeys.D3, Keys.D3);
80  AddKeys(WinFormsKeys.D4, Keys.D4);
81  AddKeys(WinFormsKeys.D5, Keys.D5);
82  AddKeys(WinFormsKeys.D6, Keys.D6);
83  AddKeys(WinFormsKeys.D7, Keys.D7);
84  AddKeys(WinFormsKeys.D8, Keys.D8);
85  AddKeys(WinFormsKeys.D9, Keys.D9);
86  AddKeys(WinFormsKeys.A, Keys.A);
87  AddKeys(WinFormsKeys.B, Keys.B);
88  AddKeys(WinFormsKeys.C, Keys.C);
89  AddKeys(WinFormsKeys.D, Keys.D);
90  AddKeys(WinFormsKeys.E, Keys.E);
91  AddKeys(WinFormsKeys.F, Keys.F);
92  AddKeys(WinFormsKeys.G, Keys.G);
93  AddKeys(WinFormsKeys.H, Keys.H);
94  AddKeys(WinFormsKeys.I, Keys.I);
95  AddKeys(WinFormsKeys.J, Keys.J);
96  AddKeys(WinFormsKeys.K, Keys.K);
97  AddKeys(WinFormsKeys.L, Keys.L);
98  AddKeys(WinFormsKeys.M, Keys.M);
99  AddKeys(WinFormsKeys.N, Keys.N);
100  AddKeys(WinFormsKeys.O, Keys.O);
101  AddKeys(WinFormsKeys.P, Keys.P);
102  AddKeys(WinFormsKeys.Q, Keys.Q);
103  AddKeys(WinFormsKeys.R, Keys.R);
104  AddKeys(WinFormsKeys.S, Keys.S);
105  AddKeys(WinFormsKeys.T, Keys.T);
106  AddKeys(WinFormsKeys.U, Keys.U);
107  AddKeys(WinFormsKeys.V, Keys.V);
108  AddKeys(WinFormsKeys.W, Keys.W);
109  AddKeys(WinFormsKeys.X, Keys.X);
110  AddKeys(WinFormsKeys.Y, Keys.Y);
111  AddKeys(WinFormsKeys.Z, Keys.Z);
112  AddKeys(WinFormsKeys.LWin, Keys.LeftWin);
113  AddKeys(WinFormsKeys.RWin, Keys.RightWin);
114  AddKeys(WinFormsKeys.Apps, Keys.Apps);
115  AddKeys(WinFormsKeys.Sleep, Keys.Sleep);
116  AddKeys(WinFormsKeys.NumPad0, Keys.NumPad0);
117  AddKeys(WinFormsKeys.NumPad1, Keys.NumPad1);
118  AddKeys(WinFormsKeys.NumPad2, Keys.NumPad2);
119  AddKeys(WinFormsKeys.NumPad3, Keys.NumPad3);
120  AddKeys(WinFormsKeys.NumPad4, Keys.NumPad4);
121  AddKeys(WinFormsKeys.NumPad5, Keys.NumPad5);
122  AddKeys(WinFormsKeys.NumPad6, Keys.NumPad6);
123  AddKeys(WinFormsKeys.NumPad7, Keys.NumPad7);
124  AddKeys(WinFormsKeys.NumPad8, Keys.NumPad8);
125  AddKeys(WinFormsKeys.NumPad9, Keys.NumPad9);
126  AddKeys(WinFormsKeys.Multiply, Keys.Multiply);
127  AddKeys(WinFormsKeys.Add, Keys.Add);
128  AddKeys(WinFormsKeys.Separator, Keys.Separator);
129  AddKeys(WinFormsKeys.Subtract, Keys.Subtract);
130  AddKeys(WinFormsKeys.Decimal, Keys.Decimal);
131  AddKeys(WinFormsKeys.Divide, Keys.Divide);
132  AddKeys(WinFormsKeys.F1, Keys.F1);
133  AddKeys(WinFormsKeys.F2, Keys.F2);
134  AddKeys(WinFormsKeys.F3, Keys.F3);
135  AddKeys(WinFormsKeys.F4, Keys.F4);
136  AddKeys(WinFormsKeys.F5, Keys.F5);
137  AddKeys(WinFormsKeys.F6, Keys.F6);
138  AddKeys(WinFormsKeys.F7, Keys.F7);
139  AddKeys(WinFormsKeys.F8, Keys.F8);
140  AddKeys(WinFormsKeys.F9, Keys.F9);
141  AddKeys(WinFormsKeys.F10, Keys.F10);
142  AddKeys(WinFormsKeys.F11, Keys.F11);
143  AddKeys(WinFormsKeys.F12, Keys.F12);
144  AddKeys(WinFormsKeys.F13, Keys.F13);
145  AddKeys(WinFormsKeys.F14, Keys.F14);
146  AddKeys(WinFormsKeys.F15, Keys.F15);
147  AddKeys(WinFormsKeys.F16, Keys.F16);
148  AddKeys(WinFormsKeys.F17, Keys.F17);
149  AddKeys(WinFormsKeys.F18, Keys.F18);
150  AddKeys(WinFormsKeys.F19, Keys.F19);
151  AddKeys(WinFormsKeys.F20, Keys.F20);
152  AddKeys(WinFormsKeys.F21, Keys.F21);
153  AddKeys(WinFormsKeys.F22, Keys.F22);
154  AddKeys(WinFormsKeys.F23, Keys.F23);
155  AddKeys(WinFormsKeys.F24, Keys.F24);
156  AddKeys(WinFormsKeys.NumLock, Keys.NumLock);
157  AddKeys(WinFormsKeys.Scroll, Keys.Scroll);
158  AddKeys(WinFormsKeys.LShiftKey, Keys.LeftShift);
159  AddKeys(WinFormsKeys.RShiftKey, Keys.RightShift);
160  AddKeys(WinFormsKeys.LControlKey, Keys.LeftCtrl);
161  AddKeys(WinFormsKeys.RControlKey, Keys.RightCtrl);
162  AddKeys(WinFormsKeys.LMenu, Keys.LeftAlt);
163  AddKeys(WinFormsKeys.RMenu, Keys.RightAlt);
164  AddKeys(WinFormsKeys.BrowserBack, Keys.BrowserBack);
165  AddKeys(WinFormsKeys.BrowserForward, Keys.BrowserForward);
166  AddKeys(WinFormsKeys.BrowserRefresh, Keys.BrowserRefresh);
167  AddKeys(WinFormsKeys.BrowserStop, Keys.BrowserStop);
168  AddKeys(WinFormsKeys.BrowserSearch, Keys.BrowserSearch);
169  AddKeys(WinFormsKeys.BrowserFavorites, Keys.BrowserFavorites);
170  AddKeys(WinFormsKeys.BrowserHome, Keys.BrowserHome);
171  AddKeys(WinFormsKeys.VolumeMute, Keys.VolumeMute);
172  AddKeys(WinFormsKeys.VolumeDown, Keys.VolumeDown);
173  AddKeys(WinFormsKeys.VolumeUp, Keys.VolumeUp);
174  AddKeys(WinFormsKeys.MediaNextTrack, Keys.MediaNextTrack);
175  AddKeys(WinFormsKeys.MediaPreviousTrack, Keys.MediaPreviousTrack);
176  AddKeys(WinFormsKeys.MediaStop, Keys.MediaStop);
177  AddKeys(WinFormsKeys.MediaPlayPause, Keys.MediaPlayPause);
178  AddKeys(WinFormsKeys.LaunchMail, Keys.LaunchMail);
179  AddKeys(WinFormsKeys.SelectMedia, Keys.SelectMedia);
180  AddKeys(WinFormsKeys.LaunchApplication1, Keys.LaunchApplication1);
181  AddKeys(WinFormsKeys.LaunchApplication2, Keys.LaunchApplication2);
182  AddKeys(WinFormsKeys.Oem1, Keys.Oem1);
183  AddKeys(WinFormsKeys.OemSemicolon, Keys.OemSemicolon);
184  AddKeys(WinFormsKeys.Oemplus, Keys.OemPlus);
185  AddKeys(WinFormsKeys.Oemcomma, Keys.OemComma);
186  AddKeys(WinFormsKeys.OemMinus, Keys.OemMinus);
187  AddKeys(WinFormsKeys.OemPeriod, Keys.OemPeriod);
188  AddKeys(WinFormsKeys.Oem2, Keys.Oem2);
189  AddKeys(WinFormsKeys.OemQuestion, Keys.OemQuestion);
190  AddKeys(WinFormsKeys.Oem3, Keys.Oem3);
191  AddKeys(WinFormsKeys.Oemtilde, Keys.OemTilde);
192  AddKeys(WinFormsKeys.Oem4, Keys.Oem4);
193  AddKeys(WinFormsKeys.OemOpenBrackets, Keys.OemOpenBrackets);
194  AddKeys(WinFormsKeys.Oem5, Keys.Oem5);
195  AddKeys(WinFormsKeys.OemPipe, Keys.OemPipe);
196  AddKeys(WinFormsKeys.Oem6, Keys.Oem6);
197  AddKeys(WinFormsKeys.OemCloseBrackets, Keys.OemCloseBrackets);
198  AddKeys(WinFormsKeys.Oem7, Keys.Oem7);
199  AddKeys(WinFormsKeys.OemQuotes, Keys.OemQuotes);
200  AddKeys(WinFormsKeys.Oem8, Keys.Oem8);
201  AddKeys(WinFormsKeys.Oem102, Keys.Oem102);
202  AddKeys(WinFormsKeys.OemBackslash, Keys.OemBackslash);
203  AddKeys(WinFormsKeys.Attn, Keys.Attn);
204  AddKeys(WinFormsKeys.Crsel, Keys.CrSel);
205  AddKeys(WinFormsKeys.Exsel, Keys.ExSel);
206  AddKeys(WinFormsKeys.EraseEof, Keys.EraseEof);
207  AddKeys(WinFormsKeys.Play, Keys.Play);
208  AddKeys(WinFormsKeys.Zoom, Keys.Zoom);
209  AddKeys(WinFormsKeys.NoName, Keys.NoName);
210  AddKeys(WinFormsKeys.Pa1, Keys.Pa1);
211  AddKeys(WinFormsKeys.OemClear, Keys.OemClear);
212  }
213 
214  public InputManager(IServiceRegistry registry) : base(registry)
215  {
216  HasKeyboard = true;
217  HasPointer = true;
218 
219 #if SILICONSTUDIO_PLATFORM_WINDOWS_STORE
220  GamePadFactories.Add(new XInputGamePadFactory());
221  HasMouse = true;
222 #endif
223  }
224 
225  public override void Initialize()
226  {
227  base.Initialize();
228 
229  var windowHandle = Game.Window.NativeWindow;
230  switch (windowHandle.Context)
231  {
232  case AppContextType.WindowsRuntime:
233  InitializeFromFrameworkElement((FrameworkElement)windowHandle.NativeHandle);
234  break;
235  default:
236  throw new ArgumentException(string.Format("WindowContext [{0}] not supported", Game.Context.ContextType));
237  }
238 
239  // Scan all registered inputs
240  Scan();
241  }
242 
243  private void InitializeFromFrameworkElement(FrameworkElement uiElement)
244  {
245  if (!(uiElement is Control))
246  {
247  uiElement.Loaded += uiElement_Loaded;
248  uiElement.Unloaded += uiElement_Unloaded;
249  }
250  else
251  {
252  uiElement.KeyDown += (_, e) => HandleKeyFrameworkElement(e, InputEventType.Down);
253  uiElement.KeyUp += (_, e) => HandleKeyFrameworkElement(e, InputEventType.Up);
254  }
255 
256  uiElement.SizeChanged += (_, e) => HandleSizeChangedEvent(e.NewSize);
257  uiElement.PointerPressed += (_, e) => HandlePointerEventFrameworkElement(uiElement, e, PointerState.Down);
258  uiElement.PointerReleased += (_, e) => HandlePointerEventFrameworkElement(uiElement, e, PointerState.Up);
259  uiElement.PointerWheelChanged += (_, e) => HandlePointerEventFrameworkElement(uiElement, e, PointerState.Move);
260  uiElement.PointerMoved += (_, e) => HandlePointerEventFrameworkElement(uiElement, e, PointerState.Move);
261  uiElement.PointerExited += (_, e) => HandlePointerEventFrameworkElement(uiElement, e, PointerState.Out);
262  uiElement.PointerCanceled += (_, e) => HandlePointerEventFrameworkElement(uiElement, e, PointerState.Cancel);
263  uiElement.PointerCaptureLost += (_, e) => HandlePointerEventFrameworkElement(uiElement, e, PointerState.Cancel);
264  }
265 
266  void uiElement_Loaded(object sender, RoutedEventArgs e)
267  {
268  var uiElement = (DependencyObject)sender;
269 
270  while (uiElement != null)
271  {
272  var control = uiElement as Control;
273  if (control != null && control.Focus(FocusState.Programmatic))
274  {
275  // Get keyboard focus, and bind to this event
276  control.KeyDown += (_, e2) => HandleKeyFrameworkElement(e2, InputEventType.Down);
277  control.KeyUp += (_, e2) => HandleKeyFrameworkElement(e2, InputEventType.Up);
278  break;
279  }
280 
281  uiElement = VisualTreeHelper.GetParent(uiElement);
282  }
283  }
284 
285  void uiElement_Unloaded(object sender, RoutedEventArgs e)
286  {
287  // TODO: Unregister event
288  }
289 
290  private void InitializeFromCoreWindow(CoreWindow coreWindow)
291  {
292  coreWindow.SizeChanged += (_, args) => { HandleSizeChangedEvent(args.Size); args.Handled = true; };
293  coreWindow.PointerPressed += (_, args) => HandlePointerEventCoreWindow(args, PointerState.Down);
294  coreWindow.PointerReleased += (_, args) => HandlePointerEventCoreWindow(args, PointerState.Up);
295  coreWindow.PointerWheelChanged += (_, args) => HandlePointerEventCoreWindow(args, PointerState.Move);
296  coreWindow.PointerMoved += (_, args) => HandlePointerEventCoreWindow(args, PointerState.Move);
297  coreWindow.PointerExited += (_, args) => HandlePointerEventCoreWindow(args, PointerState.Out);
298  coreWindow.PointerCaptureLost += (_, args) => HandlePointerEventCoreWindow(args, PointerState.Cancel);
299 
300  coreWindow.KeyDown += (_, args) => HandleKeyCoreWindow(args, InputEventType.Down);
301  coreWindow.KeyUp += (_, args) => HandleKeyCoreWindow(args, InputEventType.Up);
302  }
303 
304  private void HandleSizeChangedEvent(Size size)
305  {
306  ControlHeight = (float)size.Height;
307  ControlWidth = (float)size.Width;
308  }
309 
310  private void HandleKeyFrameworkElement(KeyRoutedEventArgs args, InputEventType inputEventType)
311  {
312  if (HandleKey(args.Key, args.KeyStatus, inputEventType))
313  args.Handled = true;
314  }
315 
316  private void HandleKeyCoreWindow(KeyEventArgs args, InputEventType inputEventType)
317  {
318  if (HandleKey(args.VirtualKey, args.KeyStatus, inputEventType))
319  args.Handled = true;
320  }
321 
322  private bool HandleKey(VirtualKey virtualKey, CorePhysicalKeyStatus keyStatus, InputEventType type)
323  {
324  // Remap certain keys
325  switch (virtualKey)
326  {
327  case VirtualKey.Shift:
328  // Only way to differentiate left and right shift is through the scan code
329  virtualKey = keyStatus.ScanCode == 54 ? VirtualKey.RightShift : VirtualKey.LeftShift;
330  break;
331  case VirtualKey.Control:
332  virtualKey = keyStatus.IsExtendedKey ? VirtualKey.RightControl : VirtualKey.LeftControl;
333  break;
334  case VirtualKey.Menu:
335  virtualKey = keyStatus.IsExtendedKey ? VirtualKey.RightMenu : VirtualKey.LeftMenu;
336  break;
337  }
338 
339  // Let Alt + F4 go through
340  if (virtualKey == VirtualKey.F4 && IsKeyDownNow(Keys.LeftAlt))
341  return false;
342 
343  Keys key;
344  if (!mapKeys.TryGetValue(virtualKey, out key))
345  key = Keys.None;
346 
347  lock (KeyboardInputEvents)
348  {
349  KeyboardInputEvents.Add(new KeyboardInputEvent { Key = key, Type = type });
350  }
351 
352  return true;
353  }
354 
355  private bool IsKeyDownNow(Keys key)
356  {
357  // Check unprocessed up/down events that happened during this frame (in case key has just been pressed)
358  lock (KeyboardInputEvents)
359  {
360  for (int index = KeyboardInputEvents.Count - 1; index >= 0; --index)
361  {
362  var keyboardInputEvent = KeyboardInputEvents[index];
363  if (keyboardInputEvent.Key == key)
364  {
365  if (keyboardInputEvent.Type == InputEventType.Down)
366  return true;
367  if (keyboardInputEvent.Type == InputEventType.Up)
368  return false;
369  }
370  }
371  }
372 
373  // If nothing was done this frame, check if Alt was already considered down in previous frames
374  if (IsKeyDown(key))
375  return true;
376 
377  return false;
378  }
379 
380  private void HandlePointerEventFrameworkElement(FrameworkElement uiElement, PointerRoutedEventArgs pointerRoutedEventArgs, PointerState pointerState)
381  {
382  HandlePointerEvent(pointerRoutedEventArgs.GetCurrentPoint(uiElement), pointerState);
383 
384  pointerRoutedEventArgs.Handled = true;
385  }
386 
387  private void HandlePointerEventCoreWindow(PointerEventArgs args, PointerState pointerState)
388  {
389  HandlePointerEvent(args.CurrentPoint, pointerState);
390 
391  args.Handled = true;
392  }
393 
394  void HandlePointerEvent(WinRTPointerPoint p, PointerState ptrState)
395  {
396  var pointerType = ConvertPointerDeviceType(p.PointerDevice.PointerDeviceType);
397  var isMouse = pointerType == PointerType.Mouse;
398  var position = NormalizeScreenPosition(PointToVector2(p.Position));
399 
400  if (isMouse)
401  {
402  if (ptrState == PointerState.Cancel || ptrState == PointerState.Out)
403  {
404  // invalidate mouse and current pointers
405  LostFocus = true;
406 
407  for (int i = 0; i < MouseButtonCurrentlyDown.Length; i++)
408  {
409  if (MouseButtonCurrentlyDown[i])
410  {
411  HandlePointerEvents(i, position, PointerState.Out, pointerType);
412  MouseButtonCurrentlyDown[i] = false;
413  }
414  }
415  }
416  else // down/up/move
417  {
418  // Note: The problem here is that the PointerPressed event is not triggered twice when two button are pressed together.
419  // That is why we are forced to continuously keep the state of all buttons of the mouse.
420 
421  MouseInputEvent mouseEvent;
422 
423  // Trigger mouse button and pointer Down events for newly pressed buttons.
424  foreach (MouseButton button in Enum.GetValues(typeof(MouseButton)))
425  {
426  var buttonId = (int)button;
427  if (!MouseButtonCurrentlyDown[buttonId] && MouseButtonIsPressed(p.Properties, button))
428  {
429  lock (MouseInputEvents)
430  {
431  mouseEvent = new MouseInputEvent { Type = InputEventType.Down, MouseButton = button };
432  MouseInputEvents.Add(mouseEvent);
433  }
434 
435  HandlePointerEvents(buttonId, position, PointerState.Down, pointerType);
436 
437  MouseButtonCurrentlyDown[buttonId] = true;
438  }
439  }
440 
441  // Trigger Move events to pointer that have changed position
442  if (CurrentMousePosition != position)
443  {
444  foreach (MouseButton button in Enum.GetValues(typeof(MouseButton)))
445  {
446  var buttonId = (int)button;
447  if (MouseButtonCurrentlyDown[buttonId])
448  HandlePointerEvents(buttonId, position, PointerState.Move, pointerType);
449  }
450  }
451 
452  // Trigger mouse button and pointer Up events for newly released buttons.
453  foreach (MouseButton button in Enum.GetValues(typeof(MouseButton)))
454  {
455  var buttonId = (int)button;
456  if (MouseButtonCurrentlyDown[buttonId] && !MouseButtonIsPressed(p.Properties, button))
457  {
458  lock (MouseInputEvents)
459  {
460  mouseEvent = new MouseInputEvent { Type = InputEventType.Up, MouseButton = button };
461  MouseInputEvents.Add(mouseEvent);
462  }
463 
464  HandlePointerEvents(buttonId, position, PointerState.Up, pointerType);
465 
466  MouseButtonCurrentlyDown[buttonId] = false;
467  }
468  }
469 
470  // Trigger mouse wheel events
471  if (Math.Abs(p.Properties.MouseWheelDelta) > MathUtil.ZeroTolerance)
472  {
473  lock (MouseInputEvents)
474  {
475  mouseEvent = new MouseInputEvent { Type = InputEventType.Wheel, MouseButton = MouseButton.Middle, Value = p.Properties.MouseWheelDelta };
476  MouseInputEvents.Add(mouseEvent);
477  }
478  }
479  }
480 
481  // Update mouse cursor position
482  CurrentMousePosition = position;
483  }
484  else
485  {
486  HandlePointerEvents((int)p.PointerId, position, ptrState, pointerType);
487  }
488  }
489 
490  private bool MouseButtonIsPressed(PointerPointProperties mouseProperties, MouseButton button)
491  {
492  switch (button)
493  {
494  case MouseButton.Left:
495  return mouseProperties.IsLeftButtonPressed;
496  case MouseButton.Middle:
497  return mouseProperties.IsMiddleButtonPressed;
498  case MouseButton.Right:
499  return mouseProperties.IsRightButtonPressed;
500  case MouseButton.Extended1:
501  return mouseProperties.IsXButton1Pressed;
502  case MouseButton.Extended2:
503  return mouseProperties.IsXButton2Pressed;
504  default:
505  throw new ArgumentOutOfRangeException("button");
506  }
507  }
508 
509  private PointerType ConvertPointerDeviceType(WinRTPointerDeviceType deviceType)
510  {
511  switch (deviceType)
512  {
513  case WinRTPointerDeviceType.Mouse:
514  return PointerType.Mouse;
515  case WinRTPointerDeviceType.Pen:
516  throw new NotSupportedException("Pen device input is not supported.");
517  case WinRTPointerDeviceType.Touch:
518  return PointerType.Touch;
519  }
520  return PointerType.Unknown;
521  }
522 
523  private Vector2 PointToVector2(Point point)
524  {
525  return new Vector2((float)point.X, (float)point.Y);
526  }
527 
528  private static void AddKeys(WinFormsKeys fromKey, Keys toKey)
529  {
530  if (!mapKeys.ContainsKey((VirtualKey)fromKey))
531  {
532  mapKeys.Add((VirtualKey)fromKey, toKey);
533  }
534  }
535  }
536 }
537 #endif
SiliconStudio.Paradox.Games.Mathematics.Vector2 Vector2
PointerType
Type of a pointer device.
Definition: PointerType.cs:8
MouseButton
Mouse buttons.
Definition: MouseButton.cs:10
SiliconStudio.Core.IServiceRegistry IServiceRegistry
Definition: ModelRenderer.cs:9
SiliconStudio.Paradox.Input.Keys Keys
PointerState
State of a pointer event.
Definition: PointerState.cs:8
The type of the serialized type will be passed as a generic arguments of the serializer. Example: serializer of A becomes instantiated as Serializer{A}.
_In_ size_t _In_ size_t size
Definition: DirectXTexP.h:175
System.Windows.Point Point
Definition: ColorPicker.cs:15