diff --git a/DOCUMENTATION.md b/DOCUMENTATION.md index 1601a8e..94a8c3c 100644 --- a/DOCUMENTATION.md +++ b/DOCUMENTATION.md @@ -127,6 +127,13 @@ var subscription = keyboardListener.Subscribe(Key.A, key => { }); keyboardListener.Unsubscribe(); keyboardListener.Unsubscribe(Key.A); keyboardListener.Unsubscribe(subscription.Id); + + +// Subscribe to the event +Key[] keyCombo = [Key.LeftCtrl, Key.V]; +var subscription2 = keyboardListener.SubscribeCombination(keyCombo, key => { }); +keyboardListener.UnsubscribeCombination(keyCombo); + ``` ## Getting the current state of the keys diff --git a/DeftSharp.Windows.Input.Tests/Keyboard/KeyboardListenerUnsubscribeTests.cs b/DeftSharp.Windows.Input.Tests/Keyboard/KeyboardListenerUnsubscribeTests.cs index 7f50e08..0dbe8e7 100644 --- a/DeftSharp.Windows.Input.Tests/Keyboard/KeyboardListenerUnsubscribeTests.cs +++ b/DeftSharp.Windows.Input.Tests/Keyboard/KeyboardListenerUnsubscribeTests.cs @@ -120,6 +120,40 @@ public void KeyboardListener_SubscribeCombinationUnsubscribeSingleKey() Assert.True(keyboardListener.Combinations.All(x => x.Combination.SequenceEqual(combination.AsEnumerable()))); } + [Fact] + public void KeyboardListener_SubscribeCombinationUnsubscribeCombinaiton() + { + var keyboardListener = new KeyboardListener(); + Key[] combination = { Key.W, Key.A }; + keyboardListener.SubscribeCombination(combination, () => { }); + keyboardListener.UnsubscribeCombination(combination); + + Assert.Empty(keyboardListener.Combinations); + + } + [Fact] + public void KeyboardListener_SubscribeCombinationUnsubscribeCombinaiton2() + { + var keyboardListener = new KeyboardListener(); + Key[] combination1 = { Key.W, Key.A }; + Key[] combination2 = { Key.W, Key.K }; + keyboardListener.SubscribeCombination(combination1, () => { }); + keyboardListener.SubscribeCombination(combination2, () => { }); + keyboardListener.UnsubscribeCombination(combination2); + + + var test1 = keyboardListener.Combinations + .FirstOrDefault(x=> x.Combination.SequenceEqual(combination2)) is null; + Assert.True(test1); + + var test2 = keyboardListener.Combinations + .FirstOrDefault(x => x.Combination.SequenceEqual(combination1)) != null; + Assert.True(test2); + + Assert.Single(keyboardListener.Combinations); + + } + [Fact] public void KeyboardListener_SubscribeSequenceUnsubscribeSingleKey() { @@ -159,4 +193,6 @@ public void KeyboardListener_SubscribeSequenceUnsubscribeAll() listener.Unsubscribe(); }); } + + } \ No newline at end of file diff --git a/DeftSharp.Windows.Input/Keyboard/Interceptors/KeyboardCombinationListenerInterceptor.cs b/DeftSharp.Windows.Input/Keyboard/Interceptors/KeyboardCombinationListenerInterceptor.cs index e50d036..f2e7c3f 100644 --- a/DeftSharp.Windows.Input/Keyboard/Interceptors/KeyboardCombinationListenerInterceptor.cs +++ b/DeftSharp.Windows.Input/Keyboard/Interceptors/KeyboardCombinationListenerInterceptor.cs @@ -49,6 +49,18 @@ public void Unsubscribe(Guid id) _subscriptions.Remove(keyboardSubscribe); } + public void Unsubscribe(Key[] keyCombination) + { + var keyboardSubscribe = + _subscriptions.FirstOrDefault(sub => sub.Combination.SequenceEqual(keyCombination) ); + + if (keyboardSubscribe is null) + return; + + _subscriptions.Remove(keyboardSubscribe); + } + + public override void Dispose() { Unsubscribe(); diff --git a/DeftSharp.Windows.Input/Keyboard/KeyboardListener.cs b/DeftSharp.Windows.Input/Keyboard/KeyboardListener.cs index 5e2180b..b363d14 100644 --- a/DeftSharp.Windows.Input/Keyboard/KeyboardListener.cs +++ b/DeftSharp.Windows.Input/Keyboard/KeyboardListener.cs @@ -350,4 +350,11 @@ public void Dispose() _sequenceListener.Dispose(); _combinationListener.Dispose(); } + + public void UnsubscribeCombination(Key[] combination) + { + _combinationListener.Unsubscribe(combination); + } + + } \ No newline at end of file