Skip to content

Commit a62501e

Browse files
authored
Allow Textbox to use keyboard despite hotkeys (#11791)
1 parent 9791024 commit a62501e

File tree

2 files changed

+72
-7
lines changed

2 files changed

+72
-7
lines changed
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
using System.Collections.Generic;
2+
using System.Collections.Immutable;
3+
using Windows.System;
4+
5+
namespace Files.App.Commands
6+
{
7+
internal static class HotKeyHelpers
8+
{
9+
private static readonly ImmutableArray<VirtualKey> globalKeys = new List<VirtualKey>
10+
{
11+
VirtualKey.GoHome,
12+
VirtualKey.GoBack,
13+
VirtualKey.GoForward,
14+
VirtualKey.Application,
15+
VirtualKey.Favorites,
16+
VirtualKey.Search,
17+
VirtualKey.Refresh,
18+
VirtualKey.Pause,
19+
VirtualKey.Sleep,
20+
VirtualKey.Print,
21+
VirtualKey.F1,
22+
VirtualKey.F2,
23+
VirtualKey.F3,
24+
VirtualKey.F4,
25+
VirtualKey.F5,
26+
VirtualKey.F6,
27+
VirtualKey.F7,
28+
VirtualKey.F8,
29+
VirtualKey.F9,
30+
VirtualKey.F10,
31+
VirtualKey.F11,
32+
VirtualKey.F12,
33+
VirtualKey.F13,
34+
VirtualKey.F14,
35+
VirtualKey.F15,
36+
VirtualKey.F16,
37+
VirtualKey.F17,
38+
VirtualKey.F18,
39+
VirtualKey.F19,
40+
VirtualKey.F20,
41+
VirtualKey.F21,
42+
VirtualKey.F22,
43+
VirtualKey.F23,
44+
VirtualKey.F24,
45+
}.ToImmutableArray();
46+
47+
private static readonly ImmutableArray<HotKey> textBoxHotKeys = new List<HotKey>
48+
{
49+
new HotKey(VirtualKey.X, VirtualKeyModifiers.Control), // Cut
50+
new HotKey(VirtualKey.C, VirtualKeyModifiers.Control), // Copy
51+
new HotKey(VirtualKey.V, VirtualKeyModifiers.Control), // Paste
52+
new HotKey(VirtualKey.A, VirtualKeyModifiers.Control), // Select all
53+
new HotKey(VirtualKey.Z, VirtualKeyModifiers.Control), // Cancel
54+
}.ToImmutableArray();
55+
56+
public static bool IsGlobalKey(this VirtualKey key) => globalKeys.Contains(key);
57+
public static bool IsTextBoxHotKey(this HotKey hotKey) => textBoxHotKeys.Contains(hotKey);
58+
}
59+
}

src/Files.App/Views/MainPage.xaml.cs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -235,17 +235,23 @@ protected override async void OnPreviewKeyDown(KeyRoutedEventArgs e)
235235
currentModifiers |= VirtualKeyModifiers.Shift;
236236
break;
237237
default:
238-
// break for natives hotkeys in textbox (cut/copy/paste/selectAll/cancel)
238+
HotKey hotKey = new(e.Key, currentModifiers);
239+
240+
// A textbox takes precedence over certain hotkeys.
239241
bool isTextBox = e.OriginalSource is DependencyObject source && source.FindAscendantOrSelf<TextBox>() is not null;
240-
if (isTextBox &&
241-
currentModifiers is VirtualKeyModifiers.Control &&
242-
e.Key is VirtualKey.X or VirtualKey.C or VirtualKey.V or VirtualKey.A or VirtualKey.Z)
242+
if (isTextBox)
243243
{
244-
break;
244+
if (hotKey.IsTextBoxHotKey())
245+
{
246+
break;
247+
}
248+
if (currentModifiers is VirtualKeyModifiers.None && !e.Key.IsGlobalKey())
249+
{
250+
break;
251+
}
245252
}
246253

247-
// execute command for hotkey
248-
var hotKey = new HotKey(e.Key, currentModifiers);
254+
// Execute command for hotkey
249255
var command = Commands[hotKey];
250256
if (command.Code is not CommandCodes.None && keyReleased)
251257
{

0 commit comments

Comments
 (0)