Skip to content

Commit 5628ebf

Browse files
authored
[RawKeyboard] Allow inconsistent modifiers for Web (#114499)
Co-authored-by: Bruno Leroux <[email protected]>
1 parent fe5eb2d commit 5628ebf

File tree

5 files changed

+67
-1
lines changed

5 files changed

+67
-1
lines changed

dev/tools/gen_keycodes/data/keyboard_key.tmpl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ class LogicalKeyboardKey extends KeyboardKey {
209209
/// Auto-generated IDs should be a rare occurrence: Flutter supports most keys.
210210
///
211211
/// Keys that generate Unicode characters (even if unknown to Flutter) will
212-
/// not return true for `isAutogenerated`, since they will be assigned a
212+
/// not return true for [isAutogenerated], since they will be assigned a
213213
/// Unicode-based code that will remain stable.
214214
///
215215
/// If Flutter adds support for a previously unsupported key code, the ID it

dev/tools/gen_keycodes/data/web_logical_location_mapping.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,6 @@
2929
"Shift": ["ShiftLeft", "ShiftLeft", "ShiftRight", null],
3030
"Control": ["ControlLeft", "ControlLeft", "ControlRight", null],
3131
"Alt": ["AltLeft", "AltLeft", "AltRight", null],
32+
"AltGraph": ["AltGraph", null, "AltGraph", null],
3233
"Meta": ["MetaLeft", "MetaLeft", "MetaRight", null]
3334
}

packages/flutter/lib/src/services/keyboard_maps.g.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2755,6 +2755,7 @@ const Map<String, List<LogicalKeyboardKey?>> kWebLocationMap = <String, List<Log
27552755
'8': <LogicalKeyboardKey?>[LogicalKeyboardKey.digit8, null, null, LogicalKeyboardKey.numpad8],
27562756
'9': <LogicalKeyboardKey?>[LogicalKeyboardKey.digit9, null, null, LogicalKeyboardKey.numpad9],
27572757
'Alt': <LogicalKeyboardKey?>[LogicalKeyboardKey.altLeft, LogicalKeyboardKey.altLeft, LogicalKeyboardKey.altRight, null],
2758+
'AltGraph': <LogicalKeyboardKey?>[LogicalKeyboardKey.altGraph, null, LogicalKeyboardKey.altGraph, null],
27582759
'ArrowDown': <LogicalKeyboardKey?>[LogicalKeyboardKey.arrowDown, null, null, LogicalKeyboardKey.numpad2],
27592760
'ArrowLeft': <LogicalKeyboardKey?>[LogicalKeyboardKey.arrowLeft, null, null, LogicalKeyboardKey.numpad4],
27602761
'ArrowRight': <LogicalKeyboardKey?>[LogicalKeyboardKey.arrowRight, null, null, LogicalKeyboardKey.numpad6],

packages/flutter/lib/src/services/raw_keyboard.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -848,6 +848,12 @@ class RawKeyboard {
848848
_keysPressed[event.physicalKey] = logicalKey;
849849
}
850850
}
851+
// On Web, PhysicalKeyboardKey.altRight can be map to LogicalKeyboardKey.altGraph or
852+
// LogicalKeyboardKey.altRight:
853+
// https://github.com/flutter/flutter/issues/113836
854+
if (event.data is RawKeyEventDataWeb && event.physicalKey == PhysicalKeyboardKey.altRight) {
855+
_keysPressed[event.physicalKey] = event.logicalKey;
856+
}
851857
}
852858
}
853859

packages/flutter/test/services/raw_keyboard_test.dart

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -842,6 +842,64 @@ void main() {
842842
expect(RawKeyboard.instance.keysPressed, contains(LogicalKeyboardKey.capsLock));
843843
}, skip: isBrowser); // [intended] This is an Android-specific group.
844844

845+
testWidgets('Allows inconsistent modifier for Web - Alt graph', (WidgetTester _) async {
846+
// Regression test for https://github.com/flutter/flutter/issues/113836
847+
final List<RawKeyEvent> events = <RawKeyEvent>[];
848+
RawKeyboard.instance.addListener(events.add);
849+
addTearDown(() {
850+
RawKeyboard.instance.removeListener(events.add);
851+
});
852+
await TestDefaultBinaryMessengerBinding.instance!.defaultBinaryMessenger.handlePlatformMessage(
853+
SystemChannels.keyEvent.name,
854+
SystemChannels.keyEvent.codec.encodeMessage(const <String, dynamic>{
855+
'type': 'keydown',
856+
'keymap': 'web',
857+
'code': 'AltRight',
858+
'key': 'AltGraph',
859+
'location': 2,
860+
'metaState': 0,
861+
'keyCode': 225,
862+
}),
863+
(ByteData? data) { },
864+
);
865+
866+
expect(events, hasLength(1));
867+
final RawKeyEvent altRightKey = events[0];
868+
final RawKeyEventDataWeb data = altRightKey.data as RawKeyEventDataWeb;
869+
expect(data.physicalKey, equals(PhysicalKeyboardKey.altRight));
870+
expect(data.logicalKey, equals(LogicalKeyboardKey.altGraph));
871+
expect(RawKeyboard.instance.keysPressed, contains(LogicalKeyboardKey.altGraph));
872+
}, skip: !isBrowser); // [intended] This is a Browser-specific test.
873+
874+
testWidgets('Allows inconsistent modifier for Web - Alt right', (WidgetTester _) async {
875+
// Regression test for https://github.com/flutter/flutter/issues/113836
876+
final List<RawKeyEvent> events = <RawKeyEvent>[];
877+
RawKeyboard.instance.addListener(events.add);
878+
addTearDown(() {
879+
RawKeyboard.instance.removeListener(events.add);
880+
});
881+
await TestDefaultBinaryMessengerBinding.instance!.defaultBinaryMessenger.handlePlatformMessage(
882+
SystemChannels.keyEvent.name,
883+
SystemChannels.keyEvent.codec.encodeMessage(const <String, dynamic>{
884+
'type': 'keydown',
885+
'keymap': 'web',
886+
'code': 'AltRight',
887+
'key': 'Alt',
888+
'location': 2,
889+
'metaState': 0,
890+
'keyCode': 225,
891+
}),
892+
(ByteData? data) { },
893+
);
894+
895+
expect(events, hasLength(1));
896+
final RawKeyEvent altRightKey = events[0];
897+
final RawKeyEventDataWeb data = altRightKey.data as RawKeyEventDataWeb;
898+
expect(data.physicalKey, equals(PhysicalKeyboardKey.altRight));
899+
expect(data.logicalKey, equals(LogicalKeyboardKey.altRight));
900+
expect(RawKeyboard.instance.keysPressed, contains(LogicalKeyboardKey.altRight));
901+
}, skip: !isBrowser); // [intended] This is a Browser-specific test.
902+
845903
testWidgets('Dispatch events to all handlers', (WidgetTester tester) async {
846904
final FocusNode focusNode = FocusNode();
847905
final List<int> logs = <int>[];

0 commit comments

Comments
 (0)