Browse Source

Added a pre-process hook to InputManager,

And some documentation.
pull/488/head
Steven Kirk 10 years ago
parent
commit
015054a8fd
  1. 2
      src/Perspex.Controls/TopLevel.cs
  2. 2
      src/Perspex.Diagnostics/DevTools.xaml.cs
  3. 26
      src/Perspex.Input/IInputManager.cs
  4. 25
      src/Perspex.Input/InputManager.cs
  5. 4
      src/Perspex.Input/KeyboardDevice.cs
  6. 4
      src/Perspex.Input/MouseDevice.cs
  7. 2
      tests/Perspex.Controls.UnitTests/TopLevelTests.cs

2
src/Perspex.Controls/TopLevel.cs

@ -392,7 +392,7 @@ namespace Perspex.Controls
/// <param name="e">The event args.</param>
private void HandleInput(RawInputEventArgs e)
{
_inputManager.Process(e);
_inputManager.ProcessInput(e);
}
/// <summary>

2
src/Perspex.Diagnostics/DevTools.xaml.cs

@ -26,7 +26,7 @@ namespace Perspex.Diagnostics
Root = root;
DataContext = new DevToolsViewModel(root);
_keySubscription = InputManager.Instance.RawEventReceived
_keySubscription = InputManager.Instance.Process
.OfType<RawKeyEventArgs>()
.Subscribe(RawKeyDown);
}

26
src/Perspex.Input/IInputManager.cs

@ -3,16 +3,36 @@
using System;
using Perspex.Input.Raw;
using Perspex.Layout;
namespace Perspex.Input
{
/// <summary>
/// Recieves input from the windowing subsystem and dispatches it to interested parties
/// for processing.
/// </summary>
public interface IInputManager
{
IObservable<RawInputEventArgs> RawEventReceived { get; }
/// <summary>
/// Gets an observable that notifies on each input event recieved before
/// <see cref="Process"/>.
/// </summary>
IObservable<RawInputEventArgs> PreProcess { get; }
/// <summary>
/// Gets an observable that notifies on each input event recieved.
/// </summary>
IObservable<RawInputEventArgs> Process { get; }
/// <summary>
/// Gets an observable that notifies on each input event recieved after
/// <see cref="Process"/>.
/// </summary>
IObservable<RawInputEventArgs> PostProcess { get; }
void Process(RawInputEventArgs e);
/// <summary>
/// Processes a raw input event.
/// </summary>
/// <param name="e">The raw input event.</param>
void ProcessInput(RawInputEventArgs e);
}
}

25
src/Perspex.Input/InputManager.cs

@ -2,28 +2,39 @@
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive.Subjects;
using Perspex.Input.Raw;
namespace Perspex.Input
{
/// <summary>
/// Recieves input from the windowing subsystem and dispatches it to interested parties
/// for processing.
/// </summary>
public class InputManager : IInputManager
{
private readonly Subject<RawInputEventArgs> _rawEventReceived = new Subject<RawInputEventArgs>();
private readonly Subject<RawInputEventArgs> _preProcess = new Subject<RawInputEventArgs>();
private readonly Subject<RawInputEventArgs> _process = new Subject<RawInputEventArgs>();
private readonly Subject<RawInputEventArgs> _postProcess = new Subject<RawInputEventArgs>();
/// <summary>
/// Gets the global instance of the input manager.
/// </summary>
public static IInputManager Instance => PerspexLocator.Current.GetService<IInputManager>();
public IObservable<RawInputEventArgs> RawEventReceived => _rawEventReceived;
/// <inheritdoc/>
public IObservable<RawInputEventArgs> PreProcess => _preProcess;
/// <inheritdoc/>
public IObservable<RawInputEventArgs> Process => _process;
/// <inheritdoc/>
public IObservable<RawInputEventArgs> PostProcess => _postProcess;
public void Process(RawInputEventArgs e)
/// <inheritdoc/>
public void ProcessInput(RawInputEventArgs e)
{
_rawEventReceived.OnNext(e);
_process.OnNext(e);
_postProcess.OnNext(e);
}
}

4
src/Perspex.Input/KeyboardDevice.cs

@ -18,9 +18,9 @@ namespace Perspex.Input
public KeyboardDevice()
{
InputManager.RawEventReceived
InputManager.Process
.OfType<RawInputEventArgs>()
.Where(x => x.Device == this)
.Where(e => e.Device == this && !e.Handled)
.Subscribe(ProcessRawEvent);
}

4
src/Perspex.Input/MouseDevice.cs

@ -27,9 +27,9 @@ namespace Perspex.Input
/// </summary>
public MouseDevice()
{
InputManager.RawEventReceived
InputManager.Process
.OfType<RawMouseEventArgs>()
.Where(x => x.Device == this)
.Where(e => e.Device == this && !e.Handled)
.Subscribe(ProcessRawEvent);
}

2
tests/Perspex.Controls.UnitTests/TopLevelTests.cs

@ -251,7 +251,7 @@ namespace Perspex.Controls.UnitTests
Key.A, InputModifiers.None);
impl.Object.Input(input);
inputManagerMock.Verify(x => x.Process(input));
inputManagerMock.Verify(x => x.ProcessInput(input));
}
}

Loading…
Cancel
Save