From 4c5c099ec31d8e848742d8eff0db41cd1819c58c Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Tue, 11 Oct 2016 21:43:52 +0100 Subject: [PATCH 1/4] Dont focus menu then alt key down event is followed by another keydown event. --- src/Avalonia.Input/AccessKeyHandler.cs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/Avalonia.Input/AccessKeyHandler.cs b/src/Avalonia.Input/AccessKeyHandler.cs index 7acbc109fc..b23cdf550d 100644 --- a/src/Avalonia.Input/AccessKeyHandler.cs +++ b/src/Avalonia.Input/AccessKeyHandler.cs @@ -43,6 +43,11 @@ namespace Avalonia.Input /// private bool _ignoreAltUp; + /// + /// Whether the AltKey is down. + /// + private bool _altIsDown; + /// /// Gets or sets the window's main menu. /// @@ -110,6 +115,8 @@ namespace Avalonia.Input { if (e.Key == Key.LeftAlt) { + _altIsDown = true; + if (MainMenu == null || !MainMenu.IsOpen) { // When Alt is pressed without a main menu, or with a closed main menu, show @@ -126,6 +133,10 @@ namespace Avalonia.Input // We always handle the Alt key. e.Handled = true; } + else if(_altIsDown) + { + _ignoreAltUp = true; + } } /// @@ -179,6 +190,8 @@ namespace Avalonia.Input switch (e.Key) { case Key.LeftAlt: + _altIsDown = false; + if (_ignoreAltUp) { _ignoreAltUp = false; From 3fea4d34f18a72a51f7691a6be523b9a934b353f Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Tue, 11 Oct 2016 21:48:36 +0100 Subject: [PATCH 2/4] Restore focus of input element after alt-key has stolen focus. --- src/Avalonia.Input/AccessKeyHandler.cs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Input/AccessKeyHandler.cs b/src/Avalonia.Input/AccessKeyHandler.cs index b23cdf550d..7b88fe18f3 100644 --- a/src/Avalonia.Input/AccessKeyHandler.cs +++ b/src/Avalonia.Input/AccessKeyHandler.cs @@ -48,6 +48,11 @@ namespace Avalonia.Input /// private bool _altIsDown; + /// + /// Element to restore folowing AltKey taking focus. + /// + private IInputElement _restoreFocusElement; + /// /// Gets or sets the window's main menu. /// @@ -119,15 +124,21 @@ namespace Avalonia.Input if (MainMenu == null || !MainMenu.IsOpen) { + // Save currently focused input element. + _restoreFocusElement = FocusManager.Instance.Current; + // When Alt is pressed without a main menu, or with a closed main menu, show // access key markers in the window (i.e. "_File"). - _owner.ShowAccessKeys = _showingAccessKeys = true; + _owner.ShowAccessKeys = _showingAccessKeys = true; } else { // If the Alt key is pressed and the main menu is open, close the main menu. CloseMenu(); _ignoreAltUp = true; + + _restoreFocusElement?.Focus(); + _restoreFocusElement = null; } // We always handle the Alt key. From 980a04b38f959927bbf496dca442d9d9015d6ba1 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Tue, 11 Oct 2016 21:53:34 +0100 Subject: [PATCH 3/4] Whitespace changes. --- src/Avalonia.Input/AccessKeyHandler.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Avalonia.Input/AccessKeyHandler.cs b/src/Avalonia.Input/AccessKeyHandler.cs index 7b88fe18f3..06e8e8cea5 100644 --- a/src/Avalonia.Input/AccessKeyHandler.cs +++ b/src/Avalonia.Input/AccessKeyHandler.cs @@ -129,14 +129,14 @@ namespace Avalonia.Input // When Alt is pressed without a main menu, or with a closed main menu, show // access key markers in the window (i.e. "_File"). - _owner.ShowAccessKeys = _showingAccessKeys = true; + _owner.ShowAccessKeys = _showingAccessKeys = true; } else { // If the Alt key is pressed and the main menu is open, close the main menu. CloseMenu(); _ignoreAltUp = true; - + _restoreFocusElement?.Focus(); _restoreFocusElement = null; } @@ -144,7 +144,7 @@ namespace Avalonia.Input // We always handle the Alt key. e.Handled = true; } - else if(_altIsDown) + else if (_altIsDown) { _ignoreAltUp = true; } From c33a7da97b64165b2e3c077b7a776ea00c6335e7 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 12 Oct 2016 21:20:52 +0100 Subject: [PATCH 4/4] Added todo comment for focus scopes. --- src/Avalonia.Input/AccessKeyHandler.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Input/AccessKeyHandler.cs b/src/Avalonia.Input/AccessKeyHandler.cs index 06e8e8cea5..7baa4103d7 100644 --- a/src/Avalonia.Input/AccessKeyHandler.cs +++ b/src/Avalonia.Input/AccessKeyHandler.cs @@ -124,8 +124,9 @@ namespace Avalonia.Input if (MainMenu == null || !MainMenu.IsOpen) { + // TODO: Use FocusScopes to store the current element and restore it when context menu is closed. // Save currently focused input element. - _restoreFocusElement = FocusManager.Instance.Current; + _restoreFocusElement = FocusManager.Instance.Current; // When Alt is pressed without a main menu, or with a closed main menu, show // access key markers in the window (i.e. "_File").