mirror of
https://github.com/ZuneDev/ZuneShell.dll.git
synced 2026-07-27 13:11:51 -07:00
147 lines
4.0 KiB
C#
147 lines
4.0 KiB
C#
// Decompiled with JetBrains decompiler
|
|
// Type: Microsoft.Iris.Input.InputInfo
|
|
// Assembly: UIX, Version=4.8.0.0, Culture=neutral, PublicKeyToken=ddd0da4d3e678217
|
|
// MVID: A56C6C9D-B7F6-46A9-8BDE-B3D9B8D60B11
|
|
// Assembly location: C:\Program Files\Zune\UIX.dll
|
|
|
|
using System.Diagnostics;
|
|
|
|
namespace Microsoft.Iris.Input
|
|
{
|
|
internal abstract class InputInfo
|
|
{
|
|
private static InputInfo.InfoPool[] s_pools;
|
|
protected ICookedInputSite _target;
|
|
protected InputEventType _eventType;
|
|
private byte _lockCount;
|
|
private bool _routeTruncated;
|
|
private bool _handled;
|
|
|
|
protected void Initialize(InputEventType eventType)
|
|
{
|
|
_eventType = eventType;
|
|
_lockCount = 0;
|
|
_routeTruncated = false;
|
|
_handled = false;
|
|
}
|
|
|
|
[Conditional("DEBUG")]
|
|
protected void DEBUG_AssertInitialized()
|
|
{
|
|
}
|
|
|
|
[Conditional("DEBUG")]
|
|
private void DEBUG_AssertZombied()
|
|
{
|
|
}
|
|
|
|
protected static void SetPoolLimitMode(InputInfo.InfoType type, bool keepSingle)
|
|
{
|
|
if (s_pools == null)
|
|
s_pools = new InputInfo.InfoPool[9];
|
|
s_pools[(int)type].SetLimitMode(keepSingle);
|
|
}
|
|
|
|
protected abstract InputInfo.InfoType PoolType { get; }
|
|
|
|
protected virtual void Zombie()
|
|
{
|
|
_target = null;
|
|
_eventType = InputEventType.Invalid;
|
|
}
|
|
|
|
protected static InputInfo GetFromPool(InputInfo.InfoType poolType) => s_pools[(int)poolType].GetPooledInfo();
|
|
|
|
public void ReturnToPool()
|
|
{
|
|
if (!Poolable)
|
|
return;
|
|
s_pools[(int)PoolType].RecycleInfo(this);
|
|
}
|
|
|
|
private bool Poolable => _lockCount == 0;
|
|
|
|
public void Lock() => ++_lockCount;
|
|
|
|
public void Unlock()
|
|
{
|
|
--_lockCount;
|
|
if (_lockCount != 0)
|
|
return;
|
|
ReturnToPool();
|
|
}
|
|
|
|
public bool Handled => _handled;
|
|
|
|
public void MarkHandled() => _handled = true;
|
|
|
|
public bool RouteTruncated => _routeTruncated;
|
|
|
|
public ICookedInputSite Target => _target;
|
|
|
|
public virtual InputEventType EventType => _eventType;
|
|
|
|
public void TruncateRoute() => _routeTruncated = true;
|
|
|
|
public virtual void UpdateTarget(ICookedInputSite target) => _target = target;
|
|
|
|
public override string ToString() => GetType().Name;
|
|
|
|
private struct InfoPool
|
|
{
|
|
private int _numEntries;
|
|
private int _maxEntries;
|
|
private object _storage;
|
|
|
|
public void SetLimitMode(bool keepSingle) => _maxEntries = keepSingle ? 1 : 10;
|
|
|
|
public InputInfo GetPooledInfo()
|
|
{
|
|
InputInfo inputInfo = null;
|
|
if (_numEntries > 0)
|
|
{
|
|
inputInfo = _maxEntries != 1 ? ((InputInfo[])_storage)[_numEntries - 1] : (InputInfo)_storage;
|
|
--_numEntries;
|
|
}
|
|
return inputInfo;
|
|
}
|
|
|
|
public bool RecycleInfo(InputInfo info)
|
|
{
|
|
bool flag = false;
|
|
if (_numEntries < _maxEntries)
|
|
{
|
|
info.Zombie();
|
|
if (_maxEntries == 1)
|
|
{
|
|
_storage = info;
|
|
}
|
|
else
|
|
{
|
|
if (_storage == null)
|
|
_storage = (new InputInfo[_maxEntries]);
|
|
((InputInfo[])_storage)[_numEntries] = info;
|
|
}
|
|
++_numEntries;
|
|
flag = true;
|
|
}
|
|
return flag;
|
|
}
|
|
}
|
|
|
|
public enum InfoType
|
|
{
|
|
KeyCommand,
|
|
KeyFocus,
|
|
KeyState,
|
|
KeyCharacter,
|
|
MouseFocus,
|
|
MouseMove,
|
|
MouseButton,
|
|
MouseWheel,
|
|
DragDrop,
|
|
NumTypes,
|
|
}
|
|
}
|
|
}
|