Add Unsubscribe endpoints. Fixes #20

pull/32/head
Clive Galway 5 years ago
parent 9c80a5bbcb
commit 7c5c52c734

@ -59,8 +59,8 @@ namespace AutoHotInterception
/// <returns></returns>
public void SubscribeKey(int id, ushort code, bool block, dynamic callback)
{
SetFilterState(false);
IsValidDeviceId(false, id);
SetFilterState(false);
if (!_keyboardMappings.ContainsKey(id))
{
@ -68,7 +68,26 @@ namespace AutoHotInterception
}
_keyboardMappings[id].TryAdd(code, new MappingOptions() { Block = block, Callback = callback });
_filteredDevices[id] = true;
SetDeviceFilterState(id, true);
SetFilterState(true);
SetThreadState(true);
}
public void UnsubscribeKey(int id, ushort code)
{
IsValidDeviceId(false, id);
SetFilterState(false);
if (_keyboardMappings.TryGetValue(id, out var thisDevice))
{
thisDevice.TryRemove(code, out _);
if (thisDevice.Count == 0)
{
_keyboardMappings.TryRemove(id, out _);
SetDeviceFilterState(id, false);
}
}
SetFilterState(true);
SetThreadState(true);
@ -91,7 +110,26 @@ namespace AutoHotInterception
_mouseButtonMappings.TryAdd(id, new ConcurrentDictionary<ushort, MappingOptions>());
}
_mouseButtonMappings[id].TryAdd(btn, new MappingOptions() { Block = block, Callback = callback });
_filteredDevices[id] = true;
SetDeviceFilterState(id, true);
SetFilterState(true);
SetThreadState(true);
}
public void UnsubscribeMouseButton(int id, ushort btn)
{
IsValidDeviceId(false, id);
SetFilterState(false);
if (_mouseButtonMappings.TryGetValue(id, out var thisDevice))
{
thisDevice.TryRemove(btn, out _);
if (thisDevice.Count == 0)
{
_mouseButtonMappings.TryRemove(id, out _);
SetDeviceFilterState(id, false);
}
}
SetFilterState(true);
SetThreadState(true);
@ -103,6 +141,11 @@ namespace AutoHotInterception
SubscribeMouseMoveRelative(id, block, callback);
}
public void UnsubscribeMouseMove(int id)
{
UnsubscribeMouseMoveRelative(id);
}
/// <summary>
/// Subscribes to Relative mouse movement
/// </summary>
@ -115,7 +158,22 @@ namespace AutoHotInterception
IsValidDeviceId(true, id);
_mouseMoveRelativeMappings[id] = new MappingOptions() { Block = block, Callback = callback };
_filteredDevices[id] = true;
SetDeviceFilterState(id, true);
SetFilterState(true);
SetThreadState(true);
}
public void UnsubscribeMouseMoveRelative(int id)
{
IsValidDeviceId(true, id);
if (_mouseMoveRelativeMappings.TryRemove(id, out _))
{
if (!DeviceHasBindings(id))
{
SetDeviceFilterState(id, false);
}
}
SetFilterState(true);
SetThreadState(true);
}
@ -133,11 +191,23 @@ namespace AutoHotInterception
IsValidDeviceId(true, id);
_mouseMoveAbsoluteMappings[id] = new MappingOptions() { Block = block, Callback = callback };
_filteredDevices[id] = true;
SetDeviceFilterState(id, true);
SetFilterState(true);
SetThreadState(true);
}
public void UnsubscribeMouseMoveAbsolute(int id)
{
IsValidDeviceId(true, id);
if (_mouseMoveAbsoluteMappings.TryRemove(id, out _))
{
if (!DeviceHasBindings(id))
{
SetDeviceFilterState(id, false);
}
}
}
#endregion
#region Context Mode
@ -157,7 +227,7 @@ namespace AutoHotInterception
}
_contextCallbacks[id] = callback;
_filteredDevices[id] = true;
SetDeviceFilterState(id, true);
SetFilterState(true);
SetThreadState(true);
@ -397,6 +467,31 @@ namespace AutoHotInterception
_filterState = state;
}
private void SetDeviceFilterState(int device, bool state)
{
if (state && !_filteredDevices.ContainsKey(device))
{
_filteredDevices[device] = true;
}
else if (!state && _filteredDevices.ContainsKey(device))
{
_filteredDevices.TryRemove(device, out _);
}
}
private bool DeviceHasBindings(int id)
{
if (id < 11)
{
return _keyboardMappings.ContainsKey(id);
}
return _mouseButtonMappings.ContainsKey(id)
|| _mouseMoveRelativeMappings.ContainsKey(id)
|| _mouseMoveAbsoluteMappings.ContainsKey(id);
}
// ScanCode notes: https://www.win.tue.nl/~aeb/linux/kbd/scancodes-1.html
private void PollThread()
{

@ -5,6 +5,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
## [Unreleased]
### Added
- UnsubscribeKey, UnsubscribeMouseButton, UnsubscribeMouseMove, UnsubscribeMouseMoveRelative, UnsubscribeMouseMoveAbsolute methods added to Subscription Mode
- Added "Unsubscription Example.ahk" to demo Subscribe / Unsubscribe
### Changed
- Fixed Build Event to copy Interception dll
### Deprecated

@ -123,22 +123,42 @@ class AutoHotInterception {
this.Instance.SubscribeKey(id, code, block, callback)
}
UnsubscribeKey(id, code){
this.Instance.UnsubscribeKey(id, code)
}
SubscribeMouseButton(id, btn, block, callback){
this.Instance.SubscribeMouseButton(id, btn, block, callback)
}
UnsubscribeMouseButton(id, btn){
this.Instance.UnsubscribeMouseButton(id, btn)
}
SubscribeMouseMove(id, block, callback){
this.Instance.SubscribeMouseMove(id, block, callback)
}
UnsubscribeMouseMove(id){
this.Instance.UnsubscribeMouseMove(id)
}
SubscribeMouseMoveRelative(id, block, callback){
this.Instance.SubscribeMouseMoveRelative(id, block, callback)
}
UnsubscribeMouseMoveRelative(id){
this.Instance.UnsubscribeMouseMoveRelative(id)
}
SubscribeMouseMoveAbsolute(id, block, callback){
this.Instance.SubscribeMouseMoveAbsolute(id, block, callback)
}
UnsubscribeMouseMoveAbsolute(id){
this.Instance.UnsubscribeMouseMoveAbsolute(id)
}
; ------------- Context Mode ----------------
; Creates a context class to make it easy to turn on/off the hotkeys
CreateContextManager(id){

@ -0,0 +1,38 @@
#SingleInstance force
#Persistent
#include Lib\AutoHotInterception.ahk
; Demonstrates Subscribe / Unsubscribe (Turn on/off block) dependent on active window
; Block is active in Notepad, inactive otherwise
AHI := new AutoHotInterception()
keyboardId := AHI.GetKeyboardId(0x04F2, 0x0112)
SetTimer, WatchWin, -0
return
KeyEvent(state){
ToolTip % "State: " state
}
DoSub(state){
global AHI, keyboardId
if (state){
AHI.SubscribeKey(keyboardId, GetKeySC("1"), true, Func("KeyEvent"))
} else {
AHI.UnsubscribeKey(keyboardId, GetKeySC("1"))
}
}
WatchWin:
Loop {
WinWaitActive, ahk_class Notepad
DoSub(true)
WinWaitNotActive, ahk_class Notepad
DoSub(false)
}
return
^Esc::
ExitApp
Loading…
Cancel
Save