From 8cf086acd1b9250795d7ee3ef9df5fddb63094a0 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 27 Jun 2022 11:41:31 -0700 Subject: [PATCH 01/74] WIP --- .../src/engine/keyboard_layout_detector.dart | 43 +++++++++++++++++++ lib/web_ui/pubspec.yaml | 2 + 2 files changed, 45 insertions(+) create mode 100644 lib/web_ui/lib/src/engine/keyboard_layout_detector.dart diff --git a/lib/web_ui/lib/src/engine/keyboard_layout_detector.dart b/lib/web_ui/lib/src/engine/keyboard_layout_detector.dart new file mode 100644 index 0000000000000..84fec6958c6be --- /dev/null +++ b/lib/web_ui/lib/src/engine/keyboard_layout_detector.dart @@ -0,0 +1,43 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:web_keyboard_layouts/web_keyboard_layouts.dart'; +import 'dom.dart'; + +// Set this flag to true to see the details of detecting layouts. +const bool _debugLogLayoutEvents = false; + +class KeyboardLayoutDetector { + void update(DomKeyboardEvent event) { + if (event.type != 'keydown') { + return; + } + + if (_candidates != null) { + _filterCandidates(_candidates!, event); + if (_candidates!.isNotEmpty) { + return; + } else { + print('[Debug] Keyboard layout: Candidate exhausted.'); + } + } + + _candidates = kLayouts; + _filterCandidates(_candidates!, event); + if (_candidates!.isEmpty) { + _candidates = null; + } + } + + static void _filterCandidates(List candidates, DomEvent event) { + } + + List? _candidates; + + static String _printEvent(DomKeyboardEvent event) { + final String flags = [ + ]; + return 'Event(${event.code}, ${event.key}, )'; + } +} diff --git a/lib/web_ui/pubspec.yaml b/lib/web_ui/pubspec.yaml index d1fd0e88f74d8..0c6f752b01cc5 100644 --- a/lib/web_ui/pubspec.yaml +++ b/lib/web_ui/pubspec.yaml @@ -8,6 +8,8 @@ environment: dependencies: js: 0.6.4 meta: 1.3.0 + web_keyboard_layouts: + path: ../../../../../packages/third_party/packages/web_keyboard_layouts dev_dependencies: archive: 3.1.2 From 21c50f013137f2304f6e68e15488a89668bbe359 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 27 Jun 2022 18:58:52 -0700 Subject: [PATCH 02/74] WIP: Better debug log --- .../src/engine/keyboard_layout_detector.dart | 65 +++++++++++++++---- 1 file changed, 52 insertions(+), 13 deletions(-) diff --git a/lib/web_ui/lib/src/engine/keyboard_layout_detector.dart b/lib/web_ui/lib/src/engine/keyboard_layout_detector.dart index 84fec6958c6be..17f6420360a85 100644 --- a/lib/web_ui/lib/src/engine/keyboard_layout_detector.dart +++ b/lib/web_ui/lib/src/engine/keyboard_layout_detector.dart @@ -7,6 +7,11 @@ import 'dom.dart'; // Set this flag to true to see the details of detecting layouts. const bool _debugLogLayoutEvents = false; +void _debugLog(String message) { + if (_debugLogLayoutEvents) { + print(_debugLogLayoutEvents); + } +} class KeyboardLayoutDetector { void update(DomKeyboardEvent event) { @@ -14,30 +19,64 @@ class KeyboardLayoutDetector { return; } - if (_candidates != null) { - _filterCandidates(_candidates!, event); - if (_candidates!.isNotEmpty) { + // There is an existing candidate list. Filter based on it. + if (_candidates.isEmpty) { + final bool validCue = _filterCandidates(_candidates, event); + if (validCue) { + _debugCues.add(event); + } + if (_candidates.isNotEmpty) { + // There are some candidates left. Move forward. return; } else { - print('[Debug] Keyboard layout: Candidate exhausted.'); + _debugLog('[Debug] Keyboard layout: Candidates exhausted. Past cues:' + + _debugCuesToString(_debugCues)); } } - _candidates = kLayouts; - _filterCandidates(_candidates!, event); - if (_candidates!.isEmpty) { - _candidates = null; + // Start anew: Filter based on the entire list. + _candidates.addAll(kLayouts); + _debugCues.clear(); + final bool validCue = _filterCandidates(_candidates, event); + if (validCue) { + _debugCues.add(event); + } + if (_candidates.isEmpty) { + _debugLog('[Debug] Keyboard layout: Candidates exhausted on first try. Past cues:' + + _debugCuesToString(_debugCues)); } } - static void _filterCandidates(List candidates, DomEvent event) { + static bool _filterCandidates(List candidates, DomKeyboardEvent event) { + final int beforeCandidateNum = candidates.length; + final bool thisIsDead = event.key == 'Dead'; + final bool thisHasAltGr = event.getModifierState('AltGraph'); + final bool thisHasShift = event.shiftKey; + candidates.where((LayoutInfo element) { + final bool candidateIsDead = + }); + final int afterCandidateNum = candidates.length; + return afterCandidateNum < beforeCandidateNum; } - List? _candidates; + final List _candidates = []; + final List _debugCues = []; - static String _printEvent(DomKeyboardEvent event) { + static String _debugEventToString(DomKeyboardEvent event) { final String flags = [ - ]; - return 'Event(${event.code}, ${event.key}, )'; + if (event.altKey) 'Alt', + if (event.shiftKey) 'Shift', + ].join(' | '); + final String parameters = [ + event.code ?? '', + event.key ?? '', + if (flags.isNotEmpty) flags, + ].join(', '); + return 'Event($parameters)'; + } + + static String _debugCuesToString(List cues) { + return cues.map((DomKeyboardEvent event) => + '\n ${_debugEventToString(event)}').join(''); } } From 3c05c3dd3934708e3b00d45de9b8b2ba74dab02a Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Fri, 1 Jul 2022 02:10:47 -0700 Subject: [PATCH 03/74] WIP --- lib/web_ui/lib/src/engine/keyboard_layout_detector.dart | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/web_ui/lib/src/engine/keyboard_layout_detector.dart b/lib/web_ui/lib/src/engine/keyboard_layout_detector.dart index 17f6420360a85..08143717ccee4 100644 --- a/lib/web_ui/lib/src/engine/keyboard_layout_detector.dart +++ b/lib/web_ui/lib/src/engine/keyboard_layout_detector.dart @@ -52,9 +52,13 @@ class KeyboardLayoutDetector { final bool thisIsDead = event.key == 'Dead'; final bool thisHasAltGr = event.getModifierState('AltGraph'); final bool thisHasShift = event.shiftKey; + final int index = (thisHasShift ? 1 : 0) + (thisHasAltGr ? 2 : 0); candidates.where((LayoutInfo element) { - final bool candidateIsDead = - }); + final LayoutEntry? entry = element.mapping[event.code]; + if (entry == null) { + + } + }); final int afterCandidateNum = candidates.length; return afterCandidateNum < beforeCandidateNum; } From 416f5748648fc8de3cec6fda9507e23ad00f07b9 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Thu, 7 Jul 2022 12:39:54 -0700 Subject: [PATCH 04/74] Finish logic (untested) --- ci/licenses_golden/licenses_flutter | 1 + .../lib/src/engine/keyboard_binding.dart | 6 +- .../src/engine/keyboard_layout_detector.dart | 123 ++++++++++++++++-- 3 files changed, 119 insertions(+), 11 deletions(-) diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index f0f3333bb7f67..07e588a54d925 100644 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -1120,6 +1120,7 @@ FILE: ../../../flutter/lib/web_ui/lib/src/engine/js_interop/js_promise.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/key_map.g.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/keyboard.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/keyboard_binding.dart +FILE: ../../../flutter/lib/web_ui/lib/src/engine/keyboard_layout_detector.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/mouse_cursor.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/navigation.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/navigation/history.dart diff --git a/lib/web_ui/lib/src/engine/keyboard_binding.dart b/lib/web_ui/lib/src/engine/keyboard_binding.dart index 77171e6217631..4f6f49c426eda 100644 --- a/lib/web_ui/lib/src/engine/keyboard_binding.dart +++ b/lib/web_ui/lib/src/engine/keyboard_binding.dart @@ -8,6 +8,7 @@ import '../engine.dart' show registerHotRestartListener; import 'browser_detection.dart'; import 'dom.dart'; import 'key_map.g.dart'; +import 'keyboard_layout_detector.dart' show KeyboardLayoutDetector; import 'platform_dispatcher.dart'; import 'safe_browser_api.dart'; import 'semantics.dart'; @@ -106,6 +107,7 @@ class KeyboardBinding { _setup(); } + final KeyboardLayoutDetector layoutDetector = KeyboardLayoutDetector(); final DomElement glassPaneElement; late KeyboardConverter _converter; final Map _listeners = {}; @@ -145,7 +147,9 @@ class KeyboardBinding { void _setup() { _addEventListener('keydown', allowInterop((DomEvent event) { - return _converter.handleEvent(FlutterHtmlKeyboardEvent(event as DomKeyboardEvent)); + layoutDetector.update(event as DomKeyboardEvent); + print('${event.code} ${layoutDetector.getKey(event.code ?? '')}'); + return _converter.handleEvent(FlutterHtmlKeyboardEvent(event)); })); _addEventListener('keyup', allowInterop((DomEvent event) { return _converter.handleEvent(FlutterHtmlKeyboardEvent(event as DomKeyboardEvent)); diff --git a/lib/web_ui/lib/src/engine/keyboard_layout_detector.dart b/lib/web_ui/lib/src/engine/keyboard_layout_detector.dart index 08143717ccee4..b617f20f85ab8 100644 --- a/lib/web_ui/lib/src/engine/keyboard_layout_detector.dart +++ b/lib/web_ui/lib/src/engine/keyboard_layout_detector.dart @@ -13,16 +13,33 @@ void _debugLog(String message) { } } +bool _isEascii(int clue) { + // This also excludes kDeadKey. + return clue < 256; +} + class KeyboardLayoutDetector { + KeyboardLayoutDetector() { + int index = 0; + for (final String key in kLayoutGoals.keys) { + _goalToIndex[key] = index; + index += 1; + } + } + void update(DomKeyboardEvent event) { if (event.type != 'keydown') { return; } + final int? goalIndex = _goalToIndex[event.code]; + if (goalIndex == null) { + return; + } // There is an existing candidate list. Filter based on it. if (_candidates.isEmpty) { - final bool validCue = _filterCandidates(_candidates, event); - if (validCue) { + final bool effectiveCue = _filterCandidates(_candidates, event, goalIndex); + if (effectiveCue) { _debugCues.add(event); } if (_candidates.isNotEmpty) { @@ -35,10 +52,10 @@ class KeyboardLayoutDetector { } // Start anew: Filter based on the entire list. - _candidates.addAll(kLayouts); + _candidates.addAll(_fullCandidates); _debugCues.clear(); - final bool validCue = _filterCandidates(_candidates, event); - if (validCue) { + final bool effectiveCue = _filterCandidates(_candidates, event, goalIndex); + if (effectiveCue) { _debugCues.add(event); } if (_candidates.isEmpty) { @@ -47,25 +64,111 @@ class KeyboardLayoutDetector { } } - static bool _filterCandidates(List candidates, DomKeyboardEvent event) { + int? getKey(String code) { + if (_candidates.isEmpty) { + return null; + } + final LayoutInfo candidate = _candidates.first; + if (!_calculatedLayouts.containsKey(candidate.name)) { + _calculatedLayouts[candidate.name] = _buildLayout(candidate.mapping, candidate.name); + } + final Map map = _calculatedLayouts[candidate.name]!; + return map[code]; + } + + static bool _filterCandidates(List candidates, DomKeyboardEvent event, int goalIndex) { final int beforeCandidateNum = candidates.length; final bool thisIsDead = event.key == 'Dead'; final bool thisHasAltGr = event.getModifierState('AltGraph'); final bool thisHasShift = event.shiftKey; final int index = (thisHasShift ? 1 : 0) + (thisHasAltGr ? 2 : 0); candidates.where((LayoutInfo element) { - final LayoutEntry? entry = element.mapping[event.code]; - if (entry == null) { - + final int expected = element.mapping[goalIndex][index]; + if (thisIsDead) { + return expected == kDeadKey; + } else { + final String key = event.key ?? ''; + // TODO: Correctly process Utf16 + return key.length == 1 && key.codeUnitAt(0) == expected; } - }); + }); final int afterCandidateNum = candidates.length; return afterCandidateNum < beforeCandidateNum; } + static Map _buildLayout(List> clueMap, String debugLayoutName) { + assert(() { + print('Building layout for $debugLayoutName'); + return true; + }()); + final Map mandatoryGoalsByChar = {..._mandatoryGoalsByChar}; + final Map result = {}; + // The logical key should be the first available clue from below: + // + // - Mandatory goal, if it matches any clue. This ensures that all alnum + // keys can be found somewhere. + // - US layout, if neither clue of the key is EASCII. This ensures that + // there are no non-latin logical keys. + // - Derived on the fly from keyCode & characters. + int goalIndex = 0; + kLayoutGoals.forEach((String code, String? goalKey) { + // Skip optional goals. + if (goalKey == null) { + return; + } + final List clues = clueMap[goalIndex]; + // See if any clue on this key matches a mandatory char. + for (final int clue in clues) { + final String? foundCode = mandatoryGoalsByChar[clue]; + if (foundCode != null) { + result[code] = clue; + mandatoryGoalsByChar.remove(foundCode); + return; + } + } + // See if all clues on this key are non-EASCII. If not, use the verbatim key. + if (!clues.any(_isEascii)) { + final int character = kLayoutGoals[code]!.codeUnitAt(0); + result[code] = character; + mandatoryGoalsByChar.remove(character); + } + + goalIndex += 1; + }); + + // Ensure all mandatory goals are assigned. + mandatoryGoalsByChar.forEach((int character, String code) { + result[code] = character; + }); + assert(() { + print(result); + return true; + }()); + return result; + } + + final Map _goalToIndex = {}; final List _candidates = []; + final Map> _calculatedLayouts = >{}; + // Record all effective cues since the last reset. That is, cues that filtered + // out any candidates. This is used to print out debug information. final List _debugCues = []; + static late final List _fullCandidates = kLayouts.where( + (LayoutInfo layout) => layout.platform == _currentPlatform, + ).toList(); + static late final LayoutPlatform _currentPlatform = () { + // TODO + return LayoutPlatform.win; + }(); + static late final Map _mandatoryGoalsByChar = Map.fromEntries( + kLayoutGoals + .entries + .where((MapEntry entry) => entry.value != null) + // TODO: correctly handle UTF + .map((MapEntry entry) => MapEntry(entry.value!.codeUnitAt(0), entry.key)) + ); + static String _debugEventToString(DomKeyboardEvent event) { final String flags = [ if (event.altKey) 'Alt', From 5ed152d9fbf42f301eff56324770308a4224f2e2 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Tue, 12 Jul 2022 17:24:09 -0700 Subject: [PATCH 05/74] Use third_party for layouts --- lib/web_ui/lib/src/engine.dart | 1 + .../lib/src/engine/keyboard_binding.dart | 2 +- .../src/engine/keyboard_layout_detector.dart | 28 +- lib/web_ui/pubspec.yaml | 4 +- third_party/web_keyboard_layouts/.gitignore | 14 + third_party/web_keyboard_layouts/CHANGELOG.md | 3 + third_party/web_keyboard_layouts/LICENSE | 21 + third_party/web_keyboard_layouts/README.md | 23 + .../web_keyboard_layouts/lib/base.dart | 32 + .../web_keyboard_layouts/lib/definitions.dart | 2978 +++++++++++++++++ .../lib/web_keyboard_layouts.dart | 7 + third_party/web_keyboard_layouts/pubspec.yaml | 9 + web_sdk/BUILD.gn | 67 +- web_sdk/libraries.json | 6 + web_sdk/libraries.yaml | 8 +- web_sdk/sdk_rewriter.dart | 26 +- 16 files changed, 3202 insertions(+), 27 deletions(-) create mode 100644 third_party/web_keyboard_layouts/.gitignore create mode 100644 third_party/web_keyboard_layouts/CHANGELOG.md create mode 100644 third_party/web_keyboard_layouts/LICENSE create mode 100644 third_party/web_keyboard_layouts/README.md create mode 100644 third_party/web_keyboard_layouts/lib/base.dart create mode 100644 third_party/web_keyboard_layouts/lib/definitions.dart create mode 100644 third_party/web_keyboard_layouts/lib/web_keyboard_layouts.dart create mode 100644 third_party/web_keyboard_layouts/pubspec.yaml diff --git a/lib/web_ui/lib/src/engine.dart b/lib/web_ui/lib/src/engine.dart index 166f78ffac659..ee820262e3a88 100644 --- a/lib/web_ui/lib/src/engine.dart +++ b/lib/web_ui/lib/src/engine.dart @@ -106,6 +106,7 @@ export 'engine/js_interop/js_promise.dart'; export 'engine/key_map.g.dart'; export 'engine/keyboard.dart'; export 'engine/keyboard_binding.dart'; +export 'engine/keyboard_layout_detector.dart'; export 'engine/mouse_cursor.dart'; export 'engine/navigation/history.dart'; export 'engine/navigation/js_url_strategy.dart'; diff --git a/lib/web_ui/lib/src/engine/keyboard_binding.dart b/lib/web_ui/lib/src/engine/keyboard_binding.dart index 4f6f49c426eda..6ff2c0c48e929 100644 --- a/lib/web_ui/lib/src/engine/keyboard_binding.dart +++ b/lib/web_ui/lib/src/engine/keyboard_binding.dart @@ -8,7 +8,7 @@ import '../engine.dart' show registerHotRestartListener; import 'browser_detection.dart'; import 'dom.dart'; import 'key_map.g.dart'; -import 'keyboard_layout_detector.dart' show KeyboardLayoutDetector; +import 'keyboard_layout_detector.dart'; import 'platform_dispatcher.dart'; import 'safe_browser_api.dart'; import 'semantics.dart'; diff --git a/lib/web_ui/lib/src/engine/keyboard_layout_detector.dart b/lib/web_ui/lib/src/engine/keyboard_layout_detector.dart index b617f20f85ab8..0d8338af52f99 100644 --- a/lib/web_ui/lib/src/engine/keyboard_layout_detector.dart +++ b/lib/web_ui/lib/src/engine/keyboard_layout_detector.dart @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:web_keyboard_layouts/web_keyboard_layouts.dart'; +import 'package:web_keyboard_layouts/web_keyboard_layouts.dart' as keyboard_layouts; import 'dom.dart'; // Set this flag to true to see the details of detecting layouts. @@ -21,7 +21,7 @@ bool _isEascii(int clue) { class KeyboardLayoutDetector { KeyboardLayoutDetector() { int index = 0; - for (final String key in kLayoutGoals.keys) { + for (final String key in keyboard_layouts.kLayoutGoals.keys) { _goalToIndex[key] = index; index += 1; } @@ -68,7 +68,7 @@ class KeyboardLayoutDetector { if (_candidates.isEmpty) { return null; } - final LayoutInfo candidate = _candidates.first; + final keyboard_layouts.LayoutInfo candidate = _candidates.first; if (!_calculatedLayouts.containsKey(candidate.name)) { _calculatedLayouts[candidate.name] = _buildLayout(candidate.mapping, candidate.name); } @@ -76,16 +76,16 @@ class KeyboardLayoutDetector { return map[code]; } - static bool _filterCandidates(List candidates, DomKeyboardEvent event, int goalIndex) { + static bool _filterCandidates(List candidates, DomKeyboardEvent event, int goalIndex) { final int beforeCandidateNum = candidates.length; final bool thisIsDead = event.key == 'Dead'; final bool thisHasAltGr = event.getModifierState('AltGraph'); final bool thisHasShift = event.shiftKey; final int index = (thisHasShift ? 1 : 0) + (thisHasAltGr ? 2 : 0); - candidates.where((LayoutInfo element) { + candidates.where((keyboard_layouts.LayoutInfo element) { final int expected = element.mapping[goalIndex][index]; if (thisIsDead) { - return expected == kDeadKey; + return expected == keyboard_layouts.kDeadKey; } else { final String key = event.key ?? ''; // TODO: Correctly process Utf16 @@ -111,7 +111,7 @@ class KeyboardLayoutDetector { // there are no non-latin logical keys. // - Derived on the fly from keyCode & characters. int goalIndex = 0; - kLayoutGoals.forEach((String code, String? goalKey) { + keyboard_layouts.kLayoutGoals.forEach((String code, String? goalKey) { // Skip optional goals. if (goalKey == null) { return; @@ -128,7 +128,7 @@ class KeyboardLayoutDetector { } // See if all clues on this key are non-EASCII. If not, use the verbatim key. if (!clues.any(_isEascii)) { - final int character = kLayoutGoals[code]!.codeUnitAt(0); + final int character = keyboard_layouts.kLayoutGoals[code]!.codeUnitAt(0); result[code] = character; mandatoryGoalsByChar.remove(character); } @@ -148,21 +148,21 @@ class KeyboardLayoutDetector { } final Map _goalToIndex = {}; - final List _candidates = []; + final List _candidates = []; final Map> _calculatedLayouts = >{}; // Record all effective cues since the last reset. That is, cues that filtered // out any candidates. This is used to print out debug information. final List _debugCues = []; - static late final List _fullCandidates = kLayouts.where( - (LayoutInfo layout) => layout.platform == _currentPlatform, + static late final List _fullCandidates = keyboard_layouts.kLayouts.where( + (keyboard_layouts.LayoutInfo layout) => layout.platform == _currentPlatform, ).toList(); - static late final LayoutPlatform _currentPlatform = () { + static late final keyboard_layouts.LayoutPlatform _currentPlatform = () { // TODO - return LayoutPlatform.win; + return keyboard_layouts.LayoutPlatform.win; }(); static late final Map _mandatoryGoalsByChar = Map.fromEntries( - kLayoutGoals + keyboard_layouts.kLayoutGoals .entries .where((MapEntry entry) => entry.value != null) // TODO: correctly handle UTF diff --git a/lib/web_ui/pubspec.yaml b/lib/web_ui/pubspec.yaml index 0c6f752b01cc5..fb3651e5e4b05 100644 --- a/lib/web_ui/pubspec.yaml +++ b/lib/web_ui/pubspec.yaml @@ -8,8 +8,6 @@ environment: dependencies: js: 0.6.4 meta: 1.3.0 - web_keyboard_layouts: - path: ../../../../../packages/third_party/packages/web_keyboard_layouts dev_dependencies: archive: 3.1.2 @@ -34,3 +32,5 @@ dev_dependencies: ref: 9afed28b771da1c4e82a3382c4a2b31344c04522 skia_gold_client: path: ../../testing/skia_gold_client + web_keyboard_layouts: + path: ../../third_party/web_keyboard_layouts diff --git a/third_party/web_keyboard_layouts/.gitignore b/third_party/web_keyboard_layouts/.gitignore new file mode 100644 index 0000000000000..2f9337cb4968f --- /dev/null +++ b/third_party/web_keyboard_layouts/.gitignore @@ -0,0 +1,14 @@ +# See https://dart.dev/guides/libraries/private-files + +# Files and directories created by pub +.dart_tool/ +.packages +build/ +# If you're building an application, you may want to check-in your pubspec.lock +pubspec.lock + +# Directory created by dartdoc +# If you don't generate documentation locally you can remove this line. +doc/api/ + +.vscode diff --git a/third_party/web_keyboard_layouts/CHANGELOG.md b/third_party/web_keyboard_layouts/CHANGELOG.md new file mode 100644 index 0000000000000..13854562d7059 --- /dev/null +++ b/third_party/web_keyboard_layouts/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.1.1 + +* Initial release. diff --git a/third_party/web_keyboard_layouts/LICENSE b/third_party/web_keyboard_layouts/LICENSE new file mode 100644 index 0000000000000..0ac28ee234d23 --- /dev/null +++ b/third_party/web_keyboard_layouts/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2015 - present Microsoft Corporation + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/third_party/web_keyboard_layouts/README.md b/third_party/web_keyboard_layouts/README.md new file mode 100644 index 0000000000000..a6dafd0725d63 --- /dev/null +++ b/third_party/web_keyboard_layouts/README.md @@ -0,0 +1,23 @@ +# Cupertino Icons + +This is an asset repo containing the keyboard layouts used by +Flutter's [Web keyboard manager](https://github.com/flutter/engine/blob/main/lib/web_ui/lib/src/engine/keyboard_binding.dart). + +# Usage + +https://pub.dev/packages/web_keyboard_layouts + +[![pub package](https://img.shields.io/pub/v/web_keyboard_layouts.svg)](https://pub.dev/packages/web_keyboard_layouts) + +```yaml +dependencies: + web_keyboard_layouts: ^ +``` + +# Issues + +For issues, file directly in the [main Flutter repo](https://github.com/flutter/flutter). + +# Layouts + +TODO diff --git a/third_party/web_keyboard_layouts/lib/base.dart b/third_party/web_keyboard_layouts/lib/base.dart new file mode 100644 index 0000000000000..0fe43bba0390d --- /dev/null +++ b/third_party/web_keyboard_layouts/lib/base.dart @@ -0,0 +1,32 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. + +part of web_keyboard_layouts; + +enum LayoutPlatform { + win, + linux, + darwin, +} + +class LayoutEntry { + const LayoutEntry( + this.values, + ); + + // List of four: value, withShift, withAlt, withShiftAlt. + // Each value is either 0xYYYYYY, or 0x1000000 for a dead key. + final List values; +} + +class LayoutInfo { + const LayoutInfo({ + required this.name, + required this.platform, + required this.mapping, + }); + + final String name; + final LayoutPlatform platform; + final Map mapping; +} diff --git a/third_party/web_keyboard_layouts/lib/definitions.dart b/third_party/web_keyboard_layouts/lib/definitions.dart new file mode 100644 index 0000000000000..1683b735ced9a --- /dev/null +++ b/third_party/web_keyboard_layouts/lib/definitions.dart @@ -0,0 +1,2978 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. + +// DO NOT EDIT -- DO NOT EDIT -- DO NOT EDIT +// +// This file is auto generated by flutter/packages:script/gen_web_keyboard based on +// https://github.com/microsoft/vscode/tree/4589815e4849499c67125ff68563fa102646b869/src/vs/workbench/services/keybinding/browser/keyboardLayouts +// +// Edit the following files instead: +// +// - Script: lib/main.dart +// - Templates: data/*.tmpl +// +// See flutter/packages:script/gen_web_keyboard/layouts/README.md for more information. + +part of web_keyboard_layouts; + +const List kLayouts = [ + LayoutInfo( + name: 'cz', + platform: LayoutPlatform.win, + mapping: { + 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x01000000, 0x01000000]), + 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x0000007b, 0x01000000]), + 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x00000026, 0x01000000]), + 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x00000110, 0x01000000]), + 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000020ac, 0x01000000]), + 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x0000005b, 0x01000000]), + 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x0000005d, 0x01000000]), + 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x01000000]), + 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x01000000]), + 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x01000000]), + 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x00000142, 0x01000000]), + 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x00000141, 0x01000000]), + 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x01000000, 0x01000000]), + 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x0000007d, 0x01000000]), + 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x01000000, 0x01000000]), + 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x01000000]), + 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x0000005c, 0x01000000]), + 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x01000000, 0x01000000]), + 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x00000111, 0x01000000]), + 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x01000000, 0x01000000]), + 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x01000000]), + 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x00000040, 0x01000000]), + 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x0000007c, 0x01000000]), + 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x00000023, 0x01000000]), + 'KeyY': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x01000000]), + 'KeyZ': LayoutEntry([0x00000079, 0x00000059, 0x01000000, 0x01000000]), + 'Digit1': LayoutEntry([0x0000002b, 0x00000031, 0x0000007e, 0x01000000]), + 'Digit2': LayoutEntry([0x0000011b, 0x00000032, 0x000002c7, 0x01000000]), + 'Digit3': LayoutEntry([0x00000161, 0x00000033, 0x0000005e, 0x01000000]), + 'Digit4': LayoutEntry([0x0000010d, 0x00000034, 0x000002d8, 0x01000000]), + 'Digit5': LayoutEntry([0x00000159, 0x00000035, 0x000000b0, 0x01000000]), + 'Digit6': LayoutEntry([0x0000017e, 0x00000036, 0x000002db, 0x01000000]), + 'Digit7': LayoutEntry([0x000000fd, 0x00000037, 0x00000060, 0x01000000]), + 'Digit8': LayoutEntry([0x000000e1, 0x00000038, 0x000002d9, 0x01000000]), + 'Digit9': LayoutEntry([0x000000ed, 0x00000039, 0x000000b4, 0x01000000]), + 'Digit0': LayoutEntry([0x000000e9, 0x00000030, 0x000002dd, 0x01000000]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), + 'Minus': LayoutEntry([0x0000003d, 0x00000025, 0x000000a8, 0x01000000]), + 'Equal': LayoutEntry([0x000000b4, 0x000002c7, 0x000000b8, 0x01000000]), + 'BracketLeft': LayoutEntry([0x000000fa, 0x0000002f, 0x000000f7, 0x01000000]), + 'BracketRight': LayoutEntry([0x00000029, 0x00000028, 0x000000d7, 0x01000000]), + 'Backslash': LayoutEntry([0x000000a8, 0x00000027, 0x000000a4, 0x01000000]), + 'Semicolon': LayoutEntry([0x0000016f, 0x00000022, 0x00000024, 0x01000000]), + 'Quote': LayoutEntry([0x000000a7, 0x00000021, 0x000000df, 0x01000000]), + 'Backquote': LayoutEntry([0x0000003b, 0x000000b0, 0x01000000, 0x01000000]), + 'Comma': LayoutEntry([0x0000002c, 0x0000003f, 0x0000003c, 0x01000000]), + 'Period': LayoutEntry([0x0000002e, 0x0000003a, 0x0000003e, 0x01000000]), + 'Slash': LayoutEntry([0x0000002d, 0x0000005f, 0x0000002a, 0x01000000]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), + 'IntlBackslash': LayoutEntry([0x0000005c, 0x0000007c, 0x01000000, 0x01000000]), + }, + ), + + LayoutInfo( + name: 'de-swiss', + platform: LayoutPlatform.win, + mapping: { + 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x01000000, 0x01000000]), + 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x01000000]), + 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x01000000, 0x01000000]), + 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x01000000, 0x01000000]), + 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000020ac, 0x01000000]), + 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x01000000, 0x01000000]), + 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x01000000, 0x01000000]), + 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x01000000]), + 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x01000000]), + 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x01000000]), + 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x01000000]), + 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x01000000, 0x01000000]), + 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x01000000, 0x01000000]), + 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x01000000]), + 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x01000000, 0x01000000]), + 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x01000000]), + 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x01000000, 0x01000000]), + 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x01000000, 0x01000000]), + 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x01000000, 0x01000000]), + 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x01000000, 0x01000000]), + 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x01000000]), + 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x01000000]), + 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x01000000, 0x01000000]), + 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x01000000, 0x01000000]), + 'KeyY': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x01000000]), + 'KeyZ': LayoutEntry([0x00000079, 0x00000059, 0x01000000, 0x01000000]), + 'Digit1': LayoutEntry([0x00000031, 0x0000002b, 0x000000a6, 0x01000000]), + 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x00000040, 0x01000000]), + 'Digit3': LayoutEntry([0x00000033, 0x0000002a, 0x00000023, 0x01000000]), + 'Digit4': LayoutEntry([0x00000034, 0x000000e7, 0x000000b0, 0x01000000]), + 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x000000a7, 0x01000000]), + 'Digit6': LayoutEntry([0x00000036, 0x00000026, 0x000000ac, 0x01000000]), + 'Digit7': LayoutEntry([0x00000037, 0x0000002f, 0x0000007c, 0x01000000]), + 'Digit8': LayoutEntry([0x00000038, 0x00000028, 0x000000a2, 0x01000000]), + 'Digit9': LayoutEntry([0x00000039, 0x00000029, 0x01000000, 0x01000000]), + 'Digit0': LayoutEntry([0x00000030, 0x0000003d, 0x01000000, 0x01000000]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), + 'Minus': LayoutEntry([0x00000027, 0x0000003f, 0x000000b4, 0x01000000]), + 'Equal': LayoutEntry([0x0000005e, 0x00000060, 0x0000007e, 0x01000000]), + 'BracketLeft': LayoutEntry([0x000000fc, 0x000000e8, 0x0000005b, 0x01000000]), + 'BracketRight': LayoutEntry([0x000000a8, 0x00000021, 0x0000005d, 0x01000000]), + 'Backslash': LayoutEntry([0x00000024, 0x000000a3, 0x0000007d, 0x01000000]), + 'Semicolon': LayoutEntry([0x000000f6, 0x000000e9, 0x01000000, 0x01000000]), + 'Quote': LayoutEntry([0x000000e4, 0x000000e0, 0x0000007b, 0x01000000]), + 'Backquote': LayoutEntry([0x000000a7, 0x000000b0, 0x01000000, 0x01000000]), + 'Comma': LayoutEntry([0x0000002c, 0x0000003b, 0x01000000, 0x01000000]), + 'Period': LayoutEntry([0x0000002e, 0x0000003a, 0x01000000, 0x01000000]), + 'Slash': LayoutEntry([0x0000002d, 0x0000005f, 0x01000000, 0x01000000]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), + 'IntlBackslash': LayoutEntry([0x0000003c, 0x0000003e, 0x0000005c, 0x01000000]), + }, + ), + + LayoutInfo( + name: 'de', + platform: LayoutPlatform.darwin, + mapping: { + 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x000000e5, 0x000000c5]), + 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x0000222b, 0x00002039]), + 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x000000e7, 0x000000c7]), + 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x00002202, 0x00002122]), + 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000020ac, 0x00002030]), + 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x00000192, 0x000000cf]), + 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x000000a9, 0x000000cc]), + 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x000000aa, 0x000000d3]), + 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x00002044, 0x000000db]), + 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x000000ba, 0x00000131]), + 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x00002206, 0x000002c6]), + 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x00000040, 0x0000fb02]), + 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x000000b5, 0x000002d8]), + 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x0000203a]), + 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8]), + 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x000003c0, 0x0000220f]), + 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x000000ab, 0x000000bb]), + 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x000000ae, 0x000000b8]), + 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x0000201a, 0x000000cd]), + 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x00002020, 0x000002dd]), + 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x000000c1]), + 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x0000221a, 0x000025ca]), + 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x00002211, 0x0000201e]), + 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x00002248, 0x000000d9]), + 'KeyY': LayoutEntry([0x0000007a, 0x0000005a, 0x000003a9, 0x000002c7]), + 'KeyZ': LayoutEntry([0x00000079, 0x00000059, 0x000000a5, 0x00002021]), + 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x000000a1, 0x000000ac]), + 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x0000201c, 0x0000201d]), + 'Digit3': LayoutEntry([0x00000033, 0x000000a7, 0x000000b6, 0x00000023]), + 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x000000a2, 0x000000a3]), + 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x0000005b, 0x0000fb01]), + 'Digit6': LayoutEntry([0x00000036, 0x00000026, 0x0000005d, 0x01000000]), + 'Digit7': LayoutEntry([0x00000037, 0x0000002f, 0x0000007c, 0x0000005c]), + 'Digit8': LayoutEntry([0x00000038, 0x00000028, 0x0000007b, 0x000002dc]), + 'Digit9': LayoutEntry([0x00000039, 0x00000029, 0x0000007d, 0x000000b7]), + 'Digit0': LayoutEntry([0x00000030, 0x0000003d, 0x00002260, 0x000000af]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), + 'Minus': LayoutEntry([0x000000df, 0x0000003f, 0x000000bf, 0x000002d9]), + 'Equal': LayoutEntry([0x01000000, 0x01000000, 0x00000027, 0x000002da]), + 'BracketLeft': LayoutEntry([0x000000fc, 0x000000dc, 0x00002022, 0x000000b0]), + 'BracketRight': LayoutEntry([0x0000002b, 0x0000002a, 0x000000b1, 0x0000f8ff]), + 'Backslash': LayoutEntry([0x00000023, 0x00000027, 0x00002018, 0x00002019]), + 'Semicolon': LayoutEntry([0x000000f6, 0x000000d6, 0x00000153, 0x00000152]), + 'Quote': LayoutEntry([0x000000e4, 0x000000c4, 0x000000e6, 0x000000c6]), + 'Backquote': LayoutEntry([0x0000003c, 0x0000003e, 0x00002264, 0x00002265]), + 'Comma': LayoutEntry([0x0000002c, 0x0000003b, 0x0000221e, 0x000002db]), + 'Period': LayoutEntry([0x0000002e, 0x0000003a, 0x00002026, 0x000000f7]), + 'Slash': LayoutEntry([0x0000002d, 0x0000005f, 0x00002013, 0x00002014]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), + 'Numpad1': LayoutEntry([0x00000031, 0x00000031, 0x00000031, 0x00000031]), + 'Numpad2': LayoutEntry([0x00000032, 0x00000032, 0x00000032, 0x00000032]), + 'Numpad3': LayoutEntry([0x00000033, 0x00000033, 0x00000033, 0x00000033]), + 'Numpad4': LayoutEntry([0x00000034, 0x00000034, 0x00000034, 0x00000034]), + 'Numpad5': LayoutEntry([0x00000035, 0x00000035, 0x00000035, 0x00000035]), + 'Numpad6': LayoutEntry([0x00000036, 0x00000036, 0x00000036, 0x00000036]), + 'Numpad7': LayoutEntry([0x00000037, 0x00000037, 0x00000037, 0x00000037]), + 'Numpad8': LayoutEntry([0x00000038, 0x00000038, 0x00000038, 0x00000038]), + 'Numpad9': LayoutEntry([0x00000039, 0x00000039, 0x00000039, 0x00000039]), + 'Numpad0': LayoutEntry([0x00000030, 0x00000030, 0x00000030, 0x00000030]), + 'NumpadDecimal': LayoutEntry([0x0000002c, 0x0000002c, 0x0000002e, 0x0000002e]), + 'IntlBackslash': LayoutEntry([0x01000000, 0x000000b0, 0x0000201e, 0x0000201c]), + 'NumpadEqual': LayoutEntry([0x0000003d, 0x0000003d, 0x0000003d, 0x0000003d]), + 'AudioVolumeUp': LayoutEntry([0x01000000, 0x0000003d, 0x01000000, 0x0000003d]), + }, + ), + + LayoutInfo( + name: 'de', + platform: LayoutPlatform.linux, + mapping: { + 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x000000e6, 0x000000c6]), + 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x0000201c, 0x00002018]), + 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x000000a2, 0x000000a9]), + 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x000000f0, 0x000000d0]), + 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000020ac, 0x000020ac]), + 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x00000111, 0x000000aa]), + 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x0000014b, 0x0000014a]), + 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x00000127, 0x00000126]), + 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x00002192, 0x00000131]), + 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x00000323, 0x00000307]), + 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x00000138, 0x00000026]), + 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x00000142, 0x00000141]), + 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x000000b5, 0x000000ba]), + 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x0000201d, 0x00002019]), + 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8]), + 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x000000fe, 0x000000de]), + 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x00000040, 0x000003a9]), + 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x000000b6, 0x000000ae]), + 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x0000017f, 0x00001e9e]), + 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x00000167, 0x00000166]), + 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x00002193, 0x00002191]), + 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x0000201e, 0x0000201a]), + 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x00000142, 0x00000141]), + 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x000000ab, 0x00002039]), + 'KeyY': LayoutEntry([0x0000007a, 0x0000005a, 0x00002190, 0x000000a5]), + 'KeyZ': LayoutEntry([0x00000079, 0x00000059, 0x000000bb, 0x0000203a]), + 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x000000b9, 0x000000a1]), + 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x000000b2, 0x0000215b]), + 'Digit3': LayoutEntry([0x00000033, 0x000000a7, 0x000000b3, 0x000000a3]), + 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x000000bc, 0x000000a4]), + 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x000000bd, 0x0000215c]), + 'Digit6': LayoutEntry([0x00000036, 0x00000026, 0x000000ac, 0x0000215d]), + 'Digit7': LayoutEntry([0x00000037, 0x0000002f, 0x0000007b, 0x0000215e]), + 'Digit8': LayoutEntry([0x00000038, 0x00000028, 0x0000005b, 0x00002122]), + 'Digit9': LayoutEntry([0x00000039, 0x00000029, 0x0000005d, 0x000000b1]), + 'Digit0': LayoutEntry([0x00000030, 0x0000003d, 0x0000007d, 0x000000b0]), + 'Enter': LayoutEntry([0x0000000d, 0x0000000d, 0x0000000d, 0x0000000d]), + 'Escape': LayoutEntry([0x0000001b, 0x0000001b, 0x0000001b, 0x0000001b]), + 'Backspace': LayoutEntry([0x00000008, 0x00000008, 0x00000008, 0x00000008]), + 'Tab': LayoutEntry([0x00000009, 0x01000000, 0x00000009, 0x01000000]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), + 'Minus': LayoutEntry([0x000000df, 0x0000003f, 0x0000005c, 0x000000bf]), + 'Equal': LayoutEntry([0x00000301, 0x00000300, 0x00000327, 0x00000328]), + 'BracketLeft': LayoutEntry([0x000000fc, 0x000000dc, 0x00000308, 0x0000030a]), + 'BracketRight': LayoutEntry([0x0000002b, 0x0000002a, 0x0000007e, 0x000000af]), + 'Backslash': LayoutEntry([0x00000023, 0x00000027, 0x00002019, 0x00000306]), + 'Semicolon': LayoutEntry([0x000000f6, 0x000000d6, 0x0000030b, 0x00000323]), + 'Quote': LayoutEntry([0x000000e4, 0x000000c4, 0x00000302, 0x0000030c]), + 'Backquote': LayoutEntry([0x00000302, 0x000000b0, 0x00002032, 0x00002033]), + 'Comma': LayoutEntry([0x0000002c, 0x0000003b, 0x000000b7, 0x000000d7]), + 'Period': LayoutEntry([0x0000002e, 0x0000003a, 0x00002026, 0x000000f7]), + 'Slash': LayoutEntry([0x0000002d, 0x0000005f, 0x00002013, 0x00002014]), + 'PrintScreen': LayoutEntry([0x01000000, 0x01000000, 0x01000000, 0x01000000]), + 'PageUp': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), + 'Numpad1': LayoutEntry([0x01000000, 0x00000031, 0x01000000, 0x00000031]), + 'Numpad2': LayoutEntry([0x01000000, 0x00000032, 0x01000000, 0x00000032]), + 'Numpad3': LayoutEntry([0x01000000, 0x00000033, 0x01000000, 0x00000033]), + 'Numpad4': LayoutEntry([0x01000000, 0x00000034, 0x01000000, 0x00000034]), + 'Numpad5': LayoutEntry([0x01000000, 0x00000035, 0x01000000, 0x00000035]), + 'Numpad6': LayoutEntry([0x01000000, 0x00000036, 0x01000000, 0x00000036]), + 'Numpad7': LayoutEntry([0x01000000, 0x00000037, 0x01000000, 0x00000037]), + 'Numpad8': LayoutEntry([0x01000000, 0x00000038, 0x01000000, 0x00000038]), + 'Numpad9': LayoutEntry([0x01000000, 0x00000039, 0x01000000, 0x00000039]), + 'Numpad0': LayoutEntry([0x01000000, 0x00000030, 0x01000000, 0x00000030]), + 'NumpadDecimal': LayoutEntry([0x01000000, 0x0000002c, 0x01000000, 0x0000002c]), + 'IntlBackslash': LayoutEntry([0x0000003c, 0x0000003e, 0x0000007c, 0x00000331]), + 'AltRight': LayoutEntry([0x0000000d, 0x0000000d, 0x0000000d, 0x0000000d]), + 'MetaRight': LayoutEntry([0x0000002e, 0x0000002e, 0x0000002e, 0x0000002e]), + }, + ), + + LayoutInfo( + name: 'de', + platform: LayoutPlatform.win, + mapping: { + 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x01000000, 0x01000000]), + 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x01000000]), + 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x01000000, 0x01000000]), + 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x01000000, 0x01000000]), + 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000020ac, 0x01000000]), + 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x01000000, 0x01000000]), + 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x01000000, 0x01000000]), + 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x01000000]), + 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x01000000]), + 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x01000000]), + 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x01000000]), + 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x01000000, 0x01000000]), + 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x000000b5, 0x01000000]), + 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x01000000]), + 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x01000000, 0x01000000]), + 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x01000000]), + 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x00000040, 0x01000000]), + 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x01000000, 0x01000000]), + 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x01000000, 0x01000000]), + 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x01000000, 0x01000000]), + 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x01000000]), + 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x01000000]), + 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x01000000, 0x01000000]), + 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x01000000, 0x01000000]), + 'KeyY': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x01000000]), + 'KeyZ': LayoutEntry([0x00000079, 0x00000059, 0x01000000, 0x01000000]), + 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x01000000, 0x01000000]), + 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x000000b2, 0x01000000]), + 'Digit3': LayoutEntry([0x00000033, 0x000000a7, 0x000000b3, 0x01000000]), + 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x01000000, 0x01000000]), + 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x01000000, 0x01000000]), + 'Digit6': LayoutEntry([0x00000036, 0x00000026, 0x01000000, 0x01000000]), + 'Digit7': LayoutEntry([0x00000037, 0x0000002f, 0x0000007b, 0x01000000]), + 'Digit8': LayoutEntry([0x00000038, 0x00000028, 0x0000005b, 0x01000000]), + 'Digit9': LayoutEntry([0x00000039, 0x00000029, 0x0000005d, 0x01000000]), + 'Digit0': LayoutEntry([0x00000030, 0x0000003d, 0x0000007d, 0x01000000]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), + 'Minus': LayoutEntry([0x000000df, 0x0000003f, 0x0000005c, 0x00001e9e]), + 'Equal': LayoutEntry([0x000000b4, 0x00000060, 0x01000000, 0x01000000]), + 'BracketLeft': LayoutEntry([0x000000fc, 0x000000dc, 0x01000000, 0x01000000]), + 'BracketRight': LayoutEntry([0x0000002b, 0x0000002a, 0x0000007e, 0x01000000]), + 'Backslash': LayoutEntry([0x00000023, 0x00000027, 0x01000000, 0x01000000]), + 'Semicolon': LayoutEntry([0x000000f6, 0x000000d6, 0x01000000, 0x01000000]), + 'Quote': LayoutEntry([0x000000e4, 0x000000c4, 0x01000000, 0x01000000]), + 'Backquote': LayoutEntry([0x0000005e, 0x000000b0, 0x01000000, 0x01000000]), + 'Comma': LayoutEntry([0x0000002c, 0x0000003b, 0x01000000, 0x01000000]), + 'Period': LayoutEntry([0x0000002e, 0x0000003a, 0x01000000, 0x01000000]), + 'Slash': LayoutEntry([0x0000002d, 0x0000005f, 0x01000000, 0x01000000]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), + 'IntlBackslash': LayoutEntry([0x0000003c, 0x0000003e, 0x0000007c, 0x01000000]), + }, + ), + + LayoutInfo( + name: 'dk', + platform: LayoutPlatform.win, + mapping: { + 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x01000000, 0x01000000]), + 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x01000000]), + 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x01000000, 0x01000000]), + 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x01000000, 0x01000000]), + 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000020ac, 0x01000000]), + 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x01000000, 0x01000000]), + 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x01000000, 0x01000000]), + 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x01000000]), + 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x01000000]), + 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x01000000]), + 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x01000000]), + 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x01000000, 0x01000000]), + 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x000000b5, 0x01000000]), + 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x01000000]), + 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x01000000, 0x01000000]), + 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x01000000]), + 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x01000000, 0x01000000]), + 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x01000000, 0x01000000]), + 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x01000000, 0x01000000]), + 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x01000000, 0x01000000]), + 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x01000000]), + 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x01000000]), + 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x01000000, 0x01000000]), + 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x01000000, 0x01000000]), + 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x01000000, 0x01000000]), + 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x01000000]), + 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x01000000, 0x01000000]), + 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x00000040, 0x01000000]), + 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x000000a3, 0x01000000]), + 'Digit4': LayoutEntry([0x00000034, 0x000000a4, 0x00000024, 0x01000000]), + 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x000020ac, 0x01000000]), + 'Digit6': LayoutEntry([0x00000036, 0x00000026, 0x01000000, 0x01000000]), + 'Digit7': LayoutEntry([0x00000037, 0x0000002f, 0x0000007b, 0x01000000]), + 'Digit8': LayoutEntry([0x00000038, 0x00000028, 0x0000005b, 0x01000000]), + 'Digit9': LayoutEntry([0x00000039, 0x00000029, 0x0000005d, 0x01000000]), + 'Digit0': LayoutEntry([0x00000030, 0x0000003d, 0x0000007d, 0x01000000]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), + 'Minus': LayoutEntry([0x0000002b, 0x0000003f, 0x01000000, 0x01000000]), + 'Equal': LayoutEntry([0x000000b4, 0x00000060, 0x0000007c, 0x01000000]), + 'BracketLeft': LayoutEntry([0x000000e5, 0x000000c5, 0x01000000, 0x01000000]), + 'BracketRight': LayoutEntry([0x000000a8, 0x0000005e, 0x0000007e, 0x01000000]), + 'Backslash': LayoutEntry([0x00000027, 0x0000002a, 0x01000000, 0x01000000]), + 'Semicolon': LayoutEntry([0x000000e6, 0x000000c6, 0x01000000, 0x01000000]), + 'Quote': LayoutEntry([0x000000f8, 0x000000d8, 0x01000000, 0x01000000]), + 'Backquote': LayoutEntry([0x000000bd, 0x000000a7, 0x01000000, 0x01000000]), + 'Comma': LayoutEntry([0x0000002c, 0x0000003b, 0x01000000, 0x01000000]), + 'Period': LayoutEntry([0x0000002e, 0x0000003a, 0x01000000, 0x01000000]), + 'Slash': LayoutEntry([0x0000002d, 0x0000005f, 0x01000000, 0x01000000]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), + 'IntlBackslash': LayoutEntry([0x0000003c, 0x0000003e, 0x0000005c, 0x01000000]), + }, + ), + + LayoutInfo( + name: 'dvorak', + platform: LayoutPlatform.darwin, + mapping: { + 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x000000e5, 0x000000c5]), + 'KeyB': LayoutEntry([0x00000078, 0x00000058, 0x00002248, 0x000002db]), + 'KeyC': LayoutEntry([0x0000006a, 0x0000004a, 0x00002206, 0x000000d4]), + 'KeyD': LayoutEntry([0x00000065, 0x00000045, 0x01000000, 0x000000b4]), + 'KeyE': LayoutEntry([0x0000002e, 0x0000003e, 0x00002265, 0x000002d8]), + 'KeyF': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x000000a8]), + 'KeyG': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x000002c6]), + 'KeyH': LayoutEntry([0x00000064, 0x00000044, 0x00002202, 0x000000ce]), + 'KeyI': LayoutEntry([0x00000063, 0x00000043, 0x000000e7, 0x000000c7]), + 'KeyJ': LayoutEntry([0x00000068, 0x00000048, 0x000002d9, 0x000000d3]), + 'KeyK': LayoutEntry([0x00000074, 0x00000054, 0x00002020, 0x000002c7]), + 'KeyL': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x000002dc]), + 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x000000b5, 0x000000c2]), + 'KeyN': LayoutEntry([0x00000062, 0x00000042, 0x0000222b, 0x00000131]), + 'KeyO': LayoutEntry([0x00000072, 0x00000052, 0x000000ae, 0x00002030]), + 'KeyP': LayoutEntry([0x0000006c, 0x0000004c, 0x000000ac, 0x000000d2]), + 'KeyQ': LayoutEntry([0x00000027, 0x00000022, 0x000000e6, 0x000000c6]), + 'KeyR': LayoutEntry([0x00000070, 0x00000050, 0x000003c0, 0x0000220f]), + 'KeyS': LayoutEntry([0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8]), + 'KeyT': LayoutEntry([0x00000079, 0x00000059, 0x000000a5, 0x000000c1]), + 'KeyU': LayoutEntry([0x00000067, 0x00000047, 0x000000a9, 0x000002dd]), + 'KeyV': LayoutEntry([0x0000006b, 0x0000004b, 0x000002da, 0x0000f8ff]), + 'KeyW': LayoutEntry([0x0000002c, 0x0000003c, 0x00002264, 0x000000af]), + 'KeyX': LayoutEntry([0x00000071, 0x00000051, 0x00000153, 0x00000152]), + 'KeyY': LayoutEntry([0x00000066, 0x00000046, 0x00000192, 0x000000cf]), + 'KeyZ': LayoutEntry([0x0000003b, 0x0000003a, 0x00002026, 0x000000da]), + 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x000000a1, 0x00002044]), + 'Digit2': LayoutEntry([0x00000032, 0x00000040, 0x00002122, 0x000020ac]), + 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x000000a3, 0x00002039]), + 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x000000a2, 0x0000203a]), + 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x0000221e, 0x0000fb01]), + 'Digit6': LayoutEntry([0x00000036, 0x0000005e, 0x000000a7, 0x0000fb02]), + 'Digit7': LayoutEntry([0x00000037, 0x00000026, 0x000000b6, 0x00002021]), + 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x00002022, 0x000000b0]), + 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x000000aa, 0x000000b7]), + 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x000000ba, 0x0000201a]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), + 'Minus': LayoutEntry([0x0000005b, 0x0000007b, 0x0000201c, 0x0000201d]), + 'Equal': LayoutEntry([0x0000005d, 0x0000007d, 0x00002018, 0x00002019]), + 'BracketLeft': LayoutEntry([0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf]), + 'BracketRight': LayoutEntry([0x0000003d, 0x0000002b, 0x00002260, 0x000000b1]), + 'Backslash': LayoutEntry([0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb]), + 'Semicolon': LayoutEntry([0x00000073, 0x00000053, 0x000000df, 0x000000cd]), + 'Quote': LayoutEntry([0x0000002d, 0x0000005f, 0x00002013, 0x00002014]), + 'Backquote': LayoutEntry([0x00000060, 0x0000007e, 0x01000000, 0x00000060]), + 'Comma': LayoutEntry([0x00000077, 0x00000057, 0x00002211, 0x0000201e]), + 'Period': LayoutEntry([0x00000076, 0x00000056, 0x0000221a, 0x000025ca]), + 'Slash': LayoutEntry([0x0000007a, 0x0000005a, 0x000003a9, 0x000000b8]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), + 'Numpad1': LayoutEntry([0x00000031, 0x00000031, 0x00000031, 0x00000031]), + 'Numpad2': LayoutEntry([0x00000032, 0x00000032, 0x00000032, 0x00000032]), + 'Numpad3': LayoutEntry([0x00000033, 0x00000033, 0x00000033, 0x00000033]), + 'Numpad4': LayoutEntry([0x00000034, 0x00000034, 0x00000034, 0x00000034]), + 'Numpad5': LayoutEntry([0x00000035, 0x00000035, 0x00000035, 0x00000035]), + 'Numpad6': LayoutEntry([0x00000036, 0x00000036, 0x00000036, 0x00000036]), + 'Numpad7': LayoutEntry([0x00000037, 0x00000037, 0x00000037, 0x00000037]), + 'Numpad8': LayoutEntry([0x00000038, 0x00000038, 0x00000038, 0x00000038]), + 'Numpad9': LayoutEntry([0x00000039, 0x00000039, 0x00000039, 0x00000039]), + 'Numpad0': LayoutEntry([0x00000030, 0x00000030, 0x00000030, 0x00000030]), + 'NumpadDecimal': LayoutEntry([0x0000002e, 0x0000002e, 0x0000002e, 0x0000002e]), + 'IntlBackslash': LayoutEntry([0x000000a7, 0x000000b1, 0x000000a7, 0x000000b1]), + 'NumpadEqual': LayoutEntry([0x0000003d, 0x0000003d, 0x0000003d, 0x0000003d]), + 'AudioVolumeUp': LayoutEntry([0x01000000, 0x0000003d, 0x01000000, 0x0000003d]), + }, + ), + + LayoutInfo( + name: 'en-belgian', + platform: LayoutPlatform.win, + mapping: { + 'KeyA': LayoutEntry([0x00000071, 0x00000051, 0x01000000, 0x01000000]), + 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x01000000]), + 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x01000000, 0x01000000]), + 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x01000000, 0x01000000]), + 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000020ac, 0x01000000]), + 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x01000000, 0x01000000]), + 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x01000000, 0x01000000]), + 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x01000000]), + 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x01000000]), + 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x01000000]), + 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x01000000]), + 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x01000000, 0x01000000]), + 'KeyM': LayoutEntry([0x0000002c, 0x0000003f, 0x01000000, 0x01000000]), + 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x01000000]), + 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x01000000, 0x01000000]), + 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x01000000]), + 'KeyQ': LayoutEntry([0x00000061, 0x00000041, 0x01000000, 0x01000000]), + 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x01000000, 0x01000000]), + 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x01000000, 0x01000000]), + 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x01000000, 0x01000000]), + 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x01000000]), + 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x01000000]), + 'KeyW': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x01000000]), + 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x01000000, 0x01000000]), + 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x01000000, 0x01000000]), + 'KeyZ': LayoutEntry([0x00000077, 0x00000057, 0x01000000, 0x01000000]), + 'Digit1': LayoutEntry([0x00000026, 0x00000031, 0x0000007c, 0x01000000]), + 'Digit2': LayoutEntry([0x000000e9, 0x00000032, 0x00000040, 0x01000000]), + 'Digit3': LayoutEntry([0x00000022, 0x00000033, 0x00000023, 0x01000000]), + 'Digit4': LayoutEntry([0x00000027, 0x00000034, 0x0000007b, 0x01000000]), + 'Digit5': LayoutEntry([0x00000028, 0x00000035, 0x0000005b, 0x01000000]), + 'Digit6': LayoutEntry([0x000000a7, 0x00000036, 0x0000005e, 0x01000000]), + 'Digit7': LayoutEntry([0x000000e8, 0x00000037, 0x01000000, 0x01000000]), + 'Digit8': LayoutEntry([0x00000021, 0x00000038, 0x01000000, 0x01000000]), + 'Digit9': LayoutEntry([0x000000e7, 0x00000039, 0x0000007b, 0x01000000]), + 'Digit0': LayoutEntry([0x000000e0, 0x00000030, 0x0000007d, 0x01000000]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), + 'Minus': LayoutEntry([0x00000029, 0x000000b0, 0x01000000, 0x01000000]), + 'Equal': LayoutEntry([0x0000002d, 0x0000005f, 0x01000000, 0x01000000]), + 'BracketLeft': LayoutEntry([0x0000005e, 0x000000a8, 0x0000005b, 0x01000000]), + 'BracketRight': LayoutEntry([0x00000024, 0x0000002a, 0x0000005d, 0x01000000]), + 'Backslash': LayoutEntry([0x000000b5, 0x000000a3, 0x00000060, 0x00000060]), + 'Semicolon': LayoutEntry([0x0000006d, 0x0000004d, 0x01000000, 0x01000000]), + 'Quote': LayoutEntry([0x000000f9, 0x00000025, 0x000000b4, 0x000000b4]), + 'Backquote': LayoutEntry([0x000000b2, 0x000000b3, 0x01000000, 0x01000000]), + 'Comma': LayoutEntry([0x0000003b, 0x0000002e, 0x01000000, 0x01000000]), + 'Period': LayoutEntry([0x0000003a, 0x0000002f, 0x01000000, 0x01000000]), + 'Slash': LayoutEntry([0x0000003d, 0x0000002b, 0x0000007e, 0x0000007e]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), + 'IntlBackslash': LayoutEntry([0x0000003c, 0x0000003e, 0x0000005c, 0x01000000]), + }, + ), + + LayoutInfo( + name: 'en-ext', + platform: LayoutPlatform.darwin, + mapping: { + 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x01000000, 0x00000304]), + 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x00000306]), + 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x01000000, 0x00000327]), + 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x000000f0, 0x000000d0]), + 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x01000000, 0x00000301]), + 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x00000192, 0x01000000]), + 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x000000a9, 0x01000000]), + 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x00000331]), + 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x0000031b]), + 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x0000030b]), + 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x0000030a]), + 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x01000000, 0x00000335]), + 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x01000000, 0x00000328]), + 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x00000303]), + 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8]), + 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x00000326]), + 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x00000153, 0x00000152]), + 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x000000ae, 0x00002030]), + 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x000000df, 0x01000000]), + 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x000000fe, 0x000000de]), + 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x00000308]), + 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x0000030c]), + 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x01000000, 0x00000307]), + 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x01000000, 0x00000323]), + 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x000000a5, 0x01000000]), + 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x00000309]), + 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x000000a1, 0x00002044]), + 'Digit2': LayoutEntry([0x00000032, 0x00000040, 0x00002122, 0x000020ac]), + 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x000000a3, 0x00002039]), + 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x000000a2, 0x0000203a]), + 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x000000a7, 0x00002020]), + 'Digit6': LayoutEntry([0x00000036, 0x0000005e, 0x01000000, 0x00000302]), + 'Digit7': LayoutEntry([0x00000037, 0x00000026, 0x000000b6, 0x00002021]), + 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x00002022, 0x000000b0]), + 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x000000aa, 0x000000b7]), + 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x000000ba, 0x0000201a]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), + 'Minus': LayoutEntry([0x0000002d, 0x0000005f, 0x00002013, 0x00002014]), + 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x00002260, 0x000000b1]), + 'BracketLeft': LayoutEntry([0x0000005b, 0x0000007b, 0x0000201c, 0x0000201d]), + 'BracketRight': LayoutEntry([0x0000005d, 0x0000007d, 0x00002018, 0x00002019]), + 'Backslash': LayoutEntry([0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb]), + 'Semicolon': LayoutEntry([0x0000003b, 0x0000003a, 0x00002026, 0x01000000]), + 'Quote': LayoutEntry([0x00000027, 0x00000022, 0x000000e6, 0x000000c6]), + 'Backquote': LayoutEntry([0x00000060, 0x0000007e, 0x01000000, 0x00000300]), + 'Comma': LayoutEntry([0x0000002c, 0x0000003c, 0x00002264, 0x0000201e]), + 'Period': LayoutEntry([0x0000002e, 0x0000003e, 0x00002265, 0x01000000]), + 'Slash': LayoutEntry([0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), + 'Numpad1': LayoutEntry([0x00000031, 0x00000031, 0x00000031, 0x00000031]), + 'Numpad2': LayoutEntry([0x00000032, 0x00000032, 0x00000032, 0x00000032]), + 'Numpad3': LayoutEntry([0x00000033, 0x00000033, 0x00000033, 0x00000033]), + 'Numpad4': LayoutEntry([0x00000034, 0x00000034, 0x00000034, 0x00000034]), + 'Numpad5': LayoutEntry([0x00000035, 0x00000035, 0x00000035, 0x00000035]), + 'Numpad6': LayoutEntry([0x00000036, 0x00000036, 0x00000036, 0x00000036]), + 'Numpad7': LayoutEntry([0x00000037, 0x00000037, 0x00000037, 0x00000037]), + 'Numpad8': LayoutEntry([0x00000038, 0x00000038, 0x00000038, 0x00000038]), + 'Numpad9': LayoutEntry([0x00000039, 0x00000039, 0x00000039, 0x00000039]), + 'Numpad0': LayoutEntry([0x00000030, 0x00000030, 0x00000030, 0x00000030]), + 'NumpadDecimal': LayoutEntry([0x0000002e, 0x0000002e, 0x0000002e, 0x0000002e]), + 'IntlBackslash': LayoutEntry([0x000000a7, 0x000000b1, 0x000000a7, 0x000000b1]), + 'NumpadEqual': LayoutEntry([0x0000003d, 0x0000003d, 0x0000003d, 0x0000003d]), + 'AudioVolumeUp': LayoutEntry([0x01000000, 0x0000003d, 0x01000000, 0x0000003d]), + }, + ), + + LayoutInfo( + name: 'en-in', + platform: LayoutPlatform.win, + mapping: { + 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x00000101, 0x00000100]), + 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x01000000]), + 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x01000000, 0x01000000]), + 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x00001e0d, 0x00001e0c]), + 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x00000113, 0x00000112]), + 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x01000000, 0x01000000]), + 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x00001e45, 0x00001e44]), + 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x00001e25, 0x00001e24]), + 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x0000012b, 0x0000012a]), + 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x01000000]), + 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x01000000]), + 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x0000006c, 0x0000004c]), + 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x00001e41, 0x00001e40]), + 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x00001e47, 0x00001e46]), + 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x0000014d, 0x0000014c]), + 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x01000000]), + 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x000000e6, 0x000000c6]), + 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x00000072, 0x00000052]), + 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x0000015b, 0x0000015a]), + 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x00001e6d, 0x00001e6c]), + 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x0000016b, 0x0000016a]), + 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x01000000]), + 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x01000000, 0x01000000]), + 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x00001e63, 0x00001e62]), + 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x000000f1, 0x000000d1]), + 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x01000000]), + 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x01000000, 0x01000000]), + 'Digit2': LayoutEntry([0x00000032, 0x00000040, 0x01000000, 0x01000000]), + 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x01000000, 0x01000000]), + 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x000020b9, 0x01000000]), + 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x01000000, 0x01000000]), + 'Digit6': LayoutEntry([0x00000036, 0x0000005e, 0x01000000, 0x000002c6]), + 'Digit7': LayoutEntry([0x00000037, 0x00000026, 0x01000000, 0x01000000]), + 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x01000000, 0x01000000]), + 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x01000000, 0x000002d8]), + 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x01000000, 0x01000000]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), + 'Minus': LayoutEntry([0x0000002d, 0x0000005f, 0x0000002d, 0x000002cd]), + 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x01000000, 0x01000000]), + 'BracketLeft': LayoutEntry([0x0000005b, 0x0000007b, 0x01000000, 0x01000000]), + 'BracketRight': LayoutEntry([0x0000005d, 0x0000007d, 0x01000000, 0x01000000]), + 'Backslash': LayoutEntry([0x0000005c, 0x0000007c, 0x01000000, 0x01000000]), + 'Semicolon': LayoutEntry([0x0000003b, 0x0000003a, 0x01000000, 0x01000000]), + 'Quote': LayoutEntry([0x00000027, 0x00000022, 0x01000000, 0x01000000]), + 'Backquote': LayoutEntry([0x00000060, 0x0000007e, 0x01000000, 0x0000007e]), + 'Comma': LayoutEntry([0x0000002c, 0x0000003c, 0x0000002c, 0x0000003c]), + 'Period': LayoutEntry([0x0000002e, 0x0000003e, 0x0000002e, 0x01000000]), + 'Slash': LayoutEntry([0x0000002f, 0x0000003f, 0x01000000, 0x01000000]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), + 'IntlBackslash': LayoutEntry([0x0000005c, 0x0000007c, 0x01000000, 0x01000000]), + }, + ), + + LayoutInfo( + name: 'en-intl', + platform: LayoutPlatform.darwin, + mapping: { + 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x000000e5, 0x000000c5]), + 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x0000222b, 0x00000131]), + 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x000000e7, 0x000000c7]), + 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x00002202, 0x000000ce]), + 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x01000000, 0x000000b4]), + 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x00000192, 0x000000cf]), + 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x000000a9, 0x000002dd]), + 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x000002d9, 0x000000d3]), + 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x000002c6]), + 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x00002206, 0x000000d4]), + 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x000002da, 0x0000f8ff]), + 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x000000ac, 0x000000d2]), + 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x000000b5, 0x000000c2]), + 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x000002dc]), + 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8]), + 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x000003c0, 0x0000220f]), + 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x00000153, 0x00000152]), + 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x000000ae, 0x00002030]), + 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x000000df, 0x000000cd]), + 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x00002020, 0x000002c7]), + 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x000000a8]), + 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x0000221a, 0x000025ca]), + 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x00002211, 0x0000201e]), + 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x00002248, 0x000002db]), + 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x000000a5, 0x000000c1]), + 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x000003a9, 0x000000b8]), + 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x000000a1, 0x00002044]), + 'Digit2': LayoutEntry([0x00000032, 0x00000040, 0x00002122, 0x000020ac]), + 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x000000a3, 0x00002039]), + 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x000000a2, 0x0000203a]), + 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x0000221e, 0x0000fb01]), + 'Digit6': LayoutEntry([0x00000036, 0x01000000, 0x000000a7, 0x0000fb02]), + 'Digit7': LayoutEntry([0x00000037, 0x00000026, 0x000000b6, 0x00002021]), + 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x00002022, 0x000000b0]), + 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x000000aa, 0x000000b7]), + 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x000000ba, 0x0000201a]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), + 'Minus': LayoutEntry([0x0000002d, 0x0000005f, 0x00002013, 0x00002014]), + 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x00002260, 0x000000b1]), + 'BracketLeft': LayoutEntry([0x0000005b, 0x0000007b, 0x0000201c, 0x0000201d]), + 'BracketRight': LayoutEntry([0x0000005d, 0x0000007d, 0x00002018, 0x00002019]), + 'Backslash': LayoutEntry([0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb]), + 'Semicolon': LayoutEntry([0x0000003b, 0x0000003a, 0x00002026, 0x000000da]), + 'Quote': LayoutEntry([0x01000000, 0x01000000, 0x000000e6, 0x000000c6]), + 'Backquote': LayoutEntry([0x01000000, 0x01000000, 0x01000000, 0x00000060]), + 'Comma': LayoutEntry([0x0000002c, 0x0000003c, 0x00002264, 0x000000af]), + 'Period': LayoutEntry([0x0000002e, 0x0000003e, 0x00002265, 0x000002d8]), + 'Slash': LayoutEntry([0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), + 'Numpad1': LayoutEntry([0x00000031, 0x00000031, 0x00000031, 0x00000031]), + 'Numpad2': LayoutEntry([0x00000032, 0x00000032, 0x00000032, 0x00000032]), + 'Numpad3': LayoutEntry([0x00000033, 0x00000033, 0x00000033, 0x00000033]), + 'Numpad4': LayoutEntry([0x00000034, 0x00000034, 0x00000034, 0x00000034]), + 'Numpad5': LayoutEntry([0x00000035, 0x00000035, 0x00000035, 0x00000035]), + 'Numpad6': LayoutEntry([0x00000036, 0x00000036, 0x00000036, 0x00000036]), + 'Numpad7': LayoutEntry([0x00000037, 0x00000037, 0x00000037, 0x00000037]), + 'Numpad8': LayoutEntry([0x00000038, 0x00000038, 0x00000038, 0x00000038]), + 'Numpad9': LayoutEntry([0x00000039, 0x00000039, 0x00000039, 0x00000039]), + 'Numpad0': LayoutEntry([0x00000030, 0x00000030, 0x00000030, 0x00000030]), + 'NumpadDecimal': LayoutEntry([0x0000002e, 0x0000002e, 0x0000002e, 0x0000002e]), + 'IntlBackslash': LayoutEntry([0x000000a7, 0x000000b1, 0x000000a7, 0x000000b1]), + 'NumpadEqual': LayoutEntry([0x0000003d, 0x0000003d, 0x0000003d, 0x0000003d]), + 'AudioVolumeUp': LayoutEntry([0x01000000, 0x0000003d, 0x01000000, 0x0000003d]), + }, + ), + + LayoutInfo( + name: 'en-intl', + platform: LayoutPlatform.win, + mapping: { + 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x000000e1, 0x000000c1]), + 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x01000000]), + 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x000000a9, 0x000000a2]), + 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x000000f0, 0x000000d0]), + 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000000e9, 0x000000c9]), + 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x01000000, 0x01000000]), + 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x01000000, 0x01000000]), + 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x01000000]), + 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x000000ed, 0x000000cd]), + 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x01000000]), + 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x01000000]), + 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x000000f8, 0x000000d8]), + 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x000000b5, 0x01000000]), + 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x000000f1, 0x000000d1]), + 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x000000f3, 0x000000d3]), + 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x000000f6, 0x000000d6]), + 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x000000e4, 0x000000c4]), + 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x000000ae, 0x01000000]), + 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x000000df, 0x000000a7]), + 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x000000fe, 0x000000de]), + 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x000000fa, 0x000000da]), + 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x01000000]), + 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x000000e5, 0x000000c5]), + 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x01000000, 0x01000000]), + 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x000000fc, 0x000000dc]), + 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x000000e6, 0x000000c6]), + 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x000000a1, 0x000000b9]), + 'Digit2': LayoutEntry([0x00000032, 0x00000040, 0x000000b2, 0x01000000]), + 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x000000b3, 0x01000000]), + 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x000000a4, 0x000000a3]), + 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x000020ac, 0x01000000]), + 'Digit6': LayoutEntry([0x00000036, 0x0000005e, 0x000000bc, 0x01000000]), + 'Digit7': LayoutEntry([0x00000037, 0x00000026, 0x000000bd, 0x01000000]), + 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x000000be, 0x01000000]), + 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x00002018, 0x01000000]), + 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x00002019, 0x01000000]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), + 'Minus': LayoutEntry([0x0000002d, 0x0000005f, 0x000000a5, 0x01000000]), + 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x000000d7, 0x000000f7]), + 'BracketLeft': LayoutEntry([0x0000005b, 0x0000007b, 0x000000ab, 0x01000000]), + 'BracketRight': LayoutEntry([0x0000005d, 0x0000007d, 0x000000bb, 0x01000000]), + 'Backslash': LayoutEntry([0x0000005c, 0x0000007c, 0x000000ac, 0x000000a6]), + 'Semicolon': LayoutEntry([0x0000003b, 0x0000003a, 0x000000b6, 0x000000b0]), + 'Quote': LayoutEntry([0x00000027, 0x00000022, 0x000000b4, 0x000000a8]), + 'Backquote': LayoutEntry([0x00000060, 0x0000007e, 0x01000000, 0x01000000]), + 'Comma': LayoutEntry([0x0000002c, 0x0000003c, 0x000000e7, 0x000000c7]), + 'Period': LayoutEntry([0x0000002e, 0x0000003e, 0x01000000, 0x01000000]), + 'Slash': LayoutEntry([0x0000002f, 0x0000003f, 0x000000bf, 0x01000000]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), + 'IntlBackslash': LayoutEntry([0x0000005c, 0x0000007c, 0x01000000, 0x01000000]), + }, + ), + + LayoutInfo( + name: 'en-uk', + platform: LayoutPlatform.darwin, + mapping: { + 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x000000e5, 0x000000c5]), + 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x0000222b, 0x00000131]), + 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x000000e7, 0x000000c7]), + 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x00002202, 0x000000ce]), + 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x01000000, 0x00002030]), + 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x00000192, 0x000000cf]), + 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x000000a9, 0x000000cc]), + 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x000002d9, 0x000000d3]), + 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x000000c8]), + 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x00002206, 0x000000d4]), + 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x000002da, 0x0000f8ff]), + 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x000000ac, 0x000000d2]), + 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x000000b5, 0x000002dc]), + 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x000002c6]), + 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8]), + 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x000003c0, 0x0000220f]), + 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x00000153, 0x00000152]), + 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x000000ae, 0x000000c2]), + 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x000000df, 0x000000cd]), + 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x00002020, 0x000000ca]), + 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x000000cb]), + 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x0000221a, 0x000025ca]), + 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x00002211, 0x0000201e]), + 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x00002248, 0x000000d9]), + 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x000000a5, 0x000000c1]), + 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x000003a9, 0x000000db]), + 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x000000a1, 0x00002044]), + 'Digit2': LayoutEntry([0x00000032, 0x00000040, 0x000020ac, 0x00002122]), + 'Digit3': LayoutEntry([0x00000033, 0x000000a3, 0x00000023, 0x00002039]), + 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x000000a2, 0x0000203a]), + 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x0000221e, 0x0000fb01]), + 'Digit6': LayoutEntry([0x00000036, 0x0000005e, 0x000000a7, 0x0000fb02]), + 'Digit7': LayoutEntry([0x00000037, 0x00000026, 0x000000b6, 0x00002021]), + 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x00002022, 0x000000b0]), + 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x000000aa, 0x000000b7]), + 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x000000ba, 0x0000201a]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), + 'Minus': LayoutEntry([0x0000002d, 0x0000005f, 0x00002013, 0x00002014]), + 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x00002260, 0x000000b1]), + 'BracketLeft': LayoutEntry([0x0000005b, 0x0000007b, 0x0000201c, 0x0000201d]), + 'BracketRight': LayoutEntry([0x0000005d, 0x0000007d, 0x00002018, 0x00002019]), + 'Backslash': LayoutEntry([0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb]), + 'Semicolon': LayoutEntry([0x0000003b, 0x0000003a, 0x00002026, 0x000000da]), + 'Quote': LayoutEntry([0x00000027, 0x00000022, 0x000000e6, 0x000000c6]), + 'Backquote': LayoutEntry([0x00000060, 0x0000007e, 0x01000000, 0x00000178]), + 'Comma': LayoutEntry([0x0000002c, 0x0000003c, 0x00002264, 0x000000af]), + 'Period': LayoutEntry([0x0000002e, 0x0000003e, 0x00002265, 0x000002d8]), + 'Slash': LayoutEntry([0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), + 'Numpad1': LayoutEntry([0x00000031, 0x00000031, 0x00000031, 0x00000031]), + 'Numpad2': LayoutEntry([0x00000032, 0x00000032, 0x00000032, 0x00000032]), + 'Numpad3': LayoutEntry([0x00000033, 0x00000033, 0x00000033, 0x00000033]), + 'Numpad4': LayoutEntry([0x00000034, 0x00000034, 0x00000034, 0x00000034]), + 'Numpad5': LayoutEntry([0x00000035, 0x00000035, 0x00000035, 0x00000035]), + 'Numpad6': LayoutEntry([0x00000036, 0x00000036, 0x00000036, 0x00000036]), + 'Numpad7': LayoutEntry([0x00000037, 0x00000037, 0x00000037, 0x00000037]), + 'Numpad8': LayoutEntry([0x00000038, 0x00000038, 0x00000038, 0x00000038]), + 'Numpad9': LayoutEntry([0x00000039, 0x00000039, 0x00000039, 0x00000039]), + 'Numpad0': LayoutEntry([0x00000030, 0x00000030, 0x00000030, 0x00000030]), + 'NumpadDecimal': LayoutEntry([0x0000002e, 0x0000002e, 0x0000002e, 0x0000002e]), + 'IntlBackslash': LayoutEntry([0x000000a7, 0x000000b1, 0x01000000, 0x01000000]), + 'NumpadEqual': LayoutEntry([0x0000003d, 0x0000003d, 0x0000003d, 0x0000003d]), + 'AudioVolumeUp': LayoutEntry([0x01000000, 0x0000003d, 0x01000000, 0x0000003d]), + }, + ), + + LayoutInfo( + name: 'en-uk', + platform: LayoutPlatform.win, + mapping: { + 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x000000e1, 0x000000c1]), + 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x01000000]), + 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x01000000, 0x01000000]), + 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x01000000, 0x01000000]), + 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000000e9, 0x000000c9]), + 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x01000000, 0x01000000]), + 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x01000000, 0x01000000]), + 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x01000000]), + 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x000000ed, 0x000000cd]), + 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x01000000]), + 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x01000000]), + 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x01000000, 0x01000000]), + 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x01000000, 0x01000000]), + 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x01000000]), + 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x000000f3, 0x000000d3]), + 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x01000000]), + 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x01000000, 0x01000000]), + 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x01000000, 0x01000000]), + 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x01000000, 0x01000000]), + 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x01000000, 0x01000000]), + 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x000000fa, 0x000000da]), + 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x01000000]), + 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x01000000, 0x01000000]), + 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x01000000, 0x01000000]), + 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x01000000, 0x01000000]), + 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x01000000]), + 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x01000000, 0x01000000]), + 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x01000000, 0x01000000]), + 'Digit3': LayoutEntry([0x00000033, 0x000000a3, 0x01000000, 0x01000000]), + 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x000020ac, 0x01000000]), + 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x01000000, 0x01000000]), + 'Digit6': LayoutEntry([0x00000036, 0x0000005e, 0x01000000, 0x01000000]), + 'Digit7': LayoutEntry([0x00000037, 0x00000026, 0x01000000, 0x01000000]), + 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x01000000, 0x01000000]), + 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x01000000, 0x01000000]), + 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x01000000, 0x01000000]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), + 'Minus': LayoutEntry([0x0000002d, 0x0000005f, 0x01000000, 0x01000000]), + 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x01000000, 0x01000000]), + 'BracketLeft': LayoutEntry([0x0000005b, 0x0000007b, 0x01000000, 0x01000000]), + 'BracketRight': LayoutEntry([0x0000005d, 0x0000007d, 0x01000000, 0x01000000]), + 'Backslash': LayoutEntry([0x00000023, 0x0000007e, 0x0000005c, 0x0000007c]), + 'Semicolon': LayoutEntry([0x0000003b, 0x0000003a, 0x01000000, 0x01000000]), + 'Quote': LayoutEntry([0x00000027, 0x00000040, 0x01000000, 0x01000000]), + 'Backquote': LayoutEntry([0x00000060, 0x000000ac, 0x000000a6, 0x01000000]), + 'Comma': LayoutEntry([0x0000002c, 0x0000003c, 0x01000000, 0x01000000]), + 'Period': LayoutEntry([0x0000002e, 0x0000003e, 0x01000000, 0x01000000]), + 'Slash': LayoutEntry([0x0000002f, 0x0000003f, 0x01000000, 0x01000000]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), + 'IntlBackslash': LayoutEntry([0x0000005c, 0x0000007c, 0x01000000, 0x01000000]), + }, + ), + + LayoutInfo( + name: 'en', + platform: LayoutPlatform.darwin, + mapping: { + 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x000000e5, 0x000000c5]), + 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x0000222b, 0x00000131]), + 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x000000e7, 0x000000c7]), + 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x00002202, 0x000000ce]), + 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x01000000, 0x000000b4]), + 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x00000192, 0x000000cf]), + 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x000000a9, 0x000002dd]), + 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x000002d9, 0x000000d3]), + 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x000002c6]), + 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x00002206, 0x000000d4]), + 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x000002da, 0x0000f8ff]), + 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x000000ac, 0x000000d2]), + 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x000000b5, 0x000000c2]), + 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x000002dc]), + 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8]), + 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x000003c0, 0x0000220f]), + 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x00000153, 0x00000152]), + 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x000000ae, 0x00002030]), + 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x000000df, 0x000000cd]), + 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x00002020, 0x000002c7]), + 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x000000a8]), + 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x0000221a, 0x000025ca]), + 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x00002211, 0x0000201e]), + 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x00002248, 0x000002db]), + 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x000000a5, 0x000000c1]), + 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x000003a9, 0x000000b8]), + 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x000000a1, 0x00002044]), + 'Digit2': LayoutEntry([0x00000032, 0x00000040, 0x00002122, 0x000020ac]), + 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x000000a3, 0x00002039]), + 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x000000a2, 0x0000203a]), + 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x0000221e, 0x0000fb01]), + 'Digit6': LayoutEntry([0x00000036, 0x0000005e, 0x000000a7, 0x0000fb02]), + 'Digit7': LayoutEntry([0x00000037, 0x00000026, 0x000000b6, 0x00002021]), + 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x00002022, 0x000000b0]), + 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x000000aa, 0x000000b7]), + 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x000000ba, 0x0000201a]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), + 'Minus': LayoutEntry([0x0000002d, 0x0000005f, 0x00002013, 0x00002014]), + 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x00002260, 0x000000b1]), + 'BracketLeft': LayoutEntry([0x0000005b, 0x0000007b, 0x0000201c, 0x0000201d]), + 'BracketRight': LayoutEntry([0x0000005d, 0x0000007d, 0x00002018, 0x00002019]), + 'Backslash': LayoutEntry([0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb]), + 'Semicolon': LayoutEntry([0x0000003b, 0x0000003a, 0x00002026, 0x000000da]), + 'Quote': LayoutEntry([0x00000027, 0x00000022, 0x000000e6, 0x000000c6]), + 'Backquote': LayoutEntry([0x00000060, 0x0000007e, 0x01000000, 0x00000060]), + 'Comma': LayoutEntry([0x0000002c, 0x0000003c, 0x00002264, 0x000000af]), + 'Period': LayoutEntry([0x0000002e, 0x0000003e, 0x00002265, 0x000002d8]), + 'Slash': LayoutEntry([0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), + 'Numpad1': LayoutEntry([0x00000031, 0x00000031, 0x00000031, 0x00000031]), + 'Numpad2': LayoutEntry([0x00000032, 0x00000032, 0x00000032, 0x00000032]), + 'Numpad3': LayoutEntry([0x00000033, 0x00000033, 0x00000033, 0x00000033]), + 'Numpad4': LayoutEntry([0x00000034, 0x00000034, 0x00000034, 0x00000034]), + 'Numpad5': LayoutEntry([0x00000035, 0x00000035, 0x00000035, 0x00000035]), + 'Numpad6': LayoutEntry([0x00000036, 0x00000036, 0x00000036, 0x00000036]), + 'Numpad7': LayoutEntry([0x00000037, 0x00000037, 0x00000037, 0x00000037]), + 'Numpad8': LayoutEntry([0x00000038, 0x00000038, 0x00000038, 0x00000038]), + 'Numpad9': LayoutEntry([0x00000039, 0x00000039, 0x00000039, 0x00000039]), + 'Numpad0': LayoutEntry([0x00000030, 0x00000030, 0x00000030, 0x00000030]), + 'NumpadDecimal': LayoutEntry([0x0000002e, 0x0000002e, 0x0000002e, 0x0000002e]), + 'IntlBackslash': LayoutEntry([0x000000a7, 0x000000b1, 0x000000a7, 0x000000b1]), + 'NumpadEqual': LayoutEntry([0x0000003d, 0x0000003d, 0x0000003d, 0x0000003d]), + 'AudioVolumeUp': LayoutEntry([0x01000000, 0x0000003d, 0x01000000, 0x0000003d]), + }, + ), + + LayoutInfo( + name: 'en', + platform: LayoutPlatform.linux, + mapping: { + 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x00000061, 0x00000041]), + 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x00000062, 0x00000042]), + 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x00000063, 0x00000043]), + 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x00000064, 0x00000044]), + 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x00000065, 0x00000045]), + 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x00000066, 0x00000046]), + 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x00000067, 0x00000047]), + 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x00000068, 0x00000048]), + 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x00000069, 0x00000049]), + 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x0000006a, 0x0000004a]), + 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x0000006b, 0x0000004b]), + 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x0000006c, 0x0000004c]), + 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x0000006d, 0x0000004d]), + 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x0000006e, 0x0000004e]), + 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x0000006f, 0x0000004f]), + 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x00000070, 0x00000050]), + 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x00000071, 0x00000051]), + 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x00000072, 0x00000052]), + 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x00000073, 0x00000053]), + 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x00000074, 0x00000054]), + 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x00000075, 0x00000055]), + 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x00000076, 0x00000056]), + 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x00000077, 0x00000057]), + 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x00000078, 0x00000058]), + 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x00000079, 0x00000059]), + 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x0000007a, 0x0000005a]), + 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x00000031, 0x00000021]), + 'Digit2': LayoutEntry([0x00000032, 0x00000040, 0x00000032, 0x00000040]), + 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x00000033, 0x00000023]), + 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x00000034, 0x00000024]), + 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x00000035, 0x00000025]), + 'Digit6': LayoutEntry([0x00000036, 0x0000005e, 0x00000036, 0x0000005e]), + 'Digit7': LayoutEntry([0x00000037, 0x00000026, 0x00000037, 0x00000026]), + 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x00000038, 0x0000002a]), + 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x00000039, 0x00000028]), + 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x00000030, 0x00000029]), + 'Enter': LayoutEntry([0x0000000d, 0x0000000d, 0x0000000d, 0x0000000d]), + 'Escape': LayoutEntry([0x0000001b, 0x0000001b, 0x0000001b, 0x0000001b]), + 'Backspace': LayoutEntry([0x00000008, 0x00000008, 0x00000008, 0x00000008]), + 'Tab': LayoutEntry([0x00000009, 0x01000000, 0x00000009, 0x01000000]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), + 'Minus': LayoutEntry([0x0000002d, 0x0000005f, 0x0000002d, 0x0000005f]), + 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x0000003d, 0x0000002b]), + 'BracketLeft': LayoutEntry([0x0000005b, 0x0000007b, 0x0000005b, 0x0000007b]), + 'BracketRight': LayoutEntry([0x0000005d, 0x0000007d, 0x0000005d, 0x0000007d]), + 'Backslash': LayoutEntry([0x0000005c, 0x0000007c, 0x0000005c, 0x0000007c]), + 'Semicolon': LayoutEntry([0x0000003b, 0x0000003a, 0x0000003b, 0x0000003a]), + 'Quote': LayoutEntry([0x00000027, 0x00000022, 0x00000027, 0x00000022]), + 'Backquote': LayoutEntry([0x00000060, 0x0000007e, 0x00000060, 0x0000007e]), + 'Comma': LayoutEntry([0x0000002c, 0x0000003c, 0x0000002c, 0x0000003c]), + 'Period': LayoutEntry([0x0000002e, 0x0000003e, 0x0000002e, 0x0000003e]), + 'Slash': LayoutEntry([0x0000002f, 0x0000003f, 0x0000002f, 0x0000003f]), + 'Delete': LayoutEntry([0x01000000, 0x01000000, 0x01000000, 0x01000000]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), + 'NumpadEnter': LayoutEntry([0x0000000d, 0x0000000d, 0x0000000d, 0x0000000d]), + 'Numpad1': LayoutEntry([0x01000000, 0x00000031, 0x01000000, 0x00000031]), + 'Numpad2': LayoutEntry([0x01000000, 0x00000032, 0x01000000, 0x00000032]), + 'Numpad3': LayoutEntry([0x01000000, 0x00000033, 0x01000000, 0x00000033]), + 'Numpad4': LayoutEntry([0x01000000, 0x00000034, 0x01000000, 0x00000034]), + 'Numpad5': LayoutEntry([0x01000000, 0x00000035, 0x01000000, 0x00000035]), + 'Numpad6': LayoutEntry([0x01000000, 0x00000036, 0x01000000, 0x00000036]), + 'Numpad7': LayoutEntry([0x01000000, 0x00000037, 0x01000000, 0x00000037]), + 'Numpad8': LayoutEntry([0x01000000, 0x00000038, 0x01000000, 0x00000038]), + 'Numpad9': LayoutEntry([0x01000000, 0x00000039, 0x01000000, 0x00000039]), + 'Numpad0': LayoutEntry([0x01000000, 0x00000030, 0x01000000, 0x00000030]), + 'NumpadDecimal': LayoutEntry([0x01000000, 0x0000002e, 0x01000000, 0x0000002e]), + 'IntlBackslash': LayoutEntry([0x0000003c, 0x0000003e, 0x0000007c, 0x000000a6]), + 'NumpadEqual': LayoutEntry([0x0000003d, 0x0000003d, 0x0000003d, 0x0000003d]), + 'NumpadComma': LayoutEntry([0x0000002e, 0x0000002e, 0x0000002e, 0x0000002e]), + 'NumpadParenLeft': LayoutEntry([0x00000028, 0x00000028, 0x00000028, 0x00000028]), + 'NumpadParenRight': LayoutEntry([0x00000029, 0x00000029, 0x00000029, 0x00000029]), + }, + ), + + LayoutInfo( + name: 'en', + platform: LayoutPlatform.win, + mapping: { + 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x01000000, 0x01000000]), + 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x01000000]), + 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x01000000, 0x01000000]), + 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x01000000, 0x01000000]), + 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x01000000, 0x01000000]), + 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x01000000, 0x01000000]), + 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x01000000, 0x01000000]), + 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x01000000]), + 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x01000000]), + 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x01000000]), + 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x01000000]), + 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x01000000, 0x01000000]), + 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x01000000, 0x01000000]), + 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x01000000]), + 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x01000000, 0x01000000]), + 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x01000000]), + 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x01000000, 0x01000000]), + 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x01000000, 0x01000000]), + 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x01000000, 0x01000000]), + 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x01000000, 0x01000000]), + 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x01000000]), + 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x01000000]), + 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x01000000, 0x01000000]), + 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x01000000, 0x01000000]), + 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x01000000, 0x01000000]), + 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x01000000]), + 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x01000000, 0x01000000]), + 'Digit2': LayoutEntry([0x00000032, 0x00000040, 0x01000000, 0x01000000]), + 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x01000000, 0x01000000]), + 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x01000000, 0x01000000]), + 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x01000000, 0x01000000]), + 'Digit6': LayoutEntry([0x00000036, 0x0000005e, 0x01000000, 0x01000000]), + 'Digit7': LayoutEntry([0x00000037, 0x00000026, 0x01000000, 0x01000000]), + 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x01000000, 0x01000000]), + 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x01000000, 0x01000000]), + 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x01000000, 0x01000000]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), + 'Minus': LayoutEntry([0x0000002d, 0x0000005f, 0x01000000, 0x01000000]), + 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x01000000, 0x01000000]), + 'BracketLeft': LayoutEntry([0x0000005b, 0x0000007b, 0x01000000, 0x01000000]), + 'BracketRight': LayoutEntry([0x0000005d, 0x0000007d, 0x01000000, 0x01000000]), + 'Backslash': LayoutEntry([0x0000005c, 0x0000007c, 0x01000000, 0x01000000]), + 'Semicolon': LayoutEntry([0x0000003b, 0x0000003a, 0x01000000, 0x01000000]), + 'Quote': LayoutEntry([0x00000027, 0x00000022, 0x01000000, 0x01000000]), + 'Backquote': LayoutEntry([0x00000060, 0x0000007e, 0x01000000, 0x01000000]), + 'Comma': LayoutEntry([0x0000002c, 0x0000003c, 0x01000000, 0x01000000]), + 'Period': LayoutEntry([0x0000002e, 0x0000003e, 0x01000000, 0x01000000]), + 'Slash': LayoutEntry([0x0000002f, 0x0000003f, 0x01000000, 0x01000000]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), + 'IntlBackslash': LayoutEntry([0x0000005c, 0x0000007c, 0x01000000, 0x01000000]), + }, + ), + + LayoutInfo( + name: 'es-latin', + platform: LayoutPlatform.win, + mapping: { + 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x01000000, 0x01000000]), + 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x01000000]), + 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x01000000, 0x01000000]), + 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x01000000, 0x01000000]), + 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x01000000, 0x01000000]), + 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x01000000, 0x01000000]), + 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x01000000, 0x01000000]), + 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x01000000]), + 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x01000000]), + 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x01000000]), + 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x01000000]), + 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x01000000, 0x01000000]), + 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x01000000, 0x01000000]), + 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x01000000]), + 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x01000000, 0x01000000]), + 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x01000000]), + 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x00000040, 0x01000000]), + 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x01000000, 0x01000000]), + 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x01000000, 0x01000000]), + 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x01000000, 0x01000000]), + 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x01000000]), + 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x01000000]), + 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x01000000, 0x01000000]), + 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x01000000, 0x01000000]), + 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x01000000, 0x01000000]), + 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x01000000]), + 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x01000000, 0x01000000]), + 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x01000000, 0x01000000]), + 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x01000000, 0x01000000]), + 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x01000000, 0x01000000]), + 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x01000000, 0x01000000]), + 'Digit6': LayoutEntry([0x00000036, 0x00000026, 0x01000000, 0x01000000]), + 'Digit7': LayoutEntry([0x00000037, 0x0000002f, 0x01000000, 0x01000000]), + 'Digit8': LayoutEntry([0x00000038, 0x00000028, 0x01000000, 0x01000000]), + 'Digit9': LayoutEntry([0x00000039, 0x00000029, 0x01000000, 0x01000000]), + 'Digit0': LayoutEntry([0x00000030, 0x0000003d, 0x01000000, 0x01000000]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), + 'Minus': LayoutEntry([0x00000027, 0x0000003f, 0x0000005c, 0x01000000]), + 'Equal': LayoutEntry([0x000000bf, 0x000000a1, 0x01000000, 0x01000000]), + 'BracketLeft': LayoutEntry([0x000000b4, 0x000000a8, 0x01000000, 0x01000000]), + 'BracketRight': LayoutEntry([0x0000002b, 0x0000002a, 0x0000007e, 0x01000000]), + 'Backslash': LayoutEntry([0x0000007d, 0x0000005d, 0x00000060, 0x01000000]), + 'Semicolon': LayoutEntry([0x000000f1, 0x000000d1, 0x01000000, 0x01000000]), + 'Quote': LayoutEntry([0x0000007b, 0x0000005b, 0x0000005e, 0x01000000]), + 'Backquote': LayoutEntry([0x0000007c, 0x000000b0, 0x000000ac, 0x01000000]), + 'Comma': LayoutEntry([0x0000002c, 0x0000003b, 0x01000000, 0x01000000]), + 'Period': LayoutEntry([0x0000002e, 0x0000003a, 0x01000000, 0x01000000]), + 'Slash': LayoutEntry([0x0000002d, 0x0000005f, 0x01000000, 0x01000000]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), + 'IntlBackslash': LayoutEntry([0x0000003c, 0x0000003e, 0x01000000, 0x01000000]), + }, + ), + + LayoutInfo( + name: 'es', + platform: LayoutPlatform.darwin, + mapping: { + 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x000000e5, 0x000000c5]), + 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x000000df, 0x01000000]), + 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x000000a9, 0x00000020]), + 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x00002202, 0x00002206]), + 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000020ac, 0x000020ac]), + 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x00000192, 0x0000fb01]), + 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x0000f8ff, 0x0000fb02]), + 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x00002122, 0x00000020]), + 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x00000020, 0x00000020]), + 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x000000b6, 0x000000af]), + 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x000000a7, 0x000002c7]), + 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x00000020, 0x000002d8]), + 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x000000b5, 0x000002da]), + 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x00000020, 0x000002d9]), + 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8]), + 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x000003c0, 0x0000220f]), + 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x00000153, 0x00000152]), + 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x000000ae, 0x00000020]), + 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x0000222b, 0x00000020]), + 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x00002020, 0x00002021]), + 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x00000020, 0x00000020]), + 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x0000221a, 0x000025ca]), + 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x000000e6, 0x000000c6]), + 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x00002211, 0x0000203a]), + 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x000000a5, 0x00000020]), + 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x000003a9, 0x00002039]), + 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x0000007c, 0x00000131]), + 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x00000040, 0x000002dd]), + 'Digit3': LayoutEntry([0x00000033, 0x000000b7, 0x00000023, 0x00002022]), + 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x000000a2, 0x000000a3]), + 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x0000221e, 0x00002030]), + 'Digit6': LayoutEntry([0x00000036, 0x00000026, 0x000000ac, 0x00000020]), + 'Digit7': LayoutEntry([0x00000037, 0x0000002f, 0x000000f7, 0x00002044]), + 'Digit8': LayoutEntry([0x00000038, 0x00000028, 0x0000201c, 0x00002018]), + 'Digit9': LayoutEntry([0x00000039, 0x00000029, 0x0000201d, 0x00002019]), + 'Digit0': LayoutEntry([0x00000030, 0x0000003d, 0x00002260, 0x00002248]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), + 'Minus': LayoutEntry([0x00000027, 0x0000003f, 0x000000b4, 0x000000b8]), + 'Equal': LayoutEntry([0x000000a1, 0x000000bf, 0x0000201a, 0x000002db]), + 'BracketLeft': LayoutEntry([0x01000000, 0x01000000, 0x0000005b, 0x000002c6]), + 'BracketRight': LayoutEntry([0x0000002b, 0x0000002a, 0x0000005d, 0x000000b1]), + 'Backslash': LayoutEntry([0x000000e7, 0x000000c7, 0x0000007d, 0x000000bb]), + 'Semicolon': LayoutEntry([0x000000f1, 0x000000d1, 0x01000000, 0x000002dc]), + 'Quote': LayoutEntry([0x01000000, 0x01000000, 0x0000007b, 0x000000ab]), + 'Backquote': LayoutEntry([0x0000003c, 0x0000003e, 0x00002264, 0x00002265]), + 'Comma': LayoutEntry([0x0000002c, 0x0000003b, 0x0000201e, 0x01000000]), + 'Period': LayoutEntry([0x0000002e, 0x0000003a, 0x00002026, 0x00002026]), + 'Slash': LayoutEntry([0x0000002d, 0x0000005f, 0x00002013, 0x00002014]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), + 'Numpad1': LayoutEntry([0x00000031, 0x00000031, 0x00000031, 0x00000031]), + 'Numpad2': LayoutEntry([0x00000032, 0x00000032, 0x00000032, 0x00000032]), + 'Numpad3': LayoutEntry([0x00000033, 0x00000033, 0x00000033, 0x00000033]), + 'Numpad4': LayoutEntry([0x00000034, 0x00000034, 0x00000034, 0x00000034]), + 'Numpad5': LayoutEntry([0x00000035, 0x00000035, 0x00000035, 0x00000035]), + 'Numpad6': LayoutEntry([0x00000036, 0x00000036, 0x00000036, 0x00000036]), + 'Numpad7': LayoutEntry([0x00000037, 0x00000037, 0x00000037, 0x00000037]), + 'Numpad8': LayoutEntry([0x00000038, 0x00000038, 0x00000038, 0x00000038]), + 'Numpad9': LayoutEntry([0x00000039, 0x00000039, 0x00000039, 0x00000039]), + 'Numpad0': LayoutEntry([0x00000030, 0x00000030, 0x00000030, 0x00000030]), + 'NumpadDecimal': LayoutEntry([0x0000002c, 0x0000002c, 0x0000002c, 0x0000002c]), + 'IntlBackslash': LayoutEntry([0x000000ba, 0x000000aa, 0x0000005c, 0x000000b0]), + 'NumpadEqual': LayoutEntry([0x0000003d, 0x0000003d, 0x0000003d, 0x0000003d]), + 'AudioVolumeUp': LayoutEntry([0x01000000, 0x0000003d, 0x01000000, 0x0000003d]), + }, + ), + + LayoutInfo( + name: 'es', + platform: LayoutPlatform.linux, + mapping: { + 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x000000e6, 0x000000c6]), + 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x0000201d, 0x00002019]), + 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x000000a2, 0x000000a9]), + 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x000000f0, 0x000000d0]), + 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000020ac, 0x000000a2]), + 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x00000111, 0x000000aa]), + 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x0000014b, 0x0000014a]), + 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x00000127, 0x00000126]), + 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x00002192, 0x00000131]), + 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x00000309, 0x0000031b]), + 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x00000138, 0x00000026]), + 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x00000142, 0x00000141]), + 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x000000b5, 0x000000ba]), + 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x0000006e, 0x0000004e]), + 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8]), + 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x000000fe, 0x000000de]), + 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x00000040, 0x000003a9]), + 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x000000b6, 0x000000ae]), + 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x000000df, 0x000000a7]), + 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x00000167, 0x00000166]), + 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x00002193, 0x00002191]), + 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x0000201c, 0x00002018]), + 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x00000142, 0x00000141]), + 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x000000bb, 0x0000003e]), + 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x00002190, 0x000000a5]), + 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x000000ab, 0x0000003c]), + 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x0000007c, 0x000000a1]), + 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x00000040, 0x0000215b]), + 'Digit3': LayoutEntry([0x00000033, 0x000000b7, 0x00000023, 0x000000a3]), + 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x0000007e, 0x00000024]), + 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x000000bd, 0x0000215c]), + 'Digit6': LayoutEntry([0x00000036, 0x00000026, 0x000000ac, 0x0000215d]), + 'Digit7': LayoutEntry([0x00000037, 0x0000002f, 0x0000007b, 0x0000215e]), + 'Digit8': LayoutEntry([0x00000038, 0x00000028, 0x0000005b, 0x00002122]), + 'Digit9': LayoutEntry([0x00000039, 0x00000029, 0x0000005d, 0x000000b1]), + 'Digit0': LayoutEntry([0x00000030, 0x0000003d, 0x0000007d, 0x000000b0]), + 'Enter': LayoutEntry([0x0000000d, 0x0000000d, 0x0000000d, 0x0000000d]), + 'Escape': LayoutEntry([0x0000001b, 0x0000001b, 0x0000001b, 0x0000001b]), + 'Backspace': LayoutEntry([0x00000008, 0x00000008, 0x00000008, 0x00000008]), + 'Tab': LayoutEntry([0x00000009, 0x01000000, 0x00000009, 0x01000000]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), + 'Minus': LayoutEntry([0x00000027, 0x0000003f, 0x0000005c, 0x000000bf]), + 'Equal': LayoutEntry([0x000000a1, 0x000000bf, 0x00000303, 0x0000007e]), + 'BracketLeft': LayoutEntry([0x00000300, 0x00000302, 0x0000005b, 0x0000030a]), + 'BracketRight': LayoutEntry([0x0000002b, 0x0000002a, 0x0000005d, 0x00000304]), + 'Backslash': LayoutEntry([0x000000e7, 0x000000c7, 0x0000007d, 0x00000306]), + 'Semicolon': LayoutEntry([0x000000f1, 0x000000d1, 0x0000007e, 0x0000030b]), + 'Quote': LayoutEntry([0x00000301, 0x00000308, 0x0000007b, 0x0000007b]), + 'Backquote': LayoutEntry([0x000000ba, 0x000000aa, 0x0000005c, 0x0000005c]), + 'Comma': LayoutEntry([0x0000002c, 0x0000003b, 0x00002500, 0x000000d7]), + 'Period': LayoutEntry([0x0000002e, 0x0000003a, 0x000000b7, 0x000000f7]), + 'Slash': LayoutEntry([0x0000002d, 0x0000005f, 0x00000323, 0x00000307]), + 'Delete': LayoutEntry([0x01000000, 0x01000000, 0x01000000, 0x01000000]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), + 'NumpadEnter': LayoutEntry([0x0000000d, 0x0000000d, 0x0000000d, 0x0000000d]), + 'Numpad1': LayoutEntry([0x01000000, 0x00000031, 0x01000000, 0x00000031]), + 'Numpad2': LayoutEntry([0x01000000, 0x00000032, 0x01000000, 0x00000032]), + 'Numpad3': LayoutEntry([0x01000000, 0x00000033, 0x01000000, 0x00000033]), + 'Numpad4': LayoutEntry([0x01000000, 0x00000034, 0x01000000, 0x00000034]), + 'Numpad5': LayoutEntry([0x01000000, 0x00000035, 0x01000000, 0x00000035]), + 'Numpad6': LayoutEntry([0x01000000, 0x00000036, 0x01000000, 0x00000036]), + 'Numpad7': LayoutEntry([0x01000000, 0x00000037, 0x01000000, 0x00000037]), + 'Numpad8': LayoutEntry([0x01000000, 0x00000038, 0x01000000, 0x00000038]), + 'Numpad9': LayoutEntry([0x01000000, 0x00000039, 0x01000000, 0x00000039]), + 'Numpad0': LayoutEntry([0x01000000, 0x00000030, 0x01000000, 0x00000030]), + 'NumpadDecimal': LayoutEntry([0x01000000, 0x0000002e, 0x01000000, 0x0000002e]), + 'IntlBackslash': LayoutEntry([0x0000003c, 0x0000003e, 0x0000007c, 0x000000a6]), + 'NumpadEqual': LayoutEntry([0x0000003d, 0x0000003d, 0x0000003d, 0x0000003d]), + 'NumpadComma': LayoutEntry([0x0000002e, 0x0000002e, 0x0000002e, 0x0000002e]), + 'NumpadParenLeft': LayoutEntry([0x00000028, 0x00000028, 0x00000028, 0x00000028]), + 'NumpadParenRight': LayoutEntry([0x00000029, 0x00000029, 0x00000029, 0x00000029]), + }, + ), + + LayoutInfo( + name: 'es', + platform: LayoutPlatform.win, + mapping: { + 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x01000000, 0x01000000]), + 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x01000000]), + 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x01000000, 0x01000000]), + 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x01000000, 0x01000000]), + 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000020ac, 0x01000000]), + 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x01000000, 0x01000000]), + 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x01000000, 0x01000000]), + 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x01000000]), + 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x01000000]), + 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x01000000]), + 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x01000000]), + 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x01000000, 0x01000000]), + 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x01000000, 0x01000000]), + 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x01000000]), + 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x01000000, 0x01000000]), + 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x01000000]), + 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x01000000, 0x01000000]), + 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x01000000, 0x01000000]), + 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x01000000, 0x01000000]), + 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x01000000, 0x01000000]), + 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x01000000]), + 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x01000000]), + 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x01000000, 0x01000000]), + 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x01000000, 0x01000000]), + 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x01000000, 0x01000000]), + 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x01000000]), + 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x0000007c, 0x01000000]), + 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x00000040, 0x01000000]), + 'Digit3': LayoutEntry([0x00000033, 0x000000b7, 0x00000023, 0x01000000]), + 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x0000007e, 0x01000000]), + 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x000020ac, 0x01000000]), + 'Digit6': LayoutEntry([0x00000036, 0x00000026, 0x000000ac, 0x01000000]), + 'Digit7': LayoutEntry([0x00000037, 0x0000002f, 0x01000000, 0x01000000]), + 'Digit8': LayoutEntry([0x00000038, 0x00000028, 0x01000000, 0x01000000]), + 'Digit9': LayoutEntry([0x00000039, 0x00000029, 0x01000000, 0x01000000]), + 'Digit0': LayoutEntry([0x00000030, 0x0000003d, 0x01000000, 0x01000000]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), + 'Minus': LayoutEntry([0x00000027, 0x0000003f, 0x01000000, 0x01000000]), + 'Equal': LayoutEntry([0x000000a1, 0x000000bf, 0x01000000, 0x01000000]), + 'BracketLeft': LayoutEntry([0x00000060, 0x0000005e, 0x0000005b, 0x01000000]), + 'BracketRight': LayoutEntry([0x0000002b, 0x0000002a, 0x0000005d, 0x01000000]), + 'Backslash': LayoutEntry([0x000000e7, 0x000000c7, 0x0000007d, 0x01000000]), + 'Semicolon': LayoutEntry([0x000000f1, 0x000000d1, 0x01000000, 0x01000000]), + 'Quote': LayoutEntry([0x000000b4, 0x000000a8, 0x0000007b, 0x01000000]), + 'Backquote': LayoutEntry([0x000000ba, 0x000000aa, 0x0000005c, 0x01000000]), + 'Comma': LayoutEntry([0x0000002c, 0x0000003b, 0x01000000, 0x01000000]), + 'Period': LayoutEntry([0x0000002e, 0x0000003a, 0x01000000, 0x01000000]), + 'Slash': LayoutEntry([0x0000002d, 0x0000005f, 0x01000000, 0x01000000]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), + 'IntlBackslash': LayoutEntry([0x0000003c, 0x0000003e, 0x01000000, 0x01000000]), + }, + ), + + LayoutInfo( + name: 'fr', + platform: LayoutPlatform.darwin, + mapping: { + 'KeyA': LayoutEntry([0x00000071, 0x00000051, 0x00002021, 0x000003a9]), + 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x000000df, 0x0000222b]), + 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x000000a9, 0x000000a2]), + 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x00002202, 0x00002206]), + 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000000ea, 0x000000ca]), + 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x00000192, 0x000000b7]), + 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x0000fb01, 0x0000fb02]), + 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x000000cc, 0x000000ce]), + 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x000000ee, 0x000000ef]), + 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x000000cf, 0x000000cd]), + 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x000000c8, 0x000000cb]), + 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x000000ac, 0x0000007c]), + 'KeyM': LayoutEntry([0x0000002c, 0x0000003f, 0x0000221e, 0x000000bf]), + 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x00000131]), + 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x00000153, 0x00000152]), + 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x000003c0, 0x0000220f]), + 'KeyQ': LayoutEntry([0x00000061, 0x00000041, 0x000000e6, 0x000000c6]), + 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x000000ae, 0x0000201a]), + 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x000000d2, 0x00002211]), + 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x00002020, 0x00002122]), + 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x000000ba, 0x000000aa]), + 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x000025ca, 0x0000221a]), + 'KeyW': LayoutEntry([0x0000007a, 0x0000005a, 0x000000c2, 0x000000c5]), + 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x00002248, 0x00002044]), + 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x000000da, 0x00000178]), + 'KeyZ': LayoutEntry([0x00000077, 0x00000057, 0x00002039, 0x0000203a]), + 'Digit1': LayoutEntry([0x00000026, 0x00000031, 0x0000f8ff, 0x01000000]), + 'Digit2': LayoutEntry([0x000000e9, 0x00000032, 0x000000eb, 0x0000201e]), + 'Digit3': LayoutEntry([0x00000022, 0x00000033, 0x0000201c, 0x0000201d]), + 'Digit4': LayoutEntry([0x00000027, 0x00000034, 0x00002018, 0x00002019]), + 'Digit5': LayoutEntry([0x00000028, 0x00000035, 0x0000007b, 0x0000005b]), + 'Digit6': LayoutEntry([0x000000a7, 0x00000036, 0x000000b6, 0x000000e5]), + 'Digit7': LayoutEntry([0x000000e8, 0x00000037, 0x000000ab, 0x000000bb]), + 'Digit8': LayoutEntry([0x00000021, 0x00000038, 0x000000a1, 0x000000db]), + 'Digit9': LayoutEntry([0x000000e7, 0x00000039, 0x000000c7, 0x000000c1]), + 'Digit0': LayoutEntry([0x000000e0, 0x00000030, 0x000000f8, 0x000000d8]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), + 'Minus': LayoutEntry([0x00000029, 0x000000b0, 0x0000007d, 0x0000005d]), + 'Equal': LayoutEntry([0x0000002d, 0x0000005f, 0x00002014, 0x00002013]), + 'BracketLeft': LayoutEntry([0x01000000, 0x01000000, 0x000000f4, 0x000000d4]), + 'BracketRight': LayoutEntry([0x00000024, 0x0000002a, 0x000020ac, 0x000000a5]), + 'Backslash': LayoutEntry([0x01000000, 0x000000a3, 0x00000040, 0x00000023]), + 'Semicolon': LayoutEntry([0x0000006d, 0x0000004d, 0x000000b5, 0x000000d3]), + 'Quote': LayoutEntry([0x000000f9, 0x00000025, 0x000000d9, 0x00002030]), + 'Backquote': LayoutEntry([0x0000003c, 0x0000003e, 0x00002264, 0x00002265]), + 'Comma': LayoutEntry([0x0000003b, 0x0000002e, 0x00002026, 0x00002022]), + 'Period': LayoutEntry([0x0000003a, 0x0000002f, 0x000000f7, 0x0000005c]), + 'Slash': LayoutEntry([0x0000003d, 0x0000002b, 0x00002260, 0x000000b1]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), + 'Numpad1': LayoutEntry([0x00000031, 0x00000031, 0x00000031, 0x00000031]), + 'Numpad2': LayoutEntry([0x00000032, 0x00000032, 0x00000032, 0x00000032]), + 'Numpad3': LayoutEntry([0x00000033, 0x00000033, 0x00000033, 0x00000033]), + 'Numpad4': LayoutEntry([0x00000034, 0x00000034, 0x00000034, 0x00000034]), + 'Numpad5': LayoutEntry([0x00000035, 0x00000035, 0x00000035, 0x00000035]), + 'Numpad6': LayoutEntry([0x00000036, 0x00000036, 0x00000036, 0x00000036]), + 'Numpad7': LayoutEntry([0x00000037, 0x00000037, 0x00000037, 0x00000037]), + 'Numpad8': LayoutEntry([0x00000038, 0x00000038, 0x00000038, 0x00000038]), + 'Numpad9': LayoutEntry([0x00000039, 0x00000039, 0x00000039, 0x00000039]), + 'Numpad0': LayoutEntry([0x00000030, 0x00000030, 0x00000030, 0x00000030]), + 'NumpadDecimal': LayoutEntry([0x0000002c, 0x0000002e, 0x0000002c, 0x0000002e]), + 'IntlBackslash': LayoutEntry([0x00000040, 0x00000023, 0x00002022, 0x00000178]), + 'NumpadEqual': LayoutEntry([0x0000003d, 0x0000003d, 0x0000003d, 0x0000003d]), + 'AudioVolumeUp': LayoutEntry([0x01000000, 0x0000003d, 0x01000000, 0x0000003d]), + }, + ), + + LayoutInfo( + name: 'fr', + platform: LayoutPlatform.linux, + mapping: { + 'KeyA': LayoutEntry([0x00000071, 0x00000051, 0x00000040, 0x000003a9]), + 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x0000201d, 0x00002019]), + 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x000000a2, 0x000000a9]), + 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x000000f0, 0x000000d0]), + 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000020ac, 0x000000a2]), + 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x00000111, 0x000000aa]), + 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x0000014b, 0x0000014a]), + 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x00000127, 0x00000126]), + 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x00002192, 0x00000131]), + 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x00000309, 0x0000031b]), + 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x00000138, 0x00000026]), + 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x00000142, 0x00000141]), + 'KeyM': LayoutEntry([0x0000002c, 0x0000003f, 0x00000301, 0x0000030b]), + 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x0000006e, 0x0000004e]), + 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8]), + 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x000000fe, 0x000000de]), + 'KeyQ': LayoutEntry([0x00000061, 0x00000041, 0x000000e6, 0x000000c6]), + 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x000000b6, 0x000000ae]), + 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x000000df, 0x000000a7]), + 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x00000167, 0x00000166]), + 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x00002193, 0x00002191]), + 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x0000201c, 0x00002018]), + 'KeyW': LayoutEntry([0x0000007a, 0x0000005a, 0x000000ab, 0x0000003c]), + 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x000000bb, 0x0000003e]), + 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x00002190, 0x000000a5]), + 'KeyZ': LayoutEntry([0x00000077, 0x00000057, 0x00000142, 0x00000141]), + 'Digit1': LayoutEntry([0x00000026, 0x00000031, 0x000000b9, 0x000000a1]), + 'Digit2': LayoutEntry([0x000000e9, 0x00000032, 0x0000007e, 0x0000215b]), + 'Digit3': LayoutEntry([0x00000022, 0x00000033, 0x00000023, 0x000000a3]), + 'Digit4': LayoutEntry([0x00000027, 0x00000034, 0x0000007b, 0x00000024]), + 'Digit5': LayoutEntry([0x00000028, 0x00000035, 0x0000005b, 0x0000215c]), + 'Digit6': LayoutEntry([0x0000002d, 0x00000036, 0x0000007c, 0x0000215d]), + 'Digit7': LayoutEntry([0x000000e8, 0x00000037, 0x00000060, 0x0000215e]), + 'Digit8': LayoutEntry([0x0000005f, 0x00000038, 0x0000005c, 0x00002122]), + 'Digit9': LayoutEntry([0x000000e7, 0x00000039, 0x0000005e, 0x000000b1]), + 'Digit0': LayoutEntry([0x000000e0, 0x00000030, 0x00000040, 0x000000b0]), + 'Enter': LayoutEntry([0x0000000d, 0x0000000d, 0x0000000d, 0x0000000d]), + 'Escape': LayoutEntry([0x0000001b, 0x0000001b, 0x0000001b, 0x0000001b]), + 'Backspace': LayoutEntry([0x00000008, 0x00000008, 0x00000008, 0x00000008]), + 'Tab': LayoutEntry([0x00000009, 0x01000000, 0x00000009, 0x01000000]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), + 'Minus': LayoutEntry([0x00000029, 0x000000b0, 0x0000005d, 0x000000bf]), + 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x0000007d, 0x00000328]), + 'BracketLeft': LayoutEntry([0x00000302, 0x00000308, 0x00000308, 0x0000030a]), + 'BracketRight': LayoutEntry([0x00000024, 0x000000a3, 0x000000a4, 0x00000304]), + 'Backslash': LayoutEntry([0x0000002a, 0x000000b5, 0x00000300, 0x00000306]), + 'Semicolon': LayoutEntry([0x0000006d, 0x0000004d, 0x000000b5, 0x000000ba]), + 'Quote': LayoutEntry([0x000000f9, 0x00000025, 0x00000302, 0x0000030c]), + 'Backquote': LayoutEntry([0x000000b2, 0x0000007e, 0x000000ac, 0x000000ac]), + 'Comma': LayoutEntry([0x0000003b, 0x0000002e, 0x00002500, 0x000000d7]), + 'Period': LayoutEntry([0x0000003a, 0x0000002f, 0x000000b7, 0x000000f7]), + 'Slash': LayoutEntry([0x00000021, 0x000000a7, 0x00000323, 0x00000307]), + 'PrintScreen': LayoutEntry([0x01000000, 0x01000000, 0x01000000, 0x01000000]), + 'PageUp': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), + 'Numpad1': LayoutEntry([0x01000000, 0x00000031, 0x01000000, 0x00000031]), + 'Numpad2': LayoutEntry([0x01000000, 0x00000032, 0x01000000, 0x00000032]), + 'Numpad3': LayoutEntry([0x01000000, 0x00000033, 0x01000000, 0x00000033]), + 'Numpad4': LayoutEntry([0x01000000, 0x00000034, 0x01000000, 0x00000034]), + 'Numpad5': LayoutEntry([0x01000000, 0x00000035, 0x01000000, 0x00000035]), + 'Numpad6': LayoutEntry([0x01000000, 0x00000036, 0x01000000, 0x00000036]), + 'Numpad7': LayoutEntry([0x01000000, 0x00000037, 0x01000000, 0x00000037]), + 'Numpad8': LayoutEntry([0x01000000, 0x00000038, 0x01000000, 0x00000038]), + 'Numpad9': LayoutEntry([0x01000000, 0x00000039, 0x01000000, 0x00000039]), + 'Numpad0': LayoutEntry([0x01000000, 0x00000030, 0x01000000, 0x00000030]), + 'NumpadDecimal': LayoutEntry([0x01000000, 0x0000002e, 0x01000000, 0x0000002e]), + 'IntlBackslash': LayoutEntry([0x0000003c, 0x0000003e, 0x0000007c, 0x000000a6]), + 'AltRight': LayoutEntry([0x0000000d, 0x0000000d, 0x0000000d, 0x0000000d]), + 'MetaRight': LayoutEntry([0x0000002e, 0x0000002e, 0x0000002e, 0x0000002e]), + }, + ), + + LayoutInfo( + name: 'fr', + platform: LayoutPlatform.win, + mapping: { + 'KeyA': LayoutEntry([0x00000071, 0x00000051, 0x01000000, 0x01000000]), + 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x01000000]), + 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x01000000, 0x01000000]), + 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x01000000, 0x01000000]), + 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000020ac, 0x01000000]), + 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x01000000, 0x01000000]), + 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x01000000, 0x01000000]), + 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x01000000]), + 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x01000000]), + 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x01000000]), + 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x01000000]), + 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x01000000, 0x01000000]), + 'KeyM': LayoutEntry([0x0000002c, 0x0000003f, 0x01000000, 0x01000000]), + 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x01000000]), + 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x01000000, 0x01000000]), + 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x01000000]), + 'KeyQ': LayoutEntry([0x00000061, 0x00000041, 0x01000000, 0x01000000]), + 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x01000000, 0x01000000]), + 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x01000000, 0x01000000]), + 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x01000000, 0x01000000]), + 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x01000000]), + 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x01000000]), + 'KeyW': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x01000000]), + 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x01000000, 0x01000000]), + 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x01000000, 0x01000000]), + 'KeyZ': LayoutEntry([0x00000077, 0x00000057, 0x01000000, 0x01000000]), + 'Digit1': LayoutEntry([0x00000026, 0x00000031, 0x01000000, 0x01000000]), + 'Digit2': LayoutEntry([0x000000e9, 0x00000032, 0x0000007e, 0x01000000]), + 'Digit3': LayoutEntry([0x00000022, 0x00000033, 0x00000023, 0x01000000]), + 'Digit4': LayoutEntry([0x00000027, 0x00000034, 0x0000007b, 0x01000000]), + 'Digit5': LayoutEntry([0x00000028, 0x00000035, 0x0000005b, 0x01000000]), + 'Digit6': LayoutEntry([0x0000002d, 0x00000036, 0x0000007c, 0x01000000]), + 'Digit7': LayoutEntry([0x000000e8, 0x00000037, 0x00000060, 0x01000000]), + 'Digit8': LayoutEntry([0x0000005f, 0x00000038, 0x0000005c, 0x01000000]), + 'Digit9': LayoutEntry([0x000000e7, 0x00000039, 0x0000005e, 0x01000000]), + 'Digit0': LayoutEntry([0x000000e0, 0x00000030, 0x00000040, 0x01000000]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), + 'Minus': LayoutEntry([0x00000029, 0x000000b0, 0x0000005d, 0x01000000]), + 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x0000007d, 0x01000000]), + 'BracketLeft': LayoutEntry([0x0000005e, 0x000000a8, 0x01000000, 0x01000000]), + 'BracketRight': LayoutEntry([0x00000024, 0x000000a3, 0x000000a4, 0x01000000]), + 'Backslash': LayoutEntry([0x0000002a, 0x000000b5, 0x01000000, 0x01000000]), + 'Semicolon': LayoutEntry([0x0000006d, 0x0000004d, 0x01000000, 0x01000000]), + 'Quote': LayoutEntry([0x000000f9, 0x00000025, 0x01000000, 0x01000000]), + 'Backquote': LayoutEntry([0x000000b2, 0x01000000, 0x01000000, 0x01000000]), + 'Comma': LayoutEntry([0x0000003b, 0x0000002e, 0x01000000, 0x01000000]), + 'Period': LayoutEntry([0x0000003a, 0x0000002f, 0x01000000, 0x01000000]), + 'Slash': LayoutEntry([0x00000021, 0x000000a7, 0x01000000, 0x01000000]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), + 'IntlBackslash': LayoutEntry([0x0000003c, 0x0000003e, 0x01000000, 0x01000000]), + }, + ), + + LayoutInfo( + name: 'hu', + platform: LayoutPlatform.win, + mapping: { + 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x000000e4, 0x01000000]), + 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x0000007b, 0x01000000]), + 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x00000026, 0x01000000]), + 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x00000110, 0x01000000]), + 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000000c4, 0x01000000]), + 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x0000005b, 0x01000000]), + 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x0000005d, 0x01000000]), + 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x01000000]), + 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x000000cd, 0x01000000]), + 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x000000ed, 0x01000000]), + 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x00000142, 0x01000000]), + 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x00000141, 0x01000000]), + 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x0000003c, 0x01000000]), + 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x0000007d, 0x01000000]), + 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x01000000, 0x01000000]), + 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x01000000]), + 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x0000005c, 0x01000000]), + 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x01000000, 0x01000000]), + 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x00000111, 0x01000000]), + 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x01000000, 0x01000000]), + 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x000020ac, 0x01000000]), + 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x00000040, 0x01000000]), + 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x0000007c, 0x01000000]), + 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x00000023, 0x01000000]), + 'KeyY': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x01000000]), + 'KeyZ': LayoutEntry([0x00000079, 0x00000059, 0x0000003e, 0x01000000]), + 'Digit1': LayoutEntry([0x00000031, 0x00000027, 0x0000007e, 0x01000000]), + 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x000002c7, 0x01000000]), + 'Digit3': LayoutEntry([0x00000033, 0x0000002b, 0x0000005e, 0x01000000]), + 'Digit4': LayoutEntry([0x00000034, 0x00000021, 0x000002d8, 0x01000000]), + 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x000000b0, 0x01000000]), + 'Digit6': LayoutEntry([0x00000036, 0x0000002f, 0x000002db, 0x01000000]), + 'Digit7': LayoutEntry([0x00000037, 0x0000003d, 0x00000060, 0x01000000]), + 'Digit8': LayoutEntry([0x00000038, 0x00000028, 0x000002d9, 0x01000000]), + 'Digit9': LayoutEntry([0x00000039, 0x00000029, 0x000000b4, 0x01000000]), + 'Digit0': LayoutEntry([0x000000f6, 0x000000d6, 0x000002dd, 0x01000000]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), + 'Minus': LayoutEntry([0x000000fc, 0x000000dc, 0x000000a8, 0x01000000]), + 'Equal': LayoutEntry([0x000000f3, 0x000000d3, 0x000000b8, 0x01000000]), + 'BracketLeft': LayoutEntry([0x00000151, 0x00000150, 0x000000f7, 0x01000000]), + 'BracketRight': LayoutEntry([0x000000fa, 0x000000da, 0x000000d7, 0x01000000]), + 'Backslash': LayoutEntry([0x00000171, 0x00000170, 0x000000a4, 0x01000000]), + 'Semicolon': LayoutEntry([0x000000e9, 0x000000c9, 0x00000024, 0x01000000]), + 'Quote': LayoutEntry([0x000000e1, 0x000000c1, 0x000000df, 0x01000000]), + 'Backquote': LayoutEntry([0x00000030, 0x000000a7, 0x01000000, 0x01000000]), + 'Comma': LayoutEntry([0x0000002c, 0x0000003f, 0x0000003b, 0x01000000]), + 'Period': LayoutEntry([0x0000002e, 0x0000003a, 0x0000003e, 0x01000000]), + 'Slash': LayoutEntry([0x0000002d, 0x0000005f, 0x0000002a, 0x01000000]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), + 'IntlBackslash': LayoutEntry([0x000000ed, 0x000000cd, 0x0000003c, 0x01000000]), + }, + ), + + LayoutInfo( + name: 'it', + platform: LayoutPlatform.darwin, + mapping: { + 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x000000e5, 0x000000c5]), + 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x0000222b, 0x000000cd]), + 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x000000a9, 0x000000c1]), + 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x00002202, 0x000002d8]), + 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000020ac, 0x000000c8]), + 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x00000192, 0x000002d9]), + 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x0000221e, 0x000002da]), + 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x00002206, 0x000000b8]), + 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x00000153, 0x00000152]), + 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x000000aa, 0x000002dd]), + 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x000000ba, 0x000002db]), + 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x000000ac, 0x000002c7]), + 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x000000b5, 0x000000da]), + 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x000000d3]), + 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8]), + 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x000003c0, 0x0000220f]), + 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x0000201e, 0x0000201a]), + 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x000000ae, 0x000000cc]), + 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x000000df, 0x000000af]), + 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x00002122, 0x000000d2]), + 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x000000d9]), + 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x0000221a, 0x000000c9]), + 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x000003a9, 0x000000c0]), + 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x00002020, 0x00002021]), + 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x000000e6, 0x000000c6]), + 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x00002211, 0x00000020]), + 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x000000ab, 0x000000bb]), + 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x0000201c, 0x0000201d]), + 'Digit3': LayoutEntry([0x00000033, 0x000000a3, 0x00002018, 0x00002019]), + 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x000000a5, 0x000000a2]), + 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x0000007e, 0x00002030]), + 'Digit6': LayoutEntry([0x00000036, 0x00000026, 0x00002039, 0x0000203a]), + 'Digit7': LayoutEntry([0x00000037, 0x0000002f, 0x000000f7, 0x00002044]), + 'Digit8': LayoutEntry([0x00000038, 0x00000028, 0x01000000, 0x0000f8ff]), + 'Digit9': LayoutEntry([0x00000039, 0x00000029, 0x01000000, 0x00000020]), + 'Digit0': LayoutEntry([0x00000030, 0x0000003d, 0x00002260, 0x00002248]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), + 'Minus': LayoutEntry([0x00000027, 0x0000003f, 0x000000a1, 0x000000bf]), + 'Equal': LayoutEntry([0x000000ec, 0x0000005e, 0x01000000, 0x000000b1]), + 'BracketLeft': LayoutEntry([0x000000e8, 0x000000e9, 0x0000005b, 0x0000007b]), + 'BracketRight': LayoutEntry([0x0000002b, 0x0000002a, 0x0000005d, 0x0000007d]), + 'Backslash': LayoutEntry([0x000000f9, 0x000000a7, 0x000000b6, 0x000025ca]), + 'Semicolon': LayoutEntry([0x000000f2, 0x000000e7, 0x00000040, 0x000000c7]), + 'Quote': LayoutEntry([0x000000e0, 0x000000b0, 0x00000023, 0x0000221e]), + 'Backquote': LayoutEntry([0x0000003c, 0x0000003e, 0x00002264, 0x00002265]), + 'Comma': LayoutEntry([0x0000002c, 0x0000003b, 0x00002026, 0x00000020]), + 'Period': LayoutEntry([0x0000002e, 0x0000003a, 0x00002022, 0x000000b7]), + 'Slash': LayoutEntry([0x0000002d, 0x0000005f, 0x00002013, 0x00002014]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), + 'Numpad1': LayoutEntry([0x00000031, 0x00000031, 0x00000031, 0x00000031]), + 'Numpad2': LayoutEntry([0x00000032, 0x00000032, 0x00000032, 0x00000032]), + 'Numpad3': LayoutEntry([0x00000033, 0x00000033, 0x00000033, 0x00000033]), + 'Numpad4': LayoutEntry([0x00000034, 0x00000034, 0x00000034, 0x00000034]), + 'Numpad5': LayoutEntry([0x00000035, 0x00000035, 0x00000035, 0x00000035]), + 'Numpad6': LayoutEntry([0x00000036, 0x00000036, 0x00000036, 0x00000036]), + 'Numpad7': LayoutEntry([0x00000037, 0x00000037, 0x00000037, 0x00000037]), + 'Numpad8': LayoutEntry([0x00000038, 0x00000038, 0x00000038, 0x00000038]), + 'Numpad9': LayoutEntry([0x00000039, 0x00000039, 0x00000039, 0x00000039]), + 'Numpad0': LayoutEntry([0x00000030, 0x00000030, 0x00000030, 0x00000030]), + 'NumpadDecimal': LayoutEntry([0x0000002c, 0x0000002e, 0x0000002c, 0x0000002e]), + 'IntlBackslash': LayoutEntry([0x0000005c, 0x0000007c, 0x00000060, 0x00000131]), + 'NumpadEqual': LayoutEntry([0x0000003d, 0x0000003d, 0x0000003d, 0x0000003d]), + 'AudioVolumeUp': LayoutEntry([0x01000000, 0x0000003d, 0x01000000, 0x0000003d]), + }, + ), + + LayoutInfo( + name: 'it', + platform: LayoutPlatform.win, + mapping: { + 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x01000000, 0x01000000]), + 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x01000000]), + 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x01000000, 0x01000000]), + 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x01000000, 0x01000000]), + 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000020ac, 0x01000000]), + 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x01000000, 0x01000000]), + 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x01000000, 0x01000000]), + 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x01000000]), + 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x01000000]), + 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x01000000]), + 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x01000000]), + 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x01000000, 0x01000000]), + 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x01000000, 0x01000000]), + 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x01000000]), + 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x01000000, 0x01000000]), + 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x01000000]), + 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x01000000, 0x01000000]), + 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x01000000, 0x01000000]), + 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x01000000, 0x01000000]), + 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x01000000, 0x01000000]), + 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x01000000]), + 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x01000000]), + 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x01000000, 0x01000000]), + 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x01000000, 0x01000000]), + 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x01000000, 0x01000000]), + 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x01000000]), + 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x01000000, 0x01000000]), + 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x01000000, 0x01000000]), + 'Digit3': LayoutEntry([0x00000033, 0x000000a3, 0x01000000, 0x01000000]), + 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x01000000, 0x01000000]), + 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x000020ac, 0x01000000]), + 'Digit6': LayoutEntry([0x00000036, 0x00000026, 0x01000000, 0x01000000]), + 'Digit7': LayoutEntry([0x00000037, 0x0000002f, 0x01000000, 0x01000000]), + 'Digit8': LayoutEntry([0x00000038, 0x00000028, 0x01000000, 0x01000000]), + 'Digit9': LayoutEntry([0x00000039, 0x00000029, 0x01000000, 0x01000000]), + 'Digit0': LayoutEntry([0x00000030, 0x0000003d, 0x01000000, 0x01000000]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), + 'Minus': LayoutEntry([0x00000027, 0x0000003f, 0x01000000, 0x01000000]), + 'Equal': LayoutEntry([0x000000ec, 0x0000005e, 0x01000000, 0x01000000]), + 'BracketLeft': LayoutEntry([0x000000e8, 0x000000e9, 0x0000005b, 0x0000007b]), + 'BracketRight': LayoutEntry([0x0000002b, 0x0000002a, 0x0000005d, 0x0000007d]), + 'Backslash': LayoutEntry([0x000000f9, 0x000000a7, 0x01000000, 0x01000000]), + 'Semicolon': LayoutEntry([0x000000f2, 0x000000e7, 0x00000040, 0x01000000]), + 'Quote': LayoutEntry([0x000000e0, 0x000000b0, 0x00000023, 0x01000000]), + 'Backquote': LayoutEntry([0x0000005c, 0x0000007c, 0x01000000, 0x01000000]), + 'Comma': LayoutEntry([0x0000002c, 0x0000003b, 0x01000000, 0x01000000]), + 'Period': LayoutEntry([0x0000002e, 0x0000003a, 0x01000000, 0x01000000]), + 'Slash': LayoutEntry([0x0000002d, 0x0000005f, 0x01000000, 0x01000000]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), + 'IntlBackslash': LayoutEntry([0x0000003c, 0x0000003e, 0x01000000, 0x01000000]), + }, + ), + + LayoutInfo( + name: 'jp-roman', + platform: LayoutPlatform.darwin, + mapping: { + 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x01000000, 0x00000304]), + 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x00000306]), + 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x01000000, 0x00000327]), + 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x000000f0, 0x000000d0]), + 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x01000000, 0x00000301]), + 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x00000192, 0x01000000]), + 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x000000a9, 0x01000000]), + 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x00000331]), + 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x0000031b]), + 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x0000030b]), + 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x0000030a]), + 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x01000000, 0x00000335]), + 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x01000000, 0x00000328]), + 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x00000303]), + 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8]), + 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x00000326]), + 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x00000153, 0x00000152]), + 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x000000ae, 0x00002030]), + 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x000000df, 0x01000000]), + 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x000000fe, 0x000000de]), + 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x00000308]), + 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x0000030c]), + 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x01000000, 0x00000307]), + 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x01000000, 0x00000323]), + 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x000000a5, 0x01000000]), + 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x00000309]), + 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x000000a1, 0x00002044]), + 'Digit2': LayoutEntry([0x00000032, 0x00000040, 0x00002122, 0x000020ac]), + 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x000000a3, 0x00002039]), + 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x000000a2, 0x0000203a]), + 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x000000a7, 0x00002020]), + 'Digit6': LayoutEntry([0x00000036, 0x0000005e, 0x01000000, 0x00000302]), + 'Digit7': LayoutEntry([0x00000037, 0x00000026, 0x000000b6, 0x00002021]), + 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x00002022, 0x000000b0]), + 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x000000aa, 0x000000b7]), + 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x000000ba, 0x0000201a]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), + 'Minus': LayoutEntry([0x0000002d, 0x0000005f, 0x00002013, 0x00002014]), + 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x00002260, 0x000000b1]), + 'BracketLeft': LayoutEntry([0x0000005b, 0x0000007b, 0x0000201c, 0x0000201d]), + 'BracketRight': LayoutEntry([0x0000005d, 0x0000007d, 0x00002018, 0x00002019]), + 'Backslash': LayoutEntry([0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb]), + 'Semicolon': LayoutEntry([0x0000003b, 0x0000003a, 0x00002026, 0x01000000]), + 'Quote': LayoutEntry([0x00000027, 0x00000022, 0x000000e6, 0x000000c6]), + 'Backquote': LayoutEntry([0x00000060, 0x0000007e, 0x01000000, 0x00000300]), + 'Comma': LayoutEntry([0x0000002c, 0x0000003c, 0x00002264, 0x0000201e]), + 'Period': LayoutEntry([0x0000002e, 0x0000003e, 0x00002265, 0x01000000]), + 'Slash': LayoutEntry([0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), + 'Numpad1': LayoutEntry([0x00000031, 0x00000031, 0x00000031, 0x00000031]), + 'Numpad2': LayoutEntry([0x00000032, 0x00000032, 0x00000032, 0x00000032]), + 'Numpad3': LayoutEntry([0x00000033, 0x00000033, 0x00000033, 0x00000033]), + 'Numpad4': LayoutEntry([0x00000034, 0x00000034, 0x00000034, 0x00000034]), + 'Numpad5': LayoutEntry([0x00000035, 0x00000035, 0x00000035, 0x00000035]), + 'Numpad6': LayoutEntry([0x00000036, 0x00000036, 0x00000036, 0x00000036]), + 'Numpad7': LayoutEntry([0x00000037, 0x00000037, 0x00000037, 0x00000037]), + 'Numpad8': LayoutEntry([0x00000038, 0x00000038, 0x00000038, 0x00000038]), + 'Numpad9': LayoutEntry([0x00000039, 0x00000039, 0x00000039, 0x00000039]), + 'Numpad0': LayoutEntry([0x00000030, 0x00000030, 0x00000030, 0x00000030]), + 'NumpadDecimal': LayoutEntry([0x0000002e, 0x0000002e, 0x0000002e, 0x0000002e]), + 'IntlBackslash': LayoutEntry([0x000000a7, 0x000000b1, 0x000000a7, 0x000000b1]), + 'NumpadEqual': LayoutEntry([0x0000003d, 0x0000003d, 0x0000003d, 0x0000003d]), + 'AudioVolumeUp': LayoutEntry([0x01000000, 0x0000003d, 0x01000000, 0x0000003d]), + }, + ), + + LayoutInfo( + name: 'jp', + platform: LayoutPlatform.darwin, + mapping: { + 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x000000e5, 0x000000c5]), + 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x0000222b, 0x00000131]), + 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x000000e7, 0x000000c7]), + 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x00002202, 0x000000ce]), + 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x01000000, 0x000000b4]), + 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x00000192, 0x000000cf]), + 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x000000a9, 0x000002dd]), + 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x000002d9, 0x000000d3]), + 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x000002c6]), + 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x00002206, 0x000000d4]), + 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x000002da, 0x0000f8ff]), + 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x000000ac, 0x000000d2]), + 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x000000b5, 0x000000c2]), + 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x000002dc]), + 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8]), + 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x000003c0, 0x0000220f]), + 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x00000153, 0x00000152]), + 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x000000ae, 0x00002030]), + 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x000000df, 0x000000cd]), + 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x00002020, 0x000002c7]), + 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x000000a8]), + 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x0000221a, 0x000025ca]), + 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x00002211, 0x0000201e]), + 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x00002248, 0x000002db]), + 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x000000a5, 0x000000c1]), + 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x000003a9, 0x000000b8]), + 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x000000a1, 0x00002044]), + 'Digit2': LayoutEntry([0x00000032, 0x00000040, 0x00002122, 0x000020ac]), + 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x000000a3, 0x00002039]), + 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x000000a2, 0x0000203a]), + 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x0000221e, 0x0000fb01]), + 'Digit6': LayoutEntry([0x00000036, 0x0000005e, 0x000000a7, 0x0000fb02]), + 'Digit7': LayoutEntry([0x00000037, 0x00000026, 0x000000b6, 0x00002021]), + 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x00002022, 0x000000b0]), + 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x000000aa, 0x000000b7]), + 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x000000ba, 0x0000201a]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), + 'Minus': LayoutEntry([0x0000002d, 0x0000005f, 0x00002013, 0x00002014]), + 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x00002260, 0x000000b1]), + 'BracketLeft': LayoutEntry([0x0000005b, 0x0000007b, 0x0000201c, 0x0000201d]), + 'BracketRight': LayoutEntry([0x0000005d, 0x0000007d, 0x00002018, 0x00002019]), + 'Backslash': LayoutEntry([0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb]), + 'Semicolon': LayoutEntry([0x0000003b, 0x0000003a, 0x00002026, 0x000000da]), + 'Quote': LayoutEntry([0x00000027, 0x00000022, 0x000000e6, 0x000000c6]), + 'Backquote': LayoutEntry([0x00000060, 0x0000007e, 0x01000000, 0x00000060]), + 'Comma': LayoutEntry([0x0000002c, 0x0000003c, 0x00002264, 0x000000af]), + 'Period': LayoutEntry([0x0000002e, 0x0000003e, 0x00002265, 0x000002d8]), + 'Slash': LayoutEntry([0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), + 'Numpad1': LayoutEntry([0x00000031, 0x00000031, 0x00000031, 0x00000031]), + 'Numpad2': LayoutEntry([0x00000032, 0x00000032, 0x00000032, 0x00000032]), + 'Numpad3': LayoutEntry([0x00000033, 0x00000033, 0x00000033, 0x00000033]), + 'Numpad4': LayoutEntry([0x00000034, 0x00000034, 0x00000034, 0x00000034]), + 'Numpad5': LayoutEntry([0x00000035, 0x00000035, 0x00000035, 0x00000035]), + 'Numpad6': LayoutEntry([0x00000036, 0x00000036, 0x00000036, 0x00000036]), + 'Numpad7': LayoutEntry([0x00000037, 0x00000037, 0x00000037, 0x00000037]), + 'Numpad8': LayoutEntry([0x00000038, 0x00000038, 0x00000038, 0x00000038]), + 'Numpad9': LayoutEntry([0x00000039, 0x00000039, 0x00000039, 0x00000039]), + 'Numpad0': LayoutEntry([0x00000030, 0x00000030, 0x00000030, 0x00000030]), + 'NumpadDecimal': LayoutEntry([0x0000002e, 0x0000002e, 0x0000002e, 0x0000002e]), + 'IntlBackslash': LayoutEntry([0x000000a7, 0x000000b1, 0x000000a7, 0x000000b1]), + 'NumpadEqual': LayoutEntry([0x0000003d, 0x0000003d, 0x0000003d, 0x0000003d]), + 'AudioVolumeUp': LayoutEntry([0x01000000, 0x0000003d, 0x01000000, 0x0000003d]), + }, + ), + + LayoutInfo( + name: 'ko', + platform: LayoutPlatform.darwin, + mapping: { + 'KeyA': LayoutEntry([0x00003141, 0x00003141, 0x00000061, 0x00000041]), + 'KeyB': LayoutEntry([0x00003160, 0x00003160, 0x00000062, 0x00000042]), + 'KeyC': LayoutEntry([0x0000314a, 0x0000314a, 0x00000063, 0x00000043]), + 'KeyD': LayoutEntry([0x00003147, 0x00003147, 0x00000064, 0x00000044]), + 'KeyE': LayoutEntry([0x00003137, 0x00003138, 0x00000065, 0x00000045]), + 'KeyF': LayoutEntry([0x00003139, 0x00003139, 0x00000066, 0x00000046]), + 'KeyG': LayoutEntry([0x0000314e, 0x0000314e, 0x00000067, 0x00000047]), + 'KeyH': LayoutEntry([0x00003157, 0x00003157, 0x00000068, 0x00000048]), + 'KeyI': LayoutEntry([0x00003151, 0x00003151, 0x00000069, 0x00000049]), + 'KeyJ': LayoutEntry([0x00003153, 0x00003153, 0x0000006a, 0x0000004a]), + 'KeyK': LayoutEntry([0x0000314f, 0x0000314f, 0x0000006b, 0x0000004b]), + 'KeyL': LayoutEntry([0x00003163, 0x00003163, 0x0000006c, 0x0000004c]), + 'KeyM': LayoutEntry([0x00003161, 0x00003161, 0x0000006d, 0x0000004d]), + 'KeyN': LayoutEntry([0x0000315c, 0x0000315c, 0x0000006e, 0x0000004e]), + 'KeyO': LayoutEntry([0x00003150, 0x00003152, 0x0000006f, 0x0000004f]), + 'KeyP': LayoutEntry([0x00003154, 0x00003156, 0x00000070, 0x00000050]), + 'KeyQ': LayoutEntry([0x00003142, 0x00003143, 0x00000071, 0x00000051]), + 'KeyR': LayoutEntry([0x00003131, 0x00003132, 0x00000072, 0x00000052]), + 'KeyS': LayoutEntry([0x00003134, 0x00003134, 0x00000073, 0x00000053]), + 'KeyT': LayoutEntry([0x00003145, 0x00003146, 0x00000074, 0x00000054]), + 'KeyU': LayoutEntry([0x00003155, 0x00003155, 0x00000075, 0x00000055]), + 'KeyV': LayoutEntry([0x0000314d, 0x0000314d, 0x00000076, 0x00000056]), + 'KeyW': LayoutEntry([0x00003148, 0x00003149, 0x00000077, 0x00000057]), + 'KeyX': LayoutEntry([0x0000314c, 0x0000314c, 0x00000078, 0x00000058]), + 'KeyY': LayoutEntry([0x0000315b, 0x0000315b, 0x00000079, 0x00000059]), + 'KeyZ': LayoutEntry([0x0000314b, 0x0000314b, 0x0000007a, 0x0000005a]), + 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x00000031, 0x00000021]), + 'Digit2': LayoutEntry([0x00000032, 0x00000040, 0x00000032, 0x00000040]), + 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x00000033, 0x00000023]), + 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x00000034, 0x00000024]), + 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x00000035, 0x00000025]), + 'Digit6': LayoutEntry([0x00000036, 0x0000005e, 0x00000036, 0x0000005e]), + 'Digit7': LayoutEntry([0x00000037, 0x00000026, 0x00000037, 0x00000026]), + 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x00000038, 0x0000002a]), + 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x00000039, 0x00000028]), + 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x00000030, 0x00000029]), + 'Escape': LayoutEntry([0x01000000, 0x01000000, 0x01000000, 0x0000200c]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), + 'Minus': LayoutEntry([0x0000002d, 0x0000005f, 0x0000002d, 0x0000005f]), + 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x0000003d, 0x0000002b]), + 'BracketLeft': LayoutEntry([0x0000005b, 0x0000007b, 0x0000005b, 0x0000007b]), + 'BracketRight': LayoutEntry([0x0000005d, 0x0000007d, 0x0000005d, 0x0000007d]), + 'Backslash': LayoutEntry([0x0000005c, 0x0000007c, 0x0000005c, 0x0000007c]), + 'Semicolon': LayoutEntry([0x0000003b, 0x0000003a, 0x0000003b, 0x0000003a]), + 'Quote': LayoutEntry([0x00000027, 0x00000022, 0x00000027, 0x00000022]), + 'Backquote': LayoutEntry([0x000020a9, 0x0000007e, 0x00000060, 0x0000007e]), + 'Comma': LayoutEntry([0x0000002c, 0x0000003c, 0x0000002c, 0x0000003c]), + 'Period': LayoutEntry([0x0000002e, 0x0000003e, 0x0000002e, 0x0000003e]), + 'Slash': LayoutEntry([0x0000002f, 0x0000003f, 0x0000002f, 0x0000003f]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), + 'Numpad1': LayoutEntry([0x00000031, 0x00000031, 0x00000031, 0x00000031]), + 'Numpad2': LayoutEntry([0x00000032, 0x00000032, 0x00000032, 0x00000032]), + 'Numpad3': LayoutEntry([0x00000033, 0x00000033, 0x00000033, 0x00000033]), + 'Numpad4': LayoutEntry([0x00000034, 0x00000034, 0x00000034, 0x00000034]), + 'Numpad5': LayoutEntry([0x00000035, 0x00000035, 0x00000035, 0x00000035]), + 'Numpad6': LayoutEntry([0x00000036, 0x00000036, 0x00000036, 0x00000036]), + 'Numpad7': LayoutEntry([0x00000037, 0x00000037, 0x00000037, 0x00000037]), + 'Numpad8': LayoutEntry([0x00000038, 0x00000038, 0x00000038, 0x00000038]), + 'Numpad9': LayoutEntry([0x00000039, 0x00000039, 0x00000039, 0x00000039]), + 'Numpad0': LayoutEntry([0x00000030, 0x00000030, 0x00000030, 0x00000030]), + 'NumpadDecimal': LayoutEntry([0x0000002e, 0x0000002e, 0x0000002e, 0x0000002e]), + 'IntlBackslash': LayoutEntry([0x000000a7, 0x000000b1, 0x000000a7, 0x000000b1]), + 'NumpadEqual': LayoutEntry([0x0000003d, 0x0000003d, 0x0000003d, 0x0000003d]), + 'AudioVolumeUp': LayoutEntry([0x01000000, 0x0000003d, 0x01000000, 0x0000003d]), + }, + ), + + LayoutInfo( + name: 'no', + platform: LayoutPlatform.win, + mapping: { + 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x01000000, 0x01000000]), + 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x01000000]), + 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x01000000, 0x01000000]), + 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x01000000, 0x01000000]), + 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000020ac, 0x01000000]), + 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x01000000, 0x01000000]), + 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x01000000, 0x01000000]), + 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x01000000]), + 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x01000000]), + 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x01000000]), + 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x01000000]), + 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x01000000, 0x01000000]), + 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x000000b5, 0x01000000]), + 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x01000000]), + 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x01000000, 0x01000000]), + 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x01000000]), + 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x01000000, 0x01000000]), + 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x01000000, 0x01000000]), + 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x01000000, 0x01000000]), + 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x01000000, 0x01000000]), + 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x01000000]), + 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x01000000]), + 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x01000000, 0x01000000]), + 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x01000000, 0x01000000]), + 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x01000000, 0x01000000]), + 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x01000000]), + 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x01000000, 0x01000000]), + 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x00000040, 0x01000000]), + 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x000000a3, 0x01000000]), + 'Digit4': LayoutEntry([0x00000034, 0x000000a4, 0x00000024, 0x01000000]), + 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x000020ac, 0x01000000]), + 'Digit6': LayoutEntry([0x00000036, 0x00000026, 0x01000000, 0x01000000]), + 'Digit7': LayoutEntry([0x00000037, 0x0000002f, 0x0000007b, 0x01000000]), + 'Digit8': LayoutEntry([0x00000038, 0x00000028, 0x0000005b, 0x01000000]), + 'Digit9': LayoutEntry([0x00000039, 0x00000029, 0x0000005d, 0x01000000]), + 'Digit0': LayoutEntry([0x00000030, 0x0000003d, 0x0000007d, 0x01000000]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), + 'Minus': LayoutEntry([0x0000002b, 0x0000003f, 0x01000000, 0x01000000]), + 'Equal': LayoutEntry([0x0000005c, 0x00000060, 0x000000b4, 0x01000000]), + 'BracketLeft': LayoutEntry([0x000000e5, 0x000000c5, 0x01000000, 0x01000000]), + 'BracketRight': LayoutEntry([0x000000a8, 0x0000005e, 0x0000007e, 0x01000000]), + 'Backslash': LayoutEntry([0x00000027, 0x0000002a, 0x01000000, 0x01000000]), + 'Semicolon': LayoutEntry([0x000000f8, 0x000000d8, 0x01000000, 0x01000000]), + 'Quote': LayoutEntry([0x000000e6, 0x000000c6, 0x01000000, 0x01000000]), + 'Backquote': LayoutEntry([0x0000007c, 0x000000a7, 0x01000000, 0x01000000]), + 'Comma': LayoutEntry([0x0000002c, 0x0000003b, 0x01000000, 0x01000000]), + 'Period': LayoutEntry([0x0000002e, 0x0000003a, 0x01000000, 0x01000000]), + 'Slash': LayoutEntry([0x0000002d, 0x0000005f, 0x01000000, 0x01000000]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), + 'IntlBackslash': LayoutEntry([0x0000003c, 0x0000003e, 0x01000000, 0x01000000]), + }, + ), + + LayoutInfo( + name: 'pl', + platform: LayoutPlatform.darwin, + mapping: { + 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x00000105, 0x00000104]), + 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x0000013c, 0x00000171]), + 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x00000107, 0x00000106]), + 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x00002202, 0x0000017d]), + 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x00000119, 0x00000118]), + 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x00000144, 0x0000017e]), + 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x000000a9, 0x0000016a]), + 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x00000137, 0x000000d3]), + 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x00000165]), + 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x00002206, 0x000000d4]), + 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x0000017b, 0x0000016b]), + 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x00000142, 0x00000141]), + 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x00000136, 0x00000173]), + 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x00000144, 0x00000143]), + 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x000000f3, 0x000000d3]), + 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x0000013b, 0x00000142]), + 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x0000014c, 0x00000151]), + 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x000000ae, 0x000000a3]), + 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x0000015b, 0x0000015a]), + 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x00002020, 0x0000015b]), + 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x00000164]), + 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x0000221a, 0x000025ca]), + 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x00002211, 0x0000201e]), + 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x0000017a, 0x00000179]), + 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x0000012b, 0x000000c1]), + 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x0000017c, 0x0000017b]), + 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x00000143, 0x00000155]), + 'Digit2': LayoutEntry([0x00000032, 0x00000040, 0x00002122, 0x00000158]), + 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x000020ac, 0x00002039]), + 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x000000df, 0x0000203a]), + 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x0000012f, 0x00000159]), + 'Digit6': LayoutEntry([0x00000036, 0x0000005e, 0x000000a7, 0x00000156]), + 'Digit7': LayoutEntry([0x00000037, 0x00000026, 0x000000b6, 0x00000157]), + 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x00002022, 0x000000b0]), + 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x0000013d, 0x00000160]), + 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x0000013e, 0x0000201a]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), + 'Minus': LayoutEntry([0x0000002d, 0x0000005f, 0x00002013, 0x00002014]), + 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x00002260, 0x0000012a]), + 'BracketLeft': LayoutEntry([0x0000005b, 0x0000007b, 0x0000201e, 0x0000201d]), + 'BracketRight': LayoutEntry([0x0000005d, 0x0000007d, 0x0000201a, 0x00002019]), + 'Backslash': LayoutEntry([0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb]), + 'Semicolon': LayoutEntry([0x0000003b, 0x0000003a, 0x00002026, 0x000000da]), + 'Quote': LayoutEntry([0x00000027, 0x00000022, 0x0000013a, 0x00000123]), + 'Backquote': LayoutEntry([0x00000060, 0x0000007e, 0x01000000, 0x00000154]), + 'Comma': LayoutEntry([0x0000002c, 0x0000003c, 0x00002264, 0x000000dd]), + 'Period': LayoutEntry([0x0000002e, 0x0000003e, 0x00002265, 0x000000fd]), + 'Slash': LayoutEntry([0x0000002f, 0x0000003f, 0x000000f7, 0x00000146]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), + 'Numpad1': LayoutEntry([0x00000031, 0x00000031, 0x00000031, 0x00000031]), + 'Numpad2': LayoutEntry([0x00000032, 0x00000032, 0x00000032, 0x00000032]), + 'Numpad3': LayoutEntry([0x00000033, 0x00000033, 0x00000033, 0x00000033]), + 'Numpad4': LayoutEntry([0x00000034, 0x00000034, 0x00000034, 0x00000034]), + 'Numpad5': LayoutEntry([0x00000035, 0x00000035, 0x00000035, 0x00000035]), + 'Numpad6': LayoutEntry([0x00000036, 0x00000036, 0x00000036, 0x00000036]), + 'Numpad7': LayoutEntry([0x00000037, 0x00000037, 0x00000037, 0x00000037]), + 'Numpad8': LayoutEntry([0x00000038, 0x00000038, 0x00000038, 0x00000038]), + 'Numpad9': LayoutEntry([0x00000039, 0x00000039, 0x00000039, 0x00000039]), + 'Numpad0': LayoutEntry([0x00000030, 0x00000030, 0x00000030, 0x00000030]), + 'NumpadDecimal': LayoutEntry([0x0000002e, 0x0000002e, 0x0000002e, 0x0000002e]), + 'IntlBackslash': LayoutEntry([0x000000a7, 0x000000a3, 0x000000ac, 0x000000ac]), + 'NumpadEqual': LayoutEntry([0x0000003d, 0x0000003d, 0x0000003d, 0x0000003d]), + 'AudioVolumeUp': LayoutEntry([0x01000000, 0x0000003d, 0x01000000, 0x0000003d]), + }, + ), + + LayoutInfo( + name: 'pl', + platform: LayoutPlatform.win, + mapping: { + 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x00000105, 0x00000104]), + 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x01000000]), + 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x00000107, 0x00000106]), + 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x01000000, 0x01000000]), + 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x00000119, 0x00000118]), + 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x01000000, 0x01000000]), + 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x01000000, 0x01000000]), + 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x01000000]), + 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x01000000]), + 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x01000000]), + 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x01000000]), + 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x00000142, 0x00000141]), + 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x01000000, 0x01000000]), + 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x00000144, 0x00000143]), + 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x000000f3, 0x000000d3]), + 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x01000000]), + 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x01000000, 0x01000000]), + 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x01000000, 0x01000000]), + 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x0000015b, 0x0000015a]), + 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x01000000, 0x01000000]), + 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x000020ac, 0x01000000]), + 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x01000000]), + 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x01000000, 0x01000000]), + 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x0000017a, 0x00000179]), + 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x01000000, 0x01000000]), + 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x0000017c, 0x0000017b]), + 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x01000000, 0x01000000]), + 'Digit2': LayoutEntry([0x00000032, 0x00000040, 0x01000000, 0x01000000]), + 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x01000000, 0x01000000]), + 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x01000000, 0x01000000]), + 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x01000000, 0x01000000]), + 'Digit6': LayoutEntry([0x00000036, 0x0000005e, 0x01000000, 0x01000000]), + 'Digit7': LayoutEntry([0x00000037, 0x00000026, 0x01000000, 0x01000000]), + 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x01000000, 0x01000000]), + 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x01000000, 0x01000000]), + 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x01000000, 0x01000000]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), + 'Minus': LayoutEntry([0x0000002d, 0x0000005f, 0x01000000, 0x01000000]), + 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x01000000, 0x01000000]), + 'BracketLeft': LayoutEntry([0x0000005b, 0x0000007b, 0x01000000, 0x01000000]), + 'BracketRight': LayoutEntry([0x0000005d, 0x0000007d, 0x01000000, 0x01000000]), + 'Backslash': LayoutEntry([0x0000005c, 0x0000007c, 0x01000000, 0x01000000]), + 'Semicolon': LayoutEntry([0x0000003b, 0x0000003a, 0x01000000, 0x01000000]), + 'Quote': LayoutEntry([0x00000027, 0x00000022, 0x01000000, 0x01000000]), + 'Backquote': LayoutEntry([0x00000060, 0x0000007e, 0x01000000, 0x01000000]), + 'Comma': LayoutEntry([0x0000002c, 0x0000003c, 0x01000000, 0x01000000]), + 'Period': LayoutEntry([0x0000002e, 0x0000003e, 0x01000000, 0x01000000]), + 'Slash': LayoutEntry([0x0000002f, 0x0000003f, 0x01000000, 0x01000000]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), + 'IntlBackslash': LayoutEntry([0x0000005c, 0x0000007c, 0x01000000, 0x01000000]), + }, + ), + + LayoutInfo( + name: 'pt-br', + platform: LayoutPlatform.win, + mapping: { + 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x01000000, 0x01000000]), + 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x01000000]), + 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x000020a2, 0x01000000]), + 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x01000000, 0x01000000]), + 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000000b0, 0x01000000]), + 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x01000000, 0x01000000]), + 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x01000000, 0x01000000]), + 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x01000000]), + 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x01000000]), + 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x01000000]), + 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x01000000]), + 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x01000000, 0x01000000]), + 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x01000000, 0x01000000]), + 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x01000000]), + 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x01000000, 0x01000000]), + 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x01000000]), + 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x0000002f, 0x01000000]), + 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x01000000, 0x01000000]), + 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x01000000, 0x01000000]), + 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x01000000, 0x01000000]), + 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x01000000]), + 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x01000000]), + 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x0000003f, 0x01000000]), + 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x01000000, 0x01000000]), + 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x01000000, 0x01000000]), + 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x01000000]), + 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x000000b9, 0x01000000]), + 'Digit2': LayoutEntry([0x00000032, 0x00000040, 0x000000b2, 0x01000000]), + 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x000000b3, 0x01000000]), + 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x000000a3, 0x01000000]), + 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x000000a2, 0x01000000]), + 'Digit6': LayoutEntry([0x00000036, 0x000000a8, 0x000000ac, 0x01000000]), + 'Digit7': LayoutEntry([0x00000037, 0x00000026, 0x01000000, 0x01000000]), + 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x01000000, 0x01000000]), + 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x01000000, 0x01000000]), + 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x01000000, 0x01000000]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), + 'Minus': LayoutEntry([0x0000002d, 0x0000005f, 0x01000000, 0x01000000]), + 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x000000a7, 0x01000000]), + 'BracketLeft': LayoutEntry([0x000000b4, 0x00000060, 0x01000000, 0x01000000]), + 'BracketRight': LayoutEntry([0x0000005b, 0x0000007b, 0x000000aa, 0x01000000]), + 'Backslash': LayoutEntry([0x0000005d, 0x0000007d, 0x000000ba, 0x01000000]), + 'Semicolon': LayoutEntry([0x000000e7, 0x000000c7, 0x01000000, 0x01000000]), + 'Quote': LayoutEntry([0x0000007e, 0x0000005e, 0x01000000, 0x01000000]), + 'Backquote': LayoutEntry([0x00000027, 0x00000022, 0x01000000, 0x01000000]), + 'Comma': LayoutEntry([0x0000002c, 0x0000003c, 0x01000000, 0x01000000]), + 'Period': LayoutEntry([0x0000002e, 0x0000003e, 0x01000000, 0x01000000]), + 'Slash': LayoutEntry([0x0000003b, 0x0000003a, 0x01000000, 0x01000000]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), + 'IntlBackslash': LayoutEntry([0x0000005c, 0x0000007c, 0x01000000, 0x01000000]), + 'NumpadComma': LayoutEntry([0x0000002e, 0x0000002e, 0x01000000, 0x01000000]), + 'IntlRo': LayoutEntry([0x0000002f, 0x0000003f, 0x000000b0, 0x01000000]), + }, + ), + + LayoutInfo( + name: 'pt', + platform: LayoutPlatform.darwin, + mapping: { + 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x000000e5, 0x000000c5]), + 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x0000222b, 0x00000131]), + 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x000000e7, 0x000000c7]), + 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x00002202, 0x000000ce]), + 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x01000000, 0x000000b4]), + 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x00000192, 0x000000cf]), + 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x000000a9, 0x000002dd]), + 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x000002d9, 0x000000d3]), + 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x000002c6]), + 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x00002206, 0x000000d4]), + 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x000002da, 0x0000f8ff]), + 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x000000ac, 0x000000d2]), + 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x000000b5, 0x000000c2]), + 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x000002dc]), + 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8]), + 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x000003c0, 0x0000220f]), + 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x00000153, 0x00000152]), + 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x000000ae, 0x00002030]), + 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x000000df, 0x000000cd]), + 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x00002020, 0x000002c7]), + 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x000000a8]), + 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x0000221a, 0x000025ca]), + 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x00002211, 0x0000201e]), + 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x00002248, 0x000002db]), + 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x000000a5, 0x000000c1]), + 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x000003a9, 0x000000b8]), + 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x000000a1, 0x00002044]), + 'Digit2': LayoutEntry([0x00000032, 0x00000040, 0x00002122, 0x000020ac]), + 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x000000a3, 0x00002039]), + 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x000000a2, 0x0000203a]), + 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x0000221e, 0x0000fb01]), + 'Digit6': LayoutEntry([0x00000036, 0x01000000, 0x000000a7, 0x0000fb02]), + 'Digit7': LayoutEntry([0x00000037, 0x00000026, 0x000000b6, 0x00002021]), + 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x00002022, 0x000000b0]), + 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x000000aa, 0x000000b7]), + 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x000000ba, 0x0000201a]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), + 'Minus': LayoutEntry([0x0000002d, 0x0000005f, 0x00002013, 0x00002014]), + 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x00002260, 0x000000b1]), + 'BracketLeft': LayoutEntry([0x0000005b, 0x0000007b, 0x0000201c, 0x0000201d]), + 'BracketRight': LayoutEntry([0x0000005d, 0x0000007d, 0x00002018, 0x00002019]), + 'Backslash': LayoutEntry([0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb]), + 'Semicolon': LayoutEntry([0x0000003b, 0x0000003a, 0x00002026, 0x000000da]), + 'Quote': LayoutEntry([0x01000000, 0x01000000, 0x000000e6, 0x000000c6]), + 'Backquote': LayoutEntry([0x01000000, 0x01000000, 0x01000000, 0x00000060]), + 'Comma': LayoutEntry([0x0000002c, 0x0000003c, 0x00002264, 0x000000af]), + 'Period': LayoutEntry([0x0000002e, 0x0000003e, 0x00002265, 0x000002d8]), + 'Slash': LayoutEntry([0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), + 'Numpad1': LayoutEntry([0x00000031, 0x00000031, 0x00000031, 0x00000031]), + 'Numpad2': LayoutEntry([0x00000032, 0x00000032, 0x00000032, 0x00000032]), + 'Numpad3': LayoutEntry([0x00000033, 0x00000033, 0x00000033, 0x00000033]), + 'Numpad4': LayoutEntry([0x00000034, 0x00000034, 0x00000034, 0x00000034]), + 'Numpad5': LayoutEntry([0x00000035, 0x00000035, 0x00000035, 0x00000035]), + 'Numpad6': LayoutEntry([0x00000036, 0x00000036, 0x00000036, 0x00000036]), + 'Numpad7': LayoutEntry([0x00000037, 0x00000037, 0x00000037, 0x00000037]), + 'Numpad8': LayoutEntry([0x00000038, 0x00000038, 0x00000038, 0x00000038]), + 'Numpad9': LayoutEntry([0x00000039, 0x00000039, 0x00000039, 0x00000039]), + 'Numpad0': LayoutEntry([0x00000030, 0x00000030, 0x00000030, 0x00000030]), + 'NumpadDecimal': LayoutEntry([0x0000002e, 0x0000002e, 0x0000002e, 0x0000002e]), + 'IntlBackslash': LayoutEntry([0x000000a7, 0x000000b1, 0x000000a7, 0x000000b1]), + 'NumpadEqual': LayoutEntry([0x0000003d, 0x0000003d, 0x0000003d, 0x0000003d]), + 'AudioVolumeUp': LayoutEntry([0x01000000, 0x0000003d, 0x01000000, 0x0000003d]), + }, + ), + + LayoutInfo( + name: 'pt', + platform: LayoutPlatform.win, + mapping: { + 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x01000000, 0x01000000]), + 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x01000000]), + 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x01000000, 0x01000000]), + 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x01000000, 0x01000000]), + 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000020ac, 0x01000000]), + 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x01000000, 0x01000000]), + 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x01000000, 0x01000000]), + 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x01000000]), + 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x01000000]), + 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x01000000]), + 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x01000000]), + 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x01000000, 0x01000000]), + 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x01000000, 0x01000000]), + 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x01000000]), + 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x01000000, 0x01000000]), + 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x01000000]), + 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x01000000, 0x01000000]), + 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x01000000, 0x01000000]), + 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x01000000, 0x01000000]), + 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x01000000, 0x01000000]), + 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x01000000]), + 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x01000000]), + 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x01000000, 0x01000000]), + 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x01000000, 0x01000000]), + 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x01000000, 0x01000000]), + 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x01000000]), + 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x01000000, 0x01000000]), + 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x00000040, 0x01000000]), + 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x000000a3, 0x01000000]), + 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x000000a7, 0x01000000]), + 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x000020ac, 0x01000000]), + 'Digit6': LayoutEntry([0x00000036, 0x00000026, 0x01000000, 0x01000000]), + 'Digit7': LayoutEntry([0x00000037, 0x0000002f, 0x0000007b, 0x01000000]), + 'Digit8': LayoutEntry([0x00000038, 0x00000028, 0x0000005b, 0x01000000]), + 'Digit9': LayoutEntry([0x00000039, 0x00000029, 0x0000005d, 0x01000000]), + 'Digit0': LayoutEntry([0x00000030, 0x0000003d, 0x0000007d, 0x01000000]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), + 'Minus': LayoutEntry([0x00000027, 0x0000003f, 0x01000000, 0x01000000]), + 'Equal': LayoutEntry([0x000000ab, 0x000000bb, 0x01000000, 0x01000000]), + 'BracketLeft': LayoutEntry([0x0000002b, 0x0000002a, 0x000000a8, 0x01000000]), + 'BracketRight': LayoutEntry([0x000000b4, 0x00000060, 0x0000005d, 0x01000000]), + 'Backslash': LayoutEntry([0x0000007e, 0x0000005e, 0x01000000, 0x01000000]), + 'Semicolon': LayoutEntry([0x000000e7, 0x000000c7, 0x01000000, 0x01000000]), + 'Quote': LayoutEntry([0x000000ba, 0x000000aa, 0x01000000, 0x01000000]), + 'Backquote': LayoutEntry([0x0000005c, 0x0000007c, 0x01000000, 0x01000000]), + 'Comma': LayoutEntry([0x0000002c, 0x0000003b, 0x01000000, 0x01000000]), + 'Period': LayoutEntry([0x0000002e, 0x0000003a, 0x01000000, 0x01000000]), + 'Slash': LayoutEntry([0x0000002d, 0x0000005f, 0x01000000, 0x01000000]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), + 'IntlBackslash': LayoutEntry([0x0000003c, 0x0000003e, 0x01000000, 0x01000000]), + }, + ), + + LayoutInfo( + name: 'ru', + platform: LayoutPlatform.darwin, + mapping: { + 'KeyA': LayoutEntry([0x00000444, 0x00000424, 0x00000192, 0x00000192]), + 'KeyB': LayoutEntry([0x00000438, 0x00000418, 0x00000438, 0x00000418]), + 'KeyC': LayoutEntry([0x00000441, 0x00000421, 0x00002260, 0x00002260]), + 'KeyD': LayoutEntry([0x00000432, 0x00000412, 0x0000045b, 0x0000040b]), + 'KeyE': LayoutEntry([0x00000443, 0x00000423, 0x0000045c, 0x0000040c]), + 'KeyF': LayoutEntry([0x00000430, 0x00000410, 0x000000f7, 0x000000f7]), + 'KeyG': LayoutEntry([0x0000043f, 0x0000041f, 0x000000a9, 0x000000a9]), + 'KeyH': LayoutEntry([0x00000440, 0x00000420, 0x000020bd, 0x000020bd]), + 'KeyI': LayoutEntry([0x00000448, 0x00000428, 0x00000455, 0x00000405]), + 'KeyJ': LayoutEntry([0x0000043e, 0x0000041e, 0x000000b0, 0x00002022]), + 'KeyK': LayoutEntry([0x0000043b, 0x0000041b, 0x00000459, 0x00000409]), + 'KeyL': LayoutEntry([0x00000434, 0x00000414, 0x00002206, 0x00002206]), + 'KeyM': LayoutEntry([0x0000044c, 0x0000042c, 0x0000007e, 0x0000007e]), + 'KeyN': LayoutEntry([0x00000442, 0x00000422, 0x00002122, 0x00002122]), + 'KeyO': LayoutEntry([0x00000449, 0x00000429, 0x0000045e, 0x0000040e]), + 'KeyP': LayoutEntry([0x00000437, 0x00000417, 0x00002018, 0x00002019]), + 'KeyQ': LayoutEntry([0x00000439, 0x00000419, 0x00000458, 0x00000408]), + 'KeyR': LayoutEntry([0x0000043a, 0x0000041a, 0x000000ae, 0x000000ae]), + 'KeyS': LayoutEntry([0x0000044b, 0x0000042b, 0x0000044b, 0x0000042b]), + 'KeyT': LayoutEntry([0x00000435, 0x00000415, 0x00002020, 0x00002020]), + 'KeyU': LayoutEntry([0x00000433, 0x00000413, 0x00000453, 0x00000403]), + 'KeyV': LayoutEntry([0x0000043c, 0x0000041c, 0x000000b5, 0x000000b5]), + 'KeyW': LayoutEntry([0x00000446, 0x00000426, 0x0000045f, 0x0000040f]), + 'KeyX': LayoutEntry([0x00000447, 0x00000427, 0x00002248, 0x00002248]), + 'KeyY': LayoutEntry([0x0000043d, 0x0000041d, 0x0000045a, 0x0000040a]), + 'KeyZ': LayoutEntry([0x0000044f, 0x0000042f, 0x00000452, 0x00000402]), + 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x00000021, 0x0000007c]), + 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x00000040, 0x00000022]), + 'Digit3': LayoutEntry([0x00000033, 0x00002116, 0x00000023, 0x000000a3]), + 'Digit4': LayoutEntry([0x00000034, 0x00000025, 0x00000024, 0x000020ac]), + 'Digit5': LayoutEntry([0x00000035, 0x0000003a, 0x00000025, 0x0000221e]), + 'Digit6': LayoutEntry([0x00000036, 0x0000002c, 0x0000005e, 0x000000ac]), + 'Digit7': LayoutEntry([0x00000037, 0x0000002e, 0x00000026, 0x000000b6]), + 'Digit8': LayoutEntry([0x00000038, 0x0000003b, 0x0000002a, 0x0000221a]), + 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x0000007b, 0x00000027]), + 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x0000007d, 0x00000060]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), + 'Minus': LayoutEntry([0x0000002d, 0x0000005f, 0x00002013, 0x00002014]), + 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x000000bb, 0x000000ab]), + 'BracketLeft': LayoutEntry([0x00000445, 0x00000425, 0x0000201c, 0x0000201d]), + 'BracketRight': LayoutEntry([0x0000044a, 0x0000042a, 0x0000044a, 0x0000042a]), + 'Backslash': LayoutEntry([0x00000451, 0x00000401, 0x00000451, 0x00000401]), + 'Semicolon': LayoutEntry([0x00000436, 0x00000416, 0x00002026, 0x00002026]), + 'Quote': LayoutEntry([0x0000044d, 0x0000042d, 0x0000044d, 0x0000042d]), + 'Backquote': LayoutEntry([0x0000005d, 0x0000005b, 0x0000005d, 0x0000005b]), + 'Comma': LayoutEntry([0x00000431, 0x00000411, 0x00002264, 0x0000003c]), + 'Period': LayoutEntry([0x0000044e, 0x0000042e, 0x00002265, 0x0000003e]), + 'Slash': LayoutEntry([0x0000002f, 0x0000003f, 0x0000201c, 0x0000201e]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), + 'Numpad1': LayoutEntry([0x00000031, 0x00000031, 0x00000031, 0x00000031]), + 'Numpad2': LayoutEntry([0x00000032, 0x00000032, 0x00000032, 0x00000032]), + 'Numpad3': LayoutEntry([0x00000033, 0x00000033, 0x00000033, 0x00000033]), + 'Numpad4': LayoutEntry([0x00000034, 0x00000034, 0x00000034, 0x00000034]), + 'Numpad5': LayoutEntry([0x00000035, 0x00000035, 0x00000035, 0x00000035]), + 'Numpad6': LayoutEntry([0x00000036, 0x00000036, 0x00000036, 0x00000036]), + 'Numpad7': LayoutEntry([0x00000037, 0x00000037, 0x00000037, 0x00000037]), + 'Numpad8': LayoutEntry([0x00000038, 0x00000038, 0x00000038, 0x00000038]), + 'Numpad9': LayoutEntry([0x00000039, 0x00000039, 0x00000039, 0x00000039]), + 'Numpad0': LayoutEntry([0x00000030, 0x00000030, 0x00000030, 0x00000030]), + 'NumpadDecimal': LayoutEntry([0x0000002c, 0x0000002e, 0x0000002c, 0x0000002c]), + 'IntlBackslash': LayoutEntry([0x0000003e, 0x0000003c, 0x000000a7, 0x000000b1]), + 'NumpadEqual': LayoutEntry([0x0000003d, 0x0000003d, 0x0000003d, 0x0000003d]), + 'AudioVolumeUp': LayoutEntry([0x01000000, 0x0000003d, 0x01000000, 0x01000000]), + }, + ), + + LayoutInfo( + name: 'ru', + platform: LayoutPlatform.linux, + mapping: { + 'KeyA': LayoutEntry([0x00000444, 0x00000424, 0x00000444, 0x00000424]), + 'KeyB': LayoutEntry([0x00000438, 0x00000418, 0x00000438, 0x00000418]), + 'KeyC': LayoutEntry([0x00000441, 0x00000421, 0x00000441, 0x00000421]), + 'KeyD': LayoutEntry([0x00000432, 0x00000412, 0x00000432, 0x00000412]), + 'KeyE': LayoutEntry([0x00000443, 0x00000423, 0x00000443, 0x00000423]), + 'KeyF': LayoutEntry([0x00000430, 0x00000410, 0x00000430, 0x00000410]), + 'KeyG': LayoutEntry([0x0000043f, 0x0000041f, 0x0000043f, 0x0000041f]), + 'KeyH': LayoutEntry([0x00000440, 0x00000420, 0x00000440, 0x00000420]), + 'KeyI': LayoutEntry([0x00000448, 0x00000428, 0x00000448, 0x00000428]), + 'KeyJ': LayoutEntry([0x0000043e, 0x0000041e, 0x0000043e, 0x0000041e]), + 'KeyK': LayoutEntry([0x0000043b, 0x0000041b, 0x0000043b, 0x0000041b]), + 'KeyL': LayoutEntry([0x00000434, 0x00000414, 0x00000434, 0x00000414]), + 'KeyM': LayoutEntry([0x0000044c, 0x0000042c, 0x0000044c, 0x0000042c]), + 'KeyN': LayoutEntry([0x00000442, 0x00000422, 0x00000442, 0x00000422]), + 'KeyO': LayoutEntry([0x00000449, 0x00000429, 0x00000449, 0x00000429]), + 'KeyP': LayoutEntry([0x00000437, 0x00000417, 0x00000437, 0x00000417]), + 'KeyQ': LayoutEntry([0x00000439, 0x00000419, 0x00000439, 0x00000419]), + 'KeyR': LayoutEntry([0x0000043a, 0x0000041a, 0x0000043a, 0x0000041a]), + 'KeyS': LayoutEntry([0x0000044b, 0x0000042b, 0x0000044b, 0x0000042b]), + 'KeyT': LayoutEntry([0x00000435, 0x00000415, 0x00000435, 0x00000415]), + 'KeyU': LayoutEntry([0x00000433, 0x00000413, 0x00000433, 0x00000413]), + 'KeyV': LayoutEntry([0x0000043c, 0x0000041c, 0x0000043c, 0x0000041c]), + 'KeyW': LayoutEntry([0x00000446, 0x00000426, 0x00000446, 0x00000426]), + 'KeyX': LayoutEntry([0x00000447, 0x00000427, 0x00000447, 0x00000427]), + 'KeyY': LayoutEntry([0x0000043d, 0x0000041d, 0x0000043d, 0x0000041d]), + 'KeyZ': LayoutEntry([0x0000044f, 0x0000042f, 0x0000044f, 0x0000042f]), + 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x00000031, 0x00000021]), + 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x00000032, 0x00000022]), + 'Digit3': LayoutEntry([0x00000033, 0x00002116, 0x00000033, 0x00002116]), + 'Digit4': LayoutEntry([0x00000034, 0x0000003b, 0x00000034, 0x0000003b]), + 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x00000035, 0x00000025]), + 'Digit6': LayoutEntry([0x00000036, 0x0000003a, 0x00000036, 0x0000003a]), + 'Digit7': LayoutEntry([0x00000037, 0x0000003f, 0x00000037, 0x0000003f]), + 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x000020bd, 0x01000000]), + 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x00000039, 0x00000028]), + 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x00000030, 0x00000029]), + 'Enter': LayoutEntry([0x0000000d, 0x0000000d, 0x0000000d, 0x0000000d]), + 'Escape': LayoutEntry([0x0000001b, 0x0000001b, 0x0000001b, 0x0000001b]), + 'Backspace': LayoutEntry([0x00000008, 0x00000008, 0x00000008, 0x00000008]), + 'Tab': LayoutEntry([0x00000009, 0x01000000, 0x00000009, 0x01000000]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), + 'Minus': LayoutEntry([0x0000002d, 0x0000005f, 0x0000002d, 0x0000005f]), + 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x0000003d, 0x0000002b]), + 'BracketLeft': LayoutEntry([0x00000445, 0x00000425, 0x00000445, 0x00000425]), + 'BracketRight': LayoutEntry([0x0000044a, 0x0000042a, 0x0000044a, 0x0000042a]), + 'Backslash': LayoutEntry([0x0000005c, 0x0000002f, 0x0000005c, 0x0000002f]), + 'Semicolon': LayoutEntry([0x00000436, 0x00000416, 0x00000436, 0x00000416]), + 'Quote': LayoutEntry([0x0000044d, 0x0000042d, 0x0000044d, 0x0000042d]), + 'Backquote': LayoutEntry([0x00000451, 0x00000401, 0x00000451, 0x00000401]), + 'Comma': LayoutEntry([0x00000431, 0x00000411, 0x00000431, 0x00000411]), + 'Period': LayoutEntry([0x0000044e, 0x0000042e, 0x0000044e, 0x0000042e]), + 'Slash': LayoutEntry([0x0000002e, 0x0000002c, 0x0000002e, 0x0000002c]), + 'PrintScreen': LayoutEntry([0x01000000, 0x01000000, 0x01000000, 0x01000000]), + 'PageUp': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), + 'Numpad1': LayoutEntry([0x01000000, 0x00000031, 0x01000000, 0x00000031]), + 'Numpad2': LayoutEntry([0x01000000, 0x00000032, 0x01000000, 0x00000032]), + 'Numpad3': LayoutEntry([0x01000000, 0x00000033, 0x01000000, 0x00000033]), + 'Numpad4': LayoutEntry([0x01000000, 0x00000034, 0x01000000, 0x00000034]), + 'Numpad5': LayoutEntry([0x01000000, 0x00000035, 0x01000000, 0x00000035]), + 'Numpad6': LayoutEntry([0x01000000, 0x00000036, 0x01000000, 0x00000036]), + 'Numpad7': LayoutEntry([0x01000000, 0x00000037, 0x01000000, 0x00000037]), + 'Numpad8': LayoutEntry([0x01000000, 0x00000038, 0x01000000, 0x00000038]), + 'Numpad9': LayoutEntry([0x01000000, 0x00000039, 0x01000000, 0x00000039]), + 'Numpad0': LayoutEntry([0x01000000, 0x00000030, 0x01000000, 0x00000030]), + 'NumpadDecimal': LayoutEntry([0x01000000, 0x0000002c, 0x01000000, 0x0000002c]), + 'IntlBackslash': LayoutEntry([0x0000002f, 0x0000007c, 0x0000007c, 0x000000a6]), + 'AltRight': LayoutEntry([0x0000000d, 0x0000000d, 0x0000000d, 0x0000000d]), + 'MetaRight': LayoutEntry([0x0000002e, 0x0000002e, 0x0000002e, 0x0000002e]), + }, + ), + + LayoutInfo( + name: 'ru', + platform: LayoutPlatform.win, + mapping: { + 'KeyA': LayoutEntry([0x00000444, 0x00000424, 0x01000000, 0x01000000]), + 'KeyB': LayoutEntry([0x00000438, 0x00000418, 0x01000000, 0x01000000]), + 'KeyC': LayoutEntry([0x00000441, 0x00000421, 0x01000000, 0x01000000]), + 'KeyD': LayoutEntry([0x00000432, 0x00000412, 0x01000000, 0x01000000]), + 'KeyE': LayoutEntry([0x00000443, 0x00000423, 0x01000000, 0x01000000]), + 'KeyF': LayoutEntry([0x00000430, 0x00000410, 0x01000000, 0x01000000]), + 'KeyG': LayoutEntry([0x0000043f, 0x0000041f, 0x01000000, 0x01000000]), + 'KeyH': LayoutEntry([0x00000440, 0x00000420, 0x01000000, 0x01000000]), + 'KeyI': LayoutEntry([0x00000448, 0x00000428, 0x01000000, 0x01000000]), + 'KeyJ': LayoutEntry([0x0000043e, 0x0000041e, 0x01000000, 0x01000000]), + 'KeyK': LayoutEntry([0x0000043b, 0x0000041b, 0x01000000, 0x01000000]), + 'KeyL': LayoutEntry([0x00000434, 0x00000414, 0x01000000, 0x01000000]), + 'KeyM': LayoutEntry([0x0000044c, 0x0000042c, 0x01000000, 0x01000000]), + 'KeyN': LayoutEntry([0x00000442, 0x00000422, 0x01000000, 0x01000000]), + 'KeyO': LayoutEntry([0x00000449, 0x00000429, 0x01000000, 0x01000000]), + 'KeyP': LayoutEntry([0x00000437, 0x00000417, 0x01000000, 0x01000000]), + 'KeyQ': LayoutEntry([0x00000439, 0x00000419, 0x01000000, 0x01000000]), + 'KeyR': LayoutEntry([0x0000043a, 0x0000041a, 0x01000000, 0x01000000]), + 'KeyS': LayoutEntry([0x0000044b, 0x0000042b, 0x01000000, 0x01000000]), + 'KeyT': LayoutEntry([0x00000435, 0x00000415, 0x01000000, 0x01000000]), + 'KeyU': LayoutEntry([0x00000433, 0x00000413, 0x01000000, 0x01000000]), + 'KeyV': LayoutEntry([0x0000043c, 0x0000041c, 0x01000000, 0x01000000]), + 'KeyW': LayoutEntry([0x00000446, 0x00000426, 0x01000000, 0x01000000]), + 'KeyX': LayoutEntry([0x00000447, 0x00000427, 0x01000000, 0x01000000]), + 'KeyY': LayoutEntry([0x0000043d, 0x0000041d, 0x01000000, 0x01000000]), + 'KeyZ': LayoutEntry([0x0000044f, 0x0000042f, 0x01000000, 0x01000000]), + 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x01000000, 0x01000000]), + 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x01000000, 0x01000000]), + 'Digit3': LayoutEntry([0x00000033, 0x00002116, 0x01000000, 0x01000000]), + 'Digit4': LayoutEntry([0x00000034, 0x0000003b, 0x01000000, 0x01000000]), + 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x01000000, 0x01000000]), + 'Digit6': LayoutEntry([0x00000036, 0x0000003a, 0x01000000, 0x01000000]), + 'Digit7': LayoutEntry([0x00000037, 0x0000003f, 0x01000000, 0x01000000]), + 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x000020bd, 0x01000000]), + 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x01000000, 0x01000000]), + 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x01000000, 0x01000000]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), + 'Minus': LayoutEntry([0x0000002d, 0x0000005f, 0x01000000, 0x01000000]), + 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x01000000, 0x01000000]), + 'BracketLeft': LayoutEntry([0x00000445, 0x00000425, 0x01000000, 0x01000000]), + 'BracketRight': LayoutEntry([0x0000044a, 0x0000042a, 0x01000000, 0x01000000]), + 'Backslash': LayoutEntry([0x0000005c, 0x0000002f, 0x01000000, 0x01000000]), + 'Semicolon': LayoutEntry([0x00000436, 0x00000416, 0x01000000, 0x01000000]), + 'Quote': LayoutEntry([0x0000044d, 0x0000042d, 0x01000000, 0x01000000]), + 'Backquote': LayoutEntry([0x00000451, 0x00000401, 0x01000000, 0x01000000]), + 'Comma': LayoutEntry([0x00000431, 0x00000411, 0x01000000, 0x01000000]), + 'Period': LayoutEntry([0x0000044e, 0x0000042e, 0x01000000, 0x01000000]), + 'Slash': LayoutEntry([0x0000002e, 0x0000002c, 0x01000000, 0x01000000]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), + 'IntlBackslash': LayoutEntry([0x0000005c, 0x0000002f, 0x01000000, 0x01000000]), + }, + ), + + LayoutInfo( + name: 'sv', + platform: LayoutPlatform.darwin, + mapping: { + 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x0000f8ff, 0x000025ca]), + 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x0000203a, 0x000000bb]), + 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x000000e7, 0x000000c7]), + 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x00002202, 0x00002206]), + 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000000e9, 0x000000c9]), + 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x00000192, 0x0000222b]), + 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x000000b8, 0x000000af]), + 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x000002db, 0x000002d8]), + 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x00000131, 0x000002c6]), + 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x0000221a, 0x000000ac]), + 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x000000aa, 0x000000ba]), + 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x0000fb01, 0x0000fb02]), + 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x00002019, 0x0000201d]), + 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x00002018, 0x0000201c]), + 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x00000153, 0x00000152]), + 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x000003c0, 0x0000220f]), + 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x00002022, 0x000000b0]), + 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x000000ae, 0x0000221a]), + 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x000000df, 0x00002211]), + 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x00002020, 0x00002021]), + 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x000000fc, 0x000000dc]), + 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x00002039, 0x000000ab]), + 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x000003a9, 0x000002dd]), + 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x00002248, 0x000002c7]), + 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x000000b5, 0x000002dc]), + 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x000000f7, 0x00002044]), + 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x000000a9, 0x000000a1]), + 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x00000040, 0x0000201d]), + 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x000000a3, 0x000000a5]), + 'Digit4': LayoutEntry([0x00000034, 0x000020ac, 0x00000024, 0x000000a2]), + 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x0000221e, 0x00002030]), + 'Digit6': LayoutEntry([0x00000036, 0x00000026, 0x000000a7, 0x000000b6]), + 'Digit7': LayoutEntry([0x00000037, 0x0000002f, 0x0000007c, 0x0000005c]), + 'Digit8': LayoutEntry([0x00000038, 0x00000028, 0x0000005b, 0x0000007b]), + 'Digit9': LayoutEntry([0x00000039, 0x00000029, 0x0000005d, 0x0000007d]), + 'Digit0': LayoutEntry([0x00000030, 0x0000003d, 0x00002248, 0x00002260]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), + 'Minus': LayoutEntry([0x0000002b, 0x0000003f, 0x000000b1, 0x000000bf]), + 'Equal': LayoutEntry([0x01000000, 0x01000000, 0x000000b4, 0x00000060]), + 'BracketLeft': LayoutEntry([0x000000e5, 0x000000c5, 0x000002d9, 0x000002da]), + 'BracketRight': LayoutEntry([0x01000000, 0x01000000, 0x01000000, 0x0000005e]), + 'Backslash': LayoutEntry([0x00000027, 0x0000002a, 0x00002122, 0x00002019]), + 'Semicolon': LayoutEntry([0x000000f6, 0x000000d6, 0x000000f8, 0x000000d8]), + 'Quote': LayoutEntry([0x000000e4, 0x000000c4, 0x000000e6, 0x000000c6]), + 'Backquote': LayoutEntry([0x0000003c, 0x0000003e, 0x00002264, 0x00002265]), + 'Comma': LayoutEntry([0x0000002c, 0x0000003b, 0x0000201a, 0x0000201e]), + 'Period': LayoutEntry([0x0000002e, 0x0000003a, 0x00002026, 0x000000b7]), + 'Slash': LayoutEntry([0x0000002d, 0x0000005f, 0x00002013, 0x00002014]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), + 'Numpad1': LayoutEntry([0x00000031, 0x00000031, 0x00000031, 0x00000031]), + 'Numpad2': LayoutEntry([0x00000032, 0x00000032, 0x00000032, 0x00000032]), + 'Numpad3': LayoutEntry([0x00000033, 0x00000033, 0x00000033, 0x00000033]), + 'Numpad4': LayoutEntry([0x00000034, 0x00000034, 0x00000034, 0x00000034]), + 'Numpad5': LayoutEntry([0x00000035, 0x00000035, 0x00000035, 0x00000035]), + 'Numpad6': LayoutEntry([0x00000036, 0x00000036, 0x00000036, 0x00000036]), + 'Numpad7': LayoutEntry([0x00000037, 0x00000037, 0x00000037, 0x00000037]), + 'Numpad8': LayoutEntry([0x00000038, 0x00000038, 0x00000038, 0x00000038]), + 'Numpad9': LayoutEntry([0x00000039, 0x00000039, 0x00000039, 0x00000039]), + 'Numpad0': LayoutEntry([0x00000030, 0x00000030, 0x00000030, 0x00000030]), + 'NumpadDecimal': LayoutEntry([0x0000002c, 0x0000002e, 0x0000002c, 0x0000002e]), + 'IntlBackslash': LayoutEntry([0x000000a7, 0x000000b0, 0x000000b6, 0x00002022]), + 'NumpadEqual': LayoutEntry([0x0000003d, 0x0000003d, 0x0000003d, 0x0000003d]), + 'AudioVolumeUp': LayoutEntry([0x01000000, 0x0000003d, 0x01000000, 0x0000003d]), + }, + ), + + LayoutInfo( + name: 'sv', + platform: LayoutPlatform.win, + mapping: { + 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x01000000, 0x01000000]), + 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x01000000]), + 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x01000000, 0x01000000]), + 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x01000000, 0x01000000]), + 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000020ac, 0x01000000]), + 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x01000000, 0x01000000]), + 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x01000000, 0x01000000]), + 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x01000000]), + 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x01000000]), + 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x01000000]), + 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x01000000]), + 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x01000000, 0x01000000]), + 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x000000b5, 0x01000000]), + 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x01000000]), + 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x01000000, 0x01000000]), + 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x01000000]), + 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x01000000, 0x01000000]), + 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x01000000, 0x01000000]), + 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x01000000, 0x01000000]), + 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x01000000, 0x01000000]), + 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x01000000]), + 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x01000000]), + 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x01000000, 0x01000000]), + 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x01000000, 0x01000000]), + 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x01000000, 0x01000000]), + 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x01000000]), + 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x01000000, 0x01000000]), + 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x00000040, 0x01000000]), + 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x000000a3, 0x01000000]), + 'Digit4': LayoutEntry([0x00000034, 0x000000a4, 0x00000024, 0x01000000]), + 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x000020ac, 0x01000000]), + 'Digit6': LayoutEntry([0x00000036, 0x00000026, 0x01000000, 0x01000000]), + 'Digit7': LayoutEntry([0x00000037, 0x0000002f, 0x0000007b, 0x01000000]), + 'Digit8': LayoutEntry([0x00000038, 0x00000028, 0x0000005b, 0x01000000]), + 'Digit9': LayoutEntry([0x00000039, 0x00000029, 0x0000005d, 0x01000000]), + 'Digit0': LayoutEntry([0x00000030, 0x0000003d, 0x0000007d, 0x01000000]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), + 'Minus': LayoutEntry([0x0000002b, 0x0000003f, 0x0000005c, 0x01000000]), + 'Equal': LayoutEntry([0x000000b4, 0x00000060, 0x01000000, 0x01000000]), + 'BracketLeft': LayoutEntry([0x000000e5, 0x000000c5, 0x01000000, 0x01000000]), + 'BracketRight': LayoutEntry([0x000000a8, 0x0000005e, 0x0000007e, 0x01000000]), + 'Backslash': LayoutEntry([0x00000027, 0x0000002a, 0x01000000, 0x01000000]), + 'Semicolon': LayoutEntry([0x000000f6, 0x000000d6, 0x01000000, 0x01000000]), + 'Quote': LayoutEntry([0x000000e4, 0x000000c4, 0x01000000, 0x01000000]), + 'Backquote': LayoutEntry([0x000000a7, 0x000000bd, 0x01000000, 0x01000000]), + 'Comma': LayoutEntry([0x0000002c, 0x0000003b, 0x01000000, 0x01000000]), + 'Period': LayoutEntry([0x0000002e, 0x0000003a, 0x01000000, 0x01000000]), + 'Slash': LayoutEntry([0x0000002d, 0x0000005f, 0x01000000, 0x01000000]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), + 'IntlBackslash': LayoutEntry([0x0000003c, 0x0000003e, 0x0000007c, 0x01000000]), + }, + ), + + LayoutInfo( + name: 'thai', + platform: LayoutPlatform.win, + mapping: { + 'KeyA': LayoutEntry([0x00000e1f, 0x00000e24, 0x01000000, 0x01000000]), + 'KeyB': LayoutEntry([0x00000e34, 0x00000e3a, 0x01000000, 0x01000000]), + 'KeyC': LayoutEntry([0x00000e41, 0x00000e09, 0x01000000, 0x01000000]), + 'KeyD': LayoutEntry([0x00000e01, 0x00000e0f, 0x01000000, 0x01000000]), + 'KeyE': LayoutEntry([0x00000e33, 0x00000e0e, 0x01000000, 0x01000000]), + 'KeyF': LayoutEntry([0x00000e14, 0x00000e42, 0x01000000, 0x01000000]), + 'KeyG': LayoutEntry([0x00000e40, 0x00000e0c, 0x01000000, 0x01000000]), + 'KeyH': LayoutEntry([0x00000e49, 0x00000e47, 0x01000000, 0x01000000]), + 'KeyI': LayoutEntry([0x00000e23, 0x00000e13, 0x01000000, 0x01000000]), + 'KeyJ': LayoutEntry([0x00000e48, 0x00000e4b, 0x01000000, 0x01000000]), + 'KeyK': LayoutEntry([0x00000e32, 0x00000e29, 0x01000000, 0x01000000]), + 'KeyL': LayoutEntry([0x00000e2a, 0x00000e28, 0x01000000, 0x01000000]), + 'KeyM': LayoutEntry([0x00000e17, 0x0000003f, 0x01000000, 0x01000000]), + 'KeyN': LayoutEntry([0x00000e37, 0x00000e4c, 0x01000000, 0x01000000]), + 'KeyO': LayoutEntry([0x00000e19, 0x00000e2f, 0x01000000, 0x01000000]), + 'KeyP': LayoutEntry([0x00000e22, 0x00000e0d, 0x01000000, 0x01000000]), + 'KeyQ': LayoutEntry([0x00000e46, 0x00000e50, 0x01000000, 0x01000000]), + 'KeyR': LayoutEntry([0x00000e1e, 0x00000e11, 0x01000000, 0x01000000]), + 'KeyS': LayoutEntry([0x00000e2b, 0x00000e06, 0x01000000, 0x01000000]), + 'KeyT': LayoutEntry([0x00000e30, 0x00000e18, 0x01000000, 0x01000000]), + 'KeyU': LayoutEntry([0x00000e35, 0x00000e4a, 0x01000000, 0x01000000]), + 'KeyV': LayoutEntry([0x00000e2d, 0x00000e2e, 0x01000000, 0x01000000]), + 'KeyW': LayoutEntry([0x00000e44, 0x00000022, 0x01000000, 0x01000000]), + 'KeyX': LayoutEntry([0x00000e1b, 0x00000029, 0x01000000, 0x01000000]), + 'KeyY': LayoutEntry([0x00000e31, 0x00000e4d, 0x01000000, 0x01000000]), + 'KeyZ': LayoutEntry([0x00000e1c, 0x00000028, 0x01000000, 0x01000000]), + 'Digit1': LayoutEntry([0x00000e45, 0x0000002b, 0x01000000, 0x01000000]), + 'Digit2': LayoutEntry([0x0000002f, 0x00000e51, 0x01000000, 0x01000000]), + 'Digit3': LayoutEntry([0x0000002d, 0x00000e52, 0x01000000, 0x01000000]), + 'Digit4': LayoutEntry([0x00000e20, 0x00000e53, 0x01000000, 0x01000000]), + 'Digit5': LayoutEntry([0x00000e16, 0x00000e54, 0x01000000, 0x01000000]), + 'Digit6': LayoutEntry([0x00000e38, 0x00000e39, 0x01000000, 0x01000000]), + 'Digit7': LayoutEntry([0x00000e36, 0x00000e3f, 0x01000000, 0x01000000]), + 'Digit8': LayoutEntry([0x00000e04, 0x00000e55, 0x01000000, 0x01000000]), + 'Digit9': LayoutEntry([0x00000e15, 0x00000e56, 0x01000000, 0x01000000]), + 'Digit0': LayoutEntry([0x00000e08, 0x00000e57, 0x01000000, 0x01000000]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), + 'Minus': LayoutEntry([0x00000e02, 0x00000e58, 0x01000000, 0x01000000]), + 'Equal': LayoutEntry([0x00000e0a, 0x00000e59, 0x01000000, 0x01000000]), + 'BracketLeft': LayoutEntry([0x00000e1a, 0x00000e10, 0x01000000, 0x01000000]), + 'BracketRight': LayoutEntry([0x00000e25, 0x0000002c, 0x01000000, 0x01000000]), + 'Backslash': LayoutEntry([0x00000e03, 0x00000e05, 0x01000000, 0x01000000]), + 'Semicolon': LayoutEntry([0x00000e27, 0x00000e0b, 0x01000000, 0x01000000]), + 'Quote': LayoutEntry([0x00000e07, 0x0000002e, 0x01000000, 0x01000000]), + 'Backquote': LayoutEntry([0x0000005f, 0x00000025, 0x01000000, 0x01000000]), + 'Comma': LayoutEntry([0x00000e21, 0x00000e12, 0x01000000, 0x01000000]), + 'Period': LayoutEntry([0x00000e43, 0x00000e2c, 0x01000000, 0x01000000]), + 'Slash': LayoutEntry([0x00000e1d, 0x00000e26, 0x01000000, 0x01000000]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), + 'IntlBackslash': LayoutEntry([0x00000e03, 0x00000e05, 0x01000000, 0x01000000]), + }, + ), + + LayoutInfo( + name: 'tr', + platform: LayoutPlatform.win, + mapping: { + 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x000000e6, 0x000000c6]), + 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x01000000]), + 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x01000000, 0x01000000]), + 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x01000000, 0x01000000]), + 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000020ac, 0x01000000]), + 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x01000000, 0x01000000]), + 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x01000000, 0x01000000]), + 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x01000000]), + 'KeyI': LayoutEntry([0x00000131, 0x00000049, 0x00000069, 0x00000130]), + 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x01000000]), + 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x01000000]), + 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x01000000, 0x01000000]), + 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x01000000, 0x01000000]), + 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x01000000]), + 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x01000000, 0x01000000]), + 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x01000000]), + 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x00000040, 0x01000000]), + 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x01000000, 0x01000000]), + 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x000000df, 0x01000000]), + 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x000020ba, 0x01000000]), + 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x01000000]), + 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x01000000]), + 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x01000000, 0x01000000]), + 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x01000000, 0x01000000]), + 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x01000000, 0x01000000]), + 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x01000000]), + 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x0000003e, 0x01000000]), + 'Digit2': LayoutEntry([0x00000032, 0x00000027, 0x000000a3, 0x01000000]), + 'Digit3': LayoutEntry([0x00000033, 0x0000005e, 0x00000023, 0x01000000]), + 'Digit4': LayoutEntry([0x00000034, 0x0000002b, 0x00000024, 0x01000000]), + 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x000000bd, 0x01000000]), + 'Digit6': LayoutEntry([0x00000036, 0x00000026, 0x01000000, 0x01000000]), + 'Digit7': LayoutEntry([0x00000037, 0x0000002f, 0x0000007b, 0x01000000]), + 'Digit8': LayoutEntry([0x00000038, 0x00000028, 0x0000005b, 0x01000000]), + 'Digit9': LayoutEntry([0x00000039, 0x00000029, 0x0000005d, 0x01000000]), + 'Digit0': LayoutEntry([0x00000030, 0x0000003d, 0x0000007d, 0x01000000]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), + 'Minus': LayoutEntry([0x0000002a, 0x0000003f, 0x0000005c, 0x01000000]), + 'Equal': LayoutEntry([0x0000002d, 0x0000005f, 0x0000007c, 0x01000000]), + 'BracketLeft': LayoutEntry([0x0000011f, 0x0000011e, 0x000000a8, 0x01000000]), + 'BracketRight': LayoutEntry([0x000000fc, 0x000000dc, 0x0000007e, 0x01000000]), + 'Backslash': LayoutEntry([0x0000002c, 0x0000003b, 0x00000060, 0x01000000]), + 'Semicolon': LayoutEntry([0x0000015f, 0x0000015e, 0x000000b4, 0x01000000]), + 'Quote': LayoutEntry([0x00000069, 0x00000130, 0x01000000, 0x01000000]), + 'Backquote': LayoutEntry([0x00000022, 0x000000e9, 0x0000003c, 0x01000000]), + 'Comma': LayoutEntry([0x000000f6, 0x000000d6, 0x01000000, 0x01000000]), + 'Period': LayoutEntry([0x000000e7, 0x000000c7, 0x01000000, 0x01000000]), + 'Slash': LayoutEntry([0x0000002e, 0x0000003a, 0x01000000, 0x01000000]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), + 'IntlBackslash': LayoutEntry([0x0000003c, 0x0000003e, 0x0000007c, 0x01000000]), + }, + ), + + LayoutInfo( + name: 'zh-hans', + platform: LayoutPlatform.darwin, + mapping: { + 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x000000e5, 0x000000c5]), + 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x0000222b, 0x00000131]), + 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x000000e7, 0x000000c7]), + 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x00002202, 0x000000ce]), + 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x01000000, 0x000000b4]), + 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x00000192, 0x000000cf]), + 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x000000a9, 0x000002dd]), + 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x000002d9, 0x000000d3]), + 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x000002c6]), + 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x00002206, 0x000000d4]), + 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x000002da, 0x0000f8ff]), + 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x000000ac, 0x000000d2]), + 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x000000b5, 0x000000c2]), + 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x000002dc]), + 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8]), + 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x000003c0, 0x0000220f]), + 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x00000153, 0x00000152]), + 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x000000ae, 0x00002030]), + 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x000000df, 0x000000cd]), + 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x00002020, 0x000002c7]), + 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x000000a8]), + 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x0000221a, 0x000025ca]), + 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x00002211, 0x0000201e]), + 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x00002248, 0x000002db]), + 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x000000a5, 0x000000c1]), + 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x000003a9, 0x000000b8]), + 'Digit1': LayoutEntry([0x00000031, 0x0000ff01, 0x000000a1, 0x00002044]), + 'Digit2': LayoutEntry([0x00000032, 0x00000040, 0x00002122, 0x000020ac]), + 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x000000a3, 0x00002039]), + 'Digit4': LayoutEntry([0x00000034, 0x000000a5, 0x000000a2, 0x0000203a]), + 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x0000221e, 0x0000fb01]), + 'Digit6': LayoutEntry([0x00000036, 0x01000000, 0x000000a7, 0x0000fb02]), + 'Digit7': LayoutEntry([0x00000037, 0x00000026, 0x000000b6, 0x00002021]), + 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x00002022, 0x000000b0]), + 'Digit9': LayoutEntry([0x00000039, 0x0000ff08, 0x000000aa, 0x000000b7]), + 'Digit0': LayoutEntry([0x00000030, 0x0000ff09, 0x000000ba, 0x0000201a]), + 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), + 'Minus': LayoutEntry([0x0000002d, 0x01000000, 0x00002013, 0x00002014]), + 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x00002260, 0x000000b1]), + 'BracketLeft': LayoutEntry([0x00003010, 0x0000300c, 0x0000201c, 0x0000201d]), + 'BracketRight': LayoutEntry([0x00003011, 0x0000300d, 0x00002018, 0x00002019]), + 'Backslash': LayoutEntry([0x00003001, 0x0000007c, 0x000000ab, 0x000000bb]), + 'Semicolon': LayoutEntry([0x0000ff1b, 0x0000ff1a, 0x00002026, 0x000000da]), + 'Quote': LayoutEntry([0x00000027, 0x00000022, 0x000000e6, 0x000000c6]), + 'Backquote': LayoutEntry([0x000000b7, 0x0000ff5e, 0x01000000, 0x00000060]), + 'Comma': LayoutEntry([0x0000ff0c, 0x0000300a, 0x00002264, 0x000000af]), + 'Period': LayoutEntry([0x00003002, 0x0000300b, 0x00002265, 0x000002d8]), + 'Slash': LayoutEntry([0x0000002f, 0x0000ff1f, 0x000000f7, 0x000000bf]), + 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), + 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), + 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), + 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), + 'Numpad1': LayoutEntry([0x00000031, 0x00000031, 0x00000031, 0x00000031]), + 'Numpad2': LayoutEntry([0x00000032, 0x00000032, 0x00000032, 0x00000032]), + 'Numpad3': LayoutEntry([0x00000033, 0x00000033, 0x00000033, 0x00000033]), + 'Numpad4': LayoutEntry([0x00000034, 0x00000034, 0x00000034, 0x00000034]), + 'Numpad5': LayoutEntry([0x00000035, 0x00000035, 0x00000035, 0x00000035]), + 'Numpad6': LayoutEntry([0x00000036, 0x00000036, 0x00000036, 0x00000036]), + 'Numpad7': LayoutEntry([0x00000037, 0x00000037, 0x00000037, 0x00000037]), + 'Numpad8': LayoutEntry([0x00000038, 0x00000038, 0x00000038, 0x00000038]), + 'Numpad9': LayoutEntry([0x00000039, 0x00000039, 0x00000039, 0x00000039]), + 'Numpad0': LayoutEntry([0x00000030, 0x00000030, 0x00000030, 0x00000030]), + 'NumpadDecimal': LayoutEntry([0x0000002e, 0x0000002e, 0x0000002e, 0x0000002e]), + 'IntlBackslash': LayoutEntry([0x000000a7, 0x000000b1, 0x000000a7, 0x000000b1]), + 'NumpadEqual': LayoutEntry([0x0000003d, 0x0000003d, 0x0000003d, 0x0000003d]), + 'AudioVolumeUp': LayoutEntry([0x01000000, 0x0000003d, 0x01000000, 0x0000003d]), + }, + ), +]; diff --git a/third_party/web_keyboard_layouts/lib/web_keyboard_layouts.dart b/third_party/web_keyboard_layouts/lib/web_keyboard_layouts.dart new file mode 100644 index 0000000000000..e2a62a92e3957 --- /dev/null +++ b/third_party/web_keyboard_layouts/lib/web_keyboard_layouts.dart @@ -0,0 +1,7 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. + +library web_keyboard_layouts; + +part 'base.dart'; +part 'definitions.dart'; diff --git a/third_party/web_keyboard_layouts/pubspec.yaml b/third_party/web_keyboard_layouts/pubspec.yaml new file mode 100644 index 0000000000000..920661f58ad57 --- /dev/null +++ b/third_party/web_keyboard_layouts/pubspec.yaml @@ -0,0 +1,9 @@ +name: web_keyboard_layouts + +description: A list of keyboard layouts on Web and their mapping table. +repository: https://github.com/flutter/packages/tree/main/third_party/packages/web_keyboard_layouts +issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+web_keyboard_layouts%22 +version: 0.1.1 + +environment: + sdk: ">=2.12.0 <3.0.0" diff --git a/web_sdk/BUILD.gn b/web_sdk/BUILD.gn index ba7d190ed83ed..441c494d05665 100644 --- a/web_sdk/BUILD.gn +++ b/web_sdk/BUILD.gn @@ -30,6 +30,13 @@ web_engine_sources = web_engine_sources += [ rebase_path("//flutter/lib/web_ui/lib/src/engine.dart") ] +web_keyboard_layouts_sources = exec_script("//third_party/dart/tools/list_dart_files.py", + [ + "absolute", + rebase_path("//flutter/third_party/web_keyboard_layouts/lib"), + ], + "list lines") + group("web_sdk") { deps = [ ":flutter_dartdevc_canvaskit_html_kernel_sdk", @@ -71,6 +78,34 @@ prebuilt_dart_action("web_ui_sources") { } } +prebuilt_dart_action("web_keyboard_layouts_sources") { + inputs = web_keyboard_layouts_sources + [ "sdk_rewriter.dart" ] + + packages = dart_sdk_package_config + script = "sdk_rewriter.dart" + output_dir = rebase_path("$root_out_dir/flutter_web_sdk/lib/web_keyboard_layouts/") + input_dir = rebase_path("//flutter/third_party/web_keyboard_layouts/lib/") + pool = "//flutter/build/dart:dart_pool" + + outputs = [ + "$target_gen_dir/$target_name.stamp", + "$root_out_dir/flutter_web_sdk/lib/web_keyboard_layouts/", + ] + + args = [ + "--output-dir=$output_dir", + "--input-dir=$input_dir", + "--keyboard-layouts", + "--stamp", + rebase_path(outputs[0], root_build_dir), + ] + + foreach(source_file, web_keyboard_layouts_sources) { + path = rebase_path(source_file) + args += [ "--input=$path" ] + } +} + prebuilt_dart_action("web_engine_sources") { inputs = web_engine_sources + [ "sdk_rewriter.dart" ] @@ -122,6 +157,7 @@ template("_dartdevc") { ":web_engine_sources", ":web_ui_library", ":web_ui_sources", + ":web_keyboard_layouts_sources", "//flutter:dart_sdk", ] script = "//build/gn_run_binary.py" @@ -151,6 +187,7 @@ template("_dartdevc") { ":web_engine_sources", ":web_ui_library", ":web_ui_sources", + ":web_keyboard_layouts_sources", "//flutter:dart_sdk", "//third_party/dart/pkg:pkg_files_stamp", "//third_party/dart/utils/dartdevc:dartdevc_files_stamp", @@ -180,6 +217,7 @@ template("_kernel_worker") { ":web_engine_sources", ":web_ui_library", ":web_ui_sources", + ":web_keyboard_layouts_sources", "//flutter:dart_sdk", ] script = "//build/gn_run_binary.py" @@ -210,6 +248,7 @@ template("_kernel_worker") { ":web_engine_sources", ":web_ui_library", ":web_ui_sources", + ":web_keyboard_layouts_sources", "//flutter:dart_sdk", "//third_party/dart/pkg:pkg_files_stamp", "//third_party/dart/utils/dartdevc:dartdevc_files_stamp", @@ -225,7 +264,7 @@ template("_kernel_worker") { # Compile the unsound DDC SDK's summary. _kernel_worker("flutter_dartdevc_kernel_sdk_outline") { - inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources + inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources + web_keyboard_layouts_sources outputs = [ sdk_dill ] @@ -252,12 +291,14 @@ _kernel_worker("flutter_dartdevc_kernel_sdk_outline") { "dart:ui", "--source", "dart:_engine", + "--source", + "dart:web_keyboard_layouts", ] } # Compiles the unsound html only renderer. _dartdevc("flutter_dartdevc_kernel_sdk") { - inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources + inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources + web_keyboard_layouts_sources packages = dart_sdk_package_config @@ -276,6 +317,7 @@ _dartdevc("flutter_dartdevc_kernel_sdk") { # Additional Flutter web dart libraries "dart:ui", "dart:_engine", + "dart:web_keyboard_layouts", "--no-summarize", "--packages", "file:///" + rebase_path(dart_sdk_package_config), @@ -303,7 +345,7 @@ _dartdevc("flutter_dartdevc_kernel_sdk") { # Compiles the unsound canvaskit only renderer. _dartdevc("flutter_dartdevc_canvaskit_kernel_sdk") { - inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources + inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources + web_keyboard_layouts_sources packages = dart_sdk_package_config @@ -322,6 +364,7 @@ _dartdevc("flutter_dartdevc_canvaskit_kernel_sdk") { # Additional Flutter web dart libraries "dart:ui", "dart:_engine", + "dart:web_keyboard_layouts", "--no-summarize", "--packages", "file:///" + rebase_path(dart_sdk_package_config), @@ -351,7 +394,7 @@ _dartdevc("flutter_dartdevc_canvaskit_kernel_sdk") { # Compiles the unsound autodetect renderer. _dartdevc("flutter_dartdevc_canvaskit_html_kernel_sdk") { - inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources + inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources + web_keyboard_layouts_sources packages = dart_sdk_package_config @@ -370,6 +413,7 @@ _dartdevc("flutter_dartdevc_canvaskit_html_kernel_sdk") { # Additional Flutter web dart libraries "dart:ui", "dart:_engine", + "dart:web_keyboard_layouts", "--no-summarize", "--packages", "file:///" + rebase_path(dart_sdk_package_config), @@ -399,7 +443,7 @@ _dartdevc("flutter_dartdevc_canvaskit_html_kernel_sdk") { # Compiles the sound html only renderer. _dartdevc("flutter_dartdevc_kernel_sdk_sound") { - inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources + inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources + web_keyboard_layouts_sources packages = dart_sdk_package_config @@ -418,6 +462,7 @@ _dartdevc("flutter_dartdevc_kernel_sdk_sound") { # Additional Flutter web dart libraries "dart:ui", "dart:_engine", + "dart:web_keyboard_layouts", "--no-summarize", "--packages", "file:///" + rebase_path(dart_sdk_package_config), @@ -446,7 +491,7 @@ _dartdevc("flutter_dartdevc_kernel_sdk_sound") { # Compiles the sound canvaskit only renderer. _dartdevc("flutter_dartdevc_canvaskit_kernel_sdk_sound") { - inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources + inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources + web_keyboard_layouts_sources packages = dart_sdk_package_config @@ -465,6 +510,7 @@ _dartdevc("flutter_dartdevc_canvaskit_kernel_sdk_sound") { # Additional Flutter web dart libraries "dart:ui", "dart:_engine", + "dart:web_keyboard_layouts", "--no-summarize", "--packages", "file:///" + rebase_path(dart_sdk_package_config), @@ -494,7 +540,7 @@ _dartdevc("flutter_dartdevc_canvaskit_kernel_sdk_sound") { # Compiles the sound autodetect renderer. _dartdevc("flutter_dartdevc_canvaskit_html_kernel_sdk_sound") { - inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources + inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources + web_keyboard_layouts_sources packages = dart_sdk_package_config @@ -513,6 +559,7 @@ _dartdevc("flutter_dartdevc_canvaskit_html_kernel_sdk_sound") { # Additional Flutter web dart libraries "dart:ui", "dart:_engine", + "dart:web_keyboard_layouts", "--no-summarize", "--packages", "file:///" + rebase_path(dart_sdk_package_config), @@ -542,7 +589,7 @@ _dartdevc("flutter_dartdevc_canvaskit_html_kernel_sdk_sound") { # Compile the sound DDC SDK's summary. _kernel_worker("flutter_dartdevc_kernel_sdk_outline_sound") { - inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources + inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources + web_keyboard_layouts_sources outputs = [ sdk_dill_sound ] @@ -569,6 +616,8 @@ _kernel_worker("flutter_dartdevc_kernel_sdk_outline_sound") { "dart:ui", "--source", "dart:_engine", + "--source", + "dart:web_keyboard_layouts", ] } @@ -588,6 +637,7 @@ if (!is_fuchsia) { ":web_engine_sources", ":web_ui_library", ":web_ui_sources", + ":web_keyboard_layouts_sources", ] sources = get_target_outputs(":flutter_dartdevc_canvaskit_html_kernel_sdk") sources += @@ -602,6 +652,7 @@ if (!is_fuchsia) { sources += get_target_outputs(":web_ui_library") sources += get_target_outputs(":web_ui_sources") sources += get_target_outputs(":web_engine_sources") + sources += get_target_outputs(":web_keyboard_layouts_sources") tmp_files = [] foreach(source, sources) { tmp_files += [ diff --git a/web_sdk/libraries.json b/web_sdk/libraries.json index c0ddf48ca527f..341ba9f548d18 100644 --- a/web_sdk/libraries.json +++ b/web_sdk/libraries.json @@ -14,6 +14,9 @@ }, "_engine": { "uri": "lib/_engine/engine.dart" + }, + "web_keyboard_layouts": { + "uri": "lib/web_keyboard_layouts/web_keyboard_layouts.dart" } } }, @@ -30,6 +33,9 @@ }, "_engine": { "uri": "lib/_engine/engine.dart" + }, + "web_keyboard_layouts": { + "uri": "lib/web_keyboard_layouts/web_keyboard_layouts.dart" } } } diff --git a/web_sdk/libraries.yaml b/web_sdk/libraries.yaml index 73cfbe3bf8258..8f7e96f68916e 100644 --- a/web_sdk/libraries.yaml +++ b/web_sdk/libraries.yaml @@ -7,7 +7,7 @@ # Note: if you edit this file, you must also edit libraries.json in this # directory: # -#. python third_party/dart/tools/yaml2json.py flutter/web_sdk/libraries.yaml flutter/web_sdk/libraries.json +#. dart third_party/dart/tools/yaml2json.dart flutter/web_sdk/libraries.yaml flutter/web_sdk/libraries.json # # We currently have several different files that needs to be updated when # changing libraries, sources, and patch files. See @@ -24,6 +24,9 @@ dartdevc: _engine: uri: "lib/_engine/engine.dart" + web_keyboard_layouts: + uri: "lib/web_keyboard_layouts/web_keyboard_layouts.dart" + dart2js: include: - {path: "../dart-sdk/lib/libraries.json", target: dart2js} @@ -34,3 +37,6 @@ dart2js: _engine: uri: "lib/_engine/engine.dart" + + web_keyboard_layouts: + uri: "lib/web_keyboard_layouts/web_keyboard_layouts.dart" diff --git a/web_sdk/sdk_rewriter.dart b/web_sdk/sdk_rewriter.dart index f7dfbf8d5e923..1530a64ce9c5d 100644 --- a/web_sdk/sdk_rewriter.dart +++ b/web_sdk/sdk_rewriter.dart @@ -12,6 +12,7 @@ final ArgParser argParser = ArgParser() ..addOption('input-dir') ..addFlag('ui', defaultsTo: false) ..addFlag('engine', defaultsTo: false) + ..addFlag('keyboard-layouts', defaultsTo: false) ..addMultiOption('input') ..addOption('stamp'); @@ -50,6 +51,7 @@ import 'dart:math' as math; import 'dart:svg' as svg; import 'dart:typed_data'; import 'dart:ui' as ui; +import 'dart:web_keyboard_layouts' as keyboard_layouts; '''), // Replace exports of engine files with "part" directives. MappedReplacer(RegExp(r''' @@ -70,6 +72,19 @@ final List enginePartsPatterns = [ AllReplacer(RegExp(r'\nexport\s*.*'), ''), ]; +final List keyboardLayoutsPatterns = [ + AllReplacer(RegExp(r'library\s+web_keyboard_layouts;'), 'library dart.web_keyboard_layouts;'), + AllReplacer(RegExp(r'part\s+of\s+web_keyboard_layouts;'), 'part of dart.web_keyboard_layouts;'), + AllReplacer(RegExp( + r''' +export\s*'src/engine.dart' +'''), + r''' +export 'dart:_engine' +''', + ), +]; + final List sharedPatterns = [ AllReplacer(RegExp(r"import\s*'package:meta/meta.dart';"), ''), AllReplacer('@required', ''), @@ -96,6 +111,7 @@ void main(List arguments) { filePath: inputFilePath, isUi: results['ui'] as bool, isEngine: results['engine'] as bool, + isKeyboardLayouts: results['keyboard-layouts'] as bool, ); outputFile.writeAsStringSync(rewrittenContent); if (results['stamp'] != null) { @@ -104,7 +120,13 @@ void main(List arguments) { } } -String rewriteFile(String source, {required String filePath, required bool isUi, required bool isEngine}) { +String rewriteFile( + String source, { + required String filePath, + required bool isUi, + required bool isEngine, + required bool isKeyboardLayouts, +}) { final List replacementPatterns = []; replacementPatterns.addAll(sharedPatterns); if (isUi) { @@ -117,6 +139,8 @@ String rewriteFile(String source, {required String filePath, required bool isUi, source = _preprocessEnginePartFile(source); replacementPatterns.addAll(enginePartsPatterns); } + } else if (isKeyboardLayouts) { + replacementPatterns.addAll(keyboardLayoutsPatterns); } for (final Replacer replacer in replacementPatterns) { source = replacer.perform(source); From cb3b06d6015aade2e78535de64aed4baf2c234de Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Tue, 12 Jul 2022 17:39:23 -0700 Subject: [PATCH 06/74] Update gen --- .../web_keyboard_layouts/lib/base.dart | 15 +- .../web_keyboard_layouts/lib/definitions.dart | 2978 ----------------- .../lib/definitions.g.dart | 2444 ++++++++++++++ .../lib/web_keyboard_layouts.dart | 2 +- 4 files changed, 2450 insertions(+), 2989 deletions(-) delete mode 100644 third_party/web_keyboard_layouts/lib/definitions.dart create mode 100644 third_party/web_keyboard_layouts/lib/definitions.g.dart diff --git a/third_party/web_keyboard_layouts/lib/base.dart b/third_party/web_keyboard_layouts/lib/base.dart index 0fe43bba0390d..64972fc79c70d 100644 --- a/third_party/web_keyboard_layouts/lib/base.dart +++ b/third_party/web_keyboard_layouts/lib/base.dart @@ -9,15 +9,7 @@ enum LayoutPlatform { darwin, } -class LayoutEntry { - const LayoutEntry( - this.values, - ); - - // List of four: value, withShift, withAlt, withShiftAlt. - // Each value is either 0xYYYYYY, or 0x1000000 for a dead key. - final List values; -} +const kDeadKey = 0x1000000; class LayoutInfo { const LayoutInfo({ @@ -28,5 +20,8 @@ class LayoutInfo { final String name; final LayoutPlatform platform; - final Map mapping; + // Each element of `mapping` is a list of four: + // noModifier, withShift, withAlt, withShiftAlt. + // Each value is either 0xYYYYYY, or 0x1000000 for a dead key. + final List> mapping; } diff --git a/third_party/web_keyboard_layouts/lib/definitions.dart b/third_party/web_keyboard_layouts/lib/definitions.dart deleted file mode 100644 index 1683b735ced9a..0000000000000 --- a/third_party/web_keyboard_layouts/lib/definitions.dart +++ /dev/null @@ -1,2978 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -// DO NOT EDIT -- DO NOT EDIT -- DO NOT EDIT -// -// This file is auto generated by flutter/packages:script/gen_web_keyboard based on -// https://github.com/microsoft/vscode/tree/4589815e4849499c67125ff68563fa102646b869/src/vs/workbench/services/keybinding/browser/keyboardLayouts -// -// Edit the following files instead: -// -// - Script: lib/main.dart -// - Templates: data/*.tmpl -// -// See flutter/packages:script/gen_web_keyboard/layouts/README.md for more information. - -part of web_keyboard_layouts; - -const List kLayouts = [ - LayoutInfo( - name: 'cz', - platform: LayoutPlatform.win, - mapping: { - 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x01000000, 0x01000000]), - 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x0000007b, 0x01000000]), - 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x00000026, 0x01000000]), - 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x00000110, 0x01000000]), - 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000020ac, 0x01000000]), - 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x0000005b, 0x01000000]), - 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x0000005d, 0x01000000]), - 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x01000000]), - 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x01000000]), - 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x01000000]), - 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x00000142, 0x01000000]), - 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x00000141, 0x01000000]), - 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x01000000, 0x01000000]), - 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x0000007d, 0x01000000]), - 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x01000000, 0x01000000]), - 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x01000000]), - 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x0000005c, 0x01000000]), - 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x01000000, 0x01000000]), - 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x00000111, 0x01000000]), - 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x01000000, 0x01000000]), - 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x01000000]), - 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x00000040, 0x01000000]), - 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x0000007c, 0x01000000]), - 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x00000023, 0x01000000]), - 'KeyY': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x01000000]), - 'KeyZ': LayoutEntry([0x00000079, 0x00000059, 0x01000000, 0x01000000]), - 'Digit1': LayoutEntry([0x0000002b, 0x00000031, 0x0000007e, 0x01000000]), - 'Digit2': LayoutEntry([0x0000011b, 0x00000032, 0x000002c7, 0x01000000]), - 'Digit3': LayoutEntry([0x00000161, 0x00000033, 0x0000005e, 0x01000000]), - 'Digit4': LayoutEntry([0x0000010d, 0x00000034, 0x000002d8, 0x01000000]), - 'Digit5': LayoutEntry([0x00000159, 0x00000035, 0x000000b0, 0x01000000]), - 'Digit6': LayoutEntry([0x0000017e, 0x00000036, 0x000002db, 0x01000000]), - 'Digit7': LayoutEntry([0x000000fd, 0x00000037, 0x00000060, 0x01000000]), - 'Digit8': LayoutEntry([0x000000e1, 0x00000038, 0x000002d9, 0x01000000]), - 'Digit9': LayoutEntry([0x000000ed, 0x00000039, 0x000000b4, 0x01000000]), - 'Digit0': LayoutEntry([0x000000e9, 0x00000030, 0x000002dd, 0x01000000]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), - 'Minus': LayoutEntry([0x0000003d, 0x00000025, 0x000000a8, 0x01000000]), - 'Equal': LayoutEntry([0x000000b4, 0x000002c7, 0x000000b8, 0x01000000]), - 'BracketLeft': LayoutEntry([0x000000fa, 0x0000002f, 0x000000f7, 0x01000000]), - 'BracketRight': LayoutEntry([0x00000029, 0x00000028, 0x000000d7, 0x01000000]), - 'Backslash': LayoutEntry([0x000000a8, 0x00000027, 0x000000a4, 0x01000000]), - 'Semicolon': LayoutEntry([0x0000016f, 0x00000022, 0x00000024, 0x01000000]), - 'Quote': LayoutEntry([0x000000a7, 0x00000021, 0x000000df, 0x01000000]), - 'Backquote': LayoutEntry([0x0000003b, 0x000000b0, 0x01000000, 0x01000000]), - 'Comma': LayoutEntry([0x0000002c, 0x0000003f, 0x0000003c, 0x01000000]), - 'Period': LayoutEntry([0x0000002e, 0x0000003a, 0x0000003e, 0x01000000]), - 'Slash': LayoutEntry([0x0000002d, 0x0000005f, 0x0000002a, 0x01000000]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), - 'IntlBackslash': LayoutEntry([0x0000005c, 0x0000007c, 0x01000000, 0x01000000]), - }, - ), - - LayoutInfo( - name: 'de-swiss', - platform: LayoutPlatform.win, - mapping: { - 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x01000000, 0x01000000]), - 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x01000000]), - 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x01000000, 0x01000000]), - 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x01000000, 0x01000000]), - 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000020ac, 0x01000000]), - 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x01000000, 0x01000000]), - 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x01000000, 0x01000000]), - 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x01000000]), - 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x01000000]), - 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x01000000]), - 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x01000000]), - 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x01000000, 0x01000000]), - 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x01000000, 0x01000000]), - 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x01000000]), - 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x01000000, 0x01000000]), - 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x01000000]), - 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x01000000, 0x01000000]), - 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x01000000, 0x01000000]), - 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x01000000, 0x01000000]), - 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x01000000, 0x01000000]), - 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x01000000]), - 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x01000000]), - 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x01000000, 0x01000000]), - 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x01000000, 0x01000000]), - 'KeyY': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x01000000]), - 'KeyZ': LayoutEntry([0x00000079, 0x00000059, 0x01000000, 0x01000000]), - 'Digit1': LayoutEntry([0x00000031, 0x0000002b, 0x000000a6, 0x01000000]), - 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x00000040, 0x01000000]), - 'Digit3': LayoutEntry([0x00000033, 0x0000002a, 0x00000023, 0x01000000]), - 'Digit4': LayoutEntry([0x00000034, 0x000000e7, 0x000000b0, 0x01000000]), - 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x000000a7, 0x01000000]), - 'Digit6': LayoutEntry([0x00000036, 0x00000026, 0x000000ac, 0x01000000]), - 'Digit7': LayoutEntry([0x00000037, 0x0000002f, 0x0000007c, 0x01000000]), - 'Digit8': LayoutEntry([0x00000038, 0x00000028, 0x000000a2, 0x01000000]), - 'Digit9': LayoutEntry([0x00000039, 0x00000029, 0x01000000, 0x01000000]), - 'Digit0': LayoutEntry([0x00000030, 0x0000003d, 0x01000000, 0x01000000]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), - 'Minus': LayoutEntry([0x00000027, 0x0000003f, 0x000000b4, 0x01000000]), - 'Equal': LayoutEntry([0x0000005e, 0x00000060, 0x0000007e, 0x01000000]), - 'BracketLeft': LayoutEntry([0x000000fc, 0x000000e8, 0x0000005b, 0x01000000]), - 'BracketRight': LayoutEntry([0x000000a8, 0x00000021, 0x0000005d, 0x01000000]), - 'Backslash': LayoutEntry([0x00000024, 0x000000a3, 0x0000007d, 0x01000000]), - 'Semicolon': LayoutEntry([0x000000f6, 0x000000e9, 0x01000000, 0x01000000]), - 'Quote': LayoutEntry([0x000000e4, 0x000000e0, 0x0000007b, 0x01000000]), - 'Backquote': LayoutEntry([0x000000a7, 0x000000b0, 0x01000000, 0x01000000]), - 'Comma': LayoutEntry([0x0000002c, 0x0000003b, 0x01000000, 0x01000000]), - 'Period': LayoutEntry([0x0000002e, 0x0000003a, 0x01000000, 0x01000000]), - 'Slash': LayoutEntry([0x0000002d, 0x0000005f, 0x01000000, 0x01000000]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), - 'IntlBackslash': LayoutEntry([0x0000003c, 0x0000003e, 0x0000005c, 0x01000000]), - }, - ), - - LayoutInfo( - name: 'de', - platform: LayoutPlatform.darwin, - mapping: { - 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x000000e5, 0x000000c5]), - 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x0000222b, 0x00002039]), - 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x000000e7, 0x000000c7]), - 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x00002202, 0x00002122]), - 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000020ac, 0x00002030]), - 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x00000192, 0x000000cf]), - 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x000000a9, 0x000000cc]), - 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x000000aa, 0x000000d3]), - 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x00002044, 0x000000db]), - 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x000000ba, 0x00000131]), - 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x00002206, 0x000002c6]), - 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x00000040, 0x0000fb02]), - 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x000000b5, 0x000002d8]), - 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x0000203a]), - 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8]), - 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x000003c0, 0x0000220f]), - 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x000000ab, 0x000000bb]), - 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x000000ae, 0x000000b8]), - 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x0000201a, 0x000000cd]), - 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x00002020, 0x000002dd]), - 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x000000c1]), - 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x0000221a, 0x000025ca]), - 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x00002211, 0x0000201e]), - 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x00002248, 0x000000d9]), - 'KeyY': LayoutEntry([0x0000007a, 0x0000005a, 0x000003a9, 0x000002c7]), - 'KeyZ': LayoutEntry([0x00000079, 0x00000059, 0x000000a5, 0x00002021]), - 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x000000a1, 0x000000ac]), - 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x0000201c, 0x0000201d]), - 'Digit3': LayoutEntry([0x00000033, 0x000000a7, 0x000000b6, 0x00000023]), - 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x000000a2, 0x000000a3]), - 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x0000005b, 0x0000fb01]), - 'Digit6': LayoutEntry([0x00000036, 0x00000026, 0x0000005d, 0x01000000]), - 'Digit7': LayoutEntry([0x00000037, 0x0000002f, 0x0000007c, 0x0000005c]), - 'Digit8': LayoutEntry([0x00000038, 0x00000028, 0x0000007b, 0x000002dc]), - 'Digit9': LayoutEntry([0x00000039, 0x00000029, 0x0000007d, 0x000000b7]), - 'Digit0': LayoutEntry([0x00000030, 0x0000003d, 0x00002260, 0x000000af]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), - 'Minus': LayoutEntry([0x000000df, 0x0000003f, 0x000000bf, 0x000002d9]), - 'Equal': LayoutEntry([0x01000000, 0x01000000, 0x00000027, 0x000002da]), - 'BracketLeft': LayoutEntry([0x000000fc, 0x000000dc, 0x00002022, 0x000000b0]), - 'BracketRight': LayoutEntry([0x0000002b, 0x0000002a, 0x000000b1, 0x0000f8ff]), - 'Backslash': LayoutEntry([0x00000023, 0x00000027, 0x00002018, 0x00002019]), - 'Semicolon': LayoutEntry([0x000000f6, 0x000000d6, 0x00000153, 0x00000152]), - 'Quote': LayoutEntry([0x000000e4, 0x000000c4, 0x000000e6, 0x000000c6]), - 'Backquote': LayoutEntry([0x0000003c, 0x0000003e, 0x00002264, 0x00002265]), - 'Comma': LayoutEntry([0x0000002c, 0x0000003b, 0x0000221e, 0x000002db]), - 'Period': LayoutEntry([0x0000002e, 0x0000003a, 0x00002026, 0x000000f7]), - 'Slash': LayoutEntry([0x0000002d, 0x0000005f, 0x00002013, 0x00002014]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), - 'Numpad1': LayoutEntry([0x00000031, 0x00000031, 0x00000031, 0x00000031]), - 'Numpad2': LayoutEntry([0x00000032, 0x00000032, 0x00000032, 0x00000032]), - 'Numpad3': LayoutEntry([0x00000033, 0x00000033, 0x00000033, 0x00000033]), - 'Numpad4': LayoutEntry([0x00000034, 0x00000034, 0x00000034, 0x00000034]), - 'Numpad5': LayoutEntry([0x00000035, 0x00000035, 0x00000035, 0x00000035]), - 'Numpad6': LayoutEntry([0x00000036, 0x00000036, 0x00000036, 0x00000036]), - 'Numpad7': LayoutEntry([0x00000037, 0x00000037, 0x00000037, 0x00000037]), - 'Numpad8': LayoutEntry([0x00000038, 0x00000038, 0x00000038, 0x00000038]), - 'Numpad9': LayoutEntry([0x00000039, 0x00000039, 0x00000039, 0x00000039]), - 'Numpad0': LayoutEntry([0x00000030, 0x00000030, 0x00000030, 0x00000030]), - 'NumpadDecimal': LayoutEntry([0x0000002c, 0x0000002c, 0x0000002e, 0x0000002e]), - 'IntlBackslash': LayoutEntry([0x01000000, 0x000000b0, 0x0000201e, 0x0000201c]), - 'NumpadEqual': LayoutEntry([0x0000003d, 0x0000003d, 0x0000003d, 0x0000003d]), - 'AudioVolumeUp': LayoutEntry([0x01000000, 0x0000003d, 0x01000000, 0x0000003d]), - }, - ), - - LayoutInfo( - name: 'de', - platform: LayoutPlatform.linux, - mapping: { - 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x000000e6, 0x000000c6]), - 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x0000201c, 0x00002018]), - 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x000000a2, 0x000000a9]), - 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x000000f0, 0x000000d0]), - 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000020ac, 0x000020ac]), - 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x00000111, 0x000000aa]), - 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x0000014b, 0x0000014a]), - 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x00000127, 0x00000126]), - 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x00002192, 0x00000131]), - 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x00000323, 0x00000307]), - 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x00000138, 0x00000026]), - 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x00000142, 0x00000141]), - 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x000000b5, 0x000000ba]), - 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x0000201d, 0x00002019]), - 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8]), - 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x000000fe, 0x000000de]), - 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x00000040, 0x000003a9]), - 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x000000b6, 0x000000ae]), - 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x0000017f, 0x00001e9e]), - 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x00000167, 0x00000166]), - 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x00002193, 0x00002191]), - 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x0000201e, 0x0000201a]), - 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x00000142, 0x00000141]), - 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x000000ab, 0x00002039]), - 'KeyY': LayoutEntry([0x0000007a, 0x0000005a, 0x00002190, 0x000000a5]), - 'KeyZ': LayoutEntry([0x00000079, 0x00000059, 0x000000bb, 0x0000203a]), - 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x000000b9, 0x000000a1]), - 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x000000b2, 0x0000215b]), - 'Digit3': LayoutEntry([0x00000033, 0x000000a7, 0x000000b3, 0x000000a3]), - 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x000000bc, 0x000000a4]), - 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x000000bd, 0x0000215c]), - 'Digit6': LayoutEntry([0x00000036, 0x00000026, 0x000000ac, 0x0000215d]), - 'Digit7': LayoutEntry([0x00000037, 0x0000002f, 0x0000007b, 0x0000215e]), - 'Digit8': LayoutEntry([0x00000038, 0x00000028, 0x0000005b, 0x00002122]), - 'Digit9': LayoutEntry([0x00000039, 0x00000029, 0x0000005d, 0x000000b1]), - 'Digit0': LayoutEntry([0x00000030, 0x0000003d, 0x0000007d, 0x000000b0]), - 'Enter': LayoutEntry([0x0000000d, 0x0000000d, 0x0000000d, 0x0000000d]), - 'Escape': LayoutEntry([0x0000001b, 0x0000001b, 0x0000001b, 0x0000001b]), - 'Backspace': LayoutEntry([0x00000008, 0x00000008, 0x00000008, 0x00000008]), - 'Tab': LayoutEntry([0x00000009, 0x01000000, 0x00000009, 0x01000000]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), - 'Minus': LayoutEntry([0x000000df, 0x0000003f, 0x0000005c, 0x000000bf]), - 'Equal': LayoutEntry([0x00000301, 0x00000300, 0x00000327, 0x00000328]), - 'BracketLeft': LayoutEntry([0x000000fc, 0x000000dc, 0x00000308, 0x0000030a]), - 'BracketRight': LayoutEntry([0x0000002b, 0x0000002a, 0x0000007e, 0x000000af]), - 'Backslash': LayoutEntry([0x00000023, 0x00000027, 0x00002019, 0x00000306]), - 'Semicolon': LayoutEntry([0x000000f6, 0x000000d6, 0x0000030b, 0x00000323]), - 'Quote': LayoutEntry([0x000000e4, 0x000000c4, 0x00000302, 0x0000030c]), - 'Backquote': LayoutEntry([0x00000302, 0x000000b0, 0x00002032, 0x00002033]), - 'Comma': LayoutEntry([0x0000002c, 0x0000003b, 0x000000b7, 0x000000d7]), - 'Period': LayoutEntry([0x0000002e, 0x0000003a, 0x00002026, 0x000000f7]), - 'Slash': LayoutEntry([0x0000002d, 0x0000005f, 0x00002013, 0x00002014]), - 'PrintScreen': LayoutEntry([0x01000000, 0x01000000, 0x01000000, 0x01000000]), - 'PageUp': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), - 'Numpad1': LayoutEntry([0x01000000, 0x00000031, 0x01000000, 0x00000031]), - 'Numpad2': LayoutEntry([0x01000000, 0x00000032, 0x01000000, 0x00000032]), - 'Numpad3': LayoutEntry([0x01000000, 0x00000033, 0x01000000, 0x00000033]), - 'Numpad4': LayoutEntry([0x01000000, 0x00000034, 0x01000000, 0x00000034]), - 'Numpad5': LayoutEntry([0x01000000, 0x00000035, 0x01000000, 0x00000035]), - 'Numpad6': LayoutEntry([0x01000000, 0x00000036, 0x01000000, 0x00000036]), - 'Numpad7': LayoutEntry([0x01000000, 0x00000037, 0x01000000, 0x00000037]), - 'Numpad8': LayoutEntry([0x01000000, 0x00000038, 0x01000000, 0x00000038]), - 'Numpad9': LayoutEntry([0x01000000, 0x00000039, 0x01000000, 0x00000039]), - 'Numpad0': LayoutEntry([0x01000000, 0x00000030, 0x01000000, 0x00000030]), - 'NumpadDecimal': LayoutEntry([0x01000000, 0x0000002c, 0x01000000, 0x0000002c]), - 'IntlBackslash': LayoutEntry([0x0000003c, 0x0000003e, 0x0000007c, 0x00000331]), - 'AltRight': LayoutEntry([0x0000000d, 0x0000000d, 0x0000000d, 0x0000000d]), - 'MetaRight': LayoutEntry([0x0000002e, 0x0000002e, 0x0000002e, 0x0000002e]), - }, - ), - - LayoutInfo( - name: 'de', - platform: LayoutPlatform.win, - mapping: { - 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x01000000, 0x01000000]), - 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x01000000]), - 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x01000000, 0x01000000]), - 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x01000000, 0x01000000]), - 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000020ac, 0x01000000]), - 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x01000000, 0x01000000]), - 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x01000000, 0x01000000]), - 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x01000000]), - 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x01000000]), - 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x01000000]), - 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x01000000]), - 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x01000000, 0x01000000]), - 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x000000b5, 0x01000000]), - 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x01000000]), - 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x01000000, 0x01000000]), - 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x01000000]), - 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x00000040, 0x01000000]), - 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x01000000, 0x01000000]), - 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x01000000, 0x01000000]), - 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x01000000, 0x01000000]), - 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x01000000]), - 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x01000000]), - 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x01000000, 0x01000000]), - 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x01000000, 0x01000000]), - 'KeyY': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x01000000]), - 'KeyZ': LayoutEntry([0x00000079, 0x00000059, 0x01000000, 0x01000000]), - 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x01000000, 0x01000000]), - 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x000000b2, 0x01000000]), - 'Digit3': LayoutEntry([0x00000033, 0x000000a7, 0x000000b3, 0x01000000]), - 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x01000000, 0x01000000]), - 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x01000000, 0x01000000]), - 'Digit6': LayoutEntry([0x00000036, 0x00000026, 0x01000000, 0x01000000]), - 'Digit7': LayoutEntry([0x00000037, 0x0000002f, 0x0000007b, 0x01000000]), - 'Digit8': LayoutEntry([0x00000038, 0x00000028, 0x0000005b, 0x01000000]), - 'Digit9': LayoutEntry([0x00000039, 0x00000029, 0x0000005d, 0x01000000]), - 'Digit0': LayoutEntry([0x00000030, 0x0000003d, 0x0000007d, 0x01000000]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), - 'Minus': LayoutEntry([0x000000df, 0x0000003f, 0x0000005c, 0x00001e9e]), - 'Equal': LayoutEntry([0x000000b4, 0x00000060, 0x01000000, 0x01000000]), - 'BracketLeft': LayoutEntry([0x000000fc, 0x000000dc, 0x01000000, 0x01000000]), - 'BracketRight': LayoutEntry([0x0000002b, 0x0000002a, 0x0000007e, 0x01000000]), - 'Backslash': LayoutEntry([0x00000023, 0x00000027, 0x01000000, 0x01000000]), - 'Semicolon': LayoutEntry([0x000000f6, 0x000000d6, 0x01000000, 0x01000000]), - 'Quote': LayoutEntry([0x000000e4, 0x000000c4, 0x01000000, 0x01000000]), - 'Backquote': LayoutEntry([0x0000005e, 0x000000b0, 0x01000000, 0x01000000]), - 'Comma': LayoutEntry([0x0000002c, 0x0000003b, 0x01000000, 0x01000000]), - 'Period': LayoutEntry([0x0000002e, 0x0000003a, 0x01000000, 0x01000000]), - 'Slash': LayoutEntry([0x0000002d, 0x0000005f, 0x01000000, 0x01000000]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), - 'IntlBackslash': LayoutEntry([0x0000003c, 0x0000003e, 0x0000007c, 0x01000000]), - }, - ), - - LayoutInfo( - name: 'dk', - platform: LayoutPlatform.win, - mapping: { - 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x01000000, 0x01000000]), - 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x01000000]), - 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x01000000, 0x01000000]), - 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x01000000, 0x01000000]), - 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000020ac, 0x01000000]), - 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x01000000, 0x01000000]), - 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x01000000, 0x01000000]), - 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x01000000]), - 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x01000000]), - 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x01000000]), - 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x01000000]), - 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x01000000, 0x01000000]), - 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x000000b5, 0x01000000]), - 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x01000000]), - 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x01000000, 0x01000000]), - 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x01000000]), - 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x01000000, 0x01000000]), - 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x01000000, 0x01000000]), - 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x01000000, 0x01000000]), - 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x01000000, 0x01000000]), - 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x01000000]), - 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x01000000]), - 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x01000000, 0x01000000]), - 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x01000000, 0x01000000]), - 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x01000000, 0x01000000]), - 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x01000000]), - 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x01000000, 0x01000000]), - 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x00000040, 0x01000000]), - 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x000000a3, 0x01000000]), - 'Digit4': LayoutEntry([0x00000034, 0x000000a4, 0x00000024, 0x01000000]), - 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x000020ac, 0x01000000]), - 'Digit6': LayoutEntry([0x00000036, 0x00000026, 0x01000000, 0x01000000]), - 'Digit7': LayoutEntry([0x00000037, 0x0000002f, 0x0000007b, 0x01000000]), - 'Digit8': LayoutEntry([0x00000038, 0x00000028, 0x0000005b, 0x01000000]), - 'Digit9': LayoutEntry([0x00000039, 0x00000029, 0x0000005d, 0x01000000]), - 'Digit0': LayoutEntry([0x00000030, 0x0000003d, 0x0000007d, 0x01000000]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), - 'Minus': LayoutEntry([0x0000002b, 0x0000003f, 0x01000000, 0x01000000]), - 'Equal': LayoutEntry([0x000000b4, 0x00000060, 0x0000007c, 0x01000000]), - 'BracketLeft': LayoutEntry([0x000000e5, 0x000000c5, 0x01000000, 0x01000000]), - 'BracketRight': LayoutEntry([0x000000a8, 0x0000005e, 0x0000007e, 0x01000000]), - 'Backslash': LayoutEntry([0x00000027, 0x0000002a, 0x01000000, 0x01000000]), - 'Semicolon': LayoutEntry([0x000000e6, 0x000000c6, 0x01000000, 0x01000000]), - 'Quote': LayoutEntry([0x000000f8, 0x000000d8, 0x01000000, 0x01000000]), - 'Backquote': LayoutEntry([0x000000bd, 0x000000a7, 0x01000000, 0x01000000]), - 'Comma': LayoutEntry([0x0000002c, 0x0000003b, 0x01000000, 0x01000000]), - 'Period': LayoutEntry([0x0000002e, 0x0000003a, 0x01000000, 0x01000000]), - 'Slash': LayoutEntry([0x0000002d, 0x0000005f, 0x01000000, 0x01000000]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), - 'IntlBackslash': LayoutEntry([0x0000003c, 0x0000003e, 0x0000005c, 0x01000000]), - }, - ), - - LayoutInfo( - name: 'dvorak', - platform: LayoutPlatform.darwin, - mapping: { - 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x000000e5, 0x000000c5]), - 'KeyB': LayoutEntry([0x00000078, 0x00000058, 0x00002248, 0x000002db]), - 'KeyC': LayoutEntry([0x0000006a, 0x0000004a, 0x00002206, 0x000000d4]), - 'KeyD': LayoutEntry([0x00000065, 0x00000045, 0x01000000, 0x000000b4]), - 'KeyE': LayoutEntry([0x0000002e, 0x0000003e, 0x00002265, 0x000002d8]), - 'KeyF': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x000000a8]), - 'KeyG': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x000002c6]), - 'KeyH': LayoutEntry([0x00000064, 0x00000044, 0x00002202, 0x000000ce]), - 'KeyI': LayoutEntry([0x00000063, 0x00000043, 0x000000e7, 0x000000c7]), - 'KeyJ': LayoutEntry([0x00000068, 0x00000048, 0x000002d9, 0x000000d3]), - 'KeyK': LayoutEntry([0x00000074, 0x00000054, 0x00002020, 0x000002c7]), - 'KeyL': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x000002dc]), - 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x000000b5, 0x000000c2]), - 'KeyN': LayoutEntry([0x00000062, 0x00000042, 0x0000222b, 0x00000131]), - 'KeyO': LayoutEntry([0x00000072, 0x00000052, 0x000000ae, 0x00002030]), - 'KeyP': LayoutEntry([0x0000006c, 0x0000004c, 0x000000ac, 0x000000d2]), - 'KeyQ': LayoutEntry([0x00000027, 0x00000022, 0x000000e6, 0x000000c6]), - 'KeyR': LayoutEntry([0x00000070, 0x00000050, 0x000003c0, 0x0000220f]), - 'KeyS': LayoutEntry([0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8]), - 'KeyT': LayoutEntry([0x00000079, 0x00000059, 0x000000a5, 0x000000c1]), - 'KeyU': LayoutEntry([0x00000067, 0x00000047, 0x000000a9, 0x000002dd]), - 'KeyV': LayoutEntry([0x0000006b, 0x0000004b, 0x000002da, 0x0000f8ff]), - 'KeyW': LayoutEntry([0x0000002c, 0x0000003c, 0x00002264, 0x000000af]), - 'KeyX': LayoutEntry([0x00000071, 0x00000051, 0x00000153, 0x00000152]), - 'KeyY': LayoutEntry([0x00000066, 0x00000046, 0x00000192, 0x000000cf]), - 'KeyZ': LayoutEntry([0x0000003b, 0x0000003a, 0x00002026, 0x000000da]), - 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x000000a1, 0x00002044]), - 'Digit2': LayoutEntry([0x00000032, 0x00000040, 0x00002122, 0x000020ac]), - 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x000000a3, 0x00002039]), - 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x000000a2, 0x0000203a]), - 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x0000221e, 0x0000fb01]), - 'Digit6': LayoutEntry([0x00000036, 0x0000005e, 0x000000a7, 0x0000fb02]), - 'Digit7': LayoutEntry([0x00000037, 0x00000026, 0x000000b6, 0x00002021]), - 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x00002022, 0x000000b0]), - 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x000000aa, 0x000000b7]), - 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x000000ba, 0x0000201a]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), - 'Minus': LayoutEntry([0x0000005b, 0x0000007b, 0x0000201c, 0x0000201d]), - 'Equal': LayoutEntry([0x0000005d, 0x0000007d, 0x00002018, 0x00002019]), - 'BracketLeft': LayoutEntry([0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf]), - 'BracketRight': LayoutEntry([0x0000003d, 0x0000002b, 0x00002260, 0x000000b1]), - 'Backslash': LayoutEntry([0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb]), - 'Semicolon': LayoutEntry([0x00000073, 0x00000053, 0x000000df, 0x000000cd]), - 'Quote': LayoutEntry([0x0000002d, 0x0000005f, 0x00002013, 0x00002014]), - 'Backquote': LayoutEntry([0x00000060, 0x0000007e, 0x01000000, 0x00000060]), - 'Comma': LayoutEntry([0x00000077, 0x00000057, 0x00002211, 0x0000201e]), - 'Period': LayoutEntry([0x00000076, 0x00000056, 0x0000221a, 0x000025ca]), - 'Slash': LayoutEntry([0x0000007a, 0x0000005a, 0x000003a9, 0x000000b8]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), - 'Numpad1': LayoutEntry([0x00000031, 0x00000031, 0x00000031, 0x00000031]), - 'Numpad2': LayoutEntry([0x00000032, 0x00000032, 0x00000032, 0x00000032]), - 'Numpad3': LayoutEntry([0x00000033, 0x00000033, 0x00000033, 0x00000033]), - 'Numpad4': LayoutEntry([0x00000034, 0x00000034, 0x00000034, 0x00000034]), - 'Numpad5': LayoutEntry([0x00000035, 0x00000035, 0x00000035, 0x00000035]), - 'Numpad6': LayoutEntry([0x00000036, 0x00000036, 0x00000036, 0x00000036]), - 'Numpad7': LayoutEntry([0x00000037, 0x00000037, 0x00000037, 0x00000037]), - 'Numpad8': LayoutEntry([0x00000038, 0x00000038, 0x00000038, 0x00000038]), - 'Numpad9': LayoutEntry([0x00000039, 0x00000039, 0x00000039, 0x00000039]), - 'Numpad0': LayoutEntry([0x00000030, 0x00000030, 0x00000030, 0x00000030]), - 'NumpadDecimal': LayoutEntry([0x0000002e, 0x0000002e, 0x0000002e, 0x0000002e]), - 'IntlBackslash': LayoutEntry([0x000000a7, 0x000000b1, 0x000000a7, 0x000000b1]), - 'NumpadEqual': LayoutEntry([0x0000003d, 0x0000003d, 0x0000003d, 0x0000003d]), - 'AudioVolumeUp': LayoutEntry([0x01000000, 0x0000003d, 0x01000000, 0x0000003d]), - }, - ), - - LayoutInfo( - name: 'en-belgian', - platform: LayoutPlatform.win, - mapping: { - 'KeyA': LayoutEntry([0x00000071, 0x00000051, 0x01000000, 0x01000000]), - 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x01000000]), - 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x01000000, 0x01000000]), - 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x01000000, 0x01000000]), - 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000020ac, 0x01000000]), - 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x01000000, 0x01000000]), - 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x01000000, 0x01000000]), - 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x01000000]), - 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x01000000]), - 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x01000000]), - 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x01000000]), - 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x01000000, 0x01000000]), - 'KeyM': LayoutEntry([0x0000002c, 0x0000003f, 0x01000000, 0x01000000]), - 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x01000000]), - 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x01000000, 0x01000000]), - 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x01000000]), - 'KeyQ': LayoutEntry([0x00000061, 0x00000041, 0x01000000, 0x01000000]), - 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x01000000, 0x01000000]), - 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x01000000, 0x01000000]), - 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x01000000, 0x01000000]), - 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x01000000]), - 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x01000000]), - 'KeyW': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x01000000]), - 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x01000000, 0x01000000]), - 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x01000000, 0x01000000]), - 'KeyZ': LayoutEntry([0x00000077, 0x00000057, 0x01000000, 0x01000000]), - 'Digit1': LayoutEntry([0x00000026, 0x00000031, 0x0000007c, 0x01000000]), - 'Digit2': LayoutEntry([0x000000e9, 0x00000032, 0x00000040, 0x01000000]), - 'Digit3': LayoutEntry([0x00000022, 0x00000033, 0x00000023, 0x01000000]), - 'Digit4': LayoutEntry([0x00000027, 0x00000034, 0x0000007b, 0x01000000]), - 'Digit5': LayoutEntry([0x00000028, 0x00000035, 0x0000005b, 0x01000000]), - 'Digit6': LayoutEntry([0x000000a7, 0x00000036, 0x0000005e, 0x01000000]), - 'Digit7': LayoutEntry([0x000000e8, 0x00000037, 0x01000000, 0x01000000]), - 'Digit8': LayoutEntry([0x00000021, 0x00000038, 0x01000000, 0x01000000]), - 'Digit9': LayoutEntry([0x000000e7, 0x00000039, 0x0000007b, 0x01000000]), - 'Digit0': LayoutEntry([0x000000e0, 0x00000030, 0x0000007d, 0x01000000]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), - 'Minus': LayoutEntry([0x00000029, 0x000000b0, 0x01000000, 0x01000000]), - 'Equal': LayoutEntry([0x0000002d, 0x0000005f, 0x01000000, 0x01000000]), - 'BracketLeft': LayoutEntry([0x0000005e, 0x000000a8, 0x0000005b, 0x01000000]), - 'BracketRight': LayoutEntry([0x00000024, 0x0000002a, 0x0000005d, 0x01000000]), - 'Backslash': LayoutEntry([0x000000b5, 0x000000a3, 0x00000060, 0x00000060]), - 'Semicolon': LayoutEntry([0x0000006d, 0x0000004d, 0x01000000, 0x01000000]), - 'Quote': LayoutEntry([0x000000f9, 0x00000025, 0x000000b4, 0x000000b4]), - 'Backquote': LayoutEntry([0x000000b2, 0x000000b3, 0x01000000, 0x01000000]), - 'Comma': LayoutEntry([0x0000003b, 0x0000002e, 0x01000000, 0x01000000]), - 'Period': LayoutEntry([0x0000003a, 0x0000002f, 0x01000000, 0x01000000]), - 'Slash': LayoutEntry([0x0000003d, 0x0000002b, 0x0000007e, 0x0000007e]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), - 'IntlBackslash': LayoutEntry([0x0000003c, 0x0000003e, 0x0000005c, 0x01000000]), - }, - ), - - LayoutInfo( - name: 'en-ext', - platform: LayoutPlatform.darwin, - mapping: { - 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x01000000, 0x00000304]), - 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x00000306]), - 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x01000000, 0x00000327]), - 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x000000f0, 0x000000d0]), - 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x01000000, 0x00000301]), - 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x00000192, 0x01000000]), - 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x000000a9, 0x01000000]), - 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x00000331]), - 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x0000031b]), - 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x0000030b]), - 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x0000030a]), - 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x01000000, 0x00000335]), - 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x01000000, 0x00000328]), - 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x00000303]), - 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8]), - 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x00000326]), - 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x00000153, 0x00000152]), - 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x000000ae, 0x00002030]), - 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x000000df, 0x01000000]), - 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x000000fe, 0x000000de]), - 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x00000308]), - 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x0000030c]), - 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x01000000, 0x00000307]), - 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x01000000, 0x00000323]), - 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x000000a5, 0x01000000]), - 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x00000309]), - 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x000000a1, 0x00002044]), - 'Digit2': LayoutEntry([0x00000032, 0x00000040, 0x00002122, 0x000020ac]), - 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x000000a3, 0x00002039]), - 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x000000a2, 0x0000203a]), - 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x000000a7, 0x00002020]), - 'Digit6': LayoutEntry([0x00000036, 0x0000005e, 0x01000000, 0x00000302]), - 'Digit7': LayoutEntry([0x00000037, 0x00000026, 0x000000b6, 0x00002021]), - 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x00002022, 0x000000b0]), - 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x000000aa, 0x000000b7]), - 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x000000ba, 0x0000201a]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), - 'Minus': LayoutEntry([0x0000002d, 0x0000005f, 0x00002013, 0x00002014]), - 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x00002260, 0x000000b1]), - 'BracketLeft': LayoutEntry([0x0000005b, 0x0000007b, 0x0000201c, 0x0000201d]), - 'BracketRight': LayoutEntry([0x0000005d, 0x0000007d, 0x00002018, 0x00002019]), - 'Backslash': LayoutEntry([0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb]), - 'Semicolon': LayoutEntry([0x0000003b, 0x0000003a, 0x00002026, 0x01000000]), - 'Quote': LayoutEntry([0x00000027, 0x00000022, 0x000000e6, 0x000000c6]), - 'Backquote': LayoutEntry([0x00000060, 0x0000007e, 0x01000000, 0x00000300]), - 'Comma': LayoutEntry([0x0000002c, 0x0000003c, 0x00002264, 0x0000201e]), - 'Period': LayoutEntry([0x0000002e, 0x0000003e, 0x00002265, 0x01000000]), - 'Slash': LayoutEntry([0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), - 'Numpad1': LayoutEntry([0x00000031, 0x00000031, 0x00000031, 0x00000031]), - 'Numpad2': LayoutEntry([0x00000032, 0x00000032, 0x00000032, 0x00000032]), - 'Numpad3': LayoutEntry([0x00000033, 0x00000033, 0x00000033, 0x00000033]), - 'Numpad4': LayoutEntry([0x00000034, 0x00000034, 0x00000034, 0x00000034]), - 'Numpad5': LayoutEntry([0x00000035, 0x00000035, 0x00000035, 0x00000035]), - 'Numpad6': LayoutEntry([0x00000036, 0x00000036, 0x00000036, 0x00000036]), - 'Numpad7': LayoutEntry([0x00000037, 0x00000037, 0x00000037, 0x00000037]), - 'Numpad8': LayoutEntry([0x00000038, 0x00000038, 0x00000038, 0x00000038]), - 'Numpad9': LayoutEntry([0x00000039, 0x00000039, 0x00000039, 0x00000039]), - 'Numpad0': LayoutEntry([0x00000030, 0x00000030, 0x00000030, 0x00000030]), - 'NumpadDecimal': LayoutEntry([0x0000002e, 0x0000002e, 0x0000002e, 0x0000002e]), - 'IntlBackslash': LayoutEntry([0x000000a7, 0x000000b1, 0x000000a7, 0x000000b1]), - 'NumpadEqual': LayoutEntry([0x0000003d, 0x0000003d, 0x0000003d, 0x0000003d]), - 'AudioVolumeUp': LayoutEntry([0x01000000, 0x0000003d, 0x01000000, 0x0000003d]), - }, - ), - - LayoutInfo( - name: 'en-in', - platform: LayoutPlatform.win, - mapping: { - 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x00000101, 0x00000100]), - 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x01000000]), - 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x01000000, 0x01000000]), - 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x00001e0d, 0x00001e0c]), - 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x00000113, 0x00000112]), - 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x01000000, 0x01000000]), - 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x00001e45, 0x00001e44]), - 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x00001e25, 0x00001e24]), - 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x0000012b, 0x0000012a]), - 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x01000000]), - 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x01000000]), - 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x0000006c, 0x0000004c]), - 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x00001e41, 0x00001e40]), - 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x00001e47, 0x00001e46]), - 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x0000014d, 0x0000014c]), - 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x01000000]), - 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x000000e6, 0x000000c6]), - 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x00000072, 0x00000052]), - 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x0000015b, 0x0000015a]), - 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x00001e6d, 0x00001e6c]), - 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x0000016b, 0x0000016a]), - 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x01000000]), - 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x01000000, 0x01000000]), - 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x00001e63, 0x00001e62]), - 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x000000f1, 0x000000d1]), - 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x01000000]), - 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x01000000, 0x01000000]), - 'Digit2': LayoutEntry([0x00000032, 0x00000040, 0x01000000, 0x01000000]), - 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x01000000, 0x01000000]), - 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x000020b9, 0x01000000]), - 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x01000000, 0x01000000]), - 'Digit6': LayoutEntry([0x00000036, 0x0000005e, 0x01000000, 0x000002c6]), - 'Digit7': LayoutEntry([0x00000037, 0x00000026, 0x01000000, 0x01000000]), - 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x01000000, 0x01000000]), - 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x01000000, 0x000002d8]), - 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x01000000, 0x01000000]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), - 'Minus': LayoutEntry([0x0000002d, 0x0000005f, 0x0000002d, 0x000002cd]), - 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x01000000, 0x01000000]), - 'BracketLeft': LayoutEntry([0x0000005b, 0x0000007b, 0x01000000, 0x01000000]), - 'BracketRight': LayoutEntry([0x0000005d, 0x0000007d, 0x01000000, 0x01000000]), - 'Backslash': LayoutEntry([0x0000005c, 0x0000007c, 0x01000000, 0x01000000]), - 'Semicolon': LayoutEntry([0x0000003b, 0x0000003a, 0x01000000, 0x01000000]), - 'Quote': LayoutEntry([0x00000027, 0x00000022, 0x01000000, 0x01000000]), - 'Backquote': LayoutEntry([0x00000060, 0x0000007e, 0x01000000, 0x0000007e]), - 'Comma': LayoutEntry([0x0000002c, 0x0000003c, 0x0000002c, 0x0000003c]), - 'Period': LayoutEntry([0x0000002e, 0x0000003e, 0x0000002e, 0x01000000]), - 'Slash': LayoutEntry([0x0000002f, 0x0000003f, 0x01000000, 0x01000000]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), - 'IntlBackslash': LayoutEntry([0x0000005c, 0x0000007c, 0x01000000, 0x01000000]), - }, - ), - - LayoutInfo( - name: 'en-intl', - platform: LayoutPlatform.darwin, - mapping: { - 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x000000e5, 0x000000c5]), - 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x0000222b, 0x00000131]), - 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x000000e7, 0x000000c7]), - 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x00002202, 0x000000ce]), - 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x01000000, 0x000000b4]), - 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x00000192, 0x000000cf]), - 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x000000a9, 0x000002dd]), - 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x000002d9, 0x000000d3]), - 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x000002c6]), - 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x00002206, 0x000000d4]), - 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x000002da, 0x0000f8ff]), - 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x000000ac, 0x000000d2]), - 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x000000b5, 0x000000c2]), - 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x000002dc]), - 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8]), - 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x000003c0, 0x0000220f]), - 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x00000153, 0x00000152]), - 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x000000ae, 0x00002030]), - 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x000000df, 0x000000cd]), - 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x00002020, 0x000002c7]), - 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x000000a8]), - 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x0000221a, 0x000025ca]), - 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x00002211, 0x0000201e]), - 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x00002248, 0x000002db]), - 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x000000a5, 0x000000c1]), - 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x000003a9, 0x000000b8]), - 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x000000a1, 0x00002044]), - 'Digit2': LayoutEntry([0x00000032, 0x00000040, 0x00002122, 0x000020ac]), - 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x000000a3, 0x00002039]), - 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x000000a2, 0x0000203a]), - 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x0000221e, 0x0000fb01]), - 'Digit6': LayoutEntry([0x00000036, 0x01000000, 0x000000a7, 0x0000fb02]), - 'Digit7': LayoutEntry([0x00000037, 0x00000026, 0x000000b6, 0x00002021]), - 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x00002022, 0x000000b0]), - 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x000000aa, 0x000000b7]), - 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x000000ba, 0x0000201a]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), - 'Minus': LayoutEntry([0x0000002d, 0x0000005f, 0x00002013, 0x00002014]), - 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x00002260, 0x000000b1]), - 'BracketLeft': LayoutEntry([0x0000005b, 0x0000007b, 0x0000201c, 0x0000201d]), - 'BracketRight': LayoutEntry([0x0000005d, 0x0000007d, 0x00002018, 0x00002019]), - 'Backslash': LayoutEntry([0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb]), - 'Semicolon': LayoutEntry([0x0000003b, 0x0000003a, 0x00002026, 0x000000da]), - 'Quote': LayoutEntry([0x01000000, 0x01000000, 0x000000e6, 0x000000c6]), - 'Backquote': LayoutEntry([0x01000000, 0x01000000, 0x01000000, 0x00000060]), - 'Comma': LayoutEntry([0x0000002c, 0x0000003c, 0x00002264, 0x000000af]), - 'Period': LayoutEntry([0x0000002e, 0x0000003e, 0x00002265, 0x000002d8]), - 'Slash': LayoutEntry([0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), - 'Numpad1': LayoutEntry([0x00000031, 0x00000031, 0x00000031, 0x00000031]), - 'Numpad2': LayoutEntry([0x00000032, 0x00000032, 0x00000032, 0x00000032]), - 'Numpad3': LayoutEntry([0x00000033, 0x00000033, 0x00000033, 0x00000033]), - 'Numpad4': LayoutEntry([0x00000034, 0x00000034, 0x00000034, 0x00000034]), - 'Numpad5': LayoutEntry([0x00000035, 0x00000035, 0x00000035, 0x00000035]), - 'Numpad6': LayoutEntry([0x00000036, 0x00000036, 0x00000036, 0x00000036]), - 'Numpad7': LayoutEntry([0x00000037, 0x00000037, 0x00000037, 0x00000037]), - 'Numpad8': LayoutEntry([0x00000038, 0x00000038, 0x00000038, 0x00000038]), - 'Numpad9': LayoutEntry([0x00000039, 0x00000039, 0x00000039, 0x00000039]), - 'Numpad0': LayoutEntry([0x00000030, 0x00000030, 0x00000030, 0x00000030]), - 'NumpadDecimal': LayoutEntry([0x0000002e, 0x0000002e, 0x0000002e, 0x0000002e]), - 'IntlBackslash': LayoutEntry([0x000000a7, 0x000000b1, 0x000000a7, 0x000000b1]), - 'NumpadEqual': LayoutEntry([0x0000003d, 0x0000003d, 0x0000003d, 0x0000003d]), - 'AudioVolumeUp': LayoutEntry([0x01000000, 0x0000003d, 0x01000000, 0x0000003d]), - }, - ), - - LayoutInfo( - name: 'en-intl', - platform: LayoutPlatform.win, - mapping: { - 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x000000e1, 0x000000c1]), - 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x01000000]), - 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x000000a9, 0x000000a2]), - 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x000000f0, 0x000000d0]), - 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000000e9, 0x000000c9]), - 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x01000000, 0x01000000]), - 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x01000000, 0x01000000]), - 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x01000000]), - 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x000000ed, 0x000000cd]), - 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x01000000]), - 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x01000000]), - 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x000000f8, 0x000000d8]), - 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x000000b5, 0x01000000]), - 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x000000f1, 0x000000d1]), - 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x000000f3, 0x000000d3]), - 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x000000f6, 0x000000d6]), - 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x000000e4, 0x000000c4]), - 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x000000ae, 0x01000000]), - 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x000000df, 0x000000a7]), - 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x000000fe, 0x000000de]), - 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x000000fa, 0x000000da]), - 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x01000000]), - 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x000000e5, 0x000000c5]), - 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x01000000, 0x01000000]), - 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x000000fc, 0x000000dc]), - 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x000000e6, 0x000000c6]), - 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x000000a1, 0x000000b9]), - 'Digit2': LayoutEntry([0x00000032, 0x00000040, 0x000000b2, 0x01000000]), - 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x000000b3, 0x01000000]), - 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x000000a4, 0x000000a3]), - 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x000020ac, 0x01000000]), - 'Digit6': LayoutEntry([0x00000036, 0x0000005e, 0x000000bc, 0x01000000]), - 'Digit7': LayoutEntry([0x00000037, 0x00000026, 0x000000bd, 0x01000000]), - 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x000000be, 0x01000000]), - 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x00002018, 0x01000000]), - 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x00002019, 0x01000000]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), - 'Minus': LayoutEntry([0x0000002d, 0x0000005f, 0x000000a5, 0x01000000]), - 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x000000d7, 0x000000f7]), - 'BracketLeft': LayoutEntry([0x0000005b, 0x0000007b, 0x000000ab, 0x01000000]), - 'BracketRight': LayoutEntry([0x0000005d, 0x0000007d, 0x000000bb, 0x01000000]), - 'Backslash': LayoutEntry([0x0000005c, 0x0000007c, 0x000000ac, 0x000000a6]), - 'Semicolon': LayoutEntry([0x0000003b, 0x0000003a, 0x000000b6, 0x000000b0]), - 'Quote': LayoutEntry([0x00000027, 0x00000022, 0x000000b4, 0x000000a8]), - 'Backquote': LayoutEntry([0x00000060, 0x0000007e, 0x01000000, 0x01000000]), - 'Comma': LayoutEntry([0x0000002c, 0x0000003c, 0x000000e7, 0x000000c7]), - 'Period': LayoutEntry([0x0000002e, 0x0000003e, 0x01000000, 0x01000000]), - 'Slash': LayoutEntry([0x0000002f, 0x0000003f, 0x000000bf, 0x01000000]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), - 'IntlBackslash': LayoutEntry([0x0000005c, 0x0000007c, 0x01000000, 0x01000000]), - }, - ), - - LayoutInfo( - name: 'en-uk', - platform: LayoutPlatform.darwin, - mapping: { - 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x000000e5, 0x000000c5]), - 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x0000222b, 0x00000131]), - 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x000000e7, 0x000000c7]), - 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x00002202, 0x000000ce]), - 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x01000000, 0x00002030]), - 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x00000192, 0x000000cf]), - 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x000000a9, 0x000000cc]), - 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x000002d9, 0x000000d3]), - 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x000000c8]), - 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x00002206, 0x000000d4]), - 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x000002da, 0x0000f8ff]), - 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x000000ac, 0x000000d2]), - 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x000000b5, 0x000002dc]), - 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x000002c6]), - 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8]), - 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x000003c0, 0x0000220f]), - 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x00000153, 0x00000152]), - 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x000000ae, 0x000000c2]), - 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x000000df, 0x000000cd]), - 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x00002020, 0x000000ca]), - 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x000000cb]), - 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x0000221a, 0x000025ca]), - 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x00002211, 0x0000201e]), - 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x00002248, 0x000000d9]), - 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x000000a5, 0x000000c1]), - 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x000003a9, 0x000000db]), - 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x000000a1, 0x00002044]), - 'Digit2': LayoutEntry([0x00000032, 0x00000040, 0x000020ac, 0x00002122]), - 'Digit3': LayoutEntry([0x00000033, 0x000000a3, 0x00000023, 0x00002039]), - 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x000000a2, 0x0000203a]), - 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x0000221e, 0x0000fb01]), - 'Digit6': LayoutEntry([0x00000036, 0x0000005e, 0x000000a7, 0x0000fb02]), - 'Digit7': LayoutEntry([0x00000037, 0x00000026, 0x000000b6, 0x00002021]), - 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x00002022, 0x000000b0]), - 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x000000aa, 0x000000b7]), - 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x000000ba, 0x0000201a]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), - 'Minus': LayoutEntry([0x0000002d, 0x0000005f, 0x00002013, 0x00002014]), - 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x00002260, 0x000000b1]), - 'BracketLeft': LayoutEntry([0x0000005b, 0x0000007b, 0x0000201c, 0x0000201d]), - 'BracketRight': LayoutEntry([0x0000005d, 0x0000007d, 0x00002018, 0x00002019]), - 'Backslash': LayoutEntry([0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb]), - 'Semicolon': LayoutEntry([0x0000003b, 0x0000003a, 0x00002026, 0x000000da]), - 'Quote': LayoutEntry([0x00000027, 0x00000022, 0x000000e6, 0x000000c6]), - 'Backquote': LayoutEntry([0x00000060, 0x0000007e, 0x01000000, 0x00000178]), - 'Comma': LayoutEntry([0x0000002c, 0x0000003c, 0x00002264, 0x000000af]), - 'Period': LayoutEntry([0x0000002e, 0x0000003e, 0x00002265, 0x000002d8]), - 'Slash': LayoutEntry([0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), - 'Numpad1': LayoutEntry([0x00000031, 0x00000031, 0x00000031, 0x00000031]), - 'Numpad2': LayoutEntry([0x00000032, 0x00000032, 0x00000032, 0x00000032]), - 'Numpad3': LayoutEntry([0x00000033, 0x00000033, 0x00000033, 0x00000033]), - 'Numpad4': LayoutEntry([0x00000034, 0x00000034, 0x00000034, 0x00000034]), - 'Numpad5': LayoutEntry([0x00000035, 0x00000035, 0x00000035, 0x00000035]), - 'Numpad6': LayoutEntry([0x00000036, 0x00000036, 0x00000036, 0x00000036]), - 'Numpad7': LayoutEntry([0x00000037, 0x00000037, 0x00000037, 0x00000037]), - 'Numpad8': LayoutEntry([0x00000038, 0x00000038, 0x00000038, 0x00000038]), - 'Numpad9': LayoutEntry([0x00000039, 0x00000039, 0x00000039, 0x00000039]), - 'Numpad0': LayoutEntry([0x00000030, 0x00000030, 0x00000030, 0x00000030]), - 'NumpadDecimal': LayoutEntry([0x0000002e, 0x0000002e, 0x0000002e, 0x0000002e]), - 'IntlBackslash': LayoutEntry([0x000000a7, 0x000000b1, 0x01000000, 0x01000000]), - 'NumpadEqual': LayoutEntry([0x0000003d, 0x0000003d, 0x0000003d, 0x0000003d]), - 'AudioVolumeUp': LayoutEntry([0x01000000, 0x0000003d, 0x01000000, 0x0000003d]), - }, - ), - - LayoutInfo( - name: 'en-uk', - platform: LayoutPlatform.win, - mapping: { - 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x000000e1, 0x000000c1]), - 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x01000000]), - 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x01000000, 0x01000000]), - 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x01000000, 0x01000000]), - 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000000e9, 0x000000c9]), - 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x01000000, 0x01000000]), - 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x01000000, 0x01000000]), - 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x01000000]), - 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x000000ed, 0x000000cd]), - 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x01000000]), - 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x01000000]), - 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x01000000, 0x01000000]), - 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x01000000, 0x01000000]), - 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x01000000]), - 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x000000f3, 0x000000d3]), - 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x01000000]), - 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x01000000, 0x01000000]), - 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x01000000, 0x01000000]), - 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x01000000, 0x01000000]), - 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x01000000, 0x01000000]), - 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x000000fa, 0x000000da]), - 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x01000000]), - 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x01000000, 0x01000000]), - 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x01000000, 0x01000000]), - 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x01000000, 0x01000000]), - 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x01000000]), - 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x01000000, 0x01000000]), - 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x01000000, 0x01000000]), - 'Digit3': LayoutEntry([0x00000033, 0x000000a3, 0x01000000, 0x01000000]), - 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x000020ac, 0x01000000]), - 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x01000000, 0x01000000]), - 'Digit6': LayoutEntry([0x00000036, 0x0000005e, 0x01000000, 0x01000000]), - 'Digit7': LayoutEntry([0x00000037, 0x00000026, 0x01000000, 0x01000000]), - 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x01000000, 0x01000000]), - 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x01000000, 0x01000000]), - 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x01000000, 0x01000000]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), - 'Minus': LayoutEntry([0x0000002d, 0x0000005f, 0x01000000, 0x01000000]), - 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x01000000, 0x01000000]), - 'BracketLeft': LayoutEntry([0x0000005b, 0x0000007b, 0x01000000, 0x01000000]), - 'BracketRight': LayoutEntry([0x0000005d, 0x0000007d, 0x01000000, 0x01000000]), - 'Backslash': LayoutEntry([0x00000023, 0x0000007e, 0x0000005c, 0x0000007c]), - 'Semicolon': LayoutEntry([0x0000003b, 0x0000003a, 0x01000000, 0x01000000]), - 'Quote': LayoutEntry([0x00000027, 0x00000040, 0x01000000, 0x01000000]), - 'Backquote': LayoutEntry([0x00000060, 0x000000ac, 0x000000a6, 0x01000000]), - 'Comma': LayoutEntry([0x0000002c, 0x0000003c, 0x01000000, 0x01000000]), - 'Period': LayoutEntry([0x0000002e, 0x0000003e, 0x01000000, 0x01000000]), - 'Slash': LayoutEntry([0x0000002f, 0x0000003f, 0x01000000, 0x01000000]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), - 'IntlBackslash': LayoutEntry([0x0000005c, 0x0000007c, 0x01000000, 0x01000000]), - }, - ), - - LayoutInfo( - name: 'en', - platform: LayoutPlatform.darwin, - mapping: { - 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x000000e5, 0x000000c5]), - 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x0000222b, 0x00000131]), - 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x000000e7, 0x000000c7]), - 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x00002202, 0x000000ce]), - 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x01000000, 0x000000b4]), - 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x00000192, 0x000000cf]), - 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x000000a9, 0x000002dd]), - 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x000002d9, 0x000000d3]), - 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x000002c6]), - 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x00002206, 0x000000d4]), - 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x000002da, 0x0000f8ff]), - 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x000000ac, 0x000000d2]), - 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x000000b5, 0x000000c2]), - 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x000002dc]), - 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8]), - 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x000003c0, 0x0000220f]), - 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x00000153, 0x00000152]), - 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x000000ae, 0x00002030]), - 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x000000df, 0x000000cd]), - 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x00002020, 0x000002c7]), - 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x000000a8]), - 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x0000221a, 0x000025ca]), - 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x00002211, 0x0000201e]), - 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x00002248, 0x000002db]), - 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x000000a5, 0x000000c1]), - 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x000003a9, 0x000000b8]), - 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x000000a1, 0x00002044]), - 'Digit2': LayoutEntry([0x00000032, 0x00000040, 0x00002122, 0x000020ac]), - 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x000000a3, 0x00002039]), - 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x000000a2, 0x0000203a]), - 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x0000221e, 0x0000fb01]), - 'Digit6': LayoutEntry([0x00000036, 0x0000005e, 0x000000a7, 0x0000fb02]), - 'Digit7': LayoutEntry([0x00000037, 0x00000026, 0x000000b6, 0x00002021]), - 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x00002022, 0x000000b0]), - 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x000000aa, 0x000000b7]), - 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x000000ba, 0x0000201a]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), - 'Minus': LayoutEntry([0x0000002d, 0x0000005f, 0x00002013, 0x00002014]), - 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x00002260, 0x000000b1]), - 'BracketLeft': LayoutEntry([0x0000005b, 0x0000007b, 0x0000201c, 0x0000201d]), - 'BracketRight': LayoutEntry([0x0000005d, 0x0000007d, 0x00002018, 0x00002019]), - 'Backslash': LayoutEntry([0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb]), - 'Semicolon': LayoutEntry([0x0000003b, 0x0000003a, 0x00002026, 0x000000da]), - 'Quote': LayoutEntry([0x00000027, 0x00000022, 0x000000e6, 0x000000c6]), - 'Backquote': LayoutEntry([0x00000060, 0x0000007e, 0x01000000, 0x00000060]), - 'Comma': LayoutEntry([0x0000002c, 0x0000003c, 0x00002264, 0x000000af]), - 'Period': LayoutEntry([0x0000002e, 0x0000003e, 0x00002265, 0x000002d8]), - 'Slash': LayoutEntry([0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), - 'Numpad1': LayoutEntry([0x00000031, 0x00000031, 0x00000031, 0x00000031]), - 'Numpad2': LayoutEntry([0x00000032, 0x00000032, 0x00000032, 0x00000032]), - 'Numpad3': LayoutEntry([0x00000033, 0x00000033, 0x00000033, 0x00000033]), - 'Numpad4': LayoutEntry([0x00000034, 0x00000034, 0x00000034, 0x00000034]), - 'Numpad5': LayoutEntry([0x00000035, 0x00000035, 0x00000035, 0x00000035]), - 'Numpad6': LayoutEntry([0x00000036, 0x00000036, 0x00000036, 0x00000036]), - 'Numpad7': LayoutEntry([0x00000037, 0x00000037, 0x00000037, 0x00000037]), - 'Numpad8': LayoutEntry([0x00000038, 0x00000038, 0x00000038, 0x00000038]), - 'Numpad9': LayoutEntry([0x00000039, 0x00000039, 0x00000039, 0x00000039]), - 'Numpad0': LayoutEntry([0x00000030, 0x00000030, 0x00000030, 0x00000030]), - 'NumpadDecimal': LayoutEntry([0x0000002e, 0x0000002e, 0x0000002e, 0x0000002e]), - 'IntlBackslash': LayoutEntry([0x000000a7, 0x000000b1, 0x000000a7, 0x000000b1]), - 'NumpadEqual': LayoutEntry([0x0000003d, 0x0000003d, 0x0000003d, 0x0000003d]), - 'AudioVolumeUp': LayoutEntry([0x01000000, 0x0000003d, 0x01000000, 0x0000003d]), - }, - ), - - LayoutInfo( - name: 'en', - platform: LayoutPlatform.linux, - mapping: { - 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x00000061, 0x00000041]), - 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x00000062, 0x00000042]), - 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x00000063, 0x00000043]), - 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x00000064, 0x00000044]), - 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x00000065, 0x00000045]), - 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x00000066, 0x00000046]), - 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x00000067, 0x00000047]), - 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x00000068, 0x00000048]), - 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x00000069, 0x00000049]), - 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x0000006a, 0x0000004a]), - 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x0000006b, 0x0000004b]), - 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x0000006c, 0x0000004c]), - 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x0000006d, 0x0000004d]), - 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x0000006e, 0x0000004e]), - 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x0000006f, 0x0000004f]), - 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x00000070, 0x00000050]), - 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x00000071, 0x00000051]), - 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x00000072, 0x00000052]), - 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x00000073, 0x00000053]), - 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x00000074, 0x00000054]), - 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x00000075, 0x00000055]), - 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x00000076, 0x00000056]), - 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x00000077, 0x00000057]), - 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x00000078, 0x00000058]), - 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x00000079, 0x00000059]), - 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x0000007a, 0x0000005a]), - 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x00000031, 0x00000021]), - 'Digit2': LayoutEntry([0x00000032, 0x00000040, 0x00000032, 0x00000040]), - 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x00000033, 0x00000023]), - 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x00000034, 0x00000024]), - 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x00000035, 0x00000025]), - 'Digit6': LayoutEntry([0x00000036, 0x0000005e, 0x00000036, 0x0000005e]), - 'Digit7': LayoutEntry([0x00000037, 0x00000026, 0x00000037, 0x00000026]), - 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x00000038, 0x0000002a]), - 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x00000039, 0x00000028]), - 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x00000030, 0x00000029]), - 'Enter': LayoutEntry([0x0000000d, 0x0000000d, 0x0000000d, 0x0000000d]), - 'Escape': LayoutEntry([0x0000001b, 0x0000001b, 0x0000001b, 0x0000001b]), - 'Backspace': LayoutEntry([0x00000008, 0x00000008, 0x00000008, 0x00000008]), - 'Tab': LayoutEntry([0x00000009, 0x01000000, 0x00000009, 0x01000000]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), - 'Minus': LayoutEntry([0x0000002d, 0x0000005f, 0x0000002d, 0x0000005f]), - 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x0000003d, 0x0000002b]), - 'BracketLeft': LayoutEntry([0x0000005b, 0x0000007b, 0x0000005b, 0x0000007b]), - 'BracketRight': LayoutEntry([0x0000005d, 0x0000007d, 0x0000005d, 0x0000007d]), - 'Backslash': LayoutEntry([0x0000005c, 0x0000007c, 0x0000005c, 0x0000007c]), - 'Semicolon': LayoutEntry([0x0000003b, 0x0000003a, 0x0000003b, 0x0000003a]), - 'Quote': LayoutEntry([0x00000027, 0x00000022, 0x00000027, 0x00000022]), - 'Backquote': LayoutEntry([0x00000060, 0x0000007e, 0x00000060, 0x0000007e]), - 'Comma': LayoutEntry([0x0000002c, 0x0000003c, 0x0000002c, 0x0000003c]), - 'Period': LayoutEntry([0x0000002e, 0x0000003e, 0x0000002e, 0x0000003e]), - 'Slash': LayoutEntry([0x0000002f, 0x0000003f, 0x0000002f, 0x0000003f]), - 'Delete': LayoutEntry([0x01000000, 0x01000000, 0x01000000, 0x01000000]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), - 'NumpadEnter': LayoutEntry([0x0000000d, 0x0000000d, 0x0000000d, 0x0000000d]), - 'Numpad1': LayoutEntry([0x01000000, 0x00000031, 0x01000000, 0x00000031]), - 'Numpad2': LayoutEntry([0x01000000, 0x00000032, 0x01000000, 0x00000032]), - 'Numpad3': LayoutEntry([0x01000000, 0x00000033, 0x01000000, 0x00000033]), - 'Numpad4': LayoutEntry([0x01000000, 0x00000034, 0x01000000, 0x00000034]), - 'Numpad5': LayoutEntry([0x01000000, 0x00000035, 0x01000000, 0x00000035]), - 'Numpad6': LayoutEntry([0x01000000, 0x00000036, 0x01000000, 0x00000036]), - 'Numpad7': LayoutEntry([0x01000000, 0x00000037, 0x01000000, 0x00000037]), - 'Numpad8': LayoutEntry([0x01000000, 0x00000038, 0x01000000, 0x00000038]), - 'Numpad9': LayoutEntry([0x01000000, 0x00000039, 0x01000000, 0x00000039]), - 'Numpad0': LayoutEntry([0x01000000, 0x00000030, 0x01000000, 0x00000030]), - 'NumpadDecimal': LayoutEntry([0x01000000, 0x0000002e, 0x01000000, 0x0000002e]), - 'IntlBackslash': LayoutEntry([0x0000003c, 0x0000003e, 0x0000007c, 0x000000a6]), - 'NumpadEqual': LayoutEntry([0x0000003d, 0x0000003d, 0x0000003d, 0x0000003d]), - 'NumpadComma': LayoutEntry([0x0000002e, 0x0000002e, 0x0000002e, 0x0000002e]), - 'NumpadParenLeft': LayoutEntry([0x00000028, 0x00000028, 0x00000028, 0x00000028]), - 'NumpadParenRight': LayoutEntry([0x00000029, 0x00000029, 0x00000029, 0x00000029]), - }, - ), - - LayoutInfo( - name: 'en', - platform: LayoutPlatform.win, - mapping: { - 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x01000000, 0x01000000]), - 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x01000000]), - 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x01000000, 0x01000000]), - 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x01000000, 0x01000000]), - 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x01000000, 0x01000000]), - 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x01000000, 0x01000000]), - 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x01000000, 0x01000000]), - 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x01000000]), - 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x01000000]), - 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x01000000]), - 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x01000000]), - 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x01000000, 0x01000000]), - 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x01000000, 0x01000000]), - 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x01000000]), - 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x01000000, 0x01000000]), - 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x01000000]), - 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x01000000, 0x01000000]), - 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x01000000, 0x01000000]), - 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x01000000, 0x01000000]), - 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x01000000, 0x01000000]), - 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x01000000]), - 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x01000000]), - 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x01000000, 0x01000000]), - 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x01000000, 0x01000000]), - 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x01000000, 0x01000000]), - 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x01000000]), - 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x01000000, 0x01000000]), - 'Digit2': LayoutEntry([0x00000032, 0x00000040, 0x01000000, 0x01000000]), - 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x01000000, 0x01000000]), - 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x01000000, 0x01000000]), - 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x01000000, 0x01000000]), - 'Digit6': LayoutEntry([0x00000036, 0x0000005e, 0x01000000, 0x01000000]), - 'Digit7': LayoutEntry([0x00000037, 0x00000026, 0x01000000, 0x01000000]), - 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x01000000, 0x01000000]), - 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x01000000, 0x01000000]), - 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x01000000, 0x01000000]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), - 'Minus': LayoutEntry([0x0000002d, 0x0000005f, 0x01000000, 0x01000000]), - 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x01000000, 0x01000000]), - 'BracketLeft': LayoutEntry([0x0000005b, 0x0000007b, 0x01000000, 0x01000000]), - 'BracketRight': LayoutEntry([0x0000005d, 0x0000007d, 0x01000000, 0x01000000]), - 'Backslash': LayoutEntry([0x0000005c, 0x0000007c, 0x01000000, 0x01000000]), - 'Semicolon': LayoutEntry([0x0000003b, 0x0000003a, 0x01000000, 0x01000000]), - 'Quote': LayoutEntry([0x00000027, 0x00000022, 0x01000000, 0x01000000]), - 'Backquote': LayoutEntry([0x00000060, 0x0000007e, 0x01000000, 0x01000000]), - 'Comma': LayoutEntry([0x0000002c, 0x0000003c, 0x01000000, 0x01000000]), - 'Period': LayoutEntry([0x0000002e, 0x0000003e, 0x01000000, 0x01000000]), - 'Slash': LayoutEntry([0x0000002f, 0x0000003f, 0x01000000, 0x01000000]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), - 'IntlBackslash': LayoutEntry([0x0000005c, 0x0000007c, 0x01000000, 0x01000000]), - }, - ), - - LayoutInfo( - name: 'es-latin', - platform: LayoutPlatform.win, - mapping: { - 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x01000000, 0x01000000]), - 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x01000000]), - 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x01000000, 0x01000000]), - 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x01000000, 0x01000000]), - 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x01000000, 0x01000000]), - 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x01000000, 0x01000000]), - 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x01000000, 0x01000000]), - 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x01000000]), - 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x01000000]), - 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x01000000]), - 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x01000000]), - 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x01000000, 0x01000000]), - 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x01000000, 0x01000000]), - 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x01000000]), - 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x01000000, 0x01000000]), - 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x01000000]), - 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x00000040, 0x01000000]), - 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x01000000, 0x01000000]), - 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x01000000, 0x01000000]), - 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x01000000, 0x01000000]), - 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x01000000]), - 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x01000000]), - 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x01000000, 0x01000000]), - 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x01000000, 0x01000000]), - 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x01000000, 0x01000000]), - 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x01000000]), - 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x01000000, 0x01000000]), - 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x01000000, 0x01000000]), - 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x01000000, 0x01000000]), - 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x01000000, 0x01000000]), - 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x01000000, 0x01000000]), - 'Digit6': LayoutEntry([0x00000036, 0x00000026, 0x01000000, 0x01000000]), - 'Digit7': LayoutEntry([0x00000037, 0x0000002f, 0x01000000, 0x01000000]), - 'Digit8': LayoutEntry([0x00000038, 0x00000028, 0x01000000, 0x01000000]), - 'Digit9': LayoutEntry([0x00000039, 0x00000029, 0x01000000, 0x01000000]), - 'Digit0': LayoutEntry([0x00000030, 0x0000003d, 0x01000000, 0x01000000]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), - 'Minus': LayoutEntry([0x00000027, 0x0000003f, 0x0000005c, 0x01000000]), - 'Equal': LayoutEntry([0x000000bf, 0x000000a1, 0x01000000, 0x01000000]), - 'BracketLeft': LayoutEntry([0x000000b4, 0x000000a8, 0x01000000, 0x01000000]), - 'BracketRight': LayoutEntry([0x0000002b, 0x0000002a, 0x0000007e, 0x01000000]), - 'Backslash': LayoutEntry([0x0000007d, 0x0000005d, 0x00000060, 0x01000000]), - 'Semicolon': LayoutEntry([0x000000f1, 0x000000d1, 0x01000000, 0x01000000]), - 'Quote': LayoutEntry([0x0000007b, 0x0000005b, 0x0000005e, 0x01000000]), - 'Backquote': LayoutEntry([0x0000007c, 0x000000b0, 0x000000ac, 0x01000000]), - 'Comma': LayoutEntry([0x0000002c, 0x0000003b, 0x01000000, 0x01000000]), - 'Period': LayoutEntry([0x0000002e, 0x0000003a, 0x01000000, 0x01000000]), - 'Slash': LayoutEntry([0x0000002d, 0x0000005f, 0x01000000, 0x01000000]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), - 'IntlBackslash': LayoutEntry([0x0000003c, 0x0000003e, 0x01000000, 0x01000000]), - }, - ), - - LayoutInfo( - name: 'es', - platform: LayoutPlatform.darwin, - mapping: { - 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x000000e5, 0x000000c5]), - 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x000000df, 0x01000000]), - 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x000000a9, 0x00000020]), - 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x00002202, 0x00002206]), - 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000020ac, 0x000020ac]), - 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x00000192, 0x0000fb01]), - 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x0000f8ff, 0x0000fb02]), - 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x00002122, 0x00000020]), - 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x00000020, 0x00000020]), - 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x000000b6, 0x000000af]), - 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x000000a7, 0x000002c7]), - 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x00000020, 0x000002d8]), - 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x000000b5, 0x000002da]), - 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x00000020, 0x000002d9]), - 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8]), - 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x000003c0, 0x0000220f]), - 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x00000153, 0x00000152]), - 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x000000ae, 0x00000020]), - 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x0000222b, 0x00000020]), - 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x00002020, 0x00002021]), - 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x00000020, 0x00000020]), - 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x0000221a, 0x000025ca]), - 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x000000e6, 0x000000c6]), - 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x00002211, 0x0000203a]), - 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x000000a5, 0x00000020]), - 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x000003a9, 0x00002039]), - 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x0000007c, 0x00000131]), - 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x00000040, 0x000002dd]), - 'Digit3': LayoutEntry([0x00000033, 0x000000b7, 0x00000023, 0x00002022]), - 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x000000a2, 0x000000a3]), - 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x0000221e, 0x00002030]), - 'Digit6': LayoutEntry([0x00000036, 0x00000026, 0x000000ac, 0x00000020]), - 'Digit7': LayoutEntry([0x00000037, 0x0000002f, 0x000000f7, 0x00002044]), - 'Digit8': LayoutEntry([0x00000038, 0x00000028, 0x0000201c, 0x00002018]), - 'Digit9': LayoutEntry([0x00000039, 0x00000029, 0x0000201d, 0x00002019]), - 'Digit0': LayoutEntry([0x00000030, 0x0000003d, 0x00002260, 0x00002248]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), - 'Minus': LayoutEntry([0x00000027, 0x0000003f, 0x000000b4, 0x000000b8]), - 'Equal': LayoutEntry([0x000000a1, 0x000000bf, 0x0000201a, 0x000002db]), - 'BracketLeft': LayoutEntry([0x01000000, 0x01000000, 0x0000005b, 0x000002c6]), - 'BracketRight': LayoutEntry([0x0000002b, 0x0000002a, 0x0000005d, 0x000000b1]), - 'Backslash': LayoutEntry([0x000000e7, 0x000000c7, 0x0000007d, 0x000000bb]), - 'Semicolon': LayoutEntry([0x000000f1, 0x000000d1, 0x01000000, 0x000002dc]), - 'Quote': LayoutEntry([0x01000000, 0x01000000, 0x0000007b, 0x000000ab]), - 'Backquote': LayoutEntry([0x0000003c, 0x0000003e, 0x00002264, 0x00002265]), - 'Comma': LayoutEntry([0x0000002c, 0x0000003b, 0x0000201e, 0x01000000]), - 'Period': LayoutEntry([0x0000002e, 0x0000003a, 0x00002026, 0x00002026]), - 'Slash': LayoutEntry([0x0000002d, 0x0000005f, 0x00002013, 0x00002014]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), - 'Numpad1': LayoutEntry([0x00000031, 0x00000031, 0x00000031, 0x00000031]), - 'Numpad2': LayoutEntry([0x00000032, 0x00000032, 0x00000032, 0x00000032]), - 'Numpad3': LayoutEntry([0x00000033, 0x00000033, 0x00000033, 0x00000033]), - 'Numpad4': LayoutEntry([0x00000034, 0x00000034, 0x00000034, 0x00000034]), - 'Numpad5': LayoutEntry([0x00000035, 0x00000035, 0x00000035, 0x00000035]), - 'Numpad6': LayoutEntry([0x00000036, 0x00000036, 0x00000036, 0x00000036]), - 'Numpad7': LayoutEntry([0x00000037, 0x00000037, 0x00000037, 0x00000037]), - 'Numpad8': LayoutEntry([0x00000038, 0x00000038, 0x00000038, 0x00000038]), - 'Numpad9': LayoutEntry([0x00000039, 0x00000039, 0x00000039, 0x00000039]), - 'Numpad0': LayoutEntry([0x00000030, 0x00000030, 0x00000030, 0x00000030]), - 'NumpadDecimal': LayoutEntry([0x0000002c, 0x0000002c, 0x0000002c, 0x0000002c]), - 'IntlBackslash': LayoutEntry([0x000000ba, 0x000000aa, 0x0000005c, 0x000000b0]), - 'NumpadEqual': LayoutEntry([0x0000003d, 0x0000003d, 0x0000003d, 0x0000003d]), - 'AudioVolumeUp': LayoutEntry([0x01000000, 0x0000003d, 0x01000000, 0x0000003d]), - }, - ), - - LayoutInfo( - name: 'es', - platform: LayoutPlatform.linux, - mapping: { - 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x000000e6, 0x000000c6]), - 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x0000201d, 0x00002019]), - 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x000000a2, 0x000000a9]), - 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x000000f0, 0x000000d0]), - 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000020ac, 0x000000a2]), - 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x00000111, 0x000000aa]), - 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x0000014b, 0x0000014a]), - 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x00000127, 0x00000126]), - 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x00002192, 0x00000131]), - 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x00000309, 0x0000031b]), - 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x00000138, 0x00000026]), - 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x00000142, 0x00000141]), - 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x000000b5, 0x000000ba]), - 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x0000006e, 0x0000004e]), - 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8]), - 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x000000fe, 0x000000de]), - 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x00000040, 0x000003a9]), - 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x000000b6, 0x000000ae]), - 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x000000df, 0x000000a7]), - 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x00000167, 0x00000166]), - 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x00002193, 0x00002191]), - 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x0000201c, 0x00002018]), - 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x00000142, 0x00000141]), - 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x000000bb, 0x0000003e]), - 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x00002190, 0x000000a5]), - 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x000000ab, 0x0000003c]), - 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x0000007c, 0x000000a1]), - 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x00000040, 0x0000215b]), - 'Digit3': LayoutEntry([0x00000033, 0x000000b7, 0x00000023, 0x000000a3]), - 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x0000007e, 0x00000024]), - 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x000000bd, 0x0000215c]), - 'Digit6': LayoutEntry([0x00000036, 0x00000026, 0x000000ac, 0x0000215d]), - 'Digit7': LayoutEntry([0x00000037, 0x0000002f, 0x0000007b, 0x0000215e]), - 'Digit8': LayoutEntry([0x00000038, 0x00000028, 0x0000005b, 0x00002122]), - 'Digit9': LayoutEntry([0x00000039, 0x00000029, 0x0000005d, 0x000000b1]), - 'Digit0': LayoutEntry([0x00000030, 0x0000003d, 0x0000007d, 0x000000b0]), - 'Enter': LayoutEntry([0x0000000d, 0x0000000d, 0x0000000d, 0x0000000d]), - 'Escape': LayoutEntry([0x0000001b, 0x0000001b, 0x0000001b, 0x0000001b]), - 'Backspace': LayoutEntry([0x00000008, 0x00000008, 0x00000008, 0x00000008]), - 'Tab': LayoutEntry([0x00000009, 0x01000000, 0x00000009, 0x01000000]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), - 'Minus': LayoutEntry([0x00000027, 0x0000003f, 0x0000005c, 0x000000bf]), - 'Equal': LayoutEntry([0x000000a1, 0x000000bf, 0x00000303, 0x0000007e]), - 'BracketLeft': LayoutEntry([0x00000300, 0x00000302, 0x0000005b, 0x0000030a]), - 'BracketRight': LayoutEntry([0x0000002b, 0x0000002a, 0x0000005d, 0x00000304]), - 'Backslash': LayoutEntry([0x000000e7, 0x000000c7, 0x0000007d, 0x00000306]), - 'Semicolon': LayoutEntry([0x000000f1, 0x000000d1, 0x0000007e, 0x0000030b]), - 'Quote': LayoutEntry([0x00000301, 0x00000308, 0x0000007b, 0x0000007b]), - 'Backquote': LayoutEntry([0x000000ba, 0x000000aa, 0x0000005c, 0x0000005c]), - 'Comma': LayoutEntry([0x0000002c, 0x0000003b, 0x00002500, 0x000000d7]), - 'Period': LayoutEntry([0x0000002e, 0x0000003a, 0x000000b7, 0x000000f7]), - 'Slash': LayoutEntry([0x0000002d, 0x0000005f, 0x00000323, 0x00000307]), - 'Delete': LayoutEntry([0x01000000, 0x01000000, 0x01000000, 0x01000000]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), - 'NumpadEnter': LayoutEntry([0x0000000d, 0x0000000d, 0x0000000d, 0x0000000d]), - 'Numpad1': LayoutEntry([0x01000000, 0x00000031, 0x01000000, 0x00000031]), - 'Numpad2': LayoutEntry([0x01000000, 0x00000032, 0x01000000, 0x00000032]), - 'Numpad3': LayoutEntry([0x01000000, 0x00000033, 0x01000000, 0x00000033]), - 'Numpad4': LayoutEntry([0x01000000, 0x00000034, 0x01000000, 0x00000034]), - 'Numpad5': LayoutEntry([0x01000000, 0x00000035, 0x01000000, 0x00000035]), - 'Numpad6': LayoutEntry([0x01000000, 0x00000036, 0x01000000, 0x00000036]), - 'Numpad7': LayoutEntry([0x01000000, 0x00000037, 0x01000000, 0x00000037]), - 'Numpad8': LayoutEntry([0x01000000, 0x00000038, 0x01000000, 0x00000038]), - 'Numpad9': LayoutEntry([0x01000000, 0x00000039, 0x01000000, 0x00000039]), - 'Numpad0': LayoutEntry([0x01000000, 0x00000030, 0x01000000, 0x00000030]), - 'NumpadDecimal': LayoutEntry([0x01000000, 0x0000002e, 0x01000000, 0x0000002e]), - 'IntlBackslash': LayoutEntry([0x0000003c, 0x0000003e, 0x0000007c, 0x000000a6]), - 'NumpadEqual': LayoutEntry([0x0000003d, 0x0000003d, 0x0000003d, 0x0000003d]), - 'NumpadComma': LayoutEntry([0x0000002e, 0x0000002e, 0x0000002e, 0x0000002e]), - 'NumpadParenLeft': LayoutEntry([0x00000028, 0x00000028, 0x00000028, 0x00000028]), - 'NumpadParenRight': LayoutEntry([0x00000029, 0x00000029, 0x00000029, 0x00000029]), - }, - ), - - LayoutInfo( - name: 'es', - platform: LayoutPlatform.win, - mapping: { - 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x01000000, 0x01000000]), - 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x01000000]), - 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x01000000, 0x01000000]), - 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x01000000, 0x01000000]), - 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000020ac, 0x01000000]), - 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x01000000, 0x01000000]), - 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x01000000, 0x01000000]), - 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x01000000]), - 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x01000000]), - 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x01000000]), - 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x01000000]), - 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x01000000, 0x01000000]), - 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x01000000, 0x01000000]), - 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x01000000]), - 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x01000000, 0x01000000]), - 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x01000000]), - 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x01000000, 0x01000000]), - 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x01000000, 0x01000000]), - 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x01000000, 0x01000000]), - 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x01000000, 0x01000000]), - 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x01000000]), - 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x01000000]), - 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x01000000, 0x01000000]), - 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x01000000, 0x01000000]), - 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x01000000, 0x01000000]), - 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x01000000]), - 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x0000007c, 0x01000000]), - 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x00000040, 0x01000000]), - 'Digit3': LayoutEntry([0x00000033, 0x000000b7, 0x00000023, 0x01000000]), - 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x0000007e, 0x01000000]), - 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x000020ac, 0x01000000]), - 'Digit6': LayoutEntry([0x00000036, 0x00000026, 0x000000ac, 0x01000000]), - 'Digit7': LayoutEntry([0x00000037, 0x0000002f, 0x01000000, 0x01000000]), - 'Digit8': LayoutEntry([0x00000038, 0x00000028, 0x01000000, 0x01000000]), - 'Digit9': LayoutEntry([0x00000039, 0x00000029, 0x01000000, 0x01000000]), - 'Digit0': LayoutEntry([0x00000030, 0x0000003d, 0x01000000, 0x01000000]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), - 'Minus': LayoutEntry([0x00000027, 0x0000003f, 0x01000000, 0x01000000]), - 'Equal': LayoutEntry([0x000000a1, 0x000000bf, 0x01000000, 0x01000000]), - 'BracketLeft': LayoutEntry([0x00000060, 0x0000005e, 0x0000005b, 0x01000000]), - 'BracketRight': LayoutEntry([0x0000002b, 0x0000002a, 0x0000005d, 0x01000000]), - 'Backslash': LayoutEntry([0x000000e7, 0x000000c7, 0x0000007d, 0x01000000]), - 'Semicolon': LayoutEntry([0x000000f1, 0x000000d1, 0x01000000, 0x01000000]), - 'Quote': LayoutEntry([0x000000b4, 0x000000a8, 0x0000007b, 0x01000000]), - 'Backquote': LayoutEntry([0x000000ba, 0x000000aa, 0x0000005c, 0x01000000]), - 'Comma': LayoutEntry([0x0000002c, 0x0000003b, 0x01000000, 0x01000000]), - 'Period': LayoutEntry([0x0000002e, 0x0000003a, 0x01000000, 0x01000000]), - 'Slash': LayoutEntry([0x0000002d, 0x0000005f, 0x01000000, 0x01000000]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), - 'IntlBackslash': LayoutEntry([0x0000003c, 0x0000003e, 0x01000000, 0x01000000]), - }, - ), - - LayoutInfo( - name: 'fr', - platform: LayoutPlatform.darwin, - mapping: { - 'KeyA': LayoutEntry([0x00000071, 0x00000051, 0x00002021, 0x000003a9]), - 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x000000df, 0x0000222b]), - 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x000000a9, 0x000000a2]), - 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x00002202, 0x00002206]), - 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000000ea, 0x000000ca]), - 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x00000192, 0x000000b7]), - 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x0000fb01, 0x0000fb02]), - 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x000000cc, 0x000000ce]), - 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x000000ee, 0x000000ef]), - 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x000000cf, 0x000000cd]), - 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x000000c8, 0x000000cb]), - 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x000000ac, 0x0000007c]), - 'KeyM': LayoutEntry([0x0000002c, 0x0000003f, 0x0000221e, 0x000000bf]), - 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x00000131]), - 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x00000153, 0x00000152]), - 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x000003c0, 0x0000220f]), - 'KeyQ': LayoutEntry([0x00000061, 0x00000041, 0x000000e6, 0x000000c6]), - 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x000000ae, 0x0000201a]), - 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x000000d2, 0x00002211]), - 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x00002020, 0x00002122]), - 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x000000ba, 0x000000aa]), - 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x000025ca, 0x0000221a]), - 'KeyW': LayoutEntry([0x0000007a, 0x0000005a, 0x000000c2, 0x000000c5]), - 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x00002248, 0x00002044]), - 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x000000da, 0x00000178]), - 'KeyZ': LayoutEntry([0x00000077, 0x00000057, 0x00002039, 0x0000203a]), - 'Digit1': LayoutEntry([0x00000026, 0x00000031, 0x0000f8ff, 0x01000000]), - 'Digit2': LayoutEntry([0x000000e9, 0x00000032, 0x000000eb, 0x0000201e]), - 'Digit3': LayoutEntry([0x00000022, 0x00000033, 0x0000201c, 0x0000201d]), - 'Digit4': LayoutEntry([0x00000027, 0x00000034, 0x00002018, 0x00002019]), - 'Digit5': LayoutEntry([0x00000028, 0x00000035, 0x0000007b, 0x0000005b]), - 'Digit6': LayoutEntry([0x000000a7, 0x00000036, 0x000000b6, 0x000000e5]), - 'Digit7': LayoutEntry([0x000000e8, 0x00000037, 0x000000ab, 0x000000bb]), - 'Digit8': LayoutEntry([0x00000021, 0x00000038, 0x000000a1, 0x000000db]), - 'Digit9': LayoutEntry([0x000000e7, 0x00000039, 0x000000c7, 0x000000c1]), - 'Digit0': LayoutEntry([0x000000e0, 0x00000030, 0x000000f8, 0x000000d8]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), - 'Minus': LayoutEntry([0x00000029, 0x000000b0, 0x0000007d, 0x0000005d]), - 'Equal': LayoutEntry([0x0000002d, 0x0000005f, 0x00002014, 0x00002013]), - 'BracketLeft': LayoutEntry([0x01000000, 0x01000000, 0x000000f4, 0x000000d4]), - 'BracketRight': LayoutEntry([0x00000024, 0x0000002a, 0x000020ac, 0x000000a5]), - 'Backslash': LayoutEntry([0x01000000, 0x000000a3, 0x00000040, 0x00000023]), - 'Semicolon': LayoutEntry([0x0000006d, 0x0000004d, 0x000000b5, 0x000000d3]), - 'Quote': LayoutEntry([0x000000f9, 0x00000025, 0x000000d9, 0x00002030]), - 'Backquote': LayoutEntry([0x0000003c, 0x0000003e, 0x00002264, 0x00002265]), - 'Comma': LayoutEntry([0x0000003b, 0x0000002e, 0x00002026, 0x00002022]), - 'Period': LayoutEntry([0x0000003a, 0x0000002f, 0x000000f7, 0x0000005c]), - 'Slash': LayoutEntry([0x0000003d, 0x0000002b, 0x00002260, 0x000000b1]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), - 'Numpad1': LayoutEntry([0x00000031, 0x00000031, 0x00000031, 0x00000031]), - 'Numpad2': LayoutEntry([0x00000032, 0x00000032, 0x00000032, 0x00000032]), - 'Numpad3': LayoutEntry([0x00000033, 0x00000033, 0x00000033, 0x00000033]), - 'Numpad4': LayoutEntry([0x00000034, 0x00000034, 0x00000034, 0x00000034]), - 'Numpad5': LayoutEntry([0x00000035, 0x00000035, 0x00000035, 0x00000035]), - 'Numpad6': LayoutEntry([0x00000036, 0x00000036, 0x00000036, 0x00000036]), - 'Numpad7': LayoutEntry([0x00000037, 0x00000037, 0x00000037, 0x00000037]), - 'Numpad8': LayoutEntry([0x00000038, 0x00000038, 0x00000038, 0x00000038]), - 'Numpad9': LayoutEntry([0x00000039, 0x00000039, 0x00000039, 0x00000039]), - 'Numpad0': LayoutEntry([0x00000030, 0x00000030, 0x00000030, 0x00000030]), - 'NumpadDecimal': LayoutEntry([0x0000002c, 0x0000002e, 0x0000002c, 0x0000002e]), - 'IntlBackslash': LayoutEntry([0x00000040, 0x00000023, 0x00002022, 0x00000178]), - 'NumpadEqual': LayoutEntry([0x0000003d, 0x0000003d, 0x0000003d, 0x0000003d]), - 'AudioVolumeUp': LayoutEntry([0x01000000, 0x0000003d, 0x01000000, 0x0000003d]), - }, - ), - - LayoutInfo( - name: 'fr', - platform: LayoutPlatform.linux, - mapping: { - 'KeyA': LayoutEntry([0x00000071, 0x00000051, 0x00000040, 0x000003a9]), - 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x0000201d, 0x00002019]), - 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x000000a2, 0x000000a9]), - 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x000000f0, 0x000000d0]), - 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000020ac, 0x000000a2]), - 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x00000111, 0x000000aa]), - 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x0000014b, 0x0000014a]), - 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x00000127, 0x00000126]), - 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x00002192, 0x00000131]), - 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x00000309, 0x0000031b]), - 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x00000138, 0x00000026]), - 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x00000142, 0x00000141]), - 'KeyM': LayoutEntry([0x0000002c, 0x0000003f, 0x00000301, 0x0000030b]), - 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x0000006e, 0x0000004e]), - 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8]), - 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x000000fe, 0x000000de]), - 'KeyQ': LayoutEntry([0x00000061, 0x00000041, 0x000000e6, 0x000000c6]), - 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x000000b6, 0x000000ae]), - 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x000000df, 0x000000a7]), - 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x00000167, 0x00000166]), - 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x00002193, 0x00002191]), - 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x0000201c, 0x00002018]), - 'KeyW': LayoutEntry([0x0000007a, 0x0000005a, 0x000000ab, 0x0000003c]), - 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x000000bb, 0x0000003e]), - 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x00002190, 0x000000a5]), - 'KeyZ': LayoutEntry([0x00000077, 0x00000057, 0x00000142, 0x00000141]), - 'Digit1': LayoutEntry([0x00000026, 0x00000031, 0x000000b9, 0x000000a1]), - 'Digit2': LayoutEntry([0x000000e9, 0x00000032, 0x0000007e, 0x0000215b]), - 'Digit3': LayoutEntry([0x00000022, 0x00000033, 0x00000023, 0x000000a3]), - 'Digit4': LayoutEntry([0x00000027, 0x00000034, 0x0000007b, 0x00000024]), - 'Digit5': LayoutEntry([0x00000028, 0x00000035, 0x0000005b, 0x0000215c]), - 'Digit6': LayoutEntry([0x0000002d, 0x00000036, 0x0000007c, 0x0000215d]), - 'Digit7': LayoutEntry([0x000000e8, 0x00000037, 0x00000060, 0x0000215e]), - 'Digit8': LayoutEntry([0x0000005f, 0x00000038, 0x0000005c, 0x00002122]), - 'Digit9': LayoutEntry([0x000000e7, 0x00000039, 0x0000005e, 0x000000b1]), - 'Digit0': LayoutEntry([0x000000e0, 0x00000030, 0x00000040, 0x000000b0]), - 'Enter': LayoutEntry([0x0000000d, 0x0000000d, 0x0000000d, 0x0000000d]), - 'Escape': LayoutEntry([0x0000001b, 0x0000001b, 0x0000001b, 0x0000001b]), - 'Backspace': LayoutEntry([0x00000008, 0x00000008, 0x00000008, 0x00000008]), - 'Tab': LayoutEntry([0x00000009, 0x01000000, 0x00000009, 0x01000000]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), - 'Minus': LayoutEntry([0x00000029, 0x000000b0, 0x0000005d, 0x000000bf]), - 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x0000007d, 0x00000328]), - 'BracketLeft': LayoutEntry([0x00000302, 0x00000308, 0x00000308, 0x0000030a]), - 'BracketRight': LayoutEntry([0x00000024, 0x000000a3, 0x000000a4, 0x00000304]), - 'Backslash': LayoutEntry([0x0000002a, 0x000000b5, 0x00000300, 0x00000306]), - 'Semicolon': LayoutEntry([0x0000006d, 0x0000004d, 0x000000b5, 0x000000ba]), - 'Quote': LayoutEntry([0x000000f9, 0x00000025, 0x00000302, 0x0000030c]), - 'Backquote': LayoutEntry([0x000000b2, 0x0000007e, 0x000000ac, 0x000000ac]), - 'Comma': LayoutEntry([0x0000003b, 0x0000002e, 0x00002500, 0x000000d7]), - 'Period': LayoutEntry([0x0000003a, 0x0000002f, 0x000000b7, 0x000000f7]), - 'Slash': LayoutEntry([0x00000021, 0x000000a7, 0x00000323, 0x00000307]), - 'PrintScreen': LayoutEntry([0x01000000, 0x01000000, 0x01000000, 0x01000000]), - 'PageUp': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), - 'Numpad1': LayoutEntry([0x01000000, 0x00000031, 0x01000000, 0x00000031]), - 'Numpad2': LayoutEntry([0x01000000, 0x00000032, 0x01000000, 0x00000032]), - 'Numpad3': LayoutEntry([0x01000000, 0x00000033, 0x01000000, 0x00000033]), - 'Numpad4': LayoutEntry([0x01000000, 0x00000034, 0x01000000, 0x00000034]), - 'Numpad5': LayoutEntry([0x01000000, 0x00000035, 0x01000000, 0x00000035]), - 'Numpad6': LayoutEntry([0x01000000, 0x00000036, 0x01000000, 0x00000036]), - 'Numpad7': LayoutEntry([0x01000000, 0x00000037, 0x01000000, 0x00000037]), - 'Numpad8': LayoutEntry([0x01000000, 0x00000038, 0x01000000, 0x00000038]), - 'Numpad9': LayoutEntry([0x01000000, 0x00000039, 0x01000000, 0x00000039]), - 'Numpad0': LayoutEntry([0x01000000, 0x00000030, 0x01000000, 0x00000030]), - 'NumpadDecimal': LayoutEntry([0x01000000, 0x0000002e, 0x01000000, 0x0000002e]), - 'IntlBackslash': LayoutEntry([0x0000003c, 0x0000003e, 0x0000007c, 0x000000a6]), - 'AltRight': LayoutEntry([0x0000000d, 0x0000000d, 0x0000000d, 0x0000000d]), - 'MetaRight': LayoutEntry([0x0000002e, 0x0000002e, 0x0000002e, 0x0000002e]), - }, - ), - - LayoutInfo( - name: 'fr', - platform: LayoutPlatform.win, - mapping: { - 'KeyA': LayoutEntry([0x00000071, 0x00000051, 0x01000000, 0x01000000]), - 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x01000000]), - 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x01000000, 0x01000000]), - 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x01000000, 0x01000000]), - 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000020ac, 0x01000000]), - 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x01000000, 0x01000000]), - 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x01000000, 0x01000000]), - 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x01000000]), - 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x01000000]), - 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x01000000]), - 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x01000000]), - 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x01000000, 0x01000000]), - 'KeyM': LayoutEntry([0x0000002c, 0x0000003f, 0x01000000, 0x01000000]), - 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x01000000]), - 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x01000000, 0x01000000]), - 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x01000000]), - 'KeyQ': LayoutEntry([0x00000061, 0x00000041, 0x01000000, 0x01000000]), - 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x01000000, 0x01000000]), - 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x01000000, 0x01000000]), - 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x01000000, 0x01000000]), - 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x01000000]), - 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x01000000]), - 'KeyW': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x01000000]), - 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x01000000, 0x01000000]), - 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x01000000, 0x01000000]), - 'KeyZ': LayoutEntry([0x00000077, 0x00000057, 0x01000000, 0x01000000]), - 'Digit1': LayoutEntry([0x00000026, 0x00000031, 0x01000000, 0x01000000]), - 'Digit2': LayoutEntry([0x000000e9, 0x00000032, 0x0000007e, 0x01000000]), - 'Digit3': LayoutEntry([0x00000022, 0x00000033, 0x00000023, 0x01000000]), - 'Digit4': LayoutEntry([0x00000027, 0x00000034, 0x0000007b, 0x01000000]), - 'Digit5': LayoutEntry([0x00000028, 0x00000035, 0x0000005b, 0x01000000]), - 'Digit6': LayoutEntry([0x0000002d, 0x00000036, 0x0000007c, 0x01000000]), - 'Digit7': LayoutEntry([0x000000e8, 0x00000037, 0x00000060, 0x01000000]), - 'Digit8': LayoutEntry([0x0000005f, 0x00000038, 0x0000005c, 0x01000000]), - 'Digit9': LayoutEntry([0x000000e7, 0x00000039, 0x0000005e, 0x01000000]), - 'Digit0': LayoutEntry([0x000000e0, 0x00000030, 0x00000040, 0x01000000]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), - 'Minus': LayoutEntry([0x00000029, 0x000000b0, 0x0000005d, 0x01000000]), - 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x0000007d, 0x01000000]), - 'BracketLeft': LayoutEntry([0x0000005e, 0x000000a8, 0x01000000, 0x01000000]), - 'BracketRight': LayoutEntry([0x00000024, 0x000000a3, 0x000000a4, 0x01000000]), - 'Backslash': LayoutEntry([0x0000002a, 0x000000b5, 0x01000000, 0x01000000]), - 'Semicolon': LayoutEntry([0x0000006d, 0x0000004d, 0x01000000, 0x01000000]), - 'Quote': LayoutEntry([0x000000f9, 0x00000025, 0x01000000, 0x01000000]), - 'Backquote': LayoutEntry([0x000000b2, 0x01000000, 0x01000000, 0x01000000]), - 'Comma': LayoutEntry([0x0000003b, 0x0000002e, 0x01000000, 0x01000000]), - 'Period': LayoutEntry([0x0000003a, 0x0000002f, 0x01000000, 0x01000000]), - 'Slash': LayoutEntry([0x00000021, 0x000000a7, 0x01000000, 0x01000000]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), - 'IntlBackslash': LayoutEntry([0x0000003c, 0x0000003e, 0x01000000, 0x01000000]), - }, - ), - - LayoutInfo( - name: 'hu', - platform: LayoutPlatform.win, - mapping: { - 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x000000e4, 0x01000000]), - 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x0000007b, 0x01000000]), - 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x00000026, 0x01000000]), - 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x00000110, 0x01000000]), - 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000000c4, 0x01000000]), - 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x0000005b, 0x01000000]), - 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x0000005d, 0x01000000]), - 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x01000000]), - 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x000000cd, 0x01000000]), - 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x000000ed, 0x01000000]), - 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x00000142, 0x01000000]), - 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x00000141, 0x01000000]), - 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x0000003c, 0x01000000]), - 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x0000007d, 0x01000000]), - 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x01000000, 0x01000000]), - 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x01000000]), - 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x0000005c, 0x01000000]), - 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x01000000, 0x01000000]), - 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x00000111, 0x01000000]), - 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x01000000, 0x01000000]), - 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x000020ac, 0x01000000]), - 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x00000040, 0x01000000]), - 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x0000007c, 0x01000000]), - 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x00000023, 0x01000000]), - 'KeyY': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x01000000]), - 'KeyZ': LayoutEntry([0x00000079, 0x00000059, 0x0000003e, 0x01000000]), - 'Digit1': LayoutEntry([0x00000031, 0x00000027, 0x0000007e, 0x01000000]), - 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x000002c7, 0x01000000]), - 'Digit3': LayoutEntry([0x00000033, 0x0000002b, 0x0000005e, 0x01000000]), - 'Digit4': LayoutEntry([0x00000034, 0x00000021, 0x000002d8, 0x01000000]), - 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x000000b0, 0x01000000]), - 'Digit6': LayoutEntry([0x00000036, 0x0000002f, 0x000002db, 0x01000000]), - 'Digit7': LayoutEntry([0x00000037, 0x0000003d, 0x00000060, 0x01000000]), - 'Digit8': LayoutEntry([0x00000038, 0x00000028, 0x000002d9, 0x01000000]), - 'Digit9': LayoutEntry([0x00000039, 0x00000029, 0x000000b4, 0x01000000]), - 'Digit0': LayoutEntry([0x000000f6, 0x000000d6, 0x000002dd, 0x01000000]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), - 'Minus': LayoutEntry([0x000000fc, 0x000000dc, 0x000000a8, 0x01000000]), - 'Equal': LayoutEntry([0x000000f3, 0x000000d3, 0x000000b8, 0x01000000]), - 'BracketLeft': LayoutEntry([0x00000151, 0x00000150, 0x000000f7, 0x01000000]), - 'BracketRight': LayoutEntry([0x000000fa, 0x000000da, 0x000000d7, 0x01000000]), - 'Backslash': LayoutEntry([0x00000171, 0x00000170, 0x000000a4, 0x01000000]), - 'Semicolon': LayoutEntry([0x000000e9, 0x000000c9, 0x00000024, 0x01000000]), - 'Quote': LayoutEntry([0x000000e1, 0x000000c1, 0x000000df, 0x01000000]), - 'Backquote': LayoutEntry([0x00000030, 0x000000a7, 0x01000000, 0x01000000]), - 'Comma': LayoutEntry([0x0000002c, 0x0000003f, 0x0000003b, 0x01000000]), - 'Period': LayoutEntry([0x0000002e, 0x0000003a, 0x0000003e, 0x01000000]), - 'Slash': LayoutEntry([0x0000002d, 0x0000005f, 0x0000002a, 0x01000000]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), - 'IntlBackslash': LayoutEntry([0x000000ed, 0x000000cd, 0x0000003c, 0x01000000]), - }, - ), - - LayoutInfo( - name: 'it', - platform: LayoutPlatform.darwin, - mapping: { - 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x000000e5, 0x000000c5]), - 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x0000222b, 0x000000cd]), - 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x000000a9, 0x000000c1]), - 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x00002202, 0x000002d8]), - 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000020ac, 0x000000c8]), - 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x00000192, 0x000002d9]), - 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x0000221e, 0x000002da]), - 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x00002206, 0x000000b8]), - 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x00000153, 0x00000152]), - 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x000000aa, 0x000002dd]), - 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x000000ba, 0x000002db]), - 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x000000ac, 0x000002c7]), - 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x000000b5, 0x000000da]), - 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x000000d3]), - 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8]), - 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x000003c0, 0x0000220f]), - 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x0000201e, 0x0000201a]), - 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x000000ae, 0x000000cc]), - 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x000000df, 0x000000af]), - 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x00002122, 0x000000d2]), - 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x000000d9]), - 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x0000221a, 0x000000c9]), - 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x000003a9, 0x000000c0]), - 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x00002020, 0x00002021]), - 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x000000e6, 0x000000c6]), - 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x00002211, 0x00000020]), - 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x000000ab, 0x000000bb]), - 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x0000201c, 0x0000201d]), - 'Digit3': LayoutEntry([0x00000033, 0x000000a3, 0x00002018, 0x00002019]), - 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x000000a5, 0x000000a2]), - 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x0000007e, 0x00002030]), - 'Digit6': LayoutEntry([0x00000036, 0x00000026, 0x00002039, 0x0000203a]), - 'Digit7': LayoutEntry([0x00000037, 0x0000002f, 0x000000f7, 0x00002044]), - 'Digit8': LayoutEntry([0x00000038, 0x00000028, 0x01000000, 0x0000f8ff]), - 'Digit9': LayoutEntry([0x00000039, 0x00000029, 0x01000000, 0x00000020]), - 'Digit0': LayoutEntry([0x00000030, 0x0000003d, 0x00002260, 0x00002248]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), - 'Minus': LayoutEntry([0x00000027, 0x0000003f, 0x000000a1, 0x000000bf]), - 'Equal': LayoutEntry([0x000000ec, 0x0000005e, 0x01000000, 0x000000b1]), - 'BracketLeft': LayoutEntry([0x000000e8, 0x000000e9, 0x0000005b, 0x0000007b]), - 'BracketRight': LayoutEntry([0x0000002b, 0x0000002a, 0x0000005d, 0x0000007d]), - 'Backslash': LayoutEntry([0x000000f9, 0x000000a7, 0x000000b6, 0x000025ca]), - 'Semicolon': LayoutEntry([0x000000f2, 0x000000e7, 0x00000040, 0x000000c7]), - 'Quote': LayoutEntry([0x000000e0, 0x000000b0, 0x00000023, 0x0000221e]), - 'Backquote': LayoutEntry([0x0000003c, 0x0000003e, 0x00002264, 0x00002265]), - 'Comma': LayoutEntry([0x0000002c, 0x0000003b, 0x00002026, 0x00000020]), - 'Period': LayoutEntry([0x0000002e, 0x0000003a, 0x00002022, 0x000000b7]), - 'Slash': LayoutEntry([0x0000002d, 0x0000005f, 0x00002013, 0x00002014]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), - 'Numpad1': LayoutEntry([0x00000031, 0x00000031, 0x00000031, 0x00000031]), - 'Numpad2': LayoutEntry([0x00000032, 0x00000032, 0x00000032, 0x00000032]), - 'Numpad3': LayoutEntry([0x00000033, 0x00000033, 0x00000033, 0x00000033]), - 'Numpad4': LayoutEntry([0x00000034, 0x00000034, 0x00000034, 0x00000034]), - 'Numpad5': LayoutEntry([0x00000035, 0x00000035, 0x00000035, 0x00000035]), - 'Numpad6': LayoutEntry([0x00000036, 0x00000036, 0x00000036, 0x00000036]), - 'Numpad7': LayoutEntry([0x00000037, 0x00000037, 0x00000037, 0x00000037]), - 'Numpad8': LayoutEntry([0x00000038, 0x00000038, 0x00000038, 0x00000038]), - 'Numpad9': LayoutEntry([0x00000039, 0x00000039, 0x00000039, 0x00000039]), - 'Numpad0': LayoutEntry([0x00000030, 0x00000030, 0x00000030, 0x00000030]), - 'NumpadDecimal': LayoutEntry([0x0000002c, 0x0000002e, 0x0000002c, 0x0000002e]), - 'IntlBackslash': LayoutEntry([0x0000005c, 0x0000007c, 0x00000060, 0x00000131]), - 'NumpadEqual': LayoutEntry([0x0000003d, 0x0000003d, 0x0000003d, 0x0000003d]), - 'AudioVolumeUp': LayoutEntry([0x01000000, 0x0000003d, 0x01000000, 0x0000003d]), - }, - ), - - LayoutInfo( - name: 'it', - platform: LayoutPlatform.win, - mapping: { - 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x01000000, 0x01000000]), - 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x01000000]), - 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x01000000, 0x01000000]), - 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x01000000, 0x01000000]), - 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000020ac, 0x01000000]), - 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x01000000, 0x01000000]), - 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x01000000, 0x01000000]), - 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x01000000]), - 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x01000000]), - 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x01000000]), - 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x01000000]), - 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x01000000, 0x01000000]), - 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x01000000, 0x01000000]), - 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x01000000]), - 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x01000000, 0x01000000]), - 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x01000000]), - 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x01000000, 0x01000000]), - 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x01000000, 0x01000000]), - 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x01000000, 0x01000000]), - 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x01000000, 0x01000000]), - 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x01000000]), - 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x01000000]), - 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x01000000, 0x01000000]), - 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x01000000, 0x01000000]), - 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x01000000, 0x01000000]), - 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x01000000]), - 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x01000000, 0x01000000]), - 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x01000000, 0x01000000]), - 'Digit3': LayoutEntry([0x00000033, 0x000000a3, 0x01000000, 0x01000000]), - 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x01000000, 0x01000000]), - 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x000020ac, 0x01000000]), - 'Digit6': LayoutEntry([0x00000036, 0x00000026, 0x01000000, 0x01000000]), - 'Digit7': LayoutEntry([0x00000037, 0x0000002f, 0x01000000, 0x01000000]), - 'Digit8': LayoutEntry([0x00000038, 0x00000028, 0x01000000, 0x01000000]), - 'Digit9': LayoutEntry([0x00000039, 0x00000029, 0x01000000, 0x01000000]), - 'Digit0': LayoutEntry([0x00000030, 0x0000003d, 0x01000000, 0x01000000]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), - 'Minus': LayoutEntry([0x00000027, 0x0000003f, 0x01000000, 0x01000000]), - 'Equal': LayoutEntry([0x000000ec, 0x0000005e, 0x01000000, 0x01000000]), - 'BracketLeft': LayoutEntry([0x000000e8, 0x000000e9, 0x0000005b, 0x0000007b]), - 'BracketRight': LayoutEntry([0x0000002b, 0x0000002a, 0x0000005d, 0x0000007d]), - 'Backslash': LayoutEntry([0x000000f9, 0x000000a7, 0x01000000, 0x01000000]), - 'Semicolon': LayoutEntry([0x000000f2, 0x000000e7, 0x00000040, 0x01000000]), - 'Quote': LayoutEntry([0x000000e0, 0x000000b0, 0x00000023, 0x01000000]), - 'Backquote': LayoutEntry([0x0000005c, 0x0000007c, 0x01000000, 0x01000000]), - 'Comma': LayoutEntry([0x0000002c, 0x0000003b, 0x01000000, 0x01000000]), - 'Period': LayoutEntry([0x0000002e, 0x0000003a, 0x01000000, 0x01000000]), - 'Slash': LayoutEntry([0x0000002d, 0x0000005f, 0x01000000, 0x01000000]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), - 'IntlBackslash': LayoutEntry([0x0000003c, 0x0000003e, 0x01000000, 0x01000000]), - }, - ), - - LayoutInfo( - name: 'jp-roman', - platform: LayoutPlatform.darwin, - mapping: { - 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x01000000, 0x00000304]), - 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x00000306]), - 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x01000000, 0x00000327]), - 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x000000f0, 0x000000d0]), - 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x01000000, 0x00000301]), - 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x00000192, 0x01000000]), - 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x000000a9, 0x01000000]), - 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x00000331]), - 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x0000031b]), - 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x0000030b]), - 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x0000030a]), - 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x01000000, 0x00000335]), - 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x01000000, 0x00000328]), - 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x00000303]), - 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8]), - 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x00000326]), - 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x00000153, 0x00000152]), - 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x000000ae, 0x00002030]), - 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x000000df, 0x01000000]), - 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x000000fe, 0x000000de]), - 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x00000308]), - 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x0000030c]), - 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x01000000, 0x00000307]), - 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x01000000, 0x00000323]), - 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x000000a5, 0x01000000]), - 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x00000309]), - 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x000000a1, 0x00002044]), - 'Digit2': LayoutEntry([0x00000032, 0x00000040, 0x00002122, 0x000020ac]), - 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x000000a3, 0x00002039]), - 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x000000a2, 0x0000203a]), - 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x000000a7, 0x00002020]), - 'Digit6': LayoutEntry([0x00000036, 0x0000005e, 0x01000000, 0x00000302]), - 'Digit7': LayoutEntry([0x00000037, 0x00000026, 0x000000b6, 0x00002021]), - 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x00002022, 0x000000b0]), - 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x000000aa, 0x000000b7]), - 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x000000ba, 0x0000201a]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), - 'Minus': LayoutEntry([0x0000002d, 0x0000005f, 0x00002013, 0x00002014]), - 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x00002260, 0x000000b1]), - 'BracketLeft': LayoutEntry([0x0000005b, 0x0000007b, 0x0000201c, 0x0000201d]), - 'BracketRight': LayoutEntry([0x0000005d, 0x0000007d, 0x00002018, 0x00002019]), - 'Backslash': LayoutEntry([0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb]), - 'Semicolon': LayoutEntry([0x0000003b, 0x0000003a, 0x00002026, 0x01000000]), - 'Quote': LayoutEntry([0x00000027, 0x00000022, 0x000000e6, 0x000000c6]), - 'Backquote': LayoutEntry([0x00000060, 0x0000007e, 0x01000000, 0x00000300]), - 'Comma': LayoutEntry([0x0000002c, 0x0000003c, 0x00002264, 0x0000201e]), - 'Period': LayoutEntry([0x0000002e, 0x0000003e, 0x00002265, 0x01000000]), - 'Slash': LayoutEntry([0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), - 'Numpad1': LayoutEntry([0x00000031, 0x00000031, 0x00000031, 0x00000031]), - 'Numpad2': LayoutEntry([0x00000032, 0x00000032, 0x00000032, 0x00000032]), - 'Numpad3': LayoutEntry([0x00000033, 0x00000033, 0x00000033, 0x00000033]), - 'Numpad4': LayoutEntry([0x00000034, 0x00000034, 0x00000034, 0x00000034]), - 'Numpad5': LayoutEntry([0x00000035, 0x00000035, 0x00000035, 0x00000035]), - 'Numpad6': LayoutEntry([0x00000036, 0x00000036, 0x00000036, 0x00000036]), - 'Numpad7': LayoutEntry([0x00000037, 0x00000037, 0x00000037, 0x00000037]), - 'Numpad8': LayoutEntry([0x00000038, 0x00000038, 0x00000038, 0x00000038]), - 'Numpad9': LayoutEntry([0x00000039, 0x00000039, 0x00000039, 0x00000039]), - 'Numpad0': LayoutEntry([0x00000030, 0x00000030, 0x00000030, 0x00000030]), - 'NumpadDecimal': LayoutEntry([0x0000002e, 0x0000002e, 0x0000002e, 0x0000002e]), - 'IntlBackslash': LayoutEntry([0x000000a7, 0x000000b1, 0x000000a7, 0x000000b1]), - 'NumpadEqual': LayoutEntry([0x0000003d, 0x0000003d, 0x0000003d, 0x0000003d]), - 'AudioVolumeUp': LayoutEntry([0x01000000, 0x0000003d, 0x01000000, 0x0000003d]), - }, - ), - - LayoutInfo( - name: 'jp', - platform: LayoutPlatform.darwin, - mapping: { - 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x000000e5, 0x000000c5]), - 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x0000222b, 0x00000131]), - 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x000000e7, 0x000000c7]), - 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x00002202, 0x000000ce]), - 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x01000000, 0x000000b4]), - 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x00000192, 0x000000cf]), - 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x000000a9, 0x000002dd]), - 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x000002d9, 0x000000d3]), - 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x000002c6]), - 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x00002206, 0x000000d4]), - 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x000002da, 0x0000f8ff]), - 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x000000ac, 0x000000d2]), - 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x000000b5, 0x000000c2]), - 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x000002dc]), - 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8]), - 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x000003c0, 0x0000220f]), - 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x00000153, 0x00000152]), - 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x000000ae, 0x00002030]), - 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x000000df, 0x000000cd]), - 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x00002020, 0x000002c7]), - 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x000000a8]), - 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x0000221a, 0x000025ca]), - 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x00002211, 0x0000201e]), - 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x00002248, 0x000002db]), - 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x000000a5, 0x000000c1]), - 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x000003a9, 0x000000b8]), - 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x000000a1, 0x00002044]), - 'Digit2': LayoutEntry([0x00000032, 0x00000040, 0x00002122, 0x000020ac]), - 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x000000a3, 0x00002039]), - 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x000000a2, 0x0000203a]), - 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x0000221e, 0x0000fb01]), - 'Digit6': LayoutEntry([0x00000036, 0x0000005e, 0x000000a7, 0x0000fb02]), - 'Digit7': LayoutEntry([0x00000037, 0x00000026, 0x000000b6, 0x00002021]), - 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x00002022, 0x000000b0]), - 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x000000aa, 0x000000b7]), - 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x000000ba, 0x0000201a]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), - 'Minus': LayoutEntry([0x0000002d, 0x0000005f, 0x00002013, 0x00002014]), - 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x00002260, 0x000000b1]), - 'BracketLeft': LayoutEntry([0x0000005b, 0x0000007b, 0x0000201c, 0x0000201d]), - 'BracketRight': LayoutEntry([0x0000005d, 0x0000007d, 0x00002018, 0x00002019]), - 'Backslash': LayoutEntry([0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb]), - 'Semicolon': LayoutEntry([0x0000003b, 0x0000003a, 0x00002026, 0x000000da]), - 'Quote': LayoutEntry([0x00000027, 0x00000022, 0x000000e6, 0x000000c6]), - 'Backquote': LayoutEntry([0x00000060, 0x0000007e, 0x01000000, 0x00000060]), - 'Comma': LayoutEntry([0x0000002c, 0x0000003c, 0x00002264, 0x000000af]), - 'Period': LayoutEntry([0x0000002e, 0x0000003e, 0x00002265, 0x000002d8]), - 'Slash': LayoutEntry([0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), - 'Numpad1': LayoutEntry([0x00000031, 0x00000031, 0x00000031, 0x00000031]), - 'Numpad2': LayoutEntry([0x00000032, 0x00000032, 0x00000032, 0x00000032]), - 'Numpad3': LayoutEntry([0x00000033, 0x00000033, 0x00000033, 0x00000033]), - 'Numpad4': LayoutEntry([0x00000034, 0x00000034, 0x00000034, 0x00000034]), - 'Numpad5': LayoutEntry([0x00000035, 0x00000035, 0x00000035, 0x00000035]), - 'Numpad6': LayoutEntry([0x00000036, 0x00000036, 0x00000036, 0x00000036]), - 'Numpad7': LayoutEntry([0x00000037, 0x00000037, 0x00000037, 0x00000037]), - 'Numpad8': LayoutEntry([0x00000038, 0x00000038, 0x00000038, 0x00000038]), - 'Numpad9': LayoutEntry([0x00000039, 0x00000039, 0x00000039, 0x00000039]), - 'Numpad0': LayoutEntry([0x00000030, 0x00000030, 0x00000030, 0x00000030]), - 'NumpadDecimal': LayoutEntry([0x0000002e, 0x0000002e, 0x0000002e, 0x0000002e]), - 'IntlBackslash': LayoutEntry([0x000000a7, 0x000000b1, 0x000000a7, 0x000000b1]), - 'NumpadEqual': LayoutEntry([0x0000003d, 0x0000003d, 0x0000003d, 0x0000003d]), - 'AudioVolumeUp': LayoutEntry([0x01000000, 0x0000003d, 0x01000000, 0x0000003d]), - }, - ), - - LayoutInfo( - name: 'ko', - platform: LayoutPlatform.darwin, - mapping: { - 'KeyA': LayoutEntry([0x00003141, 0x00003141, 0x00000061, 0x00000041]), - 'KeyB': LayoutEntry([0x00003160, 0x00003160, 0x00000062, 0x00000042]), - 'KeyC': LayoutEntry([0x0000314a, 0x0000314a, 0x00000063, 0x00000043]), - 'KeyD': LayoutEntry([0x00003147, 0x00003147, 0x00000064, 0x00000044]), - 'KeyE': LayoutEntry([0x00003137, 0x00003138, 0x00000065, 0x00000045]), - 'KeyF': LayoutEntry([0x00003139, 0x00003139, 0x00000066, 0x00000046]), - 'KeyG': LayoutEntry([0x0000314e, 0x0000314e, 0x00000067, 0x00000047]), - 'KeyH': LayoutEntry([0x00003157, 0x00003157, 0x00000068, 0x00000048]), - 'KeyI': LayoutEntry([0x00003151, 0x00003151, 0x00000069, 0x00000049]), - 'KeyJ': LayoutEntry([0x00003153, 0x00003153, 0x0000006a, 0x0000004a]), - 'KeyK': LayoutEntry([0x0000314f, 0x0000314f, 0x0000006b, 0x0000004b]), - 'KeyL': LayoutEntry([0x00003163, 0x00003163, 0x0000006c, 0x0000004c]), - 'KeyM': LayoutEntry([0x00003161, 0x00003161, 0x0000006d, 0x0000004d]), - 'KeyN': LayoutEntry([0x0000315c, 0x0000315c, 0x0000006e, 0x0000004e]), - 'KeyO': LayoutEntry([0x00003150, 0x00003152, 0x0000006f, 0x0000004f]), - 'KeyP': LayoutEntry([0x00003154, 0x00003156, 0x00000070, 0x00000050]), - 'KeyQ': LayoutEntry([0x00003142, 0x00003143, 0x00000071, 0x00000051]), - 'KeyR': LayoutEntry([0x00003131, 0x00003132, 0x00000072, 0x00000052]), - 'KeyS': LayoutEntry([0x00003134, 0x00003134, 0x00000073, 0x00000053]), - 'KeyT': LayoutEntry([0x00003145, 0x00003146, 0x00000074, 0x00000054]), - 'KeyU': LayoutEntry([0x00003155, 0x00003155, 0x00000075, 0x00000055]), - 'KeyV': LayoutEntry([0x0000314d, 0x0000314d, 0x00000076, 0x00000056]), - 'KeyW': LayoutEntry([0x00003148, 0x00003149, 0x00000077, 0x00000057]), - 'KeyX': LayoutEntry([0x0000314c, 0x0000314c, 0x00000078, 0x00000058]), - 'KeyY': LayoutEntry([0x0000315b, 0x0000315b, 0x00000079, 0x00000059]), - 'KeyZ': LayoutEntry([0x0000314b, 0x0000314b, 0x0000007a, 0x0000005a]), - 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x00000031, 0x00000021]), - 'Digit2': LayoutEntry([0x00000032, 0x00000040, 0x00000032, 0x00000040]), - 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x00000033, 0x00000023]), - 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x00000034, 0x00000024]), - 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x00000035, 0x00000025]), - 'Digit6': LayoutEntry([0x00000036, 0x0000005e, 0x00000036, 0x0000005e]), - 'Digit7': LayoutEntry([0x00000037, 0x00000026, 0x00000037, 0x00000026]), - 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x00000038, 0x0000002a]), - 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x00000039, 0x00000028]), - 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x00000030, 0x00000029]), - 'Escape': LayoutEntry([0x01000000, 0x01000000, 0x01000000, 0x0000200c]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), - 'Minus': LayoutEntry([0x0000002d, 0x0000005f, 0x0000002d, 0x0000005f]), - 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x0000003d, 0x0000002b]), - 'BracketLeft': LayoutEntry([0x0000005b, 0x0000007b, 0x0000005b, 0x0000007b]), - 'BracketRight': LayoutEntry([0x0000005d, 0x0000007d, 0x0000005d, 0x0000007d]), - 'Backslash': LayoutEntry([0x0000005c, 0x0000007c, 0x0000005c, 0x0000007c]), - 'Semicolon': LayoutEntry([0x0000003b, 0x0000003a, 0x0000003b, 0x0000003a]), - 'Quote': LayoutEntry([0x00000027, 0x00000022, 0x00000027, 0x00000022]), - 'Backquote': LayoutEntry([0x000020a9, 0x0000007e, 0x00000060, 0x0000007e]), - 'Comma': LayoutEntry([0x0000002c, 0x0000003c, 0x0000002c, 0x0000003c]), - 'Period': LayoutEntry([0x0000002e, 0x0000003e, 0x0000002e, 0x0000003e]), - 'Slash': LayoutEntry([0x0000002f, 0x0000003f, 0x0000002f, 0x0000003f]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), - 'Numpad1': LayoutEntry([0x00000031, 0x00000031, 0x00000031, 0x00000031]), - 'Numpad2': LayoutEntry([0x00000032, 0x00000032, 0x00000032, 0x00000032]), - 'Numpad3': LayoutEntry([0x00000033, 0x00000033, 0x00000033, 0x00000033]), - 'Numpad4': LayoutEntry([0x00000034, 0x00000034, 0x00000034, 0x00000034]), - 'Numpad5': LayoutEntry([0x00000035, 0x00000035, 0x00000035, 0x00000035]), - 'Numpad6': LayoutEntry([0x00000036, 0x00000036, 0x00000036, 0x00000036]), - 'Numpad7': LayoutEntry([0x00000037, 0x00000037, 0x00000037, 0x00000037]), - 'Numpad8': LayoutEntry([0x00000038, 0x00000038, 0x00000038, 0x00000038]), - 'Numpad9': LayoutEntry([0x00000039, 0x00000039, 0x00000039, 0x00000039]), - 'Numpad0': LayoutEntry([0x00000030, 0x00000030, 0x00000030, 0x00000030]), - 'NumpadDecimal': LayoutEntry([0x0000002e, 0x0000002e, 0x0000002e, 0x0000002e]), - 'IntlBackslash': LayoutEntry([0x000000a7, 0x000000b1, 0x000000a7, 0x000000b1]), - 'NumpadEqual': LayoutEntry([0x0000003d, 0x0000003d, 0x0000003d, 0x0000003d]), - 'AudioVolumeUp': LayoutEntry([0x01000000, 0x0000003d, 0x01000000, 0x0000003d]), - }, - ), - - LayoutInfo( - name: 'no', - platform: LayoutPlatform.win, - mapping: { - 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x01000000, 0x01000000]), - 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x01000000]), - 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x01000000, 0x01000000]), - 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x01000000, 0x01000000]), - 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000020ac, 0x01000000]), - 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x01000000, 0x01000000]), - 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x01000000, 0x01000000]), - 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x01000000]), - 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x01000000]), - 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x01000000]), - 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x01000000]), - 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x01000000, 0x01000000]), - 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x000000b5, 0x01000000]), - 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x01000000]), - 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x01000000, 0x01000000]), - 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x01000000]), - 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x01000000, 0x01000000]), - 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x01000000, 0x01000000]), - 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x01000000, 0x01000000]), - 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x01000000, 0x01000000]), - 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x01000000]), - 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x01000000]), - 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x01000000, 0x01000000]), - 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x01000000, 0x01000000]), - 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x01000000, 0x01000000]), - 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x01000000]), - 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x01000000, 0x01000000]), - 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x00000040, 0x01000000]), - 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x000000a3, 0x01000000]), - 'Digit4': LayoutEntry([0x00000034, 0x000000a4, 0x00000024, 0x01000000]), - 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x000020ac, 0x01000000]), - 'Digit6': LayoutEntry([0x00000036, 0x00000026, 0x01000000, 0x01000000]), - 'Digit7': LayoutEntry([0x00000037, 0x0000002f, 0x0000007b, 0x01000000]), - 'Digit8': LayoutEntry([0x00000038, 0x00000028, 0x0000005b, 0x01000000]), - 'Digit9': LayoutEntry([0x00000039, 0x00000029, 0x0000005d, 0x01000000]), - 'Digit0': LayoutEntry([0x00000030, 0x0000003d, 0x0000007d, 0x01000000]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), - 'Minus': LayoutEntry([0x0000002b, 0x0000003f, 0x01000000, 0x01000000]), - 'Equal': LayoutEntry([0x0000005c, 0x00000060, 0x000000b4, 0x01000000]), - 'BracketLeft': LayoutEntry([0x000000e5, 0x000000c5, 0x01000000, 0x01000000]), - 'BracketRight': LayoutEntry([0x000000a8, 0x0000005e, 0x0000007e, 0x01000000]), - 'Backslash': LayoutEntry([0x00000027, 0x0000002a, 0x01000000, 0x01000000]), - 'Semicolon': LayoutEntry([0x000000f8, 0x000000d8, 0x01000000, 0x01000000]), - 'Quote': LayoutEntry([0x000000e6, 0x000000c6, 0x01000000, 0x01000000]), - 'Backquote': LayoutEntry([0x0000007c, 0x000000a7, 0x01000000, 0x01000000]), - 'Comma': LayoutEntry([0x0000002c, 0x0000003b, 0x01000000, 0x01000000]), - 'Period': LayoutEntry([0x0000002e, 0x0000003a, 0x01000000, 0x01000000]), - 'Slash': LayoutEntry([0x0000002d, 0x0000005f, 0x01000000, 0x01000000]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), - 'IntlBackslash': LayoutEntry([0x0000003c, 0x0000003e, 0x01000000, 0x01000000]), - }, - ), - - LayoutInfo( - name: 'pl', - platform: LayoutPlatform.darwin, - mapping: { - 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x00000105, 0x00000104]), - 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x0000013c, 0x00000171]), - 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x00000107, 0x00000106]), - 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x00002202, 0x0000017d]), - 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x00000119, 0x00000118]), - 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x00000144, 0x0000017e]), - 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x000000a9, 0x0000016a]), - 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x00000137, 0x000000d3]), - 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x00000165]), - 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x00002206, 0x000000d4]), - 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x0000017b, 0x0000016b]), - 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x00000142, 0x00000141]), - 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x00000136, 0x00000173]), - 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x00000144, 0x00000143]), - 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x000000f3, 0x000000d3]), - 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x0000013b, 0x00000142]), - 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x0000014c, 0x00000151]), - 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x000000ae, 0x000000a3]), - 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x0000015b, 0x0000015a]), - 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x00002020, 0x0000015b]), - 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x00000164]), - 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x0000221a, 0x000025ca]), - 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x00002211, 0x0000201e]), - 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x0000017a, 0x00000179]), - 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x0000012b, 0x000000c1]), - 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x0000017c, 0x0000017b]), - 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x00000143, 0x00000155]), - 'Digit2': LayoutEntry([0x00000032, 0x00000040, 0x00002122, 0x00000158]), - 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x000020ac, 0x00002039]), - 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x000000df, 0x0000203a]), - 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x0000012f, 0x00000159]), - 'Digit6': LayoutEntry([0x00000036, 0x0000005e, 0x000000a7, 0x00000156]), - 'Digit7': LayoutEntry([0x00000037, 0x00000026, 0x000000b6, 0x00000157]), - 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x00002022, 0x000000b0]), - 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x0000013d, 0x00000160]), - 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x0000013e, 0x0000201a]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), - 'Minus': LayoutEntry([0x0000002d, 0x0000005f, 0x00002013, 0x00002014]), - 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x00002260, 0x0000012a]), - 'BracketLeft': LayoutEntry([0x0000005b, 0x0000007b, 0x0000201e, 0x0000201d]), - 'BracketRight': LayoutEntry([0x0000005d, 0x0000007d, 0x0000201a, 0x00002019]), - 'Backslash': LayoutEntry([0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb]), - 'Semicolon': LayoutEntry([0x0000003b, 0x0000003a, 0x00002026, 0x000000da]), - 'Quote': LayoutEntry([0x00000027, 0x00000022, 0x0000013a, 0x00000123]), - 'Backquote': LayoutEntry([0x00000060, 0x0000007e, 0x01000000, 0x00000154]), - 'Comma': LayoutEntry([0x0000002c, 0x0000003c, 0x00002264, 0x000000dd]), - 'Period': LayoutEntry([0x0000002e, 0x0000003e, 0x00002265, 0x000000fd]), - 'Slash': LayoutEntry([0x0000002f, 0x0000003f, 0x000000f7, 0x00000146]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), - 'Numpad1': LayoutEntry([0x00000031, 0x00000031, 0x00000031, 0x00000031]), - 'Numpad2': LayoutEntry([0x00000032, 0x00000032, 0x00000032, 0x00000032]), - 'Numpad3': LayoutEntry([0x00000033, 0x00000033, 0x00000033, 0x00000033]), - 'Numpad4': LayoutEntry([0x00000034, 0x00000034, 0x00000034, 0x00000034]), - 'Numpad5': LayoutEntry([0x00000035, 0x00000035, 0x00000035, 0x00000035]), - 'Numpad6': LayoutEntry([0x00000036, 0x00000036, 0x00000036, 0x00000036]), - 'Numpad7': LayoutEntry([0x00000037, 0x00000037, 0x00000037, 0x00000037]), - 'Numpad8': LayoutEntry([0x00000038, 0x00000038, 0x00000038, 0x00000038]), - 'Numpad9': LayoutEntry([0x00000039, 0x00000039, 0x00000039, 0x00000039]), - 'Numpad0': LayoutEntry([0x00000030, 0x00000030, 0x00000030, 0x00000030]), - 'NumpadDecimal': LayoutEntry([0x0000002e, 0x0000002e, 0x0000002e, 0x0000002e]), - 'IntlBackslash': LayoutEntry([0x000000a7, 0x000000a3, 0x000000ac, 0x000000ac]), - 'NumpadEqual': LayoutEntry([0x0000003d, 0x0000003d, 0x0000003d, 0x0000003d]), - 'AudioVolumeUp': LayoutEntry([0x01000000, 0x0000003d, 0x01000000, 0x0000003d]), - }, - ), - - LayoutInfo( - name: 'pl', - platform: LayoutPlatform.win, - mapping: { - 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x00000105, 0x00000104]), - 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x01000000]), - 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x00000107, 0x00000106]), - 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x01000000, 0x01000000]), - 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x00000119, 0x00000118]), - 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x01000000, 0x01000000]), - 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x01000000, 0x01000000]), - 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x01000000]), - 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x01000000]), - 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x01000000]), - 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x01000000]), - 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x00000142, 0x00000141]), - 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x01000000, 0x01000000]), - 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x00000144, 0x00000143]), - 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x000000f3, 0x000000d3]), - 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x01000000]), - 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x01000000, 0x01000000]), - 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x01000000, 0x01000000]), - 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x0000015b, 0x0000015a]), - 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x01000000, 0x01000000]), - 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x000020ac, 0x01000000]), - 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x01000000]), - 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x01000000, 0x01000000]), - 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x0000017a, 0x00000179]), - 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x01000000, 0x01000000]), - 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x0000017c, 0x0000017b]), - 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x01000000, 0x01000000]), - 'Digit2': LayoutEntry([0x00000032, 0x00000040, 0x01000000, 0x01000000]), - 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x01000000, 0x01000000]), - 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x01000000, 0x01000000]), - 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x01000000, 0x01000000]), - 'Digit6': LayoutEntry([0x00000036, 0x0000005e, 0x01000000, 0x01000000]), - 'Digit7': LayoutEntry([0x00000037, 0x00000026, 0x01000000, 0x01000000]), - 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x01000000, 0x01000000]), - 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x01000000, 0x01000000]), - 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x01000000, 0x01000000]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), - 'Minus': LayoutEntry([0x0000002d, 0x0000005f, 0x01000000, 0x01000000]), - 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x01000000, 0x01000000]), - 'BracketLeft': LayoutEntry([0x0000005b, 0x0000007b, 0x01000000, 0x01000000]), - 'BracketRight': LayoutEntry([0x0000005d, 0x0000007d, 0x01000000, 0x01000000]), - 'Backslash': LayoutEntry([0x0000005c, 0x0000007c, 0x01000000, 0x01000000]), - 'Semicolon': LayoutEntry([0x0000003b, 0x0000003a, 0x01000000, 0x01000000]), - 'Quote': LayoutEntry([0x00000027, 0x00000022, 0x01000000, 0x01000000]), - 'Backquote': LayoutEntry([0x00000060, 0x0000007e, 0x01000000, 0x01000000]), - 'Comma': LayoutEntry([0x0000002c, 0x0000003c, 0x01000000, 0x01000000]), - 'Period': LayoutEntry([0x0000002e, 0x0000003e, 0x01000000, 0x01000000]), - 'Slash': LayoutEntry([0x0000002f, 0x0000003f, 0x01000000, 0x01000000]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), - 'IntlBackslash': LayoutEntry([0x0000005c, 0x0000007c, 0x01000000, 0x01000000]), - }, - ), - - LayoutInfo( - name: 'pt-br', - platform: LayoutPlatform.win, - mapping: { - 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x01000000, 0x01000000]), - 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x01000000]), - 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x000020a2, 0x01000000]), - 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x01000000, 0x01000000]), - 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000000b0, 0x01000000]), - 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x01000000, 0x01000000]), - 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x01000000, 0x01000000]), - 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x01000000]), - 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x01000000]), - 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x01000000]), - 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x01000000]), - 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x01000000, 0x01000000]), - 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x01000000, 0x01000000]), - 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x01000000]), - 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x01000000, 0x01000000]), - 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x01000000]), - 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x0000002f, 0x01000000]), - 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x01000000, 0x01000000]), - 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x01000000, 0x01000000]), - 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x01000000, 0x01000000]), - 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x01000000]), - 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x01000000]), - 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x0000003f, 0x01000000]), - 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x01000000, 0x01000000]), - 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x01000000, 0x01000000]), - 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x01000000]), - 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x000000b9, 0x01000000]), - 'Digit2': LayoutEntry([0x00000032, 0x00000040, 0x000000b2, 0x01000000]), - 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x000000b3, 0x01000000]), - 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x000000a3, 0x01000000]), - 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x000000a2, 0x01000000]), - 'Digit6': LayoutEntry([0x00000036, 0x000000a8, 0x000000ac, 0x01000000]), - 'Digit7': LayoutEntry([0x00000037, 0x00000026, 0x01000000, 0x01000000]), - 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x01000000, 0x01000000]), - 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x01000000, 0x01000000]), - 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x01000000, 0x01000000]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), - 'Minus': LayoutEntry([0x0000002d, 0x0000005f, 0x01000000, 0x01000000]), - 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x000000a7, 0x01000000]), - 'BracketLeft': LayoutEntry([0x000000b4, 0x00000060, 0x01000000, 0x01000000]), - 'BracketRight': LayoutEntry([0x0000005b, 0x0000007b, 0x000000aa, 0x01000000]), - 'Backslash': LayoutEntry([0x0000005d, 0x0000007d, 0x000000ba, 0x01000000]), - 'Semicolon': LayoutEntry([0x000000e7, 0x000000c7, 0x01000000, 0x01000000]), - 'Quote': LayoutEntry([0x0000007e, 0x0000005e, 0x01000000, 0x01000000]), - 'Backquote': LayoutEntry([0x00000027, 0x00000022, 0x01000000, 0x01000000]), - 'Comma': LayoutEntry([0x0000002c, 0x0000003c, 0x01000000, 0x01000000]), - 'Period': LayoutEntry([0x0000002e, 0x0000003e, 0x01000000, 0x01000000]), - 'Slash': LayoutEntry([0x0000003b, 0x0000003a, 0x01000000, 0x01000000]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), - 'IntlBackslash': LayoutEntry([0x0000005c, 0x0000007c, 0x01000000, 0x01000000]), - 'NumpadComma': LayoutEntry([0x0000002e, 0x0000002e, 0x01000000, 0x01000000]), - 'IntlRo': LayoutEntry([0x0000002f, 0x0000003f, 0x000000b0, 0x01000000]), - }, - ), - - LayoutInfo( - name: 'pt', - platform: LayoutPlatform.darwin, - mapping: { - 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x000000e5, 0x000000c5]), - 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x0000222b, 0x00000131]), - 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x000000e7, 0x000000c7]), - 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x00002202, 0x000000ce]), - 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x01000000, 0x000000b4]), - 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x00000192, 0x000000cf]), - 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x000000a9, 0x000002dd]), - 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x000002d9, 0x000000d3]), - 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x000002c6]), - 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x00002206, 0x000000d4]), - 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x000002da, 0x0000f8ff]), - 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x000000ac, 0x000000d2]), - 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x000000b5, 0x000000c2]), - 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x000002dc]), - 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8]), - 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x000003c0, 0x0000220f]), - 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x00000153, 0x00000152]), - 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x000000ae, 0x00002030]), - 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x000000df, 0x000000cd]), - 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x00002020, 0x000002c7]), - 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x000000a8]), - 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x0000221a, 0x000025ca]), - 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x00002211, 0x0000201e]), - 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x00002248, 0x000002db]), - 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x000000a5, 0x000000c1]), - 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x000003a9, 0x000000b8]), - 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x000000a1, 0x00002044]), - 'Digit2': LayoutEntry([0x00000032, 0x00000040, 0x00002122, 0x000020ac]), - 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x000000a3, 0x00002039]), - 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x000000a2, 0x0000203a]), - 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x0000221e, 0x0000fb01]), - 'Digit6': LayoutEntry([0x00000036, 0x01000000, 0x000000a7, 0x0000fb02]), - 'Digit7': LayoutEntry([0x00000037, 0x00000026, 0x000000b6, 0x00002021]), - 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x00002022, 0x000000b0]), - 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x000000aa, 0x000000b7]), - 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x000000ba, 0x0000201a]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), - 'Minus': LayoutEntry([0x0000002d, 0x0000005f, 0x00002013, 0x00002014]), - 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x00002260, 0x000000b1]), - 'BracketLeft': LayoutEntry([0x0000005b, 0x0000007b, 0x0000201c, 0x0000201d]), - 'BracketRight': LayoutEntry([0x0000005d, 0x0000007d, 0x00002018, 0x00002019]), - 'Backslash': LayoutEntry([0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb]), - 'Semicolon': LayoutEntry([0x0000003b, 0x0000003a, 0x00002026, 0x000000da]), - 'Quote': LayoutEntry([0x01000000, 0x01000000, 0x000000e6, 0x000000c6]), - 'Backquote': LayoutEntry([0x01000000, 0x01000000, 0x01000000, 0x00000060]), - 'Comma': LayoutEntry([0x0000002c, 0x0000003c, 0x00002264, 0x000000af]), - 'Period': LayoutEntry([0x0000002e, 0x0000003e, 0x00002265, 0x000002d8]), - 'Slash': LayoutEntry([0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), - 'Numpad1': LayoutEntry([0x00000031, 0x00000031, 0x00000031, 0x00000031]), - 'Numpad2': LayoutEntry([0x00000032, 0x00000032, 0x00000032, 0x00000032]), - 'Numpad3': LayoutEntry([0x00000033, 0x00000033, 0x00000033, 0x00000033]), - 'Numpad4': LayoutEntry([0x00000034, 0x00000034, 0x00000034, 0x00000034]), - 'Numpad5': LayoutEntry([0x00000035, 0x00000035, 0x00000035, 0x00000035]), - 'Numpad6': LayoutEntry([0x00000036, 0x00000036, 0x00000036, 0x00000036]), - 'Numpad7': LayoutEntry([0x00000037, 0x00000037, 0x00000037, 0x00000037]), - 'Numpad8': LayoutEntry([0x00000038, 0x00000038, 0x00000038, 0x00000038]), - 'Numpad9': LayoutEntry([0x00000039, 0x00000039, 0x00000039, 0x00000039]), - 'Numpad0': LayoutEntry([0x00000030, 0x00000030, 0x00000030, 0x00000030]), - 'NumpadDecimal': LayoutEntry([0x0000002e, 0x0000002e, 0x0000002e, 0x0000002e]), - 'IntlBackslash': LayoutEntry([0x000000a7, 0x000000b1, 0x000000a7, 0x000000b1]), - 'NumpadEqual': LayoutEntry([0x0000003d, 0x0000003d, 0x0000003d, 0x0000003d]), - 'AudioVolumeUp': LayoutEntry([0x01000000, 0x0000003d, 0x01000000, 0x0000003d]), - }, - ), - - LayoutInfo( - name: 'pt', - platform: LayoutPlatform.win, - mapping: { - 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x01000000, 0x01000000]), - 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x01000000]), - 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x01000000, 0x01000000]), - 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x01000000, 0x01000000]), - 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000020ac, 0x01000000]), - 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x01000000, 0x01000000]), - 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x01000000, 0x01000000]), - 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x01000000]), - 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x01000000]), - 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x01000000]), - 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x01000000]), - 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x01000000, 0x01000000]), - 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x01000000, 0x01000000]), - 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x01000000]), - 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x01000000, 0x01000000]), - 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x01000000]), - 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x01000000, 0x01000000]), - 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x01000000, 0x01000000]), - 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x01000000, 0x01000000]), - 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x01000000, 0x01000000]), - 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x01000000]), - 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x01000000]), - 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x01000000, 0x01000000]), - 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x01000000, 0x01000000]), - 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x01000000, 0x01000000]), - 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x01000000]), - 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x01000000, 0x01000000]), - 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x00000040, 0x01000000]), - 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x000000a3, 0x01000000]), - 'Digit4': LayoutEntry([0x00000034, 0x00000024, 0x000000a7, 0x01000000]), - 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x000020ac, 0x01000000]), - 'Digit6': LayoutEntry([0x00000036, 0x00000026, 0x01000000, 0x01000000]), - 'Digit7': LayoutEntry([0x00000037, 0x0000002f, 0x0000007b, 0x01000000]), - 'Digit8': LayoutEntry([0x00000038, 0x00000028, 0x0000005b, 0x01000000]), - 'Digit9': LayoutEntry([0x00000039, 0x00000029, 0x0000005d, 0x01000000]), - 'Digit0': LayoutEntry([0x00000030, 0x0000003d, 0x0000007d, 0x01000000]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), - 'Minus': LayoutEntry([0x00000027, 0x0000003f, 0x01000000, 0x01000000]), - 'Equal': LayoutEntry([0x000000ab, 0x000000bb, 0x01000000, 0x01000000]), - 'BracketLeft': LayoutEntry([0x0000002b, 0x0000002a, 0x000000a8, 0x01000000]), - 'BracketRight': LayoutEntry([0x000000b4, 0x00000060, 0x0000005d, 0x01000000]), - 'Backslash': LayoutEntry([0x0000007e, 0x0000005e, 0x01000000, 0x01000000]), - 'Semicolon': LayoutEntry([0x000000e7, 0x000000c7, 0x01000000, 0x01000000]), - 'Quote': LayoutEntry([0x000000ba, 0x000000aa, 0x01000000, 0x01000000]), - 'Backquote': LayoutEntry([0x0000005c, 0x0000007c, 0x01000000, 0x01000000]), - 'Comma': LayoutEntry([0x0000002c, 0x0000003b, 0x01000000, 0x01000000]), - 'Period': LayoutEntry([0x0000002e, 0x0000003a, 0x01000000, 0x01000000]), - 'Slash': LayoutEntry([0x0000002d, 0x0000005f, 0x01000000, 0x01000000]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), - 'IntlBackslash': LayoutEntry([0x0000003c, 0x0000003e, 0x01000000, 0x01000000]), - }, - ), - - LayoutInfo( - name: 'ru', - platform: LayoutPlatform.darwin, - mapping: { - 'KeyA': LayoutEntry([0x00000444, 0x00000424, 0x00000192, 0x00000192]), - 'KeyB': LayoutEntry([0x00000438, 0x00000418, 0x00000438, 0x00000418]), - 'KeyC': LayoutEntry([0x00000441, 0x00000421, 0x00002260, 0x00002260]), - 'KeyD': LayoutEntry([0x00000432, 0x00000412, 0x0000045b, 0x0000040b]), - 'KeyE': LayoutEntry([0x00000443, 0x00000423, 0x0000045c, 0x0000040c]), - 'KeyF': LayoutEntry([0x00000430, 0x00000410, 0x000000f7, 0x000000f7]), - 'KeyG': LayoutEntry([0x0000043f, 0x0000041f, 0x000000a9, 0x000000a9]), - 'KeyH': LayoutEntry([0x00000440, 0x00000420, 0x000020bd, 0x000020bd]), - 'KeyI': LayoutEntry([0x00000448, 0x00000428, 0x00000455, 0x00000405]), - 'KeyJ': LayoutEntry([0x0000043e, 0x0000041e, 0x000000b0, 0x00002022]), - 'KeyK': LayoutEntry([0x0000043b, 0x0000041b, 0x00000459, 0x00000409]), - 'KeyL': LayoutEntry([0x00000434, 0x00000414, 0x00002206, 0x00002206]), - 'KeyM': LayoutEntry([0x0000044c, 0x0000042c, 0x0000007e, 0x0000007e]), - 'KeyN': LayoutEntry([0x00000442, 0x00000422, 0x00002122, 0x00002122]), - 'KeyO': LayoutEntry([0x00000449, 0x00000429, 0x0000045e, 0x0000040e]), - 'KeyP': LayoutEntry([0x00000437, 0x00000417, 0x00002018, 0x00002019]), - 'KeyQ': LayoutEntry([0x00000439, 0x00000419, 0x00000458, 0x00000408]), - 'KeyR': LayoutEntry([0x0000043a, 0x0000041a, 0x000000ae, 0x000000ae]), - 'KeyS': LayoutEntry([0x0000044b, 0x0000042b, 0x0000044b, 0x0000042b]), - 'KeyT': LayoutEntry([0x00000435, 0x00000415, 0x00002020, 0x00002020]), - 'KeyU': LayoutEntry([0x00000433, 0x00000413, 0x00000453, 0x00000403]), - 'KeyV': LayoutEntry([0x0000043c, 0x0000041c, 0x000000b5, 0x000000b5]), - 'KeyW': LayoutEntry([0x00000446, 0x00000426, 0x0000045f, 0x0000040f]), - 'KeyX': LayoutEntry([0x00000447, 0x00000427, 0x00002248, 0x00002248]), - 'KeyY': LayoutEntry([0x0000043d, 0x0000041d, 0x0000045a, 0x0000040a]), - 'KeyZ': LayoutEntry([0x0000044f, 0x0000042f, 0x00000452, 0x00000402]), - 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x00000021, 0x0000007c]), - 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x00000040, 0x00000022]), - 'Digit3': LayoutEntry([0x00000033, 0x00002116, 0x00000023, 0x000000a3]), - 'Digit4': LayoutEntry([0x00000034, 0x00000025, 0x00000024, 0x000020ac]), - 'Digit5': LayoutEntry([0x00000035, 0x0000003a, 0x00000025, 0x0000221e]), - 'Digit6': LayoutEntry([0x00000036, 0x0000002c, 0x0000005e, 0x000000ac]), - 'Digit7': LayoutEntry([0x00000037, 0x0000002e, 0x00000026, 0x000000b6]), - 'Digit8': LayoutEntry([0x00000038, 0x0000003b, 0x0000002a, 0x0000221a]), - 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x0000007b, 0x00000027]), - 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x0000007d, 0x00000060]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), - 'Minus': LayoutEntry([0x0000002d, 0x0000005f, 0x00002013, 0x00002014]), - 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x000000bb, 0x000000ab]), - 'BracketLeft': LayoutEntry([0x00000445, 0x00000425, 0x0000201c, 0x0000201d]), - 'BracketRight': LayoutEntry([0x0000044a, 0x0000042a, 0x0000044a, 0x0000042a]), - 'Backslash': LayoutEntry([0x00000451, 0x00000401, 0x00000451, 0x00000401]), - 'Semicolon': LayoutEntry([0x00000436, 0x00000416, 0x00002026, 0x00002026]), - 'Quote': LayoutEntry([0x0000044d, 0x0000042d, 0x0000044d, 0x0000042d]), - 'Backquote': LayoutEntry([0x0000005d, 0x0000005b, 0x0000005d, 0x0000005b]), - 'Comma': LayoutEntry([0x00000431, 0x00000411, 0x00002264, 0x0000003c]), - 'Period': LayoutEntry([0x0000044e, 0x0000042e, 0x00002265, 0x0000003e]), - 'Slash': LayoutEntry([0x0000002f, 0x0000003f, 0x0000201c, 0x0000201e]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), - 'Numpad1': LayoutEntry([0x00000031, 0x00000031, 0x00000031, 0x00000031]), - 'Numpad2': LayoutEntry([0x00000032, 0x00000032, 0x00000032, 0x00000032]), - 'Numpad3': LayoutEntry([0x00000033, 0x00000033, 0x00000033, 0x00000033]), - 'Numpad4': LayoutEntry([0x00000034, 0x00000034, 0x00000034, 0x00000034]), - 'Numpad5': LayoutEntry([0x00000035, 0x00000035, 0x00000035, 0x00000035]), - 'Numpad6': LayoutEntry([0x00000036, 0x00000036, 0x00000036, 0x00000036]), - 'Numpad7': LayoutEntry([0x00000037, 0x00000037, 0x00000037, 0x00000037]), - 'Numpad8': LayoutEntry([0x00000038, 0x00000038, 0x00000038, 0x00000038]), - 'Numpad9': LayoutEntry([0x00000039, 0x00000039, 0x00000039, 0x00000039]), - 'Numpad0': LayoutEntry([0x00000030, 0x00000030, 0x00000030, 0x00000030]), - 'NumpadDecimal': LayoutEntry([0x0000002c, 0x0000002e, 0x0000002c, 0x0000002c]), - 'IntlBackslash': LayoutEntry([0x0000003e, 0x0000003c, 0x000000a7, 0x000000b1]), - 'NumpadEqual': LayoutEntry([0x0000003d, 0x0000003d, 0x0000003d, 0x0000003d]), - 'AudioVolumeUp': LayoutEntry([0x01000000, 0x0000003d, 0x01000000, 0x01000000]), - }, - ), - - LayoutInfo( - name: 'ru', - platform: LayoutPlatform.linux, - mapping: { - 'KeyA': LayoutEntry([0x00000444, 0x00000424, 0x00000444, 0x00000424]), - 'KeyB': LayoutEntry([0x00000438, 0x00000418, 0x00000438, 0x00000418]), - 'KeyC': LayoutEntry([0x00000441, 0x00000421, 0x00000441, 0x00000421]), - 'KeyD': LayoutEntry([0x00000432, 0x00000412, 0x00000432, 0x00000412]), - 'KeyE': LayoutEntry([0x00000443, 0x00000423, 0x00000443, 0x00000423]), - 'KeyF': LayoutEntry([0x00000430, 0x00000410, 0x00000430, 0x00000410]), - 'KeyG': LayoutEntry([0x0000043f, 0x0000041f, 0x0000043f, 0x0000041f]), - 'KeyH': LayoutEntry([0x00000440, 0x00000420, 0x00000440, 0x00000420]), - 'KeyI': LayoutEntry([0x00000448, 0x00000428, 0x00000448, 0x00000428]), - 'KeyJ': LayoutEntry([0x0000043e, 0x0000041e, 0x0000043e, 0x0000041e]), - 'KeyK': LayoutEntry([0x0000043b, 0x0000041b, 0x0000043b, 0x0000041b]), - 'KeyL': LayoutEntry([0x00000434, 0x00000414, 0x00000434, 0x00000414]), - 'KeyM': LayoutEntry([0x0000044c, 0x0000042c, 0x0000044c, 0x0000042c]), - 'KeyN': LayoutEntry([0x00000442, 0x00000422, 0x00000442, 0x00000422]), - 'KeyO': LayoutEntry([0x00000449, 0x00000429, 0x00000449, 0x00000429]), - 'KeyP': LayoutEntry([0x00000437, 0x00000417, 0x00000437, 0x00000417]), - 'KeyQ': LayoutEntry([0x00000439, 0x00000419, 0x00000439, 0x00000419]), - 'KeyR': LayoutEntry([0x0000043a, 0x0000041a, 0x0000043a, 0x0000041a]), - 'KeyS': LayoutEntry([0x0000044b, 0x0000042b, 0x0000044b, 0x0000042b]), - 'KeyT': LayoutEntry([0x00000435, 0x00000415, 0x00000435, 0x00000415]), - 'KeyU': LayoutEntry([0x00000433, 0x00000413, 0x00000433, 0x00000413]), - 'KeyV': LayoutEntry([0x0000043c, 0x0000041c, 0x0000043c, 0x0000041c]), - 'KeyW': LayoutEntry([0x00000446, 0x00000426, 0x00000446, 0x00000426]), - 'KeyX': LayoutEntry([0x00000447, 0x00000427, 0x00000447, 0x00000427]), - 'KeyY': LayoutEntry([0x0000043d, 0x0000041d, 0x0000043d, 0x0000041d]), - 'KeyZ': LayoutEntry([0x0000044f, 0x0000042f, 0x0000044f, 0x0000042f]), - 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x00000031, 0x00000021]), - 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x00000032, 0x00000022]), - 'Digit3': LayoutEntry([0x00000033, 0x00002116, 0x00000033, 0x00002116]), - 'Digit4': LayoutEntry([0x00000034, 0x0000003b, 0x00000034, 0x0000003b]), - 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x00000035, 0x00000025]), - 'Digit6': LayoutEntry([0x00000036, 0x0000003a, 0x00000036, 0x0000003a]), - 'Digit7': LayoutEntry([0x00000037, 0x0000003f, 0x00000037, 0x0000003f]), - 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x000020bd, 0x01000000]), - 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x00000039, 0x00000028]), - 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x00000030, 0x00000029]), - 'Enter': LayoutEntry([0x0000000d, 0x0000000d, 0x0000000d, 0x0000000d]), - 'Escape': LayoutEntry([0x0000001b, 0x0000001b, 0x0000001b, 0x0000001b]), - 'Backspace': LayoutEntry([0x00000008, 0x00000008, 0x00000008, 0x00000008]), - 'Tab': LayoutEntry([0x00000009, 0x01000000, 0x00000009, 0x01000000]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), - 'Minus': LayoutEntry([0x0000002d, 0x0000005f, 0x0000002d, 0x0000005f]), - 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x0000003d, 0x0000002b]), - 'BracketLeft': LayoutEntry([0x00000445, 0x00000425, 0x00000445, 0x00000425]), - 'BracketRight': LayoutEntry([0x0000044a, 0x0000042a, 0x0000044a, 0x0000042a]), - 'Backslash': LayoutEntry([0x0000005c, 0x0000002f, 0x0000005c, 0x0000002f]), - 'Semicolon': LayoutEntry([0x00000436, 0x00000416, 0x00000436, 0x00000416]), - 'Quote': LayoutEntry([0x0000044d, 0x0000042d, 0x0000044d, 0x0000042d]), - 'Backquote': LayoutEntry([0x00000451, 0x00000401, 0x00000451, 0x00000401]), - 'Comma': LayoutEntry([0x00000431, 0x00000411, 0x00000431, 0x00000411]), - 'Period': LayoutEntry([0x0000044e, 0x0000042e, 0x0000044e, 0x0000042e]), - 'Slash': LayoutEntry([0x0000002e, 0x0000002c, 0x0000002e, 0x0000002c]), - 'PrintScreen': LayoutEntry([0x01000000, 0x01000000, 0x01000000, 0x01000000]), - 'PageUp': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), - 'Numpad1': LayoutEntry([0x01000000, 0x00000031, 0x01000000, 0x00000031]), - 'Numpad2': LayoutEntry([0x01000000, 0x00000032, 0x01000000, 0x00000032]), - 'Numpad3': LayoutEntry([0x01000000, 0x00000033, 0x01000000, 0x00000033]), - 'Numpad4': LayoutEntry([0x01000000, 0x00000034, 0x01000000, 0x00000034]), - 'Numpad5': LayoutEntry([0x01000000, 0x00000035, 0x01000000, 0x00000035]), - 'Numpad6': LayoutEntry([0x01000000, 0x00000036, 0x01000000, 0x00000036]), - 'Numpad7': LayoutEntry([0x01000000, 0x00000037, 0x01000000, 0x00000037]), - 'Numpad8': LayoutEntry([0x01000000, 0x00000038, 0x01000000, 0x00000038]), - 'Numpad9': LayoutEntry([0x01000000, 0x00000039, 0x01000000, 0x00000039]), - 'Numpad0': LayoutEntry([0x01000000, 0x00000030, 0x01000000, 0x00000030]), - 'NumpadDecimal': LayoutEntry([0x01000000, 0x0000002c, 0x01000000, 0x0000002c]), - 'IntlBackslash': LayoutEntry([0x0000002f, 0x0000007c, 0x0000007c, 0x000000a6]), - 'AltRight': LayoutEntry([0x0000000d, 0x0000000d, 0x0000000d, 0x0000000d]), - 'MetaRight': LayoutEntry([0x0000002e, 0x0000002e, 0x0000002e, 0x0000002e]), - }, - ), - - LayoutInfo( - name: 'ru', - platform: LayoutPlatform.win, - mapping: { - 'KeyA': LayoutEntry([0x00000444, 0x00000424, 0x01000000, 0x01000000]), - 'KeyB': LayoutEntry([0x00000438, 0x00000418, 0x01000000, 0x01000000]), - 'KeyC': LayoutEntry([0x00000441, 0x00000421, 0x01000000, 0x01000000]), - 'KeyD': LayoutEntry([0x00000432, 0x00000412, 0x01000000, 0x01000000]), - 'KeyE': LayoutEntry([0x00000443, 0x00000423, 0x01000000, 0x01000000]), - 'KeyF': LayoutEntry([0x00000430, 0x00000410, 0x01000000, 0x01000000]), - 'KeyG': LayoutEntry([0x0000043f, 0x0000041f, 0x01000000, 0x01000000]), - 'KeyH': LayoutEntry([0x00000440, 0x00000420, 0x01000000, 0x01000000]), - 'KeyI': LayoutEntry([0x00000448, 0x00000428, 0x01000000, 0x01000000]), - 'KeyJ': LayoutEntry([0x0000043e, 0x0000041e, 0x01000000, 0x01000000]), - 'KeyK': LayoutEntry([0x0000043b, 0x0000041b, 0x01000000, 0x01000000]), - 'KeyL': LayoutEntry([0x00000434, 0x00000414, 0x01000000, 0x01000000]), - 'KeyM': LayoutEntry([0x0000044c, 0x0000042c, 0x01000000, 0x01000000]), - 'KeyN': LayoutEntry([0x00000442, 0x00000422, 0x01000000, 0x01000000]), - 'KeyO': LayoutEntry([0x00000449, 0x00000429, 0x01000000, 0x01000000]), - 'KeyP': LayoutEntry([0x00000437, 0x00000417, 0x01000000, 0x01000000]), - 'KeyQ': LayoutEntry([0x00000439, 0x00000419, 0x01000000, 0x01000000]), - 'KeyR': LayoutEntry([0x0000043a, 0x0000041a, 0x01000000, 0x01000000]), - 'KeyS': LayoutEntry([0x0000044b, 0x0000042b, 0x01000000, 0x01000000]), - 'KeyT': LayoutEntry([0x00000435, 0x00000415, 0x01000000, 0x01000000]), - 'KeyU': LayoutEntry([0x00000433, 0x00000413, 0x01000000, 0x01000000]), - 'KeyV': LayoutEntry([0x0000043c, 0x0000041c, 0x01000000, 0x01000000]), - 'KeyW': LayoutEntry([0x00000446, 0x00000426, 0x01000000, 0x01000000]), - 'KeyX': LayoutEntry([0x00000447, 0x00000427, 0x01000000, 0x01000000]), - 'KeyY': LayoutEntry([0x0000043d, 0x0000041d, 0x01000000, 0x01000000]), - 'KeyZ': LayoutEntry([0x0000044f, 0x0000042f, 0x01000000, 0x01000000]), - 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x01000000, 0x01000000]), - 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x01000000, 0x01000000]), - 'Digit3': LayoutEntry([0x00000033, 0x00002116, 0x01000000, 0x01000000]), - 'Digit4': LayoutEntry([0x00000034, 0x0000003b, 0x01000000, 0x01000000]), - 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x01000000, 0x01000000]), - 'Digit6': LayoutEntry([0x00000036, 0x0000003a, 0x01000000, 0x01000000]), - 'Digit7': LayoutEntry([0x00000037, 0x0000003f, 0x01000000, 0x01000000]), - 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x000020bd, 0x01000000]), - 'Digit9': LayoutEntry([0x00000039, 0x00000028, 0x01000000, 0x01000000]), - 'Digit0': LayoutEntry([0x00000030, 0x00000029, 0x01000000, 0x01000000]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), - 'Minus': LayoutEntry([0x0000002d, 0x0000005f, 0x01000000, 0x01000000]), - 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x01000000, 0x01000000]), - 'BracketLeft': LayoutEntry([0x00000445, 0x00000425, 0x01000000, 0x01000000]), - 'BracketRight': LayoutEntry([0x0000044a, 0x0000042a, 0x01000000, 0x01000000]), - 'Backslash': LayoutEntry([0x0000005c, 0x0000002f, 0x01000000, 0x01000000]), - 'Semicolon': LayoutEntry([0x00000436, 0x00000416, 0x01000000, 0x01000000]), - 'Quote': LayoutEntry([0x0000044d, 0x0000042d, 0x01000000, 0x01000000]), - 'Backquote': LayoutEntry([0x00000451, 0x00000401, 0x01000000, 0x01000000]), - 'Comma': LayoutEntry([0x00000431, 0x00000411, 0x01000000, 0x01000000]), - 'Period': LayoutEntry([0x0000044e, 0x0000042e, 0x01000000, 0x01000000]), - 'Slash': LayoutEntry([0x0000002e, 0x0000002c, 0x01000000, 0x01000000]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), - 'IntlBackslash': LayoutEntry([0x0000005c, 0x0000002f, 0x01000000, 0x01000000]), - }, - ), - - LayoutInfo( - name: 'sv', - platform: LayoutPlatform.darwin, - mapping: { - 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x0000f8ff, 0x000025ca]), - 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x0000203a, 0x000000bb]), - 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x000000e7, 0x000000c7]), - 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x00002202, 0x00002206]), - 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000000e9, 0x000000c9]), - 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x00000192, 0x0000222b]), - 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x000000b8, 0x000000af]), - 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x000002db, 0x000002d8]), - 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x00000131, 0x000002c6]), - 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x0000221a, 0x000000ac]), - 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x000000aa, 0x000000ba]), - 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x0000fb01, 0x0000fb02]), - 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x00002019, 0x0000201d]), - 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x00002018, 0x0000201c]), - 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x00000153, 0x00000152]), - 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x000003c0, 0x0000220f]), - 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x00002022, 0x000000b0]), - 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x000000ae, 0x0000221a]), - 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x000000df, 0x00002211]), - 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x00002020, 0x00002021]), - 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x000000fc, 0x000000dc]), - 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x00002039, 0x000000ab]), - 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x000003a9, 0x000002dd]), - 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x00002248, 0x000002c7]), - 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x000000b5, 0x000002dc]), - 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x000000f7, 0x00002044]), - 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x000000a9, 0x000000a1]), - 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x00000040, 0x0000201d]), - 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x000000a3, 0x000000a5]), - 'Digit4': LayoutEntry([0x00000034, 0x000020ac, 0x00000024, 0x000000a2]), - 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x0000221e, 0x00002030]), - 'Digit6': LayoutEntry([0x00000036, 0x00000026, 0x000000a7, 0x000000b6]), - 'Digit7': LayoutEntry([0x00000037, 0x0000002f, 0x0000007c, 0x0000005c]), - 'Digit8': LayoutEntry([0x00000038, 0x00000028, 0x0000005b, 0x0000007b]), - 'Digit9': LayoutEntry([0x00000039, 0x00000029, 0x0000005d, 0x0000007d]), - 'Digit0': LayoutEntry([0x00000030, 0x0000003d, 0x00002248, 0x00002260]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), - 'Minus': LayoutEntry([0x0000002b, 0x0000003f, 0x000000b1, 0x000000bf]), - 'Equal': LayoutEntry([0x01000000, 0x01000000, 0x000000b4, 0x00000060]), - 'BracketLeft': LayoutEntry([0x000000e5, 0x000000c5, 0x000002d9, 0x000002da]), - 'BracketRight': LayoutEntry([0x01000000, 0x01000000, 0x01000000, 0x0000005e]), - 'Backslash': LayoutEntry([0x00000027, 0x0000002a, 0x00002122, 0x00002019]), - 'Semicolon': LayoutEntry([0x000000f6, 0x000000d6, 0x000000f8, 0x000000d8]), - 'Quote': LayoutEntry([0x000000e4, 0x000000c4, 0x000000e6, 0x000000c6]), - 'Backquote': LayoutEntry([0x0000003c, 0x0000003e, 0x00002264, 0x00002265]), - 'Comma': LayoutEntry([0x0000002c, 0x0000003b, 0x0000201a, 0x0000201e]), - 'Period': LayoutEntry([0x0000002e, 0x0000003a, 0x00002026, 0x000000b7]), - 'Slash': LayoutEntry([0x0000002d, 0x0000005f, 0x00002013, 0x00002014]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), - 'Numpad1': LayoutEntry([0x00000031, 0x00000031, 0x00000031, 0x00000031]), - 'Numpad2': LayoutEntry([0x00000032, 0x00000032, 0x00000032, 0x00000032]), - 'Numpad3': LayoutEntry([0x00000033, 0x00000033, 0x00000033, 0x00000033]), - 'Numpad4': LayoutEntry([0x00000034, 0x00000034, 0x00000034, 0x00000034]), - 'Numpad5': LayoutEntry([0x00000035, 0x00000035, 0x00000035, 0x00000035]), - 'Numpad6': LayoutEntry([0x00000036, 0x00000036, 0x00000036, 0x00000036]), - 'Numpad7': LayoutEntry([0x00000037, 0x00000037, 0x00000037, 0x00000037]), - 'Numpad8': LayoutEntry([0x00000038, 0x00000038, 0x00000038, 0x00000038]), - 'Numpad9': LayoutEntry([0x00000039, 0x00000039, 0x00000039, 0x00000039]), - 'Numpad0': LayoutEntry([0x00000030, 0x00000030, 0x00000030, 0x00000030]), - 'NumpadDecimal': LayoutEntry([0x0000002c, 0x0000002e, 0x0000002c, 0x0000002e]), - 'IntlBackslash': LayoutEntry([0x000000a7, 0x000000b0, 0x000000b6, 0x00002022]), - 'NumpadEqual': LayoutEntry([0x0000003d, 0x0000003d, 0x0000003d, 0x0000003d]), - 'AudioVolumeUp': LayoutEntry([0x01000000, 0x0000003d, 0x01000000, 0x0000003d]), - }, - ), - - LayoutInfo( - name: 'sv', - platform: LayoutPlatform.win, - mapping: { - 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x01000000, 0x01000000]), - 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x01000000]), - 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x01000000, 0x01000000]), - 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x01000000, 0x01000000]), - 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000020ac, 0x01000000]), - 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x01000000, 0x01000000]), - 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x01000000, 0x01000000]), - 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x01000000]), - 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x01000000]), - 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x01000000]), - 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x01000000]), - 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x01000000, 0x01000000]), - 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x000000b5, 0x01000000]), - 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x01000000]), - 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x01000000, 0x01000000]), - 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x01000000]), - 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x01000000, 0x01000000]), - 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x01000000, 0x01000000]), - 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x01000000, 0x01000000]), - 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x01000000, 0x01000000]), - 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x01000000]), - 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x01000000]), - 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x01000000, 0x01000000]), - 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x01000000, 0x01000000]), - 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x01000000, 0x01000000]), - 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x01000000]), - 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x01000000, 0x01000000]), - 'Digit2': LayoutEntry([0x00000032, 0x00000022, 0x00000040, 0x01000000]), - 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x000000a3, 0x01000000]), - 'Digit4': LayoutEntry([0x00000034, 0x000000a4, 0x00000024, 0x01000000]), - 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x000020ac, 0x01000000]), - 'Digit6': LayoutEntry([0x00000036, 0x00000026, 0x01000000, 0x01000000]), - 'Digit7': LayoutEntry([0x00000037, 0x0000002f, 0x0000007b, 0x01000000]), - 'Digit8': LayoutEntry([0x00000038, 0x00000028, 0x0000005b, 0x01000000]), - 'Digit9': LayoutEntry([0x00000039, 0x00000029, 0x0000005d, 0x01000000]), - 'Digit0': LayoutEntry([0x00000030, 0x0000003d, 0x0000007d, 0x01000000]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), - 'Minus': LayoutEntry([0x0000002b, 0x0000003f, 0x0000005c, 0x01000000]), - 'Equal': LayoutEntry([0x000000b4, 0x00000060, 0x01000000, 0x01000000]), - 'BracketLeft': LayoutEntry([0x000000e5, 0x000000c5, 0x01000000, 0x01000000]), - 'BracketRight': LayoutEntry([0x000000a8, 0x0000005e, 0x0000007e, 0x01000000]), - 'Backslash': LayoutEntry([0x00000027, 0x0000002a, 0x01000000, 0x01000000]), - 'Semicolon': LayoutEntry([0x000000f6, 0x000000d6, 0x01000000, 0x01000000]), - 'Quote': LayoutEntry([0x000000e4, 0x000000c4, 0x01000000, 0x01000000]), - 'Backquote': LayoutEntry([0x000000a7, 0x000000bd, 0x01000000, 0x01000000]), - 'Comma': LayoutEntry([0x0000002c, 0x0000003b, 0x01000000, 0x01000000]), - 'Period': LayoutEntry([0x0000002e, 0x0000003a, 0x01000000, 0x01000000]), - 'Slash': LayoutEntry([0x0000002d, 0x0000005f, 0x01000000, 0x01000000]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), - 'IntlBackslash': LayoutEntry([0x0000003c, 0x0000003e, 0x0000007c, 0x01000000]), - }, - ), - - LayoutInfo( - name: 'thai', - platform: LayoutPlatform.win, - mapping: { - 'KeyA': LayoutEntry([0x00000e1f, 0x00000e24, 0x01000000, 0x01000000]), - 'KeyB': LayoutEntry([0x00000e34, 0x00000e3a, 0x01000000, 0x01000000]), - 'KeyC': LayoutEntry([0x00000e41, 0x00000e09, 0x01000000, 0x01000000]), - 'KeyD': LayoutEntry([0x00000e01, 0x00000e0f, 0x01000000, 0x01000000]), - 'KeyE': LayoutEntry([0x00000e33, 0x00000e0e, 0x01000000, 0x01000000]), - 'KeyF': LayoutEntry([0x00000e14, 0x00000e42, 0x01000000, 0x01000000]), - 'KeyG': LayoutEntry([0x00000e40, 0x00000e0c, 0x01000000, 0x01000000]), - 'KeyH': LayoutEntry([0x00000e49, 0x00000e47, 0x01000000, 0x01000000]), - 'KeyI': LayoutEntry([0x00000e23, 0x00000e13, 0x01000000, 0x01000000]), - 'KeyJ': LayoutEntry([0x00000e48, 0x00000e4b, 0x01000000, 0x01000000]), - 'KeyK': LayoutEntry([0x00000e32, 0x00000e29, 0x01000000, 0x01000000]), - 'KeyL': LayoutEntry([0x00000e2a, 0x00000e28, 0x01000000, 0x01000000]), - 'KeyM': LayoutEntry([0x00000e17, 0x0000003f, 0x01000000, 0x01000000]), - 'KeyN': LayoutEntry([0x00000e37, 0x00000e4c, 0x01000000, 0x01000000]), - 'KeyO': LayoutEntry([0x00000e19, 0x00000e2f, 0x01000000, 0x01000000]), - 'KeyP': LayoutEntry([0x00000e22, 0x00000e0d, 0x01000000, 0x01000000]), - 'KeyQ': LayoutEntry([0x00000e46, 0x00000e50, 0x01000000, 0x01000000]), - 'KeyR': LayoutEntry([0x00000e1e, 0x00000e11, 0x01000000, 0x01000000]), - 'KeyS': LayoutEntry([0x00000e2b, 0x00000e06, 0x01000000, 0x01000000]), - 'KeyT': LayoutEntry([0x00000e30, 0x00000e18, 0x01000000, 0x01000000]), - 'KeyU': LayoutEntry([0x00000e35, 0x00000e4a, 0x01000000, 0x01000000]), - 'KeyV': LayoutEntry([0x00000e2d, 0x00000e2e, 0x01000000, 0x01000000]), - 'KeyW': LayoutEntry([0x00000e44, 0x00000022, 0x01000000, 0x01000000]), - 'KeyX': LayoutEntry([0x00000e1b, 0x00000029, 0x01000000, 0x01000000]), - 'KeyY': LayoutEntry([0x00000e31, 0x00000e4d, 0x01000000, 0x01000000]), - 'KeyZ': LayoutEntry([0x00000e1c, 0x00000028, 0x01000000, 0x01000000]), - 'Digit1': LayoutEntry([0x00000e45, 0x0000002b, 0x01000000, 0x01000000]), - 'Digit2': LayoutEntry([0x0000002f, 0x00000e51, 0x01000000, 0x01000000]), - 'Digit3': LayoutEntry([0x0000002d, 0x00000e52, 0x01000000, 0x01000000]), - 'Digit4': LayoutEntry([0x00000e20, 0x00000e53, 0x01000000, 0x01000000]), - 'Digit5': LayoutEntry([0x00000e16, 0x00000e54, 0x01000000, 0x01000000]), - 'Digit6': LayoutEntry([0x00000e38, 0x00000e39, 0x01000000, 0x01000000]), - 'Digit7': LayoutEntry([0x00000e36, 0x00000e3f, 0x01000000, 0x01000000]), - 'Digit8': LayoutEntry([0x00000e04, 0x00000e55, 0x01000000, 0x01000000]), - 'Digit9': LayoutEntry([0x00000e15, 0x00000e56, 0x01000000, 0x01000000]), - 'Digit0': LayoutEntry([0x00000e08, 0x00000e57, 0x01000000, 0x01000000]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), - 'Minus': LayoutEntry([0x00000e02, 0x00000e58, 0x01000000, 0x01000000]), - 'Equal': LayoutEntry([0x00000e0a, 0x00000e59, 0x01000000, 0x01000000]), - 'BracketLeft': LayoutEntry([0x00000e1a, 0x00000e10, 0x01000000, 0x01000000]), - 'BracketRight': LayoutEntry([0x00000e25, 0x0000002c, 0x01000000, 0x01000000]), - 'Backslash': LayoutEntry([0x00000e03, 0x00000e05, 0x01000000, 0x01000000]), - 'Semicolon': LayoutEntry([0x00000e27, 0x00000e0b, 0x01000000, 0x01000000]), - 'Quote': LayoutEntry([0x00000e07, 0x0000002e, 0x01000000, 0x01000000]), - 'Backquote': LayoutEntry([0x0000005f, 0x00000025, 0x01000000, 0x01000000]), - 'Comma': LayoutEntry([0x00000e21, 0x00000e12, 0x01000000, 0x01000000]), - 'Period': LayoutEntry([0x00000e43, 0x00000e2c, 0x01000000, 0x01000000]), - 'Slash': LayoutEntry([0x00000e1d, 0x00000e26, 0x01000000, 0x01000000]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), - 'IntlBackslash': LayoutEntry([0x00000e03, 0x00000e05, 0x01000000, 0x01000000]), - }, - ), - - LayoutInfo( - name: 'tr', - platform: LayoutPlatform.win, - mapping: { - 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x000000e6, 0x000000c6]), - 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x01000000, 0x01000000]), - 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x01000000, 0x01000000]), - 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x01000000, 0x01000000]), - 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x000020ac, 0x01000000]), - 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x01000000, 0x01000000]), - 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x01000000, 0x01000000]), - 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x01000000, 0x01000000]), - 'KeyI': LayoutEntry([0x00000131, 0x00000049, 0x00000069, 0x00000130]), - 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x01000000, 0x01000000]), - 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x01000000, 0x01000000]), - 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x01000000, 0x01000000]), - 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x01000000, 0x01000000]), - 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x01000000]), - 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x01000000, 0x01000000]), - 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x01000000, 0x01000000]), - 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x00000040, 0x01000000]), - 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x01000000, 0x01000000]), - 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x000000df, 0x01000000]), - 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x000020ba, 0x01000000]), - 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x01000000]), - 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x01000000, 0x01000000]), - 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x01000000, 0x01000000]), - 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x01000000, 0x01000000]), - 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x01000000, 0x01000000]), - 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x01000000, 0x01000000]), - 'Digit1': LayoutEntry([0x00000031, 0x00000021, 0x0000003e, 0x01000000]), - 'Digit2': LayoutEntry([0x00000032, 0x00000027, 0x000000a3, 0x01000000]), - 'Digit3': LayoutEntry([0x00000033, 0x0000005e, 0x00000023, 0x01000000]), - 'Digit4': LayoutEntry([0x00000034, 0x0000002b, 0x00000024, 0x01000000]), - 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x000000bd, 0x01000000]), - 'Digit6': LayoutEntry([0x00000036, 0x00000026, 0x01000000, 0x01000000]), - 'Digit7': LayoutEntry([0x00000037, 0x0000002f, 0x0000007b, 0x01000000]), - 'Digit8': LayoutEntry([0x00000038, 0x00000028, 0x0000005b, 0x01000000]), - 'Digit9': LayoutEntry([0x00000039, 0x00000029, 0x0000005d, 0x01000000]), - 'Digit0': LayoutEntry([0x00000030, 0x0000003d, 0x0000007d, 0x01000000]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x01000000, 0x01000000]), - 'Minus': LayoutEntry([0x0000002a, 0x0000003f, 0x0000005c, 0x01000000]), - 'Equal': LayoutEntry([0x0000002d, 0x0000005f, 0x0000007c, 0x01000000]), - 'BracketLeft': LayoutEntry([0x0000011f, 0x0000011e, 0x000000a8, 0x01000000]), - 'BracketRight': LayoutEntry([0x000000fc, 0x000000dc, 0x0000007e, 0x01000000]), - 'Backslash': LayoutEntry([0x0000002c, 0x0000003b, 0x00000060, 0x01000000]), - 'Semicolon': LayoutEntry([0x0000015f, 0x0000015e, 0x000000b4, 0x01000000]), - 'Quote': LayoutEntry([0x00000069, 0x00000130, 0x01000000, 0x01000000]), - 'Backquote': LayoutEntry([0x00000022, 0x000000e9, 0x0000003c, 0x01000000]), - 'Comma': LayoutEntry([0x000000f6, 0x000000d6, 0x01000000, 0x01000000]), - 'Period': LayoutEntry([0x000000e7, 0x000000c7, 0x01000000, 0x01000000]), - 'Slash': LayoutEntry([0x0000002e, 0x0000003a, 0x01000000, 0x01000000]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x01000000, 0x01000000]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x01000000, 0x01000000]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x01000000, 0x01000000]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x01000000, 0x01000000]), - 'IntlBackslash': LayoutEntry([0x0000003c, 0x0000003e, 0x0000007c, 0x01000000]), - }, - ), - - LayoutInfo( - name: 'zh-hans', - platform: LayoutPlatform.darwin, - mapping: { - 'KeyA': LayoutEntry([0x00000061, 0x00000041, 0x000000e5, 0x000000c5]), - 'KeyB': LayoutEntry([0x00000062, 0x00000042, 0x0000222b, 0x00000131]), - 'KeyC': LayoutEntry([0x00000063, 0x00000043, 0x000000e7, 0x000000c7]), - 'KeyD': LayoutEntry([0x00000064, 0x00000044, 0x00002202, 0x000000ce]), - 'KeyE': LayoutEntry([0x00000065, 0x00000045, 0x01000000, 0x000000b4]), - 'KeyF': LayoutEntry([0x00000066, 0x00000046, 0x00000192, 0x000000cf]), - 'KeyG': LayoutEntry([0x00000067, 0x00000047, 0x000000a9, 0x000002dd]), - 'KeyH': LayoutEntry([0x00000068, 0x00000048, 0x000002d9, 0x000000d3]), - 'KeyI': LayoutEntry([0x00000069, 0x00000049, 0x01000000, 0x000002c6]), - 'KeyJ': LayoutEntry([0x0000006a, 0x0000004a, 0x00002206, 0x000000d4]), - 'KeyK': LayoutEntry([0x0000006b, 0x0000004b, 0x000002da, 0x0000f8ff]), - 'KeyL': LayoutEntry([0x0000006c, 0x0000004c, 0x000000ac, 0x000000d2]), - 'KeyM': LayoutEntry([0x0000006d, 0x0000004d, 0x000000b5, 0x000000c2]), - 'KeyN': LayoutEntry([0x0000006e, 0x0000004e, 0x01000000, 0x000002dc]), - 'KeyO': LayoutEntry([0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8]), - 'KeyP': LayoutEntry([0x00000070, 0x00000050, 0x000003c0, 0x0000220f]), - 'KeyQ': LayoutEntry([0x00000071, 0x00000051, 0x00000153, 0x00000152]), - 'KeyR': LayoutEntry([0x00000072, 0x00000052, 0x000000ae, 0x00002030]), - 'KeyS': LayoutEntry([0x00000073, 0x00000053, 0x000000df, 0x000000cd]), - 'KeyT': LayoutEntry([0x00000074, 0x00000054, 0x00002020, 0x000002c7]), - 'KeyU': LayoutEntry([0x00000075, 0x00000055, 0x01000000, 0x000000a8]), - 'KeyV': LayoutEntry([0x00000076, 0x00000056, 0x0000221a, 0x000025ca]), - 'KeyW': LayoutEntry([0x00000077, 0x00000057, 0x00002211, 0x0000201e]), - 'KeyX': LayoutEntry([0x00000078, 0x00000058, 0x00002248, 0x000002db]), - 'KeyY': LayoutEntry([0x00000079, 0x00000059, 0x000000a5, 0x000000c1]), - 'KeyZ': LayoutEntry([0x0000007a, 0x0000005a, 0x000003a9, 0x000000b8]), - 'Digit1': LayoutEntry([0x00000031, 0x0000ff01, 0x000000a1, 0x00002044]), - 'Digit2': LayoutEntry([0x00000032, 0x00000040, 0x00002122, 0x000020ac]), - 'Digit3': LayoutEntry([0x00000033, 0x00000023, 0x000000a3, 0x00002039]), - 'Digit4': LayoutEntry([0x00000034, 0x000000a5, 0x000000a2, 0x0000203a]), - 'Digit5': LayoutEntry([0x00000035, 0x00000025, 0x0000221e, 0x0000fb01]), - 'Digit6': LayoutEntry([0x00000036, 0x01000000, 0x000000a7, 0x0000fb02]), - 'Digit7': LayoutEntry([0x00000037, 0x00000026, 0x000000b6, 0x00002021]), - 'Digit8': LayoutEntry([0x00000038, 0x0000002a, 0x00002022, 0x000000b0]), - 'Digit9': LayoutEntry([0x00000039, 0x0000ff08, 0x000000aa, 0x000000b7]), - 'Digit0': LayoutEntry([0x00000030, 0x0000ff09, 0x000000ba, 0x0000201a]), - 'Space': LayoutEntry([0x00000020, 0x00000020, 0x00000020, 0x00000020]), - 'Minus': LayoutEntry([0x0000002d, 0x01000000, 0x00002013, 0x00002014]), - 'Equal': LayoutEntry([0x0000003d, 0x0000002b, 0x00002260, 0x000000b1]), - 'BracketLeft': LayoutEntry([0x00003010, 0x0000300c, 0x0000201c, 0x0000201d]), - 'BracketRight': LayoutEntry([0x00003011, 0x0000300d, 0x00002018, 0x00002019]), - 'Backslash': LayoutEntry([0x00003001, 0x0000007c, 0x000000ab, 0x000000bb]), - 'Semicolon': LayoutEntry([0x0000ff1b, 0x0000ff1a, 0x00002026, 0x000000da]), - 'Quote': LayoutEntry([0x00000027, 0x00000022, 0x000000e6, 0x000000c6]), - 'Backquote': LayoutEntry([0x000000b7, 0x0000ff5e, 0x01000000, 0x00000060]), - 'Comma': LayoutEntry([0x0000ff0c, 0x0000300a, 0x00002264, 0x000000af]), - 'Period': LayoutEntry([0x00003002, 0x0000300b, 0x00002265, 0x000002d8]), - 'Slash': LayoutEntry([0x0000002f, 0x0000ff1f, 0x000000f7, 0x000000bf]), - 'NumpadDivide': LayoutEntry([0x0000002f, 0x0000002f, 0x0000002f, 0x0000002f]), - 'NumpadMultiply': LayoutEntry([0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a]), - 'NumpadSubtract': LayoutEntry([0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d]), - 'NumpadAdd': LayoutEntry([0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b]), - 'Numpad1': LayoutEntry([0x00000031, 0x00000031, 0x00000031, 0x00000031]), - 'Numpad2': LayoutEntry([0x00000032, 0x00000032, 0x00000032, 0x00000032]), - 'Numpad3': LayoutEntry([0x00000033, 0x00000033, 0x00000033, 0x00000033]), - 'Numpad4': LayoutEntry([0x00000034, 0x00000034, 0x00000034, 0x00000034]), - 'Numpad5': LayoutEntry([0x00000035, 0x00000035, 0x00000035, 0x00000035]), - 'Numpad6': LayoutEntry([0x00000036, 0x00000036, 0x00000036, 0x00000036]), - 'Numpad7': LayoutEntry([0x00000037, 0x00000037, 0x00000037, 0x00000037]), - 'Numpad8': LayoutEntry([0x00000038, 0x00000038, 0x00000038, 0x00000038]), - 'Numpad9': LayoutEntry([0x00000039, 0x00000039, 0x00000039, 0x00000039]), - 'Numpad0': LayoutEntry([0x00000030, 0x00000030, 0x00000030, 0x00000030]), - 'NumpadDecimal': LayoutEntry([0x0000002e, 0x0000002e, 0x0000002e, 0x0000002e]), - 'IntlBackslash': LayoutEntry([0x000000a7, 0x000000b1, 0x000000a7, 0x000000b1]), - 'NumpadEqual': LayoutEntry([0x0000003d, 0x0000003d, 0x0000003d, 0x0000003d]), - 'AudioVolumeUp': LayoutEntry([0x01000000, 0x0000003d, 0x01000000, 0x0000003d]), - }, - ), -]; diff --git a/third_party/web_keyboard_layouts/lib/definitions.g.dart b/third_party/web_keyboard_layouts/lib/definitions.g.dart new file mode 100644 index 0000000000000..a5751c4d2807e --- /dev/null +++ b/third_party/web_keyboard_layouts/lib/definitions.g.dart @@ -0,0 +1,2444 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. + +// DO NOT EDIT -- DO NOT EDIT -- DO NOT EDIT +// +// This file is auto generated by flutter/packages:script/gen_web_keyboard based on +// https://github.com/microsoft/vscode/tree/4589815e4849499c67125ff68563fa102646b869/src/vs/workbench/services/keybinding/browser/keyboardLayouts +// +// Edit the following files instead: +// +// - Script: lib/main.dart +// - Templates: data/*.tmpl +// +// See flutter/packages:script/gen_web_keyboard/layouts/README.md for more information. + +part of web_keyboard_layouts; + +const Map kLayoutGoals = { + 'KeyA': 'A', + 'KeyB': 'B', + 'KeyC': 'C', + 'KeyD': 'D', + 'KeyE': 'E', + 'KeyF': 'F', + 'KeyG': 'G', + 'KeyH': 'H', + 'KeyI': 'I', + 'KeyJ': 'J', + 'KeyK': 'K', + 'KeyL': 'L', + 'KeyM': 'M', + 'KeyN': 'N', + 'KeyO': 'O', + 'KeyP': 'P', + 'KeyQ': 'Q', + 'KeyR': 'R', + 'KeyS': 'S', + 'KeyT': 'T', + 'KeyU': 'U', + 'KeyV': 'V', + 'KeyW': 'W', + 'KeyX': 'X', + 'KeyY': 'Y', + 'KeyZ': 'Z', + 'Digit1': '1', + 'Digit2': '2', + 'Digit3': '3', + 'Digit4': '4', + 'Digit5': '5', + 'Digit6': '6', + 'Digit7': '7', + 'Digit8': '8', + 'Digit9': '9', + 'Digit0': '0', + 'Minus': null, + 'Equal': null, + 'BracketLeft': null, + 'BracketRight': null, + 'Backslash': null, + 'Semicolon': null, + 'Quote': null, + 'Backquote': null, + 'Comma': null, + 'Period': null, + 'Slash': null, +}; + +const List kLayouts = [ + LayoutInfo( + name: 'cz', + platform: LayoutPlatform.win, + mapping: >[ + [0x00000061, 0x00000041, 0x01000000, 0x01000000], // KeyA + [0x00000062, 0x00000042, 0x0000007b, 0x01000000], // KeyB + [0x00000063, 0x00000043, 0x00000026, 0x01000000], // KeyC + [0x00000064, 0x00000044, 0x00000110, 0x01000000], // KeyD + [0x00000065, 0x00000045, 0x000020ac, 0x01000000], // KeyE + [0x00000066, 0x00000046, 0x0000005b, 0x01000000], // KeyF + [0x00000067, 0x00000047, 0x0000005d, 0x01000000], // KeyG + [0x00000068, 0x00000048, 0x01000000, 0x01000000], // KeyH + [0x00000069, 0x00000049, 0x01000000, 0x01000000], // KeyI + [0x0000006a, 0x0000004a, 0x01000000, 0x01000000], // KeyJ + [0x0000006b, 0x0000004b, 0x00000142, 0x01000000], // KeyK + [0x0000006c, 0x0000004c, 0x00000141, 0x01000000], // KeyL + [0x0000006d, 0x0000004d, 0x01000000, 0x01000000], // KeyM + [0x0000006e, 0x0000004e, 0x0000007d, 0x01000000], // KeyN + [0x0000006f, 0x0000004f, 0x01000000, 0x01000000], // KeyO + [0x00000070, 0x00000050, 0x01000000, 0x01000000], // KeyP + [0x00000071, 0x00000051, 0x0000005c, 0x01000000], // KeyQ + [0x00000072, 0x00000052, 0x01000000, 0x01000000], // KeyR + [0x00000073, 0x00000053, 0x00000111, 0x01000000], // KeyS + [0x00000074, 0x00000054, 0x01000000, 0x01000000], // KeyT + [0x00000075, 0x00000055, 0x01000000, 0x01000000], // KeyU + [0x00000076, 0x00000056, 0x00000040, 0x01000000], // KeyV + [0x00000077, 0x00000057, 0x0000007c, 0x01000000], // KeyW + [0x00000078, 0x00000058, 0x00000023, 0x01000000], // KeyX + [0x0000007a, 0x0000005a, 0x01000000, 0x01000000], // KeyY + [0x00000079, 0x00000059, 0x01000000, 0x01000000], // KeyZ + [0x0000002b, 0x00000031, 0x0000007e, 0x01000000], // Digit1 + [0x0000011b, 0x00000032, 0x000002c7, 0x01000000], // Digit2 + [0x00000161, 0x00000033, 0x0000005e, 0x01000000], // Digit3 + [0x0000010d, 0x00000034, 0x000002d8, 0x01000000], // Digit4 + [0x00000159, 0x00000035, 0x000000b0, 0x01000000], // Digit5 + [0x0000017e, 0x00000036, 0x000002db, 0x01000000], // Digit6 + [0x000000fd, 0x00000037, 0x00000060, 0x01000000], // Digit7 + [0x000000e1, 0x00000038, 0x000002d9, 0x01000000], // Digit8 + [0x000000ed, 0x00000039, 0x000000b4, 0x01000000], // Digit9 + [0x000000e9, 0x00000030, 0x000002dd, 0x01000000], // Digit0 + [0x0000003d, 0x00000025, 0x000000a8, 0x01000000], // Minus + [0x000000b4, 0x000002c7, 0x000000b8, 0x01000000], // Equal + [0x000000fa, 0x0000002f, 0x000000f7, 0x01000000], // BracketLeft + [0x00000029, 0x00000028, 0x000000d7, 0x01000000], // BracketRight + [0x000000a8, 0x00000027, 0x000000a4, 0x01000000], // Backslash + [0x0000016f, 0x00000022, 0x00000024, 0x01000000], // Semicolon + [0x000000a7, 0x00000021, 0x000000df, 0x01000000], // Quote + [0x0000003b, 0x000000b0, 0x01000000, 0x01000000], // Backquote + [0x0000002c, 0x0000003f, 0x0000003c, 0x01000000], // Comma + [0x0000002e, 0x0000003a, 0x0000003e, 0x01000000], // Period + [0x0000002d, 0x0000005f, 0x0000002a, 0x01000000], // Slash + ], + ), + + LayoutInfo( + name: 'de-swiss', + platform: LayoutPlatform.win, + mapping: >[ + [0x00000061, 0x00000041, 0x01000000, 0x01000000], // KeyA + [0x00000062, 0x00000042, 0x01000000, 0x01000000], // KeyB + [0x00000063, 0x00000043, 0x01000000, 0x01000000], // KeyC + [0x00000064, 0x00000044, 0x01000000, 0x01000000], // KeyD + [0x00000065, 0x00000045, 0x000020ac, 0x01000000], // KeyE + [0x00000066, 0x00000046, 0x01000000, 0x01000000], // KeyF + [0x00000067, 0x00000047, 0x01000000, 0x01000000], // KeyG + [0x00000068, 0x00000048, 0x01000000, 0x01000000], // KeyH + [0x00000069, 0x00000049, 0x01000000, 0x01000000], // KeyI + [0x0000006a, 0x0000004a, 0x01000000, 0x01000000], // KeyJ + [0x0000006b, 0x0000004b, 0x01000000, 0x01000000], // KeyK + [0x0000006c, 0x0000004c, 0x01000000, 0x01000000], // KeyL + [0x0000006d, 0x0000004d, 0x01000000, 0x01000000], // KeyM + [0x0000006e, 0x0000004e, 0x01000000, 0x01000000], // KeyN + [0x0000006f, 0x0000004f, 0x01000000, 0x01000000], // KeyO + [0x00000070, 0x00000050, 0x01000000, 0x01000000], // KeyP + [0x00000071, 0x00000051, 0x01000000, 0x01000000], // KeyQ + [0x00000072, 0x00000052, 0x01000000, 0x01000000], // KeyR + [0x00000073, 0x00000053, 0x01000000, 0x01000000], // KeyS + [0x00000074, 0x00000054, 0x01000000, 0x01000000], // KeyT + [0x00000075, 0x00000055, 0x01000000, 0x01000000], // KeyU + [0x00000076, 0x00000056, 0x01000000, 0x01000000], // KeyV + [0x00000077, 0x00000057, 0x01000000, 0x01000000], // KeyW + [0x00000078, 0x00000058, 0x01000000, 0x01000000], // KeyX + [0x0000007a, 0x0000005a, 0x01000000, 0x01000000], // KeyY + [0x00000079, 0x00000059, 0x01000000, 0x01000000], // KeyZ + [0x00000031, 0x0000002b, 0x000000a6, 0x01000000], // Digit1 + [0x00000032, 0x00000022, 0x00000040, 0x01000000], // Digit2 + [0x00000033, 0x0000002a, 0x00000023, 0x01000000], // Digit3 + [0x00000034, 0x000000e7, 0x000000b0, 0x01000000], // Digit4 + [0x00000035, 0x00000025, 0x000000a7, 0x01000000], // Digit5 + [0x00000036, 0x00000026, 0x000000ac, 0x01000000], // Digit6 + [0x00000037, 0x0000002f, 0x0000007c, 0x01000000], // Digit7 + [0x00000038, 0x00000028, 0x000000a2, 0x01000000], // Digit8 + [0x00000039, 0x00000029, 0x01000000, 0x01000000], // Digit9 + [0x00000030, 0x0000003d, 0x01000000, 0x01000000], // Digit0 + [0x00000027, 0x0000003f, 0x000000b4, 0x01000000], // Minus + [0x0000005e, 0x00000060, 0x0000007e, 0x01000000], // Equal + [0x000000fc, 0x000000e8, 0x0000005b, 0x01000000], // BracketLeft + [0x000000a8, 0x00000021, 0x0000005d, 0x01000000], // BracketRight + [0x00000024, 0x000000a3, 0x0000007d, 0x01000000], // Backslash + [0x000000f6, 0x000000e9, 0x01000000, 0x01000000], // Semicolon + [0x000000e4, 0x000000e0, 0x0000007b, 0x01000000], // Quote + [0x000000a7, 0x000000b0, 0x01000000, 0x01000000], // Backquote + [0x0000002c, 0x0000003b, 0x01000000, 0x01000000], // Comma + [0x0000002e, 0x0000003a, 0x01000000, 0x01000000], // Period + [0x0000002d, 0x0000005f, 0x01000000, 0x01000000], // Slash + ], + ), + + LayoutInfo( + name: 'de', + platform: LayoutPlatform.darwin, + mapping: >[ + [0x00000061, 0x00000041, 0x000000e5, 0x000000c5], // KeyA + [0x00000062, 0x00000042, 0x0000222b, 0x00002039], // KeyB + [0x00000063, 0x00000043, 0x000000e7, 0x000000c7], // KeyC + [0x00000064, 0x00000044, 0x00002202, 0x00002122], // KeyD + [0x00000065, 0x00000045, 0x000020ac, 0x00002030], // KeyE + [0x00000066, 0x00000046, 0x00000192, 0x000000cf], // KeyF + [0x00000067, 0x00000047, 0x000000a9, 0x000000cc], // KeyG + [0x00000068, 0x00000048, 0x000000aa, 0x000000d3], // KeyH + [0x00000069, 0x00000049, 0x00002044, 0x000000db], // KeyI + [0x0000006a, 0x0000004a, 0x000000ba, 0x00000131], // KeyJ + [0x0000006b, 0x0000004b, 0x00002206, 0x000002c6], // KeyK + [0x0000006c, 0x0000004c, 0x00000040, 0x0000fb02], // KeyL + [0x0000006d, 0x0000004d, 0x000000b5, 0x000002d8], // KeyM + [0x0000006e, 0x0000004e, 0x01000000, 0x0000203a], // KeyN + [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO + [0x00000070, 0x00000050, 0x000003c0, 0x0000220f], // KeyP + [0x00000071, 0x00000051, 0x000000ab, 0x000000bb], // KeyQ + [0x00000072, 0x00000052, 0x000000ae, 0x000000b8], // KeyR + [0x00000073, 0x00000053, 0x0000201a, 0x000000cd], // KeyS + [0x00000074, 0x00000054, 0x00002020, 0x000002dd], // KeyT + [0x00000075, 0x00000055, 0x01000000, 0x000000c1], // KeyU + [0x00000076, 0x00000056, 0x0000221a, 0x000025ca], // KeyV + [0x00000077, 0x00000057, 0x00002211, 0x0000201e], // KeyW + [0x00000078, 0x00000058, 0x00002248, 0x000000d9], // KeyX + [0x0000007a, 0x0000005a, 0x000003a9, 0x000002c7], // KeyY + [0x00000079, 0x00000059, 0x000000a5, 0x00002021], // KeyZ + [0x00000031, 0x00000021, 0x000000a1, 0x000000ac], // Digit1 + [0x00000032, 0x00000022, 0x0000201c, 0x0000201d], // Digit2 + [0x00000033, 0x000000a7, 0x000000b6, 0x00000023], // Digit3 + [0x00000034, 0x00000024, 0x000000a2, 0x000000a3], // Digit4 + [0x00000035, 0x00000025, 0x0000005b, 0x0000fb01], // Digit5 + [0x00000036, 0x00000026, 0x0000005d, 0x01000000], // Digit6 + [0x00000037, 0x0000002f, 0x0000007c, 0x0000005c], // Digit7 + [0x00000038, 0x00000028, 0x0000007b, 0x000002dc], // Digit8 + [0x00000039, 0x00000029, 0x0000007d, 0x000000b7], // Digit9 + [0x00000030, 0x0000003d, 0x00002260, 0x000000af], // Digit0 + [0x000000df, 0x0000003f, 0x000000bf, 0x000002d9], // Minus + [0x01000000, 0x01000000, 0x00000027, 0x000002da], // Equal + [0x000000fc, 0x000000dc, 0x00002022, 0x000000b0], // BracketLeft + [0x0000002b, 0x0000002a, 0x000000b1, 0x0000f8ff], // BracketRight + [0x00000023, 0x00000027, 0x00002018, 0x00002019], // Backslash + [0x000000f6, 0x000000d6, 0x00000153, 0x00000152], // Semicolon + [0x000000e4, 0x000000c4, 0x000000e6, 0x000000c6], // Quote + [0x0000003c, 0x0000003e, 0x00002264, 0x00002265], // Backquote + [0x0000002c, 0x0000003b, 0x0000221e, 0x000002db], // Comma + [0x0000002e, 0x0000003a, 0x00002026, 0x000000f7], // Period + [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Slash + ], + ), + + LayoutInfo( + name: 'de', + platform: LayoutPlatform.linux, + mapping: >[ + [0x00000061, 0x00000041, 0x000000e6, 0x000000c6], // KeyA + [0x00000062, 0x00000042, 0x0000201c, 0x00002018], // KeyB + [0x00000063, 0x00000043, 0x000000a2, 0x000000a9], // KeyC + [0x00000064, 0x00000044, 0x000000f0, 0x000000d0], // KeyD + [0x00000065, 0x00000045, 0x000020ac, 0x000020ac], // KeyE + [0x00000066, 0x00000046, 0x00000111, 0x000000aa], // KeyF + [0x00000067, 0x00000047, 0x0000014b, 0x0000014a], // KeyG + [0x00000068, 0x00000048, 0x00000127, 0x00000126], // KeyH + [0x00000069, 0x00000049, 0x00002192, 0x00000131], // KeyI + [0x0000006a, 0x0000004a, 0x00000323, 0x00000307], // KeyJ + [0x0000006b, 0x0000004b, 0x00000138, 0x00000026], // KeyK + [0x0000006c, 0x0000004c, 0x00000142, 0x00000141], // KeyL + [0x0000006d, 0x0000004d, 0x000000b5, 0x000000ba], // KeyM + [0x0000006e, 0x0000004e, 0x0000201d, 0x00002019], // KeyN + [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO + [0x00000070, 0x00000050, 0x000000fe, 0x000000de], // KeyP + [0x00000071, 0x00000051, 0x00000040, 0x000003a9], // KeyQ + [0x00000072, 0x00000052, 0x000000b6, 0x000000ae], // KeyR + [0x00000073, 0x00000053, 0x0000017f, 0x00001e9e], // KeyS + [0x00000074, 0x00000054, 0x00000167, 0x00000166], // KeyT + [0x00000075, 0x00000055, 0x00002193, 0x00002191], // KeyU + [0x00000076, 0x00000056, 0x0000201e, 0x0000201a], // KeyV + [0x00000077, 0x00000057, 0x00000142, 0x00000141], // KeyW + [0x00000078, 0x00000058, 0x000000ab, 0x00002039], // KeyX + [0x0000007a, 0x0000005a, 0x00002190, 0x000000a5], // KeyY + [0x00000079, 0x00000059, 0x000000bb, 0x0000203a], // KeyZ + [0x00000031, 0x00000021, 0x000000b9, 0x000000a1], // Digit1 + [0x00000032, 0x00000022, 0x000000b2, 0x0000215b], // Digit2 + [0x00000033, 0x000000a7, 0x000000b3, 0x000000a3], // Digit3 + [0x00000034, 0x00000024, 0x000000bc, 0x000000a4], // Digit4 + [0x00000035, 0x00000025, 0x000000bd, 0x0000215c], // Digit5 + [0x00000036, 0x00000026, 0x000000ac, 0x0000215d], // Digit6 + [0x00000037, 0x0000002f, 0x0000007b, 0x0000215e], // Digit7 + [0x00000038, 0x00000028, 0x0000005b, 0x00002122], // Digit8 + [0x00000039, 0x00000029, 0x0000005d, 0x000000b1], // Digit9 + [0x00000030, 0x0000003d, 0x0000007d, 0x000000b0], // Digit0 + [0x000000df, 0x0000003f, 0x0000005c, 0x000000bf], // Minus + [0x00000301, 0x00000300, 0x00000327, 0x00000328], // Equal + [0x000000fc, 0x000000dc, 0x00000308, 0x0000030a], // BracketLeft + [0x0000002b, 0x0000002a, 0x0000007e, 0x000000af], // BracketRight + [0x00000023, 0x00000027, 0x00002019, 0x00000306], // Backslash + [0x000000f6, 0x000000d6, 0x0000030b, 0x00000323], // Semicolon + [0x000000e4, 0x000000c4, 0x00000302, 0x0000030c], // Quote + [0x00000302, 0x000000b0, 0x00002032, 0x00002033], // Backquote + [0x0000002c, 0x0000003b, 0x000000b7, 0x000000d7], // Comma + [0x0000002e, 0x0000003a, 0x00002026, 0x000000f7], // Period + [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Slash + ], + ), + + LayoutInfo( + name: 'de', + platform: LayoutPlatform.win, + mapping: >[ + [0x00000061, 0x00000041, 0x01000000, 0x01000000], // KeyA + [0x00000062, 0x00000042, 0x01000000, 0x01000000], // KeyB + [0x00000063, 0x00000043, 0x01000000, 0x01000000], // KeyC + [0x00000064, 0x00000044, 0x01000000, 0x01000000], // KeyD + [0x00000065, 0x00000045, 0x000020ac, 0x01000000], // KeyE + [0x00000066, 0x00000046, 0x01000000, 0x01000000], // KeyF + [0x00000067, 0x00000047, 0x01000000, 0x01000000], // KeyG + [0x00000068, 0x00000048, 0x01000000, 0x01000000], // KeyH + [0x00000069, 0x00000049, 0x01000000, 0x01000000], // KeyI + [0x0000006a, 0x0000004a, 0x01000000, 0x01000000], // KeyJ + [0x0000006b, 0x0000004b, 0x01000000, 0x01000000], // KeyK + [0x0000006c, 0x0000004c, 0x01000000, 0x01000000], // KeyL + [0x0000006d, 0x0000004d, 0x000000b5, 0x01000000], // KeyM + [0x0000006e, 0x0000004e, 0x01000000, 0x01000000], // KeyN + [0x0000006f, 0x0000004f, 0x01000000, 0x01000000], // KeyO + [0x00000070, 0x00000050, 0x01000000, 0x01000000], // KeyP + [0x00000071, 0x00000051, 0x00000040, 0x01000000], // KeyQ + [0x00000072, 0x00000052, 0x01000000, 0x01000000], // KeyR + [0x00000073, 0x00000053, 0x01000000, 0x01000000], // KeyS + [0x00000074, 0x00000054, 0x01000000, 0x01000000], // KeyT + [0x00000075, 0x00000055, 0x01000000, 0x01000000], // KeyU + [0x00000076, 0x00000056, 0x01000000, 0x01000000], // KeyV + [0x00000077, 0x00000057, 0x01000000, 0x01000000], // KeyW + [0x00000078, 0x00000058, 0x01000000, 0x01000000], // KeyX + [0x0000007a, 0x0000005a, 0x01000000, 0x01000000], // KeyY + [0x00000079, 0x00000059, 0x01000000, 0x01000000], // KeyZ + [0x00000031, 0x00000021, 0x01000000, 0x01000000], // Digit1 + [0x00000032, 0x00000022, 0x000000b2, 0x01000000], // Digit2 + [0x00000033, 0x000000a7, 0x000000b3, 0x01000000], // Digit3 + [0x00000034, 0x00000024, 0x01000000, 0x01000000], // Digit4 + [0x00000035, 0x00000025, 0x01000000, 0x01000000], // Digit5 + [0x00000036, 0x00000026, 0x01000000, 0x01000000], // Digit6 + [0x00000037, 0x0000002f, 0x0000007b, 0x01000000], // Digit7 + [0x00000038, 0x00000028, 0x0000005b, 0x01000000], // Digit8 + [0x00000039, 0x00000029, 0x0000005d, 0x01000000], // Digit9 + [0x00000030, 0x0000003d, 0x0000007d, 0x01000000], // Digit0 + [0x000000df, 0x0000003f, 0x0000005c, 0x00001e9e], // Minus + [0x000000b4, 0x00000060, 0x01000000, 0x01000000], // Equal + [0x000000fc, 0x000000dc, 0x01000000, 0x01000000], // BracketLeft + [0x0000002b, 0x0000002a, 0x0000007e, 0x01000000], // BracketRight + [0x00000023, 0x00000027, 0x01000000, 0x01000000], // Backslash + [0x000000f6, 0x000000d6, 0x01000000, 0x01000000], // Semicolon + [0x000000e4, 0x000000c4, 0x01000000, 0x01000000], // Quote + [0x0000005e, 0x000000b0, 0x01000000, 0x01000000], // Backquote + [0x0000002c, 0x0000003b, 0x01000000, 0x01000000], // Comma + [0x0000002e, 0x0000003a, 0x01000000, 0x01000000], // Period + [0x0000002d, 0x0000005f, 0x01000000, 0x01000000], // Slash + ], + ), + + LayoutInfo( + name: 'dk', + platform: LayoutPlatform.win, + mapping: >[ + [0x00000061, 0x00000041, 0x01000000, 0x01000000], // KeyA + [0x00000062, 0x00000042, 0x01000000, 0x01000000], // KeyB + [0x00000063, 0x00000043, 0x01000000, 0x01000000], // KeyC + [0x00000064, 0x00000044, 0x01000000, 0x01000000], // KeyD + [0x00000065, 0x00000045, 0x000020ac, 0x01000000], // KeyE + [0x00000066, 0x00000046, 0x01000000, 0x01000000], // KeyF + [0x00000067, 0x00000047, 0x01000000, 0x01000000], // KeyG + [0x00000068, 0x00000048, 0x01000000, 0x01000000], // KeyH + [0x00000069, 0x00000049, 0x01000000, 0x01000000], // KeyI + [0x0000006a, 0x0000004a, 0x01000000, 0x01000000], // KeyJ + [0x0000006b, 0x0000004b, 0x01000000, 0x01000000], // KeyK + [0x0000006c, 0x0000004c, 0x01000000, 0x01000000], // KeyL + [0x0000006d, 0x0000004d, 0x000000b5, 0x01000000], // KeyM + [0x0000006e, 0x0000004e, 0x01000000, 0x01000000], // KeyN + [0x0000006f, 0x0000004f, 0x01000000, 0x01000000], // KeyO + [0x00000070, 0x00000050, 0x01000000, 0x01000000], // KeyP + [0x00000071, 0x00000051, 0x01000000, 0x01000000], // KeyQ + [0x00000072, 0x00000052, 0x01000000, 0x01000000], // KeyR + [0x00000073, 0x00000053, 0x01000000, 0x01000000], // KeyS + [0x00000074, 0x00000054, 0x01000000, 0x01000000], // KeyT + [0x00000075, 0x00000055, 0x01000000, 0x01000000], // KeyU + [0x00000076, 0x00000056, 0x01000000, 0x01000000], // KeyV + [0x00000077, 0x00000057, 0x01000000, 0x01000000], // KeyW + [0x00000078, 0x00000058, 0x01000000, 0x01000000], // KeyX + [0x00000079, 0x00000059, 0x01000000, 0x01000000], // KeyY + [0x0000007a, 0x0000005a, 0x01000000, 0x01000000], // KeyZ + [0x00000031, 0x00000021, 0x01000000, 0x01000000], // Digit1 + [0x00000032, 0x00000022, 0x00000040, 0x01000000], // Digit2 + [0x00000033, 0x00000023, 0x000000a3, 0x01000000], // Digit3 + [0x00000034, 0x000000a4, 0x00000024, 0x01000000], // Digit4 + [0x00000035, 0x00000025, 0x000020ac, 0x01000000], // Digit5 + [0x00000036, 0x00000026, 0x01000000, 0x01000000], // Digit6 + [0x00000037, 0x0000002f, 0x0000007b, 0x01000000], // Digit7 + [0x00000038, 0x00000028, 0x0000005b, 0x01000000], // Digit8 + [0x00000039, 0x00000029, 0x0000005d, 0x01000000], // Digit9 + [0x00000030, 0x0000003d, 0x0000007d, 0x01000000], // Digit0 + [0x0000002b, 0x0000003f, 0x01000000, 0x01000000], // Minus + [0x000000b4, 0x00000060, 0x0000007c, 0x01000000], // Equal + [0x000000e5, 0x000000c5, 0x01000000, 0x01000000], // BracketLeft + [0x000000a8, 0x0000005e, 0x0000007e, 0x01000000], // BracketRight + [0x00000027, 0x0000002a, 0x01000000, 0x01000000], // Backslash + [0x000000e6, 0x000000c6, 0x01000000, 0x01000000], // Semicolon + [0x000000f8, 0x000000d8, 0x01000000, 0x01000000], // Quote + [0x000000bd, 0x000000a7, 0x01000000, 0x01000000], // Backquote + [0x0000002c, 0x0000003b, 0x01000000, 0x01000000], // Comma + [0x0000002e, 0x0000003a, 0x01000000, 0x01000000], // Period + [0x0000002d, 0x0000005f, 0x01000000, 0x01000000], // Slash + ], + ), + + LayoutInfo( + name: 'dvorak', + platform: LayoutPlatform.darwin, + mapping: >[ + [0x00000061, 0x00000041, 0x000000e5, 0x000000c5], // KeyA + [0x00000078, 0x00000058, 0x00002248, 0x000002db], // KeyB + [0x0000006a, 0x0000004a, 0x00002206, 0x000000d4], // KeyC + [0x00000065, 0x00000045, 0x01000000, 0x000000b4], // KeyD + [0x0000002e, 0x0000003e, 0x00002265, 0x000002d8], // KeyE + [0x00000075, 0x00000055, 0x01000000, 0x000000a8], // KeyF + [0x00000069, 0x00000049, 0x01000000, 0x000002c6], // KeyG + [0x00000064, 0x00000044, 0x00002202, 0x000000ce], // KeyH + [0x00000063, 0x00000043, 0x000000e7, 0x000000c7], // KeyI + [0x00000068, 0x00000048, 0x000002d9, 0x000000d3], // KeyJ + [0x00000074, 0x00000054, 0x00002020, 0x000002c7], // KeyK + [0x0000006e, 0x0000004e, 0x01000000, 0x000002dc], // KeyL + [0x0000006d, 0x0000004d, 0x000000b5, 0x000000c2], // KeyM + [0x00000062, 0x00000042, 0x0000222b, 0x00000131], // KeyN + [0x00000072, 0x00000052, 0x000000ae, 0x00002030], // KeyO + [0x0000006c, 0x0000004c, 0x000000ac, 0x000000d2], // KeyP + [0x00000027, 0x00000022, 0x000000e6, 0x000000c6], // KeyQ + [0x00000070, 0x00000050, 0x000003c0, 0x0000220f], // KeyR + [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyS + [0x00000079, 0x00000059, 0x000000a5, 0x000000c1], // KeyT + [0x00000067, 0x00000047, 0x000000a9, 0x000002dd], // KeyU + [0x0000006b, 0x0000004b, 0x000002da, 0x0000f8ff], // KeyV + [0x0000002c, 0x0000003c, 0x00002264, 0x000000af], // KeyW + [0x00000071, 0x00000051, 0x00000153, 0x00000152], // KeyX + [0x00000066, 0x00000046, 0x00000192, 0x000000cf], // KeyY + [0x0000003b, 0x0000003a, 0x00002026, 0x000000da], // KeyZ + [0x00000031, 0x00000021, 0x000000a1, 0x00002044], // Digit1 + [0x00000032, 0x00000040, 0x00002122, 0x000020ac], // Digit2 + [0x00000033, 0x00000023, 0x000000a3, 0x00002039], // Digit3 + [0x00000034, 0x00000024, 0x000000a2, 0x0000203a], // Digit4 + [0x00000035, 0x00000025, 0x0000221e, 0x0000fb01], // Digit5 + [0x00000036, 0x0000005e, 0x000000a7, 0x0000fb02], // Digit6 + [0x00000037, 0x00000026, 0x000000b6, 0x00002021], // Digit7 + [0x00000038, 0x0000002a, 0x00002022, 0x000000b0], // Digit8 + [0x00000039, 0x00000028, 0x000000aa, 0x000000b7], // Digit9 + [0x00000030, 0x00000029, 0x000000ba, 0x0000201a], // Digit0 + [0x0000005b, 0x0000007b, 0x0000201c, 0x0000201d], // Minus + [0x0000005d, 0x0000007d, 0x00002018, 0x00002019], // Equal + [0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf], // BracketLeft + [0x0000003d, 0x0000002b, 0x00002260, 0x000000b1], // BracketRight + [0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb], // Backslash + [0x00000073, 0x00000053, 0x000000df, 0x000000cd], // Semicolon + [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Quote + [0x00000060, 0x0000007e, 0x01000000, 0x00000060], // Backquote + [0x00000077, 0x00000057, 0x00002211, 0x0000201e], // Comma + [0x00000076, 0x00000056, 0x0000221a, 0x000025ca], // Period + [0x0000007a, 0x0000005a, 0x000003a9, 0x000000b8], // Slash + ], + ), + + LayoutInfo( + name: 'en-belgian', + platform: LayoutPlatform.win, + mapping: >[ + [0x00000071, 0x00000051, 0x01000000, 0x01000000], // KeyA + [0x00000062, 0x00000042, 0x01000000, 0x01000000], // KeyB + [0x00000063, 0x00000043, 0x01000000, 0x01000000], // KeyC + [0x00000064, 0x00000044, 0x01000000, 0x01000000], // KeyD + [0x00000065, 0x00000045, 0x000020ac, 0x01000000], // KeyE + [0x00000066, 0x00000046, 0x01000000, 0x01000000], // KeyF + [0x00000067, 0x00000047, 0x01000000, 0x01000000], // KeyG + [0x00000068, 0x00000048, 0x01000000, 0x01000000], // KeyH + [0x00000069, 0x00000049, 0x01000000, 0x01000000], // KeyI + [0x0000006a, 0x0000004a, 0x01000000, 0x01000000], // KeyJ + [0x0000006b, 0x0000004b, 0x01000000, 0x01000000], // KeyK + [0x0000006c, 0x0000004c, 0x01000000, 0x01000000], // KeyL + [0x0000002c, 0x0000003f, 0x01000000, 0x01000000], // KeyM + [0x0000006e, 0x0000004e, 0x01000000, 0x01000000], // KeyN + [0x0000006f, 0x0000004f, 0x01000000, 0x01000000], // KeyO + [0x00000070, 0x00000050, 0x01000000, 0x01000000], // KeyP + [0x00000061, 0x00000041, 0x01000000, 0x01000000], // KeyQ + [0x00000072, 0x00000052, 0x01000000, 0x01000000], // KeyR + [0x00000073, 0x00000053, 0x01000000, 0x01000000], // KeyS + [0x00000074, 0x00000054, 0x01000000, 0x01000000], // KeyT + [0x00000075, 0x00000055, 0x01000000, 0x01000000], // KeyU + [0x00000076, 0x00000056, 0x01000000, 0x01000000], // KeyV + [0x0000007a, 0x0000005a, 0x01000000, 0x01000000], // KeyW + [0x00000078, 0x00000058, 0x01000000, 0x01000000], // KeyX + [0x00000079, 0x00000059, 0x01000000, 0x01000000], // KeyY + [0x00000077, 0x00000057, 0x01000000, 0x01000000], // KeyZ + [0x00000026, 0x00000031, 0x0000007c, 0x01000000], // Digit1 + [0x000000e9, 0x00000032, 0x00000040, 0x01000000], // Digit2 + [0x00000022, 0x00000033, 0x00000023, 0x01000000], // Digit3 + [0x00000027, 0x00000034, 0x0000007b, 0x01000000], // Digit4 + [0x00000028, 0x00000035, 0x0000005b, 0x01000000], // Digit5 + [0x000000a7, 0x00000036, 0x0000005e, 0x01000000], // Digit6 + [0x000000e8, 0x00000037, 0x01000000, 0x01000000], // Digit7 + [0x00000021, 0x00000038, 0x01000000, 0x01000000], // Digit8 + [0x000000e7, 0x00000039, 0x0000007b, 0x01000000], // Digit9 + [0x000000e0, 0x00000030, 0x0000007d, 0x01000000], // Digit0 + [0x00000029, 0x000000b0, 0x01000000, 0x01000000], // Minus + [0x0000002d, 0x0000005f, 0x01000000, 0x01000000], // Equal + [0x0000005e, 0x000000a8, 0x0000005b, 0x01000000], // BracketLeft + [0x00000024, 0x0000002a, 0x0000005d, 0x01000000], // BracketRight + [0x000000b5, 0x000000a3, 0x00000060, 0x00000060], // Backslash + [0x0000006d, 0x0000004d, 0x01000000, 0x01000000], // Semicolon + [0x000000f9, 0x00000025, 0x000000b4, 0x000000b4], // Quote + [0x000000b2, 0x000000b3, 0x01000000, 0x01000000], // Backquote + [0x0000003b, 0x0000002e, 0x01000000, 0x01000000], // Comma + [0x0000003a, 0x0000002f, 0x01000000, 0x01000000], // Period + [0x0000003d, 0x0000002b, 0x0000007e, 0x0000007e], // Slash + ], + ), + + LayoutInfo( + name: 'en-ext', + platform: LayoutPlatform.darwin, + mapping: >[ + [0x00000061, 0x00000041, 0x01000000, 0x00000304], // KeyA + [0x00000062, 0x00000042, 0x01000000, 0x00000306], // KeyB + [0x00000063, 0x00000043, 0x01000000, 0x00000327], // KeyC + [0x00000064, 0x00000044, 0x000000f0, 0x000000d0], // KeyD + [0x00000065, 0x00000045, 0x01000000, 0x00000301], // KeyE + [0x00000066, 0x00000046, 0x00000192, 0x01000000], // KeyF + [0x00000067, 0x00000047, 0x000000a9, 0x01000000], // KeyG + [0x00000068, 0x00000048, 0x01000000, 0x00000331], // KeyH + [0x00000069, 0x00000049, 0x01000000, 0x0000031b], // KeyI + [0x0000006a, 0x0000004a, 0x01000000, 0x0000030b], // KeyJ + [0x0000006b, 0x0000004b, 0x01000000, 0x0000030a], // KeyK + [0x0000006c, 0x0000004c, 0x01000000, 0x00000335], // KeyL + [0x0000006d, 0x0000004d, 0x01000000, 0x00000328], // KeyM + [0x0000006e, 0x0000004e, 0x01000000, 0x00000303], // KeyN + [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO + [0x00000070, 0x00000050, 0x01000000, 0x00000326], // KeyP + [0x00000071, 0x00000051, 0x00000153, 0x00000152], // KeyQ + [0x00000072, 0x00000052, 0x000000ae, 0x00002030], // KeyR + [0x00000073, 0x00000053, 0x000000df, 0x01000000], // KeyS + [0x00000074, 0x00000054, 0x000000fe, 0x000000de], // KeyT + [0x00000075, 0x00000055, 0x01000000, 0x00000308], // KeyU + [0x00000076, 0x00000056, 0x01000000, 0x0000030c], // KeyV + [0x00000077, 0x00000057, 0x01000000, 0x00000307], // KeyW + [0x00000078, 0x00000058, 0x01000000, 0x00000323], // KeyX + [0x00000079, 0x00000059, 0x000000a5, 0x01000000], // KeyY + [0x0000007a, 0x0000005a, 0x01000000, 0x00000309], // KeyZ + [0x00000031, 0x00000021, 0x000000a1, 0x00002044], // Digit1 + [0x00000032, 0x00000040, 0x00002122, 0x000020ac], // Digit2 + [0x00000033, 0x00000023, 0x000000a3, 0x00002039], // Digit3 + [0x00000034, 0x00000024, 0x000000a2, 0x0000203a], // Digit4 + [0x00000035, 0x00000025, 0x000000a7, 0x00002020], // Digit5 + [0x00000036, 0x0000005e, 0x01000000, 0x00000302], // Digit6 + [0x00000037, 0x00000026, 0x000000b6, 0x00002021], // Digit7 + [0x00000038, 0x0000002a, 0x00002022, 0x000000b0], // Digit8 + [0x00000039, 0x00000028, 0x000000aa, 0x000000b7], // Digit9 + [0x00000030, 0x00000029, 0x000000ba, 0x0000201a], // Digit0 + [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Minus + [0x0000003d, 0x0000002b, 0x00002260, 0x000000b1], // Equal + [0x0000005b, 0x0000007b, 0x0000201c, 0x0000201d], // BracketLeft + [0x0000005d, 0x0000007d, 0x00002018, 0x00002019], // BracketRight + [0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb], // Backslash + [0x0000003b, 0x0000003a, 0x00002026, 0x01000000], // Semicolon + [0x00000027, 0x00000022, 0x000000e6, 0x000000c6], // Quote + [0x00000060, 0x0000007e, 0x01000000, 0x00000300], // Backquote + [0x0000002c, 0x0000003c, 0x00002264, 0x0000201e], // Comma + [0x0000002e, 0x0000003e, 0x00002265, 0x01000000], // Period + [0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf], // Slash + ], + ), + + LayoutInfo( + name: 'en-in', + platform: LayoutPlatform.win, + mapping: >[ + [0x00000061, 0x00000041, 0x00000101, 0x00000100], // KeyA + [0x00000062, 0x00000042, 0x01000000, 0x01000000], // KeyB + [0x00000063, 0x00000043, 0x01000000, 0x01000000], // KeyC + [0x00000064, 0x00000044, 0x00001e0d, 0x00001e0c], // KeyD + [0x00000065, 0x00000045, 0x00000113, 0x00000112], // KeyE + [0x00000066, 0x00000046, 0x01000000, 0x01000000], // KeyF + [0x00000067, 0x00000047, 0x00001e45, 0x00001e44], // KeyG + [0x00000068, 0x00000048, 0x00001e25, 0x00001e24], // KeyH + [0x00000069, 0x00000049, 0x0000012b, 0x0000012a], // KeyI + [0x0000006a, 0x0000004a, 0x01000000, 0x01000000], // KeyJ + [0x0000006b, 0x0000004b, 0x01000000, 0x01000000], // KeyK + [0x0000006c, 0x0000004c, 0x0000006c, 0x0000004c], // KeyL + [0x0000006d, 0x0000004d, 0x00001e41, 0x00001e40], // KeyM + [0x0000006e, 0x0000004e, 0x00001e47, 0x00001e46], // KeyN + [0x0000006f, 0x0000004f, 0x0000014d, 0x0000014c], // KeyO + [0x00000070, 0x00000050, 0x01000000, 0x01000000], // KeyP + [0x00000071, 0x00000051, 0x000000e6, 0x000000c6], // KeyQ + [0x00000072, 0x00000052, 0x00000072, 0x00000052], // KeyR + [0x00000073, 0x00000053, 0x0000015b, 0x0000015a], // KeyS + [0x00000074, 0x00000054, 0x00001e6d, 0x00001e6c], // KeyT + [0x00000075, 0x00000055, 0x0000016b, 0x0000016a], // KeyU + [0x00000076, 0x00000056, 0x01000000, 0x01000000], // KeyV + [0x00000077, 0x00000057, 0x01000000, 0x01000000], // KeyW + [0x00000078, 0x00000058, 0x00001e63, 0x00001e62], // KeyX + [0x00000079, 0x00000059, 0x000000f1, 0x000000d1], // KeyY + [0x0000007a, 0x0000005a, 0x01000000, 0x01000000], // KeyZ + [0x00000031, 0x00000021, 0x01000000, 0x01000000], // Digit1 + [0x00000032, 0x00000040, 0x01000000, 0x01000000], // Digit2 + [0x00000033, 0x00000023, 0x01000000, 0x01000000], // Digit3 + [0x00000034, 0x00000024, 0x000020b9, 0x01000000], // Digit4 + [0x00000035, 0x00000025, 0x01000000, 0x01000000], // Digit5 + [0x00000036, 0x0000005e, 0x01000000, 0x000002c6], // Digit6 + [0x00000037, 0x00000026, 0x01000000, 0x01000000], // Digit7 + [0x00000038, 0x0000002a, 0x01000000, 0x01000000], // Digit8 + [0x00000039, 0x00000028, 0x01000000, 0x000002d8], // Digit9 + [0x00000030, 0x00000029, 0x01000000, 0x01000000], // Digit0 + [0x0000002d, 0x0000005f, 0x0000002d, 0x000002cd], // Minus + [0x0000003d, 0x0000002b, 0x01000000, 0x01000000], // Equal + [0x0000005b, 0x0000007b, 0x01000000, 0x01000000], // BracketLeft + [0x0000005d, 0x0000007d, 0x01000000, 0x01000000], // BracketRight + [0x0000005c, 0x0000007c, 0x01000000, 0x01000000], // Backslash + [0x0000003b, 0x0000003a, 0x01000000, 0x01000000], // Semicolon + [0x00000027, 0x00000022, 0x01000000, 0x01000000], // Quote + [0x00000060, 0x0000007e, 0x01000000, 0x0000007e], // Backquote + [0x0000002c, 0x0000003c, 0x0000002c, 0x0000003c], // Comma + [0x0000002e, 0x0000003e, 0x0000002e, 0x01000000], // Period + [0x0000002f, 0x0000003f, 0x01000000, 0x01000000], // Slash + ], + ), + + LayoutInfo( + name: 'en-intl', + platform: LayoutPlatform.darwin, + mapping: >[ + [0x00000061, 0x00000041, 0x000000e5, 0x000000c5], // KeyA + [0x00000062, 0x00000042, 0x0000222b, 0x00000131], // KeyB + [0x00000063, 0x00000043, 0x000000e7, 0x000000c7], // KeyC + [0x00000064, 0x00000044, 0x00002202, 0x000000ce], // KeyD + [0x00000065, 0x00000045, 0x01000000, 0x000000b4], // KeyE + [0x00000066, 0x00000046, 0x00000192, 0x000000cf], // KeyF + [0x00000067, 0x00000047, 0x000000a9, 0x000002dd], // KeyG + [0x00000068, 0x00000048, 0x000002d9, 0x000000d3], // KeyH + [0x00000069, 0x00000049, 0x01000000, 0x000002c6], // KeyI + [0x0000006a, 0x0000004a, 0x00002206, 0x000000d4], // KeyJ + [0x0000006b, 0x0000004b, 0x000002da, 0x0000f8ff], // KeyK + [0x0000006c, 0x0000004c, 0x000000ac, 0x000000d2], // KeyL + [0x0000006d, 0x0000004d, 0x000000b5, 0x000000c2], // KeyM + [0x0000006e, 0x0000004e, 0x01000000, 0x000002dc], // KeyN + [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO + [0x00000070, 0x00000050, 0x000003c0, 0x0000220f], // KeyP + [0x00000071, 0x00000051, 0x00000153, 0x00000152], // KeyQ + [0x00000072, 0x00000052, 0x000000ae, 0x00002030], // KeyR + [0x00000073, 0x00000053, 0x000000df, 0x000000cd], // KeyS + [0x00000074, 0x00000054, 0x00002020, 0x000002c7], // KeyT + [0x00000075, 0x00000055, 0x01000000, 0x000000a8], // KeyU + [0x00000076, 0x00000056, 0x0000221a, 0x000025ca], // KeyV + [0x00000077, 0x00000057, 0x00002211, 0x0000201e], // KeyW + [0x00000078, 0x00000058, 0x00002248, 0x000002db], // KeyX + [0x00000079, 0x00000059, 0x000000a5, 0x000000c1], // KeyY + [0x0000007a, 0x0000005a, 0x000003a9, 0x000000b8], // KeyZ + [0x00000031, 0x00000021, 0x000000a1, 0x00002044], // Digit1 + [0x00000032, 0x00000040, 0x00002122, 0x000020ac], // Digit2 + [0x00000033, 0x00000023, 0x000000a3, 0x00002039], // Digit3 + [0x00000034, 0x00000024, 0x000000a2, 0x0000203a], // Digit4 + [0x00000035, 0x00000025, 0x0000221e, 0x0000fb01], // Digit5 + [0x00000036, 0x01000000, 0x000000a7, 0x0000fb02], // Digit6 + [0x00000037, 0x00000026, 0x000000b6, 0x00002021], // Digit7 + [0x00000038, 0x0000002a, 0x00002022, 0x000000b0], // Digit8 + [0x00000039, 0x00000028, 0x000000aa, 0x000000b7], // Digit9 + [0x00000030, 0x00000029, 0x000000ba, 0x0000201a], // Digit0 + [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Minus + [0x0000003d, 0x0000002b, 0x00002260, 0x000000b1], // Equal + [0x0000005b, 0x0000007b, 0x0000201c, 0x0000201d], // BracketLeft + [0x0000005d, 0x0000007d, 0x00002018, 0x00002019], // BracketRight + [0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb], // Backslash + [0x0000003b, 0x0000003a, 0x00002026, 0x000000da], // Semicolon + [0x01000000, 0x01000000, 0x000000e6, 0x000000c6], // Quote + [0x01000000, 0x01000000, 0x01000000, 0x00000060], // Backquote + [0x0000002c, 0x0000003c, 0x00002264, 0x000000af], // Comma + [0x0000002e, 0x0000003e, 0x00002265, 0x000002d8], // Period + [0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf], // Slash + ], + ), + + LayoutInfo( + name: 'en-intl', + platform: LayoutPlatform.win, + mapping: >[ + [0x00000061, 0x00000041, 0x000000e1, 0x000000c1], // KeyA + [0x00000062, 0x00000042, 0x01000000, 0x01000000], // KeyB + [0x00000063, 0x00000043, 0x000000a9, 0x000000a2], // KeyC + [0x00000064, 0x00000044, 0x000000f0, 0x000000d0], // KeyD + [0x00000065, 0x00000045, 0x000000e9, 0x000000c9], // KeyE + [0x00000066, 0x00000046, 0x01000000, 0x01000000], // KeyF + [0x00000067, 0x00000047, 0x01000000, 0x01000000], // KeyG + [0x00000068, 0x00000048, 0x01000000, 0x01000000], // KeyH + [0x00000069, 0x00000049, 0x000000ed, 0x000000cd], // KeyI + [0x0000006a, 0x0000004a, 0x01000000, 0x01000000], // KeyJ + [0x0000006b, 0x0000004b, 0x01000000, 0x01000000], // KeyK + [0x0000006c, 0x0000004c, 0x000000f8, 0x000000d8], // KeyL + [0x0000006d, 0x0000004d, 0x000000b5, 0x01000000], // KeyM + [0x0000006e, 0x0000004e, 0x000000f1, 0x000000d1], // KeyN + [0x0000006f, 0x0000004f, 0x000000f3, 0x000000d3], // KeyO + [0x00000070, 0x00000050, 0x000000f6, 0x000000d6], // KeyP + [0x00000071, 0x00000051, 0x000000e4, 0x000000c4], // KeyQ + [0x00000072, 0x00000052, 0x000000ae, 0x01000000], // KeyR + [0x00000073, 0x00000053, 0x000000df, 0x000000a7], // KeyS + [0x00000074, 0x00000054, 0x000000fe, 0x000000de], // KeyT + [0x00000075, 0x00000055, 0x000000fa, 0x000000da], // KeyU + [0x00000076, 0x00000056, 0x01000000, 0x01000000], // KeyV + [0x00000077, 0x00000057, 0x000000e5, 0x000000c5], // KeyW + [0x00000078, 0x00000058, 0x01000000, 0x01000000], // KeyX + [0x00000079, 0x00000059, 0x000000fc, 0x000000dc], // KeyY + [0x0000007a, 0x0000005a, 0x000000e6, 0x000000c6], // KeyZ + [0x00000031, 0x00000021, 0x000000a1, 0x000000b9], // Digit1 + [0x00000032, 0x00000040, 0x000000b2, 0x01000000], // Digit2 + [0x00000033, 0x00000023, 0x000000b3, 0x01000000], // Digit3 + [0x00000034, 0x00000024, 0x000000a4, 0x000000a3], // Digit4 + [0x00000035, 0x00000025, 0x000020ac, 0x01000000], // Digit5 + [0x00000036, 0x0000005e, 0x000000bc, 0x01000000], // Digit6 + [0x00000037, 0x00000026, 0x000000bd, 0x01000000], // Digit7 + [0x00000038, 0x0000002a, 0x000000be, 0x01000000], // Digit8 + [0x00000039, 0x00000028, 0x00002018, 0x01000000], // Digit9 + [0x00000030, 0x00000029, 0x00002019, 0x01000000], // Digit0 + [0x0000002d, 0x0000005f, 0x000000a5, 0x01000000], // Minus + [0x0000003d, 0x0000002b, 0x000000d7, 0x000000f7], // Equal + [0x0000005b, 0x0000007b, 0x000000ab, 0x01000000], // BracketLeft + [0x0000005d, 0x0000007d, 0x000000bb, 0x01000000], // BracketRight + [0x0000005c, 0x0000007c, 0x000000ac, 0x000000a6], // Backslash + [0x0000003b, 0x0000003a, 0x000000b6, 0x000000b0], // Semicolon + [0x00000027, 0x00000022, 0x000000b4, 0x000000a8], // Quote + [0x00000060, 0x0000007e, 0x01000000, 0x01000000], // Backquote + [0x0000002c, 0x0000003c, 0x000000e7, 0x000000c7], // Comma + [0x0000002e, 0x0000003e, 0x01000000, 0x01000000], // Period + [0x0000002f, 0x0000003f, 0x000000bf, 0x01000000], // Slash + ], + ), + + LayoutInfo( + name: 'en-uk', + platform: LayoutPlatform.darwin, + mapping: >[ + [0x00000061, 0x00000041, 0x000000e5, 0x000000c5], // KeyA + [0x00000062, 0x00000042, 0x0000222b, 0x00000131], // KeyB + [0x00000063, 0x00000043, 0x000000e7, 0x000000c7], // KeyC + [0x00000064, 0x00000044, 0x00002202, 0x000000ce], // KeyD + [0x00000065, 0x00000045, 0x01000000, 0x00002030], // KeyE + [0x00000066, 0x00000046, 0x00000192, 0x000000cf], // KeyF + [0x00000067, 0x00000047, 0x000000a9, 0x000000cc], // KeyG + [0x00000068, 0x00000048, 0x000002d9, 0x000000d3], // KeyH + [0x00000069, 0x00000049, 0x01000000, 0x000000c8], // KeyI + [0x0000006a, 0x0000004a, 0x00002206, 0x000000d4], // KeyJ + [0x0000006b, 0x0000004b, 0x000002da, 0x0000f8ff], // KeyK + [0x0000006c, 0x0000004c, 0x000000ac, 0x000000d2], // KeyL + [0x0000006d, 0x0000004d, 0x000000b5, 0x000002dc], // KeyM + [0x0000006e, 0x0000004e, 0x01000000, 0x000002c6], // KeyN + [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO + [0x00000070, 0x00000050, 0x000003c0, 0x0000220f], // KeyP + [0x00000071, 0x00000051, 0x00000153, 0x00000152], // KeyQ + [0x00000072, 0x00000052, 0x000000ae, 0x000000c2], // KeyR + [0x00000073, 0x00000053, 0x000000df, 0x000000cd], // KeyS + [0x00000074, 0x00000054, 0x00002020, 0x000000ca], // KeyT + [0x00000075, 0x00000055, 0x01000000, 0x000000cb], // KeyU + [0x00000076, 0x00000056, 0x0000221a, 0x000025ca], // KeyV + [0x00000077, 0x00000057, 0x00002211, 0x0000201e], // KeyW + [0x00000078, 0x00000058, 0x00002248, 0x000000d9], // KeyX + [0x00000079, 0x00000059, 0x000000a5, 0x000000c1], // KeyY + [0x0000007a, 0x0000005a, 0x000003a9, 0x000000db], // KeyZ + [0x00000031, 0x00000021, 0x000000a1, 0x00002044], // Digit1 + [0x00000032, 0x00000040, 0x000020ac, 0x00002122], // Digit2 + [0x00000033, 0x000000a3, 0x00000023, 0x00002039], // Digit3 + [0x00000034, 0x00000024, 0x000000a2, 0x0000203a], // Digit4 + [0x00000035, 0x00000025, 0x0000221e, 0x0000fb01], // Digit5 + [0x00000036, 0x0000005e, 0x000000a7, 0x0000fb02], // Digit6 + [0x00000037, 0x00000026, 0x000000b6, 0x00002021], // Digit7 + [0x00000038, 0x0000002a, 0x00002022, 0x000000b0], // Digit8 + [0x00000039, 0x00000028, 0x000000aa, 0x000000b7], // Digit9 + [0x00000030, 0x00000029, 0x000000ba, 0x0000201a], // Digit0 + [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Minus + [0x0000003d, 0x0000002b, 0x00002260, 0x000000b1], // Equal + [0x0000005b, 0x0000007b, 0x0000201c, 0x0000201d], // BracketLeft + [0x0000005d, 0x0000007d, 0x00002018, 0x00002019], // BracketRight + [0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb], // Backslash + [0x0000003b, 0x0000003a, 0x00002026, 0x000000da], // Semicolon + [0x00000027, 0x00000022, 0x000000e6, 0x000000c6], // Quote + [0x00000060, 0x0000007e, 0x01000000, 0x00000178], // Backquote + [0x0000002c, 0x0000003c, 0x00002264, 0x000000af], // Comma + [0x0000002e, 0x0000003e, 0x00002265, 0x000002d8], // Period + [0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf], // Slash + ], + ), + + LayoutInfo( + name: 'en-uk', + platform: LayoutPlatform.win, + mapping: >[ + [0x00000061, 0x00000041, 0x000000e1, 0x000000c1], // KeyA + [0x00000062, 0x00000042, 0x01000000, 0x01000000], // KeyB + [0x00000063, 0x00000043, 0x01000000, 0x01000000], // KeyC + [0x00000064, 0x00000044, 0x01000000, 0x01000000], // KeyD + [0x00000065, 0x00000045, 0x000000e9, 0x000000c9], // KeyE + [0x00000066, 0x00000046, 0x01000000, 0x01000000], // KeyF + [0x00000067, 0x00000047, 0x01000000, 0x01000000], // KeyG + [0x00000068, 0x00000048, 0x01000000, 0x01000000], // KeyH + [0x00000069, 0x00000049, 0x000000ed, 0x000000cd], // KeyI + [0x0000006a, 0x0000004a, 0x01000000, 0x01000000], // KeyJ + [0x0000006b, 0x0000004b, 0x01000000, 0x01000000], // KeyK + [0x0000006c, 0x0000004c, 0x01000000, 0x01000000], // KeyL + [0x0000006d, 0x0000004d, 0x01000000, 0x01000000], // KeyM + [0x0000006e, 0x0000004e, 0x01000000, 0x01000000], // KeyN + [0x0000006f, 0x0000004f, 0x000000f3, 0x000000d3], // KeyO + [0x00000070, 0x00000050, 0x01000000, 0x01000000], // KeyP + [0x00000071, 0x00000051, 0x01000000, 0x01000000], // KeyQ + [0x00000072, 0x00000052, 0x01000000, 0x01000000], // KeyR + [0x00000073, 0x00000053, 0x01000000, 0x01000000], // KeyS + [0x00000074, 0x00000054, 0x01000000, 0x01000000], // KeyT + [0x00000075, 0x00000055, 0x000000fa, 0x000000da], // KeyU + [0x00000076, 0x00000056, 0x01000000, 0x01000000], // KeyV + [0x00000077, 0x00000057, 0x01000000, 0x01000000], // KeyW + [0x00000078, 0x00000058, 0x01000000, 0x01000000], // KeyX + [0x00000079, 0x00000059, 0x01000000, 0x01000000], // KeyY + [0x0000007a, 0x0000005a, 0x01000000, 0x01000000], // KeyZ + [0x00000031, 0x00000021, 0x01000000, 0x01000000], // Digit1 + [0x00000032, 0x00000022, 0x01000000, 0x01000000], // Digit2 + [0x00000033, 0x000000a3, 0x01000000, 0x01000000], // Digit3 + [0x00000034, 0x00000024, 0x000020ac, 0x01000000], // Digit4 + [0x00000035, 0x00000025, 0x01000000, 0x01000000], // Digit5 + [0x00000036, 0x0000005e, 0x01000000, 0x01000000], // Digit6 + [0x00000037, 0x00000026, 0x01000000, 0x01000000], // Digit7 + [0x00000038, 0x0000002a, 0x01000000, 0x01000000], // Digit8 + [0x00000039, 0x00000028, 0x01000000, 0x01000000], // Digit9 + [0x00000030, 0x00000029, 0x01000000, 0x01000000], // Digit0 + [0x0000002d, 0x0000005f, 0x01000000, 0x01000000], // Minus + [0x0000003d, 0x0000002b, 0x01000000, 0x01000000], // Equal + [0x0000005b, 0x0000007b, 0x01000000, 0x01000000], // BracketLeft + [0x0000005d, 0x0000007d, 0x01000000, 0x01000000], // BracketRight + [0x00000023, 0x0000007e, 0x0000005c, 0x0000007c], // Backslash + [0x0000003b, 0x0000003a, 0x01000000, 0x01000000], // Semicolon + [0x00000027, 0x00000040, 0x01000000, 0x01000000], // Quote + [0x00000060, 0x000000ac, 0x000000a6, 0x01000000], // Backquote + [0x0000002c, 0x0000003c, 0x01000000, 0x01000000], // Comma + [0x0000002e, 0x0000003e, 0x01000000, 0x01000000], // Period + [0x0000002f, 0x0000003f, 0x01000000, 0x01000000], // Slash + ], + ), + + LayoutInfo( + name: 'en', + platform: LayoutPlatform.darwin, + mapping: >[ + [0x00000061, 0x00000041, 0x000000e5, 0x000000c5], // KeyA + [0x00000062, 0x00000042, 0x0000222b, 0x00000131], // KeyB + [0x00000063, 0x00000043, 0x000000e7, 0x000000c7], // KeyC + [0x00000064, 0x00000044, 0x00002202, 0x000000ce], // KeyD + [0x00000065, 0x00000045, 0x01000000, 0x000000b4], // KeyE + [0x00000066, 0x00000046, 0x00000192, 0x000000cf], // KeyF + [0x00000067, 0x00000047, 0x000000a9, 0x000002dd], // KeyG + [0x00000068, 0x00000048, 0x000002d9, 0x000000d3], // KeyH + [0x00000069, 0x00000049, 0x01000000, 0x000002c6], // KeyI + [0x0000006a, 0x0000004a, 0x00002206, 0x000000d4], // KeyJ + [0x0000006b, 0x0000004b, 0x000002da, 0x0000f8ff], // KeyK + [0x0000006c, 0x0000004c, 0x000000ac, 0x000000d2], // KeyL + [0x0000006d, 0x0000004d, 0x000000b5, 0x000000c2], // KeyM + [0x0000006e, 0x0000004e, 0x01000000, 0x000002dc], // KeyN + [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO + [0x00000070, 0x00000050, 0x000003c0, 0x0000220f], // KeyP + [0x00000071, 0x00000051, 0x00000153, 0x00000152], // KeyQ + [0x00000072, 0x00000052, 0x000000ae, 0x00002030], // KeyR + [0x00000073, 0x00000053, 0x000000df, 0x000000cd], // KeyS + [0x00000074, 0x00000054, 0x00002020, 0x000002c7], // KeyT + [0x00000075, 0x00000055, 0x01000000, 0x000000a8], // KeyU + [0x00000076, 0x00000056, 0x0000221a, 0x000025ca], // KeyV + [0x00000077, 0x00000057, 0x00002211, 0x0000201e], // KeyW + [0x00000078, 0x00000058, 0x00002248, 0x000002db], // KeyX + [0x00000079, 0x00000059, 0x000000a5, 0x000000c1], // KeyY + [0x0000007a, 0x0000005a, 0x000003a9, 0x000000b8], // KeyZ + [0x00000031, 0x00000021, 0x000000a1, 0x00002044], // Digit1 + [0x00000032, 0x00000040, 0x00002122, 0x000020ac], // Digit2 + [0x00000033, 0x00000023, 0x000000a3, 0x00002039], // Digit3 + [0x00000034, 0x00000024, 0x000000a2, 0x0000203a], // Digit4 + [0x00000035, 0x00000025, 0x0000221e, 0x0000fb01], // Digit5 + [0x00000036, 0x0000005e, 0x000000a7, 0x0000fb02], // Digit6 + [0x00000037, 0x00000026, 0x000000b6, 0x00002021], // Digit7 + [0x00000038, 0x0000002a, 0x00002022, 0x000000b0], // Digit8 + [0x00000039, 0x00000028, 0x000000aa, 0x000000b7], // Digit9 + [0x00000030, 0x00000029, 0x000000ba, 0x0000201a], // Digit0 + [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Minus + [0x0000003d, 0x0000002b, 0x00002260, 0x000000b1], // Equal + [0x0000005b, 0x0000007b, 0x0000201c, 0x0000201d], // BracketLeft + [0x0000005d, 0x0000007d, 0x00002018, 0x00002019], // BracketRight + [0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb], // Backslash + [0x0000003b, 0x0000003a, 0x00002026, 0x000000da], // Semicolon + [0x00000027, 0x00000022, 0x000000e6, 0x000000c6], // Quote + [0x00000060, 0x0000007e, 0x01000000, 0x00000060], // Backquote + [0x0000002c, 0x0000003c, 0x00002264, 0x000000af], // Comma + [0x0000002e, 0x0000003e, 0x00002265, 0x000002d8], // Period + [0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf], // Slash + ], + ), + + LayoutInfo( + name: 'en', + platform: LayoutPlatform.linux, + mapping: >[ + [0x00000061, 0x00000041, 0x00000061, 0x00000041], // KeyA + [0x00000062, 0x00000042, 0x00000062, 0x00000042], // KeyB + [0x00000063, 0x00000043, 0x00000063, 0x00000043], // KeyC + [0x00000064, 0x00000044, 0x00000064, 0x00000044], // KeyD + [0x00000065, 0x00000045, 0x00000065, 0x00000045], // KeyE + [0x00000066, 0x00000046, 0x00000066, 0x00000046], // KeyF + [0x00000067, 0x00000047, 0x00000067, 0x00000047], // KeyG + [0x00000068, 0x00000048, 0x00000068, 0x00000048], // KeyH + [0x00000069, 0x00000049, 0x00000069, 0x00000049], // KeyI + [0x0000006a, 0x0000004a, 0x0000006a, 0x0000004a], // KeyJ + [0x0000006b, 0x0000004b, 0x0000006b, 0x0000004b], // KeyK + [0x0000006c, 0x0000004c, 0x0000006c, 0x0000004c], // KeyL + [0x0000006d, 0x0000004d, 0x0000006d, 0x0000004d], // KeyM + [0x0000006e, 0x0000004e, 0x0000006e, 0x0000004e], // KeyN + [0x0000006f, 0x0000004f, 0x0000006f, 0x0000004f], // KeyO + [0x00000070, 0x00000050, 0x00000070, 0x00000050], // KeyP + [0x00000071, 0x00000051, 0x00000071, 0x00000051], // KeyQ + [0x00000072, 0x00000052, 0x00000072, 0x00000052], // KeyR + [0x00000073, 0x00000053, 0x00000073, 0x00000053], // KeyS + [0x00000074, 0x00000054, 0x00000074, 0x00000054], // KeyT + [0x00000075, 0x00000055, 0x00000075, 0x00000055], // KeyU + [0x00000076, 0x00000056, 0x00000076, 0x00000056], // KeyV + [0x00000077, 0x00000057, 0x00000077, 0x00000057], // KeyW + [0x00000078, 0x00000058, 0x00000078, 0x00000058], // KeyX + [0x00000079, 0x00000059, 0x00000079, 0x00000059], // KeyY + [0x0000007a, 0x0000005a, 0x0000007a, 0x0000005a], // KeyZ + [0x00000031, 0x00000021, 0x00000031, 0x00000021], // Digit1 + [0x00000032, 0x00000040, 0x00000032, 0x00000040], // Digit2 + [0x00000033, 0x00000023, 0x00000033, 0x00000023], // Digit3 + [0x00000034, 0x00000024, 0x00000034, 0x00000024], // Digit4 + [0x00000035, 0x00000025, 0x00000035, 0x00000025], // Digit5 + [0x00000036, 0x0000005e, 0x00000036, 0x0000005e], // Digit6 + [0x00000037, 0x00000026, 0x00000037, 0x00000026], // Digit7 + [0x00000038, 0x0000002a, 0x00000038, 0x0000002a], // Digit8 + [0x00000039, 0x00000028, 0x00000039, 0x00000028], // Digit9 + [0x00000030, 0x00000029, 0x00000030, 0x00000029], // Digit0 + [0x0000002d, 0x0000005f, 0x0000002d, 0x0000005f], // Minus + [0x0000003d, 0x0000002b, 0x0000003d, 0x0000002b], // Equal + [0x0000005b, 0x0000007b, 0x0000005b, 0x0000007b], // BracketLeft + [0x0000005d, 0x0000007d, 0x0000005d, 0x0000007d], // BracketRight + [0x0000005c, 0x0000007c, 0x0000005c, 0x0000007c], // Backslash + [0x0000003b, 0x0000003a, 0x0000003b, 0x0000003a], // Semicolon + [0x00000027, 0x00000022, 0x00000027, 0x00000022], // Quote + [0x00000060, 0x0000007e, 0x00000060, 0x0000007e], // Backquote + [0x0000002c, 0x0000003c, 0x0000002c, 0x0000003c], // Comma + [0x0000002e, 0x0000003e, 0x0000002e, 0x0000003e], // Period + [0x0000002f, 0x0000003f, 0x0000002f, 0x0000003f], // Slash + ], + ), + + LayoutInfo( + name: 'en', + platform: LayoutPlatform.win, + mapping: >[ + [0x00000061, 0x00000041, 0x01000000, 0x01000000], // KeyA + [0x00000062, 0x00000042, 0x01000000, 0x01000000], // KeyB + [0x00000063, 0x00000043, 0x01000000, 0x01000000], // KeyC + [0x00000064, 0x00000044, 0x01000000, 0x01000000], // KeyD + [0x00000065, 0x00000045, 0x01000000, 0x01000000], // KeyE + [0x00000066, 0x00000046, 0x01000000, 0x01000000], // KeyF + [0x00000067, 0x00000047, 0x01000000, 0x01000000], // KeyG + [0x00000068, 0x00000048, 0x01000000, 0x01000000], // KeyH + [0x00000069, 0x00000049, 0x01000000, 0x01000000], // KeyI + [0x0000006a, 0x0000004a, 0x01000000, 0x01000000], // KeyJ + [0x0000006b, 0x0000004b, 0x01000000, 0x01000000], // KeyK + [0x0000006c, 0x0000004c, 0x01000000, 0x01000000], // KeyL + [0x0000006d, 0x0000004d, 0x01000000, 0x01000000], // KeyM + [0x0000006e, 0x0000004e, 0x01000000, 0x01000000], // KeyN + [0x0000006f, 0x0000004f, 0x01000000, 0x01000000], // KeyO + [0x00000070, 0x00000050, 0x01000000, 0x01000000], // KeyP + [0x00000071, 0x00000051, 0x01000000, 0x01000000], // KeyQ + [0x00000072, 0x00000052, 0x01000000, 0x01000000], // KeyR + [0x00000073, 0x00000053, 0x01000000, 0x01000000], // KeyS + [0x00000074, 0x00000054, 0x01000000, 0x01000000], // KeyT + [0x00000075, 0x00000055, 0x01000000, 0x01000000], // KeyU + [0x00000076, 0x00000056, 0x01000000, 0x01000000], // KeyV + [0x00000077, 0x00000057, 0x01000000, 0x01000000], // KeyW + [0x00000078, 0x00000058, 0x01000000, 0x01000000], // KeyX + [0x00000079, 0x00000059, 0x01000000, 0x01000000], // KeyY + [0x0000007a, 0x0000005a, 0x01000000, 0x01000000], // KeyZ + [0x00000031, 0x00000021, 0x01000000, 0x01000000], // Digit1 + [0x00000032, 0x00000040, 0x01000000, 0x01000000], // Digit2 + [0x00000033, 0x00000023, 0x01000000, 0x01000000], // Digit3 + [0x00000034, 0x00000024, 0x01000000, 0x01000000], // Digit4 + [0x00000035, 0x00000025, 0x01000000, 0x01000000], // Digit5 + [0x00000036, 0x0000005e, 0x01000000, 0x01000000], // Digit6 + [0x00000037, 0x00000026, 0x01000000, 0x01000000], // Digit7 + [0x00000038, 0x0000002a, 0x01000000, 0x01000000], // Digit8 + [0x00000039, 0x00000028, 0x01000000, 0x01000000], // Digit9 + [0x00000030, 0x00000029, 0x01000000, 0x01000000], // Digit0 + [0x0000002d, 0x0000005f, 0x01000000, 0x01000000], // Minus + [0x0000003d, 0x0000002b, 0x01000000, 0x01000000], // Equal + [0x0000005b, 0x0000007b, 0x01000000, 0x01000000], // BracketLeft + [0x0000005d, 0x0000007d, 0x01000000, 0x01000000], // BracketRight + [0x0000005c, 0x0000007c, 0x01000000, 0x01000000], // Backslash + [0x0000003b, 0x0000003a, 0x01000000, 0x01000000], // Semicolon + [0x00000027, 0x00000022, 0x01000000, 0x01000000], // Quote + [0x00000060, 0x0000007e, 0x01000000, 0x01000000], // Backquote + [0x0000002c, 0x0000003c, 0x01000000, 0x01000000], // Comma + [0x0000002e, 0x0000003e, 0x01000000, 0x01000000], // Period + [0x0000002f, 0x0000003f, 0x01000000, 0x01000000], // Slash + ], + ), + + LayoutInfo( + name: 'es-latin', + platform: LayoutPlatform.win, + mapping: >[ + [0x00000061, 0x00000041, 0x01000000, 0x01000000], // KeyA + [0x00000062, 0x00000042, 0x01000000, 0x01000000], // KeyB + [0x00000063, 0x00000043, 0x01000000, 0x01000000], // KeyC + [0x00000064, 0x00000044, 0x01000000, 0x01000000], // KeyD + [0x00000065, 0x00000045, 0x01000000, 0x01000000], // KeyE + [0x00000066, 0x00000046, 0x01000000, 0x01000000], // KeyF + [0x00000067, 0x00000047, 0x01000000, 0x01000000], // KeyG + [0x00000068, 0x00000048, 0x01000000, 0x01000000], // KeyH + [0x00000069, 0x00000049, 0x01000000, 0x01000000], // KeyI + [0x0000006a, 0x0000004a, 0x01000000, 0x01000000], // KeyJ + [0x0000006b, 0x0000004b, 0x01000000, 0x01000000], // KeyK + [0x0000006c, 0x0000004c, 0x01000000, 0x01000000], // KeyL + [0x0000006d, 0x0000004d, 0x01000000, 0x01000000], // KeyM + [0x0000006e, 0x0000004e, 0x01000000, 0x01000000], // KeyN + [0x0000006f, 0x0000004f, 0x01000000, 0x01000000], // KeyO + [0x00000070, 0x00000050, 0x01000000, 0x01000000], // KeyP + [0x00000071, 0x00000051, 0x00000040, 0x01000000], // KeyQ + [0x00000072, 0x00000052, 0x01000000, 0x01000000], // KeyR + [0x00000073, 0x00000053, 0x01000000, 0x01000000], // KeyS + [0x00000074, 0x00000054, 0x01000000, 0x01000000], // KeyT + [0x00000075, 0x00000055, 0x01000000, 0x01000000], // KeyU + [0x00000076, 0x00000056, 0x01000000, 0x01000000], // KeyV + [0x00000077, 0x00000057, 0x01000000, 0x01000000], // KeyW + [0x00000078, 0x00000058, 0x01000000, 0x01000000], // KeyX + [0x00000079, 0x00000059, 0x01000000, 0x01000000], // KeyY + [0x0000007a, 0x0000005a, 0x01000000, 0x01000000], // KeyZ + [0x00000031, 0x00000021, 0x01000000, 0x01000000], // Digit1 + [0x00000032, 0x00000022, 0x01000000, 0x01000000], // Digit2 + [0x00000033, 0x00000023, 0x01000000, 0x01000000], // Digit3 + [0x00000034, 0x00000024, 0x01000000, 0x01000000], // Digit4 + [0x00000035, 0x00000025, 0x01000000, 0x01000000], // Digit5 + [0x00000036, 0x00000026, 0x01000000, 0x01000000], // Digit6 + [0x00000037, 0x0000002f, 0x01000000, 0x01000000], // Digit7 + [0x00000038, 0x00000028, 0x01000000, 0x01000000], // Digit8 + [0x00000039, 0x00000029, 0x01000000, 0x01000000], // Digit9 + [0x00000030, 0x0000003d, 0x01000000, 0x01000000], // Digit0 + [0x00000027, 0x0000003f, 0x0000005c, 0x01000000], // Minus + [0x000000bf, 0x000000a1, 0x01000000, 0x01000000], // Equal + [0x000000b4, 0x000000a8, 0x01000000, 0x01000000], // BracketLeft + [0x0000002b, 0x0000002a, 0x0000007e, 0x01000000], // BracketRight + [0x0000007d, 0x0000005d, 0x00000060, 0x01000000], // Backslash + [0x000000f1, 0x000000d1, 0x01000000, 0x01000000], // Semicolon + [0x0000007b, 0x0000005b, 0x0000005e, 0x01000000], // Quote + [0x0000007c, 0x000000b0, 0x000000ac, 0x01000000], // Backquote + [0x0000002c, 0x0000003b, 0x01000000, 0x01000000], // Comma + [0x0000002e, 0x0000003a, 0x01000000, 0x01000000], // Period + [0x0000002d, 0x0000005f, 0x01000000, 0x01000000], // Slash + ], + ), + + LayoutInfo( + name: 'es', + platform: LayoutPlatform.darwin, + mapping: >[ + [0x00000061, 0x00000041, 0x000000e5, 0x000000c5], // KeyA + [0x00000062, 0x00000042, 0x000000df, 0x01000000], // KeyB + [0x00000063, 0x00000043, 0x000000a9, 0x00000020], // KeyC + [0x00000064, 0x00000044, 0x00002202, 0x00002206], // KeyD + [0x00000065, 0x00000045, 0x000020ac, 0x000020ac], // KeyE + [0x00000066, 0x00000046, 0x00000192, 0x0000fb01], // KeyF + [0x00000067, 0x00000047, 0x0000f8ff, 0x0000fb02], // KeyG + [0x00000068, 0x00000048, 0x00002122, 0x00000020], // KeyH + [0x00000069, 0x00000049, 0x00000020, 0x00000020], // KeyI + [0x0000006a, 0x0000004a, 0x000000b6, 0x000000af], // KeyJ + [0x0000006b, 0x0000004b, 0x000000a7, 0x000002c7], // KeyK + [0x0000006c, 0x0000004c, 0x00000020, 0x000002d8], // KeyL + [0x0000006d, 0x0000004d, 0x000000b5, 0x000002da], // KeyM + [0x0000006e, 0x0000004e, 0x00000020, 0x000002d9], // KeyN + [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO + [0x00000070, 0x00000050, 0x000003c0, 0x0000220f], // KeyP + [0x00000071, 0x00000051, 0x00000153, 0x00000152], // KeyQ + [0x00000072, 0x00000052, 0x000000ae, 0x00000020], // KeyR + [0x00000073, 0x00000053, 0x0000222b, 0x00000020], // KeyS + [0x00000074, 0x00000054, 0x00002020, 0x00002021], // KeyT + [0x00000075, 0x00000055, 0x00000020, 0x00000020], // KeyU + [0x00000076, 0x00000056, 0x0000221a, 0x000025ca], // KeyV + [0x00000077, 0x00000057, 0x000000e6, 0x000000c6], // KeyW + [0x00000078, 0x00000058, 0x00002211, 0x0000203a], // KeyX + [0x00000079, 0x00000059, 0x000000a5, 0x00000020], // KeyY + [0x0000007a, 0x0000005a, 0x000003a9, 0x00002039], // KeyZ + [0x00000031, 0x00000021, 0x0000007c, 0x00000131], // Digit1 + [0x00000032, 0x00000022, 0x00000040, 0x000002dd], // Digit2 + [0x00000033, 0x000000b7, 0x00000023, 0x00002022], // Digit3 + [0x00000034, 0x00000024, 0x000000a2, 0x000000a3], // Digit4 + [0x00000035, 0x00000025, 0x0000221e, 0x00002030], // Digit5 + [0x00000036, 0x00000026, 0x000000ac, 0x00000020], // Digit6 + [0x00000037, 0x0000002f, 0x000000f7, 0x00002044], // Digit7 + [0x00000038, 0x00000028, 0x0000201c, 0x00002018], // Digit8 + [0x00000039, 0x00000029, 0x0000201d, 0x00002019], // Digit9 + [0x00000030, 0x0000003d, 0x00002260, 0x00002248], // Digit0 + [0x00000027, 0x0000003f, 0x000000b4, 0x000000b8], // Minus + [0x000000a1, 0x000000bf, 0x0000201a, 0x000002db], // Equal + [0x01000000, 0x01000000, 0x0000005b, 0x000002c6], // BracketLeft + [0x0000002b, 0x0000002a, 0x0000005d, 0x000000b1], // BracketRight + [0x000000e7, 0x000000c7, 0x0000007d, 0x000000bb], // Backslash + [0x000000f1, 0x000000d1, 0x01000000, 0x000002dc], // Semicolon + [0x01000000, 0x01000000, 0x0000007b, 0x000000ab], // Quote + [0x0000003c, 0x0000003e, 0x00002264, 0x00002265], // Backquote + [0x0000002c, 0x0000003b, 0x0000201e, 0x01000000], // Comma + [0x0000002e, 0x0000003a, 0x00002026, 0x00002026], // Period + [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Slash + ], + ), + + LayoutInfo( + name: 'es', + platform: LayoutPlatform.linux, + mapping: >[ + [0x00000061, 0x00000041, 0x000000e6, 0x000000c6], // KeyA + [0x00000062, 0x00000042, 0x0000201d, 0x00002019], // KeyB + [0x00000063, 0x00000043, 0x000000a2, 0x000000a9], // KeyC + [0x00000064, 0x00000044, 0x000000f0, 0x000000d0], // KeyD + [0x00000065, 0x00000045, 0x000020ac, 0x000000a2], // KeyE + [0x00000066, 0x00000046, 0x00000111, 0x000000aa], // KeyF + [0x00000067, 0x00000047, 0x0000014b, 0x0000014a], // KeyG + [0x00000068, 0x00000048, 0x00000127, 0x00000126], // KeyH + [0x00000069, 0x00000049, 0x00002192, 0x00000131], // KeyI + [0x0000006a, 0x0000004a, 0x00000309, 0x0000031b], // KeyJ + [0x0000006b, 0x0000004b, 0x00000138, 0x00000026], // KeyK + [0x0000006c, 0x0000004c, 0x00000142, 0x00000141], // KeyL + [0x0000006d, 0x0000004d, 0x000000b5, 0x000000ba], // KeyM + [0x0000006e, 0x0000004e, 0x0000006e, 0x0000004e], // KeyN + [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO + [0x00000070, 0x00000050, 0x000000fe, 0x000000de], // KeyP + [0x00000071, 0x00000051, 0x00000040, 0x000003a9], // KeyQ + [0x00000072, 0x00000052, 0x000000b6, 0x000000ae], // KeyR + [0x00000073, 0x00000053, 0x000000df, 0x000000a7], // KeyS + [0x00000074, 0x00000054, 0x00000167, 0x00000166], // KeyT + [0x00000075, 0x00000055, 0x00002193, 0x00002191], // KeyU + [0x00000076, 0x00000056, 0x0000201c, 0x00002018], // KeyV + [0x00000077, 0x00000057, 0x00000142, 0x00000141], // KeyW + [0x00000078, 0x00000058, 0x000000bb, 0x0000003e], // KeyX + [0x00000079, 0x00000059, 0x00002190, 0x000000a5], // KeyY + [0x0000007a, 0x0000005a, 0x000000ab, 0x0000003c], // KeyZ + [0x00000031, 0x00000021, 0x0000007c, 0x000000a1], // Digit1 + [0x00000032, 0x00000022, 0x00000040, 0x0000215b], // Digit2 + [0x00000033, 0x000000b7, 0x00000023, 0x000000a3], // Digit3 + [0x00000034, 0x00000024, 0x0000007e, 0x00000024], // Digit4 + [0x00000035, 0x00000025, 0x000000bd, 0x0000215c], // Digit5 + [0x00000036, 0x00000026, 0x000000ac, 0x0000215d], // Digit6 + [0x00000037, 0x0000002f, 0x0000007b, 0x0000215e], // Digit7 + [0x00000038, 0x00000028, 0x0000005b, 0x00002122], // Digit8 + [0x00000039, 0x00000029, 0x0000005d, 0x000000b1], // Digit9 + [0x00000030, 0x0000003d, 0x0000007d, 0x000000b0], // Digit0 + [0x00000027, 0x0000003f, 0x0000005c, 0x000000bf], // Minus + [0x000000a1, 0x000000bf, 0x00000303, 0x0000007e], // Equal + [0x00000300, 0x00000302, 0x0000005b, 0x0000030a], // BracketLeft + [0x0000002b, 0x0000002a, 0x0000005d, 0x00000304], // BracketRight + [0x000000e7, 0x000000c7, 0x0000007d, 0x00000306], // Backslash + [0x000000f1, 0x000000d1, 0x0000007e, 0x0000030b], // Semicolon + [0x00000301, 0x00000308, 0x0000007b, 0x0000007b], // Quote + [0x000000ba, 0x000000aa, 0x0000005c, 0x0000005c], // Backquote + [0x0000002c, 0x0000003b, 0x00002500, 0x000000d7], // Comma + [0x0000002e, 0x0000003a, 0x000000b7, 0x000000f7], // Period + [0x0000002d, 0x0000005f, 0x00000323, 0x00000307], // Slash + ], + ), + + LayoutInfo( + name: 'es', + platform: LayoutPlatform.win, + mapping: >[ + [0x00000061, 0x00000041, 0x01000000, 0x01000000], // KeyA + [0x00000062, 0x00000042, 0x01000000, 0x01000000], // KeyB + [0x00000063, 0x00000043, 0x01000000, 0x01000000], // KeyC + [0x00000064, 0x00000044, 0x01000000, 0x01000000], // KeyD + [0x00000065, 0x00000045, 0x000020ac, 0x01000000], // KeyE + [0x00000066, 0x00000046, 0x01000000, 0x01000000], // KeyF + [0x00000067, 0x00000047, 0x01000000, 0x01000000], // KeyG + [0x00000068, 0x00000048, 0x01000000, 0x01000000], // KeyH + [0x00000069, 0x00000049, 0x01000000, 0x01000000], // KeyI + [0x0000006a, 0x0000004a, 0x01000000, 0x01000000], // KeyJ + [0x0000006b, 0x0000004b, 0x01000000, 0x01000000], // KeyK + [0x0000006c, 0x0000004c, 0x01000000, 0x01000000], // KeyL + [0x0000006d, 0x0000004d, 0x01000000, 0x01000000], // KeyM + [0x0000006e, 0x0000004e, 0x01000000, 0x01000000], // KeyN + [0x0000006f, 0x0000004f, 0x01000000, 0x01000000], // KeyO + [0x00000070, 0x00000050, 0x01000000, 0x01000000], // KeyP + [0x00000071, 0x00000051, 0x01000000, 0x01000000], // KeyQ + [0x00000072, 0x00000052, 0x01000000, 0x01000000], // KeyR + [0x00000073, 0x00000053, 0x01000000, 0x01000000], // KeyS + [0x00000074, 0x00000054, 0x01000000, 0x01000000], // KeyT + [0x00000075, 0x00000055, 0x01000000, 0x01000000], // KeyU + [0x00000076, 0x00000056, 0x01000000, 0x01000000], // KeyV + [0x00000077, 0x00000057, 0x01000000, 0x01000000], // KeyW + [0x00000078, 0x00000058, 0x01000000, 0x01000000], // KeyX + [0x00000079, 0x00000059, 0x01000000, 0x01000000], // KeyY + [0x0000007a, 0x0000005a, 0x01000000, 0x01000000], // KeyZ + [0x00000031, 0x00000021, 0x0000007c, 0x01000000], // Digit1 + [0x00000032, 0x00000022, 0x00000040, 0x01000000], // Digit2 + [0x00000033, 0x000000b7, 0x00000023, 0x01000000], // Digit3 + [0x00000034, 0x00000024, 0x0000007e, 0x01000000], // Digit4 + [0x00000035, 0x00000025, 0x000020ac, 0x01000000], // Digit5 + [0x00000036, 0x00000026, 0x000000ac, 0x01000000], // Digit6 + [0x00000037, 0x0000002f, 0x01000000, 0x01000000], // Digit7 + [0x00000038, 0x00000028, 0x01000000, 0x01000000], // Digit8 + [0x00000039, 0x00000029, 0x01000000, 0x01000000], // Digit9 + [0x00000030, 0x0000003d, 0x01000000, 0x01000000], // Digit0 + [0x00000027, 0x0000003f, 0x01000000, 0x01000000], // Minus + [0x000000a1, 0x000000bf, 0x01000000, 0x01000000], // Equal + [0x00000060, 0x0000005e, 0x0000005b, 0x01000000], // BracketLeft + [0x0000002b, 0x0000002a, 0x0000005d, 0x01000000], // BracketRight + [0x000000e7, 0x000000c7, 0x0000007d, 0x01000000], // Backslash + [0x000000f1, 0x000000d1, 0x01000000, 0x01000000], // Semicolon + [0x000000b4, 0x000000a8, 0x0000007b, 0x01000000], // Quote + [0x000000ba, 0x000000aa, 0x0000005c, 0x01000000], // Backquote + [0x0000002c, 0x0000003b, 0x01000000, 0x01000000], // Comma + [0x0000002e, 0x0000003a, 0x01000000, 0x01000000], // Period + [0x0000002d, 0x0000005f, 0x01000000, 0x01000000], // Slash + ], + ), + + LayoutInfo( + name: 'fr', + platform: LayoutPlatform.darwin, + mapping: >[ + [0x00000071, 0x00000051, 0x00002021, 0x000003a9], // KeyA + [0x00000062, 0x00000042, 0x000000df, 0x0000222b], // KeyB + [0x00000063, 0x00000043, 0x000000a9, 0x000000a2], // KeyC + [0x00000064, 0x00000044, 0x00002202, 0x00002206], // KeyD + [0x00000065, 0x00000045, 0x000000ea, 0x000000ca], // KeyE + [0x00000066, 0x00000046, 0x00000192, 0x000000b7], // KeyF + [0x00000067, 0x00000047, 0x0000fb01, 0x0000fb02], // KeyG + [0x00000068, 0x00000048, 0x000000cc, 0x000000ce], // KeyH + [0x00000069, 0x00000049, 0x000000ee, 0x000000ef], // KeyI + [0x0000006a, 0x0000004a, 0x000000cf, 0x000000cd], // KeyJ + [0x0000006b, 0x0000004b, 0x000000c8, 0x000000cb], // KeyK + [0x0000006c, 0x0000004c, 0x000000ac, 0x0000007c], // KeyL + [0x0000002c, 0x0000003f, 0x0000221e, 0x000000bf], // KeyM + [0x0000006e, 0x0000004e, 0x01000000, 0x00000131], // KeyN + [0x0000006f, 0x0000004f, 0x00000153, 0x00000152], // KeyO + [0x00000070, 0x00000050, 0x000003c0, 0x0000220f], // KeyP + [0x00000061, 0x00000041, 0x000000e6, 0x000000c6], // KeyQ + [0x00000072, 0x00000052, 0x000000ae, 0x0000201a], // KeyR + [0x00000073, 0x00000053, 0x000000d2, 0x00002211], // KeyS + [0x00000074, 0x00000054, 0x00002020, 0x00002122], // KeyT + [0x00000075, 0x00000055, 0x000000ba, 0x000000aa], // KeyU + [0x00000076, 0x00000056, 0x000025ca, 0x0000221a], // KeyV + [0x0000007a, 0x0000005a, 0x000000c2, 0x000000c5], // KeyW + [0x00000078, 0x00000058, 0x00002248, 0x00002044], // KeyX + [0x00000079, 0x00000059, 0x000000da, 0x00000178], // KeyY + [0x00000077, 0x00000057, 0x00002039, 0x0000203a], // KeyZ + [0x00000026, 0x00000031, 0x0000f8ff, 0x01000000], // Digit1 + [0x000000e9, 0x00000032, 0x000000eb, 0x0000201e], // Digit2 + [0x00000022, 0x00000033, 0x0000201c, 0x0000201d], // Digit3 + [0x00000027, 0x00000034, 0x00002018, 0x00002019], // Digit4 + [0x00000028, 0x00000035, 0x0000007b, 0x0000005b], // Digit5 + [0x000000a7, 0x00000036, 0x000000b6, 0x000000e5], // Digit6 + [0x000000e8, 0x00000037, 0x000000ab, 0x000000bb], // Digit7 + [0x00000021, 0x00000038, 0x000000a1, 0x000000db], // Digit8 + [0x000000e7, 0x00000039, 0x000000c7, 0x000000c1], // Digit9 + [0x000000e0, 0x00000030, 0x000000f8, 0x000000d8], // Digit0 + [0x00000029, 0x000000b0, 0x0000007d, 0x0000005d], // Minus + [0x0000002d, 0x0000005f, 0x00002014, 0x00002013], // Equal + [0x01000000, 0x01000000, 0x000000f4, 0x000000d4], // BracketLeft + [0x00000024, 0x0000002a, 0x000020ac, 0x000000a5], // BracketRight + [0x01000000, 0x000000a3, 0x00000040, 0x00000023], // Backslash + [0x0000006d, 0x0000004d, 0x000000b5, 0x000000d3], // Semicolon + [0x000000f9, 0x00000025, 0x000000d9, 0x00002030], // Quote + [0x0000003c, 0x0000003e, 0x00002264, 0x00002265], // Backquote + [0x0000003b, 0x0000002e, 0x00002026, 0x00002022], // Comma + [0x0000003a, 0x0000002f, 0x000000f7, 0x0000005c], // Period + [0x0000003d, 0x0000002b, 0x00002260, 0x000000b1], // Slash + ], + ), + + LayoutInfo( + name: 'fr', + platform: LayoutPlatform.linux, + mapping: >[ + [0x00000071, 0x00000051, 0x00000040, 0x000003a9], // KeyA + [0x00000062, 0x00000042, 0x0000201d, 0x00002019], // KeyB + [0x00000063, 0x00000043, 0x000000a2, 0x000000a9], // KeyC + [0x00000064, 0x00000044, 0x000000f0, 0x000000d0], // KeyD + [0x00000065, 0x00000045, 0x000020ac, 0x000000a2], // KeyE + [0x00000066, 0x00000046, 0x00000111, 0x000000aa], // KeyF + [0x00000067, 0x00000047, 0x0000014b, 0x0000014a], // KeyG + [0x00000068, 0x00000048, 0x00000127, 0x00000126], // KeyH + [0x00000069, 0x00000049, 0x00002192, 0x00000131], // KeyI + [0x0000006a, 0x0000004a, 0x00000309, 0x0000031b], // KeyJ + [0x0000006b, 0x0000004b, 0x00000138, 0x00000026], // KeyK + [0x0000006c, 0x0000004c, 0x00000142, 0x00000141], // KeyL + [0x0000002c, 0x0000003f, 0x00000301, 0x0000030b], // KeyM + [0x0000006e, 0x0000004e, 0x0000006e, 0x0000004e], // KeyN + [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO + [0x00000070, 0x00000050, 0x000000fe, 0x000000de], // KeyP + [0x00000061, 0x00000041, 0x000000e6, 0x000000c6], // KeyQ + [0x00000072, 0x00000052, 0x000000b6, 0x000000ae], // KeyR + [0x00000073, 0x00000053, 0x000000df, 0x000000a7], // KeyS + [0x00000074, 0x00000054, 0x00000167, 0x00000166], // KeyT + [0x00000075, 0x00000055, 0x00002193, 0x00002191], // KeyU + [0x00000076, 0x00000056, 0x0000201c, 0x00002018], // KeyV + [0x0000007a, 0x0000005a, 0x000000ab, 0x0000003c], // KeyW + [0x00000078, 0x00000058, 0x000000bb, 0x0000003e], // KeyX + [0x00000079, 0x00000059, 0x00002190, 0x000000a5], // KeyY + [0x00000077, 0x00000057, 0x00000142, 0x00000141], // KeyZ + [0x00000026, 0x00000031, 0x000000b9, 0x000000a1], // Digit1 + [0x000000e9, 0x00000032, 0x0000007e, 0x0000215b], // Digit2 + [0x00000022, 0x00000033, 0x00000023, 0x000000a3], // Digit3 + [0x00000027, 0x00000034, 0x0000007b, 0x00000024], // Digit4 + [0x00000028, 0x00000035, 0x0000005b, 0x0000215c], // Digit5 + [0x0000002d, 0x00000036, 0x0000007c, 0x0000215d], // Digit6 + [0x000000e8, 0x00000037, 0x00000060, 0x0000215e], // Digit7 + [0x0000005f, 0x00000038, 0x0000005c, 0x00002122], // Digit8 + [0x000000e7, 0x00000039, 0x0000005e, 0x000000b1], // Digit9 + [0x000000e0, 0x00000030, 0x00000040, 0x000000b0], // Digit0 + [0x00000029, 0x000000b0, 0x0000005d, 0x000000bf], // Minus + [0x0000003d, 0x0000002b, 0x0000007d, 0x00000328], // Equal + [0x00000302, 0x00000308, 0x00000308, 0x0000030a], // BracketLeft + [0x00000024, 0x000000a3, 0x000000a4, 0x00000304], // BracketRight + [0x0000002a, 0x000000b5, 0x00000300, 0x00000306], // Backslash + [0x0000006d, 0x0000004d, 0x000000b5, 0x000000ba], // Semicolon + [0x000000f9, 0x00000025, 0x00000302, 0x0000030c], // Quote + [0x000000b2, 0x0000007e, 0x000000ac, 0x000000ac], // Backquote + [0x0000003b, 0x0000002e, 0x00002500, 0x000000d7], // Comma + [0x0000003a, 0x0000002f, 0x000000b7, 0x000000f7], // Period + [0x00000021, 0x000000a7, 0x00000323, 0x00000307], // Slash + ], + ), + + LayoutInfo( + name: 'fr', + platform: LayoutPlatform.win, + mapping: >[ + [0x00000071, 0x00000051, 0x01000000, 0x01000000], // KeyA + [0x00000062, 0x00000042, 0x01000000, 0x01000000], // KeyB + [0x00000063, 0x00000043, 0x01000000, 0x01000000], // KeyC + [0x00000064, 0x00000044, 0x01000000, 0x01000000], // KeyD + [0x00000065, 0x00000045, 0x000020ac, 0x01000000], // KeyE + [0x00000066, 0x00000046, 0x01000000, 0x01000000], // KeyF + [0x00000067, 0x00000047, 0x01000000, 0x01000000], // KeyG + [0x00000068, 0x00000048, 0x01000000, 0x01000000], // KeyH + [0x00000069, 0x00000049, 0x01000000, 0x01000000], // KeyI + [0x0000006a, 0x0000004a, 0x01000000, 0x01000000], // KeyJ + [0x0000006b, 0x0000004b, 0x01000000, 0x01000000], // KeyK + [0x0000006c, 0x0000004c, 0x01000000, 0x01000000], // KeyL + [0x0000002c, 0x0000003f, 0x01000000, 0x01000000], // KeyM + [0x0000006e, 0x0000004e, 0x01000000, 0x01000000], // KeyN + [0x0000006f, 0x0000004f, 0x01000000, 0x01000000], // KeyO + [0x00000070, 0x00000050, 0x01000000, 0x01000000], // KeyP + [0x00000061, 0x00000041, 0x01000000, 0x01000000], // KeyQ + [0x00000072, 0x00000052, 0x01000000, 0x01000000], // KeyR + [0x00000073, 0x00000053, 0x01000000, 0x01000000], // KeyS + [0x00000074, 0x00000054, 0x01000000, 0x01000000], // KeyT + [0x00000075, 0x00000055, 0x01000000, 0x01000000], // KeyU + [0x00000076, 0x00000056, 0x01000000, 0x01000000], // KeyV + [0x0000007a, 0x0000005a, 0x01000000, 0x01000000], // KeyW + [0x00000078, 0x00000058, 0x01000000, 0x01000000], // KeyX + [0x00000079, 0x00000059, 0x01000000, 0x01000000], // KeyY + [0x00000077, 0x00000057, 0x01000000, 0x01000000], // KeyZ + [0x00000026, 0x00000031, 0x01000000, 0x01000000], // Digit1 + [0x000000e9, 0x00000032, 0x0000007e, 0x01000000], // Digit2 + [0x00000022, 0x00000033, 0x00000023, 0x01000000], // Digit3 + [0x00000027, 0x00000034, 0x0000007b, 0x01000000], // Digit4 + [0x00000028, 0x00000035, 0x0000005b, 0x01000000], // Digit5 + [0x0000002d, 0x00000036, 0x0000007c, 0x01000000], // Digit6 + [0x000000e8, 0x00000037, 0x00000060, 0x01000000], // Digit7 + [0x0000005f, 0x00000038, 0x0000005c, 0x01000000], // Digit8 + [0x000000e7, 0x00000039, 0x0000005e, 0x01000000], // Digit9 + [0x000000e0, 0x00000030, 0x00000040, 0x01000000], // Digit0 + [0x00000029, 0x000000b0, 0x0000005d, 0x01000000], // Minus + [0x0000003d, 0x0000002b, 0x0000007d, 0x01000000], // Equal + [0x0000005e, 0x000000a8, 0x01000000, 0x01000000], // BracketLeft + [0x00000024, 0x000000a3, 0x000000a4, 0x01000000], // BracketRight + [0x0000002a, 0x000000b5, 0x01000000, 0x01000000], // Backslash + [0x0000006d, 0x0000004d, 0x01000000, 0x01000000], // Semicolon + [0x000000f9, 0x00000025, 0x01000000, 0x01000000], // Quote + [0x000000b2, 0x01000000, 0x01000000, 0x01000000], // Backquote + [0x0000003b, 0x0000002e, 0x01000000, 0x01000000], // Comma + [0x0000003a, 0x0000002f, 0x01000000, 0x01000000], // Period + [0x00000021, 0x000000a7, 0x01000000, 0x01000000], // Slash + ], + ), + + LayoutInfo( + name: 'hu', + platform: LayoutPlatform.win, + mapping: >[ + [0x00000061, 0x00000041, 0x000000e4, 0x01000000], // KeyA + [0x00000062, 0x00000042, 0x0000007b, 0x01000000], // KeyB + [0x00000063, 0x00000043, 0x00000026, 0x01000000], // KeyC + [0x00000064, 0x00000044, 0x00000110, 0x01000000], // KeyD + [0x00000065, 0x00000045, 0x000000c4, 0x01000000], // KeyE + [0x00000066, 0x00000046, 0x0000005b, 0x01000000], // KeyF + [0x00000067, 0x00000047, 0x0000005d, 0x01000000], // KeyG + [0x00000068, 0x00000048, 0x01000000, 0x01000000], // KeyH + [0x00000069, 0x00000049, 0x000000cd, 0x01000000], // KeyI + [0x0000006a, 0x0000004a, 0x000000ed, 0x01000000], // KeyJ + [0x0000006b, 0x0000004b, 0x00000142, 0x01000000], // KeyK + [0x0000006c, 0x0000004c, 0x00000141, 0x01000000], // KeyL + [0x0000006d, 0x0000004d, 0x0000003c, 0x01000000], // KeyM + [0x0000006e, 0x0000004e, 0x0000007d, 0x01000000], // KeyN + [0x0000006f, 0x0000004f, 0x01000000, 0x01000000], // KeyO + [0x00000070, 0x00000050, 0x01000000, 0x01000000], // KeyP + [0x00000071, 0x00000051, 0x0000005c, 0x01000000], // KeyQ + [0x00000072, 0x00000052, 0x01000000, 0x01000000], // KeyR + [0x00000073, 0x00000053, 0x00000111, 0x01000000], // KeyS + [0x00000074, 0x00000054, 0x01000000, 0x01000000], // KeyT + [0x00000075, 0x00000055, 0x000020ac, 0x01000000], // KeyU + [0x00000076, 0x00000056, 0x00000040, 0x01000000], // KeyV + [0x00000077, 0x00000057, 0x0000007c, 0x01000000], // KeyW + [0x00000078, 0x00000058, 0x00000023, 0x01000000], // KeyX + [0x0000007a, 0x0000005a, 0x01000000, 0x01000000], // KeyY + [0x00000079, 0x00000059, 0x0000003e, 0x01000000], // KeyZ + [0x00000031, 0x00000027, 0x0000007e, 0x01000000], // Digit1 + [0x00000032, 0x00000022, 0x000002c7, 0x01000000], // Digit2 + [0x00000033, 0x0000002b, 0x0000005e, 0x01000000], // Digit3 + [0x00000034, 0x00000021, 0x000002d8, 0x01000000], // Digit4 + [0x00000035, 0x00000025, 0x000000b0, 0x01000000], // Digit5 + [0x00000036, 0x0000002f, 0x000002db, 0x01000000], // Digit6 + [0x00000037, 0x0000003d, 0x00000060, 0x01000000], // Digit7 + [0x00000038, 0x00000028, 0x000002d9, 0x01000000], // Digit8 + [0x00000039, 0x00000029, 0x000000b4, 0x01000000], // Digit9 + [0x000000f6, 0x000000d6, 0x000002dd, 0x01000000], // Digit0 + [0x000000fc, 0x000000dc, 0x000000a8, 0x01000000], // Minus + [0x000000f3, 0x000000d3, 0x000000b8, 0x01000000], // Equal + [0x00000151, 0x00000150, 0x000000f7, 0x01000000], // BracketLeft + [0x000000fa, 0x000000da, 0x000000d7, 0x01000000], // BracketRight + [0x00000171, 0x00000170, 0x000000a4, 0x01000000], // Backslash + [0x000000e9, 0x000000c9, 0x00000024, 0x01000000], // Semicolon + [0x000000e1, 0x000000c1, 0x000000df, 0x01000000], // Quote + [0x00000030, 0x000000a7, 0x01000000, 0x01000000], // Backquote + [0x0000002c, 0x0000003f, 0x0000003b, 0x01000000], // Comma + [0x0000002e, 0x0000003a, 0x0000003e, 0x01000000], // Period + [0x0000002d, 0x0000005f, 0x0000002a, 0x01000000], // Slash + ], + ), + + LayoutInfo( + name: 'it', + platform: LayoutPlatform.darwin, + mapping: >[ + [0x00000061, 0x00000041, 0x000000e5, 0x000000c5], // KeyA + [0x00000062, 0x00000042, 0x0000222b, 0x000000cd], // KeyB + [0x00000063, 0x00000043, 0x000000a9, 0x000000c1], // KeyC + [0x00000064, 0x00000044, 0x00002202, 0x000002d8], // KeyD + [0x00000065, 0x00000045, 0x000020ac, 0x000000c8], // KeyE + [0x00000066, 0x00000046, 0x00000192, 0x000002d9], // KeyF + [0x00000067, 0x00000047, 0x0000221e, 0x000002da], // KeyG + [0x00000068, 0x00000048, 0x00002206, 0x000000b8], // KeyH + [0x00000069, 0x00000049, 0x00000153, 0x00000152], // KeyI + [0x0000006a, 0x0000004a, 0x000000aa, 0x000002dd], // KeyJ + [0x0000006b, 0x0000004b, 0x000000ba, 0x000002db], // KeyK + [0x0000006c, 0x0000004c, 0x000000ac, 0x000002c7], // KeyL + [0x0000006d, 0x0000004d, 0x000000b5, 0x000000da], // KeyM + [0x0000006e, 0x0000004e, 0x01000000, 0x000000d3], // KeyN + [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO + [0x00000070, 0x00000050, 0x000003c0, 0x0000220f], // KeyP + [0x00000071, 0x00000051, 0x0000201e, 0x0000201a], // KeyQ + [0x00000072, 0x00000052, 0x000000ae, 0x000000cc], // KeyR + [0x00000073, 0x00000053, 0x000000df, 0x000000af], // KeyS + [0x00000074, 0x00000054, 0x00002122, 0x000000d2], // KeyT + [0x00000075, 0x00000055, 0x01000000, 0x000000d9], // KeyU + [0x00000076, 0x00000056, 0x0000221a, 0x000000c9], // KeyV + [0x00000077, 0x00000057, 0x000003a9, 0x000000c0], // KeyW + [0x00000078, 0x00000058, 0x00002020, 0x00002021], // KeyX + [0x00000079, 0x00000059, 0x000000e6, 0x000000c6], // KeyY + [0x0000007a, 0x0000005a, 0x00002211, 0x00000020], // KeyZ + [0x00000031, 0x00000021, 0x000000ab, 0x000000bb], // Digit1 + [0x00000032, 0x00000022, 0x0000201c, 0x0000201d], // Digit2 + [0x00000033, 0x000000a3, 0x00002018, 0x00002019], // Digit3 + [0x00000034, 0x00000024, 0x000000a5, 0x000000a2], // Digit4 + [0x00000035, 0x00000025, 0x0000007e, 0x00002030], // Digit5 + [0x00000036, 0x00000026, 0x00002039, 0x0000203a], // Digit6 + [0x00000037, 0x0000002f, 0x000000f7, 0x00002044], // Digit7 + [0x00000038, 0x00000028, 0x01000000, 0x0000f8ff], // Digit8 + [0x00000039, 0x00000029, 0x01000000, 0x00000020], // Digit9 + [0x00000030, 0x0000003d, 0x00002260, 0x00002248], // Digit0 + [0x00000027, 0x0000003f, 0x000000a1, 0x000000bf], // Minus + [0x000000ec, 0x0000005e, 0x01000000, 0x000000b1], // Equal + [0x000000e8, 0x000000e9, 0x0000005b, 0x0000007b], // BracketLeft + [0x0000002b, 0x0000002a, 0x0000005d, 0x0000007d], // BracketRight + [0x000000f9, 0x000000a7, 0x000000b6, 0x000025ca], // Backslash + [0x000000f2, 0x000000e7, 0x00000040, 0x000000c7], // Semicolon + [0x000000e0, 0x000000b0, 0x00000023, 0x0000221e], // Quote + [0x0000003c, 0x0000003e, 0x00002264, 0x00002265], // Backquote + [0x0000002c, 0x0000003b, 0x00002026, 0x00000020], // Comma + [0x0000002e, 0x0000003a, 0x00002022, 0x000000b7], // Period + [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Slash + ], + ), + + LayoutInfo( + name: 'it', + platform: LayoutPlatform.win, + mapping: >[ + [0x00000061, 0x00000041, 0x01000000, 0x01000000], // KeyA + [0x00000062, 0x00000042, 0x01000000, 0x01000000], // KeyB + [0x00000063, 0x00000043, 0x01000000, 0x01000000], // KeyC + [0x00000064, 0x00000044, 0x01000000, 0x01000000], // KeyD + [0x00000065, 0x00000045, 0x000020ac, 0x01000000], // KeyE + [0x00000066, 0x00000046, 0x01000000, 0x01000000], // KeyF + [0x00000067, 0x00000047, 0x01000000, 0x01000000], // KeyG + [0x00000068, 0x00000048, 0x01000000, 0x01000000], // KeyH + [0x00000069, 0x00000049, 0x01000000, 0x01000000], // KeyI + [0x0000006a, 0x0000004a, 0x01000000, 0x01000000], // KeyJ + [0x0000006b, 0x0000004b, 0x01000000, 0x01000000], // KeyK + [0x0000006c, 0x0000004c, 0x01000000, 0x01000000], // KeyL + [0x0000006d, 0x0000004d, 0x01000000, 0x01000000], // KeyM + [0x0000006e, 0x0000004e, 0x01000000, 0x01000000], // KeyN + [0x0000006f, 0x0000004f, 0x01000000, 0x01000000], // KeyO + [0x00000070, 0x00000050, 0x01000000, 0x01000000], // KeyP + [0x00000071, 0x00000051, 0x01000000, 0x01000000], // KeyQ + [0x00000072, 0x00000052, 0x01000000, 0x01000000], // KeyR + [0x00000073, 0x00000053, 0x01000000, 0x01000000], // KeyS + [0x00000074, 0x00000054, 0x01000000, 0x01000000], // KeyT + [0x00000075, 0x00000055, 0x01000000, 0x01000000], // KeyU + [0x00000076, 0x00000056, 0x01000000, 0x01000000], // KeyV + [0x00000077, 0x00000057, 0x01000000, 0x01000000], // KeyW + [0x00000078, 0x00000058, 0x01000000, 0x01000000], // KeyX + [0x00000079, 0x00000059, 0x01000000, 0x01000000], // KeyY + [0x0000007a, 0x0000005a, 0x01000000, 0x01000000], // KeyZ + [0x00000031, 0x00000021, 0x01000000, 0x01000000], // Digit1 + [0x00000032, 0x00000022, 0x01000000, 0x01000000], // Digit2 + [0x00000033, 0x000000a3, 0x01000000, 0x01000000], // Digit3 + [0x00000034, 0x00000024, 0x01000000, 0x01000000], // Digit4 + [0x00000035, 0x00000025, 0x000020ac, 0x01000000], // Digit5 + [0x00000036, 0x00000026, 0x01000000, 0x01000000], // Digit6 + [0x00000037, 0x0000002f, 0x01000000, 0x01000000], // Digit7 + [0x00000038, 0x00000028, 0x01000000, 0x01000000], // Digit8 + [0x00000039, 0x00000029, 0x01000000, 0x01000000], // Digit9 + [0x00000030, 0x0000003d, 0x01000000, 0x01000000], // Digit0 + [0x00000027, 0x0000003f, 0x01000000, 0x01000000], // Minus + [0x000000ec, 0x0000005e, 0x01000000, 0x01000000], // Equal + [0x000000e8, 0x000000e9, 0x0000005b, 0x0000007b], // BracketLeft + [0x0000002b, 0x0000002a, 0x0000005d, 0x0000007d], // BracketRight + [0x000000f9, 0x000000a7, 0x01000000, 0x01000000], // Backslash + [0x000000f2, 0x000000e7, 0x00000040, 0x01000000], // Semicolon + [0x000000e0, 0x000000b0, 0x00000023, 0x01000000], // Quote + [0x0000005c, 0x0000007c, 0x01000000, 0x01000000], // Backquote + [0x0000002c, 0x0000003b, 0x01000000, 0x01000000], // Comma + [0x0000002e, 0x0000003a, 0x01000000, 0x01000000], // Period + [0x0000002d, 0x0000005f, 0x01000000, 0x01000000], // Slash + ], + ), + + LayoutInfo( + name: 'jp-roman', + platform: LayoutPlatform.darwin, + mapping: >[ + [0x00000061, 0x00000041, 0x01000000, 0x00000304], // KeyA + [0x00000062, 0x00000042, 0x01000000, 0x00000306], // KeyB + [0x00000063, 0x00000043, 0x01000000, 0x00000327], // KeyC + [0x00000064, 0x00000044, 0x000000f0, 0x000000d0], // KeyD + [0x00000065, 0x00000045, 0x01000000, 0x00000301], // KeyE + [0x00000066, 0x00000046, 0x00000192, 0x01000000], // KeyF + [0x00000067, 0x00000047, 0x000000a9, 0x01000000], // KeyG + [0x00000068, 0x00000048, 0x01000000, 0x00000331], // KeyH + [0x00000069, 0x00000049, 0x01000000, 0x0000031b], // KeyI + [0x0000006a, 0x0000004a, 0x01000000, 0x0000030b], // KeyJ + [0x0000006b, 0x0000004b, 0x01000000, 0x0000030a], // KeyK + [0x0000006c, 0x0000004c, 0x01000000, 0x00000335], // KeyL + [0x0000006d, 0x0000004d, 0x01000000, 0x00000328], // KeyM + [0x0000006e, 0x0000004e, 0x01000000, 0x00000303], // KeyN + [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO + [0x00000070, 0x00000050, 0x01000000, 0x00000326], // KeyP + [0x00000071, 0x00000051, 0x00000153, 0x00000152], // KeyQ + [0x00000072, 0x00000052, 0x000000ae, 0x00002030], // KeyR + [0x00000073, 0x00000053, 0x000000df, 0x01000000], // KeyS + [0x00000074, 0x00000054, 0x000000fe, 0x000000de], // KeyT + [0x00000075, 0x00000055, 0x01000000, 0x00000308], // KeyU + [0x00000076, 0x00000056, 0x01000000, 0x0000030c], // KeyV + [0x00000077, 0x00000057, 0x01000000, 0x00000307], // KeyW + [0x00000078, 0x00000058, 0x01000000, 0x00000323], // KeyX + [0x00000079, 0x00000059, 0x000000a5, 0x01000000], // KeyY + [0x0000007a, 0x0000005a, 0x01000000, 0x00000309], // KeyZ + [0x00000031, 0x00000021, 0x000000a1, 0x00002044], // Digit1 + [0x00000032, 0x00000040, 0x00002122, 0x000020ac], // Digit2 + [0x00000033, 0x00000023, 0x000000a3, 0x00002039], // Digit3 + [0x00000034, 0x00000024, 0x000000a2, 0x0000203a], // Digit4 + [0x00000035, 0x00000025, 0x000000a7, 0x00002020], // Digit5 + [0x00000036, 0x0000005e, 0x01000000, 0x00000302], // Digit6 + [0x00000037, 0x00000026, 0x000000b6, 0x00002021], // Digit7 + [0x00000038, 0x0000002a, 0x00002022, 0x000000b0], // Digit8 + [0x00000039, 0x00000028, 0x000000aa, 0x000000b7], // Digit9 + [0x00000030, 0x00000029, 0x000000ba, 0x0000201a], // Digit0 + [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Minus + [0x0000003d, 0x0000002b, 0x00002260, 0x000000b1], // Equal + [0x0000005b, 0x0000007b, 0x0000201c, 0x0000201d], // BracketLeft + [0x0000005d, 0x0000007d, 0x00002018, 0x00002019], // BracketRight + [0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb], // Backslash + [0x0000003b, 0x0000003a, 0x00002026, 0x01000000], // Semicolon + [0x00000027, 0x00000022, 0x000000e6, 0x000000c6], // Quote + [0x00000060, 0x0000007e, 0x01000000, 0x00000300], // Backquote + [0x0000002c, 0x0000003c, 0x00002264, 0x0000201e], // Comma + [0x0000002e, 0x0000003e, 0x00002265, 0x01000000], // Period + [0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf], // Slash + ], + ), + + LayoutInfo( + name: 'jp', + platform: LayoutPlatform.darwin, + mapping: >[ + [0x00000061, 0x00000041, 0x000000e5, 0x000000c5], // KeyA + [0x00000062, 0x00000042, 0x0000222b, 0x00000131], // KeyB + [0x00000063, 0x00000043, 0x000000e7, 0x000000c7], // KeyC + [0x00000064, 0x00000044, 0x00002202, 0x000000ce], // KeyD + [0x00000065, 0x00000045, 0x01000000, 0x000000b4], // KeyE + [0x00000066, 0x00000046, 0x00000192, 0x000000cf], // KeyF + [0x00000067, 0x00000047, 0x000000a9, 0x000002dd], // KeyG + [0x00000068, 0x00000048, 0x000002d9, 0x000000d3], // KeyH + [0x00000069, 0x00000049, 0x01000000, 0x000002c6], // KeyI + [0x0000006a, 0x0000004a, 0x00002206, 0x000000d4], // KeyJ + [0x0000006b, 0x0000004b, 0x000002da, 0x0000f8ff], // KeyK + [0x0000006c, 0x0000004c, 0x000000ac, 0x000000d2], // KeyL + [0x0000006d, 0x0000004d, 0x000000b5, 0x000000c2], // KeyM + [0x0000006e, 0x0000004e, 0x01000000, 0x000002dc], // KeyN + [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO + [0x00000070, 0x00000050, 0x000003c0, 0x0000220f], // KeyP + [0x00000071, 0x00000051, 0x00000153, 0x00000152], // KeyQ + [0x00000072, 0x00000052, 0x000000ae, 0x00002030], // KeyR + [0x00000073, 0x00000053, 0x000000df, 0x000000cd], // KeyS + [0x00000074, 0x00000054, 0x00002020, 0x000002c7], // KeyT + [0x00000075, 0x00000055, 0x01000000, 0x000000a8], // KeyU + [0x00000076, 0x00000056, 0x0000221a, 0x000025ca], // KeyV + [0x00000077, 0x00000057, 0x00002211, 0x0000201e], // KeyW + [0x00000078, 0x00000058, 0x00002248, 0x000002db], // KeyX + [0x00000079, 0x00000059, 0x000000a5, 0x000000c1], // KeyY + [0x0000007a, 0x0000005a, 0x000003a9, 0x000000b8], // KeyZ + [0x00000031, 0x00000021, 0x000000a1, 0x00002044], // Digit1 + [0x00000032, 0x00000040, 0x00002122, 0x000020ac], // Digit2 + [0x00000033, 0x00000023, 0x000000a3, 0x00002039], // Digit3 + [0x00000034, 0x00000024, 0x000000a2, 0x0000203a], // Digit4 + [0x00000035, 0x00000025, 0x0000221e, 0x0000fb01], // Digit5 + [0x00000036, 0x0000005e, 0x000000a7, 0x0000fb02], // Digit6 + [0x00000037, 0x00000026, 0x000000b6, 0x00002021], // Digit7 + [0x00000038, 0x0000002a, 0x00002022, 0x000000b0], // Digit8 + [0x00000039, 0x00000028, 0x000000aa, 0x000000b7], // Digit9 + [0x00000030, 0x00000029, 0x000000ba, 0x0000201a], // Digit0 + [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Minus + [0x0000003d, 0x0000002b, 0x00002260, 0x000000b1], // Equal + [0x0000005b, 0x0000007b, 0x0000201c, 0x0000201d], // BracketLeft + [0x0000005d, 0x0000007d, 0x00002018, 0x00002019], // BracketRight + [0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb], // Backslash + [0x0000003b, 0x0000003a, 0x00002026, 0x000000da], // Semicolon + [0x00000027, 0x00000022, 0x000000e6, 0x000000c6], // Quote + [0x00000060, 0x0000007e, 0x01000000, 0x00000060], // Backquote + [0x0000002c, 0x0000003c, 0x00002264, 0x000000af], // Comma + [0x0000002e, 0x0000003e, 0x00002265, 0x000002d8], // Period + [0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf], // Slash + ], + ), + + LayoutInfo( + name: 'ko', + platform: LayoutPlatform.darwin, + mapping: >[ + [0x00003141, 0x00003141, 0x00000061, 0x00000041], // KeyA + [0x00003160, 0x00003160, 0x00000062, 0x00000042], // KeyB + [0x0000314a, 0x0000314a, 0x00000063, 0x00000043], // KeyC + [0x00003147, 0x00003147, 0x00000064, 0x00000044], // KeyD + [0x00003137, 0x00003138, 0x00000065, 0x00000045], // KeyE + [0x00003139, 0x00003139, 0x00000066, 0x00000046], // KeyF + [0x0000314e, 0x0000314e, 0x00000067, 0x00000047], // KeyG + [0x00003157, 0x00003157, 0x00000068, 0x00000048], // KeyH + [0x00003151, 0x00003151, 0x00000069, 0x00000049], // KeyI + [0x00003153, 0x00003153, 0x0000006a, 0x0000004a], // KeyJ + [0x0000314f, 0x0000314f, 0x0000006b, 0x0000004b], // KeyK + [0x00003163, 0x00003163, 0x0000006c, 0x0000004c], // KeyL + [0x00003161, 0x00003161, 0x0000006d, 0x0000004d], // KeyM + [0x0000315c, 0x0000315c, 0x0000006e, 0x0000004e], // KeyN + [0x00003150, 0x00003152, 0x0000006f, 0x0000004f], // KeyO + [0x00003154, 0x00003156, 0x00000070, 0x00000050], // KeyP + [0x00003142, 0x00003143, 0x00000071, 0x00000051], // KeyQ + [0x00003131, 0x00003132, 0x00000072, 0x00000052], // KeyR + [0x00003134, 0x00003134, 0x00000073, 0x00000053], // KeyS + [0x00003145, 0x00003146, 0x00000074, 0x00000054], // KeyT + [0x00003155, 0x00003155, 0x00000075, 0x00000055], // KeyU + [0x0000314d, 0x0000314d, 0x00000076, 0x00000056], // KeyV + [0x00003148, 0x00003149, 0x00000077, 0x00000057], // KeyW + [0x0000314c, 0x0000314c, 0x00000078, 0x00000058], // KeyX + [0x0000315b, 0x0000315b, 0x00000079, 0x00000059], // KeyY + [0x0000314b, 0x0000314b, 0x0000007a, 0x0000005a], // KeyZ + [0x00000031, 0x00000021, 0x00000031, 0x00000021], // Digit1 + [0x00000032, 0x00000040, 0x00000032, 0x00000040], // Digit2 + [0x00000033, 0x00000023, 0x00000033, 0x00000023], // Digit3 + [0x00000034, 0x00000024, 0x00000034, 0x00000024], // Digit4 + [0x00000035, 0x00000025, 0x00000035, 0x00000025], // Digit5 + [0x00000036, 0x0000005e, 0x00000036, 0x0000005e], // Digit6 + [0x00000037, 0x00000026, 0x00000037, 0x00000026], // Digit7 + [0x00000038, 0x0000002a, 0x00000038, 0x0000002a], // Digit8 + [0x00000039, 0x00000028, 0x00000039, 0x00000028], // Digit9 + [0x00000030, 0x00000029, 0x00000030, 0x00000029], // Digit0 + [0x0000002d, 0x0000005f, 0x0000002d, 0x0000005f], // Minus + [0x0000003d, 0x0000002b, 0x0000003d, 0x0000002b], // Equal + [0x0000005b, 0x0000007b, 0x0000005b, 0x0000007b], // BracketLeft + [0x0000005d, 0x0000007d, 0x0000005d, 0x0000007d], // BracketRight + [0x0000005c, 0x0000007c, 0x0000005c, 0x0000007c], // Backslash + [0x0000003b, 0x0000003a, 0x0000003b, 0x0000003a], // Semicolon + [0x00000027, 0x00000022, 0x00000027, 0x00000022], // Quote + [0x000020a9, 0x0000007e, 0x00000060, 0x0000007e], // Backquote + [0x0000002c, 0x0000003c, 0x0000002c, 0x0000003c], // Comma + [0x0000002e, 0x0000003e, 0x0000002e, 0x0000003e], // Period + [0x0000002f, 0x0000003f, 0x0000002f, 0x0000003f], // Slash + ], + ), + + LayoutInfo( + name: 'no', + platform: LayoutPlatform.win, + mapping: >[ + [0x00000061, 0x00000041, 0x01000000, 0x01000000], // KeyA + [0x00000062, 0x00000042, 0x01000000, 0x01000000], // KeyB + [0x00000063, 0x00000043, 0x01000000, 0x01000000], // KeyC + [0x00000064, 0x00000044, 0x01000000, 0x01000000], // KeyD + [0x00000065, 0x00000045, 0x000020ac, 0x01000000], // KeyE + [0x00000066, 0x00000046, 0x01000000, 0x01000000], // KeyF + [0x00000067, 0x00000047, 0x01000000, 0x01000000], // KeyG + [0x00000068, 0x00000048, 0x01000000, 0x01000000], // KeyH + [0x00000069, 0x00000049, 0x01000000, 0x01000000], // KeyI + [0x0000006a, 0x0000004a, 0x01000000, 0x01000000], // KeyJ + [0x0000006b, 0x0000004b, 0x01000000, 0x01000000], // KeyK + [0x0000006c, 0x0000004c, 0x01000000, 0x01000000], // KeyL + [0x0000006d, 0x0000004d, 0x000000b5, 0x01000000], // KeyM + [0x0000006e, 0x0000004e, 0x01000000, 0x01000000], // KeyN + [0x0000006f, 0x0000004f, 0x01000000, 0x01000000], // KeyO + [0x00000070, 0x00000050, 0x01000000, 0x01000000], // KeyP + [0x00000071, 0x00000051, 0x01000000, 0x01000000], // KeyQ + [0x00000072, 0x00000052, 0x01000000, 0x01000000], // KeyR + [0x00000073, 0x00000053, 0x01000000, 0x01000000], // KeyS + [0x00000074, 0x00000054, 0x01000000, 0x01000000], // KeyT + [0x00000075, 0x00000055, 0x01000000, 0x01000000], // KeyU + [0x00000076, 0x00000056, 0x01000000, 0x01000000], // KeyV + [0x00000077, 0x00000057, 0x01000000, 0x01000000], // KeyW + [0x00000078, 0x00000058, 0x01000000, 0x01000000], // KeyX + [0x00000079, 0x00000059, 0x01000000, 0x01000000], // KeyY + [0x0000007a, 0x0000005a, 0x01000000, 0x01000000], // KeyZ + [0x00000031, 0x00000021, 0x01000000, 0x01000000], // Digit1 + [0x00000032, 0x00000022, 0x00000040, 0x01000000], // Digit2 + [0x00000033, 0x00000023, 0x000000a3, 0x01000000], // Digit3 + [0x00000034, 0x000000a4, 0x00000024, 0x01000000], // Digit4 + [0x00000035, 0x00000025, 0x000020ac, 0x01000000], // Digit5 + [0x00000036, 0x00000026, 0x01000000, 0x01000000], // Digit6 + [0x00000037, 0x0000002f, 0x0000007b, 0x01000000], // Digit7 + [0x00000038, 0x00000028, 0x0000005b, 0x01000000], // Digit8 + [0x00000039, 0x00000029, 0x0000005d, 0x01000000], // Digit9 + [0x00000030, 0x0000003d, 0x0000007d, 0x01000000], // Digit0 + [0x0000002b, 0x0000003f, 0x01000000, 0x01000000], // Minus + [0x0000005c, 0x00000060, 0x000000b4, 0x01000000], // Equal + [0x000000e5, 0x000000c5, 0x01000000, 0x01000000], // BracketLeft + [0x000000a8, 0x0000005e, 0x0000007e, 0x01000000], // BracketRight + [0x00000027, 0x0000002a, 0x01000000, 0x01000000], // Backslash + [0x000000f8, 0x000000d8, 0x01000000, 0x01000000], // Semicolon + [0x000000e6, 0x000000c6, 0x01000000, 0x01000000], // Quote + [0x0000007c, 0x000000a7, 0x01000000, 0x01000000], // Backquote + [0x0000002c, 0x0000003b, 0x01000000, 0x01000000], // Comma + [0x0000002e, 0x0000003a, 0x01000000, 0x01000000], // Period + [0x0000002d, 0x0000005f, 0x01000000, 0x01000000], // Slash + ], + ), + + LayoutInfo( + name: 'pl', + platform: LayoutPlatform.darwin, + mapping: >[ + [0x00000061, 0x00000041, 0x00000105, 0x00000104], // KeyA + [0x00000062, 0x00000042, 0x0000013c, 0x00000171], // KeyB + [0x00000063, 0x00000043, 0x00000107, 0x00000106], // KeyC + [0x00000064, 0x00000044, 0x00002202, 0x0000017d], // KeyD + [0x00000065, 0x00000045, 0x00000119, 0x00000118], // KeyE + [0x00000066, 0x00000046, 0x00000144, 0x0000017e], // KeyF + [0x00000067, 0x00000047, 0x000000a9, 0x0000016a], // KeyG + [0x00000068, 0x00000048, 0x00000137, 0x000000d3], // KeyH + [0x00000069, 0x00000049, 0x01000000, 0x00000165], // KeyI + [0x0000006a, 0x0000004a, 0x00002206, 0x000000d4], // KeyJ + [0x0000006b, 0x0000004b, 0x0000017b, 0x0000016b], // KeyK + [0x0000006c, 0x0000004c, 0x00000142, 0x00000141], // KeyL + [0x0000006d, 0x0000004d, 0x00000136, 0x00000173], // KeyM + [0x0000006e, 0x0000004e, 0x00000144, 0x00000143], // KeyN + [0x0000006f, 0x0000004f, 0x000000f3, 0x000000d3], // KeyO + [0x00000070, 0x00000050, 0x0000013b, 0x00000142], // KeyP + [0x00000071, 0x00000051, 0x0000014c, 0x00000151], // KeyQ + [0x00000072, 0x00000052, 0x000000ae, 0x000000a3], // KeyR + [0x00000073, 0x00000053, 0x0000015b, 0x0000015a], // KeyS + [0x00000074, 0x00000054, 0x00002020, 0x0000015b], // KeyT + [0x00000075, 0x00000055, 0x01000000, 0x00000164], // KeyU + [0x00000076, 0x00000056, 0x0000221a, 0x000025ca], // KeyV + [0x00000077, 0x00000057, 0x00002211, 0x0000201e], // KeyW + [0x00000078, 0x00000058, 0x0000017a, 0x00000179], // KeyX + [0x00000079, 0x00000059, 0x0000012b, 0x000000c1], // KeyY + [0x0000007a, 0x0000005a, 0x0000017c, 0x0000017b], // KeyZ + [0x00000031, 0x00000021, 0x00000143, 0x00000155], // Digit1 + [0x00000032, 0x00000040, 0x00002122, 0x00000158], // Digit2 + [0x00000033, 0x00000023, 0x000020ac, 0x00002039], // Digit3 + [0x00000034, 0x00000024, 0x000000df, 0x0000203a], // Digit4 + [0x00000035, 0x00000025, 0x0000012f, 0x00000159], // Digit5 + [0x00000036, 0x0000005e, 0x000000a7, 0x00000156], // Digit6 + [0x00000037, 0x00000026, 0x000000b6, 0x00000157], // Digit7 + [0x00000038, 0x0000002a, 0x00002022, 0x000000b0], // Digit8 + [0x00000039, 0x00000028, 0x0000013d, 0x00000160], // Digit9 + [0x00000030, 0x00000029, 0x0000013e, 0x0000201a], // Digit0 + [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Minus + [0x0000003d, 0x0000002b, 0x00002260, 0x0000012a], // Equal + [0x0000005b, 0x0000007b, 0x0000201e, 0x0000201d], // BracketLeft + [0x0000005d, 0x0000007d, 0x0000201a, 0x00002019], // BracketRight + [0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb], // Backslash + [0x0000003b, 0x0000003a, 0x00002026, 0x000000da], // Semicolon + [0x00000027, 0x00000022, 0x0000013a, 0x00000123], // Quote + [0x00000060, 0x0000007e, 0x01000000, 0x00000154], // Backquote + [0x0000002c, 0x0000003c, 0x00002264, 0x000000dd], // Comma + [0x0000002e, 0x0000003e, 0x00002265, 0x000000fd], // Period + [0x0000002f, 0x0000003f, 0x000000f7, 0x00000146], // Slash + ], + ), + + LayoutInfo( + name: 'pl', + platform: LayoutPlatform.win, + mapping: >[ + [0x00000061, 0x00000041, 0x00000105, 0x00000104], // KeyA + [0x00000062, 0x00000042, 0x01000000, 0x01000000], // KeyB + [0x00000063, 0x00000043, 0x00000107, 0x00000106], // KeyC + [0x00000064, 0x00000044, 0x01000000, 0x01000000], // KeyD + [0x00000065, 0x00000045, 0x00000119, 0x00000118], // KeyE + [0x00000066, 0x00000046, 0x01000000, 0x01000000], // KeyF + [0x00000067, 0x00000047, 0x01000000, 0x01000000], // KeyG + [0x00000068, 0x00000048, 0x01000000, 0x01000000], // KeyH + [0x00000069, 0x00000049, 0x01000000, 0x01000000], // KeyI + [0x0000006a, 0x0000004a, 0x01000000, 0x01000000], // KeyJ + [0x0000006b, 0x0000004b, 0x01000000, 0x01000000], // KeyK + [0x0000006c, 0x0000004c, 0x00000142, 0x00000141], // KeyL + [0x0000006d, 0x0000004d, 0x01000000, 0x01000000], // KeyM + [0x0000006e, 0x0000004e, 0x00000144, 0x00000143], // KeyN + [0x0000006f, 0x0000004f, 0x000000f3, 0x000000d3], // KeyO + [0x00000070, 0x00000050, 0x01000000, 0x01000000], // KeyP + [0x00000071, 0x00000051, 0x01000000, 0x01000000], // KeyQ + [0x00000072, 0x00000052, 0x01000000, 0x01000000], // KeyR + [0x00000073, 0x00000053, 0x0000015b, 0x0000015a], // KeyS + [0x00000074, 0x00000054, 0x01000000, 0x01000000], // KeyT + [0x00000075, 0x00000055, 0x000020ac, 0x01000000], // KeyU + [0x00000076, 0x00000056, 0x01000000, 0x01000000], // KeyV + [0x00000077, 0x00000057, 0x01000000, 0x01000000], // KeyW + [0x00000078, 0x00000058, 0x0000017a, 0x00000179], // KeyX + [0x00000079, 0x00000059, 0x01000000, 0x01000000], // KeyY + [0x0000007a, 0x0000005a, 0x0000017c, 0x0000017b], // KeyZ + [0x00000031, 0x00000021, 0x01000000, 0x01000000], // Digit1 + [0x00000032, 0x00000040, 0x01000000, 0x01000000], // Digit2 + [0x00000033, 0x00000023, 0x01000000, 0x01000000], // Digit3 + [0x00000034, 0x00000024, 0x01000000, 0x01000000], // Digit4 + [0x00000035, 0x00000025, 0x01000000, 0x01000000], // Digit5 + [0x00000036, 0x0000005e, 0x01000000, 0x01000000], // Digit6 + [0x00000037, 0x00000026, 0x01000000, 0x01000000], // Digit7 + [0x00000038, 0x0000002a, 0x01000000, 0x01000000], // Digit8 + [0x00000039, 0x00000028, 0x01000000, 0x01000000], // Digit9 + [0x00000030, 0x00000029, 0x01000000, 0x01000000], // Digit0 + [0x0000002d, 0x0000005f, 0x01000000, 0x01000000], // Minus + [0x0000003d, 0x0000002b, 0x01000000, 0x01000000], // Equal + [0x0000005b, 0x0000007b, 0x01000000, 0x01000000], // BracketLeft + [0x0000005d, 0x0000007d, 0x01000000, 0x01000000], // BracketRight + [0x0000005c, 0x0000007c, 0x01000000, 0x01000000], // Backslash + [0x0000003b, 0x0000003a, 0x01000000, 0x01000000], // Semicolon + [0x00000027, 0x00000022, 0x01000000, 0x01000000], // Quote + [0x00000060, 0x0000007e, 0x01000000, 0x01000000], // Backquote + [0x0000002c, 0x0000003c, 0x01000000, 0x01000000], // Comma + [0x0000002e, 0x0000003e, 0x01000000, 0x01000000], // Period + [0x0000002f, 0x0000003f, 0x01000000, 0x01000000], // Slash + ], + ), + + LayoutInfo( + name: 'pt-br', + platform: LayoutPlatform.win, + mapping: >[ + [0x00000061, 0x00000041, 0x01000000, 0x01000000], // KeyA + [0x00000062, 0x00000042, 0x01000000, 0x01000000], // KeyB + [0x00000063, 0x00000043, 0x000020a2, 0x01000000], // KeyC + [0x00000064, 0x00000044, 0x01000000, 0x01000000], // KeyD + [0x00000065, 0x00000045, 0x000000b0, 0x01000000], // KeyE + [0x00000066, 0x00000046, 0x01000000, 0x01000000], // KeyF + [0x00000067, 0x00000047, 0x01000000, 0x01000000], // KeyG + [0x00000068, 0x00000048, 0x01000000, 0x01000000], // KeyH + [0x00000069, 0x00000049, 0x01000000, 0x01000000], // KeyI + [0x0000006a, 0x0000004a, 0x01000000, 0x01000000], // KeyJ + [0x0000006b, 0x0000004b, 0x01000000, 0x01000000], // KeyK + [0x0000006c, 0x0000004c, 0x01000000, 0x01000000], // KeyL + [0x0000006d, 0x0000004d, 0x01000000, 0x01000000], // KeyM + [0x0000006e, 0x0000004e, 0x01000000, 0x01000000], // KeyN + [0x0000006f, 0x0000004f, 0x01000000, 0x01000000], // KeyO + [0x00000070, 0x00000050, 0x01000000, 0x01000000], // KeyP + [0x00000071, 0x00000051, 0x0000002f, 0x01000000], // KeyQ + [0x00000072, 0x00000052, 0x01000000, 0x01000000], // KeyR + [0x00000073, 0x00000053, 0x01000000, 0x01000000], // KeyS + [0x00000074, 0x00000054, 0x01000000, 0x01000000], // KeyT + [0x00000075, 0x00000055, 0x01000000, 0x01000000], // KeyU + [0x00000076, 0x00000056, 0x01000000, 0x01000000], // KeyV + [0x00000077, 0x00000057, 0x0000003f, 0x01000000], // KeyW + [0x00000078, 0x00000058, 0x01000000, 0x01000000], // KeyX + [0x00000079, 0x00000059, 0x01000000, 0x01000000], // KeyY + [0x0000007a, 0x0000005a, 0x01000000, 0x01000000], // KeyZ + [0x00000031, 0x00000021, 0x000000b9, 0x01000000], // Digit1 + [0x00000032, 0x00000040, 0x000000b2, 0x01000000], // Digit2 + [0x00000033, 0x00000023, 0x000000b3, 0x01000000], // Digit3 + [0x00000034, 0x00000024, 0x000000a3, 0x01000000], // Digit4 + [0x00000035, 0x00000025, 0x000000a2, 0x01000000], // Digit5 + [0x00000036, 0x000000a8, 0x000000ac, 0x01000000], // Digit6 + [0x00000037, 0x00000026, 0x01000000, 0x01000000], // Digit7 + [0x00000038, 0x0000002a, 0x01000000, 0x01000000], // Digit8 + [0x00000039, 0x00000028, 0x01000000, 0x01000000], // Digit9 + [0x00000030, 0x00000029, 0x01000000, 0x01000000], // Digit0 + [0x0000002d, 0x0000005f, 0x01000000, 0x01000000], // Minus + [0x0000003d, 0x0000002b, 0x000000a7, 0x01000000], // Equal + [0x000000b4, 0x00000060, 0x01000000, 0x01000000], // BracketLeft + [0x0000005b, 0x0000007b, 0x000000aa, 0x01000000], // BracketRight + [0x0000005d, 0x0000007d, 0x000000ba, 0x01000000], // Backslash + [0x000000e7, 0x000000c7, 0x01000000, 0x01000000], // Semicolon + [0x0000007e, 0x0000005e, 0x01000000, 0x01000000], // Quote + [0x00000027, 0x00000022, 0x01000000, 0x01000000], // Backquote + [0x0000002c, 0x0000003c, 0x01000000, 0x01000000], // Comma + [0x0000002e, 0x0000003e, 0x01000000, 0x01000000], // Period + [0x0000003b, 0x0000003a, 0x01000000, 0x01000000], // Slash + ], + ), + + LayoutInfo( + name: 'pt', + platform: LayoutPlatform.darwin, + mapping: >[ + [0x00000061, 0x00000041, 0x000000e5, 0x000000c5], // KeyA + [0x00000062, 0x00000042, 0x0000222b, 0x00000131], // KeyB + [0x00000063, 0x00000043, 0x000000e7, 0x000000c7], // KeyC + [0x00000064, 0x00000044, 0x00002202, 0x000000ce], // KeyD + [0x00000065, 0x00000045, 0x01000000, 0x000000b4], // KeyE + [0x00000066, 0x00000046, 0x00000192, 0x000000cf], // KeyF + [0x00000067, 0x00000047, 0x000000a9, 0x000002dd], // KeyG + [0x00000068, 0x00000048, 0x000002d9, 0x000000d3], // KeyH + [0x00000069, 0x00000049, 0x01000000, 0x000002c6], // KeyI + [0x0000006a, 0x0000004a, 0x00002206, 0x000000d4], // KeyJ + [0x0000006b, 0x0000004b, 0x000002da, 0x0000f8ff], // KeyK + [0x0000006c, 0x0000004c, 0x000000ac, 0x000000d2], // KeyL + [0x0000006d, 0x0000004d, 0x000000b5, 0x000000c2], // KeyM + [0x0000006e, 0x0000004e, 0x01000000, 0x000002dc], // KeyN + [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO + [0x00000070, 0x00000050, 0x000003c0, 0x0000220f], // KeyP + [0x00000071, 0x00000051, 0x00000153, 0x00000152], // KeyQ + [0x00000072, 0x00000052, 0x000000ae, 0x00002030], // KeyR + [0x00000073, 0x00000053, 0x000000df, 0x000000cd], // KeyS + [0x00000074, 0x00000054, 0x00002020, 0x000002c7], // KeyT + [0x00000075, 0x00000055, 0x01000000, 0x000000a8], // KeyU + [0x00000076, 0x00000056, 0x0000221a, 0x000025ca], // KeyV + [0x00000077, 0x00000057, 0x00002211, 0x0000201e], // KeyW + [0x00000078, 0x00000058, 0x00002248, 0x000002db], // KeyX + [0x00000079, 0x00000059, 0x000000a5, 0x000000c1], // KeyY + [0x0000007a, 0x0000005a, 0x000003a9, 0x000000b8], // KeyZ + [0x00000031, 0x00000021, 0x000000a1, 0x00002044], // Digit1 + [0x00000032, 0x00000040, 0x00002122, 0x000020ac], // Digit2 + [0x00000033, 0x00000023, 0x000000a3, 0x00002039], // Digit3 + [0x00000034, 0x00000024, 0x000000a2, 0x0000203a], // Digit4 + [0x00000035, 0x00000025, 0x0000221e, 0x0000fb01], // Digit5 + [0x00000036, 0x01000000, 0x000000a7, 0x0000fb02], // Digit6 + [0x00000037, 0x00000026, 0x000000b6, 0x00002021], // Digit7 + [0x00000038, 0x0000002a, 0x00002022, 0x000000b0], // Digit8 + [0x00000039, 0x00000028, 0x000000aa, 0x000000b7], // Digit9 + [0x00000030, 0x00000029, 0x000000ba, 0x0000201a], // Digit0 + [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Minus + [0x0000003d, 0x0000002b, 0x00002260, 0x000000b1], // Equal + [0x0000005b, 0x0000007b, 0x0000201c, 0x0000201d], // BracketLeft + [0x0000005d, 0x0000007d, 0x00002018, 0x00002019], // BracketRight + [0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb], // Backslash + [0x0000003b, 0x0000003a, 0x00002026, 0x000000da], // Semicolon + [0x01000000, 0x01000000, 0x000000e6, 0x000000c6], // Quote + [0x01000000, 0x01000000, 0x01000000, 0x00000060], // Backquote + [0x0000002c, 0x0000003c, 0x00002264, 0x000000af], // Comma + [0x0000002e, 0x0000003e, 0x00002265, 0x000002d8], // Period + [0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf], // Slash + ], + ), + + LayoutInfo( + name: 'pt', + platform: LayoutPlatform.win, + mapping: >[ + [0x00000061, 0x00000041, 0x01000000, 0x01000000], // KeyA + [0x00000062, 0x00000042, 0x01000000, 0x01000000], // KeyB + [0x00000063, 0x00000043, 0x01000000, 0x01000000], // KeyC + [0x00000064, 0x00000044, 0x01000000, 0x01000000], // KeyD + [0x00000065, 0x00000045, 0x000020ac, 0x01000000], // KeyE + [0x00000066, 0x00000046, 0x01000000, 0x01000000], // KeyF + [0x00000067, 0x00000047, 0x01000000, 0x01000000], // KeyG + [0x00000068, 0x00000048, 0x01000000, 0x01000000], // KeyH + [0x00000069, 0x00000049, 0x01000000, 0x01000000], // KeyI + [0x0000006a, 0x0000004a, 0x01000000, 0x01000000], // KeyJ + [0x0000006b, 0x0000004b, 0x01000000, 0x01000000], // KeyK + [0x0000006c, 0x0000004c, 0x01000000, 0x01000000], // KeyL + [0x0000006d, 0x0000004d, 0x01000000, 0x01000000], // KeyM + [0x0000006e, 0x0000004e, 0x01000000, 0x01000000], // KeyN + [0x0000006f, 0x0000004f, 0x01000000, 0x01000000], // KeyO + [0x00000070, 0x00000050, 0x01000000, 0x01000000], // KeyP + [0x00000071, 0x00000051, 0x01000000, 0x01000000], // KeyQ + [0x00000072, 0x00000052, 0x01000000, 0x01000000], // KeyR + [0x00000073, 0x00000053, 0x01000000, 0x01000000], // KeyS + [0x00000074, 0x00000054, 0x01000000, 0x01000000], // KeyT + [0x00000075, 0x00000055, 0x01000000, 0x01000000], // KeyU + [0x00000076, 0x00000056, 0x01000000, 0x01000000], // KeyV + [0x00000077, 0x00000057, 0x01000000, 0x01000000], // KeyW + [0x00000078, 0x00000058, 0x01000000, 0x01000000], // KeyX + [0x00000079, 0x00000059, 0x01000000, 0x01000000], // KeyY + [0x0000007a, 0x0000005a, 0x01000000, 0x01000000], // KeyZ + [0x00000031, 0x00000021, 0x01000000, 0x01000000], // Digit1 + [0x00000032, 0x00000022, 0x00000040, 0x01000000], // Digit2 + [0x00000033, 0x00000023, 0x000000a3, 0x01000000], // Digit3 + [0x00000034, 0x00000024, 0x000000a7, 0x01000000], // Digit4 + [0x00000035, 0x00000025, 0x000020ac, 0x01000000], // Digit5 + [0x00000036, 0x00000026, 0x01000000, 0x01000000], // Digit6 + [0x00000037, 0x0000002f, 0x0000007b, 0x01000000], // Digit7 + [0x00000038, 0x00000028, 0x0000005b, 0x01000000], // Digit8 + [0x00000039, 0x00000029, 0x0000005d, 0x01000000], // Digit9 + [0x00000030, 0x0000003d, 0x0000007d, 0x01000000], // Digit0 + [0x00000027, 0x0000003f, 0x01000000, 0x01000000], // Minus + [0x000000ab, 0x000000bb, 0x01000000, 0x01000000], // Equal + [0x0000002b, 0x0000002a, 0x000000a8, 0x01000000], // BracketLeft + [0x000000b4, 0x00000060, 0x0000005d, 0x01000000], // BracketRight + [0x0000007e, 0x0000005e, 0x01000000, 0x01000000], // Backslash + [0x000000e7, 0x000000c7, 0x01000000, 0x01000000], // Semicolon + [0x000000ba, 0x000000aa, 0x01000000, 0x01000000], // Quote + [0x0000005c, 0x0000007c, 0x01000000, 0x01000000], // Backquote + [0x0000002c, 0x0000003b, 0x01000000, 0x01000000], // Comma + [0x0000002e, 0x0000003a, 0x01000000, 0x01000000], // Period + [0x0000002d, 0x0000005f, 0x01000000, 0x01000000], // Slash + ], + ), + + LayoutInfo( + name: 'ru', + platform: LayoutPlatform.darwin, + mapping: >[ + [0x00000444, 0x00000424, 0x00000192, 0x00000192], // KeyA + [0x00000438, 0x00000418, 0x00000438, 0x00000418], // KeyB + [0x00000441, 0x00000421, 0x00002260, 0x00002260], // KeyC + [0x00000432, 0x00000412, 0x0000045b, 0x0000040b], // KeyD + [0x00000443, 0x00000423, 0x0000045c, 0x0000040c], // KeyE + [0x00000430, 0x00000410, 0x000000f7, 0x000000f7], // KeyF + [0x0000043f, 0x0000041f, 0x000000a9, 0x000000a9], // KeyG + [0x00000440, 0x00000420, 0x000020bd, 0x000020bd], // KeyH + [0x00000448, 0x00000428, 0x00000455, 0x00000405], // KeyI + [0x0000043e, 0x0000041e, 0x000000b0, 0x00002022], // KeyJ + [0x0000043b, 0x0000041b, 0x00000459, 0x00000409], // KeyK + [0x00000434, 0x00000414, 0x00002206, 0x00002206], // KeyL + [0x0000044c, 0x0000042c, 0x0000007e, 0x0000007e], // KeyM + [0x00000442, 0x00000422, 0x00002122, 0x00002122], // KeyN + [0x00000449, 0x00000429, 0x0000045e, 0x0000040e], // KeyO + [0x00000437, 0x00000417, 0x00002018, 0x00002019], // KeyP + [0x00000439, 0x00000419, 0x00000458, 0x00000408], // KeyQ + [0x0000043a, 0x0000041a, 0x000000ae, 0x000000ae], // KeyR + [0x0000044b, 0x0000042b, 0x0000044b, 0x0000042b], // KeyS + [0x00000435, 0x00000415, 0x00002020, 0x00002020], // KeyT + [0x00000433, 0x00000413, 0x00000453, 0x00000403], // KeyU + [0x0000043c, 0x0000041c, 0x000000b5, 0x000000b5], // KeyV + [0x00000446, 0x00000426, 0x0000045f, 0x0000040f], // KeyW + [0x00000447, 0x00000427, 0x00002248, 0x00002248], // KeyX + [0x0000043d, 0x0000041d, 0x0000045a, 0x0000040a], // KeyY + [0x0000044f, 0x0000042f, 0x00000452, 0x00000402], // KeyZ + [0x00000031, 0x00000021, 0x00000021, 0x0000007c], // Digit1 + [0x00000032, 0x00000022, 0x00000040, 0x00000022], // Digit2 + [0x00000033, 0x00002116, 0x00000023, 0x000000a3], // Digit3 + [0x00000034, 0x00000025, 0x00000024, 0x000020ac], // Digit4 + [0x00000035, 0x0000003a, 0x00000025, 0x0000221e], // Digit5 + [0x00000036, 0x0000002c, 0x0000005e, 0x000000ac], // Digit6 + [0x00000037, 0x0000002e, 0x00000026, 0x000000b6], // Digit7 + [0x00000038, 0x0000003b, 0x0000002a, 0x0000221a], // Digit8 + [0x00000039, 0x00000028, 0x0000007b, 0x00000027], // Digit9 + [0x00000030, 0x00000029, 0x0000007d, 0x00000060], // Digit0 + [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Minus + [0x0000003d, 0x0000002b, 0x000000bb, 0x000000ab], // Equal + [0x00000445, 0x00000425, 0x0000201c, 0x0000201d], // BracketLeft + [0x0000044a, 0x0000042a, 0x0000044a, 0x0000042a], // BracketRight + [0x00000451, 0x00000401, 0x00000451, 0x00000401], // Backslash + [0x00000436, 0x00000416, 0x00002026, 0x00002026], // Semicolon + [0x0000044d, 0x0000042d, 0x0000044d, 0x0000042d], // Quote + [0x0000005d, 0x0000005b, 0x0000005d, 0x0000005b], // Backquote + [0x00000431, 0x00000411, 0x00002264, 0x0000003c], // Comma + [0x0000044e, 0x0000042e, 0x00002265, 0x0000003e], // Period + [0x0000002f, 0x0000003f, 0x0000201c, 0x0000201e], // Slash + ], + ), + + LayoutInfo( + name: 'ru', + platform: LayoutPlatform.linux, + mapping: >[ + [0x00000444, 0x00000424, 0x00000444, 0x00000424], // KeyA + [0x00000438, 0x00000418, 0x00000438, 0x00000418], // KeyB + [0x00000441, 0x00000421, 0x00000441, 0x00000421], // KeyC + [0x00000432, 0x00000412, 0x00000432, 0x00000412], // KeyD + [0x00000443, 0x00000423, 0x00000443, 0x00000423], // KeyE + [0x00000430, 0x00000410, 0x00000430, 0x00000410], // KeyF + [0x0000043f, 0x0000041f, 0x0000043f, 0x0000041f], // KeyG + [0x00000440, 0x00000420, 0x00000440, 0x00000420], // KeyH + [0x00000448, 0x00000428, 0x00000448, 0x00000428], // KeyI + [0x0000043e, 0x0000041e, 0x0000043e, 0x0000041e], // KeyJ + [0x0000043b, 0x0000041b, 0x0000043b, 0x0000041b], // KeyK + [0x00000434, 0x00000414, 0x00000434, 0x00000414], // KeyL + [0x0000044c, 0x0000042c, 0x0000044c, 0x0000042c], // KeyM + [0x00000442, 0x00000422, 0x00000442, 0x00000422], // KeyN + [0x00000449, 0x00000429, 0x00000449, 0x00000429], // KeyO + [0x00000437, 0x00000417, 0x00000437, 0x00000417], // KeyP + [0x00000439, 0x00000419, 0x00000439, 0x00000419], // KeyQ + [0x0000043a, 0x0000041a, 0x0000043a, 0x0000041a], // KeyR + [0x0000044b, 0x0000042b, 0x0000044b, 0x0000042b], // KeyS + [0x00000435, 0x00000415, 0x00000435, 0x00000415], // KeyT + [0x00000433, 0x00000413, 0x00000433, 0x00000413], // KeyU + [0x0000043c, 0x0000041c, 0x0000043c, 0x0000041c], // KeyV + [0x00000446, 0x00000426, 0x00000446, 0x00000426], // KeyW + [0x00000447, 0x00000427, 0x00000447, 0x00000427], // KeyX + [0x0000043d, 0x0000041d, 0x0000043d, 0x0000041d], // KeyY + [0x0000044f, 0x0000042f, 0x0000044f, 0x0000042f], // KeyZ + [0x00000031, 0x00000021, 0x00000031, 0x00000021], // Digit1 + [0x00000032, 0x00000022, 0x00000032, 0x00000022], // Digit2 + [0x00000033, 0x00002116, 0x00000033, 0x00002116], // Digit3 + [0x00000034, 0x0000003b, 0x00000034, 0x0000003b], // Digit4 + [0x00000035, 0x00000025, 0x00000035, 0x00000025], // Digit5 + [0x00000036, 0x0000003a, 0x00000036, 0x0000003a], // Digit6 + [0x00000037, 0x0000003f, 0x00000037, 0x0000003f], // Digit7 + [0x00000038, 0x0000002a, 0x000020bd, 0x01000000], // Digit8 + [0x00000039, 0x00000028, 0x00000039, 0x00000028], // Digit9 + [0x00000030, 0x00000029, 0x00000030, 0x00000029], // Digit0 + [0x0000002d, 0x0000005f, 0x0000002d, 0x0000005f], // Minus + [0x0000003d, 0x0000002b, 0x0000003d, 0x0000002b], // Equal + [0x00000445, 0x00000425, 0x00000445, 0x00000425], // BracketLeft + [0x0000044a, 0x0000042a, 0x0000044a, 0x0000042a], // BracketRight + [0x0000005c, 0x0000002f, 0x0000005c, 0x0000002f], // Backslash + [0x00000436, 0x00000416, 0x00000436, 0x00000416], // Semicolon + [0x0000044d, 0x0000042d, 0x0000044d, 0x0000042d], // Quote + [0x00000451, 0x00000401, 0x00000451, 0x00000401], // Backquote + [0x00000431, 0x00000411, 0x00000431, 0x00000411], // Comma + [0x0000044e, 0x0000042e, 0x0000044e, 0x0000042e], // Period + [0x0000002e, 0x0000002c, 0x0000002e, 0x0000002c], // Slash + ], + ), + + LayoutInfo( + name: 'ru', + platform: LayoutPlatform.win, + mapping: >[ + [0x00000444, 0x00000424, 0x01000000, 0x01000000], // KeyA + [0x00000438, 0x00000418, 0x01000000, 0x01000000], // KeyB + [0x00000441, 0x00000421, 0x01000000, 0x01000000], // KeyC + [0x00000432, 0x00000412, 0x01000000, 0x01000000], // KeyD + [0x00000443, 0x00000423, 0x01000000, 0x01000000], // KeyE + [0x00000430, 0x00000410, 0x01000000, 0x01000000], // KeyF + [0x0000043f, 0x0000041f, 0x01000000, 0x01000000], // KeyG + [0x00000440, 0x00000420, 0x01000000, 0x01000000], // KeyH + [0x00000448, 0x00000428, 0x01000000, 0x01000000], // KeyI + [0x0000043e, 0x0000041e, 0x01000000, 0x01000000], // KeyJ + [0x0000043b, 0x0000041b, 0x01000000, 0x01000000], // KeyK + [0x00000434, 0x00000414, 0x01000000, 0x01000000], // KeyL + [0x0000044c, 0x0000042c, 0x01000000, 0x01000000], // KeyM + [0x00000442, 0x00000422, 0x01000000, 0x01000000], // KeyN + [0x00000449, 0x00000429, 0x01000000, 0x01000000], // KeyO + [0x00000437, 0x00000417, 0x01000000, 0x01000000], // KeyP + [0x00000439, 0x00000419, 0x01000000, 0x01000000], // KeyQ + [0x0000043a, 0x0000041a, 0x01000000, 0x01000000], // KeyR + [0x0000044b, 0x0000042b, 0x01000000, 0x01000000], // KeyS + [0x00000435, 0x00000415, 0x01000000, 0x01000000], // KeyT + [0x00000433, 0x00000413, 0x01000000, 0x01000000], // KeyU + [0x0000043c, 0x0000041c, 0x01000000, 0x01000000], // KeyV + [0x00000446, 0x00000426, 0x01000000, 0x01000000], // KeyW + [0x00000447, 0x00000427, 0x01000000, 0x01000000], // KeyX + [0x0000043d, 0x0000041d, 0x01000000, 0x01000000], // KeyY + [0x0000044f, 0x0000042f, 0x01000000, 0x01000000], // KeyZ + [0x00000031, 0x00000021, 0x01000000, 0x01000000], // Digit1 + [0x00000032, 0x00000022, 0x01000000, 0x01000000], // Digit2 + [0x00000033, 0x00002116, 0x01000000, 0x01000000], // Digit3 + [0x00000034, 0x0000003b, 0x01000000, 0x01000000], // Digit4 + [0x00000035, 0x00000025, 0x01000000, 0x01000000], // Digit5 + [0x00000036, 0x0000003a, 0x01000000, 0x01000000], // Digit6 + [0x00000037, 0x0000003f, 0x01000000, 0x01000000], // Digit7 + [0x00000038, 0x0000002a, 0x000020bd, 0x01000000], // Digit8 + [0x00000039, 0x00000028, 0x01000000, 0x01000000], // Digit9 + [0x00000030, 0x00000029, 0x01000000, 0x01000000], // Digit0 + [0x0000002d, 0x0000005f, 0x01000000, 0x01000000], // Minus + [0x0000003d, 0x0000002b, 0x01000000, 0x01000000], // Equal + [0x00000445, 0x00000425, 0x01000000, 0x01000000], // BracketLeft + [0x0000044a, 0x0000042a, 0x01000000, 0x01000000], // BracketRight + [0x0000005c, 0x0000002f, 0x01000000, 0x01000000], // Backslash + [0x00000436, 0x00000416, 0x01000000, 0x01000000], // Semicolon + [0x0000044d, 0x0000042d, 0x01000000, 0x01000000], // Quote + [0x00000451, 0x00000401, 0x01000000, 0x01000000], // Backquote + [0x00000431, 0x00000411, 0x01000000, 0x01000000], // Comma + [0x0000044e, 0x0000042e, 0x01000000, 0x01000000], // Period + [0x0000002e, 0x0000002c, 0x01000000, 0x01000000], // Slash + ], + ), + + LayoutInfo( + name: 'sv', + platform: LayoutPlatform.darwin, + mapping: >[ + [0x00000061, 0x00000041, 0x0000f8ff, 0x000025ca], // KeyA + [0x00000062, 0x00000042, 0x0000203a, 0x000000bb], // KeyB + [0x00000063, 0x00000043, 0x000000e7, 0x000000c7], // KeyC + [0x00000064, 0x00000044, 0x00002202, 0x00002206], // KeyD + [0x00000065, 0x00000045, 0x000000e9, 0x000000c9], // KeyE + [0x00000066, 0x00000046, 0x00000192, 0x0000222b], // KeyF + [0x00000067, 0x00000047, 0x000000b8, 0x000000af], // KeyG + [0x00000068, 0x00000048, 0x000002db, 0x000002d8], // KeyH + [0x00000069, 0x00000049, 0x00000131, 0x000002c6], // KeyI + [0x0000006a, 0x0000004a, 0x0000221a, 0x000000ac], // KeyJ + [0x0000006b, 0x0000004b, 0x000000aa, 0x000000ba], // KeyK + [0x0000006c, 0x0000004c, 0x0000fb01, 0x0000fb02], // KeyL + [0x0000006d, 0x0000004d, 0x00002019, 0x0000201d], // KeyM + [0x0000006e, 0x0000004e, 0x00002018, 0x0000201c], // KeyN + [0x0000006f, 0x0000004f, 0x00000153, 0x00000152], // KeyO + [0x00000070, 0x00000050, 0x000003c0, 0x0000220f], // KeyP + [0x00000071, 0x00000051, 0x00002022, 0x000000b0], // KeyQ + [0x00000072, 0x00000052, 0x000000ae, 0x0000221a], // KeyR + [0x00000073, 0x00000053, 0x000000df, 0x00002211], // KeyS + [0x00000074, 0x00000054, 0x00002020, 0x00002021], // KeyT + [0x00000075, 0x00000055, 0x000000fc, 0x000000dc], // KeyU + [0x00000076, 0x00000056, 0x00002039, 0x000000ab], // KeyV + [0x00000077, 0x00000057, 0x000003a9, 0x000002dd], // KeyW + [0x00000078, 0x00000058, 0x00002248, 0x000002c7], // KeyX + [0x00000079, 0x00000059, 0x000000b5, 0x000002dc], // KeyY + [0x0000007a, 0x0000005a, 0x000000f7, 0x00002044], // KeyZ + [0x00000031, 0x00000021, 0x000000a9, 0x000000a1], // Digit1 + [0x00000032, 0x00000022, 0x00000040, 0x0000201d], // Digit2 + [0x00000033, 0x00000023, 0x000000a3, 0x000000a5], // Digit3 + [0x00000034, 0x000020ac, 0x00000024, 0x000000a2], // Digit4 + [0x00000035, 0x00000025, 0x0000221e, 0x00002030], // Digit5 + [0x00000036, 0x00000026, 0x000000a7, 0x000000b6], // Digit6 + [0x00000037, 0x0000002f, 0x0000007c, 0x0000005c], // Digit7 + [0x00000038, 0x00000028, 0x0000005b, 0x0000007b], // Digit8 + [0x00000039, 0x00000029, 0x0000005d, 0x0000007d], // Digit9 + [0x00000030, 0x0000003d, 0x00002248, 0x00002260], // Digit0 + [0x0000002b, 0x0000003f, 0x000000b1, 0x000000bf], // Minus + [0x01000000, 0x01000000, 0x000000b4, 0x00000060], // Equal + [0x000000e5, 0x000000c5, 0x000002d9, 0x000002da], // BracketLeft + [0x01000000, 0x01000000, 0x01000000, 0x0000005e], // BracketRight + [0x00000027, 0x0000002a, 0x00002122, 0x00002019], // Backslash + [0x000000f6, 0x000000d6, 0x000000f8, 0x000000d8], // Semicolon + [0x000000e4, 0x000000c4, 0x000000e6, 0x000000c6], // Quote + [0x0000003c, 0x0000003e, 0x00002264, 0x00002265], // Backquote + [0x0000002c, 0x0000003b, 0x0000201a, 0x0000201e], // Comma + [0x0000002e, 0x0000003a, 0x00002026, 0x000000b7], // Period + [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Slash + ], + ), + + LayoutInfo( + name: 'sv', + platform: LayoutPlatform.win, + mapping: >[ + [0x00000061, 0x00000041, 0x01000000, 0x01000000], // KeyA + [0x00000062, 0x00000042, 0x01000000, 0x01000000], // KeyB + [0x00000063, 0x00000043, 0x01000000, 0x01000000], // KeyC + [0x00000064, 0x00000044, 0x01000000, 0x01000000], // KeyD + [0x00000065, 0x00000045, 0x000020ac, 0x01000000], // KeyE + [0x00000066, 0x00000046, 0x01000000, 0x01000000], // KeyF + [0x00000067, 0x00000047, 0x01000000, 0x01000000], // KeyG + [0x00000068, 0x00000048, 0x01000000, 0x01000000], // KeyH + [0x00000069, 0x00000049, 0x01000000, 0x01000000], // KeyI + [0x0000006a, 0x0000004a, 0x01000000, 0x01000000], // KeyJ + [0x0000006b, 0x0000004b, 0x01000000, 0x01000000], // KeyK + [0x0000006c, 0x0000004c, 0x01000000, 0x01000000], // KeyL + [0x0000006d, 0x0000004d, 0x000000b5, 0x01000000], // KeyM + [0x0000006e, 0x0000004e, 0x01000000, 0x01000000], // KeyN + [0x0000006f, 0x0000004f, 0x01000000, 0x01000000], // KeyO + [0x00000070, 0x00000050, 0x01000000, 0x01000000], // KeyP + [0x00000071, 0x00000051, 0x01000000, 0x01000000], // KeyQ + [0x00000072, 0x00000052, 0x01000000, 0x01000000], // KeyR + [0x00000073, 0x00000053, 0x01000000, 0x01000000], // KeyS + [0x00000074, 0x00000054, 0x01000000, 0x01000000], // KeyT + [0x00000075, 0x00000055, 0x01000000, 0x01000000], // KeyU + [0x00000076, 0x00000056, 0x01000000, 0x01000000], // KeyV + [0x00000077, 0x00000057, 0x01000000, 0x01000000], // KeyW + [0x00000078, 0x00000058, 0x01000000, 0x01000000], // KeyX + [0x00000079, 0x00000059, 0x01000000, 0x01000000], // KeyY + [0x0000007a, 0x0000005a, 0x01000000, 0x01000000], // KeyZ + [0x00000031, 0x00000021, 0x01000000, 0x01000000], // Digit1 + [0x00000032, 0x00000022, 0x00000040, 0x01000000], // Digit2 + [0x00000033, 0x00000023, 0x000000a3, 0x01000000], // Digit3 + [0x00000034, 0x000000a4, 0x00000024, 0x01000000], // Digit4 + [0x00000035, 0x00000025, 0x000020ac, 0x01000000], // Digit5 + [0x00000036, 0x00000026, 0x01000000, 0x01000000], // Digit6 + [0x00000037, 0x0000002f, 0x0000007b, 0x01000000], // Digit7 + [0x00000038, 0x00000028, 0x0000005b, 0x01000000], // Digit8 + [0x00000039, 0x00000029, 0x0000005d, 0x01000000], // Digit9 + [0x00000030, 0x0000003d, 0x0000007d, 0x01000000], // Digit0 + [0x0000002b, 0x0000003f, 0x0000005c, 0x01000000], // Minus + [0x000000b4, 0x00000060, 0x01000000, 0x01000000], // Equal + [0x000000e5, 0x000000c5, 0x01000000, 0x01000000], // BracketLeft + [0x000000a8, 0x0000005e, 0x0000007e, 0x01000000], // BracketRight + [0x00000027, 0x0000002a, 0x01000000, 0x01000000], // Backslash + [0x000000f6, 0x000000d6, 0x01000000, 0x01000000], // Semicolon + [0x000000e4, 0x000000c4, 0x01000000, 0x01000000], // Quote + [0x000000a7, 0x000000bd, 0x01000000, 0x01000000], // Backquote + [0x0000002c, 0x0000003b, 0x01000000, 0x01000000], // Comma + [0x0000002e, 0x0000003a, 0x01000000, 0x01000000], // Period + [0x0000002d, 0x0000005f, 0x01000000, 0x01000000], // Slash + ], + ), + + LayoutInfo( + name: 'thai', + platform: LayoutPlatform.win, + mapping: >[ + [0x00000e1f, 0x00000e24, 0x01000000, 0x01000000], // KeyA + [0x00000e34, 0x00000e3a, 0x01000000, 0x01000000], // KeyB + [0x00000e41, 0x00000e09, 0x01000000, 0x01000000], // KeyC + [0x00000e01, 0x00000e0f, 0x01000000, 0x01000000], // KeyD + [0x00000e33, 0x00000e0e, 0x01000000, 0x01000000], // KeyE + [0x00000e14, 0x00000e42, 0x01000000, 0x01000000], // KeyF + [0x00000e40, 0x00000e0c, 0x01000000, 0x01000000], // KeyG + [0x00000e49, 0x00000e47, 0x01000000, 0x01000000], // KeyH + [0x00000e23, 0x00000e13, 0x01000000, 0x01000000], // KeyI + [0x00000e48, 0x00000e4b, 0x01000000, 0x01000000], // KeyJ + [0x00000e32, 0x00000e29, 0x01000000, 0x01000000], // KeyK + [0x00000e2a, 0x00000e28, 0x01000000, 0x01000000], // KeyL + [0x00000e17, 0x0000003f, 0x01000000, 0x01000000], // KeyM + [0x00000e37, 0x00000e4c, 0x01000000, 0x01000000], // KeyN + [0x00000e19, 0x00000e2f, 0x01000000, 0x01000000], // KeyO + [0x00000e22, 0x00000e0d, 0x01000000, 0x01000000], // KeyP + [0x00000e46, 0x00000e50, 0x01000000, 0x01000000], // KeyQ + [0x00000e1e, 0x00000e11, 0x01000000, 0x01000000], // KeyR + [0x00000e2b, 0x00000e06, 0x01000000, 0x01000000], // KeyS + [0x00000e30, 0x00000e18, 0x01000000, 0x01000000], // KeyT + [0x00000e35, 0x00000e4a, 0x01000000, 0x01000000], // KeyU + [0x00000e2d, 0x00000e2e, 0x01000000, 0x01000000], // KeyV + [0x00000e44, 0x00000022, 0x01000000, 0x01000000], // KeyW + [0x00000e1b, 0x00000029, 0x01000000, 0x01000000], // KeyX + [0x00000e31, 0x00000e4d, 0x01000000, 0x01000000], // KeyY + [0x00000e1c, 0x00000028, 0x01000000, 0x01000000], // KeyZ + [0x00000e45, 0x0000002b, 0x01000000, 0x01000000], // Digit1 + [0x0000002f, 0x00000e51, 0x01000000, 0x01000000], // Digit2 + [0x0000002d, 0x00000e52, 0x01000000, 0x01000000], // Digit3 + [0x00000e20, 0x00000e53, 0x01000000, 0x01000000], // Digit4 + [0x00000e16, 0x00000e54, 0x01000000, 0x01000000], // Digit5 + [0x00000e38, 0x00000e39, 0x01000000, 0x01000000], // Digit6 + [0x00000e36, 0x00000e3f, 0x01000000, 0x01000000], // Digit7 + [0x00000e04, 0x00000e55, 0x01000000, 0x01000000], // Digit8 + [0x00000e15, 0x00000e56, 0x01000000, 0x01000000], // Digit9 + [0x00000e08, 0x00000e57, 0x01000000, 0x01000000], // Digit0 + [0x00000e02, 0x00000e58, 0x01000000, 0x01000000], // Minus + [0x00000e0a, 0x00000e59, 0x01000000, 0x01000000], // Equal + [0x00000e1a, 0x00000e10, 0x01000000, 0x01000000], // BracketLeft + [0x00000e25, 0x0000002c, 0x01000000, 0x01000000], // BracketRight + [0x00000e03, 0x00000e05, 0x01000000, 0x01000000], // Backslash + [0x00000e27, 0x00000e0b, 0x01000000, 0x01000000], // Semicolon + [0x00000e07, 0x0000002e, 0x01000000, 0x01000000], // Quote + [0x0000005f, 0x00000025, 0x01000000, 0x01000000], // Backquote + [0x00000e21, 0x00000e12, 0x01000000, 0x01000000], // Comma + [0x00000e43, 0x00000e2c, 0x01000000, 0x01000000], // Period + [0x00000e1d, 0x00000e26, 0x01000000, 0x01000000], // Slash + ], + ), + + LayoutInfo( + name: 'tr', + platform: LayoutPlatform.win, + mapping: >[ + [0x00000061, 0x00000041, 0x000000e6, 0x000000c6], // KeyA + [0x00000062, 0x00000042, 0x01000000, 0x01000000], // KeyB + [0x00000063, 0x00000043, 0x01000000, 0x01000000], // KeyC + [0x00000064, 0x00000044, 0x01000000, 0x01000000], // KeyD + [0x00000065, 0x00000045, 0x000020ac, 0x01000000], // KeyE + [0x00000066, 0x00000046, 0x01000000, 0x01000000], // KeyF + [0x00000067, 0x00000047, 0x01000000, 0x01000000], // KeyG + [0x00000068, 0x00000048, 0x01000000, 0x01000000], // KeyH + [0x00000131, 0x00000049, 0x00000069, 0x00000130], // KeyI + [0x0000006a, 0x0000004a, 0x01000000, 0x01000000], // KeyJ + [0x0000006b, 0x0000004b, 0x01000000, 0x01000000], // KeyK + [0x0000006c, 0x0000004c, 0x01000000, 0x01000000], // KeyL + [0x0000006d, 0x0000004d, 0x01000000, 0x01000000], // KeyM + [0x0000006e, 0x0000004e, 0x01000000, 0x01000000], // KeyN + [0x0000006f, 0x0000004f, 0x01000000, 0x01000000], // KeyO + [0x00000070, 0x00000050, 0x01000000, 0x01000000], // KeyP + [0x00000071, 0x00000051, 0x00000040, 0x01000000], // KeyQ + [0x00000072, 0x00000052, 0x01000000, 0x01000000], // KeyR + [0x00000073, 0x00000053, 0x000000df, 0x01000000], // KeyS + [0x00000074, 0x00000054, 0x000020ba, 0x01000000], // KeyT + [0x00000075, 0x00000055, 0x01000000, 0x01000000], // KeyU + [0x00000076, 0x00000056, 0x01000000, 0x01000000], // KeyV + [0x00000077, 0x00000057, 0x01000000, 0x01000000], // KeyW + [0x00000078, 0x00000058, 0x01000000, 0x01000000], // KeyX + [0x00000079, 0x00000059, 0x01000000, 0x01000000], // KeyY + [0x0000007a, 0x0000005a, 0x01000000, 0x01000000], // KeyZ + [0x00000031, 0x00000021, 0x0000003e, 0x01000000], // Digit1 + [0x00000032, 0x00000027, 0x000000a3, 0x01000000], // Digit2 + [0x00000033, 0x0000005e, 0x00000023, 0x01000000], // Digit3 + [0x00000034, 0x0000002b, 0x00000024, 0x01000000], // Digit4 + [0x00000035, 0x00000025, 0x000000bd, 0x01000000], // Digit5 + [0x00000036, 0x00000026, 0x01000000, 0x01000000], // Digit6 + [0x00000037, 0x0000002f, 0x0000007b, 0x01000000], // Digit7 + [0x00000038, 0x00000028, 0x0000005b, 0x01000000], // Digit8 + [0x00000039, 0x00000029, 0x0000005d, 0x01000000], // Digit9 + [0x00000030, 0x0000003d, 0x0000007d, 0x01000000], // Digit0 + [0x0000002a, 0x0000003f, 0x0000005c, 0x01000000], // Minus + [0x0000002d, 0x0000005f, 0x0000007c, 0x01000000], // Equal + [0x0000011f, 0x0000011e, 0x000000a8, 0x01000000], // BracketLeft + [0x000000fc, 0x000000dc, 0x0000007e, 0x01000000], // BracketRight + [0x0000002c, 0x0000003b, 0x00000060, 0x01000000], // Backslash + [0x0000015f, 0x0000015e, 0x000000b4, 0x01000000], // Semicolon + [0x00000069, 0x00000130, 0x01000000, 0x01000000], // Quote + [0x00000022, 0x000000e9, 0x0000003c, 0x01000000], // Backquote + [0x000000f6, 0x000000d6, 0x01000000, 0x01000000], // Comma + [0x000000e7, 0x000000c7, 0x01000000, 0x01000000], // Period + [0x0000002e, 0x0000003a, 0x01000000, 0x01000000], // Slash + ], + ), + + LayoutInfo( + name: 'zh-hans', + platform: LayoutPlatform.darwin, + mapping: >[ + [0x00000061, 0x00000041, 0x000000e5, 0x000000c5], // KeyA + [0x00000062, 0x00000042, 0x0000222b, 0x00000131], // KeyB + [0x00000063, 0x00000043, 0x000000e7, 0x000000c7], // KeyC + [0x00000064, 0x00000044, 0x00002202, 0x000000ce], // KeyD + [0x00000065, 0x00000045, 0x01000000, 0x000000b4], // KeyE + [0x00000066, 0x00000046, 0x00000192, 0x000000cf], // KeyF + [0x00000067, 0x00000047, 0x000000a9, 0x000002dd], // KeyG + [0x00000068, 0x00000048, 0x000002d9, 0x000000d3], // KeyH + [0x00000069, 0x00000049, 0x01000000, 0x000002c6], // KeyI + [0x0000006a, 0x0000004a, 0x00002206, 0x000000d4], // KeyJ + [0x0000006b, 0x0000004b, 0x000002da, 0x0000f8ff], // KeyK + [0x0000006c, 0x0000004c, 0x000000ac, 0x000000d2], // KeyL + [0x0000006d, 0x0000004d, 0x000000b5, 0x000000c2], // KeyM + [0x0000006e, 0x0000004e, 0x01000000, 0x000002dc], // KeyN + [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO + [0x00000070, 0x00000050, 0x000003c0, 0x0000220f], // KeyP + [0x00000071, 0x00000051, 0x00000153, 0x00000152], // KeyQ + [0x00000072, 0x00000052, 0x000000ae, 0x00002030], // KeyR + [0x00000073, 0x00000053, 0x000000df, 0x000000cd], // KeyS + [0x00000074, 0x00000054, 0x00002020, 0x000002c7], // KeyT + [0x00000075, 0x00000055, 0x01000000, 0x000000a8], // KeyU + [0x00000076, 0x00000056, 0x0000221a, 0x000025ca], // KeyV + [0x00000077, 0x00000057, 0x00002211, 0x0000201e], // KeyW + [0x00000078, 0x00000058, 0x00002248, 0x000002db], // KeyX + [0x00000079, 0x00000059, 0x000000a5, 0x000000c1], // KeyY + [0x0000007a, 0x0000005a, 0x000003a9, 0x000000b8], // KeyZ + [0x00000031, 0x0000ff01, 0x000000a1, 0x00002044], // Digit1 + [0x00000032, 0x00000040, 0x00002122, 0x000020ac], // Digit2 + [0x00000033, 0x00000023, 0x000000a3, 0x00002039], // Digit3 + [0x00000034, 0x000000a5, 0x000000a2, 0x0000203a], // Digit4 + [0x00000035, 0x00000025, 0x0000221e, 0x0000fb01], // Digit5 + [0x00000036, 0x01000000, 0x000000a7, 0x0000fb02], // Digit6 + [0x00000037, 0x00000026, 0x000000b6, 0x00002021], // Digit7 + [0x00000038, 0x0000002a, 0x00002022, 0x000000b0], // Digit8 + [0x00000039, 0x0000ff08, 0x000000aa, 0x000000b7], // Digit9 + [0x00000030, 0x0000ff09, 0x000000ba, 0x0000201a], // Digit0 + [0x0000002d, 0x01000000, 0x00002013, 0x00002014], // Minus + [0x0000003d, 0x0000002b, 0x00002260, 0x000000b1], // Equal + [0x00003010, 0x0000300c, 0x0000201c, 0x0000201d], // BracketLeft + [0x00003011, 0x0000300d, 0x00002018, 0x00002019], // BracketRight + [0x00003001, 0x0000007c, 0x000000ab, 0x000000bb], // Backslash + [0x0000ff1b, 0x0000ff1a, 0x00002026, 0x000000da], // Semicolon + [0x00000027, 0x00000022, 0x000000e6, 0x000000c6], // Quote + [0x000000b7, 0x0000ff5e, 0x01000000, 0x00000060], // Backquote + [0x0000ff0c, 0x0000300a, 0x00002264, 0x000000af], // Comma + [0x00003002, 0x0000300b, 0x00002265, 0x000002d8], // Period + [0x0000002f, 0x0000ff1f, 0x000000f7, 0x000000bf], // Slash + ], + ), +]; diff --git a/third_party/web_keyboard_layouts/lib/web_keyboard_layouts.dart b/third_party/web_keyboard_layouts/lib/web_keyboard_layouts.dart index e2a62a92e3957..20ce37c9aaa7e 100644 --- a/third_party/web_keyboard_layouts/lib/web_keyboard_layouts.dart +++ b/third_party/web_keyboard_layouts/lib/web_keyboard_layouts.dart @@ -4,4 +4,4 @@ library web_keyboard_layouts; part 'base.dart'; -part 'definitions.dart'; +part 'definitions.g.dart'; From e7a6473112f152533f0e2aee627e51282ad568ad Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Tue, 12 Jul 2022 18:47:13 -0700 Subject: [PATCH 07/74] Fix filtering bugs --- .../lib/src/engine/keyboard_binding.dart | 2 +- .../src/engine/keyboard_layout_detector.dart | 28 +++++++++++-------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/lib/web_ui/lib/src/engine/keyboard_binding.dart b/lib/web_ui/lib/src/engine/keyboard_binding.dart index 6ff2c0c48e929..249b41a7e620f 100644 --- a/lib/web_ui/lib/src/engine/keyboard_binding.dart +++ b/lib/web_ui/lib/src/engine/keyboard_binding.dart @@ -148,7 +148,7 @@ class KeyboardBinding { void _setup() { _addEventListener('keydown', allowInterop((DomEvent event) { layoutDetector.update(event as DomKeyboardEvent); - print('${event.code} ${layoutDetector.getKey(event.code ?? '')}'); + print('${event.code} 0x${layoutDetector.getKey(event.code ?? '')?.toRadixString(16)}'); return _converter.handleEvent(FlutterHtmlKeyboardEvent(event)); })); _addEventListener('keyup', allowInterop((DomEvent event) { diff --git a/lib/web_ui/lib/src/engine/keyboard_layout_detector.dart b/lib/web_ui/lib/src/engine/keyboard_layout_detector.dart index 0d8338af52f99..67a75c3050403 100644 --- a/lib/web_ui/lib/src/engine/keyboard_layout_detector.dart +++ b/lib/web_ui/lib/src/engine/keyboard_layout_detector.dart @@ -5,11 +5,11 @@ import 'package:web_keyboard_layouts/web_keyboard_layouts.dart' as keyboard_layouts; import 'dom.dart'; -// Set this flag to true to see the details of detecting layouts. -const bool _debugLogLayoutEvents = false; +// Set this flag to true to see the details during layout detection. +const bool _debugLogLayoutEvents = true; void _debugLog(String message) { if (_debugLogLayoutEvents) { - print(_debugLogLayoutEvents); + print(message); } } @@ -21,10 +21,11 @@ bool _isEascii(int clue) { class KeyboardLayoutDetector { KeyboardLayoutDetector() { int index = 0; - for (final String key in keyboard_layouts.kLayoutGoals.keys) { - _goalToIndex[key] = index; + for (final String code in keyboard_layouts.kLayoutGoals.keys) { + _goalToIndex[code] = index; index += 1; } + print('Goal: $_goalToIndex'); } void update(DomKeyboardEvent event) { @@ -35,9 +36,10 @@ class KeyboardLayoutDetector { if (goalIndex == null) { return; } + print('Cue ${event.code} index $goalIndex key ${event.key}'); // There is an existing candidate list. Filter based on it. - if (_candidates.isEmpty) { + if (_candidates.isNotEmpty) { final bool effectiveCue = _filterCandidates(_candidates, event, goalIndex); if (effectiveCue) { _debugCues.add(event); @@ -69,6 +71,10 @@ class KeyboardLayoutDetector { return null; } final keyboard_layouts.LayoutInfo candidate = _candidates.first; + if (candidate.name != _debugLastLayout) { + _debugLog('[Debug] Switching to layout ${candidate.name}.'); + _debugLastLayout = candidate.name; + } if (!_calculatedLayouts.containsKey(candidate.name)) { _calculatedLayouts[candidate.name] = _buildLayout(candidate.mapping, candidate.name); } @@ -82,7 +88,7 @@ class KeyboardLayoutDetector { final bool thisHasAltGr = event.getModifierState('AltGraph'); final bool thisHasShift = event.shiftKey; final int index = (thisHasShift ? 1 : 0) + (thisHasAltGr ? 2 : 0); - candidates.where((keyboard_layouts.LayoutInfo element) { + candidates.retainWhere((keyboard_layouts.LayoutInfo element) { final int expected = element.mapping[goalIndex][index]; if (thisIsDead) { return expected == keyboard_layouts.kDeadKey; @@ -93,14 +99,12 @@ class KeyboardLayoutDetector { } }); final int afterCandidateNum = candidates.length; + print('Filter before $beforeCandidateNum after $afterCandidateNum'); return afterCandidateNum < beforeCandidateNum; } static Map _buildLayout(List> clueMap, String debugLayoutName) { - assert(() { - print('Building layout for $debugLayoutName'); - return true; - }()); + _debugLog('Building layout for $debugLayoutName'); final Map mandatoryGoalsByChar = {..._mandatoryGoalsByChar}; final Map result = {}; // The logical key should be the first available clue from below: @@ -150,9 +154,11 @@ class KeyboardLayoutDetector { final Map _goalToIndex = {}; final List _candidates = []; final Map> _calculatedLayouts = >{}; + // Record all effective cues since the last reset. That is, cues that filtered // out any candidates. This is used to print out debug information. final List _debugCues = []; + String _debugLastLayout = ''; static late final List _fullCandidates = keyboard_layouts.kLayouts.where( (keyboard_layouts.LayoutInfo layout) => layout.platform == _currentPlatform, From b88d06faa7357d68c32d9df5106e37c3f492db9f Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Tue, 12 Jul 2022 18:49:50 -0700 Subject: [PATCH 08/74] Format --- web_sdk/BUILD.gn | 50 +++++++++++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 20 deletions(-) diff --git a/web_sdk/BUILD.gn b/web_sdk/BUILD.gn index 441c494d05665..62ce61d76975c 100644 --- a/web_sdk/BUILD.gn +++ b/web_sdk/BUILD.gn @@ -30,12 +30,13 @@ web_engine_sources = web_engine_sources += [ rebase_path("//flutter/lib/web_ui/lib/src/engine.dart") ] -web_keyboard_layouts_sources = exec_script("//third_party/dart/tools/list_dart_files.py", - [ - "absolute", - rebase_path("//flutter/third_party/web_keyboard_layouts/lib"), - ], - "list lines") +web_keyboard_layouts_sources = + exec_script("//third_party/dart/tools/list_dart_files.py", + [ + "absolute", + rebase_path("//flutter/third_party/web_keyboard_layouts/lib"), + ], + "list lines") group("web_sdk") { deps = [ @@ -83,7 +84,8 @@ prebuilt_dart_action("web_keyboard_layouts_sources") { packages = dart_sdk_package_config script = "sdk_rewriter.dart" - output_dir = rebase_path("$root_out_dir/flutter_web_sdk/lib/web_keyboard_layouts/") + output_dir = + rebase_path("$root_out_dir/flutter_web_sdk/lib/web_keyboard_layouts/") input_dir = rebase_path("//flutter/third_party/web_keyboard_layouts/lib/") pool = "//flutter/build/dart:dart_pool" @@ -155,9 +157,9 @@ template("_dartdevc") { not_needed(invoker, [ "packages" ]) deps = [ ":web_engine_sources", + ":web_keyboard_layouts_sources", ":web_ui_library", ":web_ui_sources", - ":web_keyboard_layouts_sources", "//flutter:dart_sdk", ] script = "//build/gn_run_binary.py" @@ -185,9 +187,9 @@ template("_dartdevc") { deps = [ ":web_engine_sources", + ":web_keyboard_layouts_sources", ":web_ui_library", ":web_ui_sources", - ":web_keyboard_layouts_sources", "//flutter:dart_sdk", "//third_party/dart/pkg:pkg_files_stamp", "//third_party/dart/utils/dartdevc:dartdevc_files_stamp", @@ -215,9 +217,9 @@ template("_kernel_worker") { action(target_name) { deps = [ ":web_engine_sources", + ":web_keyboard_layouts_sources", ":web_ui_library", ":web_ui_sources", - ":web_keyboard_layouts_sources", "//flutter:dart_sdk", ] script = "//build/gn_run_binary.py" @@ -246,9 +248,9 @@ template("_kernel_worker") { deps = [ ":web_engine_sources", + ":web_keyboard_layouts_sources", ":web_ui_library", ":web_ui_sources", - ":web_keyboard_layouts_sources", "//flutter:dart_sdk", "//third_party/dart/pkg:pkg_files_stamp", "//third_party/dart/utils/dartdevc:dartdevc_files_stamp", @@ -264,7 +266,8 @@ template("_kernel_worker") { # Compile the unsound DDC SDK's summary. _kernel_worker("flutter_dartdevc_kernel_sdk_outline") { - inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources + web_keyboard_layouts_sources + inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources + + web_keyboard_layouts_sources outputs = [ sdk_dill ] @@ -298,7 +301,8 @@ _kernel_worker("flutter_dartdevc_kernel_sdk_outline") { # Compiles the unsound html only renderer. _dartdevc("flutter_dartdevc_kernel_sdk") { - inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources + web_keyboard_layouts_sources + inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources + + web_keyboard_layouts_sources packages = dart_sdk_package_config @@ -345,7 +349,8 @@ _dartdevc("flutter_dartdevc_kernel_sdk") { # Compiles the unsound canvaskit only renderer. _dartdevc("flutter_dartdevc_canvaskit_kernel_sdk") { - inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources + web_keyboard_layouts_sources + inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources + + web_keyboard_layouts_sources packages = dart_sdk_package_config @@ -394,7 +399,8 @@ _dartdevc("flutter_dartdevc_canvaskit_kernel_sdk") { # Compiles the unsound autodetect renderer. _dartdevc("flutter_dartdevc_canvaskit_html_kernel_sdk") { - inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources + web_keyboard_layouts_sources + inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources + + web_keyboard_layouts_sources packages = dart_sdk_package_config @@ -443,7 +449,8 @@ _dartdevc("flutter_dartdevc_canvaskit_html_kernel_sdk") { # Compiles the sound html only renderer. _dartdevc("flutter_dartdevc_kernel_sdk_sound") { - inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources + web_keyboard_layouts_sources + inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources + + web_keyboard_layouts_sources packages = dart_sdk_package_config @@ -491,7 +498,8 @@ _dartdevc("flutter_dartdevc_kernel_sdk_sound") { # Compiles the sound canvaskit only renderer. _dartdevc("flutter_dartdevc_canvaskit_kernel_sdk_sound") { - inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources + web_keyboard_layouts_sources + inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources + + web_keyboard_layouts_sources packages = dart_sdk_package_config @@ -540,7 +548,8 @@ _dartdevc("flutter_dartdevc_canvaskit_kernel_sdk_sound") { # Compiles the sound autodetect renderer. _dartdevc("flutter_dartdevc_canvaskit_html_kernel_sdk_sound") { - inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources + web_keyboard_layouts_sources + inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources + + web_keyboard_layouts_sources packages = dart_sdk_package_config @@ -589,7 +598,8 @@ _dartdevc("flutter_dartdevc_canvaskit_html_kernel_sdk_sound") { # Compile the sound DDC SDK's summary. _kernel_worker("flutter_dartdevc_kernel_sdk_outline_sound") { - inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources + web_keyboard_layouts_sources + inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources + + web_keyboard_layouts_sources outputs = [ sdk_dill_sound ] @@ -635,9 +645,9 @@ if (!is_fuchsia) { ":flutter_dartdevc_kernel_sdk_outline_sound", ":flutter_dartdevc_kernel_sdk_sound", ":web_engine_sources", + ":web_keyboard_layouts_sources", ":web_ui_library", ":web_ui_sources", - ":web_keyboard_layouts_sources", ] sources = get_target_outputs(":flutter_dartdevc_canvaskit_html_kernel_sdk") sources += From 0a85ed9378f1af9d1228d3cbd71154a5d948c688 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 10 Oct 2022 17:15:44 -0700 Subject: [PATCH 09/74] Fix build --- lib/web_ui/lib/src/engine/keyboard_binding.dart | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/web_ui/lib/src/engine/keyboard_binding.dart b/lib/web_ui/lib/src/engine/keyboard_binding.dart index cd91a35298937..029518e287ad5 100644 --- a/lib/web_ui/lib/src/engine/keyboard_binding.dart +++ b/lib/web_ui/lib/src/engine/keyboard_binding.dart @@ -108,8 +108,7 @@ class KeyboardBinding { } final KeyboardLayoutDetector layoutDetector = KeyboardLayoutDetector(); - final DomElement glassPaneElement; - late KeyboardConverter _converter; + late final KeyboardConverter _converter; final Map _listeners = {}; void _addEventListener(String eventName, DomEventListener handler) { From 4b0d8e480a20b52f3797e2284af913a8d81ff958 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 10 Oct 2022 17:43:17 -0700 Subject: [PATCH 10/74] Add scripts --- .../lib/definitions.g.dart | 2 +- tools/gen_web_keyboard_layouts/.gitignore | 1 + tools/gen_web_keyboard_layouts/README.md | 1 + .../bin/gen_web_keyboard_layouts.dart | 69 ++++ .../data/layout_entry.dart.tmpl | 7 + .../data/layouts.dart.tmpl | 24 ++ tools/gen_web_keyboard_layouts/lib/data.dart | 53 +++ .../lib/json_get.dart | 85 +++++ tools/gen_web_keyboard_layouts/lib/main.dart | 310 ++++++++++++++++++ tools/gen_web_keyboard_layouts/lib/utils.dart | 11 + tools/gen_web_keyboard_layouts/pubspec.yaml | 13 + .../test/gen_defaults_test.dart | 130 ++++++++ 12 files changed, 705 insertions(+), 1 deletion(-) create mode 100644 tools/gen_web_keyboard_layouts/.gitignore create mode 100644 tools/gen_web_keyboard_layouts/README.md create mode 100644 tools/gen_web_keyboard_layouts/bin/gen_web_keyboard_layouts.dart create mode 100644 tools/gen_web_keyboard_layouts/data/layout_entry.dart.tmpl create mode 100644 tools/gen_web_keyboard_layouts/data/layouts.dart.tmpl create mode 100644 tools/gen_web_keyboard_layouts/lib/data.dart create mode 100644 tools/gen_web_keyboard_layouts/lib/json_get.dart create mode 100644 tools/gen_web_keyboard_layouts/lib/main.dart create mode 100644 tools/gen_web_keyboard_layouts/lib/utils.dart create mode 100644 tools/gen_web_keyboard_layouts/pubspec.yaml create mode 100644 tools/gen_web_keyboard_layouts/test/gen_defaults_test.dart diff --git a/third_party/web_keyboard_layouts/lib/definitions.g.dart b/third_party/web_keyboard_layouts/lib/definitions.g.dart index a5751c4d2807e..cf1cab361c3af 100644 --- a/third_party/web_keyboard_layouts/lib/definitions.g.dart +++ b/third_party/web_keyboard_layouts/lib/definitions.g.dart @@ -4,7 +4,7 @@ // DO NOT EDIT -- DO NOT EDIT -- DO NOT EDIT // // This file is auto generated by flutter/packages:script/gen_web_keyboard based on -// https://github.com/microsoft/vscode/tree/4589815e4849499c67125ff68563fa102646b869/src/vs/workbench/services/keybinding/browser/keyboardLayouts +// https://github.com/microsoft/vscode/tree/ae34e8d2df286f8c8882d22db417e6dc4cdb01f5/src/vs/workbench/services/keybinding/browser/keyboardLayouts // // Edit the following files instead: // diff --git a/tools/gen_web_keyboard_layouts/.gitignore b/tools/gen_web_keyboard_layouts/.gitignore new file mode 100644 index 0000000000000..ceddaa37f12a8 --- /dev/null +++ b/tools/gen_web_keyboard_layouts/.gitignore @@ -0,0 +1 @@ +.cache/ diff --git a/tools/gen_web_keyboard_layouts/README.md b/tools/gen_web_keyboard_layouts/README.md new file mode 100644 index 0000000000000..0ac1a97c3fad4 --- /dev/null +++ b/tools/gen_web_keyboard_layouts/README.md @@ -0,0 +1 @@ +## Keycode Generator diff --git a/tools/gen_web_keyboard_layouts/bin/gen_web_keyboard_layouts.dart b/tools/gen_web_keyboard_layouts/bin/gen_web_keyboard_layouts.dart new file mode 100644 index 0000000000000..f15add4660740 --- /dev/null +++ b/tools/gen_web_keyboard_layouts/bin/gen_web_keyboard_layouts.dart @@ -0,0 +1,69 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:args/args.dart'; +import 'package:gen_web_keyboard_layouts/main.dart'; +import 'package:path/path.dart' as path; + +const String kEnvGithubToken = 'GITHUB_TOKEN'; + +Future main(List rawArguments) async { + final Map env = Platform.environment; + final ArgParser argParser = ArgParser(); + argParser.addFlag( + 'force', + abbr: 'f', + negatable: false, + help: 'Make a new request to GitHub even if a cache is detected', + ); + argParser.addFlag( + 'help', + abbr: 'h', + negatable: false, + help: 'Print help for this command.', + ); + + final ArgResults parsedArguments = argParser.parse(rawArguments); + + if (parsedArguments['help'] as bool) { + print(argParser.usage); + exit(0); + } + + bool enabledAssert = false; + assert(() { + enabledAssert = true; + return true; + }()); + if (!enabledAssert) { + print('Error: This script must be run with assert enabled. Please rerun with --enable-asserts.'); + exit(1); + } + + final String? envGithubToken = env[kEnvGithubToken]; + if (envGithubToken == null) { + print('Error: Environment variable GITHUB_TOKEN not found.\n\n' + 'Set the environment variable GITHUB_TOKEN as a GitHub personal access\n' + 'token for authentication. This token is only used for quota controlling\n' + 'and does not need any scopes. Create one at\n' + 'https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token.', + ); + exit(1); + } + + // The root of this package. The folder that is called + // 'gen_web_keyboard_layouts' and contains 'pubspec.yaml'. + final Directory packageRoot = Directory(path.dirname(Platform.script.toFilePath())).parent; + + await generate(Options( + githubToken: envGithubToken, + cacheRoot: path.join(packageRoot.path, '.cache'), + dataRoot: path.join(packageRoot.path, 'data'), + force: parsedArguments['force'] as bool, + outputRoot: path.join(packageRoot.parent.parent.path, + 'third_party', 'web_keyboard_layouts', 'lib'), + )); +} diff --git a/tools/gen_web_keyboard_layouts/data/layout_entry.dart.tmpl b/tools/gen_web_keyboard_layouts/data/layout_entry.dart.tmpl new file mode 100644 index 0000000000000..f4b28d0a24852 --- /dev/null +++ b/tools/gen_web_keyboard_layouts/data/layout_entry.dart.tmpl @@ -0,0 +1,7 @@ + LayoutInfo( + name: '@@@NAME@@@', + platform: LayoutPlatform.@@@PLATFORM@@@, + mapping: >[ +@@@ENTRIES@@@ + ], + ), diff --git a/tools/gen_web_keyboard_layouts/data/layouts.dart.tmpl b/tools/gen_web_keyboard_layouts/data/layouts.dart.tmpl new file mode 100644 index 0000000000000..4cc2a8f0f7e4e --- /dev/null +++ b/tools/gen_web_keyboard_layouts/data/layouts.dart.tmpl @@ -0,0 +1,24 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. + +// DO NOT EDIT -- DO NOT EDIT -- DO NOT EDIT +// +// This file is auto generated by flutter/packages:script/gen_web_keyboard based on +// https://github.com/microsoft/vscode/tree/@@@COMMIT_ID@@@/src/vs/workbench/services/keybinding/browser/keyboardLayouts +// +// Edit the following files instead: +// +// - Script: lib/main.dart +// - Templates: data/*.tmpl +// +// See flutter/packages:script/gen_web_keyboard/layouts/README.md for more information. + +part of web_keyboard_layouts; + +const Map kLayoutGoals = { +@@@LAYOUT_GOALS@@@ +}; + +const List kLayouts = [ +@@@LAYOUT_ENTRIES@@@ +]; diff --git a/tools/gen_web_keyboard_layouts/lib/data.dart b/tools/gen_web_keyboard_layouts/lib/data.dart new file mode 100644 index 0000000000000..7461eb55fab8c --- /dev/null +++ b/tools/gen_web_keyboard_layouts/lib/data.dart @@ -0,0 +1,53 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +const Map kLayoutGoals = { + 'KeyA': 'A', + 'KeyB': 'B', + 'KeyC': 'C', + 'KeyD': 'D', + 'KeyE': 'E', + 'KeyF': 'F', + 'KeyG': 'G', + 'KeyH': 'H', + 'KeyI': 'I', + 'KeyJ': 'J', + 'KeyK': 'K', + 'KeyL': 'L', + 'KeyM': 'M', + 'KeyN': 'N', + 'KeyO': 'O', + 'KeyP': 'P', + 'KeyQ': 'Q', + 'KeyR': 'R', + 'KeyS': 'S', + 'KeyT': 'T', + 'KeyU': 'U', + 'KeyV': 'V', + 'KeyW': 'W', + 'KeyX': 'X', + 'KeyY': 'Y', + 'KeyZ': 'Z', + 'Digit1': '1', + 'Digit2': '2', + 'Digit3': '3', + 'Digit4': '4', + 'Digit5': '5', + 'Digit6': '6', + 'Digit7': '7', + 'Digit8': '8', + 'Digit9': '9', + 'Digit0': '0', + 'Minus': null, + 'Equal': null, + 'BracketLeft': null, + 'BracketRight': null, + 'Backslash': null, + 'Semicolon': null, + 'Quote': null, + 'Backquote': null, + 'Comma': null, + 'Period': null, + 'Slash': null, +}; diff --git a/tools/gen_web_keyboard_layouts/lib/json_get.dart b/tools/gen_web_keyboard_layouts/lib/json_get.dart new file mode 100644 index 0000000000000..3977c526d5634 --- /dev/null +++ b/tools/gen_web_keyboard_layouts/lib/json_get.dart @@ -0,0 +1,85 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:meta/meta.dart' show immutable; + + +@immutable +class JsonContext { + JsonContext(this.current, this.path); + + final T current; + final List path; + + static JsonContext> root(Map root) { + return JsonContext>(root, const []); + } +} + +typedef JsonObject = Map; +typedef JsonArray = List; +String _jsonTypeErrorMessage(List currentPath, String nextKey, Type expectedType, Type actualType) { + return 'Unexpected value at path ${currentPath.join('.')}.$nextKey: ' + 'Expects $expectedType but got $actualType.'; +} + +JsonContext jsonGetKey(JsonContext context, String key) { + dynamic result = context.current[key]; + if (result is! T) { + throw ArgumentError(_jsonTypeErrorMessage(context.path, key, T, result.runtimeType)); + } + return JsonContext(result, [...context.path, key]); +} + +JsonContext jsonGetIndex(JsonContext context, int index) { + dynamic result = context.current[index]; + if (result is! T) { + throw ArgumentError(_jsonTypeErrorMessage(context.path, '$index', T, result.runtimeType)); + } + return JsonContext(result, [...context.path, '$index']); +} + +JsonContext jsonGetPath(JsonContext context, List path) { + JsonContext current = context; + void _jsonGetKeyOrIndex(dynamic key, int depth) { + assert(key is String || key is int, 'Key at $depth is a ${key.runtimeType}.'); + if (key is String) { + current = jsonGetKey(current as JsonContext, key); + } else if (key is int) { + current = jsonGetIndex(current as JsonContext, key); + } else { + assert(false); + } + } + void _jsonGetKeyOrIndexForNext(dynamic key, dynamic nextKey, int depth) { + assert(nextKey is String || nextKey is int, 'Key at ${depth + 1} is a ${key.runtimeType}.'); + if (nextKey is String) { + _jsonGetKeyOrIndex(key, depth); + } else if (nextKey is int) { + _jsonGetKeyOrIndex(key, depth); + } else { + assert(false); + } + } + + for (int depth = 0; depth < path.length; depth += 1) { + if (depth != path.length - 1) { + _jsonGetKeyOrIndexForNext(path[depth], path[depth + 1], depth); + } else { + _jsonGetKeyOrIndex(path[depth], depth); + } + } + return current as JsonContext; +} + +List jsonPathSplit(String path) { + return path.split('.').map((String key) { + final int? index = int.tryParse(key); + if (index != null) { + return index; + } else { + return key; + } + }).toList(); +} diff --git a/tools/gen_web_keyboard_layouts/lib/main.dart b/tools/gen_web_keyboard_layouts/lib/main.dart new file mode 100644 index 0000000000000..ea44697d275e6 --- /dev/null +++ b/tools/gen_web_keyboard_layouts/lib/main.dart @@ -0,0 +1,310 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:gen_web_keyboard_layouts/data.dart'; +import 'package:meta/meta.dart' show immutable; + +import 'dart:convert'; +import 'dart:io'; +import 'package:http/http.dart' as http; +import 'package:path/path.dart' as path; + +import 'json_get.dart'; +import 'utils.dart'; + +const int kDeadChar = 0x1000000; + +@immutable +class Options { + /// Build an option. + const Options({ + required this.force, + required this.githubToken, + required this.cacheRoot, + required this.dataRoot, + required this.outputRoot, + }); + + final bool force; + + /// The GitHub personal access token used to make the GitHub request. + final String githubToken; + + /// The path of the folder that store cache. + final String cacheRoot; + + /// The path of the folder that store data files, such as templates. + final String dataRoot; + + /// The folder to store the output Dart files. + final String outputRoot; +} + +const String githubCacheFileName = 'github-response.json'; +const String githubTargetFolder = 'src/vs/workbench/services/keybinding/browser/keyboardLayouts'; +const String overallTemplateName = 'layouts.dart.tmpl'; +const String entryTemplateName = 'layout_entry.dart.tmpl'; +const String outputName = 'definitions.g.dart'; + +const String githubQuery = ''' +{ + repository(owner: "microsoft", name: "vscode") { + defaultBranchRef { + target { + ... on Commit { + history(first: 1) { + nodes { + oid + file(path: "$githubTargetFolder") { + extension lineCount object { + ... on Tree { + entries { + name object { + ... on Blob { + text + } + } + } + } + } + } + } + } + } + } + } + } +} +'''; + +/// Signature for function that asynchonously returns a value. +typedef AsyncGetter = Future Function(); + +/// Retrieve a string using the procedure defined by `ifNotExist` based on the +/// cache file at `cachePath`. +/// +/// If `forceRefresh` is false, this function tries to read the cache file, calls +/// `ifNotExist` when necessary, and writes the result to the cache. +/// +/// If `forceRefresh` is true, this function never read the cache file, always +/// calls `ifNotExist` when necessary, and still writes the result to the cache. +/// +/// Exceptions from `ifNotExist` will be thrown, while exceptions related to +/// caching are only printed. +Future tryCached(String cachePath, bool forceRefresh, AsyncGetter ifNotExist) async { + final File cacheFile = File(cachePath); + if (!forceRefresh && cacheFile.existsSync()) { + try { + final String result = cacheFile.readAsStringSync(); + print('Using GitHub cache.'); + return result; + } catch (exception) { + print('Error reading GitHub cache, rebuilding. Details: $exception'); + } + } + final String result = await ifNotExist(); + IOSink? sink; + try { + print('Requesting from GitHub...'); + Directory(path.dirname(cachePath)).createSync(recursive: true); + sink = cacheFile.openWrite(); + cacheFile.writeAsStringSync(result); + } catch (exception) { + print('Error writing GitHub cache. Details: $exception'); + } finally { + sink?.close(); + } + return result; +} + +Future> fetchGithub(String githubToken, bool forceRefresh, String cachePath) async { + final String response = await tryCached(cachePath, forceRefresh, () async { + final String condensedQuery = githubQuery + .replaceAll(RegExp(r'\{ +'), '{') + .replaceAll(RegExp(r' +\}'), '}'); + final http.Response response = await http.post( + Uri.parse('https://api.github.com/graphql'), + headers: { + 'Content-Type': 'application/json; charset=UTF-8', + 'Authorization': 'bearer $githubToken', + }, + body: jsonEncode({ + 'query': condensedQuery, + }), + ); + if (response.statusCode != 200) { + throw Exception('Request to GitHub failed with status code ${response.statusCode}: ${response.reasonPhrase}'); + } + return response.body; + }); + return jsonDecode(response) as Map; +} + +@immutable +class GitHubFile { + const GitHubFile({required this.name, required this.content}); + + final String name; + final String content; +} + +GitHubFile jsonGetGithubFile(JsonContext files, int index) { + final JsonContext file = jsonGetIndex(files, index); + return GitHubFile( + name: jsonGetKey(file, 'name').current, + content: jsonGetPath(file, ['object', 'text']).current, + ); +} + +typedef LayoutEntry = List; + +@immutable +class Layout { + const Layout(this.name, this.platform, this.mapping); + + final String name; + final String platform; + final Map mapping; +} + +Layout parseLayoutFile(GitHubFile file) { + final Map mapping = {}; + + // Parse a line that looks like the following, and get its key as well as + // the content within the square bracket. + // + // F19: [], + // KeyZ: ['y', 'Y', '', '', 0, 'VK_Y'], + final RegExp lineParser = RegExp(r'^[ \t]*(.+?): \[(.*)\],$'); + // Parse each child of the content within the square bracket. + final RegExp listParser = RegExp(r"^'(.*?)', '(.*?)', '(.*?)', '(.*?)', (\d)(?:, '(.+)')?$"); + // Parse a char represented in unicode hex, such as \u001b. + final RegExp hexParser = RegExp(r'^\\u([0-9a-fA-F]+)$'); + file.content.split('\n').forEach((String line) { + final RegExpMatch? lineMatch = lineParser.firstMatch(line); + if (lineMatch == null) { + return; + } + final String eventKey = lineMatch.group(1)!; + final String definition = lineMatch.group(2)!; + if (definition.isEmpty) { + return; + } + final RegExpMatch? listMatch = listParser.firstMatch(definition); + assert(listMatch != null, 'Unable to match $definition'); + final int deadMask = int.parse(listMatch!.group(5)!, radix: 10); + + int combineValue(String rawString, int deadMask) { + if (deadMask != 0 || rawString.isEmpty) { + return kDeadChar; + } + final RegExpMatch? hexMatch = hexParser.firstMatch(rawString); + if (hexMatch != null) { + return int.parse(hexMatch.group(1)!, radix: 16); + } + final String charString = const { + r'\\': r'\', + r'\r': '\r', + r'\b': '\b', + r'\t': '\t', + r"\'": "'", + 'l̥': 'l', // TODO + 'L̥': 'L', // TODO + 'r̥': 'r', // TODO + 'R̥': 'R', // TODO + }[rawString] ?? rawString; + assert(charString.length == 1, 'Unrecognized multibyte character |$charString| (file ${file.name} key $eventKey)'); + return charString.codeUnitAt(0); + } + mapping[eventKey] = [ + combineValue(listMatch.group(1)!, deadMask & 0x1), + combineValue(listMatch.group(2)!, deadMask & 0x2), + combineValue(listMatch.group(3)!, deadMask & 0x4), + combineValue(listMatch.group(4)!, deadMask & 0x8), + ]; + }); + + // Parse the file name, which looks like "en-belgian.win.ts". + final RegExp fileNameParser = RegExp(r'^([^.]+)\.([^.]+)\.ts$'); + Layout? layout; + try { + final RegExpMatch? match = fileNameParser.firstMatch(file.name); + final String layoutName = match!.group(1)!; + final String platform = match.group(2)!; + layout = Layout(layoutName, platform, mapping); + } catch (exception) { + throw ArgumentError('Unrecognizable file name ${file.name}.'); + } + return layout; +} + +String renderTemplate(String template, Map dictionary) { + String result = template; + dictionary.forEach((String key, String value) { + final String localResult = result.replaceAll('@@@$key@@@', value); + if (localResult == result) { + print('Template key $key is not used.'); + } + result = localResult; + }); + return result; +} + +Future generate(Options options) async { + // Fetch files from GitHub. + final Map githubBody = await fetchGithub( + options.githubToken, + options.force, + path.join(options.cacheRoot, githubCacheFileName), + ); + + // Parse the result from GitHub. + final JsonContext commitJson = jsonGetPath( + JsonContext.root(githubBody), + jsonPathSplit('data.repository.defaultBranchRef.target.history.nodes.0'), + ); + final String commitId = jsonGetKey(commitJson, 'oid').current; + final JsonContext fileListJson = jsonGetPath( + commitJson, + jsonPathSplit('file.object.entries'), + ); + final Iterable files = Iterable.generate( + fileListJson.current.length, + (int index) => jsonGetGithubFile(fileListJson, index), + ).where( + // A few files in the folder are controlling files, containing no layout + // information. + (GitHubFile file) => !file.name.startsWith('layout.contribution.') + && !file.name.startsWith('_.contribution'), + ); + + final List layouts = files.map(parseLayoutFile).toList(); + + final Iterable entriesString = layouts.map((Layout layout) { + return renderTemplate( + File(path.join(options.dataRoot, entryTemplateName)).readAsStringSync(), + { + 'NAME': layout.name, + 'PLATFORM': layout.platform, + 'ENTRIES': kLayoutGoals.keys.map((String key) { + final String value = layout.mapping[key]!.map(toHex).join(', '); + return ' [$value], // $key'; + }).join('\n'), + }, + ).trimRight(); + }); + final String result = renderTemplate( + File(path.join(options.dataRoot, overallTemplateName)).readAsStringSync(), + { + 'COMMIT_ID': commitId, + 'LAYOUT_GOALS': kLayoutGoals.entries.map((MapEntry entry) => + " '${entry.key}': ${entry.value == null ? 'null' : "'${entry.value}'"}," + ).join('\n'), + 'LAYOUT_ENTRIES': entriesString.join('\n\n'), + }, + ); + final String outputPath = path.join(options.outputRoot, outputName); + Directory(path.dirname(outputPath)).createSync(recursive: true); + File(outputPath).writeAsStringSync(result); +} diff --git a/tools/gen_web_keyboard_layouts/lib/utils.dart b/tools/gen_web_keyboard_layouts/lib/utils.dart new file mode 100644 index 0000000000000..a24e698be7e4a --- /dev/null +++ b/tools/gen_web_keyboard_layouts/lib/utils.dart @@ -0,0 +1,11 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/// Converts an integer into a hex string with the given number of digits. +String toHex(int? value, {int digits = 8}) { + if (value == null) { + return 'null'; + } + return '0x${value.toRadixString(16).padLeft(digits, '0')}'; +} diff --git a/tools/gen_web_keyboard_layouts/pubspec.yaml b/tools/gen_web_keyboard_layouts/pubspec.yaml new file mode 100644 index 0000000000000..ebe5c511d935d --- /dev/null +++ b/tools/gen_web_keyboard_layouts/pubspec.yaml @@ -0,0 +1,13 @@ +name: gen_web_keyboard_layouts +description: Generates keyboard layouts for Web from external sources. + +environment: + sdk: ">=2.18.0-0 <3.0.0" + +dependencies: + args: ^2.3.1 + http: ^0.13.4 + path: ^1.8.1 + +dev_dependencies: + test: ^1.21.1 diff --git a/tools/gen_web_keyboard_layouts/test/gen_defaults_test.dart b/tools/gen_web_keyboard_layouts/test/gen_defaults_test.dart new file mode 100644 index 0000000000000..b0f86982e522b --- /dev/null +++ b/tools/gen_web_keyboard_layouts/test/gen_defaults_test.dart @@ -0,0 +1,130 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:gen_web_keyboard_layouts/template.dart'; +import 'package:path/path.dart' as path; +import 'package:test/test.dart'; + +void main() { + test('Templates will append to the end of a file', () { + final Directory tempDir = Directory.systemTemp.createTempSync('gen_defaults'); + try { + // Create a temporary file with some content. + final File tempFile = File(path.join(tempDir.path, 'test_template.txt')); + tempFile.createSync(); + tempFile.writeAsStringSync(''' +// This is a file with stuff in it. +// This part shouldn't be changed by +// the template. +'''); + + // Have a test template append new parameterized content to the end of + // the file. + final Map tokens = {'foo': 'Foobar', 'bar': 'Barfoo'}; + TestTemplate(tempFile.path, tokens).updateFile(); + + expect(tempFile.readAsStringSync(), ''' +// This is a file with stuff in it. +// This part shouldn't be changed by +// the template. + +// BEGIN GENERATED TOKEN PROPERTIES + +// Generated code to the end of this file. Do not edit by hand. +// These defaults are generated from the Material Design Token +// database by the script dev/tools/gen_defaults/bin/gen_defaults.dart. + +static final String tokenFoo = 'Foobar'; +static final String tokenBar = 'Barfoo'; + +// END GENERATED TOKEN PROPERTIES +'''); + + } finally { + tempDir.deleteSync(recursive: true); + } + }); + + test('Templates will update over previously generated code at the end of a file', () { + final Directory tempDir = Directory.systemTemp.createTempSync('gen_defaults'); + try { + // Create a temporary file with some content. + final File tempFile = File(path.join(tempDir.path, 'test_template.txt')); + tempFile.createSync(); + tempFile.writeAsStringSync(''' +// This is a file with stuff in it. +// This part shouldn't be changed by +// the template. + +// BEGIN GENERATED TOKEN PROPERTIES + +// Generated code to the end of this file. Do not edit by hand. +// These defaults are generated from the Material Design Token +// database by the script dev/tools/gen_defaults/bin/gen_defaults.dart. + +static final String tokenFoo = 'Foobar'; +static final String tokenBar = 'Barfoo'; + +// END GENERATED TOKEN PROPERTIES +'''); + + // Have a test template append new parameterized content to the end of + // the file. + final Map tokens = {'foo': 'foo', 'bar': 'bar'}; + TestTemplate(tempFile.path, tokens).updateFile(); + + expect(tempFile.readAsStringSync(), ''' +// This is a file with stuff in it. +// This part shouldn't be changed by +// the template. + +// BEGIN GENERATED TOKEN PROPERTIES + +// Generated code to the end of this file. Do not edit by hand. +// These defaults are generated from the Material Design Token +// database by the script dev/tools/gen_defaults/bin/gen_defaults.dart. + +static final String tokenFoo = 'foo'; +static final String tokenBar = 'bar'; + +// END GENERATED TOKEN PROPERTIES +'''); + + } finally { + tempDir.deleteSync(recursive: true); + } + }); + + test('Templates can get proper shapes from given data', () { + const Map tokens = { + 'foo.shape': 'shape.large', + 'bar.shape': 'shape.full', + 'shape.large': { + 'family': 'SHAPE_FAMILY_ROUNDED_CORNERS', + 'topLeft': 1.0, + 'topRight': 2.0, + 'bottomLeft': 3.0, + 'bottomRight': 4.0, + }, + 'shape.full': { + 'family': 'SHAPE_FAMILY_CIRCULAR', + }, + }; + final TestTemplate template = TestTemplate('foobar.dart', tokens); + expect(template.shape('foo'), 'const RoundedRectangleBorder(borderRadius: BorderRadius.only(topLeft: Radius.circular(1.0), topRight: Radius.circular(2.0), bottomLeft: Radius.circular(3.0), bottomRight: Radius.circular(4.0)))'); + expect(template.shape('bar'), 'const StadiumBorder()'); + }); +} + +class TestTemplate extends TokenTemplate { + TestTemplate(super.fileName, super.tokens); + + @override + String generate() => ''' +static final String tokenFoo = '${tokens['foo']}'; +static final String tokenBar = '${tokens['bar']}'; +'''; +} From d4920f49f5269fcf5b418cc3d0aebb8837e540c6 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 10 Oct 2022 18:14:01 -0700 Subject: [PATCH 11/74] Try license --- tools/licenses/lib/patterns.dart | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tools/licenses/lib/patterns.dart b/tools/licenses/lib/patterns.dart index c467461939a6f..1430be4016ce2 100644 --- a/tools/licenses/lib/patterns.dart +++ b/tools/licenses/lib/patterns.dart @@ -554,6 +554,22 @@ final List csReferencesByFilename = Date: Mon, 10 Oct 2022 23:13:55 -0700 Subject: [PATCH 12/74] Copyright --- tools/licenses/lib/patterns.dart | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tools/licenses/lib/patterns.dart b/tools/licenses/lib/patterns.dart index 1430be4016ce2..c432a53487a3b 100644 --- a/tools/licenses/lib/patterns.dart +++ b/tools/licenses/lib/patterns.dart @@ -561,9 +561,8 @@ final List csReferencesByFilename = Date: Tue, 11 Oct 2022 12:27:09 -0700 Subject: [PATCH 13/74] Rename license --- third_party/web_keyboard_layouts/{LICENSE => License.txt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename third_party/web_keyboard_layouts/{LICENSE => License.txt} (100%) diff --git a/third_party/web_keyboard_layouts/LICENSE b/third_party/web_keyboard_layouts/License.txt similarity index 100% rename from third_party/web_keyboard_layouts/LICENSE rename to third_party/web_keyboard_layouts/License.txt From 84703c769bd64434d4dc7f75b3edcd1670f9374b Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Tue, 11 Oct 2022 13:03:09 -0700 Subject: [PATCH 14/74] Use case insensitive --- tools/licenses/lib/licenses.dart | 72 +++++++++++++++----------------- 1 file changed, 33 insertions(+), 39 deletions(-) diff --git a/tools/licenses/lib/licenses.dart b/tools/licenses/lib/licenses.dart index 2a6e8ee190e97..5c58a5d854b13 100644 --- a/tools/licenses/lib/licenses.dart +++ b/tools/licenses/lib/licenses.dart @@ -14,72 +14,66 @@ class FetchedContentsOf extends Key { FetchedContentsOf(dynamic value) : super(v enum LicenseType { unknown, bsd, gpl, lgpl, mpl, afl, mit, freetype, apache, apacheNotice, eclipse, ijg, zlib, icu, apsl, libpng, openssl, vulkan, bison } LicenseType convertLicenseNameToType(String? name) { - switch (name) { - case 'Apache': + switch (name?.toLowerCase()) { + case 'apache': case 'apache-license-2.0': - case 'LICENSE-APACHE-2.0.txt': + case 'license-apache-2.0.txt': case 'Apache-2.0.txt': - case 'LICENSE.vulkan': + case 'license.vulkan': return LicenseType.apache; - case 'BSD': - case 'BSD.txt': - case 'BSD-3-Clause.txt': + case 'bsd': + case 'bsd.txt': + case 'bsd-3-clause.txt': return LicenseType.bsd; - case 'LICENSE-LGPL-2': - case 'LICENSE-LGPL-2.1': - case 'COPYING-LGPL-2.1': + case 'license-lgpl-2': + case 'license-lgpl-2.1': + case 'copying-lgpl-2.1': return LicenseType.lgpl; - case 'COPYING-GPL-3': - case 'GPL-3.0-only.txt': + case 'copying-gpl-3': + case 'gpl-3.0-only.txt': return LicenseType.gpl; - case 'FTL.TXT': + case 'ftl.txt': return LicenseType.freetype; case 'zlib.h': return LicenseType.zlib; case 'png.h': return LicenseType.libpng; - case 'ICU': + case 'icu': return LicenseType.icu; - case 'Apple Public Source License': + case 'apple public source license': return LicenseType.apsl; - case 'OpenSSL': + case 'openssl': return LicenseType.openssl; - case 'LICENSE.MPLv2': - case 'COPYING-MPL-1.1': + case 'license.mplv2': + case 'copying-mpl-1.1': return LicenseType.mpl; - case 'COPYRIGHT.vulkan': + case 'copyright.vulkan': return LicenseType.vulkan; - case 'LICENSE.MIT': - case 'MIT.txt': + case 'license.mit': + case 'mit.txt': return LicenseType.mit; // common file names that don't say what the type is - case 'COPYING': - case 'COPYING.txt': - case 'COPYING.LIB': // lgpl usually - case 'COPYING.RUNTIME': // gcc exception usually - case 'LICENSE': - case 'LICENSE.md': + case 'copying': + case 'copying.txt': + case 'copying.lib': // lgpl usually + case 'copying.runtime': // gcc exception usually + case 'license': + case 'license.md': case 'license.html': - case 'LICENSE.txt': - case 'LICENSE.TXT': - case 'LICENSE.cssmin': - case 'NOTICE': - case 'NOTICE.txt': - case 'Copyright': - case 'copyright': case 'license.txt': + case 'license.cssmin': + case 'notice': + case 'notice.txt': + case 'copyright': return LicenseType.unknown; // particularly weird file names - case 'COPYRIGHT.musl': - case 'LICENSE-APPLE': - case 'extreme.indiana.edu.license.TXT': + case 'copyright.musl': + case 'license-apple': case 'extreme.indiana.edu.license.txt': - case 'javolution.license.TXT': case 'javolution.license.txt': case 'libyaml-license.txt': case 'license.patch': case 'license.rst': - case 'LICENSE.rst': case 'mh-bsd-gcc': case 'pivotal.labs.license.txt': return LicenseType.unknown; From 1a7b3d96bb2f0b603f18fd74577d2f5c2e184f71 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Tue, 11 Oct 2022 13:05:58 -0700 Subject: [PATCH 15/74] more lower case --- tools/licenses/lib/licenses.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/licenses/lib/licenses.dart b/tools/licenses/lib/licenses.dart index 5c58a5d854b13..34440e4426ba6 100644 --- a/tools/licenses/lib/licenses.dart +++ b/tools/licenses/lib/licenses.dart @@ -18,7 +18,7 @@ LicenseType convertLicenseNameToType(String? name) { case 'apache': case 'apache-license-2.0': case 'license-apache-2.0.txt': - case 'Apache-2.0.txt': + case 'apache-2.0.txt': case 'license.vulkan': return LicenseType.apache; case 'bsd': From 8798bbc79c95a9c0b500a49a2d4ce611defdd582 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Tue, 11 Oct 2022 17:10:54 -0700 Subject: [PATCH 16/74] Sort. Migrate to better types. --- third_party/web_keyboard_layouts/README.md | 5 +- .../lib/definitions.g.dart | 2972 ++++++++--------- tools/gen_web_keyboard_layouts/README.md | 2 +- ...ayouts.dart.tmpl => definitions.dart.tmpl} | 4 +- ....dart.tmpl => definitions_entry.dart.tmpl} | 0 .../lib/json_get.dart | 16 +- .../lib/layout_types.dart | 39 + tools/gen_web_keyboard_layouts/lib/main.dart | 183 +- tools/gen_web_keyboard_layouts/pubspec.yaml | 1 + 9 files changed, 1653 insertions(+), 1569 deletions(-) rename tools/gen_web_keyboard_layouts/data/{layouts.dart.tmpl => definitions.dart.tmpl} (76%) rename tools/gen_web_keyboard_layouts/data/{layout_entry.dart.tmpl => definitions_entry.dart.tmpl} (100%) create mode 100644 tools/gen_web_keyboard_layouts/lib/layout_types.dart diff --git a/third_party/web_keyboard_layouts/README.md b/third_party/web_keyboard_layouts/README.md index a6dafd0725d63..2b6a974f01363 100644 --- a/third_party/web_keyboard_layouts/README.md +++ b/third_party/web_keyboard_layouts/README.md @@ -1,7 +1,4 @@ -# Cupertino Icons - -This is an asset repo containing the keyboard layouts used by -Flutter's [Web keyboard manager](https://github.com/flutter/engine/blob/main/lib/web_ui/lib/src/engine/keyboard_binding.dart). +# Web Keyboard Layouts # Usage diff --git a/third_party/web_keyboard_layouts/lib/definitions.g.dart b/third_party/web_keyboard_layouts/lib/definitions.g.dart index cf1cab361c3af..fca8b64c0c8f9 100644 --- a/third_party/web_keyboard_layouts/lib/definitions.g.dart +++ b/third_party/web_keyboard_layouts/lib/definitions.g.dart @@ -3,7 +3,7 @@ // DO NOT EDIT -- DO NOT EDIT -- DO NOT EDIT // -// This file is auto generated by flutter/packages:script/gen_web_keyboard based on +// This file is auto generated by flutter/engine:flutter/tools/gen_web_keyboard_layouts based on // https://github.com/microsoft/vscode/tree/ae34e8d2df286f8c8882d22db417e6dc4cdb01f5/src/vs/workbench/services/keybinding/browser/keyboardLayouts // // Edit the following files instead: @@ -11,7 +11,7 @@ // - Script: lib/main.dart // - Templates: data/*.tmpl // -// See flutter/packages:script/gen_web_keyboard/layouts/README.md for more information. +// See flutter/engine:flutter/tools/gen_web_keyboard_layouts/README.md for more information. part of web_keyboard_layouts; @@ -70,161 +70,107 @@ const List kLayouts = [ name: 'cz', platform: LayoutPlatform.win, mapping: >[ - [0x00000061, 0x00000041, 0x01000000, 0x01000000], // KeyA - [0x00000062, 0x00000042, 0x0000007b, 0x01000000], // KeyB - [0x00000063, 0x00000043, 0x00000026, 0x01000000], // KeyC - [0x00000064, 0x00000044, 0x00000110, 0x01000000], // KeyD - [0x00000065, 0x00000045, 0x000020ac, 0x01000000], // KeyE - [0x00000066, 0x00000046, 0x0000005b, 0x01000000], // KeyF - [0x00000067, 0x00000047, 0x0000005d, 0x01000000], // KeyG - [0x00000068, 0x00000048, 0x01000000, 0x01000000], // KeyH - [0x00000069, 0x00000049, 0x01000000, 0x01000000], // KeyI - [0x0000006a, 0x0000004a, 0x01000000, 0x01000000], // KeyJ - [0x0000006b, 0x0000004b, 0x00000142, 0x01000000], // KeyK - [0x0000006c, 0x0000004c, 0x00000141, 0x01000000], // KeyL - [0x0000006d, 0x0000004d, 0x01000000, 0x01000000], // KeyM - [0x0000006e, 0x0000004e, 0x0000007d, 0x01000000], // KeyN - [0x0000006f, 0x0000004f, 0x01000000, 0x01000000], // KeyO - [0x00000070, 0x00000050, 0x01000000, 0x01000000], // KeyP - [0x00000071, 0x00000051, 0x0000005c, 0x01000000], // KeyQ - [0x00000072, 0x00000052, 0x01000000, 0x01000000], // KeyR - [0x00000073, 0x00000053, 0x00000111, 0x01000000], // KeyS - [0x00000074, 0x00000054, 0x01000000, 0x01000000], // KeyT - [0x00000075, 0x00000055, 0x01000000, 0x01000000], // KeyU - [0x00000076, 0x00000056, 0x00000040, 0x01000000], // KeyV - [0x00000077, 0x00000057, 0x0000007c, 0x01000000], // KeyW - [0x00000078, 0x00000058, 0x00000023, 0x01000000], // KeyX - [0x0000007a, 0x0000005a, 0x01000000, 0x01000000], // KeyY - [0x00000079, 0x00000059, 0x01000000, 0x01000000], // KeyZ - [0x0000002b, 0x00000031, 0x0000007e, 0x01000000], // Digit1 - [0x0000011b, 0x00000032, 0x000002c7, 0x01000000], // Digit2 - [0x00000161, 0x00000033, 0x0000005e, 0x01000000], // Digit3 - [0x0000010d, 0x00000034, 0x000002d8, 0x01000000], // Digit4 - [0x00000159, 0x00000035, 0x000000b0, 0x01000000], // Digit5 - [0x0000017e, 0x00000036, 0x000002db, 0x01000000], // Digit6 - [0x000000fd, 0x00000037, 0x00000060, 0x01000000], // Digit7 - [0x000000e1, 0x00000038, 0x000002d9, 0x01000000], // Digit8 - [0x000000ed, 0x00000039, 0x000000b4, 0x01000000], // Digit9 - [0x000000e9, 0x00000030, 0x000002dd, 0x01000000], // Digit0 - [0x0000003d, 0x00000025, 0x000000a8, 0x01000000], // Minus - [0x000000b4, 0x000002c7, 0x000000b8, 0x01000000], // Equal - [0x000000fa, 0x0000002f, 0x000000f7, 0x01000000], // BracketLeft - [0x00000029, 0x00000028, 0x000000d7, 0x01000000], // BracketRight - [0x000000a8, 0x00000027, 0x000000a4, 0x01000000], // Backslash - [0x0000016f, 0x00000022, 0x00000024, 0x01000000], // Semicolon - [0x000000a7, 0x00000021, 0x000000df, 0x01000000], // Quote - [0x0000003b, 0x000000b0, 0x01000000, 0x01000000], // Backquote - [0x0000002c, 0x0000003f, 0x0000003c, 0x01000000], // Comma - [0x0000002e, 0x0000003a, 0x0000003e, 0x01000000], // Period - [0x0000002d, 0x0000005f, 0x0000002a, 0x01000000], // Slash - ], - ), - - LayoutInfo( - name: 'de-swiss', - platform: LayoutPlatform.win, - mapping: >[ - [0x00000061, 0x00000041, 0x01000000, 0x01000000], // KeyA - [0x00000062, 0x00000042, 0x01000000, 0x01000000], // KeyB - [0x00000063, 0x00000043, 0x01000000, 0x01000000], // KeyC - [0x00000064, 0x00000044, 0x01000000, 0x01000000], // KeyD - [0x00000065, 0x00000045, 0x000020ac, 0x01000000], // KeyE - [0x00000066, 0x00000046, 0x01000000, 0x01000000], // KeyF - [0x00000067, 0x00000047, 0x01000000, 0x01000000], // KeyG - [0x00000068, 0x00000048, 0x01000000, 0x01000000], // KeyH - [0x00000069, 0x00000049, 0x01000000, 0x01000000], // KeyI - [0x0000006a, 0x0000004a, 0x01000000, 0x01000000], // KeyJ - [0x0000006b, 0x0000004b, 0x01000000, 0x01000000], // KeyK - [0x0000006c, 0x0000004c, 0x01000000, 0x01000000], // KeyL - [0x0000006d, 0x0000004d, 0x01000000, 0x01000000], // KeyM - [0x0000006e, 0x0000004e, 0x01000000, 0x01000000], // KeyN - [0x0000006f, 0x0000004f, 0x01000000, 0x01000000], // KeyO - [0x00000070, 0x00000050, 0x01000000, 0x01000000], // KeyP - [0x00000071, 0x00000051, 0x01000000, 0x01000000], // KeyQ - [0x00000072, 0x00000052, 0x01000000, 0x01000000], // KeyR - [0x00000073, 0x00000053, 0x01000000, 0x01000000], // KeyS - [0x00000074, 0x00000054, 0x01000000, 0x01000000], // KeyT - [0x00000075, 0x00000055, 0x01000000, 0x01000000], // KeyU - [0x00000076, 0x00000056, 0x01000000, 0x01000000], // KeyV - [0x00000077, 0x00000057, 0x01000000, 0x01000000], // KeyW - [0x00000078, 0x00000058, 0x01000000, 0x01000000], // KeyX - [0x0000007a, 0x0000005a, 0x01000000, 0x01000000], // KeyY - [0x00000079, 0x00000059, 0x01000000, 0x01000000], // KeyZ - [0x00000031, 0x0000002b, 0x000000a6, 0x01000000], // Digit1 - [0x00000032, 0x00000022, 0x00000040, 0x01000000], // Digit2 - [0x00000033, 0x0000002a, 0x00000023, 0x01000000], // Digit3 - [0x00000034, 0x000000e7, 0x000000b0, 0x01000000], // Digit4 - [0x00000035, 0x00000025, 0x000000a7, 0x01000000], // Digit5 - [0x00000036, 0x00000026, 0x000000ac, 0x01000000], // Digit6 - [0x00000037, 0x0000002f, 0x0000007c, 0x01000000], // Digit7 - [0x00000038, 0x00000028, 0x000000a2, 0x01000000], // Digit8 - [0x00000039, 0x00000029, 0x01000000, 0x01000000], // Digit9 - [0x00000030, 0x0000003d, 0x01000000, 0x01000000], // Digit0 - [0x00000027, 0x0000003f, 0x000000b4, 0x01000000], // Minus - [0x0000005e, 0x00000060, 0x0000007e, 0x01000000], // Equal - [0x000000fc, 0x000000e8, 0x0000005b, 0x01000000], // BracketLeft - [0x000000a8, 0x00000021, 0x0000005d, 0x01000000], // BracketRight - [0x00000024, 0x000000a3, 0x0000007d, 0x01000000], // Backslash - [0x000000f6, 0x000000e9, 0x01000000, 0x01000000], // Semicolon - [0x000000e4, 0x000000e0, 0x0000007b, 0x01000000], // Quote - [0x000000a7, 0x000000b0, 0x01000000, 0x01000000], // Backquote - [0x0000002c, 0x0000003b, 0x01000000, 0x01000000], // Comma - [0x0000002e, 0x0000003a, 0x01000000, 0x01000000], // Period - [0x0000002d, 0x0000005f, 0x01000000, 0x01000000], // Slash + [0x00000061, 0x00000041, 0x00000000, 0x00000000], // KeyA + [0x00000062, 0x00000042, 0x0000007b, 0x00000000], // KeyB + [0x00000063, 0x00000043, 0x00000026, 0x00000000], // KeyC + [0x00000064, 0x00000044, 0x00000110, 0x00000000], // KeyD + [0x00000065, 0x00000045, 0x000020ac, 0x00000000], // KeyE + [0x00000066, 0x00000046, 0x0000005b, 0x00000000], // KeyF + [0x00000067, 0x00000047, 0x0000005d, 0x00000000], // KeyG + [0x00000068, 0x00000048, 0x00000000, 0x00000000], // KeyH + [0x00000069, 0x00000049, 0x00000000, 0x00000000], // KeyI + [0x0000006a, 0x0000004a, 0x00000000, 0x00000000], // KeyJ + [0x0000006b, 0x0000004b, 0x00000142, 0x00000000], // KeyK + [0x0000006c, 0x0000004c, 0x00000141, 0x00000000], // KeyL + [0x0000006d, 0x0000004d, 0x00000000, 0x00000000], // KeyM + [0x0000006e, 0x0000004e, 0x0000007d, 0x00000000], // KeyN + [0x0000006f, 0x0000004f, 0x00000000, 0x00000000], // KeyO + [0x00000070, 0x00000050, 0x00000000, 0x00000000], // KeyP + [0x00000071, 0x00000051, 0x0000005c, 0x00000000], // KeyQ + [0x00000072, 0x00000052, 0x00000000, 0x00000000], // KeyR + [0x00000073, 0x00000053, 0x00000111, 0x00000000], // KeyS + [0x00000074, 0x00000054, 0x00000000, 0x00000000], // KeyT + [0x00000075, 0x00000055, 0x00000000, 0x00000000], // KeyU + [0x00000076, 0x00000056, 0x00000040, 0x00000000], // KeyV + [0x00000077, 0x00000057, 0x0000007c, 0x00000000], // KeyW + [0x00000078, 0x00000058, 0x00000023, 0x00000000], // KeyX + [0x0000007a, 0x0000005a, 0x00000000, 0x00000000], // KeyY + [0x00000079, 0x00000059, 0x00000000, 0x00000000], // KeyZ + [0x0000002b, 0x00000031, 0x0000007e, 0x00000000], // Digit1 + [0x0000011b, 0x00000032, 0x000002c7, 0x00000000], // Digit2 + [0x00000161, 0x00000033, 0x0000005e, 0x00000000], // Digit3 + [0x0000010d, 0x00000034, 0x000002d8, 0x00000000], // Digit4 + [0x00000159, 0x00000035, 0x000000b0, 0x00000000], // Digit5 + [0x0000017e, 0x00000036, 0x000002db, 0x00000000], // Digit6 + [0x000000fd, 0x00000037, 0x00000060, 0x00000000], // Digit7 + [0x000000e1, 0x00000038, 0x000002d9, 0x00000000], // Digit8 + [0x000000ed, 0x00000039, 0x000000b4, 0x00000000], // Digit9 + [0x000000e9, 0x00000030, 0x000002dd, 0x00000000], // Digit0 + [0x0000003d, 0x00000025, 0x000000a8, 0x00000000], // Minus + [0x000000b4, 0x000002c7, 0x000000b8, 0x00000000], // Equal + [0x000000fa, 0x0000002f, 0x000000f7, 0x00000000], // BracketLeft + [0x00000029, 0x00000028, 0x000000d7, 0x00000000], // BracketRight + [0x000000a8, 0x00000027, 0x000000a4, 0x00000000], // Backslash + [0x0000016f, 0x00000022, 0x00000024, 0x00000000], // Semicolon + [0x000000a7, 0x00000021, 0x000000df, 0x00000000], // Quote + [0x0000003b, 0x000000b0, 0x00000000, 0x00000000], // Backquote + [0x0000002c, 0x0000003f, 0x0000003c, 0x00000000], // Comma + [0x0000002e, 0x0000003a, 0x0000003e, 0x00000000], // Period + [0x0000002d, 0x0000005f, 0x0000002a, 0x00000000], // Slash ], ), LayoutInfo( name: 'de', - platform: LayoutPlatform.darwin, + platform: LayoutPlatform.win, mapping: >[ - [0x00000061, 0x00000041, 0x000000e5, 0x000000c5], // KeyA - [0x00000062, 0x00000042, 0x0000222b, 0x00002039], // KeyB - [0x00000063, 0x00000043, 0x000000e7, 0x000000c7], // KeyC - [0x00000064, 0x00000044, 0x00002202, 0x00002122], // KeyD - [0x00000065, 0x00000045, 0x000020ac, 0x00002030], // KeyE - [0x00000066, 0x00000046, 0x00000192, 0x000000cf], // KeyF - [0x00000067, 0x00000047, 0x000000a9, 0x000000cc], // KeyG - [0x00000068, 0x00000048, 0x000000aa, 0x000000d3], // KeyH - [0x00000069, 0x00000049, 0x00002044, 0x000000db], // KeyI - [0x0000006a, 0x0000004a, 0x000000ba, 0x00000131], // KeyJ - [0x0000006b, 0x0000004b, 0x00002206, 0x000002c6], // KeyK - [0x0000006c, 0x0000004c, 0x00000040, 0x0000fb02], // KeyL - [0x0000006d, 0x0000004d, 0x000000b5, 0x000002d8], // KeyM - [0x0000006e, 0x0000004e, 0x01000000, 0x0000203a], // KeyN - [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO - [0x00000070, 0x00000050, 0x000003c0, 0x0000220f], // KeyP - [0x00000071, 0x00000051, 0x000000ab, 0x000000bb], // KeyQ - [0x00000072, 0x00000052, 0x000000ae, 0x000000b8], // KeyR - [0x00000073, 0x00000053, 0x0000201a, 0x000000cd], // KeyS - [0x00000074, 0x00000054, 0x00002020, 0x000002dd], // KeyT - [0x00000075, 0x00000055, 0x01000000, 0x000000c1], // KeyU - [0x00000076, 0x00000056, 0x0000221a, 0x000025ca], // KeyV - [0x00000077, 0x00000057, 0x00002211, 0x0000201e], // KeyW - [0x00000078, 0x00000058, 0x00002248, 0x000000d9], // KeyX - [0x0000007a, 0x0000005a, 0x000003a9, 0x000002c7], // KeyY - [0x00000079, 0x00000059, 0x000000a5, 0x00002021], // KeyZ - [0x00000031, 0x00000021, 0x000000a1, 0x000000ac], // Digit1 - [0x00000032, 0x00000022, 0x0000201c, 0x0000201d], // Digit2 - [0x00000033, 0x000000a7, 0x000000b6, 0x00000023], // Digit3 - [0x00000034, 0x00000024, 0x000000a2, 0x000000a3], // Digit4 - [0x00000035, 0x00000025, 0x0000005b, 0x0000fb01], // Digit5 - [0x00000036, 0x00000026, 0x0000005d, 0x01000000], // Digit6 - [0x00000037, 0x0000002f, 0x0000007c, 0x0000005c], // Digit7 - [0x00000038, 0x00000028, 0x0000007b, 0x000002dc], // Digit8 - [0x00000039, 0x00000029, 0x0000007d, 0x000000b7], // Digit9 - [0x00000030, 0x0000003d, 0x00002260, 0x000000af], // Digit0 - [0x000000df, 0x0000003f, 0x000000bf, 0x000002d9], // Minus - [0x01000000, 0x01000000, 0x00000027, 0x000002da], // Equal - [0x000000fc, 0x000000dc, 0x00002022, 0x000000b0], // BracketLeft - [0x0000002b, 0x0000002a, 0x000000b1, 0x0000f8ff], // BracketRight - [0x00000023, 0x00000027, 0x00002018, 0x00002019], // Backslash - [0x000000f6, 0x000000d6, 0x00000153, 0x00000152], // Semicolon - [0x000000e4, 0x000000c4, 0x000000e6, 0x000000c6], // Quote - [0x0000003c, 0x0000003e, 0x00002264, 0x00002265], // Backquote - [0x0000002c, 0x0000003b, 0x0000221e, 0x000002db], // Comma - [0x0000002e, 0x0000003a, 0x00002026, 0x000000f7], // Period - [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Slash + [0x00000061, 0x00000041, 0x00000000, 0x00000000], // KeyA + [0x00000062, 0x00000042, 0x00000000, 0x00000000], // KeyB + [0x00000063, 0x00000043, 0x00000000, 0x00000000], // KeyC + [0x00000064, 0x00000044, 0x00000000, 0x00000000], // KeyD + [0x00000065, 0x00000045, 0x000020ac, 0x00000000], // KeyE + [0x00000066, 0x00000046, 0x00000000, 0x00000000], // KeyF + [0x00000067, 0x00000047, 0x00000000, 0x00000000], // KeyG + [0x00000068, 0x00000048, 0x00000000, 0x00000000], // KeyH + [0x00000069, 0x00000049, 0x00000000, 0x00000000], // KeyI + [0x0000006a, 0x0000004a, 0x00000000, 0x00000000], // KeyJ + [0x0000006b, 0x0000004b, 0x00000000, 0x00000000], // KeyK + [0x0000006c, 0x0000004c, 0x00000000, 0x00000000], // KeyL + [0x0000006d, 0x0000004d, 0x000000b5, 0x00000000], // KeyM + [0x0000006e, 0x0000004e, 0x00000000, 0x00000000], // KeyN + [0x0000006f, 0x0000004f, 0x00000000, 0x00000000], // KeyO + [0x00000070, 0x00000050, 0x00000000, 0x00000000], // KeyP + [0x00000071, 0x00000051, 0x00000040, 0x00000000], // KeyQ + [0x00000072, 0x00000052, 0x00000000, 0x00000000], // KeyR + [0x00000073, 0x00000053, 0x00000000, 0x00000000], // KeyS + [0x00000074, 0x00000054, 0x00000000, 0x00000000], // KeyT + [0x00000075, 0x00000055, 0x00000000, 0x00000000], // KeyU + [0x00000076, 0x00000056, 0x00000000, 0x00000000], // KeyV + [0x00000077, 0x00000057, 0x00000000, 0x00000000], // KeyW + [0x00000078, 0x00000058, 0x00000000, 0x00000000], // KeyX + [0x0000007a, 0x0000005a, 0x00000000, 0x00000000], // KeyY + [0x00000079, 0x00000059, 0x00000000, 0x00000000], // KeyZ + [0x00000031, 0x00000021, 0x00000000, 0x00000000], // Digit1 + [0x00000032, 0x00000022, 0x000000b2, 0x00000000], // Digit2 + [0x00000033, 0x000000a7, 0x000000b3, 0x00000000], // Digit3 + [0x00000034, 0x00000024, 0x00000000, 0x00000000], // Digit4 + [0x00000035, 0x00000025, 0x00000000, 0x00000000], // Digit5 + [0x00000036, 0x00000026, 0x00000000, 0x00000000], // Digit6 + [0x00000037, 0x0000002f, 0x0000007b, 0x00000000], // Digit7 + [0x00000038, 0x00000028, 0x0000005b, 0x00000000], // Digit8 + [0x00000039, 0x00000029, 0x0000005d, 0x00000000], // Digit9 + [0x00000030, 0x0000003d, 0x0000007d, 0x00000000], // Digit0 + [0x000000df, 0x0000003f, 0x0000005c, 0x00001e9e], // Minus + [0x000000b4, 0x00000060, 0x00000000, 0x00000000], // Equal + [0x000000fc, 0x000000dc, 0x00000000, 0x00000000], // BracketLeft + [0x0000002b, 0x0000002a, 0x0000007e, 0x00000000], // BracketRight + [0x00000023, 0x00000027, 0x00000000, 0x00000000], // Backslash + [0x000000f6, 0x000000d6, 0x00000000, 0x00000000], // Semicolon + [0x000000e4, 0x000000c4, 0x00000000, 0x00000000], // Quote + [0x0000005e, 0x000000b0, 0x00000000, 0x00000000], // Backquote + [0x0000002c, 0x0000003b, 0x00000000, 0x00000000], // Comma + [0x0000002e, 0x0000003a, 0x00000000, 0x00000000], // Period + [0x0000002d, 0x0000005f, 0x00000000, 0x00000000], // Slash ], ), @@ -284,55 +230,109 @@ const List kLayouts = [ LayoutInfo( name: 'de', + platform: LayoutPlatform.darwin, + mapping: >[ + [0x00000061, 0x00000041, 0x000000e5, 0x000000c5], // KeyA + [0x00000062, 0x00000042, 0x0000222b, 0x00002039], // KeyB + [0x00000063, 0x00000043, 0x000000e7, 0x000000c7], // KeyC + [0x00000064, 0x00000044, 0x00002202, 0x00002122], // KeyD + [0x00000065, 0x00000045, 0x000020ac, 0x00002030], // KeyE + [0x00000066, 0x00000046, 0x00000192, 0x000000cf], // KeyF + [0x00000067, 0x00000047, 0x000000a9, 0x000000cc], // KeyG + [0x00000068, 0x00000048, 0x000000aa, 0x000000d3], // KeyH + [0x00000069, 0x00000049, 0x00002044, 0x000000db], // KeyI + [0x0000006a, 0x0000004a, 0x000000ba, 0x00000131], // KeyJ + [0x0000006b, 0x0000004b, 0x00002206, 0x000002c6], // KeyK + [0x0000006c, 0x0000004c, 0x00000040, 0x0000fb02], // KeyL + [0x0000006d, 0x0000004d, 0x000000b5, 0x000002d8], // KeyM + [0x0000006e, 0x0000004e, 0x0000007e, 0x0000203a], // KeyN + [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO + [0x00000070, 0x00000050, 0x000003c0, 0x0000220f], // KeyP + [0x00000071, 0x00000051, 0x000000ab, 0x000000bb], // KeyQ + [0x00000072, 0x00000052, 0x000000ae, 0x000000b8], // KeyR + [0x00000073, 0x00000053, 0x0000201a, 0x000000cd], // KeyS + [0x00000074, 0x00000054, 0x00002020, 0x000002dd], // KeyT + [0x00000075, 0x00000055, 0x000000a8, 0x000000c1], // KeyU + [0x00000076, 0x00000056, 0x0000221a, 0x000025ca], // KeyV + [0x00000077, 0x00000057, 0x00002211, 0x0000201e], // KeyW + [0x00000078, 0x00000058, 0x00002248, 0x000000d9], // KeyX + [0x0000007a, 0x0000005a, 0x000003a9, 0x000002c7], // KeyY + [0x00000079, 0x00000059, 0x000000a5, 0x00002021], // KeyZ + [0x00000031, 0x00000021, 0x000000a1, 0x000000ac], // Digit1 + [0x00000032, 0x00000022, 0x0000201c, 0x0000201d], // Digit2 + [0x00000033, 0x000000a7, 0x000000b6, 0x00000023], // Digit3 + [0x00000034, 0x00000024, 0x000000a2, 0x000000a3], // Digit4 + [0x00000035, 0x00000025, 0x0000005b, 0x0000fb01], // Digit5 + [0x00000036, 0x00000026, 0x0000005d, 0x0000005e], // Digit6 + [0x00000037, 0x0000002f, 0x0000007c, 0x0000005c], // Digit7 + [0x00000038, 0x00000028, 0x0000007b, 0x000002dc], // Digit8 + [0x00000039, 0x00000029, 0x0000007d, 0x000000b7], // Digit9 + [0x00000030, 0x0000003d, 0x00002260, 0x000000af], // Digit0 + [0x000000df, 0x0000003f, 0x000000bf, 0x000002d9], // Minus + [0x000000b4, 0x00000060, 0x00000027, 0x000002da], // Equal + [0x000000fc, 0x000000dc, 0x00002022, 0x000000b0], // BracketLeft + [0x0000002b, 0x0000002a, 0x000000b1, 0x0000f8ff], // BracketRight + [0x00000023, 0x00000027, 0x00002018, 0x00002019], // Backslash + [0x000000f6, 0x000000d6, 0x00000153, 0x00000152], // Semicolon + [0x000000e4, 0x000000c4, 0x000000e6, 0x000000c6], // Quote + [0x0000003c, 0x0000003e, 0x00002264, 0x00002265], // Backquote + [0x0000002c, 0x0000003b, 0x0000221e, 0x000002db], // Comma + [0x0000002e, 0x0000003a, 0x00002026, 0x000000f7], // Period + [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Slash + ], + ), + + LayoutInfo( + name: 'de-swiss', platform: LayoutPlatform.win, mapping: >[ - [0x00000061, 0x00000041, 0x01000000, 0x01000000], // KeyA - [0x00000062, 0x00000042, 0x01000000, 0x01000000], // KeyB - [0x00000063, 0x00000043, 0x01000000, 0x01000000], // KeyC - [0x00000064, 0x00000044, 0x01000000, 0x01000000], // KeyD - [0x00000065, 0x00000045, 0x000020ac, 0x01000000], // KeyE - [0x00000066, 0x00000046, 0x01000000, 0x01000000], // KeyF - [0x00000067, 0x00000047, 0x01000000, 0x01000000], // KeyG - [0x00000068, 0x00000048, 0x01000000, 0x01000000], // KeyH - [0x00000069, 0x00000049, 0x01000000, 0x01000000], // KeyI - [0x0000006a, 0x0000004a, 0x01000000, 0x01000000], // KeyJ - [0x0000006b, 0x0000004b, 0x01000000, 0x01000000], // KeyK - [0x0000006c, 0x0000004c, 0x01000000, 0x01000000], // KeyL - [0x0000006d, 0x0000004d, 0x000000b5, 0x01000000], // KeyM - [0x0000006e, 0x0000004e, 0x01000000, 0x01000000], // KeyN - [0x0000006f, 0x0000004f, 0x01000000, 0x01000000], // KeyO - [0x00000070, 0x00000050, 0x01000000, 0x01000000], // KeyP - [0x00000071, 0x00000051, 0x00000040, 0x01000000], // KeyQ - [0x00000072, 0x00000052, 0x01000000, 0x01000000], // KeyR - [0x00000073, 0x00000053, 0x01000000, 0x01000000], // KeyS - [0x00000074, 0x00000054, 0x01000000, 0x01000000], // KeyT - [0x00000075, 0x00000055, 0x01000000, 0x01000000], // KeyU - [0x00000076, 0x00000056, 0x01000000, 0x01000000], // KeyV - [0x00000077, 0x00000057, 0x01000000, 0x01000000], // KeyW - [0x00000078, 0x00000058, 0x01000000, 0x01000000], // KeyX - [0x0000007a, 0x0000005a, 0x01000000, 0x01000000], // KeyY - [0x00000079, 0x00000059, 0x01000000, 0x01000000], // KeyZ - [0x00000031, 0x00000021, 0x01000000, 0x01000000], // Digit1 - [0x00000032, 0x00000022, 0x000000b2, 0x01000000], // Digit2 - [0x00000033, 0x000000a7, 0x000000b3, 0x01000000], // Digit3 - [0x00000034, 0x00000024, 0x01000000, 0x01000000], // Digit4 - [0x00000035, 0x00000025, 0x01000000, 0x01000000], // Digit5 - [0x00000036, 0x00000026, 0x01000000, 0x01000000], // Digit6 - [0x00000037, 0x0000002f, 0x0000007b, 0x01000000], // Digit7 - [0x00000038, 0x00000028, 0x0000005b, 0x01000000], // Digit8 - [0x00000039, 0x00000029, 0x0000005d, 0x01000000], // Digit9 - [0x00000030, 0x0000003d, 0x0000007d, 0x01000000], // Digit0 - [0x000000df, 0x0000003f, 0x0000005c, 0x00001e9e], // Minus - [0x000000b4, 0x00000060, 0x01000000, 0x01000000], // Equal - [0x000000fc, 0x000000dc, 0x01000000, 0x01000000], // BracketLeft - [0x0000002b, 0x0000002a, 0x0000007e, 0x01000000], // BracketRight - [0x00000023, 0x00000027, 0x01000000, 0x01000000], // Backslash - [0x000000f6, 0x000000d6, 0x01000000, 0x01000000], // Semicolon - [0x000000e4, 0x000000c4, 0x01000000, 0x01000000], // Quote - [0x0000005e, 0x000000b0, 0x01000000, 0x01000000], // Backquote - [0x0000002c, 0x0000003b, 0x01000000, 0x01000000], // Comma - [0x0000002e, 0x0000003a, 0x01000000, 0x01000000], // Period - [0x0000002d, 0x0000005f, 0x01000000, 0x01000000], // Slash + [0x00000061, 0x00000041, 0x00000000, 0x00000000], // KeyA + [0x00000062, 0x00000042, 0x00000000, 0x00000000], // KeyB + [0x00000063, 0x00000043, 0x00000000, 0x00000000], // KeyC + [0x00000064, 0x00000044, 0x00000000, 0x00000000], // KeyD + [0x00000065, 0x00000045, 0x000020ac, 0x00000000], // KeyE + [0x00000066, 0x00000046, 0x00000000, 0x00000000], // KeyF + [0x00000067, 0x00000047, 0x00000000, 0x00000000], // KeyG + [0x00000068, 0x00000048, 0x00000000, 0x00000000], // KeyH + [0x00000069, 0x00000049, 0x00000000, 0x00000000], // KeyI + [0x0000006a, 0x0000004a, 0x00000000, 0x00000000], // KeyJ + [0x0000006b, 0x0000004b, 0x00000000, 0x00000000], // KeyK + [0x0000006c, 0x0000004c, 0x00000000, 0x00000000], // KeyL + [0x0000006d, 0x0000004d, 0x00000000, 0x00000000], // KeyM + [0x0000006e, 0x0000004e, 0x00000000, 0x00000000], // KeyN + [0x0000006f, 0x0000004f, 0x00000000, 0x00000000], // KeyO + [0x00000070, 0x00000050, 0x00000000, 0x00000000], // KeyP + [0x00000071, 0x00000051, 0x00000000, 0x00000000], // KeyQ + [0x00000072, 0x00000052, 0x00000000, 0x00000000], // KeyR + [0x00000073, 0x00000053, 0x00000000, 0x00000000], // KeyS + [0x00000074, 0x00000054, 0x00000000, 0x00000000], // KeyT + [0x00000075, 0x00000055, 0x00000000, 0x00000000], // KeyU + [0x00000076, 0x00000056, 0x00000000, 0x00000000], // KeyV + [0x00000077, 0x00000057, 0x00000000, 0x00000000], // KeyW + [0x00000078, 0x00000058, 0x00000000, 0x00000000], // KeyX + [0x0000007a, 0x0000005a, 0x00000000, 0x00000000], // KeyY + [0x00000079, 0x00000059, 0x00000000, 0x00000000], // KeyZ + [0x00000031, 0x0000002b, 0x000000a6, 0x00000000], // Digit1 + [0x00000032, 0x00000022, 0x00000040, 0x00000000], // Digit2 + [0x00000033, 0x0000002a, 0x00000023, 0x00000000], // Digit3 + [0x00000034, 0x000000e7, 0x000000b0, 0x00000000], // Digit4 + [0x00000035, 0x00000025, 0x000000a7, 0x00000000], // Digit5 + [0x00000036, 0x00000026, 0x000000ac, 0x00000000], // Digit6 + [0x00000037, 0x0000002f, 0x0000007c, 0x00000000], // Digit7 + [0x00000038, 0x00000028, 0x000000a2, 0x00000000], // Digit8 + [0x00000039, 0x00000029, 0x00000000, 0x00000000], // Digit9 + [0x00000030, 0x0000003d, 0x00000000, 0x00000000], // Digit0 + [0x00000027, 0x0000003f, 0x000000b4, 0x00000000], // Minus + [0x0000005e, 0x00000060, 0x0000007e, 0x00000000], // Equal + [0x000000fc, 0x000000e8, 0x0000005b, 0x00000000], // BracketLeft + [0x000000a8, 0x00000021, 0x0000005d, 0x00000000], // BracketRight + [0x00000024, 0x000000a3, 0x0000007d, 0x00000000], // Backslash + [0x000000f6, 0x000000e9, 0x00000000, 0x00000000], // Semicolon + [0x000000e4, 0x000000e0, 0x0000007b, 0x00000000], // Quote + [0x000000a7, 0x000000b0, 0x00000000, 0x00000000], // Backquote + [0x0000002c, 0x0000003b, 0x00000000, 0x00000000], // Comma + [0x0000002e, 0x0000003a, 0x00000000, 0x00000000], // Period + [0x0000002d, 0x0000005f, 0x00000000, 0x00000000], // Slash ], ), @@ -340,53 +340,53 @@ const List kLayouts = [ name: 'dk', platform: LayoutPlatform.win, mapping: >[ - [0x00000061, 0x00000041, 0x01000000, 0x01000000], // KeyA - [0x00000062, 0x00000042, 0x01000000, 0x01000000], // KeyB - [0x00000063, 0x00000043, 0x01000000, 0x01000000], // KeyC - [0x00000064, 0x00000044, 0x01000000, 0x01000000], // KeyD - [0x00000065, 0x00000045, 0x000020ac, 0x01000000], // KeyE - [0x00000066, 0x00000046, 0x01000000, 0x01000000], // KeyF - [0x00000067, 0x00000047, 0x01000000, 0x01000000], // KeyG - [0x00000068, 0x00000048, 0x01000000, 0x01000000], // KeyH - [0x00000069, 0x00000049, 0x01000000, 0x01000000], // KeyI - [0x0000006a, 0x0000004a, 0x01000000, 0x01000000], // KeyJ - [0x0000006b, 0x0000004b, 0x01000000, 0x01000000], // KeyK - [0x0000006c, 0x0000004c, 0x01000000, 0x01000000], // KeyL - [0x0000006d, 0x0000004d, 0x000000b5, 0x01000000], // KeyM - [0x0000006e, 0x0000004e, 0x01000000, 0x01000000], // KeyN - [0x0000006f, 0x0000004f, 0x01000000, 0x01000000], // KeyO - [0x00000070, 0x00000050, 0x01000000, 0x01000000], // KeyP - [0x00000071, 0x00000051, 0x01000000, 0x01000000], // KeyQ - [0x00000072, 0x00000052, 0x01000000, 0x01000000], // KeyR - [0x00000073, 0x00000053, 0x01000000, 0x01000000], // KeyS - [0x00000074, 0x00000054, 0x01000000, 0x01000000], // KeyT - [0x00000075, 0x00000055, 0x01000000, 0x01000000], // KeyU - [0x00000076, 0x00000056, 0x01000000, 0x01000000], // KeyV - [0x00000077, 0x00000057, 0x01000000, 0x01000000], // KeyW - [0x00000078, 0x00000058, 0x01000000, 0x01000000], // KeyX - [0x00000079, 0x00000059, 0x01000000, 0x01000000], // KeyY - [0x0000007a, 0x0000005a, 0x01000000, 0x01000000], // KeyZ - [0x00000031, 0x00000021, 0x01000000, 0x01000000], // Digit1 - [0x00000032, 0x00000022, 0x00000040, 0x01000000], // Digit2 - [0x00000033, 0x00000023, 0x000000a3, 0x01000000], // Digit3 - [0x00000034, 0x000000a4, 0x00000024, 0x01000000], // Digit4 - [0x00000035, 0x00000025, 0x000020ac, 0x01000000], // Digit5 - [0x00000036, 0x00000026, 0x01000000, 0x01000000], // Digit6 - [0x00000037, 0x0000002f, 0x0000007b, 0x01000000], // Digit7 - [0x00000038, 0x00000028, 0x0000005b, 0x01000000], // Digit8 - [0x00000039, 0x00000029, 0x0000005d, 0x01000000], // Digit9 - [0x00000030, 0x0000003d, 0x0000007d, 0x01000000], // Digit0 - [0x0000002b, 0x0000003f, 0x01000000, 0x01000000], // Minus - [0x000000b4, 0x00000060, 0x0000007c, 0x01000000], // Equal - [0x000000e5, 0x000000c5, 0x01000000, 0x01000000], // BracketLeft - [0x000000a8, 0x0000005e, 0x0000007e, 0x01000000], // BracketRight - [0x00000027, 0x0000002a, 0x01000000, 0x01000000], // Backslash - [0x000000e6, 0x000000c6, 0x01000000, 0x01000000], // Semicolon - [0x000000f8, 0x000000d8, 0x01000000, 0x01000000], // Quote - [0x000000bd, 0x000000a7, 0x01000000, 0x01000000], // Backquote - [0x0000002c, 0x0000003b, 0x01000000, 0x01000000], // Comma - [0x0000002e, 0x0000003a, 0x01000000, 0x01000000], // Period - [0x0000002d, 0x0000005f, 0x01000000, 0x01000000], // Slash + [0x00000061, 0x00000041, 0x00000000, 0x00000000], // KeyA + [0x00000062, 0x00000042, 0x00000000, 0x00000000], // KeyB + [0x00000063, 0x00000043, 0x00000000, 0x00000000], // KeyC + [0x00000064, 0x00000044, 0x00000000, 0x00000000], // KeyD + [0x00000065, 0x00000045, 0x000020ac, 0x00000000], // KeyE + [0x00000066, 0x00000046, 0x00000000, 0x00000000], // KeyF + [0x00000067, 0x00000047, 0x00000000, 0x00000000], // KeyG + [0x00000068, 0x00000048, 0x00000000, 0x00000000], // KeyH + [0x00000069, 0x00000049, 0x00000000, 0x00000000], // KeyI + [0x0000006a, 0x0000004a, 0x00000000, 0x00000000], // KeyJ + [0x0000006b, 0x0000004b, 0x00000000, 0x00000000], // KeyK + [0x0000006c, 0x0000004c, 0x00000000, 0x00000000], // KeyL + [0x0000006d, 0x0000004d, 0x000000b5, 0x00000000], // KeyM + [0x0000006e, 0x0000004e, 0x00000000, 0x00000000], // KeyN + [0x0000006f, 0x0000004f, 0x00000000, 0x00000000], // KeyO + [0x00000070, 0x00000050, 0x00000000, 0x00000000], // KeyP + [0x00000071, 0x00000051, 0x00000000, 0x00000000], // KeyQ + [0x00000072, 0x00000052, 0x00000000, 0x00000000], // KeyR + [0x00000073, 0x00000053, 0x00000000, 0x00000000], // KeyS + [0x00000074, 0x00000054, 0x00000000, 0x00000000], // KeyT + [0x00000075, 0x00000055, 0x00000000, 0x00000000], // KeyU + [0x00000076, 0x00000056, 0x00000000, 0x00000000], // KeyV + [0x00000077, 0x00000057, 0x00000000, 0x00000000], // KeyW + [0x00000078, 0x00000058, 0x00000000, 0x00000000], // KeyX + [0x00000079, 0x00000059, 0x00000000, 0x00000000], // KeyY + [0x0000007a, 0x0000005a, 0x00000000, 0x00000000], // KeyZ + [0x00000031, 0x00000021, 0x00000000, 0x00000000], // Digit1 + [0x00000032, 0x00000022, 0x00000040, 0x00000000], // Digit2 + [0x00000033, 0x00000023, 0x000000a3, 0x00000000], // Digit3 + [0x00000034, 0x000000a4, 0x00000024, 0x00000000], // Digit4 + [0x00000035, 0x00000025, 0x000020ac, 0x00000000], // Digit5 + [0x00000036, 0x00000026, 0x00000000, 0x00000000], // Digit6 + [0x00000037, 0x0000002f, 0x0000007b, 0x00000000], // Digit7 + [0x00000038, 0x00000028, 0x0000005b, 0x00000000], // Digit8 + [0x00000039, 0x00000029, 0x0000005d, 0x00000000], // Digit9 + [0x00000030, 0x0000003d, 0x0000007d, 0x00000000], // Digit0 + [0x0000002b, 0x0000003f, 0x00000000, 0x00000000], // Minus + [0x000000b4, 0x00000060, 0x0000007c, 0x00000000], // Equal + [0x000000e5, 0x000000c5, 0x00000000, 0x00000000], // BracketLeft + [0x000000a8, 0x0000005e, 0x0000007e, 0x00000000], // BracketRight + [0x00000027, 0x0000002a, 0x00000000, 0x00000000], // Backslash + [0x000000e6, 0x000000c6, 0x00000000, 0x00000000], // Semicolon + [0x000000f8, 0x000000d8, 0x00000000, 0x00000000], // Quote + [0x000000bd, 0x000000a7, 0x00000000, 0x00000000], // Backquote + [0x0000002c, 0x0000003b, 0x00000000, 0x00000000], // Comma + [0x0000002e, 0x0000003a, 0x00000000, 0x00000000], // Period + [0x0000002d, 0x0000005f, 0x00000000, 0x00000000], // Slash ], ), @@ -397,15 +397,15 @@ const List kLayouts = [ [0x00000061, 0x00000041, 0x000000e5, 0x000000c5], // KeyA [0x00000078, 0x00000058, 0x00002248, 0x000002db], // KeyB [0x0000006a, 0x0000004a, 0x00002206, 0x000000d4], // KeyC - [0x00000065, 0x00000045, 0x01000000, 0x000000b4], // KeyD + [0x00000065, 0x00000045, 0x000000b4, 0x000000b4], // KeyD [0x0000002e, 0x0000003e, 0x00002265, 0x000002d8], // KeyE - [0x00000075, 0x00000055, 0x01000000, 0x000000a8], // KeyF - [0x00000069, 0x00000049, 0x01000000, 0x000002c6], // KeyG + [0x00000075, 0x00000055, 0x000000a8, 0x000000a8], // KeyF + [0x00000069, 0x00000049, 0x000002c6, 0x000002c6], // KeyG [0x00000064, 0x00000044, 0x00002202, 0x000000ce], // KeyH [0x00000063, 0x00000043, 0x000000e7, 0x000000c7], // KeyI [0x00000068, 0x00000048, 0x000002d9, 0x000000d3], // KeyJ [0x00000074, 0x00000054, 0x00002020, 0x000002c7], // KeyK - [0x0000006e, 0x0000004e, 0x01000000, 0x000002dc], // KeyL + [0x0000006e, 0x0000004e, 0x000002dc, 0x000002dc], // KeyL [0x0000006d, 0x0000004d, 0x000000b5, 0x000000c2], // KeyM [0x00000062, 0x00000042, 0x0000222b, 0x00000131], // KeyN [0x00000072, 0x00000052, 0x000000ae, 0x00002030], // KeyO @@ -437,63 +437,225 @@ const List kLayouts = [ [0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb], // Backslash [0x00000073, 0x00000053, 0x000000df, 0x000000cd], // Semicolon [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Quote - [0x00000060, 0x0000007e, 0x01000000, 0x00000060], // Backquote + [0x00000060, 0x0000007e, 0x00000060, 0x00000060], // Backquote [0x00000077, 0x00000057, 0x00002211, 0x0000201e], // Comma [0x00000076, 0x00000056, 0x0000221a, 0x000025ca], // Period [0x0000007a, 0x0000005a, 0x000003a9, 0x000000b8], // Slash ], ), + LayoutInfo( + name: 'en', + platform: LayoutPlatform.win, + mapping: >[ + [0x00000061, 0x00000041, 0x00000000, 0x00000000], // KeyA + [0x00000062, 0x00000042, 0x00000000, 0x00000000], // KeyB + [0x00000063, 0x00000043, 0x00000000, 0x00000000], // KeyC + [0x00000064, 0x00000044, 0x00000000, 0x00000000], // KeyD + [0x00000065, 0x00000045, 0x00000000, 0x00000000], // KeyE + [0x00000066, 0x00000046, 0x00000000, 0x00000000], // KeyF + [0x00000067, 0x00000047, 0x00000000, 0x00000000], // KeyG + [0x00000068, 0x00000048, 0x00000000, 0x00000000], // KeyH + [0x00000069, 0x00000049, 0x00000000, 0x00000000], // KeyI + [0x0000006a, 0x0000004a, 0x00000000, 0x00000000], // KeyJ + [0x0000006b, 0x0000004b, 0x00000000, 0x00000000], // KeyK + [0x0000006c, 0x0000004c, 0x00000000, 0x00000000], // KeyL + [0x0000006d, 0x0000004d, 0x00000000, 0x00000000], // KeyM + [0x0000006e, 0x0000004e, 0x00000000, 0x00000000], // KeyN + [0x0000006f, 0x0000004f, 0x00000000, 0x00000000], // KeyO + [0x00000070, 0x00000050, 0x00000000, 0x00000000], // KeyP + [0x00000071, 0x00000051, 0x00000000, 0x00000000], // KeyQ + [0x00000072, 0x00000052, 0x00000000, 0x00000000], // KeyR + [0x00000073, 0x00000053, 0x00000000, 0x00000000], // KeyS + [0x00000074, 0x00000054, 0x00000000, 0x00000000], // KeyT + [0x00000075, 0x00000055, 0x00000000, 0x00000000], // KeyU + [0x00000076, 0x00000056, 0x00000000, 0x00000000], // KeyV + [0x00000077, 0x00000057, 0x00000000, 0x00000000], // KeyW + [0x00000078, 0x00000058, 0x00000000, 0x00000000], // KeyX + [0x00000079, 0x00000059, 0x00000000, 0x00000000], // KeyY + [0x0000007a, 0x0000005a, 0x00000000, 0x00000000], // KeyZ + [0x00000031, 0x00000021, 0x00000000, 0x00000000], // Digit1 + [0x00000032, 0x00000040, 0x00000000, 0x00000000], // Digit2 + [0x00000033, 0x00000023, 0x00000000, 0x00000000], // Digit3 + [0x00000034, 0x00000024, 0x00000000, 0x00000000], // Digit4 + [0x00000035, 0x00000025, 0x00000000, 0x00000000], // Digit5 + [0x00000036, 0x0000005e, 0x00000000, 0x00000000], // Digit6 + [0x00000037, 0x00000026, 0x00000000, 0x00000000], // Digit7 + [0x00000038, 0x0000002a, 0x00000000, 0x00000000], // Digit8 + [0x00000039, 0x00000028, 0x00000000, 0x00000000], // Digit9 + [0x00000030, 0x00000029, 0x00000000, 0x00000000], // Digit0 + [0x0000002d, 0x0000005f, 0x00000000, 0x00000000], // Minus + [0x0000003d, 0x0000002b, 0x00000000, 0x00000000], // Equal + [0x0000005b, 0x0000007b, 0x00000000, 0x00000000], // BracketLeft + [0x0000005d, 0x0000007d, 0x00000000, 0x00000000], // BracketRight + [0x0000005c, 0x0000007c, 0x00000000, 0x00000000], // Backslash + [0x0000003b, 0x0000003a, 0x00000000, 0x00000000], // Semicolon + [0x00000027, 0x00000022, 0x00000000, 0x00000000], // Quote + [0x00000060, 0x0000007e, 0x00000000, 0x00000000], // Backquote + [0x0000002c, 0x0000003c, 0x00000000, 0x00000000], // Comma + [0x0000002e, 0x0000003e, 0x00000000, 0x00000000], // Period + [0x0000002f, 0x0000003f, 0x00000000, 0x00000000], // Slash + ], + ), + + LayoutInfo( + name: 'en', + platform: LayoutPlatform.linux, + mapping: >[ + [0x00000061, 0x00000041, 0x00000061, 0x00000041], // KeyA + [0x00000062, 0x00000042, 0x00000062, 0x00000042], // KeyB + [0x00000063, 0x00000043, 0x00000063, 0x00000043], // KeyC + [0x00000064, 0x00000044, 0x00000064, 0x00000044], // KeyD + [0x00000065, 0x00000045, 0x00000065, 0x00000045], // KeyE + [0x00000066, 0x00000046, 0x00000066, 0x00000046], // KeyF + [0x00000067, 0x00000047, 0x00000067, 0x00000047], // KeyG + [0x00000068, 0x00000048, 0x00000068, 0x00000048], // KeyH + [0x00000069, 0x00000049, 0x00000069, 0x00000049], // KeyI + [0x0000006a, 0x0000004a, 0x0000006a, 0x0000004a], // KeyJ + [0x0000006b, 0x0000004b, 0x0000006b, 0x0000004b], // KeyK + [0x0000006c, 0x0000004c, 0x0000006c, 0x0000004c], // KeyL + [0x0000006d, 0x0000004d, 0x0000006d, 0x0000004d], // KeyM + [0x0000006e, 0x0000004e, 0x0000006e, 0x0000004e], // KeyN + [0x0000006f, 0x0000004f, 0x0000006f, 0x0000004f], // KeyO + [0x00000070, 0x00000050, 0x00000070, 0x00000050], // KeyP + [0x00000071, 0x00000051, 0x00000071, 0x00000051], // KeyQ + [0x00000072, 0x00000052, 0x00000072, 0x00000052], // KeyR + [0x00000073, 0x00000053, 0x00000073, 0x00000053], // KeyS + [0x00000074, 0x00000054, 0x00000074, 0x00000054], // KeyT + [0x00000075, 0x00000055, 0x00000075, 0x00000055], // KeyU + [0x00000076, 0x00000056, 0x00000076, 0x00000056], // KeyV + [0x00000077, 0x00000057, 0x00000077, 0x00000057], // KeyW + [0x00000078, 0x00000058, 0x00000078, 0x00000058], // KeyX + [0x00000079, 0x00000059, 0x00000079, 0x00000059], // KeyY + [0x0000007a, 0x0000005a, 0x0000007a, 0x0000005a], // KeyZ + [0x00000031, 0x00000021, 0x00000031, 0x00000021], // Digit1 + [0x00000032, 0x00000040, 0x00000032, 0x00000040], // Digit2 + [0x00000033, 0x00000023, 0x00000033, 0x00000023], // Digit3 + [0x00000034, 0x00000024, 0x00000034, 0x00000024], // Digit4 + [0x00000035, 0x00000025, 0x00000035, 0x00000025], // Digit5 + [0x00000036, 0x0000005e, 0x00000036, 0x0000005e], // Digit6 + [0x00000037, 0x00000026, 0x00000037, 0x00000026], // Digit7 + [0x00000038, 0x0000002a, 0x00000038, 0x0000002a], // Digit8 + [0x00000039, 0x00000028, 0x00000039, 0x00000028], // Digit9 + [0x00000030, 0x00000029, 0x00000030, 0x00000029], // Digit0 + [0x0000002d, 0x0000005f, 0x0000002d, 0x0000005f], // Minus + [0x0000003d, 0x0000002b, 0x0000003d, 0x0000002b], // Equal + [0x0000005b, 0x0000007b, 0x0000005b, 0x0000007b], // BracketLeft + [0x0000005d, 0x0000007d, 0x0000005d, 0x0000007d], // BracketRight + [0x0000005c, 0x0000007c, 0x0000005c, 0x0000007c], // Backslash + [0x0000003b, 0x0000003a, 0x0000003b, 0x0000003a], // Semicolon + [0x00000027, 0x00000022, 0x00000027, 0x00000022], // Quote + [0x00000060, 0x0000007e, 0x00000060, 0x0000007e], // Backquote + [0x0000002c, 0x0000003c, 0x0000002c, 0x0000003c], // Comma + [0x0000002e, 0x0000003e, 0x0000002e, 0x0000003e], // Period + [0x0000002f, 0x0000003f, 0x0000002f, 0x0000003f], // Slash + ], + ), + + LayoutInfo( + name: 'en', + platform: LayoutPlatform.darwin, + mapping: >[ + [0x00000061, 0x00000041, 0x000000e5, 0x000000c5], // KeyA + [0x00000062, 0x00000042, 0x0000222b, 0x00000131], // KeyB + [0x00000063, 0x00000043, 0x000000e7, 0x000000c7], // KeyC + [0x00000064, 0x00000044, 0x00002202, 0x000000ce], // KeyD + [0x00000065, 0x00000045, 0x000000b4, 0x000000b4], // KeyE + [0x00000066, 0x00000046, 0x00000192, 0x000000cf], // KeyF + [0x00000067, 0x00000047, 0x000000a9, 0x000002dd], // KeyG + [0x00000068, 0x00000048, 0x000002d9, 0x000000d3], // KeyH + [0x00000069, 0x00000049, 0x000002c6, 0x000002c6], // KeyI + [0x0000006a, 0x0000004a, 0x00002206, 0x000000d4], // KeyJ + [0x0000006b, 0x0000004b, 0x000002da, 0x0000f8ff], // KeyK + [0x0000006c, 0x0000004c, 0x000000ac, 0x000000d2], // KeyL + [0x0000006d, 0x0000004d, 0x000000b5, 0x000000c2], // KeyM + [0x0000006e, 0x0000004e, 0x000002dc, 0x000002dc], // KeyN + [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO + [0x00000070, 0x00000050, 0x000003c0, 0x0000220f], // KeyP + [0x00000071, 0x00000051, 0x00000153, 0x00000152], // KeyQ + [0x00000072, 0x00000052, 0x000000ae, 0x00002030], // KeyR + [0x00000073, 0x00000053, 0x000000df, 0x000000cd], // KeyS + [0x00000074, 0x00000054, 0x00002020, 0x000002c7], // KeyT + [0x00000075, 0x00000055, 0x000000a8, 0x000000a8], // KeyU + [0x00000076, 0x00000056, 0x0000221a, 0x000025ca], // KeyV + [0x00000077, 0x00000057, 0x00002211, 0x0000201e], // KeyW + [0x00000078, 0x00000058, 0x00002248, 0x000002db], // KeyX + [0x00000079, 0x00000059, 0x000000a5, 0x000000c1], // KeyY + [0x0000007a, 0x0000005a, 0x000003a9, 0x000000b8], // KeyZ + [0x00000031, 0x00000021, 0x000000a1, 0x00002044], // Digit1 + [0x00000032, 0x00000040, 0x00002122, 0x000020ac], // Digit2 + [0x00000033, 0x00000023, 0x000000a3, 0x00002039], // Digit3 + [0x00000034, 0x00000024, 0x000000a2, 0x0000203a], // Digit4 + [0x00000035, 0x00000025, 0x0000221e, 0x0000fb01], // Digit5 + [0x00000036, 0x0000005e, 0x000000a7, 0x0000fb02], // Digit6 + [0x00000037, 0x00000026, 0x000000b6, 0x00002021], // Digit7 + [0x00000038, 0x0000002a, 0x00002022, 0x000000b0], // Digit8 + [0x00000039, 0x00000028, 0x000000aa, 0x000000b7], // Digit9 + [0x00000030, 0x00000029, 0x000000ba, 0x0000201a], // Digit0 + [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Minus + [0x0000003d, 0x0000002b, 0x00002260, 0x000000b1], // Equal + [0x0000005b, 0x0000007b, 0x0000201c, 0x0000201d], // BracketLeft + [0x0000005d, 0x0000007d, 0x00002018, 0x00002019], // BracketRight + [0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb], // Backslash + [0x0000003b, 0x0000003a, 0x00002026, 0x000000da], // Semicolon + [0x00000027, 0x00000022, 0x000000e6, 0x000000c6], // Quote + [0x00000060, 0x0000007e, 0x00000060, 0x00000060], // Backquote + [0x0000002c, 0x0000003c, 0x00002264, 0x000000af], // Comma + [0x0000002e, 0x0000003e, 0x00002265, 0x000002d8], // Period + [0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf], // Slash + ], + ), + LayoutInfo( name: 'en-belgian', platform: LayoutPlatform.win, mapping: >[ - [0x00000071, 0x00000051, 0x01000000, 0x01000000], // KeyA - [0x00000062, 0x00000042, 0x01000000, 0x01000000], // KeyB - [0x00000063, 0x00000043, 0x01000000, 0x01000000], // KeyC - [0x00000064, 0x00000044, 0x01000000, 0x01000000], // KeyD - [0x00000065, 0x00000045, 0x000020ac, 0x01000000], // KeyE - [0x00000066, 0x00000046, 0x01000000, 0x01000000], // KeyF - [0x00000067, 0x00000047, 0x01000000, 0x01000000], // KeyG - [0x00000068, 0x00000048, 0x01000000, 0x01000000], // KeyH - [0x00000069, 0x00000049, 0x01000000, 0x01000000], // KeyI - [0x0000006a, 0x0000004a, 0x01000000, 0x01000000], // KeyJ - [0x0000006b, 0x0000004b, 0x01000000, 0x01000000], // KeyK - [0x0000006c, 0x0000004c, 0x01000000, 0x01000000], // KeyL - [0x0000002c, 0x0000003f, 0x01000000, 0x01000000], // KeyM - [0x0000006e, 0x0000004e, 0x01000000, 0x01000000], // KeyN - [0x0000006f, 0x0000004f, 0x01000000, 0x01000000], // KeyO - [0x00000070, 0x00000050, 0x01000000, 0x01000000], // KeyP - [0x00000061, 0x00000041, 0x01000000, 0x01000000], // KeyQ - [0x00000072, 0x00000052, 0x01000000, 0x01000000], // KeyR - [0x00000073, 0x00000053, 0x01000000, 0x01000000], // KeyS - [0x00000074, 0x00000054, 0x01000000, 0x01000000], // KeyT - [0x00000075, 0x00000055, 0x01000000, 0x01000000], // KeyU - [0x00000076, 0x00000056, 0x01000000, 0x01000000], // KeyV - [0x0000007a, 0x0000005a, 0x01000000, 0x01000000], // KeyW - [0x00000078, 0x00000058, 0x01000000, 0x01000000], // KeyX - [0x00000079, 0x00000059, 0x01000000, 0x01000000], // KeyY - [0x00000077, 0x00000057, 0x01000000, 0x01000000], // KeyZ - [0x00000026, 0x00000031, 0x0000007c, 0x01000000], // Digit1 - [0x000000e9, 0x00000032, 0x00000040, 0x01000000], // Digit2 - [0x00000022, 0x00000033, 0x00000023, 0x01000000], // Digit3 - [0x00000027, 0x00000034, 0x0000007b, 0x01000000], // Digit4 - [0x00000028, 0x00000035, 0x0000005b, 0x01000000], // Digit5 - [0x000000a7, 0x00000036, 0x0000005e, 0x01000000], // Digit6 - [0x000000e8, 0x00000037, 0x01000000, 0x01000000], // Digit7 - [0x00000021, 0x00000038, 0x01000000, 0x01000000], // Digit8 - [0x000000e7, 0x00000039, 0x0000007b, 0x01000000], // Digit9 - [0x000000e0, 0x00000030, 0x0000007d, 0x01000000], // Digit0 - [0x00000029, 0x000000b0, 0x01000000, 0x01000000], // Minus - [0x0000002d, 0x0000005f, 0x01000000, 0x01000000], // Equal - [0x0000005e, 0x000000a8, 0x0000005b, 0x01000000], // BracketLeft - [0x00000024, 0x0000002a, 0x0000005d, 0x01000000], // BracketRight + [0x00000071, 0x00000051, 0x00000000, 0x00000000], // KeyA + [0x00000062, 0x00000042, 0x00000000, 0x00000000], // KeyB + [0x00000063, 0x00000043, 0x00000000, 0x00000000], // KeyC + [0x00000064, 0x00000044, 0x00000000, 0x00000000], // KeyD + [0x00000065, 0x00000045, 0x000020ac, 0x00000000], // KeyE + [0x00000066, 0x00000046, 0x00000000, 0x00000000], // KeyF + [0x00000067, 0x00000047, 0x00000000, 0x00000000], // KeyG + [0x00000068, 0x00000048, 0x00000000, 0x00000000], // KeyH + [0x00000069, 0x00000049, 0x00000000, 0x00000000], // KeyI + [0x0000006a, 0x0000004a, 0x00000000, 0x00000000], // KeyJ + [0x0000006b, 0x0000004b, 0x00000000, 0x00000000], // KeyK + [0x0000006c, 0x0000004c, 0x00000000, 0x00000000], // KeyL + [0x0000002c, 0x0000003f, 0x00000000, 0x00000000], // KeyM + [0x0000006e, 0x0000004e, 0x00000000, 0x00000000], // KeyN + [0x0000006f, 0x0000004f, 0x00000000, 0x00000000], // KeyO + [0x00000070, 0x00000050, 0x00000000, 0x00000000], // KeyP + [0x00000061, 0x00000041, 0x00000000, 0x00000000], // KeyQ + [0x00000072, 0x00000052, 0x00000000, 0x00000000], // KeyR + [0x00000073, 0x00000053, 0x00000000, 0x00000000], // KeyS + [0x00000074, 0x00000054, 0x00000000, 0x00000000], // KeyT + [0x00000075, 0x00000055, 0x00000000, 0x00000000], // KeyU + [0x00000076, 0x00000056, 0x00000000, 0x00000000], // KeyV + [0x0000007a, 0x0000005a, 0x00000000, 0x00000000], // KeyW + [0x00000078, 0x00000058, 0x00000000, 0x00000000], // KeyX + [0x00000079, 0x00000059, 0x00000000, 0x00000000], // KeyY + [0x00000077, 0x00000057, 0x00000000, 0x00000000], // KeyZ + [0x00000026, 0x00000031, 0x0000007c, 0x00000000], // Digit1 + [0x000000e9, 0x00000032, 0x00000040, 0x00000000], // Digit2 + [0x00000022, 0x00000033, 0x00000023, 0x00000000], // Digit3 + [0x00000027, 0x00000034, 0x0000007b, 0x00000000], // Digit4 + [0x00000028, 0x00000035, 0x0000005b, 0x00000000], // Digit5 + [0x000000a7, 0x00000036, 0x0000005e, 0x00000000], // Digit6 + [0x000000e8, 0x00000037, 0x00000000, 0x00000000], // Digit7 + [0x00000021, 0x00000038, 0x00000000, 0x00000000], // Digit8 + [0x000000e7, 0x00000039, 0x0000007b, 0x00000000], // Digit9 + [0x000000e0, 0x00000030, 0x0000007d, 0x00000000], // Digit0 + [0x00000029, 0x000000b0, 0x00000000, 0x00000000], // Minus + [0x0000002d, 0x0000005f, 0x00000000, 0x00000000], // Equal + [0x0000005e, 0x000000a8, 0x0000005b, 0x00000000], // BracketLeft + [0x00000024, 0x0000002a, 0x0000005d, 0x00000000], // BracketRight [0x000000b5, 0x000000a3, 0x00000060, 0x00000060], // Backslash - [0x0000006d, 0x0000004d, 0x01000000, 0x01000000], // Semicolon + [0x0000006d, 0x0000004d, 0x00000000, 0x00000000], // Semicolon [0x000000f9, 0x00000025, 0x000000b4, 0x000000b4], // Quote - [0x000000b2, 0x000000b3, 0x01000000, 0x01000000], // Backquote - [0x0000003b, 0x0000002e, 0x01000000, 0x01000000], // Comma - [0x0000003a, 0x0000002f, 0x01000000, 0x01000000], // Period + [0x000000b2, 0x000000b3, 0x00000000, 0x00000000], // Backquote + [0x0000003b, 0x0000002e, 0x00000000, 0x00000000], // Comma + [0x0000003a, 0x0000002f, 0x00000000, 0x00000000], // Period [0x0000003d, 0x0000002b, 0x0000007e, 0x0000007e], // Slash ], ), @@ -502,38 +664,38 @@ const List kLayouts = [ name: 'en-ext', platform: LayoutPlatform.darwin, mapping: >[ - [0x00000061, 0x00000041, 0x01000000, 0x00000304], // KeyA - [0x00000062, 0x00000042, 0x01000000, 0x00000306], // KeyB - [0x00000063, 0x00000043, 0x01000000, 0x00000327], // KeyC + [0x00000061, 0x00000041, 0x000000af, 0x00000304], // KeyA + [0x00000062, 0x00000042, 0x000002d8, 0x00000306], // KeyB + [0x00000063, 0x00000043, 0x000000b8, 0x00000327], // KeyC [0x00000064, 0x00000044, 0x000000f0, 0x000000d0], // KeyD - [0x00000065, 0x00000045, 0x01000000, 0x00000301], // KeyE - [0x00000066, 0x00000046, 0x00000192, 0x01000000], // KeyF - [0x00000067, 0x00000047, 0x000000a9, 0x01000000], // KeyG - [0x00000068, 0x00000048, 0x01000000, 0x00000331], // KeyH - [0x00000069, 0x00000049, 0x01000000, 0x0000031b], // KeyI - [0x0000006a, 0x0000004a, 0x01000000, 0x0000030b], // KeyJ - [0x0000006b, 0x0000004b, 0x01000000, 0x0000030a], // KeyK - [0x0000006c, 0x0000004c, 0x01000000, 0x00000335], // KeyL - [0x0000006d, 0x0000004d, 0x01000000, 0x00000328], // KeyM - [0x0000006e, 0x0000004e, 0x01000000, 0x00000303], // KeyN + [0x00000065, 0x00000045, 0x000000b4, 0x00000301], // KeyE + [0x00000066, 0x00000046, 0x00000192, 0x00000000], // KeyF + [0x00000067, 0x00000047, 0x000000a9, 0x00002038], // KeyG + [0x00000068, 0x00000048, 0x000002cd, 0x00000331], // KeyH + [0x00000069, 0x00000049, 0x000002bc, 0x0000031b], // KeyI + [0x0000006a, 0x0000004a, 0x000002dd, 0x0000030b], // KeyJ + [0x0000006b, 0x0000004b, 0x000002da, 0x0000030a], // KeyK + [0x0000006c, 0x0000004c, 0x0000002d, 0x00000335], // KeyL + [0x0000006d, 0x0000004d, 0x000002db, 0x00000328], // KeyM + [0x0000006e, 0x0000004e, 0x000002dc, 0x00000303], // KeyN [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO - [0x00000070, 0x00000050, 0x01000000, 0x00000326], // KeyP + [0x00000070, 0x00000050, 0x0000002c, 0x00000326], // KeyP [0x00000071, 0x00000051, 0x00000153, 0x00000152], // KeyQ [0x00000072, 0x00000052, 0x000000ae, 0x00002030], // KeyR - [0x00000073, 0x00000053, 0x000000df, 0x01000000], // KeyS + [0x00000073, 0x00000053, 0x000000df, 0x00000000], // KeyS [0x00000074, 0x00000054, 0x000000fe, 0x000000de], // KeyT - [0x00000075, 0x00000055, 0x01000000, 0x00000308], // KeyU - [0x00000076, 0x00000056, 0x01000000, 0x0000030c], // KeyV - [0x00000077, 0x00000057, 0x01000000, 0x00000307], // KeyW - [0x00000078, 0x00000058, 0x01000000, 0x00000323], // KeyX - [0x00000079, 0x00000059, 0x000000a5, 0x01000000], // KeyY - [0x0000007a, 0x0000005a, 0x01000000, 0x00000309], // KeyZ + [0x00000075, 0x00000055, 0x000000a8, 0x00000308], // KeyU + [0x00000076, 0x00000056, 0x000002c7, 0x0000030c], // KeyV + [0x00000077, 0x00000057, 0x000002d9, 0x00000307], // KeyW + [0x00000078, 0x00000058, 0x0000002e, 0x00000323], // KeyX + [0x00000079, 0x00000059, 0x000000a5, 0x00000000], // KeyY + [0x0000007a, 0x0000005a, 0x000002c0, 0x00000309], // KeyZ [0x00000031, 0x00000021, 0x000000a1, 0x00002044], // Digit1 [0x00000032, 0x00000040, 0x00002122, 0x000020ac], // Digit2 [0x00000033, 0x00000023, 0x000000a3, 0x00002039], // Digit3 [0x00000034, 0x00000024, 0x000000a2, 0x0000203a], // Digit4 [0x00000035, 0x00000025, 0x000000a7, 0x00002020], // Digit5 - [0x00000036, 0x0000005e, 0x01000000, 0x00000302], // Digit6 + [0x00000036, 0x0000005e, 0x000002c6, 0x00000302], // Digit6 [0x00000037, 0x00000026, 0x000000b6, 0x00002021], // Digit7 [0x00000038, 0x0000002a, 0x00002022, 0x000000b0], // Digit8 [0x00000039, 0x00000028, 0x000000aa, 0x000000b7], // Digit9 @@ -543,11 +705,11 @@ const List kLayouts = [ [0x0000005b, 0x0000007b, 0x0000201c, 0x0000201d], // BracketLeft [0x0000005d, 0x0000007d, 0x00002018, 0x00002019], // BracketRight [0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb], // Backslash - [0x0000003b, 0x0000003a, 0x00002026, 0x01000000], // Semicolon + [0x0000003b, 0x0000003a, 0x00002026, 0x00002116], // Semicolon [0x00000027, 0x00000022, 0x000000e6, 0x000000c6], // Quote - [0x00000060, 0x0000007e, 0x01000000, 0x00000300], // Backquote + [0x00000060, 0x0000007e, 0x00000060, 0x00000300], // Backquote [0x0000002c, 0x0000003c, 0x00002264, 0x0000201e], // Comma - [0x0000002e, 0x0000003e, 0x00002265, 0x01000000], // Period + [0x0000002e, 0x0000003e, 0x00002265, 0x00000294], // Period [0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf], // Slash ], ), @@ -557,52 +719,106 @@ const List kLayouts = [ platform: LayoutPlatform.win, mapping: >[ [0x00000061, 0x00000041, 0x00000101, 0x00000100], // KeyA - [0x00000062, 0x00000042, 0x01000000, 0x01000000], // KeyB - [0x00000063, 0x00000043, 0x01000000, 0x01000000], // KeyC + [0x00000062, 0x00000042, 0x00000000, 0x00000000], // KeyB + [0x00000063, 0x00000043, 0x00000000, 0x00000000], // KeyC [0x00000064, 0x00000044, 0x00001e0d, 0x00001e0c], // KeyD [0x00000065, 0x00000045, 0x00000113, 0x00000112], // KeyE - [0x00000066, 0x00000046, 0x01000000, 0x01000000], // KeyF + [0x00000066, 0x00000046, 0x00000000, 0x00000000], // KeyF [0x00000067, 0x00000047, 0x00001e45, 0x00001e44], // KeyG [0x00000068, 0x00000048, 0x00001e25, 0x00001e24], // KeyH [0x00000069, 0x00000049, 0x0000012b, 0x0000012a], // KeyI - [0x0000006a, 0x0000004a, 0x01000000, 0x01000000], // KeyJ - [0x0000006b, 0x0000004b, 0x01000000, 0x01000000], // KeyK + [0x0000006a, 0x0000004a, 0x00000000, 0x00000000], // KeyJ + [0x0000006b, 0x0000004b, 0x00000000, 0x00000000], // KeyK [0x0000006c, 0x0000004c, 0x0000006c, 0x0000004c], // KeyL [0x0000006d, 0x0000004d, 0x00001e41, 0x00001e40], // KeyM [0x0000006e, 0x0000004e, 0x00001e47, 0x00001e46], // KeyN [0x0000006f, 0x0000004f, 0x0000014d, 0x0000014c], // KeyO - [0x00000070, 0x00000050, 0x01000000, 0x01000000], // KeyP + [0x00000070, 0x00000050, 0x00000000, 0x00000000], // KeyP [0x00000071, 0x00000051, 0x000000e6, 0x000000c6], // KeyQ [0x00000072, 0x00000052, 0x00000072, 0x00000052], // KeyR [0x00000073, 0x00000053, 0x0000015b, 0x0000015a], // KeyS [0x00000074, 0x00000054, 0x00001e6d, 0x00001e6c], // KeyT [0x00000075, 0x00000055, 0x0000016b, 0x0000016a], // KeyU - [0x00000076, 0x00000056, 0x01000000, 0x01000000], // KeyV - [0x00000077, 0x00000057, 0x01000000, 0x01000000], // KeyW + [0x00000076, 0x00000056, 0x00000000, 0x00000000], // KeyV + [0x00000077, 0x00000057, 0x00000000, 0x00000000], // KeyW [0x00000078, 0x00000058, 0x00001e63, 0x00001e62], // KeyX [0x00000079, 0x00000059, 0x000000f1, 0x000000d1], // KeyY - [0x0000007a, 0x0000005a, 0x01000000, 0x01000000], // KeyZ - [0x00000031, 0x00000021, 0x01000000, 0x01000000], // Digit1 - [0x00000032, 0x00000040, 0x01000000, 0x01000000], // Digit2 - [0x00000033, 0x00000023, 0x01000000, 0x01000000], // Digit3 - [0x00000034, 0x00000024, 0x000020b9, 0x01000000], // Digit4 - [0x00000035, 0x00000025, 0x01000000, 0x01000000], // Digit5 - [0x00000036, 0x0000005e, 0x01000000, 0x000002c6], // Digit6 - [0x00000037, 0x00000026, 0x01000000, 0x01000000], // Digit7 - [0x00000038, 0x0000002a, 0x01000000, 0x01000000], // Digit8 - [0x00000039, 0x00000028, 0x01000000, 0x000002d8], // Digit9 - [0x00000030, 0x00000029, 0x01000000, 0x01000000], // Digit0 + [0x0000007a, 0x0000005a, 0x00000000, 0x00000000], // KeyZ + [0x00000031, 0x00000021, 0x00000000, 0x00000000], // Digit1 + [0x00000032, 0x00000040, 0x00000000, 0x00000000], // Digit2 + [0x00000033, 0x00000023, 0x00000000, 0x00000000], // Digit3 + [0x00000034, 0x00000024, 0x000020b9, 0x00000000], // Digit4 + [0x00000035, 0x00000025, 0x00000000, 0x00000000], // Digit5 + [0x00000036, 0x0000005e, 0x00000000, 0x000002c6], // Digit6 + [0x00000037, 0x00000026, 0x00000000, 0x00000000], // Digit7 + [0x00000038, 0x0000002a, 0x00000000, 0x00000000], // Digit8 + [0x00000039, 0x00000028, 0x00000000, 0x000002d8], // Digit9 + [0x00000030, 0x00000029, 0x00000000, 0x00000000], // Digit0 [0x0000002d, 0x0000005f, 0x0000002d, 0x000002cd], // Minus - [0x0000003d, 0x0000002b, 0x01000000, 0x01000000], // Equal - [0x0000005b, 0x0000007b, 0x01000000, 0x01000000], // BracketLeft - [0x0000005d, 0x0000007d, 0x01000000, 0x01000000], // BracketRight - [0x0000005c, 0x0000007c, 0x01000000, 0x01000000], // Backslash - [0x0000003b, 0x0000003a, 0x01000000, 0x01000000], // Semicolon - [0x00000027, 0x00000022, 0x01000000, 0x01000000], // Quote - [0x00000060, 0x0000007e, 0x01000000, 0x0000007e], // Backquote + [0x0000003d, 0x0000002b, 0x00000000, 0x00000000], // Equal + [0x0000005b, 0x0000007b, 0x00000000, 0x00000000], // BracketLeft + [0x0000005d, 0x0000007d, 0x00000000, 0x00000000], // BracketRight + [0x0000005c, 0x0000007c, 0x00000000, 0x00000000], // Backslash + [0x0000003b, 0x0000003a, 0x00000000, 0x00000000], // Semicolon + [0x00000027, 0x00000022, 0x00000000, 0x00000000], // Quote + [0x00000060, 0x0000007e, 0x00000000, 0x0000007e], // Backquote [0x0000002c, 0x0000003c, 0x0000002c, 0x0000003c], // Comma - [0x0000002e, 0x0000003e, 0x0000002e, 0x01000000], // Period - [0x0000002f, 0x0000003f, 0x01000000, 0x01000000], // Slash + [0x0000002e, 0x0000003e, 0x0000002e, 0x00000000], // Period + [0x0000002f, 0x0000003f, 0x00000000, 0x00000000], // Slash + ], + ), + + LayoutInfo( + name: 'en-intl', + platform: LayoutPlatform.win, + mapping: >[ + [0x00000061, 0x00000041, 0x000000e1, 0x000000c1], // KeyA + [0x00000062, 0x00000042, 0x00000000, 0x00000000], // KeyB + [0x00000063, 0x00000043, 0x000000a9, 0x000000a2], // KeyC + [0x00000064, 0x00000044, 0x000000f0, 0x000000d0], // KeyD + [0x00000065, 0x00000045, 0x000000e9, 0x000000c9], // KeyE + [0x00000066, 0x00000046, 0x00000000, 0x00000000], // KeyF + [0x00000067, 0x00000047, 0x00000000, 0x00000000], // KeyG + [0x00000068, 0x00000048, 0x00000000, 0x00000000], // KeyH + [0x00000069, 0x00000049, 0x000000ed, 0x000000cd], // KeyI + [0x0000006a, 0x0000004a, 0x00000000, 0x00000000], // KeyJ + [0x0000006b, 0x0000004b, 0x00000000, 0x00000000], // KeyK + [0x0000006c, 0x0000004c, 0x000000f8, 0x000000d8], // KeyL + [0x0000006d, 0x0000004d, 0x000000b5, 0x00000000], // KeyM + [0x0000006e, 0x0000004e, 0x000000f1, 0x000000d1], // KeyN + [0x0000006f, 0x0000004f, 0x000000f3, 0x000000d3], // KeyO + [0x00000070, 0x00000050, 0x000000f6, 0x000000d6], // KeyP + [0x00000071, 0x00000051, 0x000000e4, 0x000000c4], // KeyQ + [0x00000072, 0x00000052, 0x000000ae, 0x00000000], // KeyR + [0x00000073, 0x00000053, 0x000000df, 0x000000a7], // KeyS + [0x00000074, 0x00000054, 0x000000fe, 0x000000de], // KeyT + [0x00000075, 0x00000055, 0x000000fa, 0x000000da], // KeyU + [0x00000076, 0x00000056, 0x00000000, 0x00000000], // KeyV + [0x00000077, 0x00000057, 0x000000e5, 0x000000c5], // KeyW + [0x00000078, 0x00000058, 0x00000000, 0x00000000], // KeyX + [0x00000079, 0x00000059, 0x000000fc, 0x000000dc], // KeyY + [0x0000007a, 0x0000005a, 0x000000e6, 0x000000c6], // KeyZ + [0x00000031, 0x00000021, 0x000000a1, 0x000000b9], // Digit1 + [0x00000032, 0x00000040, 0x000000b2, 0x00000000], // Digit2 + [0x00000033, 0x00000023, 0x000000b3, 0x00000000], // Digit3 + [0x00000034, 0x00000024, 0x000000a4, 0x000000a3], // Digit4 + [0x00000035, 0x00000025, 0x000020ac, 0x00000000], // Digit5 + [0x00000036, 0x0000005e, 0x000000bc, 0x00000000], // Digit6 + [0x00000037, 0x00000026, 0x000000bd, 0x00000000], // Digit7 + [0x00000038, 0x0000002a, 0x000000be, 0x00000000], // Digit8 + [0x00000039, 0x00000028, 0x00002018, 0x00000000], // Digit9 + [0x00000030, 0x00000029, 0x00002019, 0x00000000], // Digit0 + [0x0000002d, 0x0000005f, 0x000000a5, 0x00000000], // Minus + [0x0000003d, 0x0000002b, 0x000000d7, 0x000000f7], // Equal + [0x0000005b, 0x0000007b, 0x000000ab, 0x00000000], // BracketLeft + [0x0000005d, 0x0000007d, 0x000000bb, 0x00000000], // BracketRight + [0x0000005c, 0x0000007c, 0x000000ac, 0x000000a6], // Backslash + [0x0000003b, 0x0000003a, 0x000000b6, 0x000000b0], // Semicolon + [0x00000027, 0x00000022, 0x000000b4, 0x000000a8], // Quote + [0x00000060, 0x0000007e, 0x00000000, 0x00000000], // Backquote + [0x0000002c, 0x0000003c, 0x000000e7, 0x000000c7], // Comma + [0x0000002e, 0x0000003e, 0x00000000, 0x00000000], // Period + [0x0000002f, 0x0000003f, 0x000000bf, 0x00000000], // Slash ], ), @@ -614,23 +830,23 @@ const List kLayouts = [ [0x00000062, 0x00000042, 0x0000222b, 0x00000131], // KeyB [0x00000063, 0x00000043, 0x000000e7, 0x000000c7], // KeyC [0x00000064, 0x00000044, 0x00002202, 0x000000ce], // KeyD - [0x00000065, 0x00000045, 0x01000000, 0x000000b4], // KeyE + [0x00000065, 0x00000045, 0x000000b4, 0x000000b4], // KeyE [0x00000066, 0x00000046, 0x00000192, 0x000000cf], // KeyF [0x00000067, 0x00000047, 0x000000a9, 0x000002dd], // KeyG [0x00000068, 0x00000048, 0x000002d9, 0x000000d3], // KeyH - [0x00000069, 0x00000049, 0x01000000, 0x000002c6], // KeyI + [0x00000069, 0x00000049, 0x000002c6, 0x000002c6], // KeyI [0x0000006a, 0x0000004a, 0x00002206, 0x000000d4], // KeyJ [0x0000006b, 0x0000004b, 0x000002da, 0x0000f8ff], // KeyK [0x0000006c, 0x0000004c, 0x000000ac, 0x000000d2], // KeyL [0x0000006d, 0x0000004d, 0x000000b5, 0x000000c2], // KeyM - [0x0000006e, 0x0000004e, 0x01000000, 0x000002dc], // KeyN + [0x0000006e, 0x0000004e, 0x000002dc, 0x000002dc], // KeyN [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO [0x00000070, 0x00000050, 0x000003c0, 0x0000220f], // KeyP [0x00000071, 0x00000051, 0x00000153, 0x00000152], // KeyQ [0x00000072, 0x00000052, 0x000000ae, 0x00002030], // KeyR [0x00000073, 0x00000053, 0x000000df, 0x000000cd], // KeyS [0x00000074, 0x00000054, 0x00002020, 0x000002c7], // KeyT - [0x00000075, 0x00000055, 0x01000000, 0x000000a8], // KeyU + [0x00000075, 0x00000055, 0x000000a8, 0x000000a8], // KeyU [0x00000076, 0x00000056, 0x0000221a, 0x000025ca], // KeyV [0x00000077, 0x00000057, 0x00002211, 0x0000201e], // KeyW [0x00000078, 0x00000058, 0x00002248, 0x000002db], // KeyX @@ -641,7 +857,7 @@ const List kLayouts = [ [0x00000033, 0x00000023, 0x000000a3, 0x00002039], // Digit3 [0x00000034, 0x00000024, 0x000000a2, 0x0000203a], // Digit4 [0x00000035, 0x00000025, 0x0000221e, 0x0000fb01], // Digit5 - [0x00000036, 0x01000000, 0x000000a7, 0x0000fb02], // Digit6 + [0x00000036, 0x000002c6, 0x000000a7, 0x0000fb02], // Digit6 [0x00000037, 0x00000026, 0x000000b6, 0x00002021], // Digit7 [0x00000038, 0x0000002a, 0x00002022, 0x000000b0], // Digit8 [0x00000039, 0x00000028, 0x000000aa, 0x000000b7], // Digit9 @@ -652,8 +868,8 @@ const List kLayouts = [ [0x0000005d, 0x0000007d, 0x00002018, 0x00002019], // BracketRight [0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb], // Backslash [0x0000003b, 0x0000003a, 0x00002026, 0x000000da], // Semicolon - [0x01000000, 0x01000000, 0x000000e6, 0x000000c6], // Quote - [0x01000000, 0x01000000, 0x01000000, 0x00000060], // Backquote + [0x00000027, 0x00000022, 0x000000e6, 0x000000c6], // Quote + [0x00000060, 0x000002dc, 0x00000060, 0x00000060], // Backquote [0x0000002c, 0x0000003c, 0x00002264, 0x000000af], // Comma [0x0000002e, 0x0000003e, 0x00002265, 0x000002d8], // Period [0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf], // Slash @@ -661,56 +877,56 @@ const List kLayouts = [ ), LayoutInfo( - name: 'en-intl', + name: 'en-uk', platform: LayoutPlatform.win, mapping: >[ [0x00000061, 0x00000041, 0x000000e1, 0x000000c1], // KeyA - [0x00000062, 0x00000042, 0x01000000, 0x01000000], // KeyB - [0x00000063, 0x00000043, 0x000000a9, 0x000000a2], // KeyC - [0x00000064, 0x00000044, 0x000000f0, 0x000000d0], // KeyD + [0x00000062, 0x00000042, 0x00000000, 0x00000000], // KeyB + [0x00000063, 0x00000043, 0x00000000, 0x00000000], // KeyC + [0x00000064, 0x00000044, 0x00000000, 0x00000000], // KeyD [0x00000065, 0x00000045, 0x000000e9, 0x000000c9], // KeyE - [0x00000066, 0x00000046, 0x01000000, 0x01000000], // KeyF - [0x00000067, 0x00000047, 0x01000000, 0x01000000], // KeyG - [0x00000068, 0x00000048, 0x01000000, 0x01000000], // KeyH + [0x00000066, 0x00000046, 0x00000000, 0x00000000], // KeyF + [0x00000067, 0x00000047, 0x00000000, 0x00000000], // KeyG + [0x00000068, 0x00000048, 0x00000000, 0x00000000], // KeyH [0x00000069, 0x00000049, 0x000000ed, 0x000000cd], // KeyI - [0x0000006a, 0x0000004a, 0x01000000, 0x01000000], // KeyJ - [0x0000006b, 0x0000004b, 0x01000000, 0x01000000], // KeyK - [0x0000006c, 0x0000004c, 0x000000f8, 0x000000d8], // KeyL - [0x0000006d, 0x0000004d, 0x000000b5, 0x01000000], // KeyM - [0x0000006e, 0x0000004e, 0x000000f1, 0x000000d1], // KeyN + [0x0000006a, 0x0000004a, 0x00000000, 0x00000000], // KeyJ + [0x0000006b, 0x0000004b, 0x00000000, 0x00000000], // KeyK + [0x0000006c, 0x0000004c, 0x00000000, 0x00000000], // KeyL + [0x0000006d, 0x0000004d, 0x00000000, 0x00000000], // KeyM + [0x0000006e, 0x0000004e, 0x00000000, 0x00000000], // KeyN [0x0000006f, 0x0000004f, 0x000000f3, 0x000000d3], // KeyO - [0x00000070, 0x00000050, 0x000000f6, 0x000000d6], // KeyP - [0x00000071, 0x00000051, 0x000000e4, 0x000000c4], // KeyQ - [0x00000072, 0x00000052, 0x000000ae, 0x01000000], // KeyR - [0x00000073, 0x00000053, 0x000000df, 0x000000a7], // KeyS - [0x00000074, 0x00000054, 0x000000fe, 0x000000de], // KeyT + [0x00000070, 0x00000050, 0x00000000, 0x00000000], // KeyP + [0x00000071, 0x00000051, 0x00000000, 0x00000000], // KeyQ + [0x00000072, 0x00000052, 0x00000000, 0x00000000], // KeyR + [0x00000073, 0x00000053, 0x00000000, 0x00000000], // KeyS + [0x00000074, 0x00000054, 0x00000000, 0x00000000], // KeyT [0x00000075, 0x00000055, 0x000000fa, 0x000000da], // KeyU - [0x00000076, 0x00000056, 0x01000000, 0x01000000], // KeyV - [0x00000077, 0x00000057, 0x000000e5, 0x000000c5], // KeyW - [0x00000078, 0x00000058, 0x01000000, 0x01000000], // KeyX - [0x00000079, 0x00000059, 0x000000fc, 0x000000dc], // KeyY - [0x0000007a, 0x0000005a, 0x000000e6, 0x000000c6], // KeyZ - [0x00000031, 0x00000021, 0x000000a1, 0x000000b9], // Digit1 - [0x00000032, 0x00000040, 0x000000b2, 0x01000000], // Digit2 - [0x00000033, 0x00000023, 0x000000b3, 0x01000000], // Digit3 - [0x00000034, 0x00000024, 0x000000a4, 0x000000a3], // Digit4 - [0x00000035, 0x00000025, 0x000020ac, 0x01000000], // Digit5 - [0x00000036, 0x0000005e, 0x000000bc, 0x01000000], // Digit6 - [0x00000037, 0x00000026, 0x000000bd, 0x01000000], // Digit7 - [0x00000038, 0x0000002a, 0x000000be, 0x01000000], // Digit8 - [0x00000039, 0x00000028, 0x00002018, 0x01000000], // Digit9 - [0x00000030, 0x00000029, 0x00002019, 0x01000000], // Digit0 - [0x0000002d, 0x0000005f, 0x000000a5, 0x01000000], // Minus - [0x0000003d, 0x0000002b, 0x000000d7, 0x000000f7], // Equal - [0x0000005b, 0x0000007b, 0x000000ab, 0x01000000], // BracketLeft - [0x0000005d, 0x0000007d, 0x000000bb, 0x01000000], // BracketRight - [0x0000005c, 0x0000007c, 0x000000ac, 0x000000a6], // Backslash - [0x0000003b, 0x0000003a, 0x000000b6, 0x000000b0], // Semicolon - [0x00000027, 0x00000022, 0x000000b4, 0x000000a8], // Quote - [0x00000060, 0x0000007e, 0x01000000, 0x01000000], // Backquote - [0x0000002c, 0x0000003c, 0x000000e7, 0x000000c7], // Comma - [0x0000002e, 0x0000003e, 0x01000000, 0x01000000], // Period - [0x0000002f, 0x0000003f, 0x000000bf, 0x01000000], // Slash + [0x00000076, 0x00000056, 0x00000000, 0x00000000], // KeyV + [0x00000077, 0x00000057, 0x00000000, 0x00000000], // KeyW + [0x00000078, 0x00000058, 0x00000000, 0x00000000], // KeyX + [0x00000079, 0x00000059, 0x00000000, 0x00000000], // KeyY + [0x0000007a, 0x0000005a, 0x00000000, 0x00000000], // KeyZ + [0x00000031, 0x00000021, 0x00000000, 0x00000000], // Digit1 + [0x00000032, 0x00000022, 0x00000000, 0x00000000], // Digit2 + [0x00000033, 0x000000a3, 0x00000000, 0x00000000], // Digit3 + [0x00000034, 0x00000024, 0x000020ac, 0x00000000], // Digit4 + [0x00000035, 0x00000025, 0x00000000, 0x00000000], // Digit5 + [0x00000036, 0x0000005e, 0x00000000, 0x00000000], // Digit6 + [0x00000037, 0x00000026, 0x00000000, 0x00000000], // Digit7 + [0x00000038, 0x0000002a, 0x00000000, 0x00000000], // Digit8 + [0x00000039, 0x00000028, 0x00000000, 0x00000000], // Digit9 + [0x00000030, 0x00000029, 0x00000000, 0x00000000], // Digit0 + [0x0000002d, 0x0000005f, 0x00000000, 0x00000000], // Minus + [0x0000003d, 0x0000002b, 0x00000000, 0x00000000], // Equal + [0x0000005b, 0x0000007b, 0x00000000, 0x00000000], // BracketLeft + [0x0000005d, 0x0000007d, 0x00000000, 0x00000000], // BracketRight + [0x00000023, 0x0000007e, 0x0000005c, 0x0000007c], // Backslash + [0x0000003b, 0x0000003a, 0x00000000, 0x00000000], // Semicolon + [0x00000027, 0x00000040, 0x00000000, 0x00000000], // Quote + [0x00000060, 0x000000ac, 0x000000a6, 0x00000000], // Backquote + [0x0000002c, 0x0000003c, 0x00000000, 0x00000000], // Comma + [0x0000002e, 0x0000003e, 0x00000000, 0x00000000], // Period + [0x0000002f, 0x0000003f, 0x00000000, 0x00000000], // Slash ], ), @@ -722,23 +938,23 @@ const List kLayouts = [ [0x00000062, 0x00000042, 0x0000222b, 0x00000131], // KeyB [0x00000063, 0x00000043, 0x000000e7, 0x000000c7], // KeyC [0x00000064, 0x00000044, 0x00002202, 0x000000ce], // KeyD - [0x00000065, 0x00000045, 0x01000000, 0x00002030], // KeyE + [0x00000065, 0x00000045, 0x000000b4, 0x00002030], // KeyE [0x00000066, 0x00000046, 0x00000192, 0x000000cf], // KeyF [0x00000067, 0x00000047, 0x000000a9, 0x000000cc], // KeyG [0x00000068, 0x00000048, 0x000002d9, 0x000000d3], // KeyH - [0x00000069, 0x00000049, 0x01000000, 0x000000c8], // KeyI + [0x00000069, 0x00000049, 0x0000005e, 0x000000c8], // KeyI [0x0000006a, 0x0000004a, 0x00002206, 0x000000d4], // KeyJ [0x0000006b, 0x0000004b, 0x000002da, 0x0000f8ff], // KeyK [0x0000006c, 0x0000004c, 0x000000ac, 0x000000d2], // KeyL [0x0000006d, 0x0000004d, 0x000000b5, 0x000002dc], // KeyM - [0x0000006e, 0x0000004e, 0x01000000, 0x000002c6], // KeyN + [0x0000006e, 0x0000004e, 0x0000007e, 0x000002c6], // KeyN [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO [0x00000070, 0x00000050, 0x000003c0, 0x0000220f], // KeyP [0x00000071, 0x00000051, 0x00000153, 0x00000152], // KeyQ [0x00000072, 0x00000052, 0x000000ae, 0x000000c2], // KeyR [0x00000073, 0x00000053, 0x000000df, 0x000000cd], // KeyS [0x00000074, 0x00000054, 0x00002020, 0x000000ca], // KeyT - [0x00000075, 0x00000055, 0x01000000, 0x000000cb], // KeyU + [0x00000075, 0x00000055, 0x000000a8, 0x000000cb], // KeyU [0x00000076, 0x00000056, 0x0000221a, 0x000025ca], // KeyV [0x00000077, 0x00000057, 0x00002211, 0x0000201e], // KeyW [0x00000078, 0x00000058, 0x00002248, 0x000000d9], // KeyX @@ -761,7 +977,7 @@ const List kLayouts = [ [0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb], // Backslash [0x0000003b, 0x0000003a, 0x00002026, 0x000000da], // Semicolon [0x00000027, 0x00000022, 0x000000e6, 0x000000c6], // Quote - [0x00000060, 0x0000007e, 0x01000000, 0x00000178], // Backquote + [0x00000060, 0x0000007e, 0x00000060, 0x00000178], // Backquote [0x0000002c, 0x0000003c, 0x00002264, 0x000000af], // Comma [0x0000002e, 0x0000003e, 0x00002265, 0x000002d8], // Period [0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf], // Slash @@ -769,272 +985,110 @@ const List kLayouts = [ ), LayoutInfo( - name: 'en-uk', + name: 'es', platform: LayoutPlatform.win, mapping: >[ - [0x00000061, 0x00000041, 0x000000e1, 0x000000c1], // KeyA - [0x00000062, 0x00000042, 0x01000000, 0x01000000], // KeyB - [0x00000063, 0x00000043, 0x01000000, 0x01000000], // KeyC - [0x00000064, 0x00000044, 0x01000000, 0x01000000], // KeyD - [0x00000065, 0x00000045, 0x000000e9, 0x000000c9], // KeyE - [0x00000066, 0x00000046, 0x01000000, 0x01000000], // KeyF - [0x00000067, 0x00000047, 0x01000000, 0x01000000], // KeyG - [0x00000068, 0x00000048, 0x01000000, 0x01000000], // KeyH - [0x00000069, 0x00000049, 0x000000ed, 0x000000cd], // KeyI - [0x0000006a, 0x0000004a, 0x01000000, 0x01000000], // KeyJ - [0x0000006b, 0x0000004b, 0x01000000, 0x01000000], // KeyK - [0x0000006c, 0x0000004c, 0x01000000, 0x01000000], // KeyL - [0x0000006d, 0x0000004d, 0x01000000, 0x01000000], // KeyM - [0x0000006e, 0x0000004e, 0x01000000, 0x01000000], // KeyN - [0x0000006f, 0x0000004f, 0x000000f3, 0x000000d3], // KeyO - [0x00000070, 0x00000050, 0x01000000, 0x01000000], // KeyP - [0x00000071, 0x00000051, 0x01000000, 0x01000000], // KeyQ - [0x00000072, 0x00000052, 0x01000000, 0x01000000], // KeyR - [0x00000073, 0x00000053, 0x01000000, 0x01000000], // KeyS - [0x00000074, 0x00000054, 0x01000000, 0x01000000], // KeyT - [0x00000075, 0x00000055, 0x000000fa, 0x000000da], // KeyU - [0x00000076, 0x00000056, 0x01000000, 0x01000000], // KeyV - [0x00000077, 0x00000057, 0x01000000, 0x01000000], // KeyW - [0x00000078, 0x00000058, 0x01000000, 0x01000000], // KeyX - [0x00000079, 0x00000059, 0x01000000, 0x01000000], // KeyY - [0x0000007a, 0x0000005a, 0x01000000, 0x01000000], // KeyZ - [0x00000031, 0x00000021, 0x01000000, 0x01000000], // Digit1 - [0x00000032, 0x00000022, 0x01000000, 0x01000000], // Digit2 - [0x00000033, 0x000000a3, 0x01000000, 0x01000000], // Digit3 - [0x00000034, 0x00000024, 0x000020ac, 0x01000000], // Digit4 - [0x00000035, 0x00000025, 0x01000000, 0x01000000], // Digit5 - [0x00000036, 0x0000005e, 0x01000000, 0x01000000], // Digit6 - [0x00000037, 0x00000026, 0x01000000, 0x01000000], // Digit7 - [0x00000038, 0x0000002a, 0x01000000, 0x01000000], // Digit8 - [0x00000039, 0x00000028, 0x01000000, 0x01000000], // Digit9 - [0x00000030, 0x00000029, 0x01000000, 0x01000000], // Digit0 - [0x0000002d, 0x0000005f, 0x01000000, 0x01000000], // Minus - [0x0000003d, 0x0000002b, 0x01000000, 0x01000000], // Equal - [0x0000005b, 0x0000007b, 0x01000000, 0x01000000], // BracketLeft - [0x0000005d, 0x0000007d, 0x01000000, 0x01000000], // BracketRight - [0x00000023, 0x0000007e, 0x0000005c, 0x0000007c], // Backslash - [0x0000003b, 0x0000003a, 0x01000000, 0x01000000], // Semicolon - [0x00000027, 0x00000040, 0x01000000, 0x01000000], // Quote - [0x00000060, 0x000000ac, 0x000000a6, 0x01000000], // Backquote - [0x0000002c, 0x0000003c, 0x01000000, 0x01000000], // Comma - [0x0000002e, 0x0000003e, 0x01000000, 0x01000000], // Period - [0x0000002f, 0x0000003f, 0x01000000, 0x01000000], // Slash + [0x00000061, 0x00000041, 0x00000000, 0x00000000], // KeyA + [0x00000062, 0x00000042, 0x00000000, 0x00000000], // KeyB + [0x00000063, 0x00000043, 0x00000000, 0x00000000], // KeyC + [0x00000064, 0x00000044, 0x00000000, 0x00000000], // KeyD + [0x00000065, 0x00000045, 0x000020ac, 0x00000000], // KeyE + [0x00000066, 0x00000046, 0x00000000, 0x00000000], // KeyF + [0x00000067, 0x00000047, 0x00000000, 0x00000000], // KeyG + [0x00000068, 0x00000048, 0x00000000, 0x00000000], // KeyH + [0x00000069, 0x00000049, 0x00000000, 0x00000000], // KeyI + [0x0000006a, 0x0000004a, 0x00000000, 0x00000000], // KeyJ + [0x0000006b, 0x0000004b, 0x00000000, 0x00000000], // KeyK + [0x0000006c, 0x0000004c, 0x00000000, 0x00000000], // KeyL + [0x0000006d, 0x0000004d, 0x00000000, 0x00000000], // KeyM + [0x0000006e, 0x0000004e, 0x00000000, 0x00000000], // KeyN + [0x0000006f, 0x0000004f, 0x00000000, 0x00000000], // KeyO + [0x00000070, 0x00000050, 0x00000000, 0x00000000], // KeyP + [0x00000071, 0x00000051, 0x00000000, 0x00000000], // KeyQ + [0x00000072, 0x00000052, 0x00000000, 0x00000000], // KeyR + [0x00000073, 0x00000053, 0x00000000, 0x00000000], // KeyS + [0x00000074, 0x00000054, 0x00000000, 0x00000000], // KeyT + [0x00000075, 0x00000055, 0x00000000, 0x00000000], // KeyU + [0x00000076, 0x00000056, 0x00000000, 0x00000000], // KeyV + [0x00000077, 0x00000057, 0x00000000, 0x00000000], // KeyW + [0x00000078, 0x00000058, 0x00000000, 0x00000000], // KeyX + [0x00000079, 0x00000059, 0x00000000, 0x00000000], // KeyY + [0x0000007a, 0x0000005a, 0x00000000, 0x00000000], // KeyZ + [0x00000031, 0x00000021, 0x0000007c, 0x00000000], // Digit1 + [0x00000032, 0x00000022, 0x00000040, 0x00000000], // Digit2 + [0x00000033, 0x000000b7, 0x00000023, 0x00000000], // Digit3 + [0x00000034, 0x00000024, 0x0000007e, 0x00000000], // Digit4 + [0x00000035, 0x00000025, 0x000020ac, 0x00000000], // Digit5 + [0x00000036, 0x00000026, 0x000000ac, 0x00000000], // Digit6 + [0x00000037, 0x0000002f, 0x00000000, 0x00000000], // Digit7 + [0x00000038, 0x00000028, 0x00000000, 0x00000000], // Digit8 + [0x00000039, 0x00000029, 0x00000000, 0x00000000], // Digit9 + [0x00000030, 0x0000003d, 0x00000000, 0x00000000], // Digit0 + [0x00000027, 0x0000003f, 0x00000000, 0x00000000], // Minus + [0x000000a1, 0x000000bf, 0x00000000, 0x00000000], // Equal + [0x00000060, 0x0000005e, 0x0000005b, 0x00000000], // BracketLeft + [0x0000002b, 0x0000002a, 0x0000005d, 0x00000000], // BracketRight + [0x000000e7, 0x000000c7, 0x0000007d, 0x00000000], // Backslash + [0x000000f1, 0x000000d1, 0x00000000, 0x00000000], // Semicolon + [0x000000b4, 0x000000a8, 0x0000007b, 0x00000000], // Quote + [0x000000ba, 0x000000aa, 0x0000005c, 0x00000000], // Backquote + [0x0000002c, 0x0000003b, 0x00000000, 0x00000000], // Comma + [0x0000002e, 0x0000003a, 0x00000000, 0x00000000], // Period + [0x0000002d, 0x0000005f, 0x00000000, 0x00000000], // Slash ], ), LayoutInfo( - name: 'en', - platform: LayoutPlatform.darwin, - mapping: >[ - [0x00000061, 0x00000041, 0x000000e5, 0x000000c5], // KeyA - [0x00000062, 0x00000042, 0x0000222b, 0x00000131], // KeyB - [0x00000063, 0x00000043, 0x000000e7, 0x000000c7], // KeyC - [0x00000064, 0x00000044, 0x00002202, 0x000000ce], // KeyD - [0x00000065, 0x00000045, 0x01000000, 0x000000b4], // KeyE - [0x00000066, 0x00000046, 0x00000192, 0x000000cf], // KeyF - [0x00000067, 0x00000047, 0x000000a9, 0x000002dd], // KeyG - [0x00000068, 0x00000048, 0x000002d9, 0x000000d3], // KeyH - [0x00000069, 0x00000049, 0x01000000, 0x000002c6], // KeyI - [0x0000006a, 0x0000004a, 0x00002206, 0x000000d4], // KeyJ - [0x0000006b, 0x0000004b, 0x000002da, 0x0000f8ff], // KeyK - [0x0000006c, 0x0000004c, 0x000000ac, 0x000000d2], // KeyL - [0x0000006d, 0x0000004d, 0x000000b5, 0x000000c2], // KeyM - [0x0000006e, 0x0000004e, 0x01000000, 0x000002dc], // KeyN - [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO - [0x00000070, 0x00000050, 0x000003c0, 0x0000220f], // KeyP - [0x00000071, 0x00000051, 0x00000153, 0x00000152], // KeyQ - [0x00000072, 0x00000052, 0x000000ae, 0x00002030], // KeyR - [0x00000073, 0x00000053, 0x000000df, 0x000000cd], // KeyS - [0x00000074, 0x00000054, 0x00002020, 0x000002c7], // KeyT - [0x00000075, 0x00000055, 0x01000000, 0x000000a8], // KeyU - [0x00000076, 0x00000056, 0x0000221a, 0x000025ca], // KeyV - [0x00000077, 0x00000057, 0x00002211, 0x0000201e], // KeyW - [0x00000078, 0x00000058, 0x00002248, 0x000002db], // KeyX - [0x00000079, 0x00000059, 0x000000a5, 0x000000c1], // KeyY - [0x0000007a, 0x0000005a, 0x000003a9, 0x000000b8], // KeyZ - [0x00000031, 0x00000021, 0x000000a1, 0x00002044], // Digit1 - [0x00000032, 0x00000040, 0x00002122, 0x000020ac], // Digit2 - [0x00000033, 0x00000023, 0x000000a3, 0x00002039], // Digit3 - [0x00000034, 0x00000024, 0x000000a2, 0x0000203a], // Digit4 - [0x00000035, 0x00000025, 0x0000221e, 0x0000fb01], // Digit5 - [0x00000036, 0x0000005e, 0x000000a7, 0x0000fb02], // Digit6 - [0x00000037, 0x00000026, 0x000000b6, 0x00002021], // Digit7 - [0x00000038, 0x0000002a, 0x00002022, 0x000000b0], // Digit8 - [0x00000039, 0x00000028, 0x000000aa, 0x000000b7], // Digit9 - [0x00000030, 0x00000029, 0x000000ba, 0x0000201a], // Digit0 - [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Minus - [0x0000003d, 0x0000002b, 0x00002260, 0x000000b1], // Equal - [0x0000005b, 0x0000007b, 0x0000201c, 0x0000201d], // BracketLeft - [0x0000005d, 0x0000007d, 0x00002018, 0x00002019], // BracketRight - [0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb], // Backslash - [0x0000003b, 0x0000003a, 0x00002026, 0x000000da], // Semicolon - [0x00000027, 0x00000022, 0x000000e6, 0x000000c6], // Quote - [0x00000060, 0x0000007e, 0x01000000, 0x00000060], // Backquote - [0x0000002c, 0x0000003c, 0x00002264, 0x000000af], // Comma - [0x0000002e, 0x0000003e, 0x00002265, 0x000002d8], // Period - [0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf], // Slash - ], - ), - - LayoutInfo( - name: 'en', + name: 'es', platform: LayoutPlatform.linux, mapping: >[ - [0x00000061, 0x00000041, 0x00000061, 0x00000041], // KeyA - [0x00000062, 0x00000042, 0x00000062, 0x00000042], // KeyB - [0x00000063, 0x00000043, 0x00000063, 0x00000043], // KeyC - [0x00000064, 0x00000044, 0x00000064, 0x00000044], // KeyD - [0x00000065, 0x00000045, 0x00000065, 0x00000045], // KeyE - [0x00000066, 0x00000046, 0x00000066, 0x00000046], // KeyF - [0x00000067, 0x00000047, 0x00000067, 0x00000047], // KeyG - [0x00000068, 0x00000048, 0x00000068, 0x00000048], // KeyH - [0x00000069, 0x00000049, 0x00000069, 0x00000049], // KeyI - [0x0000006a, 0x0000004a, 0x0000006a, 0x0000004a], // KeyJ - [0x0000006b, 0x0000004b, 0x0000006b, 0x0000004b], // KeyK - [0x0000006c, 0x0000004c, 0x0000006c, 0x0000004c], // KeyL - [0x0000006d, 0x0000004d, 0x0000006d, 0x0000004d], // KeyM + [0x00000061, 0x00000041, 0x000000e6, 0x000000c6], // KeyA + [0x00000062, 0x00000042, 0x0000201d, 0x00002019], // KeyB + [0x00000063, 0x00000043, 0x000000a2, 0x000000a9], // KeyC + [0x00000064, 0x00000044, 0x000000f0, 0x000000d0], // KeyD + [0x00000065, 0x00000045, 0x000020ac, 0x000000a2], // KeyE + [0x00000066, 0x00000046, 0x00000111, 0x000000aa], // KeyF + [0x00000067, 0x00000047, 0x0000014b, 0x0000014a], // KeyG + [0x00000068, 0x00000048, 0x00000127, 0x00000126], // KeyH + [0x00000069, 0x00000049, 0x00002192, 0x00000131], // KeyI + [0x0000006a, 0x0000004a, 0x00000309, 0x0000031b], // KeyJ + [0x0000006b, 0x0000004b, 0x00000138, 0x00000026], // KeyK + [0x0000006c, 0x0000004c, 0x00000142, 0x00000141], // KeyL + [0x0000006d, 0x0000004d, 0x000000b5, 0x000000ba], // KeyM [0x0000006e, 0x0000004e, 0x0000006e, 0x0000004e], // KeyN - [0x0000006f, 0x0000004f, 0x0000006f, 0x0000004f], // KeyO - [0x00000070, 0x00000050, 0x00000070, 0x00000050], // KeyP - [0x00000071, 0x00000051, 0x00000071, 0x00000051], // KeyQ - [0x00000072, 0x00000052, 0x00000072, 0x00000052], // KeyR - [0x00000073, 0x00000053, 0x00000073, 0x00000053], // KeyS - [0x00000074, 0x00000054, 0x00000074, 0x00000054], // KeyT - [0x00000075, 0x00000055, 0x00000075, 0x00000055], // KeyU - [0x00000076, 0x00000056, 0x00000076, 0x00000056], // KeyV - [0x00000077, 0x00000057, 0x00000077, 0x00000057], // KeyW - [0x00000078, 0x00000058, 0x00000078, 0x00000058], // KeyX - [0x00000079, 0x00000059, 0x00000079, 0x00000059], // KeyY - [0x0000007a, 0x0000005a, 0x0000007a, 0x0000005a], // KeyZ - [0x00000031, 0x00000021, 0x00000031, 0x00000021], // Digit1 - [0x00000032, 0x00000040, 0x00000032, 0x00000040], // Digit2 - [0x00000033, 0x00000023, 0x00000033, 0x00000023], // Digit3 - [0x00000034, 0x00000024, 0x00000034, 0x00000024], // Digit4 - [0x00000035, 0x00000025, 0x00000035, 0x00000025], // Digit5 - [0x00000036, 0x0000005e, 0x00000036, 0x0000005e], // Digit6 - [0x00000037, 0x00000026, 0x00000037, 0x00000026], // Digit7 - [0x00000038, 0x0000002a, 0x00000038, 0x0000002a], // Digit8 - [0x00000039, 0x00000028, 0x00000039, 0x00000028], // Digit9 - [0x00000030, 0x00000029, 0x00000030, 0x00000029], // Digit0 - [0x0000002d, 0x0000005f, 0x0000002d, 0x0000005f], // Minus - [0x0000003d, 0x0000002b, 0x0000003d, 0x0000002b], // Equal - [0x0000005b, 0x0000007b, 0x0000005b, 0x0000007b], // BracketLeft - [0x0000005d, 0x0000007d, 0x0000005d, 0x0000007d], // BracketRight - [0x0000005c, 0x0000007c, 0x0000005c, 0x0000007c], // Backslash - [0x0000003b, 0x0000003a, 0x0000003b, 0x0000003a], // Semicolon - [0x00000027, 0x00000022, 0x00000027, 0x00000022], // Quote - [0x00000060, 0x0000007e, 0x00000060, 0x0000007e], // Backquote - [0x0000002c, 0x0000003c, 0x0000002c, 0x0000003c], // Comma - [0x0000002e, 0x0000003e, 0x0000002e, 0x0000003e], // Period - [0x0000002f, 0x0000003f, 0x0000002f, 0x0000003f], // Slash - ], - ), - - LayoutInfo( - name: 'en', - platform: LayoutPlatform.win, - mapping: >[ - [0x00000061, 0x00000041, 0x01000000, 0x01000000], // KeyA - [0x00000062, 0x00000042, 0x01000000, 0x01000000], // KeyB - [0x00000063, 0x00000043, 0x01000000, 0x01000000], // KeyC - [0x00000064, 0x00000044, 0x01000000, 0x01000000], // KeyD - [0x00000065, 0x00000045, 0x01000000, 0x01000000], // KeyE - [0x00000066, 0x00000046, 0x01000000, 0x01000000], // KeyF - [0x00000067, 0x00000047, 0x01000000, 0x01000000], // KeyG - [0x00000068, 0x00000048, 0x01000000, 0x01000000], // KeyH - [0x00000069, 0x00000049, 0x01000000, 0x01000000], // KeyI - [0x0000006a, 0x0000004a, 0x01000000, 0x01000000], // KeyJ - [0x0000006b, 0x0000004b, 0x01000000, 0x01000000], // KeyK - [0x0000006c, 0x0000004c, 0x01000000, 0x01000000], // KeyL - [0x0000006d, 0x0000004d, 0x01000000, 0x01000000], // KeyM - [0x0000006e, 0x0000004e, 0x01000000, 0x01000000], // KeyN - [0x0000006f, 0x0000004f, 0x01000000, 0x01000000], // KeyO - [0x00000070, 0x00000050, 0x01000000, 0x01000000], // KeyP - [0x00000071, 0x00000051, 0x01000000, 0x01000000], // KeyQ - [0x00000072, 0x00000052, 0x01000000, 0x01000000], // KeyR - [0x00000073, 0x00000053, 0x01000000, 0x01000000], // KeyS - [0x00000074, 0x00000054, 0x01000000, 0x01000000], // KeyT - [0x00000075, 0x00000055, 0x01000000, 0x01000000], // KeyU - [0x00000076, 0x00000056, 0x01000000, 0x01000000], // KeyV - [0x00000077, 0x00000057, 0x01000000, 0x01000000], // KeyW - [0x00000078, 0x00000058, 0x01000000, 0x01000000], // KeyX - [0x00000079, 0x00000059, 0x01000000, 0x01000000], // KeyY - [0x0000007a, 0x0000005a, 0x01000000, 0x01000000], // KeyZ - [0x00000031, 0x00000021, 0x01000000, 0x01000000], // Digit1 - [0x00000032, 0x00000040, 0x01000000, 0x01000000], // Digit2 - [0x00000033, 0x00000023, 0x01000000, 0x01000000], // Digit3 - [0x00000034, 0x00000024, 0x01000000, 0x01000000], // Digit4 - [0x00000035, 0x00000025, 0x01000000, 0x01000000], // Digit5 - [0x00000036, 0x0000005e, 0x01000000, 0x01000000], // Digit6 - [0x00000037, 0x00000026, 0x01000000, 0x01000000], // Digit7 - [0x00000038, 0x0000002a, 0x01000000, 0x01000000], // Digit8 - [0x00000039, 0x00000028, 0x01000000, 0x01000000], // Digit9 - [0x00000030, 0x00000029, 0x01000000, 0x01000000], // Digit0 - [0x0000002d, 0x0000005f, 0x01000000, 0x01000000], // Minus - [0x0000003d, 0x0000002b, 0x01000000, 0x01000000], // Equal - [0x0000005b, 0x0000007b, 0x01000000, 0x01000000], // BracketLeft - [0x0000005d, 0x0000007d, 0x01000000, 0x01000000], // BracketRight - [0x0000005c, 0x0000007c, 0x01000000, 0x01000000], // Backslash - [0x0000003b, 0x0000003a, 0x01000000, 0x01000000], // Semicolon - [0x00000027, 0x00000022, 0x01000000, 0x01000000], // Quote - [0x00000060, 0x0000007e, 0x01000000, 0x01000000], // Backquote - [0x0000002c, 0x0000003c, 0x01000000, 0x01000000], // Comma - [0x0000002e, 0x0000003e, 0x01000000, 0x01000000], // Period - [0x0000002f, 0x0000003f, 0x01000000, 0x01000000], // Slash - ], - ), - - LayoutInfo( - name: 'es-latin', - platform: LayoutPlatform.win, - mapping: >[ - [0x00000061, 0x00000041, 0x01000000, 0x01000000], // KeyA - [0x00000062, 0x00000042, 0x01000000, 0x01000000], // KeyB - [0x00000063, 0x00000043, 0x01000000, 0x01000000], // KeyC - [0x00000064, 0x00000044, 0x01000000, 0x01000000], // KeyD - [0x00000065, 0x00000045, 0x01000000, 0x01000000], // KeyE - [0x00000066, 0x00000046, 0x01000000, 0x01000000], // KeyF - [0x00000067, 0x00000047, 0x01000000, 0x01000000], // KeyG - [0x00000068, 0x00000048, 0x01000000, 0x01000000], // KeyH - [0x00000069, 0x00000049, 0x01000000, 0x01000000], // KeyI - [0x0000006a, 0x0000004a, 0x01000000, 0x01000000], // KeyJ - [0x0000006b, 0x0000004b, 0x01000000, 0x01000000], // KeyK - [0x0000006c, 0x0000004c, 0x01000000, 0x01000000], // KeyL - [0x0000006d, 0x0000004d, 0x01000000, 0x01000000], // KeyM - [0x0000006e, 0x0000004e, 0x01000000, 0x01000000], // KeyN - [0x0000006f, 0x0000004f, 0x01000000, 0x01000000], // KeyO - [0x00000070, 0x00000050, 0x01000000, 0x01000000], // KeyP - [0x00000071, 0x00000051, 0x00000040, 0x01000000], // KeyQ - [0x00000072, 0x00000052, 0x01000000, 0x01000000], // KeyR - [0x00000073, 0x00000053, 0x01000000, 0x01000000], // KeyS - [0x00000074, 0x00000054, 0x01000000, 0x01000000], // KeyT - [0x00000075, 0x00000055, 0x01000000, 0x01000000], // KeyU - [0x00000076, 0x00000056, 0x01000000, 0x01000000], // KeyV - [0x00000077, 0x00000057, 0x01000000, 0x01000000], // KeyW - [0x00000078, 0x00000058, 0x01000000, 0x01000000], // KeyX - [0x00000079, 0x00000059, 0x01000000, 0x01000000], // KeyY - [0x0000007a, 0x0000005a, 0x01000000, 0x01000000], // KeyZ - [0x00000031, 0x00000021, 0x01000000, 0x01000000], // Digit1 - [0x00000032, 0x00000022, 0x01000000, 0x01000000], // Digit2 - [0x00000033, 0x00000023, 0x01000000, 0x01000000], // Digit3 - [0x00000034, 0x00000024, 0x01000000, 0x01000000], // Digit4 - [0x00000035, 0x00000025, 0x01000000, 0x01000000], // Digit5 - [0x00000036, 0x00000026, 0x01000000, 0x01000000], // Digit6 - [0x00000037, 0x0000002f, 0x01000000, 0x01000000], // Digit7 - [0x00000038, 0x00000028, 0x01000000, 0x01000000], // Digit8 - [0x00000039, 0x00000029, 0x01000000, 0x01000000], // Digit9 - [0x00000030, 0x0000003d, 0x01000000, 0x01000000], // Digit0 - [0x00000027, 0x0000003f, 0x0000005c, 0x01000000], // Minus - [0x000000bf, 0x000000a1, 0x01000000, 0x01000000], // Equal - [0x000000b4, 0x000000a8, 0x01000000, 0x01000000], // BracketLeft - [0x0000002b, 0x0000002a, 0x0000007e, 0x01000000], // BracketRight - [0x0000007d, 0x0000005d, 0x00000060, 0x01000000], // Backslash - [0x000000f1, 0x000000d1, 0x01000000, 0x01000000], // Semicolon - [0x0000007b, 0x0000005b, 0x0000005e, 0x01000000], // Quote - [0x0000007c, 0x000000b0, 0x000000ac, 0x01000000], // Backquote - [0x0000002c, 0x0000003b, 0x01000000, 0x01000000], // Comma - [0x0000002e, 0x0000003a, 0x01000000, 0x01000000], // Period - [0x0000002d, 0x0000005f, 0x01000000, 0x01000000], // Slash + [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO + [0x00000070, 0x00000050, 0x000000fe, 0x000000de], // KeyP + [0x00000071, 0x00000051, 0x00000040, 0x000003a9], // KeyQ + [0x00000072, 0x00000052, 0x000000b6, 0x000000ae], // KeyR + [0x00000073, 0x00000053, 0x000000df, 0x000000a7], // KeyS + [0x00000074, 0x00000054, 0x00000167, 0x00000166], // KeyT + [0x00000075, 0x00000055, 0x00002193, 0x00002191], // KeyU + [0x00000076, 0x00000056, 0x0000201c, 0x00002018], // KeyV + [0x00000077, 0x00000057, 0x00000142, 0x00000141], // KeyW + [0x00000078, 0x00000058, 0x000000bb, 0x0000003e], // KeyX + [0x00000079, 0x00000059, 0x00002190, 0x000000a5], // KeyY + [0x0000007a, 0x0000005a, 0x000000ab, 0x0000003c], // KeyZ + [0x00000031, 0x00000021, 0x0000007c, 0x000000a1], // Digit1 + [0x00000032, 0x00000022, 0x00000040, 0x0000215b], // Digit2 + [0x00000033, 0x000000b7, 0x00000023, 0x000000a3], // Digit3 + [0x00000034, 0x00000024, 0x0000007e, 0x00000024], // Digit4 + [0x00000035, 0x00000025, 0x000000bd, 0x0000215c], // Digit5 + [0x00000036, 0x00000026, 0x000000ac, 0x0000215d], // Digit6 + [0x00000037, 0x0000002f, 0x0000007b, 0x0000215e], // Digit7 + [0x00000038, 0x00000028, 0x0000005b, 0x00002122], // Digit8 + [0x00000039, 0x00000029, 0x0000005d, 0x000000b1], // Digit9 + [0x00000030, 0x0000003d, 0x0000007d, 0x000000b0], // Digit0 + [0x00000027, 0x0000003f, 0x0000005c, 0x000000bf], // Minus + [0x000000a1, 0x000000bf, 0x00000303, 0x0000007e], // Equal + [0x00000300, 0x00000302, 0x0000005b, 0x0000030a], // BracketLeft + [0x0000002b, 0x0000002a, 0x0000005d, 0x00000304], // BracketRight + [0x000000e7, 0x000000c7, 0x0000007d, 0x00000306], // Backslash + [0x000000f1, 0x000000d1, 0x0000007e, 0x0000030b], // Semicolon + [0x00000301, 0x00000308, 0x0000007b, 0x0000007b], // Quote + [0x000000ba, 0x000000aa, 0x0000005c, 0x0000005c], // Backquote + [0x0000002c, 0x0000003b, 0x00002500, 0x000000d7], // Comma + [0x0000002e, 0x0000003a, 0x000000b7, 0x000000f7], // Period + [0x0000002d, 0x0000005f, 0x00000323, 0x00000307], // Slash ], ), @@ -1043,7 +1097,7 @@ const List kLayouts = [ platform: LayoutPlatform.darwin, mapping: >[ [0x00000061, 0x00000041, 0x000000e5, 0x000000c5], // KeyA - [0x00000062, 0x00000042, 0x000000df, 0x01000000], // KeyB + [0x00000062, 0x00000042, 0x000000df, 0x00000000], // KeyB [0x00000063, 0x00000043, 0x000000a9, 0x00000020], // KeyC [0x00000064, 0x00000044, 0x00002202, 0x00002206], // KeyD [0x00000065, 0x00000045, 0x000020ac, 0x000020ac], // KeyE @@ -1080,177 +1134,123 @@ const List kLayouts = [ [0x00000030, 0x0000003d, 0x00002260, 0x00002248], // Digit0 [0x00000027, 0x0000003f, 0x000000b4, 0x000000b8], // Minus [0x000000a1, 0x000000bf, 0x0000201a, 0x000002db], // Equal - [0x01000000, 0x01000000, 0x0000005b, 0x000002c6], // BracketLeft + [0x00000060, 0x0000005e, 0x0000005b, 0x000002c6], // BracketLeft [0x0000002b, 0x0000002a, 0x0000005d, 0x000000b1], // BracketRight [0x000000e7, 0x000000c7, 0x0000007d, 0x000000bb], // Backslash - [0x000000f1, 0x000000d1, 0x01000000, 0x000002dc], // Semicolon - [0x01000000, 0x01000000, 0x0000007b, 0x000000ab], // Quote + [0x000000f1, 0x000000d1, 0x0000007e, 0x000002dc], // Semicolon + [0x000000b4, 0x000000a8, 0x0000007b, 0x000000ab], // Quote [0x0000003c, 0x0000003e, 0x00002264, 0x00002265], // Backquote - [0x0000002c, 0x0000003b, 0x0000201e, 0x01000000], // Comma + [0x0000002c, 0x0000003b, 0x0000201e, 0x00000000], // Comma [0x0000002e, 0x0000003a, 0x00002026, 0x00002026], // Period [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Slash ], ), LayoutInfo( - name: 'es', - platform: LayoutPlatform.linux, - mapping: >[ - [0x00000061, 0x00000041, 0x000000e6, 0x000000c6], // KeyA - [0x00000062, 0x00000042, 0x0000201d, 0x00002019], // KeyB - [0x00000063, 0x00000043, 0x000000a2, 0x000000a9], // KeyC - [0x00000064, 0x00000044, 0x000000f0, 0x000000d0], // KeyD - [0x00000065, 0x00000045, 0x000020ac, 0x000000a2], // KeyE - [0x00000066, 0x00000046, 0x00000111, 0x000000aa], // KeyF - [0x00000067, 0x00000047, 0x0000014b, 0x0000014a], // KeyG - [0x00000068, 0x00000048, 0x00000127, 0x00000126], // KeyH - [0x00000069, 0x00000049, 0x00002192, 0x00000131], // KeyI - [0x0000006a, 0x0000004a, 0x00000309, 0x0000031b], // KeyJ - [0x0000006b, 0x0000004b, 0x00000138, 0x00000026], // KeyK - [0x0000006c, 0x0000004c, 0x00000142, 0x00000141], // KeyL - [0x0000006d, 0x0000004d, 0x000000b5, 0x000000ba], // KeyM - [0x0000006e, 0x0000004e, 0x0000006e, 0x0000004e], // KeyN - [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO - [0x00000070, 0x00000050, 0x000000fe, 0x000000de], // KeyP - [0x00000071, 0x00000051, 0x00000040, 0x000003a9], // KeyQ - [0x00000072, 0x00000052, 0x000000b6, 0x000000ae], // KeyR - [0x00000073, 0x00000053, 0x000000df, 0x000000a7], // KeyS - [0x00000074, 0x00000054, 0x00000167, 0x00000166], // KeyT - [0x00000075, 0x00000055, 0x00002193, 0x00002191], // KeyU - [0x00000076, 0x00000056, 0x0000201c, 0x00002018], // KeyV - [0x00000077, 0x00000057, 0x00000142, 0x00000141], // KeyW - [0x00000078, 0x00000058, 0x000000bb, 0x0000003e], // KeyX - [0x00000079, 0x00000059, 0x00002190, 0x000000a5], // KeyY - [0x0000007a, 0x0000005a, 0x000000ab, 0x0000003c], // KeyZ - [0x00000031, 0x00000021, 0x0000007c, 0x000000a1], // Digit1 - [0x00000032, 0x00000022, 0x00000040, 0x0000215b], // Digit2 - [0x00000033, 0x000000b7, 0x00000023, 0x000000a3], // Digit3 - [0x00000034, 0x00000024, 0x0000007e, 0x00000024], // Digit4 - [0x00000035, 0x00000025, 0x000000bd, 0x0000215c], // Digit5 - [0x00000036, 0x00000026, 0x000000ac, 0x0000215d], // Digit6 - [0x00000037, 0x0000002f, 0x0000007b, 0x0000215e], // Digit7 - [0x00000038, 0x00000028, 0x0000005b, 0x00002122], // Digit8 - [0x00000039, 0x00000029, 0x0000005d, 0x000000b1], // Digit9 - [0x00000030, 0x0000003d, 0x0000007d, 0x000000b0], // Digit0 - [0x00000027, 0x0000003f, 0x0000005c, 0x000000bf], // Minus - [0x000000a1, 0x000000bf, 0x00000303, 0x0000007e], // Equal - [0x00000300, 0x00000302, 0x0000005b, 0x0000030a], // BracketLeft - [0x0000002b, 0x0000002a, 0x0000005d, 0x00000304], // BracketRight - [0x000000e7, 0x000000c7, 0x0000007d, 0x00000306], // Backslash - [0x000000f1, 0x000000d1, 0x0000007e, 0x0000030b], // Semicolon - [0x00000301, 0x00000308, 0x0000007b, 0x0000007b], // Quote - [0x000000ba, 0x000000aa, 0x0000005c, 0x0000005c], // Backquote - [0x0000002c, 0x0000003b, 0x00002500, 0x000000d7], // Comma - [0x0000002e, 0x0000003a, 0x000000b7, 0x000000f7], // Period - [0x0000002d, 0x0000005f, 0x00000323, 0x00000307], // Slash - ], - ), - - LayoutInfo( - name: 'es', + name: 'es-latin', platform: LayoutPlatform.win, mapping: >[ - [0x00000061, 0x00000041, 0x01000000, 0x01000000], // KeyA - [0x00000062, 0x00000042, 0x01000000, 0x01000000], // KeyB - [0x00000063, 0x00000043, 0x01000000, 0x01000000], // KeyC - [0x00000064, 0x00000044, 0x01000000, 0x01000000], // KeyD - [0x00000065, 0x00000045, 0x000020ac, 0x01000000], // KeyE - [0x00000066, 0x00000046, 0x01000000, 0x01000000], // KeyF - [0x00000067, 0x00000047, 0x01000000, 0x01000000], // KeyG - [0x00000068, 0x00000048, 0x01000000, 0x01000000], // KeyH - [0x00000069, 0x00000049, 0x01000000, 0x01000000], // KeyI - [0x0000006a, 0x0000004a, 0x01000000, 0x01000000], // KeyJ - [0x0000006b, 0x0000004b, 0x01000000, 0x01000000], // KeyK - [0x0000006c, 0x0000004c, 0x01000000, 0x01000000], // KeyL - [0x0000006d, 0x0000004d, 0x01000000, 0x01000000], // KeyM - [0x0000006e, 0x0000004e, 0x01000000, 0x01000000], // KeyN - [0x0000006f, 0x0000004f, 0x01000000, 0x01000000], // KeyO - [0x00000070, 0x00000050, 0x01000000, 0x01000000], // KeyP - [0x00000071, 0x00000051, 0x01000000, 0x01000000], // KeyQ - [0x00000072, 0x00000052, 0x01000000, 0x01000000], // KeyR - [0x00000073, 0x00000053, 0x01000000, 0x01000000], // KeyS - [0x00000074, 0x00000054, 0x01000000, 0x01000000], // KeyT - [0x00000075, 0x00000055, 0x01000000, 0x01000000], // KeyU - [0x00000076, 0x00000056, 0x01000000, 0x01000000], // KeyV - [0x00000077, 0x00000057, 0x01000000, 0x01000000], // KeyW - [0x00000078, 0x00000058, 0x01000000, 0x01000000], // KeyX - [0x00000079, 0x00000059, 0x01000000, 0x01000000], // KeyY - [0x0000007a, 0x0000005a, 0x01000000, 0x01000000], // KeyZ - [0x00000031, 0x00000021, 0x0000007c, 0x01000000], // Digit1 - [0x00000032, 0x00000022, 0x00000040, 0x01000000], // Digit2 - [0x00000033, 0x000000b7, 0x00000023, 0x01000000], // Digit3 - [0x00000034, 0x00000024, 0x0000007e, 0x01000000], // Digit4 - [0x00000035, 0x00000025, 0x000020ac, 0x01000000], // Digit5 - [0x00000036, 0x00000026, 0x000000ac, 0x01000000], // Digit6 - [0x00000037, 0x0000002f, 0x01000000, 0x01000000], // Digit7 - [0x00000038, 0x00000028, 0x01000000, 0x01000000], // Digit8 - [0x00000039, 0x00000029, 0x01000000, 0x01000000], // Digit9 - [0x00000030, 0x0000003d, 0x01000000, 0x01000000], // Digit0 - [0x00000027, 0x0000003f, 0x01000000, 0x01000000], // Minus - [0x000000a1, 0x000000bf, 0x01000000, 0x01000000], // Equal - [0x00000060, 0x0000005e, 0x0000005b, 0x01000000], // BracketLeft - [0x0000002b, 0x0000002a, 0x0000005d, 0x01000000], // BracketRight - [0x000000e7, 0x000000c7, 0x0000007d, 0x01000000], // Backslash - [0x000000f1, 0x000000d1, 0x01000000, 0x01000000], // Semicolon - [0x000000b4, 0x000000a8, 0x0000007b, 0x01000000], // Quote - [0x000000ba, 0x000000aa, 0x0000005c, 0x01000000], // Backquote - [0x0000002c, 0x0000003b, 0x01000000, 0x01000000], // Comma - [0x0000002e, 0x0000003a, 0x01000000, 0x01000000], // Period - [0x0000002d, 0x0000005f, 0x01000000, 0x01000000], // Slash + [0x00000061, 0x00000041, 0x00000000, 0x00000000], // KeyA + [0x00000062, 0x00000042, 0x00000000, 0x00000000], // KeyB + [0x00000063, 0x00000043, 0x00000000, 0x00000000], // KeyC + [0x00000064, 0x00000044, 0x00000000, 0x00000000], // KeyD + [0x00000065, 0x00000045, 0x00000000, 0x00000000], // KeyE + [0x00000066, 0x00000046, 0x00000000, 0x00000000], // KeyF + [0x00000067, 0x00000047, 0x00000000, 0x00000000], // KeyG + [0x00000068, 0x00000048, 0x00000000, 0x00000000], // KeyH + [0x00000069, 0x00000049, 0x00000000, 0x00000000], // KeyI + [0x0000006a, 0x0000004a, 0x00000000, 0x00000000], // KeyJ + [0x0000006b, 0x0000004b, 0x00000000, 0x00000000], // KeyK + [0x0000006c, 0x0000004c, 0x00000000, 0x00000000], // KeyL + [0x0000006d, 0x0000004d, 0x00000000, 0x00000000], // KeyM + [0x0000006e, 0x0000004e, 0x00000000, 0x00000000], // KeyN + [0x0000006f, 0x0000004f, 0x00000000, 0x00000000], // KeyO + [0x00000070, 0x00000050, 0x00000000, 0x00000000], // KeyP + [0x00000071, 0x00000051, 0x00000040, 0x00000000], // KeyQ + [0x00000072, 0x00000052, 0x00000000, 0x00000000], // KeyR + [0x00000073, 0x00000053, 0x00000000, 0x00000000], // KeyS + [0x00000074, 0x00000054, 0x00000000, 0x00000000], // KeyT + [0x00000075, 0x00000055, 0x00000000, 0x00000000], // KeyU + [0x00000076, 0x00000056, 0x00000000, 0x00000000], // KeyV + [0x00000077, 0x00000057, 0x00000000, 0x00000000], // KeyW + [0x00000078, 0x00000058, 0x00000000, 0x00000000], // KeyX + [0x00000079, 0x00000059, 0x00000000, 0x00000000], // KeyY + [0x0000007a, 0x0000005a, 0x00000000, 0x00000000], // KeyZ + [0x00000031, 0x00000021, 0x00000000, 0x00000000], // Digit1 + [0x00000032, 0x00000022, 0x00000000, 0x00000000], // Digit2 + [0x00000033, 0x00000023, 0x00000000, 0x00000000], // Digit3 + [0x00000034, 0x00000024, 0x00000000, 0x00000000], // Digit4 + [0x00000035, 0x00000025, 0x00000000, 0x00000000], // Digit5 + [0x00000036, 0x00000026, 0x00000000, 0x00000000], // Digit6 + [0x00000037, 0x0000002f, 0x00000000, 0x00000000], // Digit7 + [0x00000038, 0x00000028, 0x00000000, 0x00000000], // Digit8 + [0x00000039, 0x00000029, 0x00000000, 0x00000000], // Digit9 + [0x00000030, 0x0000003d, 0x00000000, 0x00000000], // Digit0 + [0x00000027, 0x0000003f, 0x0000005c, 0x00000000], // Minus + [0x000000bf, 0x000000a1, 0x00000000, 0x00000000], // Equal + [0x000000b4, 0x000000a8, 0x00000000, 0x00000000], // BracketLeft + [0x0000002b, 0x0000002a, 0x0000007e, 0x00000000], // BracketRight + [0x0000007d, 0x0000005d, 0x00000060, 0x00000000], // Backslash + [0x000000f1, 0x000000d1, 0x00000000, 0x00000000], // Semicolon + [0x0000007b, 0x0000005b, 0x0000005e, 0x00000000], // Quote + [0x0000007c, 0x000000b0, 0x000000ac, 0x00000000], // Backquote + [0x0000002c, 0x0000003b, 0x00000000, 0x00000000], // Comma + [0x0000002e, 0x0000003a, 0x00000000, 0x00000000], // Period + [0x0000002d, 0x0000005f, 0x00000000, 0x00000000], // Slash ], ), LayoutInfo( name: 'fr', - platform: LayoutPlatform.darwin, + platform: LayoutPlatform.win, mapping: >[ - [0x00000071, 0x00000051, 0x00002021, 0x000003a9], // KeyA - [0x00000062, 0x00000042, 0x000000df, 0x0000222b], // KeyB - [0x00000063, 0x00000043, 0x000000a9, 0x000000a2], // KeyC - [0x00000064, 0x00000044, 0x00002202, 0x00002206], // KeyD - [0x00000065, 0x00000045, 0x000000ea, 0x000000ca], // KeyE - [0x00000066, 0x00000046, 0x00000192, 0x000000b7], // KeyF - [0x00000067, 0x00000047, 0x0000fb01, 0x0000fb02], // KeyG - [0x00000068, 0x00000048, 0x000000cc, 0x000000ce], // KeyH - [0x00000069, 0x00000049, 0x000000ee, 0x000000ef], // KeyI - [0x0000006a, 0x0000004a, 0x000000cf, 0x000000cd], // KeyJ - [0x0000006b, 0x0000004b, 0x000000c8, 0x000000cb], // KeyK - [0x0000006c, 0x0000004c, 0x000000ac, 0x0000007c], // KeyL - [0x0000002c, 0x0000003f, 0x0000221e, 0x000000bf], // KeyM - [0x0000006e, 0x0000004e, 0x01000000, 0x00000131], // KeyN - [0x0000006f, 0x0000004f, 0x00000153, 0x00000152], // KeyO - [0x00000070, 0x00000050, 0x000003c0, 0x0000220f], // KeyP - [0x00000061, 0x00000041, 0x000000e6, 0x000000c6], // KeyQ - [0x00000072, 0x00000052, 0x000000ae, 0x0000201a], // KeyR - [0x00000073, 0x00000053, 0x000000d2, 0x00002211], // KeyS - [0x00000074, 0x00000054, 0x00002020, 0x00002122], // KeyT - [0x00000075, 0x00000055, 0x000000ba, 0x000000aa], // KeyU - [0x00000076, 0x00000056, 0x000025ca, 0x0000221a], // KeyV - [0x0000007a, 0x0000005a, 0x000000c2, 0x000000c5], // KeyW - [0x00000078, 0x00000058, 0x00002248, 0x00002044], // KeyX - [0x00000079, 0x00000059, 0x000000da, 0x00000178], // KeyY - [0x00000077, 0x00000057, 0x00002039, 0x0000203a], // KeyZ - [0x00000026, 0x00000031, 0x0000f8ff, 0x01000000], // Digit1 - [0x000000e9, 0x00000032, 0x000000eb, 0x0000201e], // Digit2 - [0x00000022, 0x00000033, 0x0000201c, 0x0000201d], // Digit3 - [0x00000027, 0x00000034, 0x00002018, 0x00002019], // Digit4 - [0x00000028, 0x00000035, 0x0000007b, 0x0000005b], // Digit5 - [0x000000a7, 0x00000036, 0x000000b6, 0x000000e5], // Digit6 - [0x000000e8, 0x00000037, 0x000000ab, 0x000000bb], // Digit7 - [0x00000021, 0x00000038, 0x000000a1, 0x000000db], // Digit8 - [0x000000e7, 0x00000039, 0x000000c7, 0x000000c1], // Digit9 - [0x000000e0, 0x00000030, 0x000000f8, 0x000000d8], // Digit0 - [0x00000029, 0x000000b0, 0x0000007d, 0x0000005d], // Minus - [0x0000002d, 0x0000005f, 0x00002014, 0x00002013], // Equal - [0x01000000, 0x01000000, 0x000000f4, 0x000000d4], // BracketLeft - [0x00000024, 0x0000002a, 0x000020ac, 0x000000a5], // BracketRight - [0x01000000, 0x000000a3, 0x00000040, 0x00000023], // Backslash - [0x0000006d, 0x0000004d, 0x000000b5, 0x000000d3], // Semicolon - [0x000000f9, 0x00000025, 0x000000d9, 0x00002030], // Quote - [0x0000003c, 0x0000003e, 0x00002264, 0x00002265], // Backquote - [0x0000003b, 0x0000002e, 0x00002026, 0x00002022], // Comma - [0x0000003a, 0x0000002f, 0x000000f7, 0x0000005c], // Period - [0x0000003d, 0x0000002b, 0x00002260, 0x000000b1], // Slash + [0x00000071, 0x00000051, 0x00000000, 0x00000000], // KeyA + [0x00000062, 0x00000042, 0x00000000, 0x00000000], // KeyB + [0x00000063, 0x00000043, 0x00000000, 0x00000000], // KeyC + [0x00000064, 0x00000044, 0x00000000, 0x00000000], // KeyD + [0x00000065, 0x00000045, 0x000020ac, 0x00000000], // KeyE + [0x00000066, 0x00000046, 0x00000000, 0x00000000], // KeyF + [0x00000067, 0x00000047, 0x00000000, 0x00000000], // KeyG + [0x00000068, 0x00000048, 0x00000000, 0x00000000], // KeyH + [0x00000069, 0x00000049, 0x00000000, 0x00000000], // KeyI + [0x0000006a, 0x0000004a, 0x00000000, 0x00000000], // KeyJ + [0x0000006b, 0x0000004b, 0x00000000, 0x00000000], // KeyK + [0x0000006c, 0x0000004c, 0x00000000, 0x00000000], // KeyL + [0x0000002c, 0x0000003f, 0x00000000, 0x00000000], // KeyM + [0x0000006e, 0x0000004e, 0x00000000, 0x00000000], // KeyN + [0x0000006f, 0x0000004f, 0x00000000, 0x00000000], // KeyO + [0x00000070, 0x00000050, 0x00000000, 0x00000000], // KeyP + [0x00000061, 0x00000041, 0x00000000, 0x00000000], // KeyQ + [0x00000072, 0x00000052, 0x00000000, 0x00000000], // KeyR + [0x00000073, 0x00000053, 0x00000000, 0x00000000], // KeyS + [0x00000074, 0x00000054, 0x00000000, 0x00000000], // KeyT + [0x00000075, 0x00000055, 0x00000000, 0x00000000], // KeyU + [0x00000076, 0x00000056, 0x00000000, 0x00000000], // KeyV + [0x0000007a, 0x0000005a, 0x00000000, 0x00000000], // KeyW + [0x00000078, 0x00000058, 0x00000000, 0x00000000], // KeyX + [0x00000079, 0x00000059, 0x00000000, 0x00000000], // KeyY + [0x00000077, 0x00000057, 0x00000000, 0x00000000], // KeyZ + [0x00000026, 0x00000031, 0x00000000, 0x00000000], // Digit1 + [0x000000e9, 0x00000032, 0x0000007e, 0x00000000], // Digit2 + [0x00000022, 0x00000033, 0x00000023, 0x00000000], // Digit3 + [0x00000027, 0x00000034, 0x0000007b, 0x00000000], // Digit4 + [0x00000028, 0x00000035, 0x0000005b, 0x00000000], // Digit5 + [0x0000002d, 0x00000036, 0x0000007c, 0x00000000], // Digit6 + [0x000000e8, 0x00000037, 0x00000060, 0x00000000], // Digit7 + [0x0000005f, 0x00000038, 0x0000005c, 0x00000000], // Digit8 + [0x000000e7, 0x00000039, 0x0000005e, 0x00000000], // Digit9 + [0x000000e0, 0x00000030, 0x00000040, 0x00000000], // Digit0 + [0x00000029, 0x000000b0, 0x0000005d, 0x00000000], // Minus + [0x0000003d, 0x0000002b, 0x0000007d, 0x00000000], // Equal + [0x0000005e, 0x000000a8, 0x00000000, 0x00000000], // BracketLeft + [0x00000024, 0x000000a3, 0x000000a4, 0x00000000], // BracketRight + [0x0000002a, 0x000000b5, 0x00000000, 0x00000000], // Backslash + [0x0000006d, 0x0000004d, 0x00000000, 0x00000000], // Semicolon + [0x000000f9, 0x00000025, 0x00000000, 0x00000000], // Quote + [0x000000b2, 0x00000000, 0x00000000, 0x00000000], // Backquote + [0x0000003b, 0x0000002e, 0x00000000, 0x00000000], // Comma + [0x0000003a, 0x0000002f, 0x00000000, 0x00000000], // Period + [0x00000021, 0x000000a7, 0x00000000, 0x00000000], // Slash ], ), @@ -1309,110 +1309,164 @@ const List kLayouts = [ ), LayoutInfo( - name: 'fr', + name: 'fr', + platform: LayoutPlatform.darwin, + mapping: >[ + [0x00000071, 0x00000051, 0x00002021, 0x000003a9], // KeyA + [0x00000062, 0x00000042, 0x000000df, 0x0000222b], // KeyB + [0x00000063, 0x00000043, 0x000000a9, 0x000000a2], // KeyC + [0x00000064, 0x00000044, 0x00002202, 0x00002206], // KeyD + [0x00000065, 0x00000045, 0x000000ea, 0x000000ca], // KeyE + [0x00000066, 0x00000046, 0x00000192, 0x000000b7], // KeyF + [0x00000067, 0x00000047, 0x0000fb01, 0x0000fb02], // KeyG + [0x00000068, 0x00000048, 0x000000cc, 0x000000ce], // KeyH + [0x00000069, 0x00000049, 0x000000ee, 0x000000ef], // KeyI + [0x0000006a, 0x0000004a, 0x000000cf, 0x000000cd], // KeyJ + [0x0000006b, 0x0000004b, 0x000000c8, 0x000000cb], // KeyK + [0x0000006c, 0x0000004c, 0x000000ac, 0x0000007c], // KeyL + [0x0000002c, 0x0000003f, 0x0000221e, 0x000000bf], // KeyM + [0x0000006e, 0x0000004e, 0x0000007e, 0x00000131], // KeyN + [0x0000006f, 0x0000004f, 0x00000153, 0x00000152], // KeyO + [0x00000070, 0x00000050, 0x000003c0, 0x0000220f], // KeyP + [0x00000061, 0x00000041, 0x000000e6, 0x000000c6], // KeyQ + [0x00000072, 0x00000052, 0x000000ae, 0x0000201a], // KeyR + [0x00000073, 0x00000053, 0x000000d2, 0x00002211], // KeyS + [0x00000074, 0x00000054, 0x00002020, 0x00002122], // KeyT + [0x00000075, 0x00000055, 0x000000ba, 0x000000aa], // KeyU + [0x00000076, 0x00000056, 0x000025ca, 0x0000221a], // KeyV + [0x0000007a, 0x0000005a, 0x000000c2, 0x000000c5], // KeyW + [0x00000078, 0x00000058, 0x00002248, 0x00002044], // KeyX + [0x00000079, 0x00000059, 0x000000da, 0x00000178], // KeyY + [0x00000077, 0x00000057, 0x00002039, 0x0000203a], // KeyZ + [0x00000026, 0x00000031, 0x0000f8ff, 0x000000b4], // Digit1 + [0x000000e9, 0x00000032, 0x000000eb, 0x0000201e], // Digit2 + [0x00000022, 0x00000033, 0x0000201c, 0x0000201d], // Digit3 + [0x00000027, 0x00000034, 0x00002018, 0x00002019], // Digit4 + [0x00000028, 0x00000035, 0x0000007b, 0x0000005b], // Digit5 + [0x000000a7, 0x00000036, 0x000000b6, 0x000000e5], // Digit6 + [0x000000e8, 0x00000037, 0x000000ab, 0x000000bb], // Digit7 + [0x00000021, 0x00000038, 0x000000a1, 0x000000db], // Digit8 + [0x000000e7, 0x00000039, 0x000000c7, 0x000000c1], // Digit9 + [0x000000e0, 0x00000030, 0x000000f8, 0x000000d8], // Digit0 + [0x00000029, 0x000000b0, 0x0000007d, 0x0000005d], // Minus + [0x0000002d, 0x0000005f, 0x00002014, 0x00002013], // Equal + [0x0000005e, 0x000000a8, 0x000000f4, 0x000000d4], // BracketLeft + [0x00000024, 0x0000002a, 0x000020ac, 0x000000a5], // BracketRight + [0x00000060, 0x000000a3, 0x00000040, 0x00000023], // Backslash + [0x0000006d, 0x0000004d, 0x000000b5, 0x000000d3], // Semicolon + [0x000000f9, 0x00000025, 0x000000d9, 0x00002030], // Quote + [0x0000003c, 0x0000003e, 0x00002264, 0x00002265], // Backquote + [0x0000003b, 0x0000002e, 0x00002026, 0x00002022], // Comma + [0x0000003a, 0x0000002f, 0x000000f7, 0x0000005c], // Period + [0x0000003d, 0x0000002b, 0x00002260, 0x000000b1], // Slash + ], + ), + + LayoutInfo( + name: 'hu', platform: LayoutPlatform.win, mapping: >[ - [0x00000071, 0x00000051, 0x01000000, 0x01000000], // KeyA - [0x00000062, 0x00000042, 0x01000000, 0x01000000], // KeyB - [0x00000063, 0x00000043, 0x01000000, 0x01000000], // KeyC - [0x00000064, 0x00000044, 0x01000000, 0x01000000], // KeyD - [0x00000065, 0x00000045, 0x000020ac, 0x01000000], // KeyE - [0x00000066, 0x00000046, 0x01000000, 0x01000000], // KeyF - [0x00000067, 0x00000047, 0x01000000, 0x01000000], // KeyG - [0x00000068, 0x00000048, 0x01000000, 0x01000000], // KeyH - [0x00000069, 0x00000049, 0x01000000, 0x01000000], // KeyI - [0x0000006a, 0x0000004a, 0x01000000, 0x01000000], // KeyJ - [0x0000006b, 0x0000004b, 0x01000000, 0x01000000], // KeyK - [0x0000006c, 0x0000004c, 0x01000000, 0x01000000], // KeyL - [0x0000002c, 0x0000003f, 0x01000000, 0x01000000], // KeyM - [0x0000006e, 0x0000004e, 0x01000000, 0x01000000], // KeyN - [0x0000006f, 0x0000004f, 0x01000000, 0x01000000], // KeyO - [0x00000070, 0x00000050, 0x01000000, 0x01000000], // KeyP - [0x00000061, 0x00000041, 0x01000000, 0x01000000], // KeyQ - [0x00000072, 0x00000052, 0x01000000, 0x01000000], // KeyR - [0x00000073, 0x00000053, 0x01000000, 0x01000000], // KeyS - [0x00000074, 0x00000054, 0x01000000, 0x01000000], // KeyT - [0x00000075, 0x00000055, 0x01000000, 0x01000000], // KeyU - [0x00000076, 0x00000056, 0x01000000, 0x01000000], // KeyV - [0x0000007a, 0x0000005a, 0x01000000, 0x01000000], // KeyW - [0x00000078, 0x00000058, 0x01000000, 0x01000000], // KeyX - [0x00000079, 0x00000059, 0x01000000, 0x01000000], // KeyY - [0x00000077, 0x00000057, 0x01000000, 0x01000000], // KeyZ - [0x00000026, 0x00000031, 0x01000000, 0x01000000], // Digit1 - [0x000000e9, 0x00000032, 0x0000007e, 0x01000000], // Digit2 - [0x00000022, 0x00000033, 0x00000023, 0x01000000], // Digit3 - [0x00000027, 0x00000034, 0x0000007b, 0x01000000], // Digit4 - [0x00000028, 0x00000035, 0x0000005b, 0x01000000], // Digit5 - [0x0000002d, 0x00000036, 0x0000007c, 0x01000000], // Digit6 - [0x000000e8, 0x00000037, 0x00000060, 0x01000000], // Digit7 - [0x0000005f, 0x00000038, 0x0000005c, 0x01000000], // Digit8 - [0x000000e7, 0x00000039, 0x0000005e, 0x01000000], // Digit9 - [0x000000e0, 0x00000030, 0x00000040, 0x01000000], // Digit0 - [0x00000029, 0x000000b0, 0x0000005d, 0x01000000], // Minus - [0x0000003d, 0x0000002b, 0x0000007d, 0x01000000], // Equal - [0x0000005e, 0x000000a8, 0x01000000, 0x01000000], // BracketLeft - [0x00000024, 0x000000a3, 0x000000a4, 0x01000000], // BracketRight - [0x0000002a, 0x000000b5, 0x01000000, 0x01000000], // Backslash - [0x0000006d, 0x0000004d, 0x01000000, 0x01000000], // Semicolon - [0x000000f9, 0x00000025, 0x01000000, 0x01000000], // Quote - [0x000000b2, 0x01000000, 0x01000000, 0x01000000], // Backquote - [0x0000003b, 0x0000002e, 0x01000000, 0x01000000], // Comma - [0x0000003a, 0x0000002f, 0x01000000, 0x01000000], // Period - [0x00000021, 0x000000a7, 0x01000000, 0x01000000], // Slash + [0x00000061, 0x00000041, 0x000000e4, 0x00000000], // KeyA + [0x00000062, 0x00000042, 0x0000007b, 0x00000000], // KeyB + [0x00000063, 0x00000043, 0x00000026, 0x00000000], // KeyC + [0x00000064, 0x00000044, 0x00000110, 0x00000000], // KeyD + [0x00000065, 0x00000045, 0x000000c4, 0x00000000], // KeyE + [0x00000066, 0x00000046, 0x0000005b, 0x00000000], // KeyF + [0x00000067, 0x00000047, 0x0000005d, 0x00000000], // KeyG + [0x00000068, 0x00000048, 0x00000000, 0x00000000], // KeyH + [0x00000069, 0x00000049, 0x000000cd, 0x00000000], // KeyI + [0x0000006a, 0x0000004a, 0x000000ed, 0x00000000], // KeyJ + [0x0000006b, 0x0000004b, 0x00000142, 0x00000000], // KeyK + [0x0000006c, 0x0000004c, 0x00000141, 0x00000000], // KeyL + [0x0000006d, 0x0000004d, 0x0000003c, 0x00000000], // KeyM + [0x0000006e, 0x0000004e, 0x0000007d, 0x00000000], // KeyN + [0x0000006f, 0x0000004f, 0x00000000, 0x00000000], // KeyO + [0x00000070, 0x00000050, 0x00000000, 0x00000000], // KeyP + [0x00000071, 0x00000051, 0x0000005c, 0x00000000], // KeyQ + [0x00000072, 0x00000052, 0x00000000, 0x00000000], // KeyR + [0x00000073, 0x00000053, 0x00000111, 0x00000000], // KeyS + [0x00000074, 0x00000054, 0x00000000, 0x00000000], // KeyT + [0x00000075, 0x00000055, 0x000020ac, 0x00000000], // KeyU + [0x00000076, 0x00000056, 0x00000040, 0x00000000], // KeyV + [0x00000077, 0x00000057, 0x0000007c, 0x00000000], // KeyW + [0x00000078, 0x00000058, 0x00000023, 0x00000000], // KeyX + [0x0000007a, 0x0000005a, 0x00000000, 0x00000000], // KeyY + [0x00000079, 0x00000059, 0x0000003e, 0x00000000], // KeyZ + [0x00000031, 0x00000027, 0x0000007e, 0x00000000], // Digit1 + [0x00000032, 0x00000022, 0x000002c7, 0x00000000], // Digit2 + [0x00000033, 0x0000002b, 0x0000005e, 0x00000000], // Digit3 + [0x00000034, 0x00000021, 0x000002d8, 0x00000000], // Digit4 + [0x00000035, 0x00000025, 0x000000b0, 0x00000000], // Digit5 + [0x00000036, 0x0000002f, 0x000002db, 0x00000000], // Digit6 + [0x00000037, 0x0000003d, 0x00000060, 0x00000000], // Digit7 + [0x00000038, 0x00000028, 0x000002d9, 0x00000000], // Digit8 + [0x00000039, 0x00000029, 0x000000b4, 0x00000000], // Digit9 + [0x000000f6, 0x000000d6, 0x000002dd, 0x00000000], // Digit0 + [0x000000fc, 0x000000dc, 0x000000a8, 0x00000000], // Minus + [0x000000f3, 0x000000d3, 0x000000b8, 0x00000000], // Equal + [0x00000151, 0x00000150, 0x000000f7, 0x00000000], // BracketLeft + [0x000000fa, 0x000000da, 0x000000d7, 0x00000000], // BracketRight + [0x00000171, 0x00000170, 0x000000a4, 0x00000000], // Backslash + [0x000000e9, 0x000000c9, 0x00000024, 0x00000000], // Semicolon + [0x000000e1, 0x000000c1, 0x000000df, 0x00000000], // Quote + [0x00000030, 0x000000a7, 0x00000000, 0x00000000], // Backquote + [0x0000002c, 0x0000003f, 0x0000003b, 0x00000000], // Comma + [0x0000002e, 0x0000003a, 0x0000003e, 0x00000000], // Period + [0x0000002d, 0x0000005f, 0x0000002a, 0x00000000], // Slash ], ), LayoutInfo( - name: 'hu', + name: 'it', platform: LayoutPlatform.win, mapping: >[ - [0x00000061, 0x00000041, 0x000000e4, 0x01000000], // KeyA - [0x00000062, 0x00000042, 0x0000007b, 0x01000000], // KeyB - [0x00000063, 0x00000043, 0x00000026, 0x01000000], // KeyC - [0x00000064, 0x00000044, 0x00000110, 0x01000000], // KeyD - [0x00000065, 0x00000045, 0x000000c4, 0x01000000], // KeyE - [0x00000066, 0x00000046, 0x0000005b, 0x01000000], // KeyF - [0x00000067, 0x00000047, 0x0000005d, 0x01000000], // KeyG - [0x00000068, 0x00000048, 0x01000000, 0x01000000], // KeyH - [0x00000069, 0x00000049, 0x000000cd, 0x01000000], // KeyI - [0x0000006a, 0x0000004a, 0x000000ed, 0x01000000], // KeyJ - [0x0000006b, 0x0000004b, 0x00000142, 0x01000000], // KeyK - [0x0000006c, 0x0000004c, 0x00000141, 0x01000000], // KeyL - [0x0000006d, 0x0000004d, 0x0000003c, 0x01000000], // KeyM - [0x0000006e, 0x0000004e, 0x0000007d, 0x01000000], // KeyN - [0x0000006f, 0x0000004f, 0x01000000, 0x01000000], // KeyO - [0x00000070, 0x00000050, 0x01000000, 0x01000000], // KeyP - [0x00000071, 0x00000051, 0x0000005c, 0x01000000], // KeyQ - [0x00000072, 0x00000052, 0x01000000, 0x01000000], // KeyR - [0x00000073, 0x00000053, 0x00000111, 0x01000000], // KeyS - [0x00000074, 0x00000054, 0x01000000, 0x01000000], // KeyT - [0x00000075, 0x00000055, 0x000020ac, 0x01000000], // KeyU - [0x00000076, 0x00000056, 0x00000040, 0x01000000], // KeyV - [0x00000077, 0x00000057, 0x0000007c, 0x01000000], // KeyW - [0x00000078, 0x00000058, 0x00000023, 0x01000000], // KeyX - [0x0000007a, 0x0000005a, 0x01000000, 0x01000000], // KeyY - [0x00000079, 0x00000059, 0x0000003e, 0x01000000], // KeyZ - [0x00000031, 0x00000027, 0x0000007e, 0x01000000], // Digit1 - [0x00000032, 0x00000022, 0x000002c7, 0x01000000], // Digit2 - [0x00000033, 0x0000002b, 0x0000005e, 0x01000000], // Digit3 - [0x00000034, 0x00000021, 0x000002d8, 0x01000000], // Digit4 - [0x00000035, 0x00000025, 0x000000b0, 0x01000000], // Digit5 - [0x00000036, 0x0000002f, 0x000002db, 0x01000000], // Digit6 - [0x00000037, 0x0000003d, 0x00000060, 0x01000000], // Digit7 - [0x00000038, 0x00000028, 0x000002d9, 0x01000000], // Digit8 - [0x00000039, 0x00000029, 0x000000b4, 0x01000000], // Digit9 - [0x000000f6, 0x000000d6, 0x000002dd, 0x01000000], // Digit0 - [0x000000fc, 0x000000dc, 0x000000a8, 0x01000000], // Minus - [0x000000f3, 0x000000d3, 0x000000b8, 0x01000000], // Equal - [0x00000151, 0x00000150, 0x000000f7, 0x01000000], // BracketLeft - [0x000000fa, 0x000000da, 0x000000d7, 0x01000000], // BracketRight - [0x00000171, 0x00000170, 0x000000a4, 0x01000000], // Backslash - [0x000000e9, 0x000000c9, 0x00000024, 0x01000000], // Semicolon - [0x000000e1, 0x000000c1, 0x000000df, 0x01000000], // Quote - [0x00000030, 0x000000a7, 0x01000000, 0x01000000], // Backquote - [0x0000002c, 0x0000003f, 0x0000003b, 0x01000000], // Comma - [0x0000002e, 0x0000003a, 0x0000003e, 0x01000000], // Period - [0x0000002d, 0x0000005f, 0x0000002a, 0x01000000], // Slash + [0x00000061, 0x00000041, 0x00000000, 0x00000000], // KeyA + [0x00000062, 0x00000042, 0x00000000, 0x00000000], // KeyB + [0x00000063, 0x00000043, 0x00000000, 0x00000000], // KeyC + [0x00000064, 0x00000044, 0x00000000, 0x00000000], // KeyD + [0x00000065, 0x00000045, 0x000020ac, 0x00000000], // KeyE + [0x00000066, 0x00000046, 0x00000000, 0x00000000], // KeyF + [0x00000067, 0x00000047, 0x00000000, 0x00000000], // KeyG + [0x00000068, 0x00000048, 0x00000000, 0x00000000], // KeyH + [0x00000069, 0x00000049, 0x00000000, 0x00000000], // KeyI + [0x0000006a, 0x0000004a, 0x00000000, 0x00000000], // KeyJ + [0x0000006b, 0x0000004b, 0x00000000, 0x00000000], // KeyK + [0x0000006c, 0x0000004c, 0x00000000, 0x00000000], // KeyL + [0x0000006d, 0x0000004d, 0x00000000, 0x00000000], // KeyM + [0x0000006e, 0x0000004e, 0x00000000, 0x00000000], // KeyN + [0x0000006f, 0x0000004f, 0x00000000, 0x00000000], // KeyO + [0x00000070, 0x00000050, 0x00000000, 0x00000000], // KeyP + [0x00000071, 0x00000051, 0x00000000, 0x00000000], // KeyQ + [0x00000072, 0x00000052, 0x00000000, 0x00000000], // KeyR + [0x00000073, 0x00000053, 0x00000000, 0x00000000], // KeyS + [0x00000074, 0x00000054, 0x00000000, 0x00000000], // KeyT + [0x00000075, 0x00000055, 0x00000000, 0x00000000], // KeyU + [0x00000076, 0x00000056, 0x00000000, 0x00000000], // KeyV + [0x00000077, 0x00000057, 0x00000000, 0x00000000], // KeyW + [0x00000078, 0x00000058, 0x00000000, 0x00000000], // KeyX + [0x00000079, 0x00000059, 0x00000000, 0x00000000], // KeyY + [0x0000007a, 0x0000005a, 0x00000000, 0x00000000], // KeyZ + [0x00000031, 0x00000021, 0x00000000, 0x00000000], // Digit1 + [0x00000032, 0x00000022, 0x00000000, 0x00000000], // Digit2 + [0x00000033, 0x000000a3, 0x00000000, 0x00000000], // Digit3 + [0x00000034, 0x00000024, 0x00000000, 0x00000000], // Digit4 + [0x00000035, 0x00000025, 0x000020ac, 0x00000000], // Digit5 + [0x00000036, 0x00000026, 0x00000000, 0x00000000], // Digit6 + [0x00000037, 0x0000002f, 0x00000000, 0x00000000], // Digit7 + [0x00000038, 0x00000028, 0x00000000, 0x00000000], // Digit8 + [0x00000039, 0x00000029, 0x00000000, 0x00000000], // Digit9 + [0x00000030, 0x0000003d, 0x00000000, 0x00000000], // Digit0 + [0x00000027, 0x0000003f, 0x00000000, 0x00000000], // Minus + [0x000000ec, 0x0000005e, 0x00000000, 0x00000000], // Equal + [0x000000e8, 0x000000e9, 0x0000005b, 0x0000007b], // BracketLeft + [0x0000002b, 0x0000002a, 0x0000005d, 0x0000007d], // BracketRight + [0x000000f9, 0x000000a7, 0x00000000, 0x00000000], // Backslash + [0x000000f2, 0x000000e7, 0x00000040, 0x00000000], // Semicolon + [0x000000e0, 0x000000b0, 0x00000023, 0x00000000], // Quote + [0x0000005c, 0x0000007c, 0x00000000, 0x00000000], // Backquote + [0x0000002c, 0x0000003b, 0x00000000, 0x00000000], // Comma + [0x0000002e, 0x0000003a, 0x00000000, 0x00000000], // Period + [0x0000002d, 0x0000005f, 0x00000000, 0x00000000], // Slash ], ), @@ -1433,14 +1487,14 @@ const List kLayouts = [ [0x0000006b, 0x0000004b, 0x000000ba, 0x000002db], // KeyK [0x0000006c, 0x0000004c, 0x000000ac, 0x000002c7], // KeyL [0x0000006d, 0x0000004d, 0x000000b5, 0x000000da], // KeyM - [0x0000006e, 0x0000004e, 0x01000000, 0x000000d3], // KeyN + [0x0000006e, 0x0000004e, 0x000002dc, 0x000000d3], // KeyN [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO [0x00000070, 0x00000050, 0x000003c0, 0x0000220f], // KeyP [0x00000071, 0x00000051, 0x0000201e, 0x0000201a], // KeyQ [0x00000072, 0x00000052, 0x000000ae, 0x000000cc], // KeyR [0x00000073, 0x00000053, 0x000000df, 0x000000af], // KeyS [0x00000074, 0x00000054, 0x00002122, 0x000000d2], // KeyT - [0x00000075, 0x00000055, 0x01000000, 0x000000d9], // KeyU + [0x00000075, 0x00000055, 0x000000a8, 0x000000d9], // KeyU [0x00000076, 0x00000056, 0x0000221a, 0x000000c9], // KeyV [0x00000077, 0x00000057, 0x000003a9, 0x000000c0], // KeyW [0x00000078, 0x00000058, 0x00002020, 0x00002021], // KeyX @@ -1453,11 +1507,11 @@ const List kLayouts = [ [0x00000035, 0x00000025, 0x0000007e, 0x00002030], // Digit5 [0x00000036, 0x00000026, 0x00002039, 0x0000203a], // Digit6 [0x00000037, 0x0000002f, 0x000000f7, 0x00002044], // Digit7 - [0x00000038, 0x00000028, 0x01000000, 0x0000f8ff], // Digit8 - [0x00000039, 0x00000029, 0x01000000, 0x00000020], // Digit9 + [0x00000038, 0x00000028, 0x000000b4, 0x0000f8ff], // Digit8 + [0x00000039, 0x00000029, 0x00000060, 0x00000020], // Digit9 [0x00000030, 0x0000003d, 0x00002260, 0x00002248], // Digit0 [0x00000027, 0x0000003f, 0x000000a1, 0x000000bf], // Minus - [0x000000ec, 0x0000005e, 0x01000000, 0x000000b1], // Equal + [0x000000ec, 0x0000005e, 0x000002c6, 0x000000b1], // Equal [0x000000e8, 0x000000e9, 0x0000005b, 0x0000007b], // BracketLeft [0x0000002b, 0x0000002a, 0x0000005d, 0x0000007d], // BracketRight [0x000000f9, 0x000000a7, 0x000000b6, 0x000025ca], // Backslash @@ -1470,114 +1524,6 @@ const List kLayouts = [ ], ), - LayoutInfo( - name: 'it', - platform: LayoutPlatform.win, - mapping: >[ - [0x00000061, 0x00000041, 0x01000000, 0x01000000], // KeyA - [0x00000062, 0x00000042, 0x01000000, 0x01000000], // KeyB - [0x00000063, 0x00000043, 0x01000000, 0x01000000], // KeyC - [0x00000064, 0x00000044, 0x01000000, 0x01000000], // KeyD - [0x00000065, 0x00000045, 0x000020ac, 0x01000000], // KeyE - [0x00000066, 0x00000046, 0x01000000, 0x01000000], // KeyF - [0x00000067, 0x00000047, 0x01000000, 0x01000000], // KeyG - [0x00000068, 0x00000048, 0x01000000, 0x01000000], // KeyH - [0x00000069, 0x00000049, 0x01000000, 0x01000000], // KeyI - [0x0000006a, 0x0000004a, 0x01000000, 0x01000000], // KeyJ - [0x0000006b, 0x0000004b, 0x01000000, 0x01000000], // KeyK - [0x0000006c, 0x0000004c, 0x01000000, 0x01000000], // KeyL - [0x0000006d, 0x0000004d, 0x01000000, 0x01000000], // KeyM - [0x0000006e, 0x0000004e, 0x01000000, 0x01000000], // KeyN - [0x0000006f, 0x0000004f, 0x01000000, 0x01000000], // KeyO - [0x00000070, 0x00000050, 0x01000000, 0x01000000], // KeyP - [0x00000071, 0x00000051, 0x01000000, 0x01000000], // KeyQ - [0x00000072, 0x00000052, 0x01000000, 0x01000000], // KeyR - [0x00000073, 0x00000053, 0x01000000, 0x01000000], // KeyS - [0x00000074, 0x00000054, 0x01000000, 0x01000000], // KeyT - [0x00000075, 0x00000055, 0x01000000, 0x01000000], // KeyU - [0x00000076, 0x00000056, 0x01000000, 0x01000000], // KeyV - [0x00000077, 0x00000057, 0x01000000, 0x01000000], // KeyW - [0x00000078, 0x00000058, 0x01000000, 0x01000000], // KeyX - [0x00000079, 0x00000059, 0x01000000, 0x01000000], // KeyY - [0x0000007a, 0x0000005a, 0x01000000, 0x01000000], // KeyZ - [0x00000031, 0x00000021, 0x01000000, 0x01000000], // Digit1 - [0x00000032, 0x00000022, 0x01000000, 0x01000000], // Digit2 - [0x00000033, 0x000000a3, 0x01000000, 0x01000000], // Digit3 - [0x00000034, 0x00000024, 0x01000000, 0x01000000], // Digit4 - [0x00000035, 0x00000025, 0x000020ac, 0x01000000], // Digit5 - [0x00000036, 0x00000026, 0x01000000, 0x01000000], // Digit6 - [0x00000037, 0x0000002f, 0x01000000, 0x01000000], // Digit7 - [0x00000038, 0x00000028, 0x01000000, 0x01000000], // Digit8 - [0x00000039, 0x00000029, 0x01000000, 0x01000000], // Digit9 - [0x00000030, 0x0000003d, 0x01000000, 0x01000000], // Digit0 - [0x00000027, 0x0000003f, 0x01000000, 0x01000000], // Minus - [0x000000ec, 0x0000005e, 0x01000000, 0x01000000], // Equal - [0x000000e8, 0x000000e9, 0x0000005b, 0x0000007b], // BracketLeft - [0x0000002b, 0x0000002a, 0x0000005d, 0x0000007d], // BracketRight - [0x000000f9, 0x000000a7, 0x01000000, 0x01000000], // Backslash - [0x000000f2, 0x000000e7, 0x00000040, 0x01000000], // Semicolon - [0x000000e0, 0x000000b0, 0x00000023, 0x01000000], // Quote - [0x0000005c, 0x0000007c, 0x01000000, 0x01000000], // Backquote - [0x0000002c, 0x0000003b, 0x01000000, 0x01000000], // Comma - [0x0000002e, 0x0000003a, 0x01000000, 0x01000000], // Period - [0x0000002d, 0x0000005f, 0x01000000, 0x01000000], // Slash - ], - ), - - LayoutInfo( - name: 'jp-roman', - platform: LayoutPlatform.darwin, - mapping: >[ - [0x00000061, 0x00000041, 0x01000000, 0x00000304], // KeyA - [0x00000062, 0x00000042, 0x01000000, 0x00000306], // KeyB - [0x00000063, 0x00000043, 0x01000000, 0x00000327], // KeyC - [0x00000064, 0x00000044, 0x000000f0, 0x000000d0], // KeyD - [0x00000065, 0x00000045, 0x01000000, 0x00000301], // KeyE - [0x00000066, 0x00000046, 0x00000192, 0x01000000], // KeyF - [0x00000067, 0x00000047, 0x000000a9, 0x01000000], // KeyG - [0x00000068, 0x00000048, 0x01000000, 0x00000331], // KeyH - [0x00000069, 0x00000049, 0x01000000, 0x0000031b], // KeyI - [0x0000006a, 0x0000004a, 0x01000000, 0x0000030b], // KeyJ - [0x0000006b, 0x0000004b, 0x01000000, 0x0000030a], // KeyK - [0x0000006c, 0x0000004c, 0x01000000, 0x00000335], // KeyL - [0x0000006d, 0x0000004d, 0x01000000, 0x00000328], // KeyM - [0x0000006e, 0x0000004e, 0x01000000, 0x00000303], // KeyN - [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO - [0x00000070, 0x00000050, 0x01000000, 0x00000326], // KeyP - [0x00000071, 0x00000051, 0x00000153, 0x00000152], // KeyQ - [0x00000072, 0x00000052, 0x000000ae, 0x00002030], // KeyR - [0x00000073, 0x00000053, 0x000000df, 0x01000000], // KeyS - [0x00000074, 0x00000054, 0x000000fe, 0x000000de], // KeyT - [0x00000075, 0x00000055, 0x01000000, 0x00000308], // KeyU - [0x00000076, 0x00000056, 0x01000000, 0x0000030c], // KeyV - [0x00000077, 0x00000057, 0x01000000, 0x00000307], // KeyW - [0x00000078, 0x00000058, 0x01000000, 0x00000323], // KeyX - [0x00000079, 0x00000059, 0x000000a5, 0x01000000], // KeyY - [0x0000007a, 0x0000005a, 0x01000000, 0x00000309], // KeyZ - [0x00000031, 0x00000021, 0x000000a1, 0x00002044], // Digit1 - [0x00000032, 0x00000040, 0x00002122, 0x000020ac], // Digit2 - [0x00000033, 0x00000023, 0x000000a3, 0x00002039], // Digit3 - [0x00000034, 0x00000024, 0x000000a2, 0x0000203a], // Digit4 - [0x00000035, 0x00000025, 0x000000a7, 0x00002020], // Digit5 - [0x00000036, 0x0000005e, 0x01000000, 0x00000302], // Digit6 - [0x00000037, 0x00000026, 0x000000b6, 0x00002021], // Digit7 - [0x00000038, 0x0000002a, 0x00002022, 0x000000b0], // Digit8 - [0x00000039, 0x00000028, 0x000000aa, 0x000000b7], // Digit9 - [0x00000030, 0x00000029, 0x000000ba, 0x0000201a], // Digit0 - [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Minus - [0x0000003d, 0x0000002b, 0x00002260, 0x000000b1], // Equal - [0x0000005b, 0x0000007b, 0x0000201c, 0x0000201d], // BracketLeft - [0x0000005d, 0x0000007d, 0x00002018, 0x00002019], // BracketRight - [0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb], // Backslash - [0x0000003b, 0x0000003a, 0x00002026, 0x01000000], // Semicolon - [0x00000027, 0x00000022, 0x000000e6, 0x000000c6], // Quote - [0x00000060, 0x0000007e, 0x01000000, 0x00000300], // Backquote - [0x0000002c, 0x0000003c, 0x00002264, 0x0000201e], // Comma - [0x0000002e, 0x0000003e, 0x00002265, 0x01000000], // Period - [0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf], // Slash - ], - ), - LayoutInfo( name: 'jp', platform: LayoutPlatform.darwin, @@ -1586,23 +1532,23 @@ const List kLayouts = [ [0x00000062, 0x00000042, 0x0000222b, 0x00000131], // KeyB [0x00000063, 0x00000043, 0x000000e7, 0x000000c7], // KeyC [0x00000064, 0x00000044, 0x00002202, 0x000000ce], // KeyD - [0x00000065, 0x00000045, 0x01000000, 0x000000b4], // KeyE + [0x00000065, 0x00000045, 0x000000b4, 0x000000b4], // KeyE [0x00000066, 0x00000046, 0x00000192, 0x000000cf], // KeyF [0x00000067, 0x00000047, 0x000000a9, 0x000002dd], // KeyG [0x00000068, 0x00000048, 0x000002d9, 0x000000d3], // KeyH - [0x00000069, 0x00000049, 0x01000000, 0x000002c6], // KeyI + [0x00000069, 0x00000049, 0x000002c6, 0x000002c6], // KeyI [0x0000006a, 0x0000004a, 0x00002206, 0x000000d4], // KeyJ [0x0000006b, 0x0000004b, 0x000002da, 0x0000f8ff], // KeyK [0x0000006c, 0x0000004c, 0x000000ac, 0x000000d2], // KeyL [0x0000006d, 0x0000004d, 0x000000b5, 0x000000c2], // KeyM - [0x0000006e, 0x0000004e, 0x01000000, 0x000002dc], // KeyN + [0x0000006e, 0x0000004e, 0x000002dc, 0x000002dc], // KeyN [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO [0x00000070, 0x00000050, 0x000003c0, 0x0000220f], // KeyP [0x00000071, 0x00000051, 0x00000153, 0x00000152], // KeyQ [0x00000072, 0x00000052, 0x000000ae, 0x00002030], // KeyR [0x00000073, 0x00000053, 0x000000df, 0x000000cd], // KeyS [0x00000074, 0x00000054, 0x00002020, 0x000002c7], // KeyT - [0x00000075, 0x00000055, 0x01000000, 0x000000a8], // KeyU + [0x00000075, 0x00000055, 0x000000a8, 0x000000a8], // KeyU [0x00000076, 0x00000056, 0x0000221a, 0x000025ca], // KeyV [0x00000077, 0x00000057, 0x00002211, 0x0000201e], // KeyW [0x00000078, 0x00000058, 0x00002248, 0x000002db], // KeyX @@ -1625,13 +1571,67 @@ const List kLayouts = [ [0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb], // Backslash [0x0000003b, 0x0000003a, 0x00002026, 0x000000da], // Semicolon [0x00000027, 0x00000022, 0x000000e6, 0x000000c6], // Quote - [0x00000060, 0x0000007e, 0x01000000, 0x00000060], // Backquote + [0x00000060, 0x0000007e, 0x00000060, 0x00000060], // Backquote [0x0000002c, 0x0000003c, 0x00002264, 0x000000af], // Comma [0x0000002e, 0x0000003e, 0x00002265, 0x000002d8], // Period [0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf], // Slash ], ), + LayoutInfo( + name: 'jp-roman', + platform: LayoutPlatform.darwin, + mapping: >[ + [0x00000061, 0x00000041, 0x000000af, 0x00000304], // KeyA + [0x00000062, 0x00000042, 0x000002d8, 0x00000306], // KeyB + [0x00000063, 0x00000043, 0x000000b8, 0x00000327], // KeyC + [0x00000064, 0x00000044, 0x000000f0, 0x000000d0], // KeyD + [0x00000065, 0x00000045, 0x000000b4, 0x00000301], // KeyE + [0x00000066, 0x00000046, 0x00000192, 0x00000000], // KeyF + [0x00000067, 0x00000047, 0x000000a9, 0x00002038], // KeyG + [0x00000068, 0x00000048, 0x000002cd, 0x00000331], // KeyH + [0x00000069, 0x00000049, 0x000002bc, 0x0000031b], // KeyI + [0x0000006a, 0x0000004a, 0x000002dd, 0x0000030b], // KeyJ + [0x0000006b, 0x0000004b, 0x000002da, 0x0000030a], // KeyK + [0x0000006c, 0x0000004c, 0x0000002d, 0x00000335], // KeyL + [0x0000006d, 0x0000004d, 0x000002db, 0x00000328], // KeyM + [0x0000006e, 0x0000004e, 0x000002dc, 0x00000303], // KeyN + [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO + [0x00000070, 0x00000050, 0x0000002c, 0x00000326], // KeyP + [0x00000071, 0x00000051, 0x00000153, 0x00000152], // KeyQ + [0x00000072, 0x00000052, 0x000000ae, 0x00002030], // KeyR + [0x00000073, 0x00000053, 0x000000df, 0x00000000], // KeyS + [0x00000074, 0x00000054, 0x000000fe, 0x000000de], // KeyT + [0x00000075, 0x00000055, 0x000000a8, 0x00000308], // KeyU + [0x00000076, 0x00000056, 0x000002c7, 0x0000030c], // KeyV + [0x00000077, 0x00000057, 0x000002d9, 0x00000307], // KeyW + [0x00000078, 0x00000058, 0x0000002e, 0x00000323], // KeyX + [0x00000079, 0x00000059, 0x000000a5, 0x00000000], // KeyY + [0x0000007a, 0x0000005a, 0x000002c0, 0x00000309], // KeyZ + [0x00000031, 0x00000021, 0x000000a1, 0x00002044], // Digit1 + [0x00000032, 0x00000040, 0x00002122, 0x000020ac], // Digit2 + [0x00000033, 0x00000023, 0x000000a3, 0x00002039], // Digit3 + [0x00000034, 0x00000024, 0x000000a2, 0x0000203a], // Digit4 + [0x00000035, 0x00000025, 0x000000a7, 0x00002020], // Digit5 + [0x00000036, 0x0000005e, 0x000002c6, 0x00000302], // Digit6 + [0x00000037, 0x00000026, 0x000000b6, 0x00002021], // Digit7 + [0x00000038, 0x0000002a, 0x00002022, 0x000000b0], // Digit8 + [0x00000039, 0x00000028, 0x000000aa, 0x000000b7], // Digit9 + [0x00000030, 0x00000029, 0x000000ba, 0x0000201a], // Digit0 + [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Minus + [0x0000003d, 0x0000002b, 0x00002260, 0x000000b1], // Equal + [0x0000005b, 0x0000007b, 0x0000201c, 0x0000201d], // BracketLeft + [0x0000005d, 0x0000007d, 0x00002018, 0x00002019], // BracketRight + [0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb], // Backslash + [0x0000003b, 0x0000003a, 0x00002026, 0x00002116], // Semicolon + [0x00000027, 0x00000022, 0x000000e6, 0x000000c6], // Quote + [0x00000060, 0x0000007e, 0x00000060, 0x00000300], // Backquote + [0x0000002c, 0x0000003c, 0x00002264, 0x0000201e], // Comma + [0x0000002e, 0x0000003e, 0x00002265, 0x00000294], // Period + [0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf], // Slash + ], + ), + LayoutInfo( name: 'ko', platform: LayoutPlatform.darwin, @@ -1690,53 +1690,107 @@ const List kLayouts = [ name: 'no', platform: LayoutPlatform.win, mapping: >[ - [0x00000061, 0x00000041, 0x01000000, 0x01000000], // KeyA - [0x00000062, 0x00000042, 0x01000000, 0x01000000], // KeyB - [0x00000063, 0x00000043, 0x01000000, 0x01000000], // KeyC - [0x00000064, 0x00000044, 0x01000000, 0x01000000], // KeyD - [0x00000065, 0x00000045, 0x000020ac, 0x01000000], // KeyE - [0x00000066, 0x00000046, 0x01000000, 0x01000000], // KeyF - [0x00000067, 0x00000047, 0x01000000, 0x01000000], // KeyG - [0x00000068, 0x00000048, 0x01000000, 0x01000000], // KeyH - [0x00000069, 0x00000049, 0x01000000, 0x01000000], // KeyI - [0x0000006a, 0x0000004a, 0x01000000, 0x01000000], // KeyJ - [0x0000006b, 0x0000004b, 0x01000000, 0x01000000], // KeyK - [0x0000006c, 0x0000004c, 0x01000000, 0x01000000], // KeyL - [0x0000006d, 0x0000004d, 0x000000b5, 0x01000000], // KeyM - [0x0000006e, 0x0000004e, 0x01000000, 0x01000000], // KeyN - [0x0000006f, 0x0000004f, 0x01000000, 0x01000000], // KeyO - [0x00000070, 0x00000050, 0x01000000, 0x01000000], // KeyP - [0x00000071, 0x00000051, 0x01000000, 0x01000000], // KeyQ - [0x00000072, 0x00000052, 0x01000000, 0x01000000], // KeyR - [0x00000073, 0x00000053, 0x01000000, 0x01000000], // KeyS - [0x00000074, 0x00000054, 0x01000000, 0x01000000], // KeyT - [0x00000075, 0x00000055, 0x01000000, 0x01000000], // KeyU - [0x00000076, 0x00000056, 0x01000000, 0x01000000], // KeyV - [0x00000077, 0x00000057, 0x01000000, 0x01000000], // KeyW - [0x00000078, 0x00000058, 0x01000000, 0x01000000], // KeyX - [0x00000079, 0x00000059, 0x01000000, 0x01000000], // KeyY - [0x0000007a, 0x0000005a, 0x01000000, 0x01000000], // KeyZ - [0x00000031, 0x00000021, 0x01000000, 0x01000000], // Digit1 - [0x00000032, 0x00000022, 0x00000040, 0x01000000], // Digit2 - [0x00000033, 0x00000023, 0x000000a3, 0x01000000], // Digit3 - [0x00000034, 0x000000a4, 0x00000024, 0x01000000], // Digit4 - [0x00000035, 0x00000025, 0x000020ac, 0x01000000], // Digit5 - [0x00000036, 0x00000026, 0x01000000, 0x01000000], // Digit6 - [0x00000037, 0x0000002f, 0x0000007b, 0x01000000], // Digit7 - [0x00000038, 0x00000028, 0x0000005b, 0x01000000], // Digit8 - [0x00000039, 0x00000029, 0x0000005d, 0x01000000], // Digit9 - [0x00000030, 0x0000003d, 0x0000007d, 0x01000000], // Digit0 - [0x0000002b, 0x0000003f, 0x01000000, 0x01000000], // Minus - [0x0000005c, 0x00000060, 0x000000b4, 0x01000000], // Equal - [0x000000e5, 0x000000c5, 0x01000000, 0x01000000], // BracketLeft - [0x000000a8, 0x0000005e, 0x0000007e, 0x01000000], // BracketRight - [0x00000027, 0x0000002a, 0x01000000, 0x01000000], // Backslash - [0x000000f8, 0x000000d8, 0x01000000, 0x01000000], // Semicolon - [0x000000e6, 0x000000c6, 0x01000000, 0x01000000], // Quote - [0x0000007c, 0x000000a7, 0x01000000, 0x01000000], // Backquote - [0x0000002c, 0x0000003b, 0x01000000, 0x01000000], // Comma - [0x0000002e, 0x0000003a, 0x01000000, 0x01000000], // Period - [0x0000002d, 0x0000005f, 0x01000000, 0x01000000], // Slash + [0x00000061, 0x00000041, 0x00000000, 0x00000000], // KeyA + [0x00000062, 0x00000042, 0x00000000, 0x00000000], // KeyB + [0x00000063, 0x00000043, 0x00000000, 0x00000000], // KeyC + [0x00000064, 0x00000044, 0x00000000, 0x00000000], // KeyD + [0x00000065, 0x00000045, 0x000020ac, 0x00000000], // KeyE + [0x00000066, 0x00000046, 0x00000000, 0x00000000], // KeyF + [0x00000067, 0x00000047, 0x00000000, 0x00000000], // KeyG + [0x00000068, 0x00000048, 0x00000000, 0x00000000], // KeyH + [0x00000069, 0x00000049, 0x00000000, 0x00000000], // KeyI + [0x0000006a, 0x0000004a, 0x00000000, 0x00000000], // KeyJ + [0x0000006b, 0x0000004b, 0x00000000, 0x00000000], // KeyK + [0x0000006c, 0x0000004c, 0x00000000, 0x00000000], // KeyL + [0x0000006d, 0x0000004d, 0x000000b5, 0x00000000], // KeyM + [0x0000006e, 0x0000004e, 0x00000000, 0x00000000], // KeyN + [0x0000006f, 0x0000004f, 0x00000000, 0x00000000], // KeyO + [0x00000070, 0x00000050, 0x00000000, 0x00000000], // KeyP + [0x00000071, 0x00000051, 0x00000000, 0x00000000], // KeyQ + [0x00000072, 0x00000052, 0x00000000, 0x00000000], // KeyR + [0x00000073, 0x00000053, 0x00000000, 0x00000000], // KeyS + [0x00000074, 0x00000054, 0x00000000, 0x00000000], // KeyT + [0x00000075, 0x00000055, 0x00000000, 0x00000000], // KeyU + [0x00000076, 0x00000056, 0x00000000, 0x00000000], // KeyV + [0x00000077, 0x00000057, 0x00000000, 0x00000000], // KeyW + [0x00000078, 0x00000058, 0x00000000, 0x00000000], // KeyX + [0x00000079, 0x00000059, 0x00000000, 0x00000000], // KeyY + [0x0000007a, 0x0000005a, 0x00000000, 0x00000000], // KeyZ + [0x00000031, 0x00000021, 0x00000000, 0x00000000], // Digit1 + [0x00000032, 0x00000022, 0x00000040, 0x00000000], // Digit2 + [0x00000033, 0x00000023, 0x000000a3, 0x00000000], // Digit3 + [0x00000034, 0x000000a4, 0x00000024, 0x00000000], // Digit4 + [0x00000035, 0x00000025, 0x000020ac, 0x00000000], // Digit5 + [0x00000036, 0x00000026, 0x00000000, 0x00000000], // Digit6 + [0x00000037, 0x0000002f, 0x0000007b, 0x00000000], // Digit7 + [0x00000038, 0x00000028, 0x0000005b, 0x00000000], // Digit8 + [0x00000039, 0x00000029, 0x0000005d, 0x00000000], // Digit9 + [0x00000030, 0x0000003d, 0x0000007d, 0x00000000], // Digit0 + [0x0000002b, 0x0000003f, 0x00000000, 0x00000000], // Minus + [0x0000005c, 0x00000060, 0x000000b4, 0x00000000], // Equal + [0x000000e5, 0x000000c5, 0x00000000, 0x00000000], // BracketLeft + [0x000000a8, 0x0000005e, 0x0000007e, 0x00000000], // BracketRight + [0x00000027, 0x0000002a, 0x00000000, 0x00000000], // Backslash + [0x000000f8, 0x000000d8, 0x00000000, 0x00000000], // Semicolon + [0x000000e6, 0x000000c6, 0x00000000, 0x00000000], // Quote + [0x0000007c, 0x000000a7, 0x00000000, 0x00000000], // Backquote + [0x0000002c, 0x0000003b, 0x00000000, 0x00000000], // Comma + [0x0000002e, 0x0000003a, 0x00000000, 0x00000000], // Period + [0x0000002d, 0x0000005f, 0x00000000, 0x00000000], // Slash + ], + ), + + LayoutInfo( + name: 'pl', + platform: LayoutPlatform.win, + mapping: >[ + [0x00000061, 0x00000041, 0x00000105, 0x00000104], // KeyA + [0x00000062, 0x00000042, 0x00000000, 0x00000000], // KeyB + [0x00000063, 0x00000043, 0x00000107, 0x00000106], // KeyC + [0x00000064, 0x00000044, 0x00000000, 0x00000000], // KeyD + [0x00000065, 0x00000045, 0x00000119, 0x00000118], // KeyE + [0x00000066, 0x00000046, 0x00000000, 0x00000000], // KeyF + [0x00000067, 0x00000047, 0x00000000, 0x00000000], // KeyG + [0x00000068, 0x00000048, 0x00000000, 0x00000000], // KeyH + [0x00000069, 0x00000049, 0x00000000, 0x00000000], // KeyI + [0x0000006a, 0x0000004a, 0x00000000, 0x00000000], // KeyJ + [0x0000006b, 0x0000004b, 0x00000000, 0x00000000], // KeyK + [0x0000006c, 0x0000004c, 0x00000142, 0x00000141], // KeyL + [0x0000006d, 0x0000004d, 0x00000000, 0x00000000], // KeyM + [0x0000006e, 0x0000004e, 0x00000144, 0x00000143], // KeyN + [0x0000006f, 0x0000004f, 0x000000f3, 0x000000d3], // KeyO + [0x00000070, 0x00000050, 0x00000000, 0x00000000], // KeyP + [0x00000071, 0x00000051, 0x00000000, 0x00000000], // KeyQ + [0x00000072, 0x00000052, 0x00000000, 0x00000000], // KeyR + [0x00000073, 0x00000053, 0x0000015b, 0x0000015a], // KeyS + [0x00000074, 0x00000054, 0x00000000, 0x00000000], // KeyT + [0x00000075, 0x00000055, 0x000020ac, 0x00000000], // KeyU + [0x00000076, 0x00000056, 0x00000000, 0x00000000], // KeyV + [0x00000077, 0x00000057, 0x00000000, 0x00000000], // KeyW + [0x00000078, 0x00000058, 0x0000017a, 0x00000179], // KeyX + [0x00000079, 0x00000059, 0x00000000, 0x00000000], // KeyY + [0x0000007a, 0x0000005a, 0x0000017c, 0x0000017b], // KeyZ + [0x00000031, 0x00000021, 0x00000000, 0x00000000], // Digit1 + [0x00000032, 0x00000040, 0x00000000, 0x00000000], // Digit2 + [0x00000033, 0x00000023, 0x00000000, 0x00000000], // Digit3 + [0x00000034, 0x00000024, 0x00000000, 0x00000000], // Digit4 + [0x00000035, 0x00000025, 0x00000000, 0x00000000], // Digit5 + [0x00000036, 0x0000005e, 0x00000000, 0x00000000], // Digit6 + [0x00000037, 0x00000026, 0x00000000, 0x00000000], // Digit7 + [0x00000038, 0x0000002a, 0x00000000, 0x00000000], // Digit8 + [0x00000039, 0x00000028, 0x00000000, 0x00000000], // Digit9 + [0x00000030, 0x00000029, 0x00000000, 0x00000000], // Digit0 + [0x0000002d, 0x0000005f, 0x00000000, 0x00000000], // Minus + [0x0000003d, 0x0000002b, 0x00000000, 0x00000000], // Equal + [0x0000005b, 0x0000007b, 0x00000000, 0x00000000], // BracketLeft + [0x0000005d, 0x0000007d, 0x00000000, 0x00000000], // BracketRight + [0x0000005c, 0x0000007c, 0x00000000, 0x00000000], // Backslash + [0x0000003b, 0x0000003a, 0x00000000, 0x00000000], // Semicolon + [0x00000027, 0x00000022, 0x00000000, 0x00000000], // Quote + [0x00000060, 0x0000007e, 0x00000000, 0x00000000], // Backquote + [0x0000002c, 0x0000003c, 0x00000000, 0x00000000], // Comma + [0x0000002e, 0x0000003e, 0x00000000, 0x00000000], // Period + [0x0000002f, 0x0000003f, 0x00000000, 0x00000000], // Slash ], ), @@ -1752,7 +1806,7 @@ const List kLayouts = [ [0x00000066, 0x00000046, 0x00000144, 0x0000017e], // KeyF [0x00000067, 0x00000047, 0x000000a9, 0x0000016a], // KeyG [0x00000068, 0x00000048, 0x00000137, 0x000000d3], // KeyH - [0x00000069, 0x00000049, 0x01000000, 0x00000165], // KeyI + [0x00000069, 0x00000049, 0x0000005e, 0x00000165], // KeyI [0x0000006a, 0x0000004a, 0x00002206, 0x000000d4], // KeyJ [0x0000006b, 0x0000004b, 0x0000017b, 0x0000016b], // KeyK [0x0000006c, 0x0000004c, 0x00000142, 0x00000141], // KeyL @@ -1764,7 +1818,7 @@ const List kLayouts = [ [0x00000072, 0x00000052, 0x000000ae, 0x000000a3], // KeyR [0x00000073, 0x00000053, 0x0000015b, 0x0000015a], // KeyS [0x00000074, 0x00000054, 0x00002020, 0x0000015b], // KeyT - [0x00000075, 0x00000055, 0x01000000, 0x00000164], // KeyU + [0x00000075, 0x00000055, 0x000000a8, 0x00000164], // KeyU [0x00000076, 0x00000056, 0x0000221a, 0x000025ca], // KeyV [0x00000077, 0x00000057, 0x00002211, 0x0000201e], // KeyW [0x00000078, 0x00000058, 0x0000017a, 0x00000179], // KeyX @@ -1787,7 +1841,7 @@ const List kLayouts = [ [0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb], // Backslash [0x0000003b, 0x0000003a, 0x00002026, 0x000000da], // Semicolon [0x00000027, 0x00000022, 0x0000013a, 0x00000123], // Quote - [0x00000060, 0x0000007e, 0x01000000, 0x00000154], // Backquote + [0x00000060, 0x0000007e, 0x00000060, 0x00000154], // Backquote [0x0000002c, 0x0000003c, 0x00002264, 0x000000dd], // Comma [0x0000002e, 0x0000003e, 0x00002265, 0x000000fd], // Period [0x0000002f, 0x0000003f, 0x000000f7, 0x00000146], // Slash @@ -1795,110 +1849,56 @@ const List kLayouts = [ ), LayoutInfo( - name: 'pl', - platform: LayoutPlatform.win, - mapping: >[ - [0x00000061, 0x00000041, 0x00000105, 0x00000104], // KeyA - [0x00000062, 0x00000042, 0x01000000, 0x01000000], // KeyB - [0x00000063, 0x00000043, 0x00000107, 0x00000106], // KeyC - [0x00000064, 0x00000044, 0x01000000, 0x01000000], // KeyD - [0x00000065, 0x00000045, 0x00000119, 0x00000118], // KeyE - [0x00000066, 0x00000046, 0x01000000, 0x01000000], // KeyF - [0x00000067, 0x00000047, 0x01000000, 0x01000000], // KeyG - [0x00000068, 0x00000048, 0x01000000, 0x01000000], // KeyH - [0x00000069, 0x00000049, 0x01000000, 0x01000000], // KeyI - [0x0000006a, 0x0000004a, 0x01000000, 0x01000000], // KeyJ - [0x0000006b, 0x0000004b, 0x01000000, 0x01000000], // KeyK - [0x0000006c, 0x0000004c, 0x00000142, 0x00000141], // KeyL - [0x0000006d, 0x0000004d, 0x01000000, 0x01000000], // KeyM - [0x0000006e, 0x0000004e, 0x00000144, 0x00000143], // KeyN - [0x0000006f, 0x0000004f, 0x000000f3, 0x000000d3], // KeyO - [0x00000070, 0x00000050, 0x01000000, 0x01000000], // KeyP - [0x00000071, 0x00000051, 0x01000000, 0x01000000], // KeyQ - [0x00000072, 0x00000052, 0x01000000, 0x01000000], // KeyR - [0x00000073, 0x00000053, 0x0000015b, 0x0000015a], // KeyS - [0x00000074, 0x00000054, 0x01000000, 0x01000000], // KeyT - [0x00000075, 0x00000055, 0x000020ac, 0x01000000], // KeyU - [0x00000076, 0x00000056, 0x01000000, 0x01000000], // KeyV - [0x00000077, 0x00000057, 0x01000000, 0x01000000], // KeyW - [0x00000078, 0x00000058, 0x0000017a, 0x00000179], // KeyX - [0x00000079, 0x00000059, 0x01000000, 0x01000000], // KeyY - [0x0000007a, 0x0000005a, 0x0000017c, 0x0000017b], // KeyZ - [0x00000031, 0x00000021, 0x01000000, 0x01000000], // Digit1 - [0x00000032, 0x00000040, 0x01000000, 0x01000000], // Digit2 - [0x00000033, 0x00000023, 0x01000000, 0x01000000], // Digit3 - [0x00000034, 0x00000024, 0x01000000, 0x01000000], // Digit4 - [0x00000035, 0x00000025, 0x01000000, 0x01000000], // Digit5 - [0x00000036, 0x0000005e, 0x01000000, 0x01000000], // Digit6 - [0x00000037, 0x00000026, 0x01000000, 0x01000000], // Digit7 - [0x00000038, 0x0000002a, 0x01000000, 0x01000000], // Digit8 - [0x00000039, 0x00000028, 0x01000000, 0x01000000], // Digit9 - [0x00000030, 0x00000029, 0x01000000, 0x01000000], // Digit0 - [0x0000002d, 0x0000005f, 0x01000000, 0x01000000], // Minus - [0x0000003d, 0x0000002b, 0x01000000, 0x01000000], // Equal - [0x0000005b, 0x0000007b, 0x01000000, 0x01000000], // BracketLeft - [0x0000005d, 0x0000007d, 0x01000000, 0x01000000], // BracketRight - [0x0000005c, 0x0000007c, 0x01000000, 0x01000000], // Backslash - [0x0000003b, 0x0000003a, 0x01000000, 0x01000000], // Semicolon - [0x00000027, 0x00000022, 0x01000000, 0x01000000], // Quote - [0x00000060, 0x0000007e, 0x01000000, 0x01000000], // Backquote - [0x0000002c, 0x0000003c, 0x01000000, 0x01000000], // Comma - [0x0000002e, 0x0000003e, 0x01000000, 0x01000000], // Period - [0x0000002f, 0x0000003f, 0x01000000, 0x01000000], // Slash - ], - ), - - LayoutInfo( - name: 'pt-br', + name: 'pt', platform: LayoutPlatform.win, mapping: >[ - [0x00000061, 0x00000041, 0x01000000, 0x01000000], // KeyA - [0x00000062, 0x00000042, 0x01000000, 0x01000000], // KeyB - [0x00000063, 0x00000043, 0x000020a2, 0x01000000], // KeyC - [0x00000064, 0x00000044, 0x01000000, 0x01000000], // KeyD - [0x00000065, 0x00000045, 0x000000b0, 0x01000000], // KeyE - [0x00000066, 0x00000046, 0x01000000, 0x01000000], // KeyF - [0x00000067, 0x00000047, 0x01000000, 0x01000000], // KeyG - [0x00000068, 0x00000048, 0x01000000, 0x01000000], // KeyH - [0x00000069, 0x00000049, 0x01000000, 0x01000000], // KeyI - [0x0000006a, 0x0000004a, 0x01000000, 0x01000000], // KeyJ - [0x0000006b, 0x0000004b, 0x01000000, 0x01000000], // KeyK - [0x0000006c, 0x0000004c, 0x01000000, 0x01000000], // KeyL - [0x0000006d, 0x0000004d, 0x01000000, 0x01000000], // KeyM - [0x0000006e, 0x0000004e, 0x01000000, 0x01000000], // KeyN - [0x0000006f, 0x0000004f, 0x01000000, 0x01000000], // KeyO - [0x00000070, 0x00000050, 0x01000000, 0x01000000], // KeyP - [0x00000071, 0x00000051, 0x0000002f, 0x01000000], // KeyQ - [0x00000072, 0x00000052, 0x01000000, 0x01000000], // KeyR - [0x00000073, 0x00000053, 0x01000000, 0x01000000], // KeyS - [0x00000074, 0x00000054, 0x01000000, 0x01000000], // KeyT - [0x00000075, 0x00000055, 0x01000000, 0x01000000], // KeyU - [0x00000076, 0x00000056, 0x01000000, 0x01000000], // KeyV - [0x00000077, 0x00000057, 0x0000003f, 0x01000000], // KeyW - [0x00000078, 0x00000058, 0x01000000, 0x01000000], // KeyX - [0x00000079, 0x00000059, 0x01000000, 0x01000000], // KeyY - [0x0000007a, 0x0000005a, 0x01000000, 0x01000000], // KeyZ - [0x00000031, 0x00000021, 0x000000b9, 0x01000000], // Digit1 - [0x00000032, 0x00000040, 0x000000b2, 0x01000000], // Digit2 - [0x00000033, 0x00000023, 0x000000b3, 0x01000000], // Digit3 - [0x00000034, 0x00000024, 0x000000a3, 0x01000000], // Digit4 - [0x00000035, 0x00000025, 0x000000a2, 0x01000000], // Digit5 - [0x00000036, 0x000000a8, 0x000000ac, 0x01000000], // Digit6 - [0x00000037, 0x00000026, 0x01000000, 0x01000000], // Digit7 - [0x00000038, 0x0000002a, 0x01000000, 0x01000000], // Digit8 - [0x00000039, 0x00000028, 0x01000000, 0x01000000], // Digit9 - [0x00000030, 0x00000029, 0x01000000, 0x01000000], // Digit0 - [0x0000002d, 0x0000005f, 0x01000000, 0x01000000], // Minus - [0x0000003d, 0x0000002b, 0x000000a7, 0x01000000], // Equal - [0x000000b4, 0x00000060, 0x01000000, 0x01000000], // BracketLeft - [0x0000005b, 0x0000007b, 0x000000aa, 0x01000000], // BracketRight - [0x0000005d, 0x0000007d, 0x000000ba, 0x01000000], // Backslash - [0x000000e7, 0x000000c7, 0x01000000, 0x01000000], // Semicolon - [0x0000007e, 0x0000005e, 0x01000000, 0x01000000], // Quote - [0x00000027, 0x00000022, 0x01000000, 0x01000000], // Backquote - [0x0000002c, 0x0000003c, 0x01000000, 0x01000000], // Comma - [0x0000002e, 0x0000003e, 0x01000000, 0x01000000], // Period - [0x0000003b, 0x0000003a, 0x01000000, 0x01000000], // Slash + [0x00000061, 0x00000041, 0x00000000, 0x00000000], // KeyA + [0x00000062, 0x00000042, 0x00000000, 0x00000000], // KeyB + [0x00000063, 0x00000043, 0x00000000, 0x00000000], // KeyC + [0x00000064, 0x00000044, 0x00000000, 0x00000000], // KeyD + [0x00000065, 0x00000045, 0x000020ac, 0x00000000], // KeyE + [0x00000066, 0x00000046, 0x00000000, 0x00000000], // KeyF + [0x00000067, 0x00000047, 0x00000000, 0x00000000], // KeyG + [0x00000068, 0x00000048, 0x00000000, 0x00000000], // KeyH + [0x00000069, 0x00000049, 0x00000000, 0x00000000], // KeyI + [0x0000006a, 0x0000004a, 0x00000000, 0x00000000], // KeyJ + [0x0000006b, 0x0000004b, 0x00000000, 0x00000000], // KeyK + [0x0000006c, 0x0000004c, 0x00000000, 0x00000000], // KeyL + [0x0000006d, 0x0000004d, 0x00000000, 0x00000000], // KeyM + [0x0000006e, 0x0000004e, 0x00000000, 0x00000000], // KeyN + [0x0000006f, 0x0000004f, 0x00000000, 0x00000000], // KeyO + [0x00000070, 0x00000050, 0x00000000, 0x00000000], // KeyP + [0x00000071, 0x00000051, 0x00000000, 0x00000000], // KeyQ + [0x00000072, 0x00000052, 0x00000000, 0x00000000], // KeyR + [0x00000073, 0x00000053, 0x00000000, 0x00000000], // KeyS + [0x00000074, 0x00000054, 0x00000000, 0x00000000], // KeyT + [0x00000075, 0x00000055, 0x00000000, 0x00000000], // KeyU + [0x00000076, 0x00000056, 0x00000000, 0x00000000], // KeyV + [0x00000077, 0x00000057, 0x00000000, 0x00000000], // KeyW + [0x00000078, 0x00000058, 0x00000000, 0x00000000], // KeyX + [0x00000079, 0x00000059, 0x00000000, 0x00000000], // KeyY + [0x0000007a, 0x0000005a, 0x00000000, 0x00000000], // KeyZ + [0x00000031, 0x00000021, 0x00000000, 0x00000000], // Digit1 + [0x00000032, 0x00000022, 0x00000040, 0x00000000], // Digit2 + [0x00000033, 0x00000023, 0x000000a3, 0x00000000], // Digit3 + [0x00000034, 0x00000024, 0x000000a7, 0x00000000], // Digit4 + [0x00000035, 0x00000025, 0x000020ac, 0x00000000], // Digit5 + [0x00000036, 0x00000026, 0x00000000, 0x00000000], // Digit6 + [0x00000037, 0x0000002f, 0x0000007b, 0x00000000], // Digit7 + [0x00000038, 0x00000028, 0x0000005b, 0x00000000], // Digit8 + [0x00000039, 0x00000029, 0x0000005d, 0x00000000], // Digit9 + [0x00000030, 0x0000003d, 0x0000007d, 0x00000000], // Digit0 + [0x00000027, 0x0000003f, 0x00000000, 0x00000000], // Minus + [0x000000ab, 0x000000bb, 0x00000000, 0x00000000], // Equal + [0x0000002b, 0x0000002a, 0x000000a8, 0x00000000], // BracketLeft + [0x000000b4, 0x00000060, 0x0000005d, 0x00000000], // BracketRight + [0x0000007e, 0x0000005e, 0x00000000, 0x00000000], // Backslash + [0x000000e7, 0x000000c7, 0x00000000, 0x00000000], // Semicolon + [0x000000ba, 0x000000aa, 0x00000000, 0x00000000], // Quote + [0x0000005c, 0x0000007c, 0x00000000, 0x00000000], // Backquote + [0x0000002c, 0x0000003b, 0x00000000, 0x00000000], // Comma + [0x0000002e, 0x0000003a, 0x00000000, 0x00000000], // Period + [0x0000002d, 0x0000005f, 0x00000000, 0x00000000], // Slash ], ), @@ -1910,23 +1910,23 @@ const List kLayouts = [ [0x00000062, 0x00000042, 0x0000222b, 0x00000131], // KeyB [0x00000063, 0x00000043, 0x000000e7, 0x000000c7], // KeyC [0x00000064, 0x00000044, 0x00002202, 0x000000ce], // KeyD - [0x00000065, 0x00000045, 0x01000000, 0x000000b4], // KeyE + [0x00000065, 0x00000045, 0x000000b4, 0x000000b4], // KeyE [0x00000066, 0x00000046, 0x00000192, 0x000000cf], // KeyF [0x00000067, 0x00000047, 0x000000a9, 0x000002dd], // KeyG [0x00000068, 0x00000048, 0x000002d9, 0x000000d3], // KeyH - [0x00000069, 0x00000049, 0x01000000, 0x000002c6], // KeyI + [0x00000069, 0x00000049, 0x000002c6, 0x000002c6], // KeyI [0x0000006a, 0x0000004a, 0x00002206, 0x000000d4], // KeyJ [0x0000006b, 0x0000004b, 0x000002da, 0x0000f8ff], // KeyK [0x0000006c, 0x0000004c, 0x000000ac, 0x000000d2], // KeyL [0x0000006d, 0x0000004d, 0x000000b5, 0x000000c2], // KeyM - [0x0000006e, 0x0000004e, 0x01000000, 0x000002dc], // KeyN + [0x0000006e, 0x0000004e, 0x000002dc, 0x000002dc], // KeyN [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO [0x00000070, 0x00000050, 0x000003c0, 0x0000220f], // KeyP [0x00000071, 0x00000051, 0x00000153, 0x00000152], // KeyQ [0x00000072, 0x00000052, 0x000000ae, 0x00002030], // KeyR [0x00000073, 0x00000053, 0x000000df, 0x000000cd], // KeyS [0x00000074, 0x00000054, 0x00002020, 0x000002c7], // KeyT - [0x00000075, 0x00000055, 0x01000000, 0x000000a8], // KeyU + [0x00000075, 0x00000055, 0x000000a8, 0x000000a8], // KeyU [0x00000076, 0x00000056, 0x0000221a, 0x000025ca], // KeyV [0x00000077, 0x00000057, 0x00002211, 0x0000201e], // KeyW [0x00000078, 0x00000058, 0x00002248, 0x000002db], // KeyX @@ -1937,7 +1937,7 @@ const List kLayouts = [ [0x00000033, 0x00000023, 0x000000a3, 0x00002039], // Digit3 [0x00000034, 0x00000024, 0x000000a2, 0x0000203a], // Digit4 [0x00000035, 0x00000025, 0x0000221e, 0x0000fb01], // Digit5 - [0x00000036, 0x01000000, 0x000000a7, 0x0000fb02], // Digit6 + [0x00000036, 0x000002c6, 0x000000a7, 0x0000fb02], // Digit6 [0x00000037, 0x00000026, 0x000000b6, 0x00002021], // Digit7 [0x00000038, 0x0000002a, 0x00002022, 0x000000b0], // Digit8 [0x00000039, 0x00000028, 0x000000aa, 0x000000b7], // Digit9 @@ -1948,8 +1948,8 @@ const List kLayouts = [ [0x0000005d, 0x0000007d, 0x00002018, 0x00002019], // BracketRight [0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb], // Backslash [0x0000003b, 0x0000003a, 0x00002026, 0x000000da], // Semicolon - [0x01000000, 0x01000000, 0x000000e6, 0x000000c6], // Quote - [0x01000000, 0x01000000, 0x01000000, 0x00000060], // Backquote + [0x00000027, 0x00000022, 0x000000e6, 0x000000c6], // Quote + [0x00000060, 0x000002dc, 0x00000060, 0x00000060], // Backquote [0x0000002c, 0x0000003c, 0x00002264, 0x000000af], // Comma [0x0000002e, 0x0000003e, 0x00002265, 0x000002d8], // Period [0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf], // Slash @@ -1957,110 +1957,110 @@ const List kLayouts = [ ), LayoutInfo( - name: 'pt', + name: 'pt-br', platform: LayoutPlatform.win, mapping: >[ - [0x00000061, 0x00000041, 0x01000000, 0x01000000], // KeyA - [0x00000062, 0x00000042, 0x01000000, 0x01000000], // KeyB - [0x00000063, 0x00000043, 0x01000000, 0x01000000], // KeyC - [0x00000064, 0x00000044, 0x01000000, 0x01000000], // KeyD - [0x00000065, 0x00000045, 0x000020ac, 0x01000000], // KeyE - [0x00000066, 0x00000046, 0x01000000, 0x01000000], // KeyF - [0x00000067, 0x00000047, 0x01000000, 0x01000000], // KeyG - [0x00000068, 0x00000048, 0x01000000, 0x01000000], // KeyH - [0x00000069, 0x00000049, 0x01000000, 0x01000000], // KeyI - [0x0000006a, 0x0000004a, 0x01000000, 0x01000000], // KeyJ - [0x0000006b, 0x0000004b, 0x01000000, 0x01000000], // KeyK - [0x0000006c, 0x0000004c, 0x01000000, 0x01000000], // KeyL - [0x0000006d, 0x0000004d, 0x01000000, 0x01000000], // KeyM - [0x0000006e, 0x0000004e, 0x01000000, 0x01000000], // KeyN - [0x0000006f, 0x0000004f, 0x01000000, 0x01000000], // KeyO - [0x00000070, 0x00000050, 0x01000000, 0x01000000], // KeyP - [0x00000071, 0x00000051, 0x01000000, 0x01000000], // KeyQ - [0x00000072, 0x00000052, 0x01000000, 0x01000000], // KeyR - [0x00000073, 0x00000053, 0x01000000, 0x01000000], // KeyS - [0x00000074, 0x00000054, 0x01000000, 0x01000000], // KeyT - [0x00000075, 0x00000055, 0x01000000, 0x01000000], // KeyU - [0x00000076, 0x00000056, 0x01000000, 0x01000000], // KeyV - [0x00000077, 0x00000057, 0x01000000, 0x01000000], // KeyW - [0x00000078, 0x00000058, 0x01000000, 0x01000000], // KeyX - [0x00000079, 0x00000059, 0x01000000, 0x01000000], // KeyY - [0x0000007a, 0x0000005a, 0x01000000, 0x01000000], // KeyZ - [0x00000031, 0x00000021, 0x01000000, 0x01000000], // Digit1 - [0x00000032, 0x00000022, 0x00000040, 0x01000000], // Digit2 - [0x00000033, 0x00000023, 0x000000a3, 0x01000000], // Digit3 - [0x00000034, 0x00000024, 0x000000a7, 0x01000000], // Digit4 - [0x00000035, 0x00000025, 0x000020ac, 0x01000000], // Digit5 - [0x00000036, 0x00000026, 0x01000000, 0x01000000], // Digit6 - [0x00000037, 0x0000002f, 0x0000007b, 0x01000000], // Digit7 - [0x00000038, 0x00000028, 0x0000005b, 0x01000000], // Digit8 - [0x00000039, 0x00000029, 0x0000005d, 0x01000000], // Digit9 - [0x00000030, 0x0000003d, 0x0000007d, 0x01000000], // Digit0 - [0x00000027, 0x0000003f, 0x01000000, 0x01000000], // Minus - [0x000000ab, 0x000000bb, 0x01000000, 0x01000000], // Equal - [0x0000002b, 0x0000002a, 0x000000a8, 0x01000000], // BracketLeft - [0x000000b4, 0x00000060, 0x0000005d, 0x01000000], // BracketRight - [0x0000007e, 0x0000005e, 0x01000000, 0x01000000], // Backslash - [0x000000e7, 0x000000c7, 0x01000000, 0x01000000], // Semicolon - [0x000000ba, 0x000000aa, 0x01000000, 0x01000000], // Quote - [0x0000005c, 0x0000007c, 0x01000000, 0x01000000], // Backquote - [0x0000002c, 0x0000003b, 0x01000000, 0x01000000], // Comma - [0x0000002e, 0x0000003a, 0x01000000, 0x01000000], // Period - [0x0000002d, 0x0000005f, 0x01000000, 0x01000000], // Slash + [0x00000061, 0x00000041, 0x00000000, 0x00000000], // KeyA + [0x00000062, 0x00000042, 0x00000000, 0x00000000], // KeyB + [0x00000063, 0x00000043, 0x000020a2, 0x00000000], // KeyC + [0x00000064, 0x00000044, 0x00000000, 0x00000000], // KeyD + [0x00000065, 0x00000045, 0x000000b0, 0x00000000], // KeyE + [0x00000066, 0x00000046, 0x00000000, 0x00000000], // KeyF + [0x00000067, 0x00000047, 0x00000000, 0x00000000], // KeyG + [0x00000068, 0x00000048, 0x00000000, 0x00000000], // KeyH + [0x00000069, 0x00000049, 0x00000000, 0x00000000], // KeyI + [0x0000006a, 0x0000004a, 0x00000000, 0x00000000], // KeyJ + [0x0000006b, 0x0000004b, 0x00000000, 0x00000000], // KeyK + [0x0000006c, 0x0000004c, 0x00000000, 0x00000000], // KeyL + [0x0000006d, 0x0000004d, 0x00000000, 0x00000000], // KeyM + [0x0000006e, 0x0000004e, 0x00000000, 0x00000000], // KeyN + [0x0000006f, 0x0000004f, 0x00000000, 0x00000000], // KeyO + [0x00000070, 0x00000050, 0x00000000, 0x00000000], // KeyP + [0x00000071, 0x00000051, 0x0000002f, 0x00000000], // KeyQ + [0x00000072, 0x00000052, 0x00000000, 0x00000000], // KeyR + [0x00000073, 0x00000053, 0x00000000, 0x00000000], // KeyS + [0x00000074, 0x00000054, 0x00000000, 0x00000000], // KeyT + [0x00000075, 0x00000055, 0x00000000, 0x00000000], // KeyU + [0x00000076, 0x00000056, 0x00000000, 0x00000000], // KeyV + [0x00000077, 0x00000057, 0x0000003f, 0x00000000], // KeyW + [0x00000078, 0x00000058, 0x00000000, 0x00000000], // KeyX + [0x00000079, 0x00000059, 0x00000000, 0x00000000], // KeyY + [0x0000007a, 0x0000005a, 0x00000000, 0x00000000], // KeyZ + [0x00000031, 0x00000021, 0x000000b9, 0x00000000], // Digit1 + [0x00000032, 0x00000040, 0x000000b2, 0x00000000], // Digit2 + [0x00000033, 0x00000023, 0x000000b3, 0x00000000], // Digit3 + [0x00000034, 0x00000024, 0x000000a3, 0x00000000], // Digit4 + [0x00000035, 0x00000025, 0x000000a2, 0x00000000], // Digit5 + [0x00000036, 0x000000a8, 0x000000ac, 0x00000000], // Digit6 + [0x00000037, 0x00000026, 0x00000000, 0x00000000], // Digit7 + [0x00000038, 0x0000002a, 0x00000000, 0x00000000], // Digit8 + [0x00000039, 0x00000028, 0x00000000, 0x00000000], // Digit9 + [0x00000030, 0x00000029, 0x00000000, 0x00000000], // Digit0 + [0x0000002d, 0x0000005f, 0x00000000, 0x00000000], // Minus + [0x0000003d, 0x0000002b, 0x000000a7, 0x00000000], // Equal + [0x000000b4, 0x00000060, 0x00000000, 0x00000000], // BracketLeft + [0x0000005b, 0x0000007b, 0x000000aa, 0x00000000], // BracketRight + [0x0000005d, 0x0000007d, 0x000000ba, 0x00000000], // Backslash + [0x000000e7, 0x000000c7, 0x00000000, 0x00000000], // Semicolon + [0x0000007e, 0x0000005e, 0x00000000, 0x00000000], // Quote + [0x00000027, 0x00000022, 0x00000000, 0x00000000], // Backquote + [0x0000002c, 0x0000003c, 0x00000000, 0x00000000], // Comma + [0x0000002e, 0x0000003e, 0x00000000, 0x00000000], // Period + [0x0000003b, 0x0000003a, 0x00000000, 0x00000000], // Slash ], ), LayoutInfo( name: 'ru', - platform: LayoutPlatform.darwin, + platform: LayoutPlatform.win, mapping: >[ - [0x00000444, 0x00000424, 0x00000192, 0x00000192], // KeyA - [0x00000438, 0x00000418, 0x00000438, 0x00000418], // KeyB - [0x00000441, 0x00000421, 0x00002260, 0x00002260], // KeyC - [0x00000432, 0x00000412, 0x0000045b, 0x0000040b], // KeyD - [0x00000443, 0x00000423, 0x0000045c, 0x0000040c], // KeyE - [0x00000430, 0x00000410, 0x000000f7, 0x000000f7], // KeyF - [0x0000043f, 0x0000041f, 0x000000a9, 0x000000a9], // KeyG - [0x00000440, 0x00000420, 0x000020bd, 0x000020bd], // KeyH - [0x00000448, 0x00000428, 0x00000455, 0x00000405], // KeyI - [0x0000043e, 0x0000041e, 0x000000b0, 0x00002022], // KeyJ - [0x0000043b, 0x0000041b, 0x00000459, 0x00000409], // KeyK - [0x00000434, 0x00000414, 0x00002206, 0x00002206], // KeyL - [0x0000044c, 0x0000042c, 0x0000007e, 0x0000007e], // KeyM - [0x00000442, 0x00000422, 0x00002122, 0x00002122], // KeyN - [0x00000449, 0x00000429, 0x0000045e, 0x0000040e], // KeyO - [0x00000437, 0x00000417, 0x00002018, 0x00002019], // KeyP - [0x00000439, 0x00000419, 0x00000458, 0x00000408], // KeyQ - [0x0000043a, 0x0000041a, 0x000000ae, 0x000000ae], // KeyR - [0x0000044b, 0x0000042b, 0x0000044b, 0x0000042b], // KeyS - [0x00000435, 0x00000415, 0x00002020, 0x00002020], // KeyT - [0x00000433, 0x00000413, 0x00000453, 0x00000403], // KeyU - [0x0000043c, 0x0000041c, 0x000000b5, 0x000000b5], // KeyV - [0x00000446, 0x00000426, 0x0000045f, 0x0000040f], // KeyW - [0x00000447, 0x00000427, 0x00002248, 0x00002248], // KeyX - [0x0000043d, 0x0000041d, 0x0000045a, 0x0000040a], // KeyY - [0x0000044f, 0x0000042f, 0x00000452, 0x00000402], // KeyZ - [0x00000031, 0x00000021, 0x00000021, 0x0000007c], // Digit1 - [0x00000032, 0x00000022, 0x00000040, 0x00000022], // Digit2 - [0x00000033, 0x00002116, 0x00000023, 0x000000a3], // Digit3 - [0x00000034, 0x00000025, 0x00000024, 0x000020ac], // Digit4 - [0x00000035, 0x0000003a, 0x00000025, 0x0000221e], // Digit5 - [0x00000036, 0x0000002c, 0x0000005e, 0x000000ac], // Digit6 - [0x00000037, 0x0000002e, 0x00000026, 0x000000b6], // Digit7 - [0x00000038, 0x0000003b, 0x0000002a, 0x0000221a], // Digit8 - [0x00000039, 0x00000028, 0x0000007b, 0x00000027], // Digit9 - [0x00000030, 0x00000029, 0x0000007d, 0x00000060], // Digit0 - [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Minus - [0x0000003d, 0x0000002b, 0x000000bb, 0x000000ab], // Equal - [0x00000445, 0x00000425, 0x0000201c, 0x0000201d], // BracketLeft - [0x0000044a, 0x0000042a, 0x0000044a, 0x0000042a], // BracketRight - [0x00000451, 0x00000401, 0x00000451, 0x00000401], // Backslash - [0x00000436, 0x00000416, 0x00002026, 0x00002026], // Semicolon - [0x0000044d, 0x0000042d, 0x0000044d, 0x0000042d], // Quote - [0x0000005d, 0x0000005b, 0x0000005d, 0x0000005b], // Backquote - [0x00000431, 0x00000411, 0x00002264, 0x0000003c], // Comma - [0x0000044e, 0x0000042e, 0x00002265, 0x0000003e], // Period - [0x0000002f, 0x0000003f, 0x0000201c, 0x0000201e], // Slash + [0x00000444, 0x00000424, 0x00000000, 0x00000000], // KeyA + [0x00000438, 0x00000418, 0x00000000, 0x00000000], // KeyB + [0x00000441, 0x00000421, 0x00000000, 0x00000000], // KeyC + [0x00000432, 0x00000412, 0x00000000, 0x00000000], // KeyD + [0x00000443, 0x00000423, 0x00000000, 0x00000000], // KeyE + [0x00000430, 0x00000410, 0x00000000, 0x00000000], // KeyF + [0x0000043f, 0x0000041f, 0x00000000, 0x00000000], // KeyG + [0x00000440, 0x00000420, 0x00000000, 0x00000000], // KeyH + [0x00000448, 0x00000428, 0x00000000, 0x00000000], // KeyI + [0x0000043e, 0x0000041e, 0x00000000, 0x00000000], // KeyJ + [0x0000043b, 0x0000041b, 0x00000000, 0x00000000], // KeyK + [0x00000434, 0x00000414, 0x00000000, 0x00000000], // KeyL + [0x0000044c, 0x0000042c, 0x00000000, 0x00000000], // KeyM + [0x00000442, 0x00000422, 0x00000000, 0x00000000], // KeyN + [0x00000449, 0x00000429, 0x00000000, 0x00000000], // KeyO + [0x00000437, 0x00000417, 0x00000000, 0x00000000], // KeyP + [0x00000439, 0x00000419, 0x00000000, 0x00000000], // KeyQ + [0x0000043a, 0x0000041a, 0x00000000, 0x00000000], // KeyR + [0x0000044b, 0x0000042b, 0x00000000, 0x00000000], // KeyS + [0x00000435, 0x00000415, 0x00000000, 0x00000000], // KeyT + [0x00000433, 0x00000413, 0x00000000, 0x00000000], // KeyU + [0x0000043c, 0x0000041c, 0x00000000, 0x00000000], // KeyV + [0x00000446, 0x00000426, 0x00000000, 0x00000000], // KeyW + [0x00000447, 0x00000427, 0x00000000, 0x00000000], // KeyX + [0x0000043d, 0x0000041d, 0x00000000, 0x00000000], // KeyY + [0x0000044f, 0x0000042f, 0x00000000, 0x00000000], // KeyZ + [0x00000031, 0x00000021, 0x00000000, 0x00000000], // Digit1 + [0x00000032, 0x00000022, 0x00000000, 0x00000000], // Digit2 + [0x00000033, 0x00002116, 0x00000000, 0x00000000], // Digit3 + [0x00000034, 0x0000003b, 0x00000000, 0x00000000], // Digit4 + [0x00000035, 0x00000025, 0x00000000, 0x00000000], // Digit5 + [0x00000036, 0x0000003a, 0x00000000, 0x00000000], // Digit6 + [0x00000037, 0x0000003f, 0x00000000, 0x00000000], // Digit7 + [0x00000038, 0x0000002a, 0x000020bd, 0x00000000], // Digit8 + [0x00000039, 0x00000028, 0x00000000, 0x00000000], // Digit9 + [0x00000030, 0x00000029, 0x00000000, 0x00000000], // Digit0 + [0x0000002d, 0x0000005f, 0x00000000, 0x00000000], // Minus + [0x0000003d, 0x0000002b, 0x00000000, 0x00000000], // Equal + [0x00000445, 0x00000425, 0x00000000, 0x00000000], // BracketLeft + [0x0000044a, 0x0000042a, 0x00000000, 0x00000000], // BracketRight + [0x0000005c, 0x0000002f, 0x00000000, 0x00000000], // Backslash + [0x00000436, 0x00000416, 0x00000000, 0x00000000], // Semicolon + [0x0000044d, 0x0000042d, 0x00000000, 0x00000000], // Quote + [0x00000451, 0x00000401, 0x00000000, 0x00000000], // Backquote + [0x00000431, 0x00000411, 0x00000000, 0x00000000], // Comma + [0x0000044e, 0x0000042e, 0x00000000, 0x00000000], // Period + [0x0000002e, 0x0000002c, 0x00000000, 0x00000000], // Slash ], ), @@ -2101,7 +2101,7 @@ const List kLayouts = [ [0x00000035, 0x00000025, 0x00000035, 0x00000025], // Digit5 [0x00000036, 0x0000003a, 0x00000036, 0x0000003a], // Digit6 [0x00000037, 0x0000003f, 0x00000037, 0x0000003f], // Digit7 - [0x00000038, 0x0000002a, 0x000020bd, 0x01000000], // Digit8 + [0x00000038, 0x0000002a, 0x000020bd, 0x00000000], // Digit8 [0x00000039, 0x00000028, 0x00000039, 0x00000028], // Digit9 [0x00000030, 0x00000029, 0x00000030, 0x00000029], // Digit0 [0x0000002d, 0x0000005f, 0x0000002d, 0x0000005f], // Minus @@ -2120,55 +2120,109 @@ const List kLayouts = [ LayoutInfo( name: 'ru', + platform: LayoutPlatform.darwin, + mapping: >[ + [0x00000444, 0x00000424, 0x00000192, 0x00000192], // KeyA + [0x00000438, 0x00000418, 0x00000438, 0x00000418], // KeyB + [0x00000441, 0x00000421, 0x00002260, 0x00002260], // KeyC + [0x00000432, 0x00000412, 0x0000045b, 0x0000040b], // KeyD + [0x00000443, 0x00000423, 0x0000045c, 0x0000040c], // KeyE + [0x00000430, 0x00000410, 0x000000f7, 0x000000f7], // KeyF + [0x0000043f, 0x0000041f, 0x000000a9, 0x000000a9], // KeyG + [0x00000440, 0x00000420, 0x000020bd, 0x000020bd], // KeyH + [0x00000448, 0x00000428, 0x00000455, 0x00000405], // KeyI + [0x0000043e, 0x0000041e, 0x000000b0, 0x00002022], // KeyJ + [0x0000043b, 0x0000041b, 0x00000459, 0x00000409], // KeyK + [0x00000434, 0x00000414, 0x00002206, 0x00002206], // KeyL + [0x0000044c, 0x0000042c, 0x0000007e, 0x0000007e], // KeyM + [0x00000442, 0x00000422, 0x00002122, 0x00002122], // KeyN + [0x00000449, 0x00000429, 0x0000045e, 0x0000040e], // KeyO + [0x00000437, 0x00000417, 0x00002018, 0x00002019], // KeyP + [0x00000439, 0x00000419, 0x00000458, 0x00000408], // KeyQ + [0x0000043a, 0x0000041a, 0x000000ae, 0x000000ae], // KeyR + [0x0000044b, 0x0000042b, 0x0000044b, 0x0000042b], // KeyS + [0x00000435, 0x00000415, 0x00002020, 0x00002020], // KeyT + [0x00000433, 0x00000413, 0x00000453, 0x00000403], // KeyU + [0x0000043c, 0x0000041c, 0x000000b5, 0x000000b5], // KeyV + [0x00000446, 0x00000426, 0x0000045f, 0x0000040f], // KeyW + [0x00000447, 0x00000427, 0x00002248, 0x00002248], // KeyX + [0x0000043d, 0x0000041d, 0x0000045a, 0x0000040a], // KeyY + [0x0000044f, 0x0000042f, 0x00000452, 0x00000402], // KeyZ + [0x00000031, 0x00000021, 0x00000021, 0x0000007c], // Digit1 + [0x00000032, 0x00000022, 0x00000040, 0x00000022], // Digit2 + [0x00000033, 0x00002116, 0x00000023, 0x000000a3], // Digit3 + [0x00000034, 0x00000025, 0x00000024, 0x000020ac], // Digit4 + [0x00000035, 0x0000003a, 0x00000025, 0x0000221e], // Digit5 + [0x00000036, 0x0000002c, 0x0000005e, 0x000000ac], // Digit6 + [0x00000037, 0x0000002e, 0x00000026, 0x000000b6], // Digit7 + [0x00000038, 0x0000003b, 0x0000002a, 0x0000221a], // Digit8 + [0x00000039, 0x00000028, 0x0000007b, 0x00000027], // Digit9 + [0x00000030, 0x00000029, 0x0000007d, 0x00000060], // Digit0 + [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Minus + [0x0000003d, 0x0000002b, 0x000000bb, 0x000000ab], // Equal + [0x00000445, 0x00000425, 0x0000201c, 0x0000201d], // BracketLeft + [0x0000044a, 0x0000042a, 0x0000044a, 0x0000042a], // BracketRight + [0x00000451, 0x00000401, 0x00000451, 0x00000401], // Backslash + [0x00000436, 0x00000416, 0x00002026, 0x00002026], // Semicolon + [0x0000044d, 0x0000042d, 0x0000044d, 0x0000042d], // Quote + [0x0000005d, 0x0000005b, 0x0000005d, 0x0000005b], // Backquote + [0x00000431, 0x00000411, 0x00002264, 0x0000003c], // Comma + [0x0000044e, 0x0000042e, 0x00002265, 0x0000003e], // Period + [0x0000002f, 0x0000003f, 0x0000201c, 0x0000201e], // Slash + ], + ), + + LayoutInfo( + name: 'sv', platform: LayoutPlatform.win, mapping: >[ - [0x00000444, 0x00000424, 0x01000000, 0x01000000], // KeyA - [0x00000438, 0x00000418, 0x01000000, 0x01000000], // KeyB - [0x00000441, 0x00000421, 0x01000000, 0x01000000], // KeyC - [0x00000432, 0x00000412, 0x01000000, 0x01000000], // KeyD - [0x00000443, 0x00000423, 0x01000000, 0x01000000], // KeyE - [0x00000430, 0x00000410, 0x01000000, 0x01000000], // KeyF - [0x0000043f, 0x0000041f, 0x01000000, 0x01000000], // KeyG - [0x00000440, 0x00000420, 0x01000000, 0x01000000], // KeyH - [0x00000448, 0x00000428, 0x01000000, 0x01000000], // KeyI - [0x0000043e, 0x0000041e, 0x01000000, 0x01000000], // KeyJ - [0x0000043b, 0x0000041b, 0x01000000, 0x01000000], // KeyK - [0x00000434, 0x00000414, 0x01000000, 0x01000000], // KeyL - [0x0000044c, 0x0000042c, 0x01000000, 0x01000000], // KeyM - [0x00000442, 0x00000422, 0x01000000, 0x01000000], // KeyN - [0x00000449, 0x00000429, 0x01000000, 0x01000000], // KeyO - [0x00000437, 0x00000417, 0x01000000, 0x01000000], // KeyP - [0x00000439, 0x00000419, 0x01000000, 0x01000000], // KeyQ - [0x0000043a, 0x0000041a, 0x01000000, 0x01000000], // KeyR - [0x0000044b, 0x0000042b, 0x01000000, 0x01000000], // KeyS - [0x00000435, 0x00000415, 0x01000000, 0x01000000], // KeyT - [0x00000433, 0x00000413, 0x01000000, 0x01000000], // KeyU - [0x0000043c, 0x0000041c, 0x01000000, 0x01000000], // KeyV - [0x00000446, 0x00000426, 0x01000000, 0x01000000], // KeyW - [0x00000447, 0x00000427, 0x01000000, 0x01000000], // KeyX - [0x0000043d, 0x0000041d, 0x01000000, 0x01000000], // KeyY - [0x0000044f, 0x0000042f, 0x01000000, 0x01000000], // KeyZ - [0x00000031, 0x00000021, 0x01000000, 0x01000000], // Digit1 - [0x00000032, 0x00000022, 0x01000000, 0x01000000], // Digit2 - [0x00000033, 0x00002116, 0x01000000, 0x01000000], // Digit3 - [0x00000034, 0x0000003b, 0x01000000, 0x01000000], // Digit4 - [0x00000035, 0x00000025, 0x01000000, 0x01000000], // Digit5 - [0x00000036, 0x0000003a, 0x01000000, 0x01000000], // Digit6 - [0x00000037, 0x0000003f, 0x01000000, 0x01000000], // Digit7 - [0x00000038, 0x0000002a, 0x000020bd, 0x01000000], // Digit8 - [0x00000039, 0x00000028, 0x01000000, 0x01000000], // Digit9 - [0x00000030, 0x00000029, 0x01000000, 0x01000000], // Digit0 - [0x0000002d, 0x0000005f, 0x01000000, 0x01000000], // Minus - [0x0000003d, 0x0000002b, 0x01000000, 0x01000000], // Equal - [0x00000445, 0x00000425, 0x01000000, 0x01000000], // BracketLeft - [0x0000044a, 0x0000042a, 0x01000000, 0x01000000], // BracketRight - [0x0000005c, 0x0000002f, 0x01000000, 0x01000000], // Backslash - [0x00000436, 0x00000416, 0x01000000, 0x01000000], // Semicolon - [0x0000044d, 0x0000042d, 0x01000000, 0x01000000], // Quote - [0x00000451, 0x00000401, 0x01000000, 0x01000000], // Backquote - [0x00000431, 0x00000411, 0x01000000, 0x01000000], // Comma - [0x0000044e, 0x0000042e, 0x01000000, 0x01000000], // Period - [0x0000002e, 0x0000002c, 0x01000000, 0x01000000], // Slash + [0x00000061, 0x00000041, 0x00000000, 0x00000000], // KeyA + [0x00000062, 0x00000042, 0x00000000, 0x00000000], // KeyB + [0x00000063, 0x00000043, 0x00000000, 0x00000000], // KeyC + [0x00000064, 0x00000044, 0x00000000, 0x00000000], // KeyD + [0x00000065, 0x00000045, 0x000020ac, 0x00000000], // KeyE + [0x00000066, 0x00000046, 0x00000000, 0x00000000], // KeyF + [0x00000067, 0x00000047, 0x00000000, 0x00000000], // KeyG + [0x00000068, 0x00000048, 0x00000000, 0x00000000], // KeyH + [0x00000069, 0x00000049, 0x00000000, 0x00000000], // KeyI + [0x0000006a, 0x0000004a, 0x00000000, 0x00000000], // KeyJ + [0x0000006b, 0x0000004b, 0x00000000, 0x00000000], // KeyK + [0x0000006c, 0x0000004c, 0x00000000, 0x00000000], // KeyL + [0x0000006d, 0x0000004d, 0x000000b5, 0x00000000], // KeyM + [0x0000006e, 0x0000004e, 0x00000000, 0x00000000], // KeyN + [0x0000006f, 0x0000004f, 0x00000000, 0x00000000], // KeyO + [0x00000070, 0x00000050, 0x00000000, 0x00000000], // KeyP + [0x00000071, 0x00000051, 0x00000000, 0x00000000], // KeyQ + [0x00000072, 0x00000052, 0x00000000, 0x00000000], // KeyR + [0x00000073, 0x00000053, 0x00000000, 0x00000000], // KeyS + [0x00000074, 0x00000054, 0x00000000, 0x00000000], // KeyT + [0x00000075, 0x00000055, 0x00000000, 0x00000000], // KeyU + [0x00000076, 0x00000056, 0x00000000, 0x00000000], // KeyV + [0x00000077, 0x00000057, 0x00000000, 0x00000000], // KeyW + [0x00000078, 0x00000058, 0x00000000, 0x00000000], // KeyX + [0x00000079, 0x00000059, 0x00000000, 0x00000000], // KeyY + [0x0000007a, 0x0000005a, 0x00000000, 0x00000000], // KeyZ + [0x00000031, 0x00000021, 0x00000000, 0x00000000], // Digit1 + [0x00000032, 0x00000022, 0x00000040, 0x00000000], // Digit2 + [0x00000033, 0x00000023, 0x000000a3, 0x00000000], // Digit3 + [0x00000034, 0x000000a4, 0x00000024, 0x00000000], // Digit4 + [0x00000035, 0x00000025, 0x000020ac, 0x00000000], // Digit5 + [0x00000036, 0x00000026, 0x00000000, 0x00000000], // Digit6 + [0x00000037, 0x0000002f, 0x0000007b, 0x00000000], // Digit7 + [0x00000038, 0x00000028, 0x0000005b, 0x00000000], // Digit8 + [0x00000039, 0x00000029, 0x0000005d, 0x00000000], // Digit9 + [0x00000030, 0x0000003d, 0x0000007d, 0x00000000], // Digit0 + [0x0000002b, 0x0000003f, 0x0000005c, 0x00000000], // Minus + [0x000000b4, 0x00000060, 0x00000000, 0x00000000], // Equal + [0x000000e5, 0x000000c5, 0x00000000, 0x00000000], // BracketLeft + [0x000000a8, 0x0000005e, 0x0000007e, 0x00000000], // BracketRight + [0x00000027, 0x0000002a, 0x00000000, 0x00000000], // Backslash + [0x000000f6, 0x000000d6, 0x00000000, 0x00000000], // Semicolon + [0x000000e4, 0x000000c4, 0x00000000, 0x00000000], // Quote + [0x000000a7, 0x000000bd, 0x00000000, 0x00000000], // Backquote + [0x0000002c, 0x0000003b, 0x00000000, 0x00000000], // Comma + [0x0000002e, 0x0000003a, 0x00000000, 0x00000000], // Period + [0x0000002d, 0x0000005f, 0x00000000, 0x00000000], // Slash ], ), @@ -2213,9 +2267,9 @@ const List kLayouts = [ [0x00000039, 0x00000029, 0x0000005d, 0x0000007d], // Digit9 [0x00000030, 0x0000003d, 0x00002248, 0x00002260], // Digit0 [0x0000002b, 0x0000003f, 0x000000b1, 0x000000bf], // Minus - [0x01000000, 0x01000000, 0x000000b4, 0x00000060], // Equal + [0x000000b4, 0x00000060, 0x000000b4, 0x00000060], // Equal [0x000000e5, 0x000000c5, 0x000002d9, 0x000002da], // BracketLeft - [0x01000000, 0x01000000, 0x01000000, 0x0000005e], // BracketRight + [0x000000a8, 0x0000005e, 0x0000007e, 0x0000005e], // BracketRight [0x00000027, 0x0000002a, 0x00002122, 0x00002019], // Backslash [0x000000f6, 0x000000d6, 0x000000f8, 0x000000d8], // Semicolon [0x000000e4, 0x000000c4, 0x000000e6, 0x000000c6], // Quote @@ -2226,111 +2280,57 @@ const List kLayouts = [ ], ), - LayoutInfo( - name: 'sv', - platform: LayoutPlatform.win, - mapping: >[ - [0x00000061, 0x00000041, 0x01000000, 0x01000000], // KeyA - [0x00000062, 0x00000042, 0x01000000, 0x01000000], // KeyB - [0x00000063, 0x00000043, 0x01000000, 0x01000000], // KeyC - [0x00000064, 0x00000044, 0x01000000, 0x01000000], // KeyD - [0x00000065, 0x00000045, 0x000020ac, 0x01000000], // KeyE - [0x00000066, 0x00000046, 0x01000000, 0x01000000], // KeyF - [0x00000067, 0x00000047, 0x01000000, 0x01000000], // KeyG - [0x00000068, 0x00000048, 0x01000000, 0x01000000], // KeyH - [0x00000069, 0x00000049, 0x01000000, 0x01000000], // KeyI - [0x0000006a, 0x0000004a, 0x01000000, 0x01000000], // KeyJ - [0x0000006b, 0x0000004b, 0x01000000, 0x01000000], // KeyK - [0x0000006c, 0x0000004c, 0x01000000, 0x01000000], // KeyL - [0x0000006d, 0x0000004d, 0x000000b5, 0x01000000], // KeyM - [0x0000006e, 0x0000004e, 0x01000000, 0x01000000], // KeyN - [0x0000006f, 0x0000004f, 0x01000000, 0x01000000], // KeyO - [0x00000070, 0x00000050, 0x01000000, 0x01000000], // KeyP - [0x00000071, 0x00000051, 0x01000000, 0x01000000], // KeyQ - [0x00000072, 0x00000052, 0x01000000, 0x01000000], // KeyR - [0x00000073, 0x00000053, 0x01000000, 0x01000000], // KeyS - [0x00000074, 0x00000054, 0x01000000, 0x01000000], // KeyT - [0x00000075, 0x00000055, 0x01000000, 0x01000000], // KeyU - [0x00000076, 0x00000056, 0x01000000, 0x01000000], // KeyV - [0x00000077, 0x00000057, 0x01000000, 0x01000000], // KeyW - [0x00000078, 0x00000058, 0x01000000, 0x01000000], // KeyX - [0x00000079, 0x00000059, 0x01000000, 0x01000000], // KeyY - [0x0000007a, 0x0000005a, 0x01000000, 0x01000000], // KeyZ - [0x00000031, 0x00000021, 0x01000000, 0x01000000], // Digit1 - [0x00000032, 0x00000022, 0x00000040, 0x01000000], // Digit2 - [0x00000033, 0x00000023, 0x000000a3, 0x01000000], // Digit3 - [0x00000034, 0x000000a4, 0x00000024, 0x01000000], // Digit4 - [0x00000035, 0x00000025, 0x000020ac, 0x01000000], // Digit5 - [0x00000036, 0x00000026, 0x01000000, 0x01000000], // Digit6 - [0x00000037, 0x0000002f, 0x0000007b, 0x01000000], // Digit7 - [0x00000038, 0x00000028, 0x0000005b, 0x01000000], // Digit8 - [0x00000039, 0x00000029, 0x0000005d, 0x01000000], // Digit9 - [0x00000030, 0x0000003d, 0x0000007d, 0x01000000], // Digit0 - [0x0000002b, 0x0000003f, 0x0000005c, 0x01000000], // Minus - [0x000000b4, 0x00000060, 0x01000000, 0x01000000], // Equal - [0x000000e5, 0x000000c5, 0x01000000, 0x01000000], // BracketLeft - [0x000000a8, 0x0000005e, 0x0000007e, 0x01000000], // BracketRight - [0x00000027, 0x0000002a, 0x01000000, 0x01000000], // Backslash - [0x000000f6, 0x000000d6, 0x01000000, 0x01000000], // Semicolon - [0x000000e4, 0x000000c4, 0x01000000, 0x01000000], // Quote - [0x000000a7, 0x000000bd, 0x01000000, 0x01000000], // Backquote - [0x0000002c, 0x0000003b, 0x01000000, 0x01000000], // Comma - [0x0000002e, 0x0000003a, 0x01000000, 0x01000000], // Period - [0x0000002d, 0x0000005f, 0x01000000, 0x01000000], // Slash - ], - ), - LayoutInfo( name: 'thai', platform: LayoutPlatform.win, mapping: >[ - [0x00000e1f, 0x00000e24, 0x01000000, 0x01000000], // KeyA - [0x00000e34, 0x00000e3a, 0x01000000, 0x01000000], // KeyB - [0x00000e41, 0x00000e09, 0x01000000, 0x01000000], // KeyC - [0x00000e01, 0x00000e0f, 0x01000000, 0x01000000], // KeyD - [0x00000e33, 0x00000e0e, 0x01000000, 0x01000000], // KeyE - [0x00000e14, 0x00000e42, 0x01000000, 0x01000000], // KeyF - [0x00000e40, 0x00000e0c, 0x01000000, 0x01000000], // KeyG - [0x00000e49, 0x00000e47, 0x01000000, 0x01000000], // KeyH - [0x00000e23, 0x00000e13, 0x01000000, 0x01000000], // KeyI - [0x00000e48, 0x00000e4b, 0x01000000, 0x01000000], // KeyJ - [0x00000e32, 0x00000e29, 0x01000000, 0x01000000], // KeyK - [0x00000e2a, 0x00000e28, 0x01000000, 0x01000000], // KeyL - [0x00000e17, 0x0000003f, 0x01000000, 0x01000000], // KeyM - [0x00000e37, 0x00000e4c, 0x01000000, 0x01000000], // KeyN - [0x00000e19, 0x00000e2f, 0x01000000, 0x01000000], // KeyO - [0x00000e22, 0x00000e0d, 0x01000000, 0x01000000], // KeyP - [0x00000e46, 0x00000e50, 0x01000000, 0x01000000], // KeyQ - [0x00000e1e, 0x00000e11, 0x01000000, 0x01000000], // KeyR - [0x00000e2b, 0x00000e06, 0x01000000, 0x01000000], // KeyS - [0x00000e30, 0x00000e18, 0x01000000, 0x01000000], // KeyT - [0x00000e35, 0x00000e4a, 0x01000000, 0x01000000], // KeyU - [0x00000e2d, 0x00000e2e, 0x01000000, 0x01000000], // KeyV - [0x00000e44, 0x00000022, 0x01000000, 0x01000000], // KeyW - [0x00000e1b, 0x00000029, 0x01000000, 0x01000000], // KeyX - [0x00000e31, 0x00000e4d, 0x01000000, 0x01000000], // KeyY - [0x00000e1c, 0x00000028, 0x01000000, 0x01000000], // KeyZ - [0x00000e45, 0x0000002b, 0x01000000, 0x01000000], // Digit1 - [0x0000002f, 0x00000e51, 0x01000000, 0x01000000], // Digit2 - [0x0000002d, 0x00000e52, 0x01000000, 0x01000000], // Digit3 - [0x00000e20, 0x00000e53, 0x01000000, 0x01000000], // Digit4 - [0x00000e16, 0x00000e54, 0x01000000, 0x01000000], // Digit5 - [0x00000e38, 0x00000e39, 0x01000000, 0x01000000], // Digit6 - [0x00000e36, 0x00000e3f, 0x01000000, 0x01000000], // Digit7 - [0x00000e04, 0x00000e55, 0x01000000, 0x01000000], // Digit8 - [0x00000e15, 0x00000e56, 0x01000000, 0x01000000], // Digit9 - [0x00000e08, 0x00000e57, 0x01000000, 0x01000000], // Digit0 - [0x00000e02, 0x00000e58, 0x01000000, 0x01000000], // Minus - [0x00000e0a, 0x00000e59, 0x01000000, 0x01000000], // Equal - [0x00000e1a, 0x00000e10, 0x01000000, 0x01000000], // BracketLeft - [0x00000e25, 0x0000002c, 0x01000000, 0x01000000], // BracketRight - [0x00000e03, 0x00000e05, 0x01000000, 0x01000000], // Backslash - [0x00000e27, 0x00000e0b, 0x01000000, 0x01000000], // Semicolon - [0x00000e07, 0x0000002e, 0x01000000, 0x01000000], // Quote - [0x0000005f, 0x00000025, 0x01000000, 0x01000000], // Backquote - [0x00000e21, 0x00000e12, 0x01000000, 0x01000000], // Comma - [0x00000e43, 0x00000e2c, 0x01000000, 0x01000000], // Period - [0x00000e1d, 0x00000e26, 0x01000000, 0x01000000], // Slash + [0x00000e1f, 0x00000e24, 0x00000000, 0x00000000], // KeyA + [0x00000e34, 0x00000e3a, 0x00000000, 0x00000000], // KeyB + [0x00000e41, 0x00000e09, 0x00000000, 0x00000000], // KeyC + [0x00000e01, 0x00000e0f, 0x00000000, 0x00000000], // KeyD + [0x00000e33, 0x00000e0e, 0x00000000, 0x00000000], // KeyE + [0x00000e14, 0x00000e42, 0x00000000, 0x00000000], // KeyF + [0x00000e40, 0x00000e0c, 0x00000000, 0x00000000], // KeyG + [0x00000e49, 0x00000e47, 0x00000000, 0x00000000], // KeyH + [0x00000e23, 0x00000e13, 0x00000000, 0x00000000], // KeyI + [0x00000e48, 0x00000e4b, 0x00000000, 0x00000000], // KeyJ + [0x00000e32, 0x00000e29, 0x00000000, 0x00000000], // KeyK + [0x00000e2a, 0x00000e28, 0x00000000, 0x00000000], // KeyL + [0x00000e17, 0x0000003f, 0x00000000, 0x00000000], // KeyM + [0x00000e37, 0x00000e4c, 0x00000000, 0x00000000], // KeyN + [0x00000e19, 0x00000e2f, 0x00000000, 0x00000000], // KeyO + [0x00000e22, 0x00000e0d, 0x00000000, 0x00000000], // KeyP + [0x00000e46, 0x00000e50, 0x00000000, 0x00000000], // KeyQ + [0x00000e1e, 0x00000e11, 0x00000000, 0x00000000], // KeyR + [0x00000e2b, 0x00000e06, 0x00000000, 0x00000000], // KeyS + [0x00000e30, 0x00000e18, 0x00000000, 0x00000000], // KeyT + [0x00000e35, 0x00000e4a, 0x00000000, 0x00000000], // KeyU + [0x00000e2d, 0x00000e2e, 0x00000000, 0x00000000], // KeyV + [0x00000e44, 0x00000022, 0x00000000, 0x00000000], // KeyW + [0x00000e1b, 0x00000029, 0x00000000, 0x00000000], // KeyX + [0x00000e31, 0x00000e4d, 0x00000000, 0x00000000], // KeyY + [0x00000e1c, 0x00000028, 0x00000000, 0x00000000], // KeyZ + [0x00000e45, 0x0000002b, 0x00000000, 0x00000000], // Digit1 + [0x0000002f, 0x00000e51, 0x00000000, 0x00000000], // Digit2 + [0x0000002d, 0x00000e52, 0x00000000, 0x00000000], // Digit3 + [0x00000e20, 0x00000e53, 0x00000000, 0x00000000], // Digit4 + [0x00000e16, 0x00000e54, 0x00000000, 0x00000000], // Digit5 + [0x00000e38, 0x00000e39, 0x00000000, 0x00000000], // Digit6 + [0x00000e36, 0x00000e3f, 0x00000000, 0x00000000], // Digit7 + [0x00000e04, 0x00000e55, 0x00000000, 0x00000000], // Digit8 + [0x00000e15, 0x00000e56, 0x00000000, 0x00000000], // Digit9 + [0x00000e08, 0x00000e57, 0x00000000, 0x00000000], // Digit0 + [0x00000e02, 0x00000e58, 0x00000000, 0x00000000], // Minus + [0x00000e0a, 0x00000e59, 0x00000000, 0x00000000], // Equal + [0x00000e1a, 0x00000e10, 0x00000000, 0x00000000], // BracketLeft + [0x00000e25, 0x0000002c, 0x00000000, 0x00000000], // BracketRight + [0x00000e03, 0x00000e05, 0x00000000, 0x00000000], // Backslash + [0x00000e27, 0x00000e0b, 0x00000000, 0x00000000], // Semicolon + [0x00000e07, 0x0000002e, 0x00000000, 0x00000000], // Quote + [0x0000005f, 0x00000025, 0x00000000, 0x00000000], // Backquote + [0x00000e21, 0x00000e12, 0x00000000, 0x00000000], // Comma + [0x00000e43, 0x00000e2c, 0x00000000, 0x00000000], // Period + [0x00000e1d, 0x00000e26, 0x00000000, 0x00000000], // Slash ], ), @@ -2339,52 +2339,52 @@ const List kLayouts = [ platform: LayoutPlatform.win, mapping: >[ [0x00000061, 0x00000041, 0x000000e6, 0x000000c6], // KeyA - [0x00000062, 0x00000042, 0x01000000, 0x01000000], // KeyB - [0x00000063, 0x00000043, 0x01000000, 0x01000000], // KeyC - [0x00000064, 0x00000044, 0x01000000, 0x01000000], // KeyD - [0x00000065, 0x00000045, 0x000020ac, 0x01000000], // KeyE - [0x00000066, 0x00000046, 0x01000000, 0x01000000], // KeyF - [0x00000067, 0x00000047, 0x01000000, 0x01000000], // KeyG - [0x00000068, 0x00000048, 0x01000000, 0x01000000], // KeyH + [0x00000062, 0x00000042, 0x00000000, 0x00000000], // KeyB + [0x00000063, 0x00000043, 0x00000000, 0x00000000], // KeyC + [0x00000064, 0x00000044, 0x00000000, 0x00000000], // KeyD + [0x00000065, 0x00000045, 0x000020ac, 0x00000000], // KeyE + [0x00000066, 0x00000046, 0x00000000, 0x00000000], // KeyF + [0x00000067, 0x00000047, 0x00000000, 0x00000000], // KeyG + [0x00000068, 0x00000048, 0x00000000, 0x00000000], // KeyH [0x00000131, 0x00000049, 0x00000069, 0x00000130], // KeyI - [0x0000006a, 0x0000004a, 0x01000000, 0x01000000], // KeyJ - [0x0000006b, 0x0000004b, 0x01000000, 0x01000000], // KeyK - [0x0000006c, 0x0000004c, 0x01000000, 0x01000000], // KeyL - [0x0000006d, 0x0000004d, 0x01000000, 0x01000000], // KeyM - [0x0000006e, 0x0000004e, 0x01000000, 0x01000000], // KeyN - [0x0000006f, 0x0000004f, 0x01000000, 0x01000000], // KeyO - [0x00000070, 0x00000050, 0x01000000, 0x01000000], // KeyP - [0x00000071, 0x00000051, 0x00000040, 0x01000000], // KeyQ - [0x00000072, 0x00000052, 0x01000000, 0x01000000], // KeyR - [0x00000073, 0x00000053, 0x000000df, 0x01000000], // KeyS - [0x00000074, 0x00000054, 0x000020ba, 0x01000000], // KeyT - [0x00000075, 0x00000055, 0x01000000, 0x01000000], // KeyU - [0x00000076, 0x00000056, 0x01000000, 0x01000000], // KeyV - [0x00000077, 0x00000057, 0x01000000, 0x01000000], // KeyW - [0x00000078, 0x00000058, 0x01000000, 0x01000000], // KeyX - [0x00000079, 0x00000059, 0x01000000, 0x01000000], // KeyY - [0x0000007a, 0x0000005a, 0x01000000, 0x01000000], // KeyZ - [0x00000031, 0x00000021, 0x0000003e, 0x01000000], // Digit1 - [0x00000032, 0x00000027, 0x000000a3, 0x01000000], // Digit2 - [0x00000033, 0x0000005e, 0x00000023, 0x01000000], // Digit3 - [0x00000034, 0x0000002b, 0x00000024, 0x01000000], // Digit4 - [0x00000035, 0x00000025, 0x000000bd, 0x01000000], // Digit5 - [0x00000036, 0x00000026, 0x01000000, 0x01000000], // Digit6 - [0x00000037, 0x0000002f, 0x0000007b, 0x01000000], // Digit7 - [0x00000038, 0x00000028, 0x0000005b, 0x01000000], // Digit8 - [0x00000039, 0x00000029, 0x0000005d, 0x01000000], // Digit9 - [0x00000030, 0x0000003d, 0x0000007d, 0x01000000], // Digit0 - [0x0000002a, 0x0000003f, 0x0000005c, 0x01000000], // Minus - [0x0000002d, 0x0000005f, 0x0000007c, 0x01000000], // Equal - [0x0000011f, 0x0000011e, 0x000000a8, 0x01000000], // BracketLeft - [0x000000fc, 0x000000dc, 0x0000007e, 0x01000000], // BracketRight - [0x0000002c, 0x0000003b, 0x00000060, 0x01000000], // Backslash - [0x0000015f, 0x0000015e, 0x000000b4, 0x01000000], // Semicolon - [0x00000069, 0x00000130, 0x01000000, 0x01000000], // Quote - [0x00000022, 0x000000e9, 0x0000003c, 0x01000000], // Backquote - [0x000000f6, 0x000000d6, 0x01000000, 0x01000000], // Comma - [0x000000e7, 0x000000c7, 0x01000000, 0x01000000], // Period - [0x0000002e, 0x0000003a, 0x01000000, 0x01000000], // Slash + [0x0000006a, 0x0000004a, 0x00000000, 0x00000000], // KeyJ + [0x0000006b, 0x0000004b, 0x00000000, 0x00000000], // KeyK + [0x0000006c, 0x0000004c, 0x00000000, 0x00000000], // KeyL + [0x0000006d, 0x0000004d, 0x00000000, 0x00000000], // KeyM + [0x0000006e, 0x0000004e, 0x00000000, 0x00000000], // KeyN + [0x0000006f, 0x0000004f, 0x00000000, 0x00000000], // KeyO + [0x00000070, 0x00000050, 0x00000000, 0x00000000], // KeyP + [0x00000071, 0x00000051, 0x00000040, 0x00000000], // KeyQ + [0x00000072, 0x00000052, 0x00000000, 0x00000000], // KeyR + [0x00000073, 0x00000053, 0x000000df, 0x00000000], // KeyS + [0x00000074, 0x00000054, 0x000020ba, 0x00000000], // KeyT + [0x00000075, 0x00000055, 0x00000000, 0x00000000], // KeyU + [0x00000076, 0x00000056, 0x00000000, 0x00000000], // KeyV + [0x00000077, 0x00000057, 0x00000000, 0x00000000], // KeyW + [0x00000078, 0x00000058, 0x00000000, 0x00000000], // KeyX + [0x00000079, 0x00000059, 0x00000000, 0x00000000], // KeyY + [0x0000007a, 0x0000005a, 0x00000000, 0x00000000], // KeyZ + [0x00000031, 0x00000021, 0x0000003e, 0x00000000], // Digit1 + [0x00000032, 0x00000027, 0x000000a3, 0x00000000], // Digit2 + [0x00000033, 0x0000005e, 0x00000023, 0x00000000], // Digit3 + [0x00000034, 0x0000002b, 0x00000024, 0x00000000], // Digit4 + [0x00000035, 0x00000025, 0x000000bd, 0x00000000], // Digit5 + [0x00000036, 0x00000026, 0x00000000, 0x00000000], // Digit6 + [0x00000037, 0x0000002f, 0x0000007b, 0x00000000], // Digit7 + [0x00000038, 0x00000028, 0x0000005b, 0x00000000], // Digit8 + [0x00000039, 0x00000029, 0x0000005d, 0x00000000], // Digit9 + [0x00000030, 0x0000003d, 0x0000007d, 0x00000000], // Digit0 + [0x0000002a, 0x0000003f, 0x0000005c, 0x00000000], // Minus + [0x0000002d, 0x0000005f, 0x0000007c, 0x00000000], // Equal + [0x0000011f, 0x0000011e, 0x000000a8, 0x00000000], // BracketLeft + [0x000000fc, 0x000000dc, 0x0000007e, 0x00000000], // BracketRight + [0x0000002c, 0x0000003b, 0x00000060, 0x00000000], // Backslash + [0x0000015f, 0x0000015e, 0x000000b4, 0x00000000], // Semicolon + [0x00000069, 0x00000130, 0x00000000, 0x00000000], // Quote + [0x00000022, 0x000000e9, 0x0000003c, 0x00000000], // Backquote + [0x000000f6, 0x000000d6, 0x00000000, 0x00000000], // Comma + [0x000000e7, 0x000000c7, 0x00000000, 0x00000000], // Period + [0x0000002e, 0x0000003a, 0x00000000, 0x00000000], // Slash ], ), @@ -2396,23 +2396,23 @@ const List kLayouts = [ [0x00000062, 0x00000042, 0x0000222b, 0x00000131], // KeyB [0x00000063, 0x00000043, 0x000000e7, 0x000000c7], // KeyC [0x00000064, 0x00000044, 0x00002202, 0x000000ce], // KeyD - [0x00000065, 0x00000045, 0x01000000, 0x000000b4], // KeyE + [0x00000065, 0x00000045, 0x000000b4, 0x000000b4], // KeyE [0x00000066, 0x00000046, 0x00000192, 0x000000cf], // KeyF [0x00000067, 0x00000047, 0x000000a9, 0x000002dd], // KeyG [0x00000068, 0x00000048, 0x000002d9, 0x000000d3], // KeyH - [0x00000069, 0x00000049, 0x01000000, 0x000002c6], // KeyI + [0x00000069, 0x00000049, 0x000002c6, 0x000002c6], // KeyI [0x0000006a, 0x0000004a, 0x00002206, 0x000000d4], // KeyJ [0x0000006b, 0x0000004b, 0x000002da, 0x0000f8ff], // KeyK [0x0000006c, 0x0000004c, 0x000000ac, 0x000000d2], // KeyL [0x0000006d, 0x0000004d, 0x000000b5, 0x000000c2], // KeyM - [0x0000006e, 0x0000004e, 0x01000000, 0x000002dc], // KeyN + [0x0000006e, 0x0000004e, 0x000002dc, 0x000002dc], // KeyN [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO [0x00000070, 0x00000050, 0x000003c0, 0x0000220f], // KeyP [0x00000071, 0x00000051, 0x00000153, 0x00000152], // KeyQ [0x00000072, 0x00000052, 0x000000ae, 0x00002030], // KeyR [0x00000073, 0x00000053, 0x000000df, 0x000000cd], // KeyS [0x00000074, 0x00000054, 0x00002020, 0x000002c7], // KeyT - [0x00000075, 0x00000055, 0x01000000, 0x000000a8], // KeyU + [0x00000075, 0x00000055, 0x000000a8, 0x000000a8], // KeyU [0x00000076, 0x00000056, 0x0000221a, 0x000025ca], // KeyV [0x00000077, 0x00000057, 0x00002211, 0x0000201e], // KeyW [0x00000078, 0x00000058, 0x00002248, 0x000002db], // KeyX @@ -2423,19 +2423,19 @@ const List kLayouts = [ [0x00000033, 0x00000023, 0x000000a3, 0x00002039], // Digit3 [0x00000034, 0x000000a5, 0x000000a2, 0x0000203a], // Digit4 [0x00000035, 0x00000025, 0x0000221e, 0x0000fb01], // Digit5 - [0x00000036, 0x01000000, 0x000000a7, 0x0000fb02], // Digit6 + [0x00000036, 0x00000000, 0x000000a7, 0x0000fb02], // Digit6 [0x00000037, 0x00000026, 0x000000b6, 0x00002021], // Digit7 [0x00000038, 0x0000002a, 0x00002022, 0x000000b0], // Digit8 [0x00000039, 0x0000ff08, 0x000000aa, 0x000000b7], // Digit9 [0x00000030, 0x0000ff09, 0x000000ba, 0x0000201a], // Digit0 - [0x0000002d, 0x01000000, 0x00002013, 0x00002014], // Minus + [0x0000002d, 0x00000000, 0x00002013, 0x00002014], // Minus [0x0000003d, 0x0000002b, 0x00002260, 0x000000b1], // Equal [0x00003010, 0x0000300c, 0x0000201c, 0x0000201d], // BracketLeft [0x00003011, 0x0000300d, 0x00002018, 0x00002019], // BracketRight [0x00003001, 0x0000007c, 0x000000ab, 0x000000bb], // Backslash [0x0000ff1b, 0x0000ff1a, 0x00002026, 0x000000da], // Semicolon [0x00000027, 0x00000022, 0x000000e6, 0x000000c6], // Quote - [0x000000b7, 0x0000ff5e, 0x01000000, 0x00000060], // Backquote + [0x000000b7, 0x0000ff5e, 0x00000060, 0x00000060], // Backquote [0x0000ff0c, 0x0000300a, 0x00002264, 0x000000af], // Comma [0x00003002, 0x0000300b, 0x00002265, 0x000002d8], // Period [0x0000002f, 0x0000ff1f, 0x000000f7, 0x000000bf], // Slash diff --git a/tools/gen_web_keyboard_layouts/README.md b/tools/gen_web_keyboard_layouts/README.md index 0ac1a97c3fad4..d58e2eef3ec01 100644 --- a/tools/gen_web_keyboard_layouts/README.md +++ b/tools/gen_web_keyboard_layouts/README.md @@ -1 +1 @@ -## Keycode Generator +## Web Keyboard Layouts Generator diff --git a/tools/gen_web_keyboard_layouts/data/layouts.dart.tmpl b/tools/gen_web_keyboard_layouts/data/definitions.dart.tmpl similarity index 76% rename from tools/gen_web_keyboard_layouts/data/layouts.dart.tmpl rename to tools/gen_web_keyboard_layouts/data/definitions.dart.tmpl index 4cc2a8f0f7e4e..3c82b3d0ee766 100644 --- a/tools/gen_web_keyboard_layouts/data/layouts.dart.tmpl +++ b/tools/gen_web_keyboard_layouts/data/definitions.dart.tmpl @@ -3,7 +3,7 @@ // DO NOT EDIT -- DO NOT EDIT -- DO NOT EDIT // -// This file is auto generated by flutter/packages:script/gen_web_keyboard based on +// This file is auto generated by flutter/engine:flutter/tools/gen_web_keyboard_layouts based on // https://github.com/microsoft/vscode/tree/@@@COMMIT_ID@@@/src/vs/workbench/services/keybinding/browser/keyboardLayouts // // Edit the following files instead: @@ -11,7 +11,7 @@ // - Script: lib/main.dart // - Templates: data/*.tmpl // -// See flutter/packages:script/gen_web_keyboard/layouts/README.md for more information. +// See flutter/engine:flutter/tools/gen_web_keyboard_layouts/README.md for more information. part of web_keyboard_layouts; diff --git a/tools/gen_web_keyboard_layouts/data/layout_entry.dart.tmpl b/tools/gen_web_keyboard_layouts/data/definitions_entry.dart.tmpl similarity index 100% rename from tools/gen_web_keyboard_layouts/data/layout_entry.dart.tmpl rename to tools/gen_web_keyboard_layouts/data/definitions_entry.dart.tmpl diff --git a/tools/gen_web_keyboard_layouts/lib/json_get.dart b/tools/gen_web_keyboard_layouts/lib/json_get.dart index 3977c526d5634..7ed4792ead4c7 100644 --- a/tools/gen_web_keyboard_layouts/lib/json_get.dart +++ b/tools/gen_web_keyboard_layouts/lib/json_get.dart @@ -25,7 +25,7 @@ String _jsonTypeErrorMessage(List currentPath, String nextKey, Type expe } JsonContext jsonGetKey(JsonContext context, String key) { - dynamic result = context.current[key]; + final dynamic result = context.current[key]; if (result is! T) { throw ArgumentError(_jsonTypeErrorMessage(context.path, key, T, result.runtimeType)); } @@ -33,7 +33,7 @@ JsonContext jsonGetKey(JsonContext context, String key) { } JsonContext jsonGetIndex(JsonContext context, int index) { - dynamic result = context.current[index]; + final dynamic result = context.current[index]; if (result is! T) { throw ArgumentError(_jsonTypeErrorMessage(context.path, '$index', T, result.runtimeType)); } @@ -42,7 +42,7 @@ JsonContext jsonGetIndex(JsonContext context, int index) { JsonContext jsonGetPath(JsonContext context, List path) { JsonContext current = context; - void _jsonGetKeyOrIndex(dynamic key, int depth) { + void jsonGetKeyOrIndex(dynamic key, int depth) { assert(key is String || key is int, 'Key at $depth is a ${key.runtimeType}.'); if (key is String) { current = jsonGetKey(current as JsonContext, key); @@ -52,12 +52,12 @@ JsonContext jsonGetPath(JsonContext context, List path) assert(false); } } - void _jsonGetKeyOrIndexForNext(dynamic key, dynamic nextKey, int depth) { + void jsonGetKeyOrIndexForNext(dynamic key, dynamic nextKey, int depth) { assert(nextKey is String || nextKey is int, 'Key at ${depth + 1} is a ${key.runtimeType}.'); if (nextKey is String) { - _jsonGetKeyOrIndex(key, depth); + jsonGetKeyOrIndex(key, depth); } else if (nextKey is int) { - _jsonGetKeyOrIndex(key, depth); + jsonGetKeyOrIndex(key, depth); } else { assert(false); } @@ -65,9 +65,9 @@ JsonContext jsonGetPath(JsonContext context, List path) for (int depth = 0; depth < path.length; depth += 1) { if (depth != path.length - 1) { - _jsonGetKeyOrIndexForNext(path[depth], path[depth + 1], depth); + jsonGetKeyOrIndexForNext(path[depth], path[depth + 1], depth); } else { - _jsonGetKeyOrIndex(path[depth], depth); + jsonGetKeyOrIndex(path[depth], depth); } } return current as JsonContext; diff --git a/tools/gen_web_keyboard_layouts/lib/layout_types.dart b/tools/gen_web_keyboard_layouts/lib/layout_types.dart new file mode 100644 index 0000000000000..9ae90e9f70c4d --- /dev/null +++ b/tools/gen_web_keyboard_layouts/lib/layout_types.dart @@ -0,0 +1,39 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:meta/meta.dart' show immutable; + +enum LayoutPlatform { + win, + linux, + darwin, +} + +@immutable +class LayoutEntry { + LayoutEntry(this.printables, this.deadMasks) + : assert(printables.length == 4); + + final List printables; + final int deadMasks; + + static final LayoutEntry empty = LayoutEntry( + const ['', '', '', ''], 0xf); +} + +@immutable +class Layout { + const Layout(this.language, this.platform, this.entries); + + final String language; + final LayoutPlatform platform; + final Map entries; +} + +@immutable +class LayoutStore { + const LayoutStore(this.layouts); + + final List layouts; +} diff --git a/tools/gen_web_keyboard_layouts/lib/main.dart b/tools/gen_web_keyboard_layouts/lib/main.dart index ea44697d275e6..ce8ec0c6712c4 100644 --- a/tools/gen_web_keyboard_layouts/lib/main.dart +++ b/tools/gen_web_keyboard_layouts/lib/main.dart @@ -2,18 +2,28 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:gen_web_keyboard_layouts/data.dart'; -import 'package:meta/meta.dart' show immutable; import 'dart:convert'; import 'dart:io'; import 'package:http/http.dart' as http; +import 'package:meta/meta.dart' show immutable; import 'package:path/path.dart' as path; +import 'data.dart'; + import 'json_get.dart'; +import 'layout_types.dart'; import 'utils.dart'; -const int kDeadChar = 0x1000000; +/// All goals in the form of KeyboardEvent.key. +final List kGoalKeys = kLayoutGoals.keys.toList(); + +/// A map from the key of `kLayoutGoals` (KeyboardEvent.key) to an +/// auto-incremental index. +final Map kGoalToIndex = Map.fromEntries( + kGoalKeys.asMap().entries.map( + (MapEntry entry) => MapEntry(entry.value, entry.key)), +); @immutable class Options { @@ -43,8 +53,8 @@ class Options { const String githubCacheFileName = 'github-response.json'; const String githubTargetFolder = 'src/vs/workbench/services/keybinding/browser/keyboardLayouts'; -const String overallTemplateName = 'layouts.dart.tmpl'; -const String entryTemplateName = 'layout_entry.dart.tmpl'; +const String overallTemplateName = 'definitions.dart.tmpl'; +const String entryTemplateName = 'definitions_entry.dart.tmpl'; const String outputName = 'definitions.g.dart'; const String githubQuery = ''' @@ -118,7 +128,7 @@ Future tryCached(String cachePath, bool forceRefresh, AsyncGetter> fetchGithub(String githubToken, bool forceRefresh, String cachePath) async { +Future> _fetchGithub(String githubToken, bool forceRefresh, String cachePath) async { final String response = await tryCached(cachePath, forceRefresh, () async { final String condensedQuery = githubQuery .replaceAll(RegExp(r'\{ +'), '{') @@ -142,34 +152,44 @@ Future> fetchGithub(String githubToken, bool forceRefresh, } @immutable -class GitHubFile { - const GitHubFile({required this.name, required this.content}); +class _GitHubFile { + const _GitHubFile({required this.name, required this.content}); final String name; final String content; } -GitHubFile jsonGetGithubFile(JsonContext files, int index) { +_GitHubFile _jsonGetGithubFile(JsonContext files, int index) { final JsonContext file = jsonGetIndex(files, index); - return GitHubFile( + return _GitHubFile( name: jsonGetKey(file, 'name').current, content: jsonGetPath(file, ['object', 'text']).current, ); } -typedef LayoutEntry = List; - -@immutable -class Layout { - const Layout(this.name, this.platform, this.mapping); +String _parsePrintable(String rawString) { + // Parse a char represented in unicode hex, such as \u001b. + final RegExp hexParser = RegExp(r'^\\u([0-9a-fA-F]+)$'); - final String name; - final String platform; - final Map mapping; + if (rawString.isEmpty) { + return ''; + } + final RegExpMatch? hexMatch = hexParser.firstMatch(rawString); + if (hexMatch != null) { + final int codeUnit = int.parse(hexMatch.group(1)!, radix: 16); + return String.fromCharCode(codeUnit); + } + return const { + r'\\': r'\', + r'\r': '\r', + r'\b': '\b', + r'\t': '\t', + r"\'": "'", + }[rawString] ?? rawString; } -Layout parseLayoutFile(GitHubFile file) { - final Map mapping = {}; +Layout _parseLayoutFromGithubFile(_GitHubFile file) { + final Map entries = {}; // Parse a line that looks like the following, and get its key as well as // the content within the square bracket. @@ -179,67 +199,59 @@ Layout parseLayoutFile(GitHubFile file) { final RegExp lineParser = RegExp(r'^[ \t]*(.+?): \[(.*)\],$'); // Parse each child of the content within the square bracket. final RegExp listParser = RegExp(r"^'(.*?)', '(.*?)', '(.*?)', '(.*?)', (\d)(?:, '(.+)')?$"); - // Parse a char represented in unicode hex, such as \u001b. - final RegExp hexParser = RegExp(r'^\\u([0-9a-fA-F]+)$'); file.content.split('\n').forEach((String line) { final RegExpMatch? lineMatch = lineParser.firstMatch(line); if (lineMatch == null) { return; } + // KeyboardKey.key, such as "KeyZ". final String eventKey = lineMatch.group(1)!; + // Only record goals. + if (!kGoalToIndex.containsKey(eventKey)) { + return; + } + + // Comma-separated definition as a string, such as "'y', 'Y', '', '', 0, 'VK_Y'". final String definition = lineMatch.group(2)!; if (definition.isEmpty) { return; } + // Group 1-4 are single strings for an entry, such as "y", "", "\u001b". + // Group 5 is the dead mask. final RegExpMatch? listMatch = listParser.firstMatch(definition); assert(listMatch != null, 'Unable to match $definition'); final int deadMask = int.parse(listMatch!.group(5)!, radix: 10); - int combineValue(String rawString, int deadMask) { - if (deadMask != 0 || rawString.isEmpty) { - return kDeadChar; - } - final RegExpMatch? hexMatch = hexParser.firstMatch(rawString); - if (hexMatch != null) { - return int.parse(hexMatch.group(1)!, radix: 16); - } - final String charString = const { - r'\\': r'\', - r'\r': '\r', - r'\b': '\b', - r'\t': '\t', - r"\'": "'", - 'l̥': 'l', // TODO - 'L̥': 'L', // TODO - 'r̥': 'r', // TODO - 'R̥': 'R', // TODO - }[rawString] ?? rawString; - assert(charString.length == 1, 'Unrecognized multibyte character |$charString| (file ${file.name} key $eventKey)'); - return charString.codeUnitAt(0); - } - mapping[eventKey] = [ - combineValue(listMatch.group(1)!, deadMask & 0x1), - combineValue(listMatch.group(2)!, deadMask & 0x2), - combineValue(listMatch.group(3)!, deadMask & 0x4), - combineValue(listMatch.group(4)!, deadMask & 0x8), - ]; + entries[eventKey] = LayoutEntry( + [ + _parsePrintable(listMatch.group(1)!), + _parsePrintable(listMatch.group(2)!), + _parsePrintable(listMatch.group(3)!), + _parsePrintable(listMatch.group(4)!), + ], + deadMask, + ); }); + for (final String goalKey in kGoalKeys) { + entries.putIfAbsent(goalKey, () => LayoutEntry.empty); + } + // Parse the file name, which looks like "en-belgian.win.ts". final RegExp fileNameParser = RegExp(r'^([^.]+)\.([^.]+)\.ts$'); - Layout? layout; + late final Layout layout; try { final RegExpMatch? match = fileNameParser.firstMatch(file.name); final String layoutName = match!.group(1)!; - final String platform = match.group(2)!; - layout = Layout(layoutName, platform, mapping); + final LayoutPlatform platform = _platformFromGithubString(match.group(2)!); + layout = Layout(layoutName, platform, entries); } catch (exception) { throw ArgumentError('Unrecognizable file name ${file.name}.'); } return layout; } -String renderTemplate(String template, Map dictionary) { +String _renderTemplate(String template, Map dictionary) { String result = template; dictionary.forEach((String key, String value) { final String localResult = result.replaceAll('@@@$key@@@', value); @@ -251,9 +263,41 @@ String renderTemplate(String template, Map dictionary) { return result; } +LayoutPlatform _platformFromGithubString(String origin) { + switch (origin) { + case 'win': + return LayoutPlatform.win; + case 'linux': + return LayoutPlatform.linux; + case 'darwin': + return LayoutPlatform.darwin; + default: + throw ArgumentError('Unexpected platform "$origin".'); + } +} + +String _platformToString(LayoutPlatform value) { + switch (value) { + case LayoutPlatform.win: + return 'win'; + case LayoutPlatform.linux: + return 'linux'; + case LayoutPlatform.darwin: + return 'darwin'; + } +} + +int _sortLayout(Layout a, Layout b) { + int result = a.language.compareTo(b.language); + if (result == 0) { + result = a.platform.index.compareTo(b.platform.index); + } + return result; +} + Future generate(Options options) async { // Fetch files from GitHub. - final Map githubBody = await fetchGithub( + final Map githubBody = await _fetchGithub( options.githubToken, options.force, path.join(options.cacheRoot, githubCacheFileName), @@ -269,32 +313,35 @@ Future generate(Options options) async { commitJson, jsonPathSplit('file.object.entries'), ); - final Iterable files = Iterable.generate( + final Iterable<_GitHubFile> files = Iterable<_GitHubFile>.generate( fileListJson.current.length, - (int index) => jsonGetGithubFile(fileListJson, index), + (int index) => _jsonGetGithubFile(fileListJson, index), ).where( - // A few files in the folder are controlling files, containing no layout - // information. - (GitHubFile file) => !file.name.startsWith('layout.contribution.') + // Exclude controlling files, which contain no layout information. + (_GitHubFile file) => !file.name.startsWith('layout.contribution.') && !file.name.startsWith('_.contribution'), ); - final List layouts = files.map(parseLayoutFile).toList(); + final List layouts = files.map(_parseLayoutFromGithubFile) + .toList() + ..sort(_sortLayout); final Iterable entriesString = layouts.map((Layout layout) { - return renderTemplate( + return _renderTemplate( File(path.join(options.dataRoot, entryTemplateName)).readAsStringSync(), { - 'NAME': layout.name, - 'PLATFORM': layout.platform, - 'ENTRIES': kLayoutGoals.keys.map((String key) { - final String value = layout.mapping[key]!.map(toHex).join(', '); - return ' [$value], // $key'; + 'NAME': layout.language, + 'PLATFORM': _platformToString(layout.platform), + 'ENTRIES': layout.entries.entries.map((MapEntry mapEntry) { + final String value = mapEntry.value.printables.map((String char) { + return toHex(char.isEmpty ? 0 : char.codeUnitAt(0)); + }).join(', '); + return ' [$value], // ${mapEntry.key}'; }).join('\n'), }, ).trimRight(); }); - final String result = renderTemplate( + final String result = _renderTemplate( File(path.join(options.dataRoot, overallTemplateName)).readAsStringSync(), { 'COMMIT_ID': commitId, diff --git a/tools/gen_web_keyboard_layouts/pubspec.yaml b/tools/gen_web_keyboard_layouts/pubspec.yaml index ebe5c511d935d..e398eb395bd33 100644 --- a/tools/gen_web_keyboard_layouts/pubspec.yaml +++ b/tools/gen_web_keyboard_layouts/pubspec.yaml @@ -8,6 +8,7 @@ dependencies: args: ^2.3.1 http: ^0.13.4 path: ^1.8.1 + meta: any dev_dependencies: test: ^1.21.1 From f05dc33a385a0703659a3738d4ac1a0eba506b4b Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Wed, 12 Oct 2022 11:01:45 -0700 Subject: [PATCH 17/74] Fix template --- .../gen_web_keyboard_layouts/data/definitions_entry.dart.tmpl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/gen_web_keyboard_layouts/data/definitions_entry.dart.tmpl b/tools/gen_web_keyboard_layouts/data/definitions_entry.dart.tmpl index f4b28d0a24852..e9f984f29b3fd 100644 --- a/tools/gen_web_keyboard_layouts/data/definitions_entry.dart.tmpl +++ b/tools/gen_web_keyboard_layouts/data/definitions_entry.dart.tmpl @@ -1,7 +1,7 @@ LayoutInfo( - name: '@@@NAME@@@', + language: '@@@NAME@@@', platform: LayoutPlatform.@@@PLATFORM@@@, - mapping: >[ + entries: [ @@@ENTRIES@@@ ], ), From f5704c5db94b6ce34fd429d454e3adfdb8dee3a4 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Wed, 12 Oct 2022 15:57:25 -0700 Subject: [PATCH 18/74] Marshall and unmarshall --- .../lib/definitions.g.dart | 2553 +---------------- .../data/definitions.dart.tmpl | 9 +- .../lib/layout_types.dart | 207 +- tools/gen_web_keyboard_layouts/lib/main.dart | 42 +- tools/gen_web_keyboard_layouts/pubspec.yaml | 12 +- 5 files changed, 366 insertions(+), 2457 deletions(-) diff --git a/third_party/web_keyboard_layouts/lib/definitions.g.dart b/third_party/web_keyboard_layouts/lib/definitions.g.dart index fca8b64c0c8f9..3603d4cd20561 100644 --- a/third_party/web_keyboard_layouts/lib/definitions.g.dart +++ b/third_party/web_keyboard_layouts/lib/definitions.g.dart @@ -15,2430 +15,129 @@ part of web_keyboard_layouts; -const Map kLayoutGoals = { - 'KeyA': 'A', - 'KeyB': 'B', - 'KeyC': 'C', - 'KeyD': 'D', - 'KeyE': 'E', - 'KeyF': 'F', - 'KeyG': 'G', - 'KeyH': 'H', - 'KeyI': 'I', - 'KeyJ': 'J', - 'KeyK': 'K', - 'KeyL': 'L', - 'KeyM': 'M', - 'KeyN': 'N', - 'KeyO': 'O', - 'KeyP': 'P', - 'KeyQ': 'Q', - 'KeyR': 'R', - 'KeyS': 'S', - 'KeyT': 'T', - 'KeyU': 'U', - 'KeyV': 'V', - 'KeyW': 'W', - 'KeyX': 'X', - 'KeyY': 'Y', - 'KeyZ': 'Z', - 'Digit1': '1', - 'Digit2': '2', - 'Digit3': '3', - 'Digit4': '4', - 'Digit5': '5', - 'Digit6': '6', - 'Digit7': '7', - 'Digit8': '8', - 'Digit9': '9', - 'Digit0': '0', - 'Minus': null, - 'Equal': null, - 'BracketLeft': null, - 'BracketRight': null, - 'Backslash': null, - 'Semicolon': null, - 'Quote': null, - 'Backquote': null, - 'Comma': null, - 'Period': null, - 'Slash': null, -}; - -const List kLayouts = [ - LayoutInfo( - name: 'cz', - platform: LayoutPlatform.win, - mapping: >[ - [0x00000061, 0x00000041, 0x00000000, 0x00000000], // KeyA - [0x00000062, 0x00000042, 0x0000007b, 0x00000000], // KeyB - [0x00000063, 0x00000043, 0x00000026, 0x00000000], // KeyC - [0x00000064, 0x00000044, 0x00000110, 0x00000000], // KeyD - [0x00000065, 0x00000045, 0x000020ac, 0x00000000], // KeyE - [0x00000066, 0x00000046, 0x0000005b, 0x00000000], // KeyF - [0x00000067, 0x00000047, 0x0000005d, 0x00000000], // KeyG - [0x00000068, 0x00000048, 0x00000000, 0x00000000], // KeyH - [0x00000069, 0x00000049, 0x00000000, 0x00000000], // KeyI - [0x0000006a, 0x0000004a, 0x00000000, 0x00000000], // KeyJ - [0x0000006b, 0x0000004b, 0x00000142, 0x00000000], // KeyK - [0x0000006c, 0x0000004c, 0x00000141, 0x00000000], // KeyL - [0x0000006d, 0x0000004d, 0x00000000, 0x00000000], // KeyM - [0x0000006e, 0x0000004e, 0x0000007d, 0x00000000], // KeyN - [0x0000006f, 0x0000004f, 0x00000000, 0x00000000], // KeyO - [0x00000070, 0x00000050, 0x00000000, 0x00000000], // KeyP - [0x00000071, 0x00000051, 0x0000005c, 0x00000000], // KeyQ - [0x00000072, 0x00000052, 0x00000000, 0x00000000], // KeyR - [0x00000073, 0x00000053, 0x00000111, 0x00000000], // KeyS - [0x00000074, 0x00000054, 0x00000000, 0x00000000], // KeyT - [0x00000075, 0x00000055, 0x00000000, 0x00000000], // KeyU - [0x00000076, 0x00000056, 0x00000040, 0x00000000], // KeyV - [0x00000077, 0x00000057, 0x0000007c, 0x00000000], // KeyW - [0x00000078, 0x00000058, 0x00000023, 0x00000000], // KeyX - [0x0000007a, 0x0000005a, 0x00000000, 0x00000000], // KeyY - [0x00000079, 0x00000059, 0x00000000, 0x00000000], // KeyZ - [0x0000002b, 0x00000031, 0x0000007e, 0x00000000], // Digit1 - [0x0000011b, 0x00000032, 0x000002c7, 0x00000000], // Digit2 - [0x00000161, 0x00000033, 0x0000005e, 0x00000000], // Digit3 - [0x0000010d, 0x00000034, 0x000002d8, 0x00000000], // Digit4 - [0x00000159, 0x00000035, 0x000000b0, 0x00000000], // Digit5 - [0x0000017e, 0x00000036, 0x000002db, 0x00000000], // Digit6 - [0x000000fd, 0x00000037, 0x00000060, 0x00000000], // Digit7 - [0x000000e1, 0x00000038, 0x000002d9, 0x00000000], // Digit8 - [0x000000ed, 0x00000039, 0x000000b4, 0x00000000], // Digit9 - [0x000000e9, 0x00000030, 0x000002dd, 0x00000000], // Digit0 - [0x0000003d, 0x00000025, 0x000000a8, 0x00000000], // Minus - [0x000000b4, 0x000002c7, 0x000000b8, 0x00000000], // Equal - [0x000000fa, 0x0000002f, 0x000000f7, 0x00000000], // BracketLeft - [0x00000029, 0x00000028, 0x000000d7, 0x00000000], // BracketRight - [0x000000a8, 0x00000027, 0x000000a4, 0x00000000], // Backslash - [0x0000016f, 0x00000022, 0x00000024, 0x00000000], // Semicolon - [0x000000a7, 0x00000021, 0x000000df, 0x00000000], // Quote - [0x0000003b, 0x000000b0, 0x00000000, 0x00000000], // Backquote - [0x0000002c, 0x0000003f, 0x0000003c, 0x00000000], // Comma - [0x0000002e, 0x0000003a, 0x0000003e, 0x00000000], // Period - [0x0000002d, 0x0000005f, 0x0000002a, 0x00000000], // Slash - ], - ), - - LayoutInfo( - name: 'de', - platform: LayoutPlatform.win, - mapping: >[ - [0x00000061, 0x00000041, 0x00000000, 0x00000000], // KeyA - [0x00000062, 0x00000042, 0x00000000, 0x00000000], // KeyB - [0x00000063, 0x00000043, 0x00000000, 0x00000000], // KeyC - [0x00000064, 0x00000044, 0x00000000, 0x00000000], // KeyD - [0x00000065, 0x00000045, 0x000020ac, 0x00000000], // KeyE - [0x00000066, 0x00000046, 0x00000000, 0x00000000], // KeyF - [0x00000067, 0x00000047, 0x00000000, 0x00000000], // KeyG - [0x00000068, 0x00000048, 0x00000000, 0x00000000], // KeyH - [0x00000069, 0x00000049, 0x00000000, 0x00000000], // KeyI - [0x0000006a, 0x0000004a, 0x00000000, 0x00000000], // KeyJ - [0x0000006b, 0x0000004b, 0x00000000, 0x00000000], // KeyK - [0x0000006c, 0x0000004c, 0x00000000, 0x00000000], // KeyL - [0x0000006d, 0x0000004d, 0x000000b5, 0x00000000], // KeyM - [0x0000006e, 0x0000004e, 0x00000000, 0x00000000], // KeyN - [0x0000006f, 0x0000004f, 0x00000000, 0x00000000], // KeyO - [0x00000070, 0x00000050, 0x00000000, 0x00000000], // KeyP - [0x00000071, 0x00000051, 0x00000040, 0x00000000], // KeyQ - [0x00000072, 0x00000052, 0x00000000, 0x00000000], // KeyR - [0x00000073, 0x00000053, 0x00000000, 0x00000000], // KeyS - [0x00000074, 0x00000054, 0x00000000, 0x00000000], // KeyT - [0x00000075, 0x00000055, 0x00000000, 0x00000000], // KeyU - [0x00000076, 0x00000056, 0x00000000, 0x00000000], // KeyV - [0x00000077, 0x00000057, 0x00000000, 0x00000000], // KeyW - [0x00000078, 0x00000058, 0x00000000, 0x00000000], // KeyX - [0x0000007a, 0x0000005a, 0x00000000, 0x00000000], // KeyY - [0x00000079, 0x00000059, 0x00000000, 0x00000000], // KeyZ - [0x00000031, 0x00000021, 0x00000000, 0x00000000], // Digit1 - [0x00000032, 0x00000022, 0x000000b2, 0x00000000], // Digit2 - [0x00000033, 0x000000a7, 0x000000b3, 0x00000000], // Digit3 - [0x00000034, 0x00000024, 0x00000000, 0x00000000], // Digit4 - [0x00000035, 0x00000025, 0x00000000, 0x00000000], // Digit5 - [0x00000036, 0x00000026, 0x00000000, 0x00000000], // Digit6 - [0x00000037, 0x0000002f, 0x0000007b, 0x00000000], // Digit7 - [0x00000038, 0x00000028, 0x0000005b, 0x00000000], // Digit8 - [0x00000039, 0x00000029, 0x0000005d, 0x00000000], // Digit9 - [0x00000030, 0x0000003d, 0x0000007d, 0x00000000], // Digit0 - [0x000000df, 0x0000003f, 0x0000005c, 0x00001e9e], // Minus - [0x000000b4, 0x00000060, 0x00000000, 0x00000000], // Equal - [0x000000fc, 0x000000dc, 0x00000000, 0x00000000], // BracketLeft - [0x0000002b, 0x0000002a, 0x0000007e, 0x00000000], // BracketRight - [0x00000023, 0x00000027, 0x00000000, 0x00000000], // Backslash - [0x000000f6, 0x000000d6, 0x00000000, 0x00000000], // Semicolon - [0x000000e4, 0x000000c4, 0x00000000, 0x00000000], // Quote - [0x0000005e, 0x000000b0, 0x00000000, 0x00000000], // Backquote - [0x0000002c, 0x0000003b, 0x00000000, 0x00000000], // Comma - [0x0000002e, 0x0000003a, 0x00000000, 0x00000000], // Period - [0x0000002d, 0x0000005f, 0x00000000, 0x00000000], // Slash - ], - ), - - LayoutInfo( - name: 'de', - platform: LayoutPlatform.linux, - mapping: >[ - [0x00000061, 0x00000041, 0x000000e6, 0x000000c6], // KeyA - [0x00000062, 0x00000042, 0x0000201c, 0x00002018], // KeyB - [0x00000063, 0x00000043, 0x000000a2, 0x000000a9], // KeyC - [0x00000064, 0x00000044, 0x000000f0, 0x000000d0], // KeyD - [0x00000065, 0x00000045, 0x000020ac, 0x000020ac], // KeyE - [0x00000066, 0x00000046, 0x00000111, 0x000000aa], // KeyF - [0x00000067, 0x00000047, 0x0000014b, 0x0000014a], // KeyG - [0x00000068, 0x00000048, 0x00000127, 0x00000126], // KeyH - [0x00000069, 0x00000049, 0x00002192, 0x00000131], // KeyI - [0x0000006a, 0x0000004a, 0x00000323, 0x00000307], // KeyJ - [0x0000006b, 0x0000004b, 0x00000138, 0x00000026], // KeyK - [0x0000006c, 0x0000004c, 0x00000142, 0x00000141], // KeyL - [0x0000006d, 0x0000004d, 0x000000b5, 0x000000ba], // KeyM - [0x0000006e, 0x0000004e, 0x0000201d, 0x00002019], // KeyN - [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO - [0x00000070, 0x00000050, 0x000000fe, 0x000000de], // KeyP - [0x00000071, 0x00000051, 0x00000040, 0x000003a9], // KeyQ - [0x00000072, 0x00000052, 0x000000b6, 0x000000ae], // KeyR - [0x00000073, 0x00000053, 0x0000017f, 0x00001e9e], // KeyS - [0x00000074, 0x00000054, 0x00000167, 0x00000166], // KeyT - [0x00000075, 0x00000055, 0x00002193, 0x00002191], // KeyU - [0x00000076, 0x00000056, 0x0000201e, 0x0000201a], // KeyV - [0x00000077, 0x00000057, 0x00000142, 0x00000141], // KeyW - [0x00000078, 0x00000058, 0x000000ab, 0x00002039], // KeyX - [0x0000007a, 0x0000005a, 0x00002190, 0x000000a5], // KeyY - [0x00000079, 0x00000059, 0x000000bb, 0x0000203a], // KeyZ - [0x00000031, 0x00000021, 0x000000b9, 0x000000a1], // Digit1 - [0x00000032, 0x00000022, 0x000000b2, 0x0000215b], // Digit2 - [0x00000033, 0x000000a7, 0x000000b3, 0x000000a3], // Digit3 - [0x00000034, 0x00000024, 0x000000bc, 0x000000a4], // Digit4 - [0x00000035, 0x00000025, 0x000000bd, 0x0000215c], // Digit5 - [0x00000036, 0x00000026, 0x000000ac, 0x0000215d], // Digit6 - [0x00000037, 0x0000002f, 0x0000007b, 0x0000215e], // Digit7 - [0x00000038, 0x00000028, 0x0000005b, 0x00002122], // Digit8 - [0x00000039, 0x00000029, 0x0000005d, 0x000000b1], // Digit9 - [0x00000030, 0x0000003d, 0x0000007d, 0x000000b0], // Digit0 - [0x000000df, 0x0000003f, 0x0000005c, 0x000000bf], // Minus - [0x00000301, 0x00000300, 0x00000327, 0x00000328], // Equal - [0x000000fc, 0x000000dc, 0x00000308, 0x0000030a], // BracketLeft - [0x0000002b, 0x0000002a, 0x0000007e, 0x000000af], // BracketRight - [0x00000023, 0x00000027, 0x00002019, 0x00000306], // Backslash - [0x000000f6, 0x000000d6, 0x0000030b, 0x00000323], // Semicolon - [0x000000e4, 0x000000c4, 0x00000302, 0x0000030c], // Quote - [0x00000302, 0x000000b0, 0x00002032, 0x00002033], // Backquote - [0x0000002c, 0x0000003b, 0x000000b7, 0x000000d7], // Comma - [0x0000002e, 0x0000003a, 0x00002026, 0x000000f7], // Period - [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Slash - ], - ), - - LayoutInfo( - name: 'de', - platform: LayoutPlatform.darwin, - mapping: >[ - [0x00000061, 0x00000041, 0x000000e5, 0x000000c5], // KeyA - [0x00000062, 0x00000042, 0x0000222b, 0x00002039], // KeyB - [0x00000063, 0x00000043, 0x000000e7, 0x000000c7], // KeyC - [0x00000064, 0x00000044, 0x00002202, 0x00002122], // KeyD - [0x00000065, 0x00000045, 0x000020ac, 0x00002030], // KeyE - [0x00000066, 0x00000046, 0x00000192, 0x000000cf], // KeyF - [0x00000067, 0x00000047, 0x000000a9, 0x000000cc], // KeyG - [0x00000068, 0x00000048, 0x000000aa, 0x000000d3], // KeyH - [0x00000069, 0x00000049, 0x00002044, 0x000000db], // KeyI - [0x0000006a, 0x0000004a, 0x000000ba, 0x00000131], // KeyJ - [0x0000006b, 0x0000004b, 0x00002206, 0x000002c6], // KeyK - [0x0000006c, 0x0000004c, 0x00000040, 0x0000fb02], // KeyL - [0x0000006d, 0x0000004d, 0x000000b5, 0x000002d8], // KeyM - [0x0000006e, 0x0000004e, 0x0000007e, 0x0000203a], // KeyN - [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO - [0x00000070, 0x00000050, 0x000003c0, 0x0000220f], // KeyP - [0x00000071, 0x00000051, 0x000000ab, 0x000000bb], // KeyQ - [0x00000072, 0x00000052, 0x000000ae, 0x000000b8], // KeyR - [0x00000073, 0x00000053, 0x0000201a, 0x000000cd], // KeyS - [0x00000074, 0x00000054, 0x00002020, 0x000002dd], // KeyT - [0x00000075, 0x00000055, 0x000000a8, 0x000000c1], // KeyU - [0x00000076, 0x00000056, 0x0000221a, 0x000025ca], // KeyV - [0x00000077, 0x00000057, 0x00002211, 0x0000201e], // KeyW - [0x00000078, 0x00000058, 0x00002248, 0x000000d9], // KeyX - [0x0000007a, 0x0000005a, 0x000003a9, 0x000002c7], // KeyY - [0x00000079, 0x00000059, 0x000000a5, 0x00002021], // KeyZ - [0x00000031, 0x00000021, 0x000000a1, 0x000000ac], // Digit1 - [0x00000032, 0x00000022, 0x0000201c, 0x0000201d], // Digit2 - [0x00000033, 0x000000a7, 0x000000b6, 0x00000023], // Digit3 - [0x00000034, 0x00000024, 0x000000a2, 0x000000a3], // Digit4 - [0x00000035, 0x00000025, 0x0000005b, 0x0000fb01], // Digit5 - [0x00000036, 0x00000026, 0x0000005d, 0x0000005e], // Digit6 - [0x00000037, 0x0000002f, 0x0000007c, 0x0000005c], // Digit7 - [0x00000038, 0x00000028, 0x0000007b, 0x000002dc], // Digit8 - [0x00000039, 0x00000029, 0x0000007d, 0x000000b7], // Digit9 - [0x00000030, 0x0000003d, 0x00002260, 0x000000af], // Digit0 - [0x000000df, 0x0000003f, 0x000000bf, 0x000002d9], // Minus - [0x000000b4, 0x00000060, 0x00000027, 0x000002da], // Equal - [0x000000fc, 0x000000dc, 0x00002022, 0x000000b0], // BracketLeft - [0x0000002b, 0x0000002a, 0x000000b1, 0x0000f8ff], // BracketRight - [0x00000023, 0x00000027, 0x00002018, 0x00002019], // Backslash - [0x000000f6, 0x000000d6, 0x00000153, 0x00000152], // Semicolon - [0x000000e4, 0x000000c4, 0x000000e6, 0x000000c6], // Quote - [0x0000003c, 0x0000003e, 0x00002264, 0x00002265], // Backquote - [0x0000002c, 0x0000003b, 0x0000221e, 0x000002db], // Comma - [0x0000002e, 0x0000003a, 0x00002026, 0x000000f7], // Period - [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Slash - ], - ), - - LayoutInfo( - name: 'de-swiss', - platform: LayoutPlatform.win, - mapping: >[ - [0x00000061, 0x00000041, 0x00000000, 0x00000000], // KeyA - [0x00000062, 0x00000042, 0x00000000, 0x00000000], // KeyB - [0x00000063, 0x00000043, 0x00000000, 0x00000000], // KeyC - [0x00000064, 0x00000044, 0x00000000, 0x00000000], // KeyD - [0x00000065, 0x00000045, 0x000020ac, 0x00000000], // KeyE - [0x00000066, 0x00000046, 0x00000000, 0x00000000], // KeyF - [0x00000067, 0x00000047, 0x00000000, 0x00000000], // KeyG - [0x00000068, 0x00000048, 0x00000000, 0x00000000], // KeyH - [0x00000069, 0x00000049, 0x00000000, 0x00000000], // KeyI - [0x0000006a, 0x0000004a, 0x00000000, 0x00000000], // KeyJ - [0x0000006b, 0x0000004b, 0x00000000, 0x00000000], // KeyK - [0x0000006c, 0x0000004c, 0x00000000, 0x00000000], // KeyL - [0x0000006d, 0x0000004d, 0x00000000, 0x00000000], // KeyM - [0x0000006e, 0x0000004e, 0x00000000, 0x00000000], // KeyN - [0x0000006f, 0x0000004f, 0x00000000, 0x00000000], // KeyO - [0x00000070, 0x00000050, 0x00000000, 0x00000000], // KeyP - [0x00000071, 0x00000051, 0x00000000, 0x00000000], // KeyQ - [0x00000072, 0x00000052, 0x00000000, 0x00000000], // KeyR - [0x00000073, 0x00000053, 0x00000000, 0x00000000], // KeyS - [0x00000074, 0x00000054, 0x00000000, 0x00000000], // KeyT - [0x00000075, 0x00000055, 0x00000000, 0x00000000], // KeyU - [0x00000076, 0x00000056, 0x00000000, 0x00000000], // KeyV - [0x00000077, 0x00000057, 0x00000000, 0x00000000], // KeyW - [0x00000078, 0x00000058, 0x00000000, 0x00000000], // KeyX - [0x0000007a, 0x0000005a, 0x00000000, 0x00000000], // KeyY - [0x00000079, 0x00000059, 0x00000000, 0x00000000], // KeyZ - [0x00000031, 0x0000002b, 0x000000a6, 0x00000000], // Digit1 - [0x00000032, 0x00000022, 0x00000040, 0x00000000], // Digit2 - [0x00000033, 0x0000002a, 0x00000023, 0x00000000], // Digit3 - [0x00000034, 0x000000e7, 0x000000b0, 0x00000000], // Digit4 - [0x00000035, 0x00000025, 0x000000a7, 0x00000000], // Digit5 - [0x00000036, 0x00000026, 0x000000ac, 0x00000000], // Digit6 - [0x00000037, 0x0000002f, 0x0000007c, 0x00000000], // Digit7 - [0x00000038, 0x00000028, 0x000000a2, 0x00000000], // Digit8 - [0x00000039, 0x00000029, 0x00000000, 0x00000000], // Digit9 - [0x00000030, 0x0000003d, 0x00000000, 0x00000000], // Digit0 - [0x00000027, 0x0000003f, 0x000000b4, 0x00000000], // Minus - [0x0000005e, 0x00000060, 0x0000007e, 0x00000000], // Equal - [0x000000fc, 0x000000e8, 0x0000005b, 0x00000000], // BracketLeft - [0x000000a8, 0x00000021, 0x0000005d, 0x00000000], // BracketRight - [0x00000024, 0x000000a3, 0x0000007d, 0x00000000], // Backslash - [0x000000f6, 0x000000e9, 0x00000000, 0x00000000], // Semicolon - [0x000000e4, 0x000000e0, 0x0000007b, 0x00000000], // Quote - [0x000000a7, 0x000000b0, 0x00000000, 0x00000000], // Backquote - [0x0000002c, 0x0000003b, 0x00000000, 0x00000000], // Comma - [0x0000002e, 0x0000003a, 0x00000000, 0x00000000], // Period - [0x0000002d, 0x0000005f, 0x00000000, 0x00000000], // Slash - ], - ), - - LayoutInfo( - name: 'dk', - platform: LayoutPlatform.win, - mapping: >[ - [0x00000061, 0x00000041, 0x00000000, 0x00000000], // KeyA - [0x00000062, 0x00000042, 0x00000000, 0x00000000], // KeyB - [0x00000063, 0x00000043, 0x00000000, 0x00000000], // KeyC - [0x00000064, 0x00000044, 0x00000000, 0x00000000], // KeyD - [0x00000065, 0x00000045, 0x000020ac, 0x00000000], // KeyE - [0x00000066, 0x00000046, 0x00000000, 0x00000000], // KeyF - [0x00000067, 0x00000047, 0x00000000, 0x00000000], // KeyG - [0x00000068, 0x00000048, 0x00000000, 0x00000000], // KeyH - [0x00000069, 0x00000049, 0x00000000, 0x00000000], // KeyI - [0x0000006a, 0x0000004a, 0x00000000, 0x00000000], // KeyJ - [0x0000006b, 0x0000004b, 0x00000000, 0x00000000], // KeyK - [0x0000006c, 0x0000004c, 0x00000000, 0x00000000], // KeyL - [0x0000006d, 0x0000004d, 0x000000b5, 0x00000000], // KeyM - [0x0000006e, 0x0000004e, 0x00000000, 0x00000000], // KeyN - [0x0000006f, 0x0000004f, 0x00000000, 0x00000000], // KeyO - [0x00000070, 0x00000050, 0x00000000, 0x00000000], // KeyP - [0x00000071, 0x00000051, 0x00000000, 0x00000000], // KeyQ - [0x00000072, 0x00000052, 0x00000000, 0x00000000], // KeyR - [0x00000073, 0x00000053, 0x00000000, 0x00000000], // KeyS - [0x00000074, 0x00000054, 0x00000000, 0x00000000], // KeyT - [0x00000075, 0x00000055, 0x00000000, 0x00000000], // KeyU - [0x00000076, 0x00000056, 0x00000000, 0x00000000], // KeyV - [0x00000077, 0x00000057, 0x00000000, 0x00000000], // KeyW - [0x00000078, 0x00000058, 0x00000000, 0x00000000], // KeyX - [0x00000079, 0x00000059, 0x00000000, 0x00000000], // KeyY - [0x0000007a, 0x0000005a, 0x00000000, 0x00000000], // KeyZ - [0x00000031, 0x00000021, 0x00000000, 0x00000000], // Digit1 - [0x00000032, 0x00000022, 0x00000040, 0x00000000], // Digit2 - [0x00000033, 0x00000023, 0x000000a3, 0x00000000], // Digit3 - [0x00000034, 0x000000a4, 0x00000024, 0x00000000], // Digit4 - [0x00000035, 0x00000025, 0x000020ac, 0x00000000], // Digit5 - [0x00000036, 0x00000026, 0x00000000, 0x00000000], // Digit6 - [0x00000037, 0x0000002f, 0x0000007b, 0x00000000], // Digit7 - [0x00000038, 0x00000028, 0x0000005b, 0x00000000], // Digit8 - [0x00000039, 0x00000029, 0x0000005d, 0x00000000], // Digit9 - [0x00000030, 0x0000003d, 0x0000007d, 0x00000000], // Digit0 - [0x0000002b, 0x0000003f, 0x00000000, 0x00000000], // Minus - [0x000000b4, 0x00000060, 0x0000007c, 0x00000000], // Equal - [0x000000e5, 0x000000c5, 0x00000000, 0x00000000], // BracketLeft - [0x000000a8, 0x0000005e, 0x0000007e, 0x00000000], // BracketRight - [0x00000027, 0x0000002a, 0x00000000, 0x00000000], // Backslash - [0x000000e6, 0x000000c6, 0x00000000, 0x00000000], // Semicolon - [0x000000f8, 0x000000d8, 0x00000000, 0x00000000], // Quote - [0x000000bd, 0x000000a7, 0x00000000, 0x00000000], // Backquote - [0x0000002c, 0x0000003b, 0x00000000, 0x00000000], // Comma - [0x0000002e, 0x0000003a, 0x00000000, 0x00000000], // Period - [0x0000002d, 0x0000005f, 0x00000000, 0x00000000], // Slash - ], - ), - - LayoutInfo( - name: 'dvorak', - platform: LayoutPlatform.darwin, - mapping: >[ - [0x00000061, 0x00000041, 0x000000e5, 0x000000c5], // KeyA - [0x00000078, 0x00000058, 0x00002248, 0x000002db], // KeyB - [0x0000006a, 0x0000004a, 0x00002206, 0x000000d4], // KeyC - [0x00000065, 0x00000045, 0x000000b4, 0x000000b4], // KeyD - [0x0000002e, 0x0000003e, 0x00002265, 0x000002d8], // KeyE - [0x00000075, 0x00000055, 0x000000a8, 0x000000a8], // KeyF - [0x00000069, 0x00000049, 0x000002c6, 0x000002c6], // KeyG - [0x00000064, 0x00000044, 0x00002202, 0x000000ce], // KeyH - [0x00000063, 0x00000043, 0x000000e7, 0x000000c7], // KeyI - [0x00000068, 0x00000048, 0x000002d9, 0x000000d3], // KeyJ - [0x00000074, 0x00000054, 0x00002020, 0x000002c7], // KeyK - [0x0000006e, 0x0000004e, 0x000002dc, 0x000002dc], // KeyL - [0x0000006d, 0x0000004d, 0x000000b5, 0x000000c2], // KeyM - [0x00000062, 0x00000042, 0x0000222b, 0x00000131], // KeyN - [0x00000072, 0x00000052, 0x000000ae, 0x00002030], // KeyO - [0x0000006c, 0x0000004c, 0x000000ac, 0x000000d2], // KeyP - [0x00000027, 0x00000022, 0x000000e6, 0x000000c6], // KeyQ - [0x00000070, 0x00000050, 0x000003c0, 0x0000220f], // KeyR - [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyS - [0x00000079, 0x00000059, 0x000000a5, 0x000000c1], // KeyT - [0x00000067, 0x00000047, 0x000000a9, 0x000002dd], // KeyU - [0x0000006b, 0x0000004b, 0x000002da, 0x0000f8ff], // KeyV - [0x0000002c, 0x0000003c, 0x00002264, 0x000000af], // KeyW - [0x00000071, 0x00000051, 0x00000153, 0x00000152], // KeyX - [0x00000066, 0x00000046, 0x00000192, 0x000000cf], // KeyY - [0x0000003b, 0x0000003a, 0x00002026, 0x000000da], // KeyZ - [0x00000031, 0x00000021, 0x000000a1, 0x00002044], // Digit1 - [0x00000032, 0x00000040, 0x00002122, 0x000020ac], // Digit2 - [0x00000033, 0x00000023, 0x000000a3, 0x00002039], // Digit3 - [0x00000034, 0x00000024, 0x000000a2, 0x0000203a], // Digit4 - [0x00000035, 0x00000025, 0x0000221e, 0x0000fb01], // Digit5 - [0x00000036, 0x0000005e, 0x000000a7, 0x0000fb02], // Digit6 - [0x00000037, 0x00000026, 0x000000b6, 0x00002021], // Digit7 - [0x00000038, 0x0000002a, 0x00002022, 0x000000b0], // Digit8 - [0x00000039, 0x00000028, 0x000000aa, 0x000000b7], // Digit9 - [0x00000030, 0x00000029, 0x000000ba, 0x0000201a], // Digit0 - [0x0000005b, 0x0000007b, 0x0000201c, 0x0000201d], // Minus - [0x0000005d, 0x0000007d, 0x00002018, 0x00002019], // Equal - [0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf], // BracketLeft - [0x0000003d, 0x0000002b, 0x00002260, 0x000000b1], // BracketRight - [0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb], // Backslash - [0x00000073, 0x00000053, 0x000000df, 0x000000cd], // Semicolon - [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Quote - [0x00000060, 0x0000007e, 0x00000060, 0x00000060], // Backquote - [0x00000077, 0x00000057, 0x00002211, 0x0000201e], // Comma - [0x00000076, 0x00000056, 0x0000221a, 0x000025ca], // Period - [0x0000007a, 0x0000005a, 0x000003a9, 0x000000b8], // Slash - ], - ), - - LayoutInfo( - name: 'en', - platform: LayoutPlatform.win, - mapping: >[ - [0x00000061, 0x00000041, 0x00000000, 0x00000000], // KeyA - [0x00000062, 0x00000042, 0x00000000, 0x00000000], // KeyB - [0x00000063, 0x00000043, 0x00000000, 0x00000000], // KeyC - [0x00000064, 0x00000044, 0x00000000, 0x00000000], // KeyD - [0x00000065, 0x00000045, 0x00000000, 0x00000000], // KeyE - [0x00000066, 0x00000046, 0x00000000, 0x00000000], // KeyF - [0x00000067, 0x00000047, 0x00000000, 0x00000000], // KeyG - [0x00000068, 0x00000048, 0x00000000, 0x00000000], // KeyH - [0x00000069, 0x00000049, 0x00000000, 0x00000000], // KeyI - [0x0000006a, 0x0000004a, 0x00000000, 0x00000000], // KeyJ - [0x0000006b, 0x0000004b, 0x00000000, 0x00000000], // KeyK - [0x0000006c, 0x0000004c, 0x00000000, 0x00000000], // KeyL - [0x0000006d, 0x0000004d, 0x00000000, 0x00000000], // KeyM - [0x0000006e, 0x0000004e, 0x00000000, 0x00000000], // KeyN - [0x0000006f, 0x0000004f, 0x00000000, 0x00000000], // KeyO - [0x00000070, 0x00000050, 0x00000000, 0x00000000], // KeyP - [0x00000071, 0x00000051, 0x00000000, 0x00000000], // KeyQ - [0x00000072, 0x00000052, 0x00000000, 0x00000000], // KeyR - [0x00000073, 0x00000053, 0x00000000, 0x00000000], // KeyS - [0x00000074, 0x00000054, 0x00000000, 0x00000000], // KeyT - [0x00000075, 0x00000055, 0x00000000, 0x00000000], // KeyU - [0x00000076, 0x00000056, 0x00000000, 0x00000000], // KeyV - [0x00000077, 0x00000057, 0x00000000, 0x00000000], // KeyW - [0x00000078, 0x00000058, 0x00000000, 0x00000000], // KeyX - [0x00000079, 0x00000059, 0x00000000, 0x00000000], // KeyY - [0x0000007a, 0x0000005a, 0x00000000, 0x00000000], // KeyZ - [0x00000031, 0x00000021, 0x00000000, 0x00000000], // Digit1 - [0x00000032, 0x00000040, 0x00000000, 0x00000000], // Digit2 - [0x00000033, 0x00000023, 0x00000000, 0x00000000], // Digit3 - [0x00000034, 0x00000024, 0x00000000, 0x00000000], // Digit4 - [0x00000035, 0x00000025, 0x00000000, 0x00000000], // Digit5 - [0x00000036, 0x0000005e, 0x00000000, 0x00000000], // Digit6 - [0x00000037, 0x00000026, 0x00000000, 0x00000000], // Digit7 - [0x00000038, 0x0000002a, 0x00000000, 0x00000000], // Digit8 - [0x00000039, 0x00000028, 0x00000000, 0x00000000], // Digit9 - [0x00000030, 0x00000029, 0x00000000, 0x00000000], // Digit0 - [0x0000002d, 0x0000005f, 0x00000000, 0x00000000], // Minus - [0x0000003d, 0x0000002b, 0x00000000, 0x00000000], // Equal - [0x0000005b, 0x0000007b, 0x00000000, 0x00000000], // BracketLeft - [0x0000005d, 0x0000007d, 0x00000000, 0x00000000], // BracketRight - [0x0000005c, 0x0000007c, 0x00000000, 0x00000000], // Backslash - [0x0000003b, 0x0000003a, 0x00000000, 0x00000000], // Semicolon - [0x00000027, 0x00000022, 0x00000000, 0x00000000], // Quote - [0x00000060, 0x0000007e, 0x00000000, 0x00000000], // Backquote - [0x0000002c, 0x0000003c, 0x00000000, 0x00000000], // Comma - [0x0000002e, 0x0000003e, 0x00000000, 0x00000000], // Period - [0x0000002f, 0x0000003f, 0x00000000, 0x00000000], // Slash - ], - ), - - LayoutInfo( - name: 'en', - platform: LayoutPlatform.linux, - mapping: >[ - [0x00000061, 0x00000041, 0x00000061, 0x00000041], // KeyA - [0x00000062, 0x00000042, 0x00000062, 0x00000042], // KeyB - [0x00000063, 0x00000043, 0x00000063, 0x00000043], // KeyC - [0x00000064, 0x00000044, 0x00000064, 0x00000044], // KeyD - [0x00000065, 0x00000045, 0x00000065, 0x00000045], // KeyE - [0x00000066, 0x00000046, 0x00000066, 0x00000046], // KeyF - [0x00000067, 0x00000047, 0x00000067, 0x00000047], // KeyG - [0x00000068, 0x00000048, 0x00000068, 0x00000048], // KeyH - [0x00000069, 0x00000049, 0x00000069, 0x00000049], // KeyI - [0x0000006a, 0x0000004a, 0x0000006a, 0x0000004a], // KeyJ - [0x0000006b, 0x0000004b, 0x0000006b, 0x0000004b], // KeyK - [0x0000006c, 0x0000004c, 0x0000006c, 0x0000004c], // KeyL - [0x0000006d, 0x0000004d, 0x0000006d, 0x0000004d], // KeyM - [0x0000006e, 0x0000004e, 0x0000006e, 0x0000004e], // KeyN - [0x0000006f, 0x0000004f, 0x0000006f, 0x0000004f], // KeyO - [0x00000070, 0x00000050, 0x00000070, 0x00000050], // KeyP - [0x00000071, 0x00000051, 0x00000071, 0x00000051], // KeyQ - [0x00000072, 0x00000052, 0x00000072, 0x00000052], // KeyR - [0x00000073, 0x00000053, 0x00000073, 0x00000053], // KeyS - [0x00000074, 0x00000054, 0x00000074, 0x00000054], // KeyT - [0x00000075, 0x00000055, 0x00000075, 0x00000055], // KeyU - [0x00000076, 0x00000056, 0x00000076, 0x00000056], // KeyV - [0x00000077, 0x00000057, 0x00000077, 0x00000057], // KeyW - [0x00000078, 0x00000058, 0x00000078, 0x00000058], // KeyX - [0x00000079, 0x00000059, 0x00000079, 0x00000059], // KeyY - [0x0000007a, 0x0000005a, 0x0000007a, 0x0000005a], // KeyZ - [0x00000031, 0x00000021, 0x00000031, 0x00000021], // Digit1 - [0x00000032, 0x00000040, 0x00000032, 0x00000040], // Digit2 - [0x00000033, 0x00000023, 0x00000033, 0x00000023], // Digit3 - [0x00000034, 0x00000024, 0x00000034, 0x00000024], // Digit4 - [0x00000035, 0x00000025, 0x00000035, 0x00000025], // Digit5 - [0x00000036, 0x0000005e, 0x00000036, 0x0000005e], // Digit6 - [0x00000037, 0x00000026, 0x00000037, 0x00000026], // Digit7 - [0x00000038, 0x0000002a, 0x00000038, 0x0000002a], // Digit8 - [0x00000039, 0x00000028, 0x00000039, 0x00000028], // Digit9 - [0x00000030, 0x00000029, 0x00000030, 0x00000029], // Digit0 - [0x0000002d, 0x0000005f, 0x0000002d, 0x0000005f], // Minus - [0x0000003d, 0x0000002b, 0x0000003d, 0x0000002b], // Equal - [0x0000005b, 0x0000007b, 0x0000005b, 0x0000007b], // BracketLeft - [0x0000005d, 0x0000007d, 0x0000005d, 0x0000007d], // BracketRight - [0x0000005c, 0x0000007c, 0x0000005c, 0x0000007c], // Backslash - [0x0000003b, 0x0000003a, 0x0000003b, 0x0000003a], // Semicolon - [0x00000027, 0x00000022, 0x00000027, 0x00000022], // Quote - [0x00000060, 0x0000007e, 0x00000060, 0x0000007e], // Backquote - [0x0000002c, 0x0000003c, 0x0000002c, 0x0000003c], // Comma - [0x0000002e, 0x0000003e, 0x0000002e, 0x0000003e], // Period - [0x0000002f, 0x0000003f, 0x0000002f, 0x0000003f], // Slash - ], - ), - - LayoutInfo( - name: 'en', - platform: LayoutPlatform.darwin, - mapping: >[ - [0x00000061, 0x00000041, 0x000000e5, 0x000000c5], // KeyA - [0x00000062, 0x00000042, 0x0000222b, 0x00000131], // KeyB - [0x00000063, 0x00000043, 0x000000e7, 0x000000c7], // KeyC - [0x00000064, 0x00000044, 0x00002202, 0x000000ce], // KeyD - [0x00000065, 0x00000045, 0x000000b4, 0x000000b4], // KeyE - [0x00000066, 0x00000046, 0x00000192, 0x000000cf], // KeyF - [0x00000067, 0x00000047, 0x000000a9, 0x000002dd], // KeyG - [0x00000068, 0x00000048, 0x000002d9, 0x000000d3], // KeyH - [0x00000069, 0x00000049, 0x000002c6, 0x000002c6], // KeyI - [0x0000006a, 0x0000004a, 0x00002206, 0x000000d4], // KeyJ - [0x0000006b, 0x0000004b, 0x000002da, 0x0000f8ff], // KeyK - [0x0000006c, 0x0000004c, 0x000000ac, 0x000000d2], // KeyL - [0x0000006d, 0x0000004d, 0x000000b5, 0x000000c2], // KeyM - [0x0000006e, 0x0000004e, 0x000002dc, 0x000002dc], // KeyN - [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO - [0x00000070, 0x00000050, 0x000003c0, 0x0000220f], // KeyP - [0x00000071, 0x00000051, 0x00000153, 0x00000152], // KeyQ - [0x00000072, 0x00000052, 0x000000ae, 0x00002030], // KeyR - [0x00000073, 0x00000053, 0x000000df, 0x000000cd], // KeyS - [0x00000074, 0x00000054, 0x00002020, 0x000002c7], // KeyT - [0x00000075, 0x00000055, 0x000000a8, 0x000000a8], // KeyU - [0x00000076, 0x00000056, 0x0000221a, 0x000025ca], // KeyV - [0x00000077, 0x00000057, 0x00002211, 0x0000201e], // KeyW - [0x00000078, 0x00000058, 0x00002248, 0x000002db], // KeyX - [0x00000079, 0x00000059, 0x000000a5, 0x000000c1], // KeyY - [0x0000007a, 0x0000005a, 0x000003a9, 0x000000b8], // KeyZ - [0x00000031, 0x00000021, 0x000000a1, 0x00002044], // Digit1 - [0x00000032, 0x00000040, 0x00002122, 0x000020ac], // Digit2 - [0x00000033, 0x00000023, 0x000000a3, 0x00002039], // Digit3 - [0x00000034, 0x00000024, 0x000000a2, 0x0000203a], // Digit4 - [0x00000035, 0x00000025, 0x0000221e, 0x0000fb01], // Digit5 - [0x00000036, 0x0000005e, 0x000000a7, 0x0000fb02], // Digit6 - [0x00000037, 0x00000026, 0x000000b6, 0x00002021], // Digit7 - [0x00000038, 0x0000002a, 0x00002022, 0x000000b0], // Digit8 - [0x00000039, 0x00000028, 0x000000aa, 0x000000b7], // Digit9 - [0x00000030, 0x00000029, 0x000000ba, 0x0000201a], // Digit0 - [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Minus - [0x0000003d, 0x0000002b, 0x00002260, 0x000000b1], // Equal - [0x0000005b, 0x0000007b, 0x0000201c, 0x0000201d], // BracketLeft - [0x0000005d, 0x0000007d, 0x00002018, 0x00002019], // BracketRight - [0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb], // Backslash - [0x0000003b, 0x0000003a, 0x00002026, 0x000000da], // Semicolon - [0x00000027, 0x00000022, 0x000000e6, 0x000000c6], // Quote - [0x00000060, 0x0000007e, 0x00000060, 0x00000060], // Backquote - [0x0000002c, 0x0000003c, 0x00002264, 0x000000af], // Comma - [0x0000002e, 0x0000003e, 0x00002265, 0x000002d8], // Period - [0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf], // Slash - ], - ), - - LayoutInfo( - name: 'en-belgian', - platform: LayoutPlatform.win, - mapping: >[ - [0x00000071, 0x00000051, 0x00000000, 0x00000000], // KeyA - [0x00000062, 0x00000042, 0x00000000, 0x00000000], // KeyB - [0x00000063, 0x00000043, 0x00000000, 0x00000000], // KeyC - [0x00000064, 0x00000044, 0x00000000, 0x00000000], // KeyD - [0x00000065, 0x00000045, 0x000020ac, 0x00000000], // KeyE - [0x00000066, 0x00000046, 0x00000000, 0x00000000], // KeyF - [0x00000067, 0x00000047, 0x00000000, 0x00000000], // KeyG - [0x00000068, 0x00000048, 0x00000000, 0x00000000], // KeyH - [0x00000069, 0x00000049, 0x00000000, 0x00000000], // KeyI - [0x0000006a, 0x0000004a, 0x00000000, 0x00000000], // KeyJ - [0x0000006b, 0x0000004b, 0x00000000, 0x00000000], // KeyK - [0x0000006c, 0x0000004c, 0x00000000, 0x00000000], // KeyL - [0x0000002c, 0x0000003f, 0x00000000, 0x00000000], // KeyM - [0x0000006e, 0x0000004e, 0x00000000, 0x00000000], // KeyN - [0x0000006f, 0x0000004f, 0x00000000, 0x00000000], // KeyO - [0x00000070, 0x00000050, 0x00000000, 0x00000000], // KeyP - [0x00000061, 0x00000041, 0x00000000, 0x00000000], // KeyQ - [0x00000072, 0x00000052, 0x00000000, 0x00000000], // KeyR - [0x00000073, 0x00000053, 0x00000000, 0x00000000], // KeyS - [0x00000074, 0x00000054, 0x00000000, 0x00000000], // KeyT - [0x00000075, 0x00000055, 0x00000000, 0x00000000], // KeyU - [0x00000076, 0x00000056, 0x00000000, 0x00000000], // KeyV - [0x0000007a, 0x0000005a, 0x00000000, 0x00000000], // KeyW - [0x00000078, 0x00000058, 0x00000000, 0x00000000], // KeyX - [0x00000079, 0x00000059, 0x00000000, 0x00000000], // KeyY - [0x00000077, 0x00000057, 0x00000000, 0x00000000], // KeyZ - [0x00000026, 0x00000031, 0x0000007c, 0x00000000], // Digit1 - [0x000000e9, 0x00000032, 0x00000040, 0x00000000], // Digit2 - [0x00000022, 0x00000033, 0x00000023, 0x00000000], // Digit3 - [0x00000027, 0x00000034, 0x0000007b, 0x00000000], // Digit4 - [0x00000028, 0x00000035, 0x0000005b, 0x00000000], // Digit5 - [0x000000a7, 0x00000036, 0x0000005e, 0x00000000], // Digit6 - [0x000000e8, 0x00000037, 0x00000000, 0x00000000], // Digit7 - [0x00000021, 0x00000038, 0x00000000, 0x00000000], // Digit8 - [0x000000e7, 0x00000039, 0x0000007b, 0x00000000], // Digit9 - [0x000000e0, 0x00000030, 0x0000007d, 0x00000000], // Digit0 - [0x00000029, 0x000000b0, 0x00000000, 0x00000000], // Minus - [0x0000002d, 0x0000005f, 0x00000000, 0x00000000], // Equal - [0x0000005e, 0x000000a8, 0x0000005b, 0x00000000], // BracketLeft - [0x00000024, 0x0000002a, 0x0000005d, 0x00000000], // BracketRight - [0x000000b5, 0x000000a3, 0x00000060, 0x00000060], // Backslash - [0x0000006d, 0x0000004d, 0x00000000, 0x00000000], // Semicolon - [0x000000f9, 0x00000025, 0x000000b4, 0x000000b4], // Quote - [0x000000b2, 0x000000b3, 0x00000000, 0x00000000], // Backquote - [0x0000003b, 0x0000002e, 0x00000000, 0x00000000], // Comma - [0x0000003a, 0x0000002f, 0x00000000, 0x00000000], // Period - [0x0000003d, 0x0000002b, 0x0000007e, 0x0000007e], // Slash - ], - ), - - LayoutInfo( - name: 'en-ext', - platform: LayoutPlatform.darwin, - mapping: >[ - [0x00000061, 0x00000041, 0x000000af, 0x00000304], // KeyA - [0x00000062, 0x00000042, 0x000002d8, 0x00000306], // KeyB - [0x00000063, 0x00000043, 0x000000b8, 0x00000327], // KeyC - [0x00000064, 0x00000044, 0x000000f0, 0x000000d0], // KeyD - [0x00000065, 0x00000045, 0x000000b4, 0x00000301], // KeyE - [0x00000066, 0x00000046, 0x00000192, 0x00000000], // KeyF - [0x00000067, 0x00000047, 0x000000a9, 0x00002038], // KeyG - [0x00000068, 0x00000048, 0x000002cd, 0x00000331], // KeyH - [0x00000069, 0x00000049, 0x000002bc, 0x0000031b], // KeyI - [0x0000006a, 0x0000004a, 0x000002dd, 0x0000030b], // KeyJ - [0x0000006b, 0x0000004b, 0x000002da, 0x0000030a], // KeyK - [0x0000006c, 0x0000004c, 0x0000002d, 0x00000335], // KeyL - [0x0000006d, 0x0000004d, 0x000002db, 0x00000328], // KeyM - [0x0000006e, 0x0000004e, 0x000002dc, 0x00000303], // KeyN - [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO - [0x00000070, 0x00000050, 0x0000002c, 0x00000326], // KeyP - [0x00000071, 0x00000051, 0x00000153, 0x00000152], // KeyQ - [0x00000072, 0x00000052, 0x000000ae, 0x00002030], // KeyR - [0x00000073, 0x00000053, 0x000000df, 0x00000000], // KeyS - [0x00000074, 0x00000054, 0x000000fe, 0x000000de], // KeyT - [0x00000075, 0x00000055, 0x000000a8, 0x00000308], // KeyU - [0x00000076, 0x00000056, 0x000002c7, 0x0000030c], // KeyV - [0x00000077, 0x00000057, 0x000002d9, 0x00000307], // KeyW - [0x00000078, 0x00000058, 0x0000002e, 0x00000323], // KeyX - [0x00000079, 0x00000059, 0x000000a5, 0x00000000], // KeyY - [0x0000007a, 0x0000005a, 0x000002c0, 0x00000309], // KeyZ - [0x00000031, 0x00000021, 0x000000a1, 0x00002044], // Digit1 - [0x00000032, 0x00000040, 0x00002122, 0x000020ac], // Digit2 - [0x00000033, 0x00000023, 0x000000a3, 0x00002039], // Digit3 - [0x00000034, 0x00000024, 0x000000a2, 0x0000203a], // Digit4 - [0x00000035, 0x00000025, 0x000000a7, 0x00002020], // Digit5 - [0x00000036, 0x0000005e, 0x000002c6, 0x00000302], // Digit6 - [0x00000037, 0x00000026, 0x000000b6, 0x00002021], // Digit7 - [0x00000038, 0x0000002a, 0x00002022, 0x000000b0], // Digit8 - [0x00000039, 0x00000028, 0x000000aa, 0x000000b7], // Digit9 - [0x00000030, 0x00000029, 0x000000ba, 0x0000201a], // Digit0 - [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Minus - [0x0000003d, 0x0000002b, 0x00002260, 0x000000b1], // Equal - [0x0000005b, 0x0000007b, 0x0000201c, 0x0000201d], // BracketLeft - [0x0000005d, 0x0000007d, 0x00002018, 0x00002019], // BracketRight - [0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb], // Backslash - [0x0000003b, 0x0000003a, 0x00002026, 0x00002116], // Semicolon - [0x00000027, 0x00000022, 0x000000e6, 0x000000c6], // Quote - [0x00000060, 0x0000007e, 0x00000060, 0x00000300], // Backquote - [0x0000002c, 0x0000003c, 0x00002264, 0x0000201e], // Comma - [0x0000002e, 0x0000003e, 0x00002265, 0x00000294], // Period - [0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf], // Slash - ], - ), - - LayoutInfo( - name: 'en-in', - platform: LayoutPlatform.win, - mapping: >[ - [0x00000061, 0x00000041, 0x00000101, 0x00000100], // KeyA - [0x00000062, 0x00000042, 0x00000000, 0x00000000], // KeyB - [0x00000063, 0x00000043, 0x00000000, 0x00000000], // KeyC - [0x00000064, 0x00000044, 0x00001e0d, 0x00001e0c], // KeyD - [0x00000065, 0x00000045, 0x00000113, 0x00000112], // KeyE - [0x00000066, 0x00000046, 0x00000000, 0x00000000], // KeyF - [0x00000067, 0x00000047, 0x00001e45, 0x00001e44], // KeyG - [0x00000068, 0x00000048, 0x00001e25, 0x00001e24], // KeyH - [0x00000069, 0x00000049, 0x0000012b, 0x0000012a], // KeyI - [0x0000006a, 0x0000004a, 0x00000000, 0x00000000], // KeyJ - [0x0000006b, 0x0000004b, 0x00000000, 0x00000000], // KeyK - [0x0000006c, 0x0000004c, 0x0000006c, 0x0000004c], // KeyL - [0x0000006d, 0x0000004d, 0x00001e41, 0x00001e40], // KeyM - [0x0000006e, 0x0000004e, 0x00001e47, 0x00001e46], // KeyN - [0x0000006f, 0x0000004f, 0x0000014d, 0x0000014c], // KeyO - [0x00000070, 0x00000050, 0x00000000, 0x00000000], // KeyP - [0x00000071, 0x00000051, 0x000000e6, 0x000000c6], // KeyQ - [0x00000072, 0x00000052, 0x00000072, 0x00000052], // KeyR - [0x00000073, 0x00000053, 0x0000015b, 0x0000015a], // KeyS - [0x00000074, 0x00000054, 0x00001e6d, 0x00001e6c], // KeyT - [0x00000075, 0x00000055, 0x0000016b, 0x0000016a], // KeyU - [0x00000076, 0x00000056, 0x00000000, 0x00000000], // KeyV - [0x00000077, 0x00000057, 0x00000000, 0x00000000], // KeyW - [0x00000078, 0x00000058, 0x00001e63, 0x00001e62], // KeyX - [0x00000079, 0x00000059, 0x000000f1, 0x000000d1], // KeyY - [0x0000007a, 0x0000005a, 0x00000000, 0x00000000], // KeyZ - [0x00000031, 0x00000021, 0x00000000, 0x00000000], // Digit1 - [0x00000032, 0x00000040, 0x00000000, 0x00000000], // Digit2 - [0x00000033, 0x00000023, 0x00000000, 0x00000000], // Digit3 - [0x00000034, 0x00000024, 0x000020b9, 0x00000000], // Digit4 - [0x00000035, 0x00000025, 0x00000000, 0x00000000], // Digit5 - [0x00000036, 0x0000005e, 0x00000000, 0x000002c6], // Digit6 - [0x00000037, 0x00000026, 0x00000000, 0x00000000], // Digit7 - [0x00000038, 0x0000002a, 0x00000000, 0x00000000], // Digit8 - [0x00000039, 0x00000028, 0x00000000, 0x000002d8], // Digit9 - [0x00000030, 0x00000029, 0x00000000, 0x00000000], // Digit0 - [0x0000002d, 0x0000005f, 0x0000002d, 0x000002cd], // Minus - [0x0000003d, 0x0000002b, 0x00000000, 0x00000000], // Equal - [0x0000005b, 0x0000007b, 0x00000000, 0x00000000], // BracketLeft - [0x0000005d, 0x0000007d, 0x00000000, 0x00000000], // BracketRight - [0x0000005c, 0x0000007c, 0x00000000, 0x00000000], // Backslash - [0x0000003b, 0x0000003a, 0x00000000, 0x00000000], // Semicolon - [0x00000027, 0x00000022, 0x00000000, 0x00000000], // Quote - [0x00000060, 0x0000007e, 0x00000000, 0x0000007e], // Backquote - [0x0000002c, 0x0000003c, 0x0000002c, 0x0000003c], // Comma - [0x0000002e, 0x0000003e, 0x0000002e, 0x00000000], // Period - [0x0000002f, 0x0000003f, 0x00000000, 0x00000000], // Slash - ], - ), - - LayoutInfo( - name: 'en-intl', - platform: LayoutPlatform.win, - mapping: >[ - [0x00000061, 0x00000041, 0x000000e1, 0x000000c1], // KeyA - [0x00000062, 0x00000042, 0x00000000, 0x00000000], // KeyB - [0x00000063, 0x00000043, 0x000000a9, 0x000000a2], // KeyC - [0x00000064, 0x00000044, 0x000000f0, 0x000000d0], // KeyD - [0x00000065, 0x00000045, 0x000000e9, 0x000000c9], // KeyE - [0x00000066, 0x00000046, 0x00000000, 0x00000000], // KeyF - [0x00000067, 0x00000047, 0x00000000, 0x00000000], // KeyG - [0x00000068, 0x00000048, 0x00000000, 0x00000000], // KeyH - [0x00000069, 0x00000049, 0x000000ed, 0x000000cd], // KeyI - [0x0000006a, 0x0000004a, 0x00000000, 0x00000000], // KeyJ - [0x0000006b, 0x0000004b, 0x00000000, 0x00000000], // KeyK - [0x0000006c, 0x0000004c, 0x000000f8, 0x000000d8], // KeyL - [0x0000006d, 0x0000004d, 0x000000b5, 0x00000000], // KeyM - [0x0000006e, 0x0000004e, 0x000000f1, 0x000000d1], // KeyN - [0x0000006f, 0x0000004f, 0x000000f3, 0x000000d3], // KeyO - [0x00000070, 0x00000050, 0x000000f6, 0x000000d6], // KeyP - [0x00000071, 0x00000051, 0x000000e4, 0x000000c4], // KeyQ - [0x00000072, 0x00000052, 0x000000ae, 0x00000000], // KeyR - [0x00000073, 0x00000053, 0x000000df, 0x000000a7], // KeyS - [0x00000074, 0x00000054, 0x000000fe, 0x000000de], // KeyT - [0x00000075, 0x00000055, 0x000000fa, 0x000000da], // KeyU - [0x00000076, 0x00000056, 0x00000000, 0x00000000], // KeyV - [0x00000077, 0x00000057, 0x000000e5, 0x000000c5], // KeyW - [0x00000078, 0x00000058, 0x00000000, 0x00000000], // KeyX - [0x00000079, 0x00000059, 0x000000fc, 0x000000dc], // KeyY - [0x0000007a, 0x0000005a, 0x000000e6, 0x000000c6], // KeyZ - [0x00000031, 0x00000021, 0x000000a1, 0x000000b9], // Digit1 - [0x00000032, 0x00000040, 0x000000b2, 0x00000000], // Digit2 - [0x00000033, 0x00000023, 0x000000b3, 0x00000000], // Digit3 - [0x00000034, 0x00000024, 0x000000a4, 0x000000a3], // Digit4 - [0x00000035, 0x00000025, 0x000020ac, 0x00000000], // Digit5 - [0x00000036, 0x0000005e, 0x000000bc, 0x00000000], // Digit6 - [0x00000037, 0x00000026, 0x000000bd, 0x00000000], // Digit7 - [0x00000038, 0x0000002a, 0x000000be, 0x00000000], // Digit8 - [0x00000039, 0x00000028, 0x00002018, 0x00000000], // Digit9 - [0x00000030, 0x00000029, 0x00002019, 0x00000000], // Digit0 - [0x0000002d, 0x0000005f, 0x000000a5, 0x00000000], // Minus - [0x0000003d, 0x0000002b, 0x000000d7, 0x000000f7], // Equal - [0x0000005b, 0x0000007b, 0x000000ab, 0x00000000], // BracketLeft - [0x0000005d, 0x0000007d, 0x000000bb, 0x00000000], // BracketRight - [0x0000005c, 0x0000007c, 0x000000ac, 0x000000a6], // Backslash - [0x0000003b, 0x0000003a, 0x000000b6, 0x000000b0], // Semicolon - [0x00000027, 0x00000022, 0x000000b4, 0x000000a8], // Quote - [0x00000060, 0x0000007e, 0x00000000, 0x00000000], // Backquote - [0x0000002c, 0x0000003c, 0x000000e7, 0x000000c7], // Comma - [0x0000002e, 0x0000003e, 0x00000000, 0x00000000], // Period - [0x0000002f, 0x0000003f, 0x000000bf, 0x00000000], // Slash - ], - ), - - LayoutInfo( - name: 'en-intl', - platform: LayoutPlatform.darwin, - mapping: >[ - [0x00000061, 0x00000041, 0x000000e5, 0x000000c5], // KeyA - [0x00000062, 0x00000042, 0x0000222b, 0x00000131], // KeyB - [0x00000063, 0x00000043, 0x000000e7, 0x000000c7], // KeyC - [0x00000064, 0x00000044, 0x00002202, 0x000000ce], // KeyD - [0x00000065, 0x00000045, 0x000000b4, 0x000000b4], // KeyE - [0x00000066, 0x00000046, 0x00000192, 0x000000cf], // KeyF - [0x00000067, 0x00000047, 0x000000a9, 0x000002dd], // KeyG - [0x00000068, 0x00000048, 0x000002d9, 0x000000d3], // KeyH - [0x00000069, 0x00000049, 0x000002c6, 0x000002c6], // KeyI - [0x0000006a, 0x0000004a, 0x00002206, 0x000000d4], // KeyJ - [0x0000006b, 0x0000004b, 0x000002da, 0x0000f8ff], // KeyK - [0x0000006c, 0x0000004c, 0x000000ac, 0x000000d2], // KeyL - [0x0000006d, 0x0000004d, 0x000000b5, 0x000000c2], // KeyM - [0x0000006e, 0x0000004e, 0x000002dc, 0x000002dc], // KeyN - [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO - [0x00000070, 0x00000050, 0x000003c0, 0x0000220f], // KeyP - [0x00000071, 0x00000051, 0x00000153, 0x00000152], // KeyQ - [0x00000072, 0x00000052, 0x000000ae, 0x00002030], // KeyR - [0x00000073, 0x00000053, 0x000000df, 0x000000cd], // KeyS - [0x00000074, 0x00000054, 0x00002020, 0x000002c7], // KeyT - [0x00000075, 0x00000055, 0x000000a8, 0x000000a8], // KeyU - [0x00000076, 0x00000056, 0x0000221a, 0x000025ca], // KeyV - [0x00000077, 0x00000057, 0x00002211, 0x0000201e], // KeyW - [0x00000078, 0x00000058, 0x00002248, 0x000002db], // KeyX - [0x00000079, 0x00000059, 0x000000a5, 0x000000c1], // KeyY - [0x0000007a, 0x0000005a, 0x000003a9, 0x000000b8], // KeyZ - [0x00000031, 0x00000021, 0x000000a1, 0x00002044], // Digit1 - [0x00000032, 0x00000040, 0x00002122, 0x000020ac], // Digit2 - [0x00000033, 0x00000023, 0x000000a3, 0x00002039], // Digit3 - [0x00000034, 0x00000024, 0x000000a2, 0x0000203a], // Digit4 - [0x00000035, 0x00000025, 0x0000221e, 0x0000fb01], // Digit5 - [0x00000036, 0x000002c6, 0x000000a7, 0x0000fb02], // Digit6 - [0x00000037, 0x00000026, 0x000000b6, 0x00002021], // Digit7 - [0x00000038, 0x0000002a, 0x00002022, 0x000000b0], // Digit8 - [0x00000039, 0x00000028, 0x000000aa, 0x000000b7], // Digit9 - [0x00000030, 0x00000029, 0x000000ba, 0x0000201a], // Digit0 - [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Minus - [0x0000003d, 0x0000002b, 0x00002260, 0x000000b1], // Equal - [0x0000005b, 0x0000007b, 0x0000201c, 0x0000201d], // BracketLeft - [0x0000005d, 0x0000007d, 0x00002018, 0x00002019], // BracketRight - [0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb], // Backslash - [0x0000003b, 0x0000003a, 0x00002026, 0x000000da], // Semicolon - [0x00000027, 0x00000022, 0x000000e6, 0x000000c6], // Quote - [0x00000060, 0x000002dc, 0x00000060, 0x00000060], // Backquote - [0x0000002c, 0x0000003c, 0x00002264, 0x000000af], // Comma - [0x0000002e, 0x0000003e, 0x00002265, 0x000002d8], // Period - [0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf], // Slash - ], - ), - - LayoutInfo( - name: 'en-uk', - platform: LayoutPlatform.win, - mapping: >[ - [0x00000061, 0x00000041, 0x000000e1, 0x000000c1], // KeyA - [0x00000062, 0x00000042, 0x00000000, 0x00000000], // KeyB - [0x00000063, 0x00000043, 0x00000000, 0x00000000], // KeyC - [0x00000064, 0x00000044, 0x00000000, 0x00000000], // KeyD - [0x00000065, 0x00000045, 0x000000e9, 0x000000c9], // KeyE - [0x00000066, 0x00000046, 0x00000000, 0x00000000], // KeyF - [0x00000067, 0x00000047, 0x00000000, 0x00000000], // KeyG - [0x00000068, 0x00000048, 0x00000000, 0x00000000], // KeyH - [0x00000069, 0x00000049, 0x000000ed, 0x000000cd], // KeyI - [0x0000006a, 0x0000004a, 0x00000000, 0x00000000], // KeyJ - [0x0000006b, 0x0000004b, 0x00000000, 0x00000000], // KeyK - [0x0000006c, 0x0000004c, 0x00000000, 0x00000000], // KeyL - [0x0000006d, 0x0000004d, 0x00000000, 0x00000000], // KeyM - [0x0000006e, 0x0000004e, 0x00000000, 0x00000000], // KeyN - [0x0000006f, 0x0000004f, 0x000000f3, 0x000000d3], // KeyO - [0x00000070, 0x00000050, 0x00000000, 0x00000000], // KeyP - [0x00000071, 0x00000051, 0x00000000, 0x00000000], // KeyQ - [0x00000072, 0x00000052, 0x00000000, 0x00000000], // KeyR - [0x00000073, 0x00000053, 0x00000000, 0x00000000], // KeyS - [0x00000074, 0x00000054, 0x00000000, 0x00000000], // KeyT - [0x00000075, 0x00000055, 0x000000fa, 0x000000da], // KeyU - [0x00000076, 0x00000056, 0x00000000, 0x00000000], // KeyV - [0x00000077, 0x00000057, 0x00000000, 0x00000000], // KeyW - [0x00000078, 0x00000058, 0x00000000, 0x00000000], // KeyX - [0x00000079, 0x00000059, 0x00000000, 0x00000000], // KeyY - [0x0000007a, 0x0000005a, 0x00000000, 0x00000000], // KeyZ - [0x00000031, 0x00000021, 0x00000000, 0x00000000], // Digit1 - [0x00000032, 0x00000022, 0x00000000, 0x00000000], // Digit2 - [0x00000033, 0x000000a3, 0x00000000, 0x00000000], // Digit3 - [0x00000034, 0x00000024, 0x000020ac, 0x00000000], // Digit4 - [0x00000035, 0x00000025, 0x00000000, 0x00000000], // Digit5 - [0x00000036, 0x0000005e, 0x00000000, 0x00000000], // Digit6 - [0x00000037, 0x00000026, 0x00000000, 0x00000000], // Digit7 - [0x00000038, 0x0000002a, 0x00000000, 0x00000000], // Digit8 - [0x00000039, 0x00000028, 0x00000000, 0x00000000], // Digit9 - [0x00000030, 0x00000029, 0x00000000, 0x00000000], // Digit0 - [0x0000002d, 0x0000005f, 0x00000000, 0x00000000], // Minus - [0x0000003d, 0x0000002b, 0x00000000, 0x00000000], // Equal - [0x0000005b, 0x0000007b, 0x00000000, 0x00000000], // BracketLeft - [0x0000005d, 0x0000007d, 0x00000000, 0x00000000], // BracketRight - [0x00000023, 0x0000007e, 0x0000005c, 0x0000007c], // Backslash - [0x0000003b, 0x0000003a, 0x00000000, 0x00000000], // Semicolon - [0x00000027, 0x00000040, 0x00000000, 0x00000000], // Quote - [0x00000060, 0x000000ac, 0x000000a6, 0x00000000], // Backquote - [0x0000002c, 0x0000003c, 0x00000000, 0x00000000], // Comma - [0x0000002e, 0x0000003e, 0x00000000, 0x00000000], // Period - [0x0000002f, 0x0000003f, 0x00000000, 0x00000000], // Slash - ], - ), - - LayoutInfo( - name: 'en-uk', - platform: LayoutPlatform.darwin, - mapping: >[ - [0x00000061, 0x00000041, 0x000000e5, 0x000000c5], // KeyA - [0x00000062, 0x00000042, 0x0000222b, 0x00000131], // KeyB - [0x00000063, 0x00000043, 0x000000e7, 0x000000c7], // KeyC - [0x00000064, 0x00000044, 0x00002202, 0x000000ce], // KeyD - [0x00000065, 0x00000045, 0x000000b4, 0x00002030], // KeyE - [0x00000066, 0x00000046, 0x00000192, 0x000000cf], // KeyF - [0x00000067, 0x00000047, 0x000000a9, 0x000000cc], // KeyG - [0x00000068, 0x00000048, 0x000002d9, 0x000000d3], // KeyH - [0x00000069, 0x00000049, 0x0000005e, 0x000000c8], // KeyI - [0x0000006a, 0x0000004a, 0x00002206, 0x000000d4], // KeyJ - [0x0000006b, 0x0000004b, 0x000002da, 0x0000f8ff], // KeyK - [0x0000006c, 0x0000004c, 0x000000ac, 0x000000d2], // KeyL - [0x0000006d, 0x0000004d, 0x000000b5, 0x000002dc], // KeyM - [0x0000006e, 0x0000004e, 0x0000007e, 0x000002c6], // KeyN - [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO - [0x00000070, 0x00000050, 0x000003c0, 0x0000220f], // KeyP - [0x00000071, 0x00000051, 0x00000153, 0x00000152], // KeyQ - [0x00000072, 0x00000052, 0x000000ae, 0x000000c2], // KeyR - [0x00000073, 0x00000053, 0x000000df, 0x000000cd], // KeyS - [0x00000074, 0x00000054, 0x00002020, 0x000000ca], // KeyT - [0x00000075, 0x00000055, 0x000000a8, 0x000000cb], // KeyU - [0x00000076, 0x00000056, 0x0000221a, 0x000025ca], // KeyV - [0x00000077, 0x00000057, 0x00002211, 0x0000201e], // KeyW - [0x00000078, 0x00000058, 0x00002248, 0x000000d9], // KeyX - [0x00000079, 0x00000059, 0x000000a5, 0x000000c1], // KeyY - [0x0000007a, 0x0000005a, 0x000003a9, 0x000000db], // KeyZ - [0x00000031, 0x00000021, 0x000000a1, 0x00002044], // Digit1 - [0x00000032, 0x00000040, 0x000020ac, 0x00002122], // Digit2 - [0x00000033, 0x000000a3, 0x00000023, 0x00002039], // Digit3 - [0x00000034, 0x00000024, 0x000000a2, 0x0000203a], // Digit4 - [0x00000035, 0x00000025, 0x0000221e, 0x0000fb01], // Digit5 - [0x00000036, 0x0000005e, 0x000000a7, 0x0000fb02], // Digit6 - [0x00000037, 0x00000026, 0x000000b6, 0x00002021], // Digit7 - [0x00000038, 0x0000002a, 0x00002022, 0x000000b0], // Digit8 - [0x00000039, 0x00000028, 0x000000aa, 0x000000b7], // Digit9 - [0x00000030, 0x00000029, 0x000000ba, 0x0000201a], // Digit0 - [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Minus - [0x0000003d, 0x0000002b, 0x00002260, 0x000000b1], // Equal - [0x0000005b, 0x0000007b, 0x0000201c, 0x0000201d], // BracketLeft - [0x0000005d, 0x0000007d, 0x00002018, 0x00002019], // BracketRight - [0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb], // Backslash - [0x0000003b, 0x0000003a, 0x00002026, 0x000000da], // Semicolon - [0x00000027, 0x00000022, 0x000000e6, 0x000000c6], // Quote - [0x00000060, 0x0000007e, 0x00000060, 0x00000178], // Backquote - [0x0000002c, 0x0000003c, 0x00002264, 0x000000af], // Comma - [0x0000002e, 0x0000003e, 0x00002265, 0x000002d8], // Period - [0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf], // Slash - ], - ), - - LayoutInfo( - name: 'es', - platform: LayoutPlatform.win, - mapping: >[ - [0x00000061, 0x00000041, 0x00000000, 0x00000000], // KeyA - [0x00000062, 0x00000042, 0x00000000, 0x00000000], // KeyB - [0x00000063, 0x00000043, 0x00000000, 0x00000000], // KeyC - [0x00000064, 0x00000044, 0x00000000, 0x00000000], // KeyD - [0x00000065, 0x00000045, 0x000020ac, 0x00000000], // KeyE - [0x00000066, 0x00000046, 0x00000000, 0x00000000], // KeyF - [0x00000067, 0x00000047, 0x00000000, 0x00000000], // KeyG - [0x00000068, 0x00000048, 0x00000000, 0x00000000], // KeyH - [0x00000069, 0x00000049, 0x00000000, 0x00000000], // KeyI - [0x0000006a, 0x0000004a, 0x00000000, 0x00000000], // KeyJ - [0x0000006b, 0x0000004b, 0x00000000, 0x00000000], // KeyK - [0x0000006c, 0x0000004c, 0x00000000, 0x00000000], // KeyL - [0x0000006d, 0x0000004d, 0x00000000, 0x00000000], // KeyM - [0x0000006e, 0x0000004e, 0x00000000, 0x00000000], // KeyN - [0x0000006f, 0x0000004f, 0x00000000, 0x00000000], // KeyO - [0x00000070, 0x00000050, 0x00000000, 0x00000000], // KeyP - [0x00000071, 0x00000051, 0x00000000, 0x00000000], // KeyQ - [0x00000072, 0x00000052, 0x00000000, 0x00000000], // KeyR - [0x00000073, 0x00000053, 0x00000000, 0x00000000], // KeyS - [0x00000074, 0x00000054, 0x00000000, 0x00000000], // KeyT - [0x00000075, 0x00000055, 0x00000000, 0x00000000], // KeyU - [0x00000076, 0x00000056, 0x00000000, 0x00000000], // KeyV - [0x00000077, 0x00000057, 0x00000000, 0x00000000], // KeyW - [0x00000078, 0x00000058, 0x00000000, 0x00000000], // KeyX - [0x00000079, 0x00000059, 0x00000000, 0x00000000], // KeyY - [0x0000007a, 0x0000005a, 0x00000000, 0x00000000], // KeyZ - [0x00000031, 0x00000021, 0x0000007c, 0x00000000], // Digit1 - [0x00000032, 0x00000022, 0x00000040, 0x00000000], // Digit2 - [0x00000033, 0x000000b7, 0x00000023, 0x00000000], // Digit3 - [0x00000034, 0x00000024, 0x0000007e, 0x00000000], // Digit4 - [0x00000035, 0x00000025, 0x000020ac, 0x00000000], // Digit5 - [0x00000036, 0x00000026, 0x000000ac, 0x00000000], // Digit6 - [0x00000037, 0x0000002f, 0x00000000, 0x00000000], // Digit7 - [0x00000038, 0x00000028, 0x00000000, 0x00000000], // Digit8 - [0x00000039, 0x00000029, 0x00000000, 0x00000000], // Digit9 - [0x00000030, 0x0000003d, 0x00000000, 0x00000000], // Digit0 - [0x00000027, 0x0000003f, 0x00000000, 0x00000000], // Minus - [0x000000a1, 0x000000bf, 0x00000000, 0x00000000], // Equal - [0x00000060, 0x0000005e, 0x0000005b, 0x00000000], // BracketLeft - [0x0000002b, 0x0000002a, 0x0000005d, 0x00000000], // BracketRight - [0x000000e7, 0x000000c7, 0x0000007d, 0x00000000], // Backslash - [0x000000f1, 0x000000d1, 0x00000000, 0x00000000], // Semicolon - [0x000000b4, 0x000000a8, 0x0000007b, 0x00000000], // Quote - [0x000000ba, 0x000000aa, 0x0000005c, 0x00000000], // Backquote - [0x0000002c, 0x0000003b, 0x00000000, 0x00000000], // Comma - [0x0000002e, 0x0000003a, 0x00000000, 0x00000000], // Period - [0x0000002d, 0x0000005f, 0x00000000, 0x00000000], // Slash - ], - ), - - LayoutInfo( - name: 'es', - platform: LayoutPlatform.linux, - mapping: >[ - [0x00000061, 0x00000041, 0x000000e6, 0x000000c6], // KeyA - [0x00000062, 0x00000042, 0x0000201d, 0x00002019], // KeyB - [0x00000063, 0x00000043, 0x000000a2, 0x000000a9], // KeyC - [0x00000064, 0x00000044, 0x000000f0, 0x000000d0], // KeyD - [0x00000065, 0x00000045, 0x000020ac, 0x000000a2], // KeyE - [0x00000066, 0x00000046, 0x00000111, 0x000000aa], // KeyF - [0x00000067, 0x00000047, 0x0000014b, 0x0000014a], // KeyG - [0x00000068, 0x00000048, 0x00000127, 0x00000126], // KeyH - [0x00000069, 0x00000049, 0x00002192, 0x00000131], // KeyI - [0x0000006a, 0x0000004a, 0x00000309, 0x0000031b], // KeyJ - [0x0000006b, 0x0000004b, 0x00000138, 0x00000026], // KeyK - [0x0000006c, 0x0000004c, 0x00000142, 0x00000141], // KeyL - [0x0000006d, 0x0000004d, 0x000000b5, 0x000000ba], // KeyM - [0x0000006e, 0x0000004e, 0x0000006e, 0x0000004e], // KeyN - [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO - [0x00000070, 0x00000050, 0x000000fe, 0x000000de], // KeyP - [0x00000071, 0x00000051, 0x00000040, 0x000003a9], // KeyQ - [0x00000072, 0x00000052, 0x000000b6, 0x000000ae], // KeyR - [0x00000073, 0x00000053, 0x000000df, 0x000000a7], // KeyS - [0x00000074, 0x00000054, 0x00000167, 0x00000166], // KeyT - [0x00000075, 0x00000055, 0x00002193, 0x00002191], // KeyU - [0x00000076, 0x00000056, 0x0000201c, 0x00002018], // KeyV - [0x00000077, 0x00000057, 0x00000142, 0x00000141], // KeyW - [0x00000078, 0x00000058, 0x000000bb, 0x0000003e], // KeyX - [0x00000079, 0x00000059, 0x00002190, 0x000000a5], // KeyY - [0x0000007a, 0x0000005a, 0x000000ab, 0x0000003c], // KeyZ - [0x00000031, 0x00000021, 0x0000007c, 0x000000a1], // Digit1 - [0x00000032, 0x00000022, 0x00000040, 0x0000215b], // Digit2 - [0x00000033, 0x000000b7, 0x00000023, 0x000000a3], // Digit3 - [0x00000034, 0x00000024, 0x0000007e, 0x00000024], // Digit4 - [0x00000035, 0x00000025, 0x000000bd, 0x0000215c], // Digit5 - [0x00000036, 0x00000026, 0x000000ac, 0x0000215d], // Digit6 - [0x00000037, 0x0000002f, 0x0000007b, 0x0000215e], // Digit7 - [0x00000038, 0x00000028, 0x0000005b, 0x00002122], // Digit8 - [0x00000039, 0x00000029, 0x0000005d, 0x000000b1], // Digit9 - [0x00000030, 0x0000003d, 0x0000007d, 0x000000b0], // Digit0 - [0x00000027, 0x0000003f, 0x0000005c, 0x000000bf], // Minus - [0x000000a1, 0x000000bf, 0x00000303, 0x0000007e], // Equal - [0x00000300, 0x00000302, 0x0000005b, 0x0000030a], // BracketLeft - [0x0000002b, 0x0000002a, 0x0000005d, 0x00000304], // BracketRight - [0x000000e7, 0x000000c7, 0x0000007d, 0x00000306], // Backslash - [0x000000f1, 0x000000d1, 0x0000007e, 0x0000030b], // Semicolon - [0x00000301, 0x00000308, 0x0000007b, 0x0000007b], // Quote - [0x000000ba, 0x000000aa, 0x0000005c, 0x0000005c], // Backquote - [0x0000002c, 0x0000003b, 0x00002500, 0x000000d7], // Comma - [0x0000002e, 0x0000003a, 0x000000b7, 0x000000f7], // Period - [0x0000002d, 0x0000005f, 0x00000323, 0x00000307], // Slash - ], - ), - - LayoutInfo( - name: 'es', - platform: LayoutPlatform.darwin, - mapping: >[ - [0x00000061, 0x00000041, 0x000000e5, 0x000000c5], // KeyA - [0x00000062, 0x00000042, 0x000000df, 0x00000000], // KeyB - [0x00000063, 0x00000043, 0x000000a9, 0x00000020], // KeyC - [0x00000064, 0x00000044, 0x00002202, 0x00002206], // KeyD - [0x00000065, 0x00000045, 0x000020ac, 0x000020ac], // KeyE - [0x00000066, 0x00000046, 0x00000192, 0x0000fb01], // KeyF - [0x00000067, 0x00000047, 0x0000f8ff, 0x0000fb02], // KeyG - [0x00000068, 0x00000048, 0x00002122, 0x00000020], // KeyH - [0x00000069, 0x00000049, 0x00000020, 0x00000020], // KeyI - [0x0000006a, 0x0000004a, 0x000000b6, 0x000000af], // KeyJ - [0x0000006b, 0x0000004b, 0x000000a7, 0x000002c7], // KeyK - [0x0000006c, 0x0000004c, 0x00000020, 0x000002d8], // KeyL - [0x0000006d, 0x0000004d, 0x000000b5, 0x000002da], // KeyM - [0x0000006e, 0x0000004e, 0x00000020, 0x000002d9], // KeyN - [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO - [0x00000070, 0x00000050, 0x000003c0, 0x0000220f], // KeyP - [0x00000071, 0x00000051, 0x00000153, 0x00000152], // KeyQ - [0x00000072, 0x00000052, 0x000000ae, 0x00000020], // KeyR - [0x00000073, 0x00000053, 0x0000222b, 0x00000020], // KeyS - [0x00000074, 0x00000054, 0x00002020, 0x00002021], // KeyT - [0x00000075, 0x00000055, 0x00000020, 0x00000020], // KeyU - [0x00000076, 0x00000056, 0x0000221a, 0x000025ca], // KeyV - [0x00000077, 0x00000057, 0x000000e6, 0x000000c6], // KeyW - [0x00000078, 0x00000058, 0x00002211, 0x0000203a], // KeyX - [0x00000079, 0x00000059, 0x000000a5, 0x00000020], // KeyY - [0x0000007a, 0x0000005a, 0x000003a9, 0x00002039], // KeyZ - [0x00000031, 0x00000021, 0x0000007c, 0x00000131], // Digit1 - [0x00000032, 0x00000022, 0x00000040, 0x000002dd], // Digit2 - [0x00000033, 0x000000b7, 0x00000023, 0x00002022], // Digit3 - [0x00000034, 0x00000024, 0x000000a2, 0x000000a3], // Digit4 - [0x00000035, 0x00000025, 0x0000221e, 0x00002030], // Digit5 - [0x00000036, 0x00000026, 0x000000ac, 0x00000020], // Digit6 - [0x00000037, 0x0000002f, 0x000000f7, 0x00002044], // Digit7 - [0x00000038, 0x00000028, 0x0000201c, 0x00002018], // Digit8 - [0x00000039, 0x00000029, 0x0000201d, 0x00002019], // Digit9 - [0x00000030, 0x0000003d, 0x00002260, 0x00002248], // Digit0 - [0x00000027, 0x0000003f, 0x000000b4, 0x000000b8], // Minus - [0x000000a1, 0x000000bf, 0x0000201a, 0x000002db], // Equal - [0x00000060, 0x0000005e, 0x0000005b, 0x000002c6], // BracketLeft - [0x0000002b, 0x0000002a, 0x0000005d, 0x000000b1], // BracketRight - [0x000000e7, 0x000000c7, 0x0000007d, 0x000000bb], // Backslash - [0x000000f1, 0x000000d1, 0x0000007e, 0x000002dc], // Semicolon - [0x000000b4, 0x000000a8, 0x0000007b, 0x000000ab], // Quote - [0x0000003c, 0x0000003e, 0x00002264, 0x00002265], // Backquote - [0x0000002c, 0x0000003b, 0x0000201e, 0x00000000], // Comma - [0x0000002e, 0x0000003a, 0x00002026, 0x00002026], // Period - [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Slash - ], - ), - - LayoutInfo( - name: 'es-latin', - platform: LayoutPlatform.win, - mapping: >[ - [0x00000061, 0x00000041, 0x00000000, 0x00000000], // KeyA - [0x00000062, 0x00000042, 0x00000000, 0x00000000], // KeyB - [0x00000063, 0x00000043, 0x00000000, 0x00000000], // KeyC - [0x00000064, 0x00000044, 0x00000000, 0x00000000], // KeyD - [0x00000065, 0x00000045, 0x00000000, 0x00000000], // KeyE - [0x00000066, 0x00000046, 0x00000000, 0x00000000], // KeyF - [0x00000067, 0x00000047, 0x00000000, 0x00000000], // KeyG - [0x00000068, 0x00000048, 0x00000000, 0x00000000], // KeyH - [0x00000069, 0x00000049, 0x00000000, 0x00000000], // KeyI - [0x0000006a, 0x0000004a, 0x00000000, 0x00000000], // KeyJ - [0x0000006b, 0x0000004b, 0x00000000, 0x00000000], // KeyK - [0x0000006c, 0x0000004c, 0x00000000, 0x00000000], // KeyL - [0x0000006d, 0x0000004d, 0x00000000, 0x00000000], // KeyM - [0x0000006e, 0x0000004e, 0x00000000, 0x00000000], // KeyN - [0x0000006f, 0x0000004f, 0x00000000, 0x00000000], // KeyO - [0x00000070, 0x00000050, 0x00000000, 0x00000000], // KeyP - [0x00000071, 0x00000051, 0x00000040, 0x00000000], // KeyQ - [0x00000072, 0x00000052, 0x00000000, 0x00000000], // KeyR - [0x00000073, 0x00000053, 0x00000000, 0x00000000], // KeyS - [0x00000074, 0x00000054, 0x00000000, 0x00000000], // KeyT - [0x00000075, 0x00000055, 0x00000000, 0x00000000], // KeyU - [0x00000076, 0x00000056, 0x00000000, 0x00000000], // KeyV - [0x00000077, 0x00000057, 0x00000000, 0x00000000], // KeyW - [0x00000078, 0x00000058, 0x00000000, 0x00000000], // KeyX - [0x00000079, 0x00000059, 0x00000000, 0x00000000], // KeyY - [0x0000007a, 0x0000005a, 0x00000000, 0x00000000], // KeyZ - [0x00000031, 0x00000021, 0x00000000, 0x00000000], // Digit1 - [0x00000032, 0x00000022, 0x00000000, 0x00000000], // Digit2 - [0x00000033, 0x00000023, 0x00000000, 0x00000000], // Digit3 - [0x00000034, 0x00000024, 0x00000000, 0x00000000], // Digit4 - [0x00000035, 0x00000025, 0x00000000, 0x00000000], // Digit5 - [0x00000036, 0x00000026, 0x00000000, 0x00000000], // Digit6 - [0x00000037, 0x0000002f, 0x00000000, 0x00000000], // Digit7 - [0x00000038, 0x00000028, 0x00000000, 0x00000000], // Digit8 - [0x00000039, 0x00000029, 0x00000000, 0x00000000], // Digit9 - [0x00000030, 0x0000003d, 0x00000000, 0x00000000], // Digit0 - [0x00000027, 0x0000003f, 0x0000005c, 0x00000000], // Minus - [0x000000bf, 0x000000a1, 0x00000000, 0x00000000], // Equal - [0x000000b4, 0x000000a8, 0x00000000, 0x00000000], // BracketLeft - [0x0000002b, 0x0000002a, 0x0000007e, 0x00000000], // BracketRight - [0x0000007d, 0x0000005d, 0x00000060, 0x00000000], // Backslash - [0x000000f1, 0x000000d1, 0x00000000, 0x00000000], // Semicolon - [0x0000007b, 0x0000005b, 0x0000005e, 0x00000000], // Quote - [0x0000007c, 0x000000b0, 0x000000ac, 0x00000000], // Backquote - [0x0000002c, 0x0000003b, 0x00000000, 0x00000000], // Comma - [0x0000002e, 0x0000003a, 0x00000000, 0x00000000], // Period - [0x0000002d, 0x0000005f, 0x00000000, 0x00000000], // Slash - ], - ), - - LayoutInfo( - name: 'fr', - platform: LayoutPlatform.win, - mapping: >[ - [0x00000071, 0x00000051, 0x00000000, 0x00000000], // KeyA - [0x00000062, 0x00000042, 0x00000000, 0x00000000], // KeyB - [0x00000063, 0x00000043, 0x00000000, 0x00000000], // KeyC - [0x00000064, 0x00000044, 0x00000000, 0x00000000], // KeyD - [0x00000065, 0x00000045, 0x000020ac, 0x00000000], // KeyE - [0x00000066, 0x00000046, 0x00000000, 0x00000000], // KeyF - [0x00000067, 0x00000047, 0x00000000, 0x00000000], // KeyG - [0x00000068, 0x00000048, 0x00000000, 0x00000000], // KeyH - [0x00000069, 0x00000049, 0x00000000, 0x00000000], // KeyI - [0x0000006a, 0x0000004a, 0x00000000, 0x00000000], // KeyJ - [0x0000006b, 0x0000004b, 0x00000000, 0x00000000], // KeyK - [0x0000006c, 0x0000004c, 0x00000000, 0x00000000], // KeyL - [0x0000002c, 0x0000003f, 0x00000000, 0x00000000], // KeyM - [0x0000006e, 0x0000004e, 0x00000000, 0x00000000], // KeyN - [0x0000006f, 0x0000004f, 0x00000000, 0x00000000], // KeyO - [0x00000070, 0x00000050, 0x00000000, 0x00000000], // KeyP - [0x00000061, 0x00000041, 0x00000000, 0x00000000], // KeyQ - [0x00000072, 0x00000052, 0x00000000, 0x00000000], // KeyR - [0x00000073, 0x00000053, 0x00000000, 0x00000000], // KeyS - [0x00000074, 0x00000054, 0x00000000, 0x00000000], // KeyT - [0x00000075, 0x00000055, 0x00000000, 0x00000000], // KeyU - [0x00000076, 0x00000056, 0x00000000, 0x00000000], // KeyV - [0x0000007a, 0x0000005a, 0x00000000, 0x00000000], // KeyW - [0x00000078, 0x00000058, 0x00000000, 0x00000000], // KeyX - [0x00000079, 0x00000059, 0x00000000, 0x00000000], // KeyY - [0x00000077, 0x00000057, 0x00000000, 0x00000000], // KeyZ - [0x00000026, 0x00000031, 0x00000000, 0x00000000], // Digit1 - [0x000000e9, 0x00000032, 0x0000007e, 0x00000000], // Digit2 - [0x00000022, 0x00000033, 0x00000023, 0x00000000], // Digit3 - [0x00000027, 0x00000034, 0x0000007b, 0x00000000], // Digit4 - [0x00000028, 0x00000035, 0x0000005b, 0x00000000], // Digit5 - [0x0000002d, 0x00000036, 0x0000007c, 0x00000000], // Digit6 - [0x000000e8, 0x00000037, 0x00000060, 0x00000000], // Digit7 - [0x0000005f, 0x00000038, 0x0000005c, 0x00000000], // Digit8 - [0x000000e7, 0x00000039, 0x0000005e, 0x00000000], // Digit9 - [0x000000e0, 0x00000030, 0x00000040, 0x00000000], // Digit0 - [0x00000029, 0x000000b0, 0x0000005d, 0x00000000], // Minus - [0x0000003d, 0x0000002b, 0x0000007d, 0x00000000], // Equal - [0x0000005e, 0x000000a8, 0x00000000, 0x00000000], // BracketLeft - [0x00000024, 0x000000a3, 0x000000a4, 0x00000000], // BracketRight - [0x0000002a, 0x000000b5, 0x00000000, 0x00000000], // Backslash - [0x0000006d, 0x0000004d, 0x00000000, 0x00000000], // Semicolon - [0x000000f9, 0x00000025, 0x00000000, 0x00000000], // Quote - [0x000000b2, 0x00000000, 0x00000000, 0x00000000], // Backquote - [0x0000003b, 0x0000002e, 0x00000000, 0x00000000], // Comma - [0x0000003a, 0x0000002f, 0x00000000, 0x00000000], // Period - [0x00000021, 0x000000a7, 0x00000000, 0x00000000], // Slash - ], - ), - - LayoutInfo( - name: 'fr', - platform: LayoutPlatform.linux, - mapping: >[ - [0x00000071, 0x00000051, 0x00000040, 0x000003a9], // KeyA - [0x00000062, 0x00000042, 0x0000201d, 0x00002019], // KeyB - [0x00000063, 0x00000043, 0x000000a2, 0x000000a9], // KeyC - [0x00000064, 0x00000044, 0x000000f0, 0x000000d0], // KeyD - [0x00000065, 0x00000045, 0x000020ac, 0x000000a2], // KeyE - [0x00000066, 0x00000046, 0x00000111, 0x000000aa], // KeyF - [0x00000067, 0x00000047, 0x0000014b, 0x0000014a], // KeyG - [0x00000068, 0x00000048, 0x00000127, 0x00000126], // KeyH - [0x00000069, 0x00000049, 0x00002192, 0x00000131], // KeyI - [0x0000006a, 0x0000004a, 0x00000309, 0x0000031b], // KeyJ - [0x0000006b, 0x0000004b, 0x00000138, 0x00000026], // KeyK - [0x0000006c, 0x0000004c, 0x00000142, 0x00000141], // KeyL - [0x0000002c, 0x0000003f, 0x00000301, 0x0000030b], // KeyM - [0x0000006e, 0x0000004e, 0x0000006e, 0x0000004e], // KeyN - [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO - [0x00000070, 0x00000050, 0x000000fe, 0x000000de], // KeyP - [0x00000061, 0x00000041, 0x000000e6, 0x000000c6], // KeyQ - [0x00000072, 0x00000052, 0x000000b6, 0x000000ae], // KeyR - [0x00000073, 0x00000053, 0x000000df, 0x000000a7], // KeyS - [0x00000074, 0x00000054, 0x00000167, 0x00000166], // KeyT - [0x00000075, 0x00000055, 0x00002193, 0x00002191], // KeyU - [0x00000076, 0x00000056, 0x0000201c, 0x00002018], // KeyV - [0x0000007a, 0x0000005a, 0x000000ab, 0x0000003c], // KeyW - [0x00000078, 0x00000058, 0x000000bb, 0x0000003e], // KeyX - [0x00000079, 0x00000059, 0x00002190, 0x000000a5], // KeyY - [0x00000077, 0x00000057, 0x00000142, 0x00000141], // KeyZ - [0x00000026, 0x00000031, 0x000000b9, 0x000000a1], // Digit1 - [0x000000e9, 0x00000032, 0x0000007e, 0x0000215b], // Digit2 - [0x00000022, 0x00000033, 0x00000023, 0x000000a3], // Digit3 - [0x00000027, 0x00000034, 0x0000007b, 0x00000024], // Digit4 - [0x00000028, 0x00000035, 0x0000005b, 0x0000215c], // Digit5 - [0x0000002d, 0x00000036, 0x0000007c, 0x0000215d], // Digit6 - [0x000000e8, 0x00000037, 0x00000060, 0x0000215e], // Digit7 - [0x0000005f, 0x00000038, 0x0000005c, 0x00002122], // Digit8 - [0x000000e7, 0x00000039, 0x0000005e, 0x000000b1], // Digit9 - [0x000000e0, 0x00000030, 0x00000040, 0x000000b0], // Digit0 - [0x00000029, 0x000000b0, 0x0000005d, 0x000000bf], // Minus - [0x0000003d, 0x0000002b, 0x0000007d, 0x00000328], // Equal - [0x00000302, 0x00000308, 0x00000308, 0x0000030a], // BracketLeft - [0x00000024, 0x000000a3, 0x000000a4, 0x00000304], // BracketRight - [0x0000002a, 0x000000b5, 0x00000300, 0x00000306], // Backslash - [0x0000006d, 0x0000004d, 0x000000b5, 0x000000ba], // Semicolon - [0x000000f9, 0x00000025, 0x00000302, 0x0000030c], // Quote - [0x000000b2, 0x0000007e, 0x000000ac, 0x000000ac], // Backquote - [0x0000003b, 0x0000002e, 0x00002500, 0x000000d7], // Comma - [0x0000003a, 0x0000002f, 0x000000b7, 0x000000f7], // Period - [0x00000021, 0x000000a7, 0x00000323, 0x00000307], // Slash - ], - ), - - LayoutInfo( - name: 'fr', - platform: LayoutPlatform.darwin, - mapping: >[ - [0x00000071, 0x00000051, 0x00002021, 0x000003a9], // KeyA - [0x00000062, 0x00000042, 0x000000df, 0x0000222b], // KeyB - [0x00000063, 0x00000043, 0x000000a9, 0x000000a2], // KeyC - [0x00000064, 0x00000044, 0x00002202, 0x00002206], // KeyD - [0x00000065, 0x00000045, 0x000000ea, 0x000000ca], // KeyE - [0x00000066, 0x00000046, 0x00000192, 0x000000b7], // KeyF - [0x00000067, 0x00000047, 0x0000fb01, 0x0000fb02], // KeyG - [0x00000068, 0x00000048, 0x000000cc, 0x000000ce], // KeyH - [0x00000069, 0x00000049, 0x000000ee, 0x000000ef], // KeyI - [0x0000006a, 0x0000004a, 0x000000cf, 0x000000cd], // KeyJ - [0x0000006b, 0x0000004b, 0x000000c8, 0x000000cb], // KeyK - [0x0000006c, 0x0000004c, 0x000000ac, 0x0000007c], // KeyL - [0x0000002c, 0x0000003f, 0x0000221e, 0x000000bf], // KeyM - [0x0000006e, 0x0000004e, 0x0000007e, 0x00000131], // KeyN - [0x0000006f, 0x0000004f, 0x00000153, 0x00000152], // KeyO - [0x00000070, 0x00000050, 0x000003c0, 0x0000220f], // KeyP - [0x00000061, 0x00000041, 0x000000e6, 0x000000c6], // KeyQ - [0x00000072, 0x00000052, 0x000000ae, 0x0000201a], // KeyR - [0x00000073, 0x00000053, 0x000000d2, 0x00002211], // KeyS - [0x00000074, 0x00000054, 0x00002020, 0x00002122], // KeyT - [0x00000075, 0x00000055, 0x000000ba, 0x000000aa], // KeyU - [0x00000076, 0x00000056, 0x000025ca, 0x0000221a], // KeyV - [0x0000007a, 0x0000005a, 0x000000c2, 0x000000c5], // KeyW - [0x00000078, 0x00000058, 0x00002248, 0x00002044], // KeyX - [0x00000079, 0x00000059, 0x000000da, 0x00000178], // KeyY - [0x00000077, 0x00000057, 0x00002039, 0x0000203a], // KeyZ - [0x00000026, 0x00000031, 0x0000f8ff, 0x000000b4], // Digit1 - [0x000000e9, 0x00000032, 0x000000eb, 0x0000201e], // Digit2 - [0x00000022, 0x00000033, 0x0000201c, 0x0000201d], // Digit3 - [0x00000027, 0x00000034, 0x00002018, 0x00002019], // Digit4 - [0x00000028, 0x00000035, 0x0000007b, 0x0000005b], // Digit5 - [0x000000a7, 0x00000036, 0x000000b6, 0x000000e5], // Digit6 - [0x000000e8, 0x00000037, 0x000000ab, 0x000000bb], // Digit7 - [0x00000021, 0x00000038, 0x000000a1, 0x000000db], // Digit8 - [0x000000e7, 0x00000039, 0x000000c7, 0x000000c1], // Digit9 - [0x000000e0, 0x00000030, 0x000000f8, 0x000000d8], // Digit0 - [0x00000029, 0x000000b0, 0x0000007d, 0x0000005d], // Minus - [0x0000002d, 0x0000005f, 0x00002014, 0x00002013], // Equal - [0x0000005e, 0x000000a8, 0x000000f4, 0x000000d4], // BracketLeft - [0x00000024, 0x0000002a, 0x000020ac, 0x000000a5], // BracketRight - [0x00000060, 0x000000a3, 0x00000040, 0x00000023], // Backslash - [0x0000006d, 0x0000004d, 0x000000b5, 0x000000d3], // Semicolon - [0x000000f9, 0x00000025, 0x000000d9, 0x00002030], // Quote - [0x0000003c, 0x0000003e, 0x00002264, 0x00002265], // Backquote - [0x0000003b, 0x0000002e, 0x00002026, 0x00002022], // Comma - [0x0000003a, 0x0000002f, 0x000000f7, 0x0000005c], // Period - [0x0000003d, 0x0000002b, 0x00002260, 0x000000b1], // Slash - ], - ), - - LayoutInfo( - name: 'hu', - platform: LayoutPlatform.win, - mapping: >[ - [0x00000061, 0x00000041, 0x000000e4, 0x00000000], // KeyA - [0x00000062, 0x00000042, 0x0000007b, 0x00000000], // KeyB - [0x00000063, 0x00000043, 0x00000026, 0x00000000], // KeyC - [0x00000064, 0x00000044, 0x00000110, 0x00000000], // KeyD - [0x00000065, 0x00000045, 0x000000c4, 0x00000000], // KeyE - [0x00000066, 0x00000046, 0x0000005b, 0x00000000], // KeyF - [0x00000067, 0x00000047, 0x0000005d, 0x00000000], // KeyG - [0x00000068, 0x00000048, 0x00000000, 0x00000000], // KeyH - [0x00000069, 0x00000049, 0x000000cd, 0x00000000], // KeyI - [0x0000006a, 0x0000004a, 0x000000ed, 0x00000000], // KeyJ - [0x0000006b, 0x0000004b, 0x00000142, 0x00000000], // KeyK - [0x0000006c, 0x0000004c, 0x00000141, 0x00000000], // KeyL - [0x0000006d, 0x0000004d, 0x0000003c, 0x00000000], // KeyM - [0x0000006e, 0x0000004e, 0x0000007d, 0x00000000], // KeyN - [0x0000006f, 0x0000004f, 0x00000000, 0x00000000], // KeyO - [0x00000070, 0x00000050, 0x00000000, 0x00000000], // KeyP - [0x00000071, 0x00000051, 0x0000005c, 0x00000000], // KeyQ - [0x00000072, 0x00000052, 0x00000000, 0x00000000], // KeyR - [0x00000073, 0x00000053, 0x00000111, 0x00000000], // KeyS - [0x00000074, 0x00000054, 0x00000000, 0x00000000], // KeyT - [0x00000075, 0x00000055, 0x000020ac, 0x00000000], // KeyU - [0x00000076, 0x00000056, 0x00000040, 0x00000000], // KeyV - [0x00000077, 0x00000057, 0x0000007c, 0x00000000], // KeyW - [0x00000078, 0x00000058, 0x00000023, 0x00000000], // KeyX - [0x0000007a, 0x0000005a, 0x00000000, 0x00000000], // KeyY - [0x00000079, 0x00000059, 0x0000003e, 0x00000000], // KeyZ - [0x00000031, 0x00000027, 0x0000007e, 0x00000000], // Digit1 - [0x00000032, 0x00000022, 0x000002c7, 0x00000000], // Digit2 - [0x00000033, 0x0000002b, 0x0000005e, 0x00000000], // Digit3 - [0x00000034, 0x00000021, 0x000002d8, 0x00000000], // Digit4 - [0x00000035, 0x00000025, 0x000000b0, 0x00000000], // Digit5 - [0x00000036, 0x0000002f, 0x000002db, 0x00000000], // Digit6 - [0x00000037, 0x0000003d, 0x00000060, 0x00000000], // Digit7 - [0x00000038, 0x00000028, 0x000002d9, 0x00000000], // Digit8 - [0x00000039, 0x00000029, 0x000000b4, 0x00000000], // Digit9 - [0x000000f6, 0x000000d6, 0x000002dd, 0x00000000], // Digit0 - [0x000000fc, 0x000000dc, 0x000000a8, 0x00000000], // Minus - [0x000000f3, 0x000000d3, 0x000000b8, 0x00000000], // Equal - [0x00000151, 0x00000150, 0x000000f7, 0x00000000], // BracketLeft - [0x000000fa, 0x000000da, 0x000000d7, 0x00000000], // BracketRight - [0x00000171, 0x00000170, 0x000000a4, 0x00000000], // Backslash - [0x000000e9, 0x000000c9, 0x00000024, 0x00000000], // Semicolon - [0x000000e1, 0x000000c1, 0x000000df, 0x00000000], // Quote - [0x00000030, 0x000000a7, 0x00000000, 0x00000000], // Backquote - [0x0000002c, 0x0000003f, 0x0000003b, 0x00000000], // Comma - [0x0000002e, 0x0000003a, 0x0000003e, 0x00000000], // Period - [0x0000002d, 0x0000005f, 0x0000002a, 0x00000000], // Slash - ], - ), - - LayoutInfo( - name: 'it', - platform: LayoutPlatform.win, - mapping: >[ - [0x00000061, 0x00000041, 0x00000000, 0x00000000], // KeyA - [0x00000062, 0x00000042, 0x00000000, 0x00000000], // KeyB - [0x00000063, 0x00000043, 0x00000000, 0x00000000], // KeyC - [0x00000064, 0x00000044, 0x00000000, 0x00000000], // KeyD - [0x00000065, 0x00000045, 0x000020ac, 0x00000000], // KeyE - [0x00000066, 0x00000046, 0x00000000, 0x00000000], // KeyF - [0x00000067, 0x00000047, 0x00000000, 0x00000000], // KeyG - [0x00000068, 0x00000048, 0x00000000, 0x00000000], // KeyH - [0x00000069, 0x00000049, 0x00000000, 0x00000000], // KeyI - [0x0000006a, 0x0000004a, 0x00000000, 0x00000000], // KeyJ - [0x0000006b, 0x0000004b, 0x00000000, 0x00000000], // KeyK - [0x0000006c, 0x0000004c, 0x00000000, 0x00000000], // KeyL - [0x0000006d, 0x0000004d, 0x00000000, 0x00000000], // KeyM - [0x0000006e, 0x0000004e, 0x00000000, 0x00000000], // KeyN - [0x0000006f, 0x0000004f, 0x00000000, 0x00000000], // KeyO - [0x00000070, 0x00000050, 0x00000000, 0x00000000], // KeyP - [0x00000071, 0x00000051, 0x00000000, 0x00000000], // KeyQ - [0x00000072, 0x00000052, 0x00000000, 0x00000000], // KeyR - [0x00000073, 0x00000053, 0x00000000, 0x00000000], // KeyS - [0x00000074, 0x00000054, 0x00000000, 0x00000000], // KeyT - [0x00000075, 0x00000055, 0x00000000, 0x00000000], // KeyU - [0x00000076, 0x00000056, 0x00000000, 0x00000000], // KeyV - [0x00000077, 0x00000057, 0x00000000, 0x00000000], // KeyW - [0x00000078, 0x00000058, 0x00000000, 0x00000000], // KeyX - [0x00000079, 0x00000059, 0x00000000, 0x00000000], // KeyY - [0x0000007a, 0x0000005a, 0x00000000, 0x00000000], // KeyZ - [0x00000031, 0x00000021, 0x00000000, 0x00000000], // Digit1 - [0x00000032, 0x00000022, 0x00000000, 0x00000000], // Digit2 - [0x00000033, 0x000000a3, 0x00000000, 0x00000000], // Digit3 - [0x00000034, 0x00000024, 0x00000000, 0x00000000], // Digit4 - [0x00000035, 0x00000025, 0x000020ac, 0x00000000], // Digit5 - [0x00000036, 0x00000026, 0x00000000, 0x00000000], // Digit6 - [0x00000037, 0x0000002f, 0x00000000, 0x00000000], // Digit7 - [0x00000038, 0x00000028, 0x00000000, 0x00000000], // Digit8 - [0x00000039, 0x00000029, 0x00000000, 0x00000000], // Digit9 - [0x00000030, 0x0000003d, 0x00000000, 0x00000000], // Digit0 - [0x00000027, 0x0000003f, 0x00000000, 0x00000000], // Minus - [0x000000ec, 0x0000005e, 0x00000000, 0x00000000], // Equal - [0x000000e8, 0x000000e9, 0x0000005b, 0x0000007b], // BracketLeft - [0x0000002b, 0x0000002a, 0x0000005d, 0x0000007d], // BracketRight - [0x000000f9, 0x000000a7, 0x00000000, 0x00000000], // Backslash - [0x000000f2, 0x000000e7, 0x00000040, 0x00000000], // Semicolon - [0x000000e0, 0x000000b0, 0x00000023, 0x00000000], // Quote - [0x0000005c, 0x0000007c, 0x00000000, 0x00000000], // Backquote - [0x0000002c, 0x0000003b, 0x00000000, 0x00000000], // Comma - [0x0000002e, 0x0000003a, 0x00000000, 0x00000000], // Period - [0x0000002d, 0x0000005f, 0x00000000, 0x00000000], // Slash - ], - ), - - LayoutInfo( - name: 'it', - platform: LayoutPlatform.darwin, - mapping: >[ - [0x00000061, 0x00000041, 0x000000e5, 0x000000c5], // KeyA - [0x00000062, 0x00000042, 0x0000222b, 0x000000cd], // KeyB - [0x00000063, 0x00000043, 0x000000a9, 0x000000c1], // KeyC - [0x00000064, 0x00000044, 0x00002202, 0x000002d8], // KeyD - [0x00000065, 0x00000045, 0x000020ac, 0x000000c8], // KeyE - [0x00000066, 0x00000046, 0x00000192, 0x000002d9], // KeyF - [0x00000067, 0x00000047, 0x0000221e, 0x000002da], // KeyG - [0x00000068, 0x00000048, 0x00002206, 0x000000b8], // KeyH - [0x00000069, 0x00000049, 0x00000153, 0x00000152], // KeyI - [0x0000006a, 0x0000004a, 0x000000aa, 0x000002dd], // KeyJ - [0x0000006b, 0x0000004b, 0x000000ba, 0x000002db], // KeyK - [0x0000006c, 0x0000004c, 0x000000ac, 0x000002c7], // KeyL - [0x0000006d, 0x0000004d, 0x000000b5, 0x000000da], // KeyM - [0x0000006e, 0x0000004e, 0x000002dc, 0x000000d3], // KeyN - [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO - [0x00000070, 0x00000050, 0x000003c0, 0x0000220f], // KeyP - [0x00000071, 0x00000051, 0x0000201e, 0x0000201a], // KeyQ - [0x00000072, 0x00000052, 0x000000ae, 0x000000cc], // KeyR - [0x00000073, 0x00000053, 0x000000df, 0x000000af], // KeyS - [0x00000074, 0x00000054, 0x00002122, 0x000000d2], // KeyT - [0x00000075, 0x00000055, 0x000000a8, 0x000000d9], // KeyU - [0x00000076, 0x00000056, 0x0000221a, 0x000000c9], // KeyV - [0x00000077, 0x00000057, 0x000003a9, 0x000000c0], // KeyW - [0x00000078, 0x00000058, 0x00002020, 0x00002021], // KeyX - [0x00000079, 0x00000059, 0x000000e6, 0x000000c6], // KeyY - [0x0000007a, 0x0000005a, 0x00002211, 0x00000020], // KeyZ - [0x00000031, 0x00000021, 0x000000ab, 0x000000bb], // Digit1 - [0x00000032, 0x00000022, 0x0000201c, 0x0000201d], // Digit2 - [0x00000033, 0x000000a3, 0x00002018, 0x00002019], // Digit3 - [0x00000034, 0x00000024, 0x000000a5, 0x000000a2], // Digit4 - [0x00000035, 0x00000025, 0x0000007e, 0x00002030], // Digit5 - [0x00000036, 0x00000026, 0x00002039, 0x0000203a], // Digit6 - [0x00000037, 0x0000002f, 0x000000f7, 0x00002044], // Digit7 - [0x00000038, 0x00000028, 0x000000b4, 0x0000f8ff], // Digit8 - [0x00000039, 0x00000029, 0x00000060, 0x00000020], // Digit9 - [0x00000030, 0x0000003d, 0x00002260, 0x00002248], // Digit0 - [0x00000027, 0x0000003f, 0x000000a1, 0x000000bf], // Minus - [0x000000ec, 0x0000005e, 0x000002c6, 0x000000b1], // Equal - [0x000000e8, 0x000000e9, 0x0000005b, 0x0000007b], // BracketLeft - [0x0000002b, 0x0000002a, 0x0000005d, 0x0000007d], // BracketRight - [0x000000f9, 0x000000a7, 0x000000b6, 0x000025ca], // Backslash - [0x000000f2, 0x000000e7, 0x00000040, 0x000000c7], // Semicolon - [0x000000e0, 0x000000b0, 0x00000023, 0x0000221e], // Quote - [0x0000003c, 0x0000003e, 0x00002264, 0x00002265], // Backquote - [0x0000002c, 0x0000003b, 0x00002026, 0x00000020], // Comma - [0x0000002e, 0x0000003a, 0x00002022, 0x000000b7], // Period - [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Slash - ], - ), - - LayoutInfo( - name: 'jp', - platform: LayoutPlatform.darwin, - mapping: >[ - [0x00000061, 0x00000041, 0x000000e5, 0x000000c5], // KeyA - [0x00000062, 0x00000042, 0x0000222b, 0x00000131], // KeyB - [0x00000063, 0x00000043, 0x000000e7, 0x000000c7], // KeyC - [0x00000064, 0x00000044, 0x00002202, 0x000000ce], // KeyD - [0x00000065, 0x00000045, 0x000000b4, 0x000000b4], // KeyE - [0x00000066, 0x00000046, 0x00000192, 0x000000cf], // KeyF - [0x00000067, 0x00000047, 0x000000a9, 0x000002dd], // KeyG - [0x00000068, 0x00000048, 0x000002d9, 0x000000d3], // KeyH - [0x00000069, 0x00000049, 0x000002c6, 0x000002c6], // KeyI - [0x0000006a, 0x0000004a, 0x00002206, 0x000000d4], // KeyJ - [0x0000006b, 0x0000004b, 0x000002da, 0x0000f8ff], // KeyK - [0x0000006c, 0x0000004c, 0x000000ac, 0x000000d2], // KeyL - [0x0000006d, 0x0000004d, 0x000000b5, 0x000000c2], // KeyM - [0x0000006e, 0x0000004e, 0x000002dc, 0x000002dc], // KeyN - [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO - [0x00000070, 0x00000050, 0x000003c0, 0x0000220f], // KeyP - [0x00000071, 0x00000051, 0x00000153, 0x00000152], // KeyQ - [0x00000072, 0x00000052, 0x000000ae, 0x00002030], // KeyR - [0x00000073, 0x00000053, 0x000000df, 0x000000cd], // KeyS - [0x00000074, 0x00000054, 0x00002020, 0x000002c7], // KeyT - [0x00000075, 0x00000055, 0x000000a8, 0x000000a8], // KeyU - [0x00000076, 0x00000056, 0x0000221a, 0x000025ca], // KeyV - [0x00000077, 0x00000057, 0x00002211, 0x0000201e], // KeyW - [0x00000078, 0x00000058, 0x00002248, 0x000002db], // KeyX - [0x00000079, 0x00000059, 0x000000a5, 0x000000c1], // KeyY - [0x0000007a, 0x0000005a, 0x000003a9, 0x000000b8], // KeyZ - [0x00000031, 0x00000021, 0x000000a1, 0x00002044], // Digit1 - [0x00000032, 0x00000040, 0x00002122, 0x000020ac], // Digit2 - [0x00000033, 0x00000023, 0x000000a3, 0x00002039], // Digit3 - [0x00000034, 0x00000024, 0x000000a2, 0x0000203a], // Digit4 - [0x00000035, 0x00000025, 0x0000221e, 0x0000fb01], // Digit5 - [0x00000036, 0x0000005e, 0x000000a7, 0x0000fb02], // Digit6 - [0x00000037, 0x00000026, 0x000000b6, 0x00002021], // Digit7 - [0x00000038, 0x0000002a, 0x00002022, 0x000000b0], // Digit8 - [0x00000039, 0x00000028, 0x000000aa, 0x000000b7], // Digit9 - [0x00000030, 0x00000029, 0x000000ba, 0x0000201a], // Digit0 - [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Minus - [0x0000003d, 0x0000002b, 0x00002260, 0x000000b1], // Equal - [0x0000005b, 0x0000007b, 0x0000201c, 0x0000201d], // BracketLeft - [0x0000005d, 0x0000007d, 0x00002018, 0x00002019], // BracketRight - [0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb], // Backslash - [0x0000003b, 0x0000003a, 0x00002026, 0x000000da], // Semicolon - [0x00000027, 0x00000022, 0x000000e6, 0x000000c6], // Quote - [0x00000060, 0x0000007e, 0x00000060, 0x00000060], // Backquote - [0x0000002c, 0x0000003c, 0x00002264, 0x000000af], // Comma - [0x0000002e, 0x0000003e, 0x00002265, 0x000002d8], // Period - [0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf], // Slash - ], - ), - - LayoutInfo( - name: 'jp-roman', - platform: LayoutPlatform.darwin, - mapping: >[ - [0x00000061, 0x00000041, 0x000000af, 0x00000304], // KeyA - [0x00000062, 0x00000042, 0x000002d8, 0x00000306], // KeyB - [0x00000063, 0x00000043, 0x000000b8, 0x00000327], // KeyC - [0x00000064, 0x00000044, 0x000000f0, 0x000000d0], // KeyD - [0x00000065, 0x00000045, 0x000000b4, 0x00000301], // KeyE - [0x00000066, 0x00000046, 0x00000192, 0x00000000], // KeyF - [0x00000067, 0x00000047, 0x000000a9, 0x00002038], // KeyG - [0x00000068, 0x00000048, 0x000002cd, 0x00000331], // KeyH - [0x00000069, 0x00000049, 0x000002bc, 0x0000031b], // KeyI - [0x0000006a, 0x0000004a, 0x000002dd, 0x0000030b], // KeyJ - [0x0000006b, 0x0000004b, 0x000002da, 0x0000030a], // KeyK - [0x0000006c, 0x0000004c, 0x0000002d, 0x00000335], // KeyL - [0x0000006d, 0x0000004d, 0x000002db, 0x00000328], // KeyM - [0x0000006e, 0x0000004e, 0x000002dc, 0x00000303], // KeyN - [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO - [0x00000070, 0x00000050, 0x0000002c, 0x00000326], // KeyP - [0x00000071, 0x00000051, 0x00000153, 0x00000152], // KeyQ - [0x00000072, 0x00000052, 0x000000ae, 0x00002030], // KeyR - [0x00000073, 0x00000053, 0x000000df, 0x00000000], // KeyS - [0x00000074, 0x00000054, 0x000000fe, 0x000000de], // KeyT - [0x00000075, 0x00000055, 0x000000a8, 0x00000308], // KeyU - [0x00000076, 0x00000056, 0x000002c7, 0x0000030c], // KeyV - [0x00000077, 0x00000057, 0x000002d9, 0x00000307], // KeyW - [0x00000078, 0x00000058, 0x0000002e, 0x00000323], // KeyX - [0x00000079, 0x00000059, 0x000000a5, 0x00000000], // KeyY - [0x0000007a, 0x0000005a, 0x000002c0, 0x00000309], // KeyZ - [0x00000031, 0x00000021, 0x000000a1, 0x00002044], // Digit1 - [0x00000032, 0x00000040, 0x00002122, 0x000020ac], // Digit2 - [0x00000033, 0x00000023, 0x000000a3, 0x00002039], // Digit3 - [0x00000034, 0x00000024, 0x000000a2, 0x0000203a], // Digit4 - [0x00000035, 0x00000025, 0x000000a7, 0x00002020], // Digit5 - [0x00000036, 0x0000005e, 0x000002c6, 0x00000302], // Digit6 - [0x00000037, 0x00000026, 0x000000b6, 0x00002021], // Digit7 - [0x00000038, 0x0000002a, 0x00002022, 0x000000b0], // Digit8 - [0x00000039, 0x00000028, 0x000000aa, 0x000000b7], // Digit9 - [0x00000030, 0x00000029, 0x000000ba, 0x0000201a], // Digit0 - [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Minus - [0x0000003d, 0x0000002b, 0x00002260, 0x000000b1], // Equal - [0x0000005b, 0x0000007b, 0x0000201c, 0x0000201d], // BracketLeft - [0x0000005d, 0x0000007d, 0x00002018, 0x00002019], // BracketRight - [0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb], // Backslash - [0x0000003b, 0x0000003a, 0x00002026, 0x00002116], // Semicolon - [0x00000027, 0x00000022, 0x000000e6, 0x000000c6], // Quote - [0x00000060, 0x0000007e, 0x00000060, 0x00000300], // Backquote - [0x0000002c, 0x0000003c, 0x00002264, 0x0000201e], // Comma - [0x0000002e, 0x0000003e, 0x00002265, 0x00000294], // Period - [0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf], // Slash - ], - ), - - LayoutInfo( - name: 'ko', - platform: LayoutPlatform.darwin, - mapping: >[ - [0x00003141, 0x00003141, 0x00000061, 0x00000041], // KeyA - [0x00003160, 0x00003160, 0x00000062, 0x00000042], // KeyB - [0x0000314a, 0x0000314a, 0x00000063, 0x00000043], // KeyC - [0x00003147, 0x00003147, 0x00000064, 0x00000044], // KeyD - [0x00003137, 0x00003138, 0x00000065, 0x00000045], // KeyE - [0x00003139, 0x00003139, 0x00000066, 0x00000046], // KeyF - [0x0000314e, 0x0000314e, 0x00000067, 0x00000047], // KeyG - [0x00003157, 0x00003157, 0x00000068, 0x00000048], // KeyH - [0x00003151, 0x00003151, 0x00000069, 0x00000049], // KeyI - [0x00003153, 0x00003153, 0x0000006a, 0x0000004a], // KeyJ - [0x0000314f, 0x0000314f, 0x0000006b, 0x0000004b], // KeyK - [0x00003163, 0x00003163, 0x0000006c, 0x0000004c], // KeyL - [0x00003161, 0x00003161, 0x0000006d, 0x0000004d], // KeyM - [0x0000315c, 0x0000315c, 0x0000006e, 0x0000004e], // KeyN - [0x00003150, 0x00003152, 0x0000006f, 0x0000004f], // KeyO - [0x00003154, 0x00003156, 0x00000070, 0x00000050], // KeyP - [0x00003142, 0x00003143, 0x00000071, 0x00000051], // KeyQ - [0x00003131, 0x00003132, 0x00000072, 0x00000052], // KeyR - [0x00003134, 0x00003134, 0x00000073, 0x00000053], // KeyS - [0x00003145, 0x00003146, 0x00000074, 0x00000054], // KeyT - [0x00003155, 0x00003155, 0x00000075, 0x00000055], // KeyU - [0x0000314d, 0x0000314d, 0x00000076, 0x00000056], // KeyV - [0x00003148, 0x00003149, 0x00000077, 0x00000057], // KeyW - [0x0000314c, 0x0000314c, 0x00000078, 0x00000058], // KeyX - [0x0000315b, 0x0000315b, 0x00000079, 0x00000059], // KeyY - [0x0000314b, 0x0000314b, 0x0000007a, 0x0000005a], // KeyZ - [0x00000031, 0x00000021, 0x00000031, 0x00000021], // Digit1 - [0x00000032, 0x00000040, 0x00000032, 0x00000040], // Digit2 - [0x00000033, 0x00000023, 0x00000033, 0x00000023], // Digit3 - [0x00000034, 0x00000024, 0x00000034, 0x00000024], // Digit4 - [0x00000035, 0x00000025, 0x00000035, 0x00000025], // Digit5 - [0x00000036, 0x0000005e, 0x00000036, 0x0000005e], // Digit6 - [0x00000037, 0x00000026, 0x00000037, 0x00000026], // Digit7 - [0x00000038, 0x0000002a, 0x00000038, 0x0000002a], // Digit8 - [0x00000039, 0x00000028, 0x00000039, 0x00000028], // Digit9 - [0x00000030, 0x00000029, 0x00000030, 0x00000029], // Digit0 - [0x0000002d, 0x0000005f, 0x0000002d, 0x0000005f], // Minus - [0x0000003d, 0x0000002b, 0x0000003d, 0x0000002b], // Equal - [0x0000005b, 0x0000007b, 0x0000005b, 0x0000007b], // BracketLeft - [0x0000005d, 0x0000007d, 0x0000005d, 0x0000007d], // BracketRight - [0x0000005c, 0x0000007c, 0x0000005c, 0x0000007c], // Backslash - [0x0000003b, 0x0000003a, 0x0000003b, 0x0000003a], // Semicolon - [0x00000027, 0x00000022, 0x00000027, 0x00000022], // Quote - [0x000020a9, 0x0000007e, 0x00000060, 0x0000007e], // Backquote - [0x0000002c, 0x0000003c, 0x0000002c, 0x0000003c], // Comma - [0x0000002e, 0x0000003e, 0x0000002e, 0x0000003e], // Period - [0x0000002f, 0x0000003f, 0x0000002f, 0x0000003f], // Slash - ], - ), - - LayoutInfo( - name: 'no', - platform: LayoutPlatform.win, - mapping: >[ - [0x00000061, 0x00000041, 0x00000000, 0x00000000], // KeyA - [0x00000062, 0x00000042, 0x00000000, 0x00000000], // KeyB - [0x00000063, 0x00000043, 0x00000000, 0x00000000], // KeyC - [0x00000064, 0x00000044, 0x00000000, 0x00000000], // KeyD - [0x00000065, 0x00000045, 0x000020ac, 0x00000000], // KeyE - [0x00000066, 0x00000046, 0x00000000, 0x00000000], // KeyF - [0x00000067, 0x00000047, 0x00000000, 0x00000000], // KeyG - [0x00000068, 0x00000048, 0x00000000, 0x00000000], // KeyH - [0x00000069, 0x00000049, 0x00000000, 0x00000000], // KeyI - [0x0000006a, 0x0000004a, 0x00000000, 0x00000000], // KeyJ - [0x0000006b, 0x0000004b, 0x00000000, 0x00000000], // KeyK - [0x0000006c, 0x0000004c, 0x00000000, 0x00000000], // KeyL - [0x0000006d, 0x0000004d, 0x000000b5, 0x00000000], // KeyM - [0x0000006e, 0x0000004e, 0x00000000, 0x00000000], // KeyN - [0x0000006f, 0x0000004f, 0x00000000, 0x00000000], // KeyO - [0x00000070, 0x00000050, 0x00000000, 0x00000000], // KeyP - [0x00000071, 0x00000051, 0x00000000, 0x00000000], // KeyQ - [0x00000072, 0x00000052, 0x00000000, 0x00000000], // KeyR - [0x00000073, 0x00000053, 0x00000000, 0x00000000], // KeyS - [0x00000074, 0x00000054, 0x00000000, 0x00000000], // KeyT - [0x00000075, 0x00000055, 0x00000000, 0x00000000], // KeyU - [0x00000076, 0x00000056, 0x00000000, 0x00000000], // KeyV - [0x00000077, 0x00000057, 0x00000000, 0x00000000], // KeyW - [0x00000078, 0x00000058, 0x00000000, 0x00000000], // KeyX - [0x00000079, 0x00000059, 0x00000000, 0x00000000], // KeyY - [0x0000007a, 0x0000005a, 0x00000000, 0x00000000], // KeyZ - [0x00000031, 0x00000021, 0x00000000, 0x00000000], // Digit1 - [0x00000032, 0x00000022, 0x00000040, 0x00000000], // Digit2 - [0x00000033, 0x00000023, 0x000000a3, 0x00000000], // Digit3 - [0x00000034, 0x000000a4, 0x00000024, 0x00000000], // Digit4 - [0x00000035, 0x00000025, 0x000020ac, 0x00000000], // Digit5 - [0x00000036, 0x00000026, 0x00000000, 0x00000000], // Digit6 - [0x00000037, 0x0000002f, 0x0000007b, 0x00000000], // Digit7 - [0x00000038, 0x00000028, 0x0000005b, 0x00000000], // Digit8 - [0x00000039, 0x00000029, 0x0000005d, 0x00000000], // Digit9 - [0x00000030, 0x0000003d, 0x0000007d, 0x00000000], // Digit0 - [0x0000002b, 0x0000003f, 0x00000000, 0x00000000], // Minus - [0x0000005c, 0x00000060, 0x000000b4, 0x00000000], // Equal - [0x000000e5, 0x000000c5, 0x00000000, 0x00000000], // BracketLeft - [0x000000a8, 0x0000005e, 0x0000007e, 0x00000000], // BracketRight - [0x00000027, 0x0000002a, 0x00000000, 0x00000000], // Backslash - [0x000000f8, 0x000000d8, 0x00000000, 0x00000000], // Semicolon - [0x000000e6, 0x000000c6, 0x00000000, 0x00000000], // Quote - [0x0000007c, 0x000000a7, 0x00000000, 0x00000000], // Backquote - [0x0000002c, 0x0000003b, 0x00000000, 0x00000000], // Comma - [0x0000002e, 0x0000003a, 0x00000000, 0x00000000], // Period - [0x0000002d, 0x0000005f, 0x00000000, 0x00000000], // Slash - ], - ), - - LayoutInfo( - name: 'pl', - platform: LayoutPlatform.win, - mapping: >[ - [0x00000061, 0x00000041, 0x00000105, 0x00000104], // KeyA - [0x00000062, 0x00000042, 0x00000000, 0x00000000], // KeyB - [0x00000063, 0x00000043, 0x00000107, 0x00000106], // KeyC - [0x00000064, 0x00000044, 0x00000000, 0x00000000], // KeyD - [0x00000065, 0x00000045, 0x00000119, 0x00000118], // KeyE - [0x00000066, 0x00000046, 0x00000000, 0x00000000], // KeyF - [0x00000067, 0x00000047, 0x00000000, 0x00000000], // KeyG - [0x00000068, 0x00000048, 0x00000000, 0x00000000], // KeyH - [0x00000069, 0x00000049, 0x00000000, 0x00000000], // KeyI - [0x0000006a, 0x0000004a, 0x00000000, 0x00000000], // KeyJ - [0x0000006b, 0x0000004b, 0x00000000, 0x00000000], // KeyK - [0x0000006c, 0x0000004c, 0x00000142, 0x00000141], // KeyL - [0x0000006d, 0x0000004d, 0x00000000, 0x00000000], // KeyM - [0x0000006e, 0x0000004e, 0x00000144, 0x00000143], // KeyN - [0x0000006f, 0x0000004f, 0x000000f3, 0x000000d3], // KeyO - [0x00000070, 0x00000050, 0x00000000, 0x00000000], // KeyP - [0x00000071, 0x00000051, 0x00000000, 0x00000000], // KeyQ - [0x00000072, 0x00000052, 0x00000000, 0x00000000], // KeyR - [0x00000073, 0x00000053, 0x0000015b, 0x0000015a], // KeyS - [0x00000074, 0x00000054, 0x00000000, 0x00000000], // KeyT - [0x00000075, 0x00000055, 0x000020ac, 0x00000000], // KeyU - [0x00000076, 0x00000056, 0x00000000, 0x00000000], // KeyV - [0x00000077, 0x00000057, 0x00000000, 0x00000000], // KeyW - [0x00000078, 0x00000058, 0x0000017a, 0x00000179], // KeyX - [0x00000079, 0x00000059, 0x00000000, 0x00000000], // KeyY - [0x0000007a, 0x0000005a, 0x0000017c, 0x0000017b], // KeyZ - [0x00000031, 0x00000021, 0x00000000, 0x00000000], // Digit1 - [0x00000032, 0x00000040, 0x00000000, 0x00000000], // Digit2 - [0x00000033, 0x00000023, 0x00000000, 0x00000000], // Digit3 - [0x00000034, 0x00000024, 0x00000000, 0x00000000], // Digit4 - [0x00000035, 0x00000025, 0x00000000, 0x00000000], // Digit5 - [0x00000036, 0x0000005e, 0x00000000, 0x00000000], // Digit6 - [0x00000037, 0x00000026, 0x00000000, 0x00000000], // Digit7 - [0x00000038, 0x0000002a, 0x00000000, 0x00000000], // Digit8 - [0x00000039, 0x00000028, 0x00000000, 0x00000000], // Digit9 - [0x00000030, 0x00000029, 0x00000000, 0x00000000], // Digit0 - [0x0000002d, 0x0000005f, 0x00000000, 0x00000000], // Minus - [0x0000003d, 0x0000002b, 0x00000000, 0x00000000], // Equal - [0x0000005b, 0x0000007b, 0x00000000, 0x00000000], // BracketLeft - [0x0000005d, 0x0000007d, 0x00000000, 0x00000000], // BracketRight - [0x0000005c, 0x0000007c, 0x00000000, 0x00000000], // Backslash - [0x0000003b, 0x0000003a, 0x00000000, 0x00000000], // Semicolon - [0x00000027, 0x00000022, 0x00000000, 0x00000000], // Quote - [0x00000060, 0x0000007e, 0x00000000, 0x00000000], // Backquote - [0x0000002c, 0x0000003c, 0x00000000, 0x00000000], // Comma - [0x0000002e, 0x0000003e, 0x00000000, 0x00000000], // Period - [0x0000002f, 0x0000003f, 0x00000000, 0x00000000], // Slash - ], - ), - - LayoutInfo( - name: 'pl', - platform: LayoutPlatform.darwin, - mapping: >[ - [0x00000061, 0x00000041, 0x00000105, 0x00000104], // KeyA - [0x00000062, 0x00000042, 0x0000013c, 0x00000171], // KeyB - [0x00000063, 0x00000043, 0x00000107, 0x00000106], // KeyC - [0x00000064, 0x00000044, 0x00002202, 0x0000017d], // KeyD - [0x00000065, 0x00000045, 0x00000119, 0x00000118], // KeyE - [0x00000066, 0x00000046, 0x00000144, 0x0000017e], // KeyF - [0x00000067, 0x00000047, 0x000000a9, 0x0000016a], // KeyG - [0x00000068, 0x00000048, 0x00000137, 0x000000d3], // KeyH - [0x00000069, 0x00000049, 0x0000005e, 0x00000165], // KeyI - [0x0000006a, 0x0000004a, 0x00002206, 0x000000d4], // KeyJ - [0x0000006b, 0x0000004b, 0x0000017b, 0x0000016b], // KeyK - [0x0000006c, 0x0000004c, 0x00000142, 0x00000141], // KeyL - [0x0000006d, 0x0000004d, 0x00000136, 0x00000173], // KeyM - [0x0000006e, 0x0000004e, 0x00000144, 0x00000143], // KeyN - [0x0000006f, 0x0000004f, 0x000000f3, 0x000000d3], // KeyO - [0x00000070, 0x00000050, 0x0000013b, 0x00000142], // KeyP - [0x00000071, 0x00000051, 0x0000014c, 0x00000151], // KeyQ - [0x00000072, 0x00000052, 0x000000ae, 0x000000a3], // KeyR - [0x00000073, 0x00000053, 0x0000015b, 0x0000015a], // KeyS - [0x00000074, 0x00000054, 0x00002020, 0x0000015b], // KeyT - [0x00000075, 0x00000055, 0x000000a8, 0x00000164], // KeyU - [0x00000076, 0x00000056, 0x0000221a, 0x000025ca], // KeyV - [0x00000077, 0x00000057, 0x00002211, 0x0000201e], // KeyW - [0x00000078, 0x00000058, 0x0000017a, 0x00000179], // KeyX - [0x00000079, 0x00000059, 0x0000012b, 0x000000c1], // KeyY - [0x0000007a, 0x0000005a, 0x0000017c, 0x0000017b], // KeyZ - [0x00000031, 0x00000021, 0x00000143, 0x00000155], // Digit1 - [0x00000032, 0x00000040, 0x00002122, 0x00000158], // Digit2 - [0x00000033, 0x00000023, 0x000020ac, 0x00002039], // Digit3 - [0x00000034, 0x00000024, 0x000000df, 0x0000203a], // Digit4 - [0x00000035, 0x00000025, 0x0000012f, 0x00000159], // Digit5 - [0x00000036, 0x0000005e, 0x000000a7, 0x00000156], // Digit6 - [0x00000037, 0x00000026, 0x000000b6, 0x00000157], // Digit7 - [0x00000038, 0x0000002a, 0x00002022, 0x000000b0], // Digit8 - [0x00000039, 0x00000028, 0x0000013d, 0x00000160], // Digit9 - [0x00000030, 0x00000029, 0x0000013e, 0x0000201a], // Digit0 - [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Minus - [0x0000003d, 0x0000002b, 0x00002260, 0x0000012a], // Equal - [0x0000005b, 0x0000007b, 0x0000201e, 0x0000201d], // BracketLeft - [0x0000005d, 0x0000007d, 0x0000201a, 0x00002019], // BracketRight - [0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb], // Backslash - [0x0000003b, 0x0000003a, 0x00002026, 0x000000da], // Semicolon - [0x00000027, 0x00000022, 0x0000013a, 0x00000123], // Quote - [0x00000060, 0x0000007e, 0x00000060, 0x00000154], // Backquote - [0x0000002c, 0x0000003c, 0x00002264, 0x000000dd], // Comma - [0x0000002e, 0x0000003e, 0x00002265, 0x000000fd], // Period - [0x0000002f, 0x0000003f, 0x000000f7, 0x00000146], // Slash - ], - ), - - LayoutInfo( - name: 'pt', - platform: LayoutPlatform.win, - mapping: >[ - [0x00000061, 0x00000041, 0x00000000, 0x00000000], // KeyA - [0x00000062, 0x00000042, 0x00000000, 0x00000000], // KeyB - [0x00000063, 0x00000043, 0x00000000, 0x00000000], // KeyC - [0x00000064, 0x00000044, 0x00000000, 0x00000000], // KeyD - [0x00000065, 0x00000045, 0x000020ac, 0x00000000], // KeyE - [0x00000066, 0x00000046, 0x00000000, 0x00000000], // KeyF - [0x00000067, 0x00000047, 0x00000000, 0x00000000], // KeyG - [0x00000068, 0x00000048, 0x00000000, 0x00000000], // KeyH - [0x00000069, 0x00000049, 0x00000000, 0x00000000], // KeyI - [0x0000006a, 0x0000004a, 0x00000000, 0x00000000], // KeyJ - [0x0000006b, 0x0000004b, 0x00000000, 0x00000000], // KeyK - [0x0000006c, 0x0000004c, 0x00000000, 0x00000000], // KeyL - [0x0000006d, 0x0000004d, 0x00000000, 0x00000000], // KeyM - [0x0000006e, 0x0000004e, 0x00000000, 0x00000000], // KeyN - [0x0000006f, 0x0000004f, 0x00000000, 0x00000000], // KeyO - [0x00000070, 0x00000050, 0x00000000, 0x00000000], // KeyP - [0x00000071, 0x00000051, 0x00000000, 0x00000000], // KeyQ - [0x00000072, 0x00000052, 0x00000000, 0x00000000], // KeyR - [0x00000073, 0x00000053, 0x00000000, 0x00000000], // KeyS - [0x00000074, 0x00000054, 0x00000000, 0x00000000], // KeyT - [0x00000075, 0x00000055, 0x00000000, 0x00000000], // KeyU - [0x00000076, 0x00000056, 0x00000000, 0x00000000], // KeyV - [0x00000077, 0x00000057, 0x00000000, 0x00000000], // KeyW - [0x00000078, 0x00000058, 0x00000000, 0x00000000], // KeyX - [0x00000079, 0x00000059, 0x00000000, 0x00000000], // KeyY - [0x0000007a, 0x0000005a, 0x00000000, 0x00000000], // KeyZ - [0x00000031, 0x00000021, 0x00000000, 0x00000000], // Digit1 - [0x00000032, 0x00000022, 0x00000040, 0x00000000], // Digit2 - [0x00000033, 0x00000023, 0x000000a3, 0x00000000], // Digit3 - [0x00000034, 0x00000024, 0x000000a7, 0x00000000], // Digit4 - [0x00000035, 0x00000025, 0x000020ac, 0x00000000], // Digit5 - [0x00000036, 0x00000026, 0x00000000, 0x00000000], // Digit6 - [0x00000037, 0x0000002f, 0x0000007b, 0x00000000], // Digit7 - [0x00000038, 0x00000028, 0x0000005b, 0x00000000], // Digit8 - [0x00000039, 0x00000029, 0x0000005d, 0x00000000], // Digit9 - [0x00000030, 0x0000003d, 0x0000007d, 0x00000000], // Digit0 - [0x00000027, 0x0000003f, 0x00000000, 0x00000000], // Minus - [0x000000ab, 0x000000bb, 0x00000000, 0x00000000], // Equal - [0x0000002b, 0x0000002a, 0x000000a8, 0x00000000], // BracketLeft - [0x000000b4, 0x00000060, 0x0000005d, 0x00000000], // BracketRight - [0x0000007e, 0x0000005e, 0x00000000, 0x00000000], // Backslash - [0x000000e7, 0x000000c7, 0x00000000, 0x00000000], // Semicolon - [0x000000ba, 0x000000aa, 0x00000000, 0x00000000], // Quote - [0x0000005c, 0x0000007c, 0x00000000, 0x00000000], // Backquote - [0x0000002c, 0x0000003b, 0x00000000, 0x00000000], // Comma - [0x0000002e, 0x0000003a, 0x00000000, 0x00000000], // Period - [0x0000002d, 0x0000005f, 0x00000000, 0x00000000], // Slash - ], - ), - - LayoutInfo( - name: 'pt', - platform: LayoutPlatform.darwin, - mapping: >[ - [0x00000061, 0x00000041, 0x000000e5, 0x000000c5], // KeyA - [0x00000062, 0x00000042, 0x0000222b, 0x00000131], // KeyB - [0x00000063, 0x00000043, 0x000000e7, 0x000000c7], // KeyC - [0x00000064, 0x00000044, 0x00002202, 0x000000ce], // KeyD - [0x00000065, 0x00000045, 0x000000b4, 0x000000b4], // KeyE - [0x00000066, 0x00000046, 0x00000192, 0x000000cf], // KeyF - [0x00000067, 0x00000047, 0x000000a9, 0x000002dd], // KeyG - [0x00000068, 0x00000048, 0x000002d9, 0x000000d3], // KeyH - [0x00000069, 0x00000049, 0x000002c6, 0x000002c6], // KeyI - [0x0000006a, 0x0000004a, 0x00002206, 0x000000d4], // KeyJ - [0x0000006b, 0x0000004b, 0x000002da, 0x0000f8ff], // KeyK - [0x0000006c, 0x0000004c, 0x000000ac, 0x000000d2], // KeyL - [0x0000006d, 0x0000004d, 0x000000b5, 0x000000c2], // KeyM - [0x0000006e, 0x0000004e, 0x000002dc, 0x000002dc], // KeyN - [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO - [0x00000070, 0x00000050, 0x000003c0, 0x0000220f], // KeyP - [0x00000071, 0x00000051, 0x00000153, 0x00000152], // KeyQ - [0x00000072, 0x00000052, 0x000000ae, 0x00002030], // KeyR - [0x00000073, 0x00000053, 0x000000df, 0x000000cd], // KeyS - [0x00000074, 0x00000054, 0x00002020, 0x000002c7], // KeyT - [0x00000075, 0x00000055, 0x000000a8, 0x000000a8], // KeyU - [0x00000076, 0x00000056, 0x0000221a, 0x000025ca], // KeyV - [0x00000077, 0x00000057, 0x00002211, 0x0000201e], // KeyW - [0x00000078, 0x00000058, 0x00002248, 0x000002db], // KeyX - [0x00000079, 0x00000059, 0x000000a5, 0x000000c1], // KeyY - [0x0000007a, 0x0000005a, 0x000003a9, 0x000000b8], // KeyZ - [0x00000031, 0x00000021, 0x000000a1, 0x00002044], // Digit1 - [0x00000032, 0x00000040, 0x00002122, 0x000020ac], // Digit2 - [0x00000033, 0x00000023, 0x000000a3, 0x00002039], // Digit3 - [0x00000034, 0x00000024, 0x000000a2, 0x0000203a], // Digit4 - [0x00000035, 0x00000025, 0x0000221e, 0x0000fb01], // Digit5 - [0x00000036, 0x000002c6, 0x000000a7, 0x0000fb02], // Digit6 - [0x00000037, 0x00000026, 0x000000b6, 0x00002021], // Digit7 - [0x00000038, 0x0000002a, 0x00002022, 0x000000b0], // Digit8 - [0x00000039, 0x00000028, 0x000000aa, 0x000000b7], // Digit9 - [0x00000030, 0x00000029, 0x000000ba, 0x0000201a], // Digit0 - [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Minus - [0x0000003d, 0x0000002b, 0x00002260, 0x000000b1], // Equal - [0x0000005b, 0x0000007b, 0x0000201c, 0x0000201d], // BracketLeft - [0x0000005d, 0x0000007d, 0x00002018, 0x00002019], // BracketRight - [0x0000005c, 0x0000007c, 0x000000ab, 0x000000bb], // Backslash - [0x0000003b, 0x0000003a, 0x00002026, 0x000000da], // Semicolon - [0x00000027, 0x00000022, 0x000000e6, 0x000000c6], // Quote - [0x00000060, 0x000002dc, 0x00000060, 0x00000060], // Backquote - [0x0000002c, 0x0000003c, 0x00002264, 0x000000af], // Comma - [0x0000002e, 0x0000003e, 0x00002265, 0x000002d8], // Period - [0x0000002f, 0x0000003f, 0x000000f7, 0x000000bf], // Slash - ], - ), - - LayoutInfo( - name: 'pt-br', - platform: LayoutPlatform.win, - mapping: >[ - [0x00000061, 0x00000041, 0x00000000, 0x00000000], // KeyA - [0x00000062, 0x00000042, 0x00000000, 0x00000000], // KeyB - [0x00000063, 0x00000043, 0x000020a2, 0x00000000], // KeyC - [0x00000064, 0x00000044, 0x00000000, 0x00000000], // KeyD - [0x00000065, 0x00000045, 0x000000b0, 0x00000000], // KeyE - [0x00000066, 0x00000046, 0x00000000, 0x00000000], // KeyF - [0x00000067, 0x00000047, 0x00000000, 0x00000000], // KeyG - [0x00000068, 0x00000048, 0x00000000, 0x00000000], // KeyH - [0x00000069, 0x00000049, 0x00000000, 0x00000000], // KeyI - [0x0000006a, 0x0000004a, 0x00000000, 0x00000000], // KeyJ - [0x0000006b, 0x0000004b, 0x00000000, 0x00000000], // KeyK - [0x0000006c, 0x0000004c, 0x00000000, 0x00000000], // KeyL - [0x0000006d, 0x0000004d, 0x00000000, 0x00000000], // KeyM - [0x0000006e, 0x0000004e, 0x00000000, 0x00000000], // KeyN - [0x0000006f, 0x0000004f, 0x00000000, 0x00000000], // KeyO - [0x00000070, 0x00000050, 0x00000000, 0x00000000], // KeyP - [0x00000071, 0x00000051, 0x0000002f, 0x00000000], // KeyQ - [0x00000072, 0x00000052, 0x00000000, 0x00000000], // KeyR - [0x00000073, 0x00000053, 0x00000000, 0x00000000], // KeyS - [0x00000074, 0x00000054, 0x00000000, 0x00000000], // KeyT - [0x00000075, 0x00000055, 0x00000000, 0x00000000], // KeyU - [0x00000076, 0x00000056, 0x00000000, 0x00000000], // KeyV - [0x00000077, 0x00000057, 0x0000003f, 0x00000000], // KeyW - [0x00000078, 0x00000058, 0x00000000, 0x00000000], // KeyX - [0x00000079, 0x00000059, 0x00000000, 0x00000000], // KeyY - [0x0000007a, 0x0000005a, 0x00000000, 0x00000000], // KeyZ - [0x00000031, 0x00000021, 0x000000b9, 0x00000000], // Digit1 - [0x00000032, 0x00000040, 0x000000b2, 0x00000000], // Digit2 - [0x00000033, 0x00000023, 0x000000b3, 0x00000000], // Digit3 - [0x00000034, 0x00000024, 0x000000a3, 0x00000000], // Digit4 - [0x00000035, 0x00000025, 0x000000a2, 0x00000000], // Digit5 - [0x00000036, 0x000000a8, 0x000000ac, 0x00000000], // Digit6 - [0x00000037, 0x00000026, 0x00000000, 0x00000000], // Digit7 - [0x00000038, 0x0000002a, 0x00000000, 0x00000000], // Digit8 - [0x00000039, 0x00000028, 0x00000000, 0x00000000], // Digit9 - [0x00000030, 0x00000029, 0x00000000, 0x00000000], // Digit0 - [0x0000002d, 0x0000005f, 0x00000000, 0x00000000], // Minus - [0x0000003d, 0x0000002b, 0x000000a7, 0x00000000], // Equal - [0x000000b4, 0x00000060, 0x00000000, 0x00000000], // BracketLeft - [0x0000005b, 0x0000007b, 0x000000aa, 0x00000000], // BracketRight - [0x0000005d, 0x0000007d, 0x000000ba, 0x00000000], // Backslash - [0x000000e7, 0x000000c7, 0x00000000, 0x00000000], // Semicolon - [0x0000007e, 0x0000005e, 0x00000000, 0x00000000], // Quote - [0x00000027, 0x00000022, 0x00000000, 0x00000000], // Backquote - [0x0000002c, 0x0000003c, 0x00000000, 0x00000000], // Comma - [0x0000002e, 0x0000003e, 0x00000000, 0x00000000], // Period - [0x0000003b, 0x0000003a, 0x00000000, 0x00000000], // Slash - ], - ), - - LayoutInfo( - name: 'ru', - platform: LayoutPlatform.win, - mapping: >[ - [0x00000444, 0x00000424, 0x00000000, 0x00000000], // KeyA - [0x00000438, 0x00000418, 0x00000000, 0x00000000], // KeyB - [0x00000441, 0x00000421, 0x00000000, 0x00000000], // KeyC - [0x00000432, 0x00000412, 0x00000000, 0x00000000], // KeyD - [0x00000443, 0x00000423, 0x00000000, 0x00000000], // KeyE - [0x00000430, 0x00000410, 0x00000000, 0x00000000], // KeyF - [0x0000043f, 0x0000041f, 0x00000000, 0x00000000], // KeyG - [0x00000440, 0x00000420, 0x00000000, 0x00000000], // KeyH - [0x00000448, 0x00000428, 0x00000000, 0x00000000], // KeyI - [0x0000043e, 0x0000041e, 0x00000000, 0x00000000], // KeyJ - [0x0000043b, 0x0000041b, 0x00000000, 0x00000000], // KeyK - [0x00000434, 0x00000414, 0x00000000, 0x00000000], // KeyL - [0x0000044c, 0x0000042c, 0x00000000, 0x00000000], // KeyM - [0x00000442, 0x00000422, 0x00000000, 0x00000000], // KeyN - [0x00000449, 0x00000429, 0x00000000, 0x00000000], // KeyO - [0x00000437, 0x00000417, 0x00000000, 0x00000000], // KeyP - [0x00000439, 0x00000419, 0x00000000, 0x00000000], // KeyQ - [0x0000043a, 0x0000041a, 0x00000000, 0x00000000], // KeyR - [0x0000044b, 0x0000042b, 0x00000000, 0x00000000], // KeyS - [0x00000435, 0x00000415, 0x00000000, 0x00000000], // KeyT - [0x00000433, 0x00000413, 0x00000000, 0x00000000], // KeyU - [0x0000043c, 0x0000041c, 0x00000000, 0x00000000], // KeyV - [0x00000446, 0x00000426, 0x00000000, 0x00000000], // KeyW - [0x00000447, 0x00000427, 0x00000000, 0x00000000], // KeyX - [0x0000043d, 0x0000041d, 0x00000000, 0x00000000], // KeyY - [0x0000044f, 0x0000042f, 0x00000000, 0x00000000], // KeyZ - [0x00000031, 0x00000021, 0x00000000, 0x00000000], // Digit1 - [0x00000032, 0x00000022, 0x00000000, 0x00000000], // Digit2 - [0x00000033, 0x00002116, 0x00000000, 0x00000000], // Digit3 - [0x00000034, 0x0000003b, 0x00000000, 0x00000000], // Digit4 - [0x00000035, 0x00000025, 0x00000000, 0x00000000], // Digit5 - [0x00000036, 0x0000003a, 0x00000000, 0x00000000], // Digit6 - [0x00000037, 0x0000003f, 0x00000000, 0x00000000], // Digit7 - [0x00000038, 0x0000002a, 0x000020bd, 0x00000000], // Digit8 - [0x00000039, 0x00000028, 0x00000000, 0x00000000], // Digit9 - [0x00000030, 0x00000029, 0x00000000, 0x00000000], // Digit0 - [0x0000002d, 0x0000005f, 0x00000000, 0x00000000], // Minus - [0x0000003d, 0x0000002b, 0x00000000, 0x00000000], // Equal - [0x00000445, 0x00000425, 0x00000000, 0x00000000], // BracketLeft - [0x0000044a, 0x0000042a, 0x00000000, 0x00000000], // BracketRight - [0x0000005c, 0x0000002f, 0x00000000, 0x00000000], // Backslash - [0x00000436, 0x00000416, 0x00000000, 0x00000000], // Semicolon - [0x0000044d, 0x0000042d, 0x00000000, 0x00000000], // Quote - [0x00000451, 0x00000401, 0x00000000, 0x00000000], // Backquote - [0x00000431, 0x00000411, 0x00000000, 0x00000000], // Comma - [0x0000044e, 0x0000042e, 0x00000000, 0x00000000], // Period - [0x0000002e, 0x0000002c, 0x00000000, 0x00000000], // Slash - ], - ), - - LayoutInfo( - name: 'ru', - platform: LayoutPlatform.linux, - mapping: >[ - [0x00000444, 0x00000424, 0x00000444, 0x00000424], // KeyA - [0x00000438, 0x00000418, 0x00000438, 0x00000418], // KeyB - [0x00000441, 0x00000421, 0x00000441, 0x00000421], // KeyC - [0x00000432, 0x00000412, 0x00000432, 0x00000412], // KeyD - [0x00000443, 0x00000423, 0x00000443, 0x00000423], // KeyE - [0x00000430, 0x00000410, 0x00000430, 0x00000410], // KeyF - [0x0000043f, 0x0000041f, 0x0000043f, 0x0000041f], // KeyG - [0x00000440, 0x00000420, 0x00000440, 0x00000420], // KeyH - [0x00000448, 0x00000428, 0x00000448, 0x00000428], // KeyI - [0x0000043e, 0x0000041e, 0x0000043e, 0x0000041e], // KeyJ - [0x0000043b, 0x0000041b, 0x0000043b, 0x0000041b], // KeyK - [0x00000434, 0x00000414, 0x00000434, 0x00000414], // KeyL - [0x0000044c, 0x0000042c, 0x0000044c, 0x0000042c], // KeyM - [0x00000442, 0x00000422, 0x00000442, 0x00000422], // KeyN - [0x00000449, 0x00000429, 0x00000449, 0x00000429], // KeyO - [0x00000437, 0x00000417, 0x00000437, 0x00000417], // KeyP - [0x00000439, 0x00000419, 0x00000439, 0x00000419], // KeyQ - [0x0000043a, 0x0000041a, 0x0000043a, 0x0000041a], // KeyR - [0x0000044b, 0x0000042b, 0x0000044b, 0x0000042b], // KeyS - [0x00000435, 0x00000415, 0x00000435, 0x00000415], // KeyT - [0x00000433, 0x00000413, 0x00000433, 0x00000413], // KeyU - [0x0000043c, 0x0000041c, 0x0000043c, 0x0000041c], // KeyV - [0x00000446, 0x00000426, 0x00000446, 0x00000426], // KeyW - [0x00000447, 0x00000427, 0x00000447, 0x00000427], // KeyX - [0x0000043d, 0x0000041d, 0x0000043d, 0x0000041d], // KeyY - [0x0000044f, 0x0000042f, 0x0000044f, 0x0000042f], // KeyZ - [0x00000031, 0x00000021, 0x00000031, 0x00000021], // Digit1 - [0x00000032, 0x00000022, 0x00000032, 0x00000022], // Digit2 - [0x00000033, 0x00002116, 0x00000033, 0x00002116], // Digit3 - [0x00000034, 0x0000003b, 0x00000034, 0x0000003b], // Digit4 - [0x00000035, 0x00000025, 0x00000035, 0x00000025], // Digit5 - [0x00000036, 0x0000003a, 0x00000036, 0x0000003a], // Digit6 - [0x00000037, 0x0000003f, 0x00000037, 0x0000003f], // Digit7 - [0x00000038, 0x0000002a, 0x000020bd, 0x00000000], // Digit8 - [0x00000039, 0x00000028, 0x00000039, 0x00000028], // Digit9 - [0x00000030, 0x00000029, 0x00000030, 0x00000029], // Digit0 - [0x0000002d, 0x0000005f, 0x0000002d, 0x0000005f], // Minus - [0x0000003d, 0x0000002b, 0x0000003d, 0x0000002b], // Equal - [0x00000445, 0x00000425, 0x00000445, 0x00000425], // BracketLeft - [0x0000044a, 0x0000042a, 0x0000044a, 0x0000042a], // BracketRight - [0x0000005c, 0x0000002f, 0x0000005c, 0x0000002f], // Backslash - [0x00000436, 0x00000416, 0x00000436, 0x00000416], // Semicolon - [0x0000044d, 0x0000042d, 0x0000044d, 0x0000042d], // Quote - [0x00000451, 0x00000401, 0x00000451, 0x00000401], // Backquote - [0x00000431, 0x00000411, 0x00000431, 0x00000411], // Comma - [0x0000044e, 0x0000042e, 0x0000044e, 0x0000042e], // Period - [0x0000002e, 0x0000002c, 0x0000002e, 0x0000002c], // Slash - ], - ), - - LayoutInfo( - name: 'ru', - platform: LayoutPlatform.darwin, - mapping: >[ - [0x00000444, 0x00000424, 0x00000192, 0x00000192], // KeyA - [0x00000438, 0x00000418, 0x00000438, 0x00000418], // KeyB - [0x00000441, 0x00000421, 0x00002260, 0x00002260], // KeyC - [0x00000432, 0x00000412, 0x0000045b, 0x0000040b], // KeyD - [0x00000443, 0x00000423, 0x0000045c, 0x0000040c], // KeyE - [0x00000430, 0x00000410, 0x000000f7, 0x000000f7], // KeyF - [0x0000043f, 0x0000041f, 0x000000a9, 0x000000a9], // KeyG - [0x00000440, 0x00000420, 0x000020bd, 0x000020bd], // KeyH - [0x00000448, 0x00000428, 0x00000455, 0x00000405], // KeyI - [0x0000043e, 0x0000041e, 0x000000b0, 0x00002022], // KeyJ - [0x0000043b, 0x0000041b, 0x00000459, 0x00000409], // KeyK - [0x00000434, 0x00000414, 0x00002206, 0x00002206], // KeyL - [0x0000044c, 0x0000042c, 0x0000007e, 0x0000007e], // KeyM - [0x00000442, 0x00000422, 0x00002122, 0x00002122], // KeyN - [0x00000449, 0x00000429, 0x0000045e, 0x0000040e], // KeyO - [0x00000437, 0x00000417, 0x00002018, 0x00002019], // KeyP - [0x00000439, 0x00000419, 0x00000458, 0x00000408], // KeyQ - [0x0000043a, 0x0000041a, 0x000000ae, 0x000000ae], // KeyR - [0x0000044b, 0x0000042b, 0x0000044b, 0x0000042b], // KeyS - [0x00000435, 0x00000415, 0x00002020, 0x00002020], // KeyT - [0x00000433, 0x00000413, 0x00000453, 0x00000403], // KeyU - [0x0000043c, 0x0000041c, 0x000000b5, 0x000000b5], // KeyV - [0x00000446, 0x00000426, 0x0000045f, 0x0000040f], // KeyW - [0x00000447, 0x00000427, 0x00002248, 0x00002248], // KeyX - [0x0000043d, 0x0000041d, 0x0000045a, 0x0000040a], // KeyY - [0x0000044f, 0x0000042f, 0x00000452, 0x00000402], // KeyZ - [0x00000031, 0x00000021, 0x00000021, 0x0000007c], // Digit1 - [0x00000032, 0x00000022, 0x00000040, 0x00000022], // Digit2 - [0x00000033, 0x00002116, 0x00000023, 0x000000a3], // Digit3 - [0x00000034, 0x00000025, 0x00000024, 0x000020ac], // Digit4 - [0x00000035, 0x0000003a, 0x00000025, 0x0000221e], // Digit5 - [0x00000036, 0x0000002c, 0x0000005e, 0x000000ac], // Digit6 - [0x00000037, 0x0000002e, 0x00000026, 0x000000b6], // Digit7 - [0x00000038, 0x0000003b, 0x0000002a, 0x0000221a], // Digit8 - [0x00000039, 0x00000028, 0x0000007b, 0x00000027], // Digit9 - [0x00000030, 0x00000029, 0x0000007d, 0x00000060], // Digit0 - [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Minus - [0x0000003d, 0x0000002b, 0x000000bb, 0x000000ab], // Equal - [0x00000445, 0x00000425, 0x0000201c, 0x0000201d], // BracketLeft - [0x0000044a, 0x0000042a, 0x0000044a, 0x0000042a], // BracketRight - [0x00000451, 0x00000401, 0x00000451, 0x00000401], // Backslash - [0x00000436, 0x00000416, 0x00002026, 0x00002026], // Semicolon - [0x0000044d, 0x0000042d, 0x0000044d, 0x0000042d], // Quote - [0x0000005d, 0x0000005b, 0x0000005d, 0x0000005b], // Backquote - [0x00000431, 0x00000411, 0x00002264, 0x0000003c], // Comma - [0x0000044e, 0x0000042e, 0x00002265, 0x0000003e], // Period - [0x0000002f, 0x0000003f, 0x0000201c, 0x0000201e], // Slash - ], - ), - - LayoutInfo( - name: 'sv', - platform: LayoutPlatform.win, - mapping: >[ - [0x00000061, 0x00000041, 0x00000000, 0x00000000], // KeyA - [0x00000062, 0x00000042, 0x00000000, 0x00000000], // KeyB - [0x00000063, 0x00000043, 0x00000000, 0x00000000], // KeyC - [0x00000064, 0x00000044, 0x00000000, 0x00000000], // KeyD - [0x00000065, 0x00000045, 0x000020ac, 0x00000000], // KeyE - [0x00000066, 0x00000046, 0x00000000, 0x00000000], // KeyF - [0x00000067, 0x00000047, 0x00000000, 0x00000000], // KeyG - [0x00000068, 0x00000048, 0x00000000, 0x00000000], // KeyH - [0x00000069, 0x00000049, 0x00000000, 0x00000000], // KeyI - [0x0000006a, 0x0000004a, 0x00000000, 0x00000000], // KeyJ - [0x0000006b, 0x0000004b, 0x00000000, 0x00000000], // KeyK - [0x0000006c, 0x0000004c, 0x00000000, 0x00000000], // KeyL - [0x0000006d, 0x0000004d, 0x000000b5, 0x00000000], // KeyM - [0x0000006e, 0x0000004e, 0x00000000, 0x00000000], // KeyN - [0x0000006f, 0x0000004f, 0x00000000, 0x00000000], // KeyO - [0x00000070, 0x00000050, 0x00000000, 0x00000000], // KeyP - [0x00000071, 0x00000051, 0x00000000, 0x00000000], // KeyQ - [0x00000072, 0x00000052, 0x00000000, 0x00000000], // KeyR - [0x00000073, 0x00000053, 0x00000000, 0x00000000], // KeyS - [0x00000074, 0x00000054, 0x00000000, 0x00000000], // KeyT - [0x00000075, 0x00000055, 0x00000000, 0x00000000], // KeyU - [0x00000076, 0x00000056, 0x00000000, 0x00000000], // KeyV - [0x00000077, 0x00000057, 0x00000000, 0x00000000], // KeyW - [0x00000078, 0x00000058, 0x00000000, 0x00000000], // KeyX - [0x00000079, 0x00000059, 0x00000000, 0x00000000], // KeyY - [0x0000007a, 0x0000005a, 0x00000000, 0x00000000], // KeyZ - [0x00000031, 0x00000021, 0x00000000, 0x00000000], // Digit1 - [0x00000032, 0x00000022, 0x00000040, 0x00000000], // Digit2 - [0x00000033, 0x00000023, 0x000000a3, 0x00000000], // Digit3 - [0x00000034, 0x000000a4, 0x00000024, 0x00000000], // Digit4 - [0x00000035, 0x00000025, 0x000020ac, 0x00000000], // Digit5 - [0x00000036, 0x00000026, 0x00000000, 0x00000000], // Digit6 - [0x00000037, 0x0000002f, 0x0000007b, 0x00000000], // Digit7 - [0x00000038, 0x00000028, 0x0000005b, 0x00000000], // Digit8 - [0x00000039, 0x00000029, 0x0000005d, 0x00000000], // Digit9 - [0x00000030, 0x0000003d, 0x0000007d, 0x00000000], // Digit0 - [0x0000002b, 0x0000003f, 0x0000005c, 0x00000000], // Minus - [0x000000b4, 0x00000060, 0x00000000, 0x00000000], // Equal - [0x000000e5, 0x000000c5, 0x00000000, 0x00000000], // BracketLeft - [0x000000a8, 0x0000005e, 0x0000007e, 0x00000000], // BracketRight - [0x00000027, 0x0000002a, 0x00000000, 0x00000000], // Backslash - [0x000000f6, 0x000000d6, 0x00000000, 0x00000000], // Semicolon - [0x000000e4, 0x000000c4, 0x00000000, 0x00000000], // Quote - [0x000000a7, 0x000000bd, 0x00000000, 0x00000000], // Backquote - [0x0000002c, 0x0000003b, 0x00000000, 0x00000000], // Comma - [0x0000002e, 0x0000003a, 0x00000000, 0x00000000], // Period - [0x0000002d, 0x0000005f, 0x00000000, 0x00000000], // Slash - ], - ), - - LayoutInfo( - name: 'sv', - platform: LayoutPlatform.darwin, - mapping: >[ - [0x00000061, 0x00000041, 0x0000f8ff, 0x000025ca], // KeyA - [0x00000062, 0x00000042, 0x0000203a, 0x000000bb], // KeyB - [0x00000063, 0x00000043, 0x000000e7, 0x000000c7], // KeyC - [0x00000064, 0x00000044, 0x00002202, 0x00002206], // KeyD - [0x00000065, 0x00000045, 0x000000e9, 0x000000c9], // KeyE - [0x00000066, 0x00000046, 0x00000192, 0x0000222b], // KeyF - [0x00000067, 0x00000047, 0x000000b8, 0x000000af], // KeyG - [0x00000068, 0x00000048, 0x000002db, 0x000002d8], // KeyH - [0x00000069, 0x00000049, 0x00000131, 0x000002c6], // KeyI - [0x0000006a, 0x0000004a, 0x0000221a, 0x000000ac], // KeyJ - [0x0000006b, 0x0000004b, 0x000000aa, 0x000000ba], // KeyK - [0x0000006c, 0x0000004c, 0x0000fb01, 0x0000fb02], // KeyL - [0x0000006d, 0x0000004d, 0x00002019, 0x0000201d], // KeyM - [0x0000006e, 0x0000004e, 0x00002018, 0x0000201c], // KeyN - [0x0000006f, 0x0000004f, 0x00000153, 0x00000152], // KeyO - [0x00000070, 0x00000050, 0x000003c0, 0x0000220f], // KeyP - [0x00000071, 0x00000051, 0x00002022, 0x000000b0], // KeyQ - [0x00000072, 0x00000052, 0x000000ae, 0x0000221a], // KeyR - [0x00000073, 0x00000053, 0x000000df, 0x00002211], // KeyS - [0x00000074, 0x00000054, 0x00002020, 0x00002021], // KeyT - [0x00000075, 0x00000055, 0x000000fc, 0x000000dc], // KeyU - [0x00000076, 0x00000056, 0x00002039, 0x000000ab], // KeyV - [0x00000077, 0x00000057, 0x000003a9, 0x000002dd], // KeyW - [0x00000078, 0x00000058, 0x00002248, 0x000002c7], // KeyX - [0x00000079, 0x00000059, 0x000000b5, 0x000002dc], // KeyY - [0x0000007a, 0x0000005a, 0x000000f7, 0x00002044], // KeyZ - [0x00000031, 0x00000021, 0x000000a9, 0x000000a1], // Digit1 - [0x00000032, 0x00000022, 0x00000040, 0x0000201d], // Digit2 - [0x00000033, 0x00000023, 0x000000a3, 0x000000a5], // Digit3 - [0x00000034, 0x000020ac, 0x00000024, 0x000000a2], // Digit4 - [0x00000035, 0x00000025, 0x0000221e, 0x00002030], // Digit5 - [0x00000036, 0x00000026, 0x000000a7, 0x000000b6], // Digit6 - [0x00000037, 0x0000002f, 0x0000007c, 0x0000005c], // Digit7 - [0x00000038, 0x00000028, 0x0000005b, 0x0000007b], // Digit8 - [0x00000039, 0x00000029, 0x0000005d, 0x0000007d], // Digit9 - [0x00000030, 0x0000003d, 0x00002248, 0x00002260], // Digit0 - [0x0000002b, 0x0000003f, 0x000000b1, 0x000000bf], // Minus - [0x000000b4, 0x00000060, 0x000000b4, 0x00000060], // Equal - [0x000000e5, 0x000000c5, 0x000002d9, 0x000002da], // BracketLeft - [0x000000a8, 0x0000005e, 0x0000007e, 0x0000005e], // BracketRight - [0x00000027, 0x0000002a, 0x00002122, 0x00002019], // Backslash - [0x000000f6, 0x000000d6, 0x000000f8, 0x000000d8], // Semicolon - [0x000000e4, 0x000000c4, 0x000000e6, 0x000000c6], // Quote - [0x0000003c, 0x0000003e, 0x00002264, 0x00002265], // Backquote - [0x0000002c, 0x0000003b, 0x0000201a, 0x0000201e], // Comma - [0x0000002e, 0x0000003a, 0x00002026, 0x000000b7], // Period - [0x0000002d, 0x0000005f, 0x00002013, 0x00002014], // Slash - ], - ), - - LayoutInfo( - name: 'thai', - platform: LayoutPlatform.win, - mapping: >[ - [0x00000e1f, 0x00000e24, 0x00000000, 0x00000000], // KeyA - [0x00000e34, 0x00000e3a, 0x00000000, 0x00000000], // KeyB - [0x00000e41, 0x00000e09, 0x00000000, 0x00000000], // KeyC - [0x00000e01, 0x00000e0f, 0x00000000, 0x00000000], // KeyD - [0x00000e33, 0x00000e0e, 0x00000000, 0x00000000], // KeyE - [0x00000e14, 0x00000e42, 0x00000000, 0x00000000], // KeyF - [0x00000e40, 0x00000e0c, 0x00000000, 0x00000000], // KeyG - [0x00000e49, 0x00000e47, 0x00000000, 0x00000000], // KeyH - [0x00000e23, 0x00000e13, 0x00000000, 0x00000000], // KeyI - [0x00000e48, 0x00000e4b, 0x00000000, 0x00000000], // KeyJ - [0x00000e32, 0x00000e29, 0x00000000, 0x00000000], // KeyK - [0x00000e2a, 0x00000e28, 0x00000000, 0x00000000], // KeyL - [0x00000e17, 0x0000003f, 0x00000000, 0x00000000], // KeyM - [0x00000e37, 0x00000e4c, 0x00000000, 0x00000000], // KeyN - [0x00000e19, 0x00000e2f, 0x00000000, 0x00000000], // KeyO - [0x00000e22, 0x00000e0d, 0x00000000, 0x00000000], // KeyP - [0x00000e46, 0x00000e50, 0x00000000, 0x00000000], // KeyQ - [0x00000e1e, 0x00000e11, 0x00000000, 0x00000000], // KeyR - [0x00000e2b, 0x00000e06, 0x00000000, 0x00000000], // KeyS - [0x00000e30, 0x00000e18, 0x00000000, 0x00000000], // KeyT - [0x00000e35, 0x00000e4a, 0x00000000, 0x00000000], // KeyU - [0x00000e2d, 0x00000e2e, 0x00000000, 0x00000000], // KeyV - [0x00000e44, 0x00000022, 0x00000000, 0x00000000], // KeyW - [0x00000e1b, 0x00000029, 0x00000000, 0x00000000], // KeyX - [0x00000e31, 0x00000e4d, 0x00000000, 0x00000000], // KeyY - [0x00000e1c, 0x00000028, 0x00000000, 0x00000000], // KeyZ - [0x00000e45, 0x0000002b, 0x00000000, 0x00000000], // Digit1 - [0x0000002f, 0x00000e51, 0x00000000, 0x00000000], // Digit2 - [0x0000002d, 0x00000e52, 0x00000000, 0x00000000], // Digit3 - [0x00000e20, 0x00000e53, 0x00000000, 0x00000000], // Digit4 - [0x00000e16, 0x00000e54, 0x00000000, 0x00000000], // Digit5 - [0x00000e38, 0x00000e39, 0x00000000, 0x00000000], // Digit6 - [0x00000e36, 0x00000e3f, 0x00000000, 0x00000000], // Digit7 - [0x00000e04, 0x00000e55, 0x00000000, 0x00000000], // Digit8 - [0x00000e15, 0x00000e56, 0x00000000, 0x00000000], // Digit9 - [0x00000e08, 0x00000e57, 0x00000000, 0x00000000], // Digit0 - [0x00000e02, 0x00000e58, 0x00000000, 0x00000000], // Minus - [0x00000e0a, 0x00000e59, 0x00000000, 0x00000000], // Equal - [0x00000e1a, 0x00000e10, 0x00000000, 0x00000000], // BracketLeft - [0x00000e25, 0x0000002c, 0x00000000, 0x00000000], // BracketRight - [0x00000e03, 0x00000e05, 0x00000000, 0x00000000], // Backslash - [0x00000e27, 0x00000e0b, 0x00000000, 0x00000000], // Semicolon - [0x00000e07, 0x0000002e, 0x00000000, 0x00000000], // Quote - [0x0000005f, 0x00000025, 0x00000000, 0x00000000], // Backquote - [0x00000e21, 0x00000e12, 0x00000000, 0x00000000], // Comma - [0x00000e43, 0x00000e2c, 0x00000000, 0x00000000], // Period - [0x00000e1d, 0x00000e26, 0x00000000, 0x00000000], // Slash - ], - ), - - LayoutInfo( - name: 'tr', - platform: LayoutPlatform.win, - mapping: >[ - [0x00000061, 0x00000041, 0x000000e6, 0x000000c6], // KeyA - [0x00000062, 0x00000042, 0x00000000, 0x00000000], // KeyB - [0x00000063, 0x00000043, 0x00000000, 0x00000000], // KeyC - [0x00000064, 0x00000044, 0x00000000, 0x00000000], // KeyD - [0x00000065, 0x00000045, 0x000020ac, 0x00000000], // KeyE - [0x00000066, 0x00000046, 0x00000000, 0x00000000], // KeyF - [0x00000067, 0x00000047, 0x00000000, 0x00000000], // KeyG - [0x00000068, 0x00000048, 0x00000000, 0x00000000], // KeyH - [0x00000131, 0x00000049, 0x00000069, 0x00000130], // KeyI - [0x0000006a, 0x0000004a, 0x00000000, 0x00000000], // KeyJ - [0x0000006b, 0x0000004b, 0x00000000, 0x00000000], // KeyK - [0x0000006c, 0x0000004c, 0x00000000, 0x00000000], // KeyL - [0x0000006d, 0x0000004d, 0x00000000, 0x00000000], // KeyM - [0x0000006e, 0x0000004e, 0x00000000, 0x00000000], // KeyN - [0x0000006f, 0x0000004f, 0x00000000, 0x00000000], // KeyO - [0x00000070, 0x00000050, 0x00000000, 0x00000000], // KeyP - [0x00000071, 0x00000051, 0x00000040, 0x00000000], // KeyQ - [0x00000072, 0x00000052, 0x00000000, 0x00000000], // KeyR - [0x00000073, 0x00000053, 0x000000df, 0x00000000], // KeyS - [0x00000074, 0x00000054, 0x000020ba, 0x00000000], // KeyT - [0x00000075, 0x00000055, 0x00000000, 0x00000000], // KeyU - [0x00000076, 0x00000056, 0x00000000, 0x00000000], // KeyV - [0x00000077, 0x00000057, 0x00000000, 0x00000000], // KeyW - [0x00000078, 0x00000058, 0x00000000, 0x00000000], // KeyX - [0x00000079, 0x00000059, 0x00000000, 0x00000000], // KeyY - [0x0000007a, 0x0000005a, 0x00000000, 0x00000000], // KeyZ - [0x00000031, 0x00000021, 0x0000003e, 0x00000000], // Digit1 - [0x00000032, 0x00000027, 0x000000a3, 0x00000000], // Digit2 - [0x00000033, 0x0000005e, 0x00000023, 0x00000000], // Digit3 - [0x00000034, 0x0000002b, 0x00000024, 0x00000000], // Digit4 - [0x00000035, 0x00000025, 0x000000bd, 0x00000000], // Digit5 - [0x00000036, 0x00000026, 0x00000000, 0x00000000], // Digit6 - [0x00000037, 0x0000002f, 0x0000007b, 0x00000000], // Digit7 - [0x00000038, 0x00000028, 0x0000005b, 0x00000000], // Digit8 - [0x00000039, 0x00000029, 0x0000005d, 0x00000000], // Digit9 - [0x00000030, 0x0000003d, 0x0000007d, 0x00000000], // Digit0 - [0x0000002a, 0x0000003f, 0x0000005c, 0x00000000], // Minus - [0x0000002d, 0x0000005f, 0x0000007c, 0x00000000], // Equal - [0x0000011f, 0x0000011e, 0x000000a8, 0x00000000], // BracketLeft - [0x000000fc, 0x000000dc, 0x0000007e, 0x00000000], // BracketRight - [0x0000002c, 0x0000003b, 0x00000060, 0x00000000], // Backslash - [0x0000015f, 0x0000015e, 0x000000b4, 0x00000000], // Semicolon - [0x00000069, 0x00000130, 0x00000000, 0x00000000], // Quote - [0x00000022, 0x000000e9, 0x0000003c, 0x00000000], // Backquote - [0x000000f6, 0x000000d6, 0x00000000, 0x00000000], // Comma - [0x000000e7, 0x000000c7, 0x00000000, 0x00000000], // Period - [0x0000002e, 0x0000003a, 0x00000000, 0x00000000], // Slash - ], - ), - - LayoutInfo( - name: 'zh-hans', - platform: LayoutPlatform.darwin, - mapping: >[ - [0x00000061, 0x00000041, 0x000000e5, 0x000000c5], // KeyA - [0x00000062, 0x00000042, 0x0000222b, 0x00000131], // KeyB - [0x00000063, 0x00000043, 0x000000e7, 0x000000c7], // KeyC - [0x00000064, 0x00000044, 0x00002202, 0x000000ce], // KeyD - [0x00000065, 0x00000045, 0x000000b4, 0x000000b4], // KeyE - [0x00000066, 0x00000046, 0x00000192, 0x000000cf], // KeyF - [0x00000067, 0x00000047, 0x000000a9, 0x000002dd], // KeyG - [0x00000068, 0x00000048, 0x000002d9, 0x000000d3], // KeyH - [0x00000069, 0x00000049, 0x000002c6, 0x000002c6], // KeyI - [0x0000006a, 0x0000004a, 0x00002206, 0x000000d4], // KeyJ - [0x0000006b, 0x0000004b, 0x000002da, 0x0000f8ff], // KeyK - [0x0000006c, 0x0000004c, 0x000000ac, 0x000000d2], // KeyL - [0x0000006d, 0x0000004d, 0x000000b5, 0x000000c2], // KeyM - [0x0000006e, 0x0000004e, 0x000002dc, 0x000002dc], // KeyN - [0x0000006f, 0x0000004f, 0x000000f8, 0x000000d8], // KeyO - [0x00000070, 0x00000050, 0x000003c0, 0x0000220f], // KeyP - [0x00000071, 0x00000051, 0x00000153, 0x00000152], // KeyQ - [0x00000072, 0x00000052, 0x000000ae, 0x00002030], // KeyR - [0x00000073, 0x00000053, 0x000000df, 0x000000cd], // KeyS - [0x00000074, 0x00000054, 0x00002020, 0x000002c7], // KeyT - [0x00000075, 0x00000055, 0x000000a8, 0x000000a8], // KeyU - [0x00000076, 0x00000056, 0x0000221a, 0x000025ca], // KeyV - [0x00000077, 0x00000057, 0x00002211, 0x0000201e], // KeyW - [0x00000078, 0x00000058, 0x00002248, 0x000002db], // KeyX - [0x00000079, 0x00000059, 0x000000a5, 0x000000c1], // KeyY - [0x0000007a, 0x0000005a, 0x000003a9, 0x000000b8], // KeyZ - [0x00000031, 0x0000ff01, 0x000000a1, 0x00002044], // Digit1 - [0x00000032, 0x00000040, 0x00002122, 0x000020ac], // Digit2 - [0x00000033, 0x00000023, 0x000000a3, 0x00002039], // Digit3 - [0x00000034, 0x000000a5, 0x000000a2, 0x0000203a], // Digit4 - [0x00000035, 0x00000025, 0x0000221e, 0x0000fb01], // Digit5 - [0x00000036, 0x00000000, 0x000000a7, 0x0000fb02], // Digit6 - [0x00000037, 0x00000026, 0x000000b6, 0x00002021], // Digit7 - [0x00000038, 0x0000002a, 0x00002022, 0x000000b0], // Digit8 - [0x00000039, 0x0000ff08, 0x000000aa, 0x000000b7], // Digit9 - [0x00000030, 0x0000ff09, 0x000000ba, 0x0000201a], // Digit0 - [0x0000002d, 0x00000000, 0x00002013, 0x00002014], // Minus - [0x0000003d, 0x0000002b, 0x00002260, 0x000000b1], // Equal - [0x00003010, 0x0000300c, 0x0000201c, 0x0000201d], // BracketLeft - [0x00003011, 0x0000300d, 0x00002018, 0x00002019], // BracketRight - [0x00003001, 0x0000007c, 0x000000ab, 0x000000bb], // Backslash - [0x0000ff1b, 0x0000ff1a, 0x00002026, 0x000000da], // Semicolon - [0x00000027, 0x00000022, 0x000000e6, 0x000000c6], // Quote - [0x000000b7, 0x0000ff5e, 0x00000060, 0x00000060], // Backquote - [0x0000ff0c, 0x0000300a, 0x00002264, 0x000000af], // Comma - [0x00003002, 0x0000300b, 0x00002265, 0x000002d8], // Period - [0x0000002f, 0x0000ff1f, 0x000000f7, 0x000000bf], // Slash - ], - ), -]; +const String kCompressedBody = + 'H4sIAAAAAAAAE+1c+XdUVba+51ShdPf7IwTbdgAEBRnUVpzneRaliRolgoAh2N2K' + 'rCSEDBBkFEgCARJCGAIkjEkgsFbdKn/o1Hqv+A+e+Af4L7z9ffucW7cqlQHa99S3' + 'WIuz7qnKpVK1v29/ezi7MjP5Qvk/HzOP4fK4eRyXJ8wTuDxpnsTlKfMULk+bp3F5' + 'xjyDy7PmWVyeM8/h8rx5HpcXzAu4vGhexOUl8xIuL5uXcXnFvILLq+ZVXF4zr+Hy' + 'unkdlzfMG7i8ad7E5S3zFi5vm7dxece8g8u75l1c3jPv4fK+ef+WJys+q6i6z9yn' + 'm/vN/bqZbWbrZo6Zo5sHzAO6mWvm6maemaeb+Wa+bhaYBbqZZWZNeqlixZrVwaSn' + 'vlxTtjz40+OVZR8vK696sfzTquA/3IPXKz5bWhX84XF5sHp52eqlwR/eKP+i4uOV' + 'y1euCCa9tmZlVbn+8EtuJz2x8osvyoJbXi2vrFj5STDpDf6X6fbjrwNTZh4LgsB8' + 'ZB4338j1Y/OE+YtcPzFP2vRW2ZSbpxLXantk96l52iyS62fmGfOhXJeaZ/E/K8xz' + 'uHxunsdlmXnBZmpls9y8aDM1svnCvIQfrDAvm2/lutK8goerzKu4fGleMx/ItdK8' + 'joerzRs2vU02VeZNPF5j3sLlK/O2WSjXv5t3zFq5/sO8a26X69fmffz4n+Y9XKaZ' + '+8y6ILDpNnO/HW6QXeagmW0W46nNZo4d3oOnWswDNtWL3WUz1w63yS4cMvPMEmwO' + 'mvl2uAW7E2aBTZ3F7qiZZYf3yev/1dxhU0fkqdRZeXmb6sdPB81MG16Qn95t7rLh' + 'bvz0iLnTpg7hN5wyU82f8VS3mWLD/XLXQ/zdgZluHjUPy/Ve86B5RK4zzN/MPXLn' + 'J+VxRAIFJFA8gmI0AgUjGAOLQJEIFAebOqdIBCWBWFgARFAKhkBRCBSEYAQG95kp' + 'uNxvptrUadnMls9uU2dkNweWCMwD5g5c5oJkgZh9Jlk339xFai0QM4Jas8TY38K8' + '+8VOHyR+HGyH1YGRPHfJhnsV73uAt7nd3Mnnz9twFzeHbFiHGxZHxn4oUFsHauqA' + 'ljawtA0P27Ce1k5cq94raw9tblMdNnVU/SDsteHWyPa0P8wvTLWpY4TAZjbZzEbC' + 'YNPdNn2YUCSu1W+36T7iYbOdNtug/pHul0+vDlILH3HQ2NQgwZH3sE9WCyGyYb8N' + '9xAmG162YbuDyv7nUYJlU+dt6qR6TuYKLQXUbKbbZg4TOXkXO2RtI37yuu2yWomi' + '//WCpE0dl6cHCKfcvNWmuoipTV2U5wcJrE0N2NRBD27i2oa2CF+b6iTCNnUJ1AfK' + 'NjUkt+wl1DYlVtuwz+Et23YHeeJaXYdD3ab6HO5AzSFvU1cCm62x2Wqb7bbZIw59' + 'm2202Y2OATZ1ihyAyWy23hHBZjeJyR0ZbLbWZpsDXFK9cp+8+eoz5IVNXYDXghvy' + '3GG4Mggie7FZ9U7QxCpNumy4wdGk0dkKNAm7bdhAmsjztfp5IqJU9ypRfthuwy1K' + 'lNRRGzYrUVLHbLjDEaWmzoZtSpTUIDkjRJFXrLfD9aSKWZj4uac2oopoGRV1HdBJ' + 'FhPlv6rlv24hUwRYwdBR5SREC1QBBWy4mVSR/QEIHLgi4mXDmqQypbE1cW33RjJF' + 'HmwDdciVxLWmRhu2kCtCQ0itUqVLbjnoqHJQMCdVnFft81w5L8qtVOkga4QqwoOf' + 'e2rIFPOhWTyZNFkrcYEk+cYO71WOCDMukCPyDg4AdrJEOALNpj6I8g63JpQk8ks7' + 'QCWwRMiV+LnziufJHrqXI0pmh81s90RxavCweUR+xyFZXaSJfP52xIpReTL5k/IZ' + 'q/9esXr1/6Z8B2OId/BLaPc0mzqs6s1YMFvcC2F2DlgOKVW/7g68UzsFX6sKLoiq' + 'hAeq4LjcCXzOQosFnHVOvY9A6xEnp1DshQqdqvaCx1Gv4AcQGMiYMTR82a8XLW/I' + '4M7Szu75YOnMfTs8AvZOHUK0hLnd+59YvBSqPxoEzhXWwpBULTX2YgbLO5FmBI7n' + '2FA1cMcQkS1t6Vs++WplZdmyAin0SjCsukWxCnfS6MiQUmeT8hpwoy6qlVOX1JEk' + '7C6yJv+SXjdt+F2BnEIeh1soj5FCNRALEQP5l/Q6GNZGmkzVVJlT5UWATfXYcDs+' + '9VTv2nF9jMmmCpiIXyTTkEREaxEUSsd08zA0geEGwqq6Edf3h7w4tHoRhLAD4IUI' + 'DJo4KMoaQFQGNcAS68Z2r4SSu3Sr4s+Dq51XaZ1v7olkbQE87piTxLslbGhcX4QA' + '6yX3Q/NtJHdCnUdFtxBShS3TVEPFZB+YtT5IIIkI9zMwxMUNritrSbIwFBQECRcL' + 'JL7Y8hXjemXwW1HAURxyYaD+GJRIXBerI9If59ObAIVq3t15l4GNcVkEhyUSuHwA' + 'tyRTVB2n4kJlJMHU8R7BZaa6cvkKpqk0KIs0mJRVGowKk9KsMCoNyyoNpmWZBuPC' + 'tDQvjEsDw7w0MQxMIzPDgJlhZBqa2QVMDUPT2DA1zc0EFAaHuWlyGJxGh8lpdhid' + 'hmftBtOzeIPxWb3B/DA+AYD5CQEAIAiAgDAABAIBGAgFEwaAASgIB8AgIICDkAAQ' + 'ggJICAsLLAADWAgNgCE4gIbwABwCBHgIEQAiSM4D1hEkAgWYCBWAIlgCValUkbI0' + 'MlOk4sWkcmSaCP2J6WBMNONqG1eomODF5DEmmmOkiU7N4voZU4O4CMeEfPw0EcEh' + 'Jq15lfj1BLJA2eJCOLpyxiQyrvGxqBIpZDxKxMNfXnz/WL5ixkflyz+rKFsR6dYv' + 'nb1Mp3iUlkonzROQSqeKhVLp9PMvAuBabY9QLsVRqJdilDlMUe4SwBZp74OaibRv' + 'Hv7nFDOfiUe3AIQUTzK9WUxe7napntPPxUhakOT8Wbz6Q7zSOSSKYmUfCmw4gHwU' + 'DiQ/Pc0+AxC6F5cHzUynwgLNuuAWsXr5P6rUQ1OnbLYuCasLNlIzJrXi75ciM1lU' + '8ePlszXePwPvncKB/snqnptttk9zmn9dstk2uqc4rxSgSeedUqsmqbAzbPacpi7D' + 'bVLNJr1vZtcX+6aZbrOHk2N7psLmuwLOLbONdEs0qLLNDNgQkGxDkrJ7r9TESeeQ' + 'CrAdltK6KXlD7ggPFFVQbxRtytYmfxVnlDe7a/IIb7TZ6sgdVZS8P/5r5+SYP04S' + 'ZlRoymLTNTZdXcIdEz/2b5bVrJRI77Dp7XGvTPw4sEFWHX1T7uuSdUglOy0B4FgJ' + 'L00sz3YlXsx2kcvyf2tkVWv758eBBln1mp5mNttMczzN8Z9R+JColNd4Ha/B7k+b' + 'zbSqVP84cEJWj5Iic9xmjpVIf+SOTlkdKtBhnw23jZsICSUGCnMh9idGZkPUvHw+' + 'JMwf3ny9KdHIcBulRbcSs6rlilp4kMEljxrCpxSjxa4cHrVh0+hqasMTDHYjsPJ+' + 'Ga8JvcHotmcYodmiYxNScWIb0vltEIVTKbKK3TYcZDjJIxQrsZzyuq4nPdYRwLdZ' + 'BoiTa7fCWV23VYpI32CJikjR1EuBi5hDiphNXVbM2PokaPQz4qYyIbDZcDd7HgKd' + 'OJ+CBxd07tiDxgEgZDuyV0MjhPlIPLv1KVA+w4X/RWDezJ7+z7In2ELTJ/sbSJ8S' + 'ItbDexHZb51A/gS9XrNsFM8vTJ9u2ONLlpsxP59AyTnSq8cvOyl9s9kE8nLb84uV' + 'nrdLUPTVjSotxX2J897S9aca+8Y8E35QyjV9/zvvmqJLYeP1eCY6wmx/06Mn6ph0' + '6BJ+GW7MN783TbT5PdIv0cAf4Zc4BsCZAFA1t/8eqxqb6Z9IWWPLf1+97xEuyDZ2' + '1IsVA2vvW8qPdUFRKzZqfasj3qWOWNT3RoGC+HxF85nFrGWmuVqGTqNNb+YReqos' + 'BQ+b3oOCMI/FS3a9y1eXOLl0J4ZjnlwyJ7r+g8smqWomdHAZ9Yuu59AylhKNfmbp' + 'zmWLzywvov8iQEYnlvDE1HHkiwTUH1fCEd1p5QVtsiuurp307x1VAmt3Ukm4pZoT' + 'xvDIstYsis4pP5SSM8JdzymBvEhYdpOecTaabwR+jz6Ov3jytLPan1DysFIPntxx' + 'snChWJu1MNQk2NwWO5lsrC9xhP3DdlUeFDGitSo9KGLk0+J/Q5xvw4Ynk+fp/2BC' + 'qpvZDIra2ygEXphblQm34UhuwsKMX8BTycbj2DpdVu1DI5HvoFiWPf8pylToQa/K' + 'uF1FWQVXyQBCkwxMDpULkNXi40jqMXM45QNebR7HPFTX5zNXdpRcwHTZeZ87mkSM' + '8Edf7IiTFzxzRUZHLZDAlXC8EDZFvBAxjnghOacXBRzPlziUlJgUHUliFZ1Jlq+e' + 'sbysquLXacff2DTJmIlR6X68PxgbS4shpnBN0QOvtEGQnyBB/3dJTIvZGZZkCwrS' + 'q2JfUok/rfx9d/AC38CDEUZp4MlnnaudviM6JSXV/Hzakx28xb6DB7jRweN5JLpu' + 'aOktdobGES9nolBvnsuzhx08QiLVa1Dcu5uiJ5JiZhOLH79mvBNUKNWbxo13sQD9' + 'bwS8fDwrHe9iAVHgdAM6DlINeVP9sbLiiohHYDXgEVvGOwevBjwizIDnQFaNIswM' + 'eQq0P0pEPDvC6RrM5ehojkMcQY+YMx7WxzMG7d66yZzUaQzy9HBoREgQRT1hgo96' + 'YIMPe59WWjACEcJzQuyK+FHc/ymIfTY8xmTf1STIoRn4emqiwCfVCUsYVodSMZxS' + 'UoRbWDGAFKHk/5t8UYJ6SkjB+RBYQ4uSdJ8WJS7IxWNfMS9OavpOYmxHHIuFPyQc' + 'rEsGSV8yY/dGBEHXCKqNH8RrcGKvqFVydle6VA9oYBR6IMCL9k0mP2x4XGsaIUi+' + 'PhCO5OsD8ESEUFv4YHDYpTTxVcMUMx+hTeoe0kQiGMoh8sR7BIki8uoj005EJ9UF' + 'G56VSi+B9r46axeL0U6zUErVqAWzw/EkbNGQXBAEyRSGvg6lSngBaVOs/LFL1zib' + 'HwrGHnLlzOAYM67A33HhRDDKnCtHOm900NVFivFnXTkwep9gtU5jI2ddxc2nMWTN' + 'EUfBpKsmtr0MkTM55yr+/VcKOGZ1MOWKOOmGXDkJhSlXN2DHOVf2O3TONbPNZrZy' + '0FX7GjrqmumzmV6ddWWnhcOu7MloFjorGil5FOFzxLRrRdXvu2SMJyf5ro3LTkZM' + '7oxXLIY9bPCIi8FDeTTNBFHYJD7gYmF4Gr62kFEXvgVquA56yRSloqpk8wZi5oQS' + 'HQzfvEEm74Nn2BgJJXJ5CCWn4FpdgdBYz04kXMPpHGuEY9HgjMgW0l3XvUG54J26' + 'NeqrhjvGat8komlV38BpzsfQU04p6zrYGfINnJaogcPWHyIkejPVTid9WUGdVB3m' + 'yGvjNqT5bN+ouBWPLnbmhZHlQhcjDIYR1kXFQl5ui+oFdMNEfZOsH5eY25IlSgW2' + 'CkgCdmf7kqMTgY0hKYM8G9CA83wASKUGGKsP4wNqsdDB0Fcw5/r5qpvt95vDC+N2' + '+SZ/vmpG5covylbcPEi/eZBedJBul620iZ821GAxrMvmABaDu2w2YjHEy6YBi4E+' + '8VPdBVn97ETIZgCLEV9u+Q6LcV82u7EY/WWzDYs5gGx2YDETkM0WLOYDsunEYlYg' + 'm4NYzA1ksxeLGYJstsrazjxBNjtl7WK2IJtaWeuZM8j76pN1mpmDbM5iMX+QWzbI' + 'qmcWIZvvsZhLyGYzFjMK2TTKamJeIZtmLGYXsmnDYo4hm01Yv+2ZOGH10QlMxa1Y' + 'eXNGu8SMthh1icu9R53R9qPZflgb/jrqiLZd5aYh0htsuq5gGiLdYNP1Beei6Rab' + '3nOdFo/1/F1mbTN1NrN+QmejsemUEeVOIQQ2M2gzA3EYbOaSzVz8TU7nrnJDC3mb' + '27S82b5iuzNpygwVG58GvBwlTRjTYWPqQuxgNNM1MmfKXLSZ4yMOYtLnbebMGMDY' + '9EWUrBoLm6Wky38rqHPECBESpkxbFA0zh8ZJmGKwYebJ50t56OQN2cz3UUy0mT3E' + '0H1RysVE9HB8TEyfspkWnyzZzC6fK9nM7pERMT1kMwc0IqYvjxERMYulEbE9HhFb' + 'x02V0oM23RmdiO7M50rhvnw8DIeiXClTL+z4/1HeFgkfUpfuGxE+fyZKAwfue1lH' + '/NdVcOc6VwCz2PAHoTHHLK17pSvcm5XLzcGhosGhVVUzPqos4ZJigI4Cr9S+2S9+' + 'IjZzwl4JTxnVLTHyN+rMX2fgKgp8orlkTM+EIyId23/RWmf9jgVu1m8w5pjOUX2E' + 'LAyNGj1t5ZrAXq2zuUN4kOu3OaYyV2tsjmdwudM2t53PrLe5Tj7Ta3Nbublic/v5' + 'o2qbO8BNo80d4Y8u21w7Nxdtro2bsza3k/c021wPN7U218FNk83x64S5Cza3m5sB' + 'm2vhZtDmWnnPJps7zmfO2dz33JyxuR3cXLK5vbyn3uYOc9Ngc2zC5YZsbh+f2WJz' + 'pwrVkrkJCinNTh4qyE4eVJ181GEhxBsaO0GxVzfYXBc3G23OaeFMvofzNsevu1/d' + 'bHMnuNlmczX8UZ/NcaTk6nc2d1Khma6YGMXEIaO4OHQUG4eQ4uNQUowcUoqTQ0ux' + 'cogpXg41xcwhp7g59BQ7h6Di51BUDB2SiqNDU7F0iCqeDlXF1CGruDp0FVuHsOLr' + 'UFaMHdKKs0NbsXaIK94OdcXcIa+4O/TjBdpUMkDxdywAB8iDeJH2ILkAJpANhVwY' + 'r0pTTjhmKC8cO8AN8kPZ4TiiDHE8UZY4rihTHF+ULY4zYAxZI5yxjjMSJ3/YXooz' + 'rpF5wLPmqqC7KWKN2LbZsybkUZ5jDQ7pjjrW4NPTAp43gtUGzxt+Z7/DE+eqoN3k' + 'iIN4zNM9JQ2/6aGU0cBWl6eO0O87R50owDjyXJWP0+jJg3T4ZCnyuN7xAU+fq8Kg' + '9Z4+ONI8F9FHPGKLo4+ezDU1egJdFXpujAgkHlarBML4mSZbeQL5SaU73CSosOdB' + 'jcbg0HQkxj0g0b0MxGDRQ+ARjgdBo2/MnUqjb/GVmeLwK1EVk9xKoyj+FtCpiCsg' + 'UzRpUkAqiRCLsByhEIclJCiVEIhdQ8D9FpGA1V/dbAoUNwV0RsX/kZNRmwLFf+WE' + 'xwFDo2bHq79idszhLuaLOj4xyKSq1B+wiI7Ko9FpDInxZJ0Zcj8zLGbIbUyw+C2X' + 'Pn4PRDPkVtKSJ0DHOBqIr7tEZ+z4uov4nmZ7+tdO4Ix7g9FOzPUcSFNLnyc3+iPz' + '/UVH5m5izH9dQocpBkB0fxKE/D5Kk/1frtCJYp6pu0Mb5llH4wOEPAci0jyqngOA' + 'mSeXGhrrpkMW/B0L9tWIO/pqev7TSNkE+pIJ6wjhWfaFzJKEcgB1yHCr54FZfCuI' + 'oOKW/xMWWlyM9ycsWOW25/+GRfEZULJqaVlFkPjv/v2ykLbJ5aysQW4HamTbpM9i' + 'u0W3Z2R9p9udclOt3lstD5t12ySrQW/olLVDn22UtUmfPS3rqG6PyTqi291MkmRz' + 'Qe7Ul+pvkXVKtx2yNutL1cvaqs+2y9qm2+Oy6nXbK2uPbs/JvRt1e0LWSX2FOmZt' + '8riNGZhs+uRZffn+vUzO5PEG7RjNlC1nxGbIZrvec0C2+sH6d8l2p277ZQ3o9rys' + 'K7qtkxu+1+33st2lW9hjt25rZeve7kbZtui2VZb7lF1M5mSzXtYG3XbLcvZs0Bmq' + 'vzHnlMcHZen7HMB/6NFn98liUltVGRRNE1+vHIv344vlNt37i0wKRgcy8isHr1eW' + 'OV5wP/4AVyeFebEb4p7mZVm/9zRBVb5HVZkpGEbg0vttut3NRkBgKMziWxwezOy3' + 'mXb9Yye0hVyn4vz24QLV9hWUqvStXy+dsbRsxYgh3psdjDE6GImfL9VMoIehR/Sl' + 'mhjB+Kev8jsaoyaGPGjKtzGCkl2MxE/VW2U1R5mUPNgma3OUbMqDmqifIS/ZJqu1' + 'xHGs/M7Ez0PtPJGVW5rl/230nQ3Z18ralO9uyB37XX/jfwDr7kubSFEAAA=='; // 7996 bytes diff --git a/tools/gen_web_keyboard_layouts/data/definitions.dart.tmpl b/tools/gen_web_keyboard_layouts/data/definitions.dart.tmpl index 3c82b3d0ee766..a5e07a428f2c1 100644 --- a/tools/gen_web_keyboard_layouts/data/definitions.dart.tmpl +++ b/tools/gen_web_keyboard_layouts/data/definitions.dart.tmpl @@ -15,10 +15,5 @@ part of web_keyboard_layouts; -const Map kLayoutGoals = { -@@@LAYOUT_GOALS@@@ -}; - -const List kLayouts = [ -@@@LAYOUT_ENTRIES@@@ -]; +const String kCompressedBody = +@@@BODY@@@; // @@@BODY_LENGTH@@@ bytes diff --git a/tools/gen_web_keyboard_layouts/lib/layout_types.dart b/tools/gen_web_keyboard_layouts/lib/layout_types.dart index 9ae90e9f70c4d..a979d5a7bfacb 100644 --- a/tools/gen_web_keyboard_layouts/lib/layout_types.dart +++ b/tools/gen_web_keyboard_layouts/lib/layout_types.dart @@ -2,6 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:convert' show base64, utf8; +import 'dart:io' hide BytesBuilder; +import 'dart:typed_data'; + import 'package:meta/meta.dart' show immutable; enum LayoutPlatform { @@ -10,10 +14,12 @@ enum LayoutPlatform { darwin, } +const int _kPrintableLength = 4; + @immutable class LayoutEntry { LayoutEntry(this.printables, this.deadMasks) - : assert(printables.length == 4); + : assert(printables.length == _kPrintableLength); final List printables; final int deadMasks; @@ -33,7 +39,204 @@ class Layout { @immutable class LayoutStore { - const LayoutStore(this.layouts); + const LayoutStore(this.goals, this.layouts); + final Map goals; final List layouts; } + +class _ByteStream { + _ByteStream(this.buffer) + : _data = buffer.asByteData(), _offset = 0; + + final ByteBuffer buffer; + final ByteData _data; + + int get offest => _offset; + int _offset; + + int readUint8() { + final int result = _data.getUint8(_offset); + _offset += 1; + return result; + } + + String readString() { + final int length = _data.getUint8(_offset); + if (length == 0) { + _offset += 1; + return ''; + } + final Uint8List bytes = buffer.asUint8List(_offset + 1, length); + final String result = utf8.decode(bytes); + _offset += 1 + length; + return result; + } + + String? readNullableString() { + final int length = _data.getUint8(_offset); + if (length == 0) { + _offset += 1; + return null; + } + return readString(); + } +} + +LayoutStore unmarshallStoreCompressed(String compressed) { + final Uint8List bytes = Uint8List.fromList(gzip.decode(base64.decode(compressed))); + return _unmarshallStore(bytes.buffer); +} + +LayoutStore _unmarshallStore(ByteBuffer buffer) { + final _ByteStream stream = _ByteStream(buffer); + final Map goals = _unmarshallGoals(stream); + final List goalKeys = goals.keys.toList(); + final int layoutNum = stream.readUint8(); + final List layouts = List.generate(layoutNum, (_) { + return _unmarshallLayout(stream, goalKeys); + }); + return LayoutStore(goals, layouts); +} + +Map _unmarshallGoals(_ByteStream stream) { + final int goalsLength = stream.readUint8(); + return Map.fromEntries((() sync* { + for (int goalIndex = 0; goalIndex < goalsLength; goalIndex += 1) { + yield MapEntry(stream.readString(), stream.readNullableString()); + } + })()); +} + +Layout _unmarshallLayout(_ByteStream stream, List goalKeys) { + final String language = stream.readString(); + final LayoutPlatform platform = LayoutPlatform.values[stream.readUint8()]; + final Map entries = Map.fromIterables( + goalKeys, + goalKeys.map((_) => _unmarshallLayoutEntry(stream)), + ); + return Layout(language, platform, entries); +} + +LayoutEntry _unmarshallLayoutEntry(_ByteStream stream) { + final List printables = List.generate(_kPrintableLength, + (_) => stream.readString()); + final int deadMasks = stream.readUint8(); + return LayoutEntry(printables, deadMasks); +} + +String marshallStoreCompressed(LayoutStore store) { + final BytesBuilder bodyBuilder = BytesBuilder(); + _marshallStore(bodyBuilder, store); + final Uint8List bytes = bodyBuilder.takeBytes(); + return base64.encode(gzip.encode(bytes)); +} + +void _marshallStore(BytesBuilder builder, LayoutStore store) { + final List goalKeys = store.goals.keys.toList(); + // Sanity check: All layouts should have the same list of keys. + for (final Layout layout in store.layouts) { + if (layout.entries.length != goalKeys.length) { + throw Exception('Unmatched key list for ${layout.language}.${layout.platform}: ' + 'Expect length ${goalKeys.length}, found length ${layout.entries.length}'); + } + final Set unfoundKeys = goalKeys.toSet().difference(layout.entries.keys.toSet()); + if (unfoundKeys.isNotEmpty) { + throw Exception('Unmatched key list for ${layout.language}.${layout.platform}: ' + 'The following keys are not found: ${unfoundKeys.join(', ')}.'); + } + } + + _marshallGoals(builder, store.goals); + _marshallUint8(builder, store.layouts.length); + for (final Layout layout in store.layouts) { + _marshallLayout(builder, layout, goalKeys); + } +} + +void _marshallUint8(BytesBuilder builder, int value) { + if (value < 0 || value >= 256) { + throw Exception('Out of range uint8: $value'); + } + builder.addByte(value); +} + +void _marshallString(BytesBuilder builder, String? string) { + if (string == null) { + _marshallUint8(builder, 0); + return; + } + final List encoded = utf8.encode(string); + _marshallUint8(builder, encoded.length); + builder.add(encoded); +} + +void _marshallGoals(BytesBuilder builder, Map goals) { + _marshallUint8(builder, goals.length); + goals.forEach((String key, String? value) { + _marshallString(builder, key); + _marshallString(builder, value); + }); +} + +void _marshallLayout(BytesBuilder builder, Layout layout, List goalKeys) { + _marshallString(builder, layout.language); + _marshallUint8(builder, layout.platform.index); + for (final String key in goalKeys) { + _marshallLayoutEntry(builder, layout.entries[key]!); + } +} + +void _marshallLayoutEntry(BytesBuilder builder, LayoutEntry entry) { + if (entry.printables.length != _kPrintableLength) { + throw Exception('Malshaped entry printables: ${entry.printables}'); + } + for (final String printable in entry.printables) { + _marshallString(builder, printable); + } + builder.addByte(entry.deadMasks); +} + +typedef _VerifyCallback = void Function(T value1, T value2, String path); + +void verifyLayoutStoreEqual(LayoutStore store1, LayoutStore store2) { + void expectEqual(T a, T b, String path) { + if (a != b) { + throw Exception('Error verifying unmarshalled layout on $path: $a != $b'); + } + } + void verifyEach(Iterable a, Iterable b, String path, _VerifyCallback body) { + expectEqual(a.length, b.length, '$path.length'); + final Iterator aIter = a.iterator; + final Iterator bIter = b.iterator; + int index = 0; + while (aIter.moveNext()) { + assert(bIter.moveNext()); // Guaranteed true since they're of the same length. + body(aIter.current, bIter.current, '$path[$index]'); + index += 1; + } + } + // Verify Store.goals + verifyEach(store1.goals.entries, store2.goals.entries, 'Store.goals', + (MapEntry entry1, MapEntry entry2, String path) { + expectEqual(entry1.key, entry2.key, '$path.key'); + expectEqual(entry1.value, entry2.value, '$path.value'); + }); + + // Verify Layout + verifyEach(store1.layouts, store2.layouts, 'Store.layouts', + (Layout layout1, Layout layout2, String path) { + expectEqual(layout1.language, layout2.language, '$path.language'); + expectEqual(layout1.platform, layout2.platform, '$path.platform'); + // Verify LayoutEntry + verifyEach(layout1.entries.entries, layout2.entries.entries, '$path.entries', + (MapEntry entry1, MapEntry entry2, String path) { + expectEqual(entry1.key, entry2.key, '$path.key'); + verifyEach(entry1.value.printables, entry2.value.printables, '$path.printables', + (String printable1, String printable2, String path) { + expectEqual(printable1, printable2, path); + }); + expectEqual(entry1.value.deadMasks, entry2.value.deadMasks, '$path.deadMasks'); + }); + }); +} diff --git a/tools/gen_web_keyboard_layouts/lib/main.dart b/tools/gen_web_keyboard_layouts/lib/main.dart index ce8ec0c6712c4..6bbae0c9dbcee 100644 --- a/tools/gen_web_keyboard_layouts/lib/main.dart +++ b/tools/gen_web_keyboard_layouts/lib/main.dart @@ -13,7 +13,6 @@ import 'data.dart'; import 'json_get.dart'; import 'layout_types.dart'; -import 'utils.dart'; /// All goals in the form of KeyboardEvent.key. final List kGoalKeys = kLayoutGoals.keys.toList(); @@ -295,6 +294,20 @@ int _sortLayout(Layout a, Layout b) { return result; } +String _prettyPrintBody(String body, int width) { + int min(int a, int b) { + return a < b ? a : b; + } + final List result = []; + int start = 0; + while (start < body.length) { + final String row = body.substring(start, min(body.length, start + width)); + result.add(" '$row'"); + start += width; + } + return result.join('\n'); +} + Future generate(Options options) async { // Fetch files from GitHub. final Map githubBody = await _fetchGithub( @@ -326,29 +339,18 @@ Future generate(Options options) async { .toList() ..sort(_sortLayout); - final Iterable entriesString = layouts.map((Layout layout) { - return _renderTemplate( - File(path.join(options.dataRoot, entryTemplateName)).readAsStringSync(), - { - 'NAME': layout.language, - 'PLATFORM': _platformToString(layout.platform), - 'ENTRIES': layout.entries.entries.map((MapEntry mapEntry) { - final String value = mapEntry.value.printables.map((String char) { - return toHex(char.isEmpty ? 0 : char.codeUnitAt(0)); - }).join(', '); - return ' [$value], // ${mapEntry.key}'; - }).join('\n'), - }, - ).trimRight(); - }); + final LayoutStore store = LayoutStore(kLayoutGoals, layouts); + final String body = marshallStoreCompressed(store); + + // Verify that the store can be unmarshalled correctly. + verifyLayoutStoreEqual(store, unmarshallStoreCompressed(body)); + final String result = _renderTemplate( File(path.join(options.dataRoot, overallTemplateName)).readAsStringSync(), { 'COMMIT_ID': commitId, - 'LAYOUT_GOALS': kLayoutGoals.entries.map((MapEntry entry) => - " '${entry.key}': ${entry.value == null ? 'null' : "'${entry.value}'"}," - ).join('\n'), - 'LAYOUT_ENTRIES': entriesString.join('\n\n'), + 'BODY': _prettyPrintBody(body, 64), + 'BODY_LENGTH': '${body.length}', }, ); final String outputPath = path.join(options.outputRoot, outputName); diff --git a/tools/gen_web_keyboard_layouts/pubspec.yaml b/tools/gen_web_keyboard_layouts/pubspec.yaml index e398eb395bd33..709cd7e428be5 100644 --- a/tools/gen_web_keyboard_layouts/pubspec.yaml +++ b/tools/gen_web_keyboard_layouts/pubspec.yaml @@ -5,10 +5,20 @@ environment: sdk: ">=2.18.0-0 <3.0.0" dependencies: - args: ^2.3.1 + args: any http: ^0.13.4 path: ^1.8.1 meta: any dev_dependencies: test: ^1.21.1 + +dependency_overrides: + args: + path: ../../../third_party/dart/third_party/pkg/args + # convert: + # path: ../../../third_party/dart/third_party/pkg/convert + meta: + path: ../../../third_party/dart/pkg/meta + # typed_data: + # path: ../../../third_party/dart/third_party/pkg/typed_data From c1a964b458bad89bd23c6783a25c841c04e45f62 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Thu, 13 Oct 2022 16:14:27 -0700 Subject: [PATCH 19/74] Comments --- .../lib/layout_types.dart | 85 +++++++++++++++++-- 1 file changed, 80 insertions(+), 5 deletions(-) diff --git a/tools/gen_web_keyboard_layouts/lib/layout_types.dart b/tools/gen_web_keyboard_layouts/lib/layout_types.dart index a979d5a7bfacb..1ebd50f69a526 100644 --- a/tools/gen_web_keyboard_layouts/lib/layout_types.dart +++ b/tools/gen_web_keyboard_layouts/lib/layout_types.dart @@ -6,45 +6,90 @@ import 'dart:convert' show base64, utf8; import 'dart:io' hide BytesBuilder; import 'dart:typed_data'; -import 'package:meta/meta.dart' show immutable; - +/// The platform that the browser is running on. enum LayoutPlatform { + /// Windows. win, + /// Linux. linux, + /// MacOS or iOS. darwin, } +// The length of [LayoutEntry.printable]. const int _kPrintableLength = 4; -@immutable +/// Describes the characters that a physical keyboard key will be mapped to +/// under different modifier states, for a given language on a given +/// platform. class LayoutEntry { + /// Create a layout entry. LayoutEntry(this.printables, this.deadMasks) : assert(printables.length == _kPrintableLength); + /// The printable characters that a key should be mapped to under different + /// modifier states. + /// + /// The [printables] always have a length of 4, corresponding to "without any + /// modifiers", "with Shift", "with AltGr", and "with Shift and AltGr" + /// respectively. Some values might be empty, or be dead keys that are + /// indiecated by [deadMasks]. final List printables; + + /// Whether the outcome of a key is a dead key under different modifier + /// states. + /// + /// The four LSB [deadMasks] correspond to the four conditions of + /// [printables]: 0x1 for "without any modifiers", 0x2 for "with Shift", + /// 0x4 for "with AltGr", and 0x8 for "with Shift and AltGr". A set bit means + /// the character is a dead key. final int deadMasks; + /// An empty [LayoutEntry] that produces dead keys under all conditions. static final LayoutEntry empty = LayoutEntry( const ['', '', '', ''], 0xf); } -@immutable +/// Describes the characters that all goal keys will be mapped to for a given +/// language on a given platform. class Layout { + /// Create a [Layout]. const Layout(this.language, this.platform, this.entries); + /// The language being used. final String language; + + /// The platform that the browser is running on. final LayoutPlatform platform; + + /// Maps from DOM `KeyboardKey.key`s to the characters they produce. final Map entries; } -@immutable +/// Describes all information needed to detect keyboard layout for any languages +/// on any platforms. class LayoutStore { + /// Create a [LayoutStore]. const LayoutStore(this.goals, this.layouts); + /// The list of goals, mapping from DOM `KeyboardKey.key` to their mandatory + /// goal characters, or null if this goal is optional. + /// + /// Mandatory goals are characters that must be fulfilled during keyboard + /// layout detection. If the character of a mandatory goal is not assigned in + /// earlier stages, this character (the value of this map) will be assigned + /// to its corresponding key (the key of this map). + /// + /// Optional goals are keys that will be tested to see if they can be mapped + /// to mandatory goal characters. final Map goals; + + /// The layout information for different languages on different platforms. final List layouts; } +// A [ByteBuffer] that records a offset for the convenience of reading +// sequentially. class _ByteStream { _ByteStream(this.buffer) : _data = buffer.asByteData(), _offset = 0; @@ -52,15 +97,28 @@ class _ByteStream { final ByteBuffer buffer; final ByteData _data; + // The current offset. + // + // The next read will start from this byte (inclusive). int get offest => _offset; int _offset; + // Read the next byte as an 8-bit unsigned integer, and increase [offset] by + // 1. int readUint8() { final int result = _data.getUint8(_offset); _offset += 1; return result; } + // Read the next few bytes as a UTF-8 string, and increase [offset] + // accordingly. + // + // The first byte will be a uint8, `length`, the number of bytes of the UTF-8 + // sequence. Following that is the UTF-8 sequence. Therefore, the total + // increment for [offset] is `length + 1`. + // + // If the `length` is 0, then an empty string is returned. String readString() { final int length = _data.getUint8(_offset); if (length == 0) { @@ -73,6 +131,11 @@ class _ByteStream { return result; } + // Read the next few bytes as a nullable UTF-8 string, and increase [offset] + // accordingly. + // + // It is the same as [readString], except that if the `length` is 0, a null is + // returned. String? readNullableString() { final int length = _data.getUint8(_offset); if (length == 0) { @@ -83,6 +146,7 @@ class _ByteStream { } } +/// Decode a [LayoutStore] out of the compressed binary data. LayoutStore unmarshallStoreCompressed(String compressed) { final Uint8List bytes = Uint8List.fromList(gzip.decode(base64.decode(compressed))); return _unmarshallStore(bytes.buffer); @@ -125,6 +189,7 @@ LayoutEntry _unmarshallLayoutEntry(_ByteStream stream) { return LayoutEntry(printables, deadMasks); } +/// Compress a [LayoutStore] into the compressed binary data. String marshallStoreCompressed(LayoutStore store) { final BytesBuilder bodyBuilder = BytesBuilder(); _marshallStore(bodyBuilder, store); @@ -199,12 +264,21 @@ void _marshallLayoutEntry(BytesBuilder builder, LayoutEntry entry) { typedef _VerifyCallback = void Function(T value1, T value2, String path); +/// Verify that two [LayoutStore]s are equal. +/// +/// It verifies all fields of all children objects of the store. For maps, +/// it also verifies that the two stores have the same order of entries. +/// +/// Inconsistencies will lead to throwing [Exception]. void verifyLayoutStoreEqual(LayoutStore store1, LayoutStore store2) { + // Test if two values are equal by `==`, or throw an exception. void expectEqual(T a, T b, String path) { if (a != b) { throw Exception('Error verifying unmarshalled layout on $path: $a != $b'); } } + // Test that two iterables are of the same length, and each of their elements + // are verifies by `body`. void verifyEach(Iterable a, Iterable b, String path, _VerifyCallback body) { expectEqual(a.length, b.length, '$path.length'); final Iterator aIter = a.iterator; @@ -216,6 +290,7 @@ void verifyLayoutStoreEqual(LayoutStore store1, LayoutStore store2) { index += 1; } } + // Verify Store.goals verifyEach(store1.goals.entries, store2.goals.entries, 'Store.goals', (MapEntry entry1, MapEntry entry2, String path) { From 35d42b1bce0fc206a5c8fc201cfb9442d412cfc9 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 17 Oct 2022 11:55:27 -0700 Subject: [PATCH 20/74] Gen types file --- .../web_keyboard_layouts/lib/base.dart | 27 --- .../lib/definitions.g.dart | 4 +- .../web_keyboard_layouts/lib/types.g.dart | 200 ++++++++++++++++++ .../lib/web_keyboard_layouts.dart | 6 +- .../bin/gen_web_keyboard_layouts.dart | 1 + .../data/definitions.dart.tmpl | 4 +- .../data/definitions_entry.dart.tmpl | 7 - .../data/types.dart.tmpl | 17 ++ .../lib/layout_types.dart | 18 ++ tools/gen_web_keyboard_layouts/lib/main.dart | 155 +++++++++----- 10 files changed, 347 insertions(+), 92 deletions(-) delete mode 100644 third_party/web_keyboard_layouts/lib/base.dart create mode 100644 third_party/web_keyboard_layouts/lib/types.g.dart delete mode 100644 tools/gen_web_keyboard_layouts/data/definitions_entry.dart.tmpl create mode 100644 tools/gen_web_keyboard_layouts/data/types.dart.tmpl diff --git a/third_party/web_keyboard_layouts/lib/base.dart b/third_party/web_keyboard_layouts/lib/base.dart deleted file mode 100644 index 64972fc79c70d..0000000000000 --- a/third_party/web_keyboard_layouts/lib/base.dart +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -part of web_keyboard_layouts; - -enum LayoutPlatform { - win, - linux, - darwin, -} - -const kDeadKey = 0x1000000; - -class LayoutInfo { - const LayoutInfo({ - required this.name, - required this.platform, - required this.mapping, - }); - - final String name; - final LayoutPlatform platform; - // Each element of `mapping` is a list of four: - // noModifier, withShift, withAlt, withShiftAlt. - // Each value is either 0xYYYYYY, or 0x1000000 for a dead key. - final List> mapping; -} diff --git a/third_party/web_keyboard_layouts/lib/definitions.g.dart b/third_party/web_keyboard_layouts/lib/definitions.g.dart index 3603d4cd20561..f5889a90aaf04 100644 --- a/third_party/web_keyboard_layouts/lib/definitions.g.dart +++ b/third_party/web_keyboard_layouts/lib/definitions.g.dart @@ -15,7 +15,7 @@ part of web_keyboard_layouts; -const String kCompressedBody = +final LayoutStore kCompressedBody = unmarshallStoreCompressed( 'H4sIAAAAAAAAE+1c+XdUVba+51ShdPf7IwTbdgAEBRnUVpzneRaliRolgoAh2N2K' 'rCSEDBBkFEgCARJCGAIkjEkgsFbdKn/o1Hqv+A+e+Af4L7z9ffucW7cqlQHa99S3' 'WIuz7qnKpVK1v29/ezi7MjP5Qvk/HzOP4fK4eRyXJ8wTuDxpnsTlKfMULk+bp3F5' @@ -140,4 +140,4 @@ const String kCompressedBody = 'OV5wP/4AVyeFebEb4p7mZVm/9zRBVb5HVZkpGEbg0vttut3NRkBgKMziWxwezOy3' 'mXb9Yye0hVyn4vz24QLV9hWUqvStXy+dsbRsxYgh3psdjDE6GImfL9VMoIehR/Sl' 'mhjB+Kev8jsaoyaGPGjKtzGCkl2MxE/VW2U1R5mUPNgma3OUbMqDmqifIS/ZJqu1' - 'xHGs/M7Ez0PtPJGVW5rl/230nQ3Z18ralO9uyB37XX/jfwDr7kubSFEAAA=='; // 7996 bytes + 'xHGs/M7Ez0PtPJGVW5rl/230nQ3Z18ralO9uyB37XX/jfwDr7kubSFEAAA=='); // 7996 bytes diff --git a/third_party/web_keyboard_layouts/lib/types.g.dart b/third_party/web_keyboard_layouts/lib/types.g.dart new file mode 100644 index 0000000000000..e167a84ef29de --- /dev/null +++ b/third_party/web_keyboard_layouts/lib/types.g.dart @@ -0,0 +1,200 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. + +// DO NOT EDIT -- DO NOT EDIT -- DO NOT EDIT +// +// This file is auto generated by flutter/engine:flutter/tools/gen_web_keyboard_layouts based on +// layout_types.dart in the same pacakge. +// +// Edit the following files instead: +// +// - Script: lib/main.dart +// - Templates: data/*.tmpl +// +// See flutter/engine:flutter/tools/gen_web_keyboard_layouts/README.md for more information. + +part of web_keyboard_layouts; + +/// The platform that the browser is running on. +enum LayoutPlatform { + /// Windows. + win, + /// Linux. + linux, + /// MacOS or iOS. + darwin, +} + +// The length of [LayoutEntry.printable]. +const int _kPrintableLength = 4; + +/// Describes the characters that a physical keyboard key will be mapped to +/// under different modifier states, for a given language on a given +/// platform. +class LayoutEntry { + /// Create a layout entry. + LayoutEntry(this.printables, this.deadMasks) + : assert(printables.length == _kPrintableLength); + + /// The printable characters that a key should be mapped to under different + /// modifier states. + /// + /// The [printables] always have a length of 4, corresponding to "without any + /// modifiers", "with Shift", "with AltGr", and "with Shift and AltGr" + /// respectively. Some values might be empty, or be dead keys that are + /// indiecated by [deadMasks]. + final List printables; + + /// Whether the outcome of a key is a dead key under different modifier + /// states. + /// + /// The four LSB [deadMasks] correspond to the four conditions of + /// [printables]: 0x1 for "without any modifiers", 0x2 for "with Shift", + /// 0x4 for "with AltGr", and 0x8 for "with Shift and AltGr". A set bit means + /// the character is a dead key. + final int deadMasks; + + /// An empty [LayoutEntry] that produces dead keys under all conditions. + static final LayoutEntry empty = LayoutEntry( + const ['', '', '', ''], 0xf); +} + +/// Describes the characters that all goal keys will be mapped to for a given +/// language on a given platform. +class Layout { + /// Create a [Layout]. + const Layout(this.language, this.platform, this.entries); + + /// The language being used. + final String language; + + /// The platform that the browser is running on. + final LayoutPlatform platform; + + /// Maps from DOM `KeyboardKey.key`s to the characters they produce. + final Map entries; +} + +/// Describes all information needed to detect keyboard layout for any languages +/// on any platforms. +class LayoutStore { + /// Create a [LayoutStore]. + const LayoutStore(this.goals, this.layouts); + + /// The list of goals, mapping from DOM `KeyboardKey.key` to their mandatory + /// goal characters, or null if this goal is optional. + /// + /// Mandatory goals are characters that must be fulfilled during keyboard + /// layout detection. If the character of a mandatory goal is not assigned in + /// earlier stages, this character (the value of this map) will be assigned + /// to its corresponding key (the key of this map). + /// + /// Optional goals are keys that will be tested to see if they can be mapped + /// to mandatory goal characters. + final Map goals; + + /// The layout information for different languages on different platforms. + final List layouts; +} + +// A [ByteBuffer] that records a offset for the convenience of reading +// sequentially. +class _ByteStream { + _ByteStream(this.buffer) + : _data = buffer.asByteData(), _offset = 0; + + final ByteBuffer buffer; + final ByteData _data; + + // The current offset. + // + // The next read will start from this byte (inclusive). + int get offest => _offset; + int _offset; + + // Read the next byte as an 8-bit unsigned integer, and increase [offset] by + // 1. + int readUint8() { + final int result = _data.getUint8(_offset); + _offset += 1; + return result; + } + + // Read the next few bytes as a UTF-8 string, and increase [offset] + // accordingly. + // + // The first byte will be a uint8, `length`, the number of bytes of the UTF-8 + // sequence. Following that is the UTF-8 sequence. Therefore, the total + // increment for [offset] is `length + 1`. + // + // If the `length` is 0, then an empty string is returned. + String readString() { + final int length = _data.getUint8(_offset); + if (length == 0) { + _offset += 1; + return ''; + } + final Uint8List bytes = buffer.asUint8List(_offset + 1, length); + final String result = utf8.decode(bytes); + _offset += 1 + length; + return result; + } + + // Read the next few bytes as a nullable UTF-8 string, and increase [offset] + // accordingly. + // + // It is the same as [readString], except that if the `length` is 0, a null is + // returned. + String? readNullableString() { + final int length = _data.getUint8(_offset); + if (length == 0) { + _offset += 1; + return null; + } + return readString(); + } +} + +/// Decode a [LayoutStore] out of the compressed binary data. +LayoutStore unmarshallStoreCompressed(String compressed) { + final Uint8List bytes = Uint8List.fromList(gzip.decode(base64.decode(compressed))); + return _unmarshallStore(bytes.buffer); +} + +LayoutStore _unmarshallStore(ByteBuffer buffer) { + final _ByteStream stream = _ByteStream(buffer); + final Map goals = _unmarshallGoals(stream); + final List goalKeys = goals.keys.toList(); + final int layoutNum = stream.readUint8(); + final List layouts = List.generate(layoutNum, (_) { + return _unmarshallLayout(stream, goalKeys); + }); + return LayoutStore(goals, layouts); +} + +Map _unmarshallGoals(_ByteStream stream) { + final int goalsLength = stream.readUint8(); + return Map.fromEntries((() sync* { + for (int goalIndex = 0; goalIndex < goalsLength; goalIndex += 1) { + yield MapEntry(stream.readString(), stream.readNullableString()); + } + })()); +} + +Layout _unmarshallLayout(_ByteStream stream, List goalKeys) { + final String language = stream.readString(); + final LayoutPlatform platform = LayoutPlatform.values[stream.readUint8()]; + final Map entries = Map.fromIterables( + goalKeys, + goalKeys.map((_) => _unmarshallLayoutEntry(stream)), + ); + return Layout(language, platform, entries); +} + +LayoutEntry _unmarshallLayoutEntry(_ByteStream stream) { + final List printables = List.generate(_kPrintableLength, + (_) => stream.readString()); + final int deadMasks = stream.readUint8(); + return LayoutEntry(printables, deadMasks); +} +; diff --git a/third_party/web_keyboard_layouts/lib/web_keyboard_layouts.dart b/third_party/web_keyboard_layouts/lib/web_keyboard_layouts.dart index 20ce37c9aaa7e..e6461a29657d5 100644 --- a/third_party/web_keyboard_layouts/lib/web_keyboard_layouts.dart +++ b/third_party/web_keyboard_layouts/lib/web_keyboard_layouts.dart @@ -3,5 +3,9 @@ library web_keyboard_layouts; -part 'base.dart'; +import 'dart:convert' show base64, utf8; +import 'dart:io' hide BytesBuilder; +import 'dart:typed_data'; + +part 'types.g.dart'; part 'definitions.g.dart'; diff --git a/tools/gen_web_keyboard_layouts/bin/gen_web_keyboard_layouts.dart b/tools/gen_web_keyboard_layouts/bin/gen_web_keyboard_layouts.dart index f15add4660740..7e09ef9e56d3c 100644 --- a/tools/gen_web_keyboard_layouts/bin/gen_web_keyboard_layouts.dart +++ b/tools/gen_web_keyboard_layouts/bin/gen_web_keyboard_layouts.dart @@ -62,6 +62,7 @@ Future main(List rawArguments) async { githubToken: envGithubToken, cacheRoot: path.join(packageRoot.path, '.cache'), dataRoot: path.join(packageRoot.path, 'data'), + libRoot: path.join(packageRoot.path, 'lib'), force: parsedArguments['force'] as bool, outputRoot: path.join(packageRoot.parent.parent.path, 'third_party', 'web_keyboard_layouts', 'lib'), diff --git a/tools/gen_web_keyboard_layouts/data/definitions.dart.tmpl b/tools/gen_web_keyboard_layouts/data/definitions.dart.tmpl index a5e07a428f2c1..9a2c56fb12445 100644 --- a/tools/gen_web_keyboard_layouts/data/definitions.dart.tmpl +++ b/tools/gen_web_keyboard_layouts/data/definitions.dart.tmpl @@ -15,5 +15,5 @@ part of web_keyboard_layouts; -const String kCompressedBody = -@@@BODY@@@; // @@@BODY_LENGTH@@@ bytes +final LayoutStore kCompressedBody = unmarshallStoreCompressed( +@@@BODY@@@); // @@@BODY_LENGTH@@@ bytes diff --git a/tools/gen_web_keyboard_layouts/data/definitions_entry.dart.tmpl b/tools/gen_web_keyboard_layouts/data/definitions_entry.dart.tmpl deleted file mode 100644 index e9f984f29b3fd..0000000000000 --- a/tools/gen_web_keyboard_layouts/data/definitions_entry.dart.tmpl +++ /dev/null @@ -1,7 +0,0 @@ - LayoutInfo( - language: '@@@NAME@@@', - platform: LayoutPlatform.@@@PLATFORM@@@, - entries: [ -@@@ENTRIES@@@ - ], - ), diff --git a/tools/gen_web_keyboard_layouts/data/types.dart.tmpl b/tools/gen_web_keyboard_layouts/data/types.dart.tmpl new file mode 100644 index 0000000000000..23b77ef470b60 --- /dev/null +++ b/tools/gen_web_keyboard_layouts/data/types.dart.tmpl @@ -0,0 +1,17 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. + +// DO NOT EDIT -- DO NOT EDIT -- DO NOT EDIT +// +// This file is auto generated by flutter/engine:flutter/tools/gen_web_keyboard_layouts based on +// layout_types.dart in the same pacakge. +// +// Edit the following files instead: +// +// - Script: lib/main.dart +// - Templates: data/*.tmpl +// +// See flutter/engine:flutter/tools/gen_web_keyboard_layouts/README.md for more information. + +part of web_keyboard_layouts; +@@@BODY@@@; diff --git a/tools/gen_web_keyboard_layouts/lib/layout_types.dart b/tools/gen_web_keyboard_layouts/lib/layout_types.dart index 1ebd50f69a526..e2c77ed534819 100644 --- a/tools/gen_web_keyboard_layouts/lib/layout_types.dart +++ b/tools/gen_web_keyboard_layouts/lib/layout_types.dart @@ -6,6 +6,17 @@ import 'dart:convert' show base64, utf8; import 'dart:io' hide BytesBuilder; import 'dart:typed_data'; +// Changing the structure of layouting classes must change the following places +// as well: +// +// * Marshalling, +// * Unmarshalling, +// * Verification. + +// The following segment is not only used in the generating script, but also +// copied to the generated package. +/*@@@ SHARED SEGMENT START @@@*/ + /// The platform that the browser is running on. enum LayoutPlatform { /// Windows. @@ -189,7 +200,14 @@ LayoutEntry _unmarshallLayoutEntry(_ByteStream stream) { return LayoutEntry(printables, deadMasks); } +/*@@@ SHARED SEGMENT END @@@*/ + /// Compress a [LayoutStore] into the compressed binary data. +/// +/// See [unmarshallStoreCompressed] for decompression. +/// +/// The corretness of compression and decompression is checked by +/// [verifyLayoutStoreEqual], which is run at the end of every generation. String marshallStoreCompressed(LayoutStore store) { final BytesBuilder bodyBuilder = BytesBuilder(); _marshallStore(bodyBuilder, store); diff --git a/tools/gen_web_keyboard_layouts/lib/main.dart b/tools/gen_web_keyboard_layouts/lib/main.dart index 6bbae0c9dbcee..55f200b4ed5dc 100644 --- a/tools/gen_web_keyboard_layouts/lib/main.dart +++ b/tools/gen_web_keyboard_layouts/lib/main.dart @@ -14,47 +14,11 @@ import 'data.dart'; import 'json_get.dart'; import 'layout_types.dart'; -/// All goals in the form of KeyboardEvent.key. -final List kGoalKeys = kLayoutGoals.keys.toList(); - -/// A map from the key of `kLayoutGoals` (KeyboardEvent.key) to an -/// auto-incremental index. -final Map kGoalToIndex = Map.fromEntries( - kGoalKeys.asMap().entries.map( - (MapEntry entry) => MapEntry(entry.value, entry.key)), -); - -@immutable -class Options { - /// Build an option. - const Options({ - required this.force, - required this.githubToken, - required this.cacheRoot, - required this.dataRoot, - required this.outputRoot, - }); - - final bool force; - - /// The GitHub personal access token used to make the GitHub request. - final String githubToken; - - /// The path of the folder that store cache. - final String cacheRoot; - - /// The path of the folder that store data files, such as templates. - final String dataRoot; - - /// The folder to store the output Dart files. - final String outputRoot; -} +/// Signature for function that asynchonously returns a value. +typedef AsyncGetter = Future Function(); const String githubCacheFileName = 'github-response.json'; const String githubTargetFolder = 'src/vs/workbench/services/keybinding/browser/keyboardLayouts'; -const String overallTemplateName = 'definitions.dart.tmpl'; -const String entryTemplateName = 'definitions_entry.dart.tmpl'; -const String outputName = 'definitions.g.dart'; const String githubQuery = ''' { @@ -87,8 +51,46 @@ const String githubQuery = ''' } '''; -/// Signature for function that asynchonously returns a value. -typedef AsyncGetter = Future Function(); +/// All goals in the form of KeyboardEvent.key. +final List kGoalKeys = kLayoutGoals.keys.toList(); + +/// A map from the key of `kLayoutGoals` (KeyboardEvent.key) to an +/// auto-incremental index. +final Map kGoalToIndex = Map.fromEntries( + kGoalKeys.asMap().entries.map( + (MapEntry entry) => MapEntry(entry.value, entry.key)), +); + +@immutable +class Options { + /// Build an option. + const Options({ + required this.force, + required this.githubToken, + required this.cacheRoot, + required this.dataRoot, + required this.libRoot, + required this.outputRoot, + }); + + final bool force; + + /// The GitHub personal access token used to make the GitHub request. + final String githubToken; + + /// The path of the folder that store cache. + final String cacheRoot; + + /// The path of the folder that store data files, such as templates. + final String dataRoot; + + /// The path of the folder that store input lib files, typically the folder + /// that contains this file. + final String libRoot; + + /// The folder to store the output Dart files. + final String outputRoot; +} /// Retrieve a string using the procedure defined by `ifNotExist` based on the /// cache file at `cachePath`. @@ -101,7 +103,7 @@ typedef AsyncGetter = Future Function(); /// /// Exceptions from `ifNotExist` will be thrown, while exceptions related to /// caching are only printed. -Future tryCached(String cachePath, bool forceRefresh, AsyncGetter ifNotExist) async { +Future _tryCached(String cachePath, bool forceRefresh, AsyncGetter ifNotExist) async { final File cacheFile = File(cachePath); if (!forceRefresh && cacheFile.existsSync()) { try { @@ -128,7 +130,7 @@ Future tryCached(String cachePath, bool forceRefresh, AsyncGetter> _fetchGithub(String githubToken, bool forceRefresh, String cachePath) async { - final String response = await tryCached(cachePath, forceRefresh, () async { + final String response = await _tryCached(cachePath, forceRefresh, () async { final String condensedQuery = githubQuery .replaceAll(RegExp(r'\{ +'), '{') .replaceAll(RegExp(r' +\}'), '}'); @@ -250,7 +252,8 @@ Layout _parseLayoutFromGithubFile(_GitHubFile file) { return layout; } -String _renderTemplate(String template, Map dictionary) { +String _renderTemplate( + String template, Map dictionary) { String result = template; dictionary.forEach((String key, String value) { final String localResult = result.replaceAll('@@@$key@@@', value); @@ -262,6 +265,16 @@ String _renderTemplate(String template, Map dictionary) { return result; } +void _writeFileTo( + String outputDir, + String outputFileName, + String body) { + final String outputPath = path.join(outputDir, outputFileName); + Directory(outputDir).createSync(recursive: true); + File(outputPath).writeAsStringSync(body); +} + + LayoutPlatform _platformFromGithubString(String origin) { switch (origin) { case 'win': @@ -308,6 +321,25 @@ String _prettyPrintBody(String body, int width) { return result.join('\n'); } +String _readSharedSegment(String path) { + const String kSegmentStartMark = '/*@@@ SHARED SEGMENT START @@@*/'; + const String kSegmentEndMark = '/*@@@ SHARED SEGMENT END @@@*/'; + final List lines = File(path).readAsStringSync().split('\n'); + // Defining the two variables as `late final` ensures that each mark is found + // once and only once, otherwise assertion errors will be thrown. + late final int startLine; + late final int endLine; + for (int lineNo = 0; lineNo < lines.length; lineNo += 1) { + if (lines[lineNo] == kSegmentStartMark) { + startLine = lineNo; + } else if (lines[lineNo] == kSegmentEndMark) { + endLine = lineNo; + } + } + assert(startLine < endLine); + return lines.sublist(startLine + 1, endLine).join('\n'); +} + Future generate(Options options) async { // Fetch files from GitHub. final Map githubBody = await _fetchGithub( @@ -335,25 +367,42 @@ Future generate(Options options) async { && !file.name.startsWith('_.contribution'), ); + // Layouts must be sorted to ensure that the output file has a fixed order. final List layouts = files.map(_parseLayoutFromGithubFile) .toList() ..sort(_sortLayout); + // Build store. final LayoutStore store = LayoutStore(kLayoutGoals, layouts); final String body = marshallStoreCompressed(store); // Verify that the store can be unmarshalled correctly. + // Inconcistencies will cause exceptions. verifyLayoutStoreEqual(store, unmarshallStoreCompressed(body)); - final String result = _renderTemplate( - File(path.join(options.dataRoot, overallTemplateName)).readAsStringSync(), - { - 'COMMIT_ID': commitId, - 'BODY': _prettyPrintBody(body, 64), - 'BODY_LENGTH': '${body.length}', - }, + // Generate the definition file. + _writeFileTo( + options.outputRoot, + 'definitions.g.dart', + _renderTemplate( + File(path.join(options.dataRoot, 'definitions.dart.tmpl')).readAsStringSync(), + { + 'COMMIT_ID': commitId, + 'BODY': _prettyPrintBody(body, 64), + 'BODY_LENGTH': '${body.length}', + }, + ), + ); + + // Generate the type file. + _writeFileTo( + options.outputRoot, + 'types.g.dart', + _renderTemplate( + File(path.join(options.dataRoot, 'types.dart.tmpl')).readAsStringSync(), + { + 'BODY': _readSharedSegment(path.join(options.libRoot, 'layout_types.dart')), + }, + ), ); - final String outputPath = path.join(options.outputRoot, outputName); - Directory(path.dirname(outputPath)).createSync(recursive: true); - File(outputPath).writeAsStringSync(result); } From 162e790311beca5f68aef0c5992a030cd2c04e1e Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 17 Oct 2022 13:04:28 -0700 Subject: [PATCH 21/74] gen json --- .../data/definitions_uncompressed.g.json | 14793 ++++++++++++++++ .../lib/json_get.dart | 13 +- .../lib/layout_types.dart | 32 + tools/gen_web_keyboard_layouts/lib/main.dart | 24 +- 4 files changed, 14842 insertions(+), 20 deletions(-) create mode 100644 tools/gen_web_keyboard_layouts/data/definitions_uncompressed.g.json diff --git a/tools/gen_web_keyboard_layouts/data/definitions_uncompressed.g.json b/tools/gen_web_keyboard_layouts/data/definitions_uncompressed.g.json new file mode 100644 index 0000000000000..2888a211c2272 --- /dev/null +++ b/tools/gen_web_keyboard_layouts/data/definitions_uncompressed.g.json @@ -0,0 +1,14793 @@ +{ + "goals": { + "KeyA": "A", + "KeyB": "B", + "KeyC": "C", + "KeyD": "D", + "KeyE": "E", + "KeyF": "F", + "KeyG": "G", + "KeyH": "H", + "KeyI": "I", + "KeyJ": "J", + "KeyK": "K", + "KeyL": "L", + "KeyM": "M", + "KeyN": "N", + "KeyO": "O", + "KeyP": "P", + "KeyQ": "Q", + "KeyR": "R", + "KeyS": "S", + "KeyT": "T", + "KeyU": "U", + "KeyV": "V", + "KeyW": "W", + "KeyX": "X", + "KeyY": "Y", + "KeyZ": "Z", + "Digit1": "1", + "Digit2": "2", + "Digit3": "3", + "Digit4": "4", + "Digit5": "5", + "Digit6": "6", + "Digit7": "7", + "Digit8": "8", + "Digit9": "9", + "Digit0": "0", + "Minus": null, + "Equal": null, + "BracketLeft": null, + "BracketRight": null, + "Backslash": null, + "Semicolon": null, + "Quote": null, + "Backquote": null, + "Comma": null, + "Period": null, + "Slash": null + }, + "layouts": [ + { + "language": "cz", + "platform": "win", + "entries": { + "KeyA": [ + "a", + "A", + "", + "", + 0 + ], + "KeyB": [ + "b", + "B", + "{", + "", + 0 + ], + "KeyC": [ + "c", + "C", + "&", + "", + 0 + ], + "KeyD": [ + "d", + "D", + "Đ", + "", + 0 + ], + "KeyE": [ + "e", + "E", + "€", + "", + 0 + ], + "KeyF": [ + "f", + "F", + "[", + "", + 0 + ], + "KeyG": [ + "g", + "G", + "]", + "", + 0 + ], + "KeyH": [ + "h", + "H", + "", + "", + 0 + ], + "KeyI": [ + "i", + "I", + "", + "", + 0 + ], + "KeyJ": [ + "j", + "J", + "", + "", + 0 + ], + "KeyK": [ + "k", + "K", + "ł", + "", + 0 + ], + "KeyL": [ + "l", + "L", + "Ł", + "", + 0 + ], + "KeyM": [ + "m", + "M", + "", + "", + 0 + ], + "KeyN": [ + "n", + "N", + "}", + "", + 0 + ], + "KeyO": [ + "o", + "O", + "", + "", + 0 + ], + "KeyP": [ + "p", + "P", + "", + "", + 0 + ], + "KeyQ": [ + "q", + "Q", + "\\", + "", + 0 + ], + "KeyR": [ + "r", + "R", + "", + "", + 0 + ], + "KeyS": [ + "s", + "S", + "đ", + "", + 0 + ], + "KeyT": [ + "t", + "T", + "", + "", + 0 + ], + "KeyU": [ + "u", + "U", + "", + "", + 0 + ], + "KeyV": [ + "v", + "V", + "@", + "", + 0 + ], + "KeyW": [ + "w", + "W", + "|", + "", + 0 + ], + "KeyX": [ + "x", + "X", + "#", + "", + 0 + ], + "KeyY": [ + "z", + "Z", + "", + "", + 0 + ], + "KeyZ": [ + "y", + "Y", + "", + "", + 0 + ], + "Digit1": [ + "+", + "1", + "~", + "", + 0 + ], + "Digit2": [ + "ě", + "2", + "ˇ", + "", + 0 + ], + "Digit3": [ + "š", + "3", + "^", + "", + 0 + ], + "Digit4": [ + "č", + "4", + "˘", + "", + 0 + ], + "Digit5": [ + "ř", + "5", + "°", + "", + 0 + ], + "Digit6": [ + "ž", + "6", + "˛", + "", + 0 + ], + "Digit7": [ + "ý", + "7", + "`", + "", + 0 + ], + "Digit8": [ + "á", + "8", + "˙", + "", + 0 + ], + "Digit9": [ + "í", + "9", + "´", + "", + 0 + ], + "Digit0": [ + "é", + "0", + "˝", + "", + 0 + ], + "Minus": [ + "=", + "%", + "¨", + "", + 0 + ], + "Equal": [ + "´", + "ˇ", + "¸", + "", + 0 + ], + "BracketLeft": [ + "ú", + "/", + "÷", + "", + 0 + ], + "BracketRight": [ + ")", + "(", + "×", + "", + 0 + ], + "Backslash": [ + "¨", + "'", + "¤", + "", + 0 + ], + "Semicolon": [ + "ů", + "\"", + "$", + "", + 0 + ], + "Quote": [ + "§", + "!", + "ß", + "", + 0 + ], + "Backquote": [ + ";", + "°", + "", + "", + 0 + ], + "Comma": [ + ",", + "?", + "<", + "", + 0 + ], + "Period": [ + ".", + ":", + ">", + "", + 0 + ], + "Slash": [ + "-", + "_", + "*", + "", + 0 + ] + } + }, + { + "language": "de", + "platform": "win", + "entries": { + "KeyA": [ + "a", + "A", + "", + "", + 0 + ], + "KeyB": [ + "b", + "B", + "", + "", + 0 + ], + "KeyC": [ + "c", + "C", + "", + "", + 0 + ], + "KeyD": [ + "d", + "D", + "", + "", + 0 + ], + "KeyE": [ + "e", + "E", + "€", + "", + 0 + ], + "KeyF": [ + "f", + "F", + "", + "", + 0 + ], + "KeyG": [ + "g", + "G", + "", + "", + 0 + ], + "KeyH": [ + "h", + "H", + "", + "", + 0 + ], + "KeyI": [ + "i", + "I", + "", + "", + 0 + ], + "KeyJ": [ + "j", + "J", + "", + "", + 0 + ], + "KeyK": [ + "k", + "K", + "", + "", + 0 + ], + "KeyL": [ + "l", + "L", + "", + "", + 0 + ], + "KeyM": [ + "m", + "M", + "µ", + "", + 0 + ], + "KeyN": [ + "n", + "N", + "", + "", + 0 + ], + "KeyO": [ + "o", + "O", + "", + "", + 0 + ], + "KeyP": [ + "p", + "P", + "", + "", + 0 + ], + "KeyQ": [ + "q", + "Q", + "@", + "", + 0 + ], + "KeyR": [ + "r", + "R", + "", + "", + 0 + ], + "KeyS": [ + "s", + "S", + "", + "", + 0 + ], + "KeyT": [ + "t", + "T", + "", + "", + 0 + ], + "KeyU": [ + "u", + "U", + "", + "", + 0 + ], + "KeyV": [ + "v", + "V", + "", + "", + 0 + ], + "KeyW": [ + "w", + "W", + "", + "", + 0 + ], + "KeyX": [ + "x", + "X", + "", + "", + 0 + ], + "KeyY": [ + "z", + "Z", + "", + "", + 0 + ], + "KeyZ": [ + "y", + "Y", + "", + "", + 0 + ], + "Digit1": [ + "1", + "!", + "", + "", + 0 + ], + "Digit2": [ + "2", + "\"", + "²", + "", + 0 + ], + "Digit3": [ + "3", + "§", + "³", + "", + 0 + ], + "Digit4": [ + "4", + "$", + "", + "", + 0 + ], + "Digit5": [ + "5", + "%", + "", + "", + 0 + ], + "Digit6": [ + "6", + "&", + "", + "", + 0 + ], + "Digit7": [ + "7", + "/", + "{", + "", + 0 + ], + "Digit8": [ + "8", + "(", + "[", + "", + 0 + ], + "Digit9": [ + "9", + ")", + "]", + "", + 0 + ], + "Digit0": [ + "0", + "=", + "}", + "", + 0 + ], + "Minus": [ + "ß", + "?", + "\\", + "ẞ", + 0 + ], + "Equal": [ + "´", + "`", + "", + "", + 0 + ], + "BracketLeft": [ + "ü", + "Ü", + "", + "", + 0 + ], + "BracketRight": [ + "+", + "*", + "~", + "", + 0 + ], + "Backslash": [ + "#", + "'", + "", + "", + 0 + ], + "Semicolon": [ + "ö", + "Ö", + "", + "", + 0 + ], + "Quote": [ + "ä", + "Ä", + "", + "", + 0 + ], + "Backquote": [ + "^", + "°", + "", + "", + 0 + ], + "Comma": [ + ",", + ";", + "", + "", + 0 + ], + "Period": [ + ".", + ":", + "", + "", + 0 + ], + "Slash": [ + "-", + "_", + "", + "", + 0 + ] + } + }, + { + "language": "de", + "platform": "linux", + "entries": { + "KeyA": [ + "a", + "A", + "æ", + "Æ", + 0 + ], + "KeyB": [ + "b", + "B", + "“", + "‘", + 0 + ], + "KeyC": [ + "c", + "C", + "¢", + "©", + 0 + ], + "KeyD": [ + "d", + "D", + "ð", + "Ð", + 0 + ], + "KeyE": [ + "e", + "E", + "€", + "€", + 0 + ], + "KeyF": [ + "f", + "F", + "đ", + "ª", + 0 + ], + "KeyG": [ + "g", + "G", + "ŋ", + "Ŋ", + 0 + ], + "KeyH": [ + "h", + "H", + "ħ", + "Ħ", + 0 + ], + "KeyI": [ + "i", + "I", + "→", + "ı", + 0 + ], + "KeyJ": [ + "j", + "J", + "̣", + "̇", + 0 + ], + "KeyK": [ + "k", + "K", + "ĸ", + "&", + 0 + ], + "KeyL": [ + "l", + "L", + "ł", + "Ł", + 0 + ], + "KeyM": [ + "m", + "M", + "µ", + "º", + 0 + ], + "KeyN": [ + "n", + "N", + "”", + "’", + 0 + ], + "KeyO": [ + "o", + "O", + "ø", + "Ø", + 0 + ], + "KeyP": [ + "p", + "P", + "þ", + "Þ", + 0 + ], + "KeyQ": [ + "q", + "Q", + "@", + "Ω", + 0 + ], + "KeyR": [ + "r", + "R", + "¶", + "®", + 0 + ], + "KeyS": [ + "s", + "S", + "ſ", + "ẞ", + 0 + ], + "KeyT": [ + "t", + "T", + "ŧ", + "Ŧ", + 0 + ], + "KeyU": [ + "u", + "U", + "↓", + "↑", + 0 + ], + "KeyV": [ + "v", + "V", + "„", + "‚", + 0 + ], + "KeyW": [ + "w", + "W", + "ł", + "Ł", + 0 + ], + "KeyX": [ + "x", + "X", + "«", + "‹", + 0 + ], + "KeyY": [ + "z", + "Z", + "←", + "¥", + 0 + ], + "KeyZ": [ + "y", + "Y", + "»", + "›", + 0 + ], + "Digit1": [ + "1", + "!", + "¹", + "¡", + 0 + ], + "Digit2": [ + "2", + "\"", + "²", + "⅛", + 0 + ], + "Digit3": [ + "3", + "§", + "³", + "£", + 0 + ], + "Digit4": [ + "4", + "$", + "¼", + "¤", + 0 + ], + "Digit5": [ + "5", + "%", + "½", + "⅜", + 0 + ], + "Digit6": [ + "6", + "&", + "¬", + "⅝", + 0 + ], + "Digit7": [ + "7", + "/", + "{", + "⅞", + 0 + ], + "Digit8": [ + "8", + "(", + "[", + "™", + 0 + ], + "Digit9": [ + "9", + ")", + "]", + "±", + 0 + ], + "Digit0": [ + "0", + "=", + "}", + "°", + 0 + ], + "Minus": [ + "ß", + "?", + "\\", + "¿", + 0 + ], + "Equal": [ + "́", + "̀", + "̧", + "̨", + 0 + ], + "BracketLeft": [ + "ü", + "Ü", + "̈", + "̊", + 0 + ], + "BracketRight": [ + "+", + "*", + "~", + "¯", + 0 + ], + "Backslash": [ + "#", + "'", + "’", + "̆", + 0 + ], + "Semicolon": [ + "ö", + "Ö", + "̋", + "̣", + 0 + ], + "Quote": [ + "ä", + "Ä", + "̂", + "̌", + 0 + ], + "Backquote": [ + "̂", + "°", + "′", + "″", + 0 + ], + "Comma": [ + ",", + ";", + "·", + "×", + 0 + ], + "Period": [ + ".", + ":", + "…", + "÷", + 0 + ], + "Slash": [ + "-", + "_", + "–", + "—", + 0 + ] + } + }, + { + "language": "de", + "platform": "darwin", + "entries": { + "KeyA": [ + "a", + "A", + "å", + "Å", + 0 + ], + "KeyB": [ + "b", + "B", + "∫", + "‹", + 0 + ], + "KeyC": [ + "c", + "C", + "ç", + "Ç", + 0 + ], + "KeyD": [ + "d", + "D", + "∂", + "™", + 0 + ], + "KeyE": [ + "e", + "E", + "€", + "‰", + 0 + ], + "KeyF": [ + "f", + "F", + "ƒ", + "Ï", + 0 + ], + "KeyG": [ + "g", + "G", + "©", + "Ì", + 0 + ], + "KeyH": [ + "h", + "H", + "ª", + "Ó", + 0 + ], + "KeyI": [ + "i", + "I", + "⁄", + "Û", + 0 + ], + "KeyJ": [ + "j", + "J", + "º", + "ı", + 0 + ], + "KeyK": [ + "k", + "K", + "∆", + "ˆ", + 0 + ], + "KeyL": [ + "l", + "L", + "@", + "fl", + 0 + ], + "KeyM": [ + "m", + "M", + "µ", + "˘", + 0 + ], + "KeyN": [ + "n", + "N", + "~", + "›", + 4 + ], + "KeyO": [ + "o", + "O", + "ø", + "Ø", + 0 + ], + "KeyP": [ + "p", + "P", + "π", + "∏", + 0 + ], + "KeyQ": [ + "q", + "Q", + "«", + "»", + 0 + ], + "KeyR": [ + "r", + "R", + "®", + "¸", + 0 + ], + "KeyS": [ + "s", + "S", + "‚", + "Í", + 0 + ], + "KeyT": [ + "t", + "T", + "†", + "˝", + 0 + ], + "KeyU": [ + "u", + "U", + "¨", + "Á", + 4 + ], + "KeyV": [ + "v", + "V", + "√", + "◊", + 0 + ], + "KeyW": [ + "w", + "W", + "∑", + "„", + 0 + ], + "KeyX": [ + "x", + "X", + "≈", + "Ù", + 0 + ], + "KeyY": [ + "z", + "Z", + "Ω", + "ˇ", + 0 + ], + "KeyZ": [ + "y", + "Y", + "¥", + "‡", + 0 + ], + "Digit1": [ + "1", + "!", + "¡", + "¬", + 0 + ], + "Digit2": [ + "2", + "\"", + "“", + "”", + 0 + ], + "Digit3": [ + "3", + "§", + "¶", + "#", + 0 + ], + "Digit4": [ + "4", + "$", + "¢", + "£", + 0 + ], + "Digit5": [ + "5", + "%", + "[", + "fi", + 0 + ], + "Digit6": [ + "6", + "&", + "]", + "^", + 8 + ], + "Digit7": [ + "7", + "/", + "|", + "\\", + 0 + ], + "Digit8": [ + "8", + "(", + "{", + "˜", + 0 + ], + "Digit9": [ + "9", + ")", + "}", + "·", + 0 + ], + "Digit0": [ + "0", + "=", + "≠", + "¯", + 0 + ], + "Minus": [ + "ß", + "?", + "¿", + "˙", + 0 + ], + "Equal": [ + "´", + "`", + "'", + "˚", + 3 + ], + "BracketLeft": [ + "ü", + "Ü", + "•", + "°", + 0 + ], + "BracketRight": [ + "+", + "*", + "±", + "", + 0 + ], + "Backslash": [ + "#", + "'", + "‘", + "’", + 0 + ], + "Semicolon": [ + "ö", + "Ö", + "œ", + "Œ", + 0 + ], + "Quote": [ + "ä", + "Ä", + "æ", + "Æ", + 0 + ], + "Backquote": [ + "<", + ">", + "≤", + "≥", + 0 + ], + "Comma": [ + ",", + ";", + "∞", + "˛", + 0 + ], + "Period": [ + ".", + ":", + "…", + "÷", + 0 + ], + "Slash": [ + "-", + "_", + "–", + "—", + 0 + ] + } + }, + { + "language": "de-swiss", + "platform": "win", + "entries": { + "KeyA": [ + "a", + "A", + "", + "", + 0 + ], + "KeyB": [ + "b", + "B", + "", + "", + 0 + ], + "KeyC": [ + "c", + "C", + "", + "", + 0 + ], + "KeyD": [ + "d", + "D", + "", + "", + 0 + ], + "KeyE": [ + "e", + "E", + "€", + "", + 0 + ], + "KeyF": [ + "f", + "F", + "", + "", + 0 + ], + "KeyG": [ + "g", + "G", + "", + "", + 0 + ], + "KeyH": [ + "h", + "H", + "", + "", + 0 + ], + "KeyI": [ + "i", + "I", + "", + "", + 0 + ], + "KeyJ": [ + "j", + "J", + "", + "", + 0 + ], + "KeyK": [ + "k", + "K", + "", + "", + 0 + ], + "KeyL": [ + "l", + "L", + "", + "", + 0 + ], + "KeyM": [ + "m", + "M", + "", + "", + 0 + ], + "KeyN": [ + "n", + "N", + "", + "", + 0 + ], + "KeyO": [ + "o", + "O", + "", + "", + 0 + ], + "KeyP": [ + "p", + "P", + "", + "", + 0 + ], + "KeyQ": [ + "q", + "Q", + "", + "", + 0 + ], + "KeyR": [ + "r", + "R", + "", + "", + 0 + ], + "KeyS": [ + "s", + "S", + "", + "", + 0 + ], + "KeyT": [ + "t", + "T", + "", + "", + 0 + ], + "KeyU": [ + "u", + "U", + "", + "", + 0 + ], + "KeyV": [ + "v", + "V", + "", + "", + 0 + ], + "KeyW": [ + "w", + "W", + "", + "", + 0 + ], + "KeyX": [ + "x", + "X", + "", + "", + 0 + ], + "KeyY": [ + "z", + "Z", + "", + "", + 0 + ], + "KeyZ": [ + "y", + "Y", + "", + "", + 0 + ], + "Digit1": [ + "1", + "+", + "¦", + "", + 0 + ], + "Digit2": [ + "2", + "\"", + "@", + "", + 0 + ], + "Digit3": [ + "3", + "*", + "#", + "", + 0 + ], + "Digit4": [ + "4", + "ç", + "°", + "", + 0 + ], + "Digit5": [ + "5", + "%", + "§", + "", + 0 + ], + "Digit6": [ + "6", + "&", + "¬", + "", + 0 + ], + "Digit7": [ + "7", + "/", + "|", + "", + 0 + ], + "Digit8": [ + "8", + "(", + "¢", + "", + 0 + ], + "Digit9": [ + "9", + ")", + "", + "", + 0 + ], + "Digit0": [ + "0", + "=", + "", + "", + 0 + ], + "Minus": [ + "'", + "?", + "´", + "", + 0 + ], + "Equal": [ + "^", + "`", + "~", + "", + 0 + ], + "BracketLeft": [ + "ü", + "è", + "[", + "", + 0 + ], + "BracketRight": [ + "¨", + "!", + "]", + "", + 0 + ], + "Backslash": [ + "$", + "£", + "}", + "", + 0 + ], + "Semicolon": [ + "ö", + "é", + "", + "", + 0 + ], + "Quote": [ + "ä", + "à", + "{", + "", + 0 + ], + "Backquote": [ + "§", + "°", + "", + "", + 0 + ], + "Comma": [ + ",", + ";", + "", + "", + 0 + ], + "Period": [ + ".", + ":", + "", + "", + 0 + ], + "Slash": [ + "-", + "_", + "", + "", + 0 + ] + } + }, + { + "language": "dk", + "platform": "win", + "entries": { + "KeyA": [ + "a", + "A", + "", + "", + 0 + ], + "KeyB": [ + "b", + "B", + "", + "", + 0 + ], + "KeyC": [ + "c", + "C", + "", + "", + 0 + ], + "KeyD": [ + "d", + "D", + "", + "", + 0 + ], + "KeyE": [ + "e", + "E", + "€", + "", + 0 + ], + "KeyF": [ + "f", + "F", + "", + "", + 0 + ], + "KeyG": [ + "g", + "G", + "", + "", + 0 + ], + "KeyH": [ + "h", + "H", + "", + "", + 0 + ], + "KeyI": [ + "i", + "I", + "", + "", + 0 + ], + "KeyJ": [ + "j", + "J", + "", + "", + 0 + ], + "KeyK": [ + "k", + "K", + "", + "", + 0 + ], + "KeyL": [ + "l", + "L", + "", + "", + 0 + ], + "KeyM": [ + "m", + "M", + "µ", + "", + 0 + ], + "KeyN": [ + "n", + "N", + "", + "", + 0 + ], + "KeyO": [ + "o", + "O", + "", + "", + 0 + ], + "KeyP": [ + "p", + "P", + "", + "", + 0 + ], + "KeyQ": [ + "q", + "Q", + "", + "", + 0 + ], + "KeyR": [ + "r", + "R", + "", + "", + 0 + ], + "KeyS": [ + "s", + "S", + "", + "", + 0 + ], + "KeyT": [ + "t", + "T", + "", + "", + 0 + ], + "KeyU": [ + "u", + "U", + "", + "", + 0 + ], + "KeyV": [ + "v", + "V", + "", + "", + 0 + ], + "KeyW": [ + "w", + "W", + "", + "", + 0 + ], + "KeyX": [ + "x", + "X", + "", + "", + 0 + ], + "KeyY": [ + "y", + "Y", + "", + "", + 0 + ], + "KeyZ": [ + "z", + "Z", + "", + "", + 0 + ], + "Digit1": [ + "1", + "!", + "", + "", + 0 + ], + "Digit2": [ + "2", + "\"", + "@", + "", + 0 + ], + "Digit3": [ + "3", + "#", + "£", + "", + 0 + ], + "Digit4": [ + "4", + "¤", + "$", + "", + 0 + ], + "Digit5": [ + "5", + "%", + "€", + "", + 0 + ], + "Digit6": [ + "6", + "&", + "", + "", + 0 + ], + "Digit7": [ + "7", + "/", + "{", + "", + 0 + ], + "Digit8": [ + "8", + "(", + "[", + "", + 0 + ], + "Digit9": [ + "9", + ")", + "]", + "", + 0 + ], + "Digit0": [ + "0", + "=", + "}", + "", + 0 + ], + "Minus": [ + "+", + "?", + "", + "", + 0 + ], + "Equal": [ + "´", + "`", + "|", + "", + 0 + ], + "BracketLeft": [ + "å", + "Å", + "", + "", + 0 + ], + "BracketRight": [ + "¨", + "^", + "~", + "", + 0 + ], + "Backslash": [ + "'", + "*", + "", + "", + 0 + ], + "Semicolon": [ + "æ", + "Æ", + "", + "", + 0 + ], + "Quote": [ + "ø", + "Ø", + "", + "", + 0 + ], + "Backquote": [ + "½", + "§", + "", + "", + 0 + ], + "Comma": [ + ",", + ";", + "", + "", + 0 + ], + "Period": [ + ".", + ":", + "", + "", + 0 + ], + "Slash": [ + "-", + "_", + "", + "", + 0 + ] + } + }, + { + "language": "dvorak", + "platform": "darwin", + "entries": { + "KeyA": [ + "a", + "A", + "å", + "Å", + 0 + ], + "KeyB": [ + "x", + "X", + "≈", + "˛", + 0 + ], + "KeyC": [ + "j", + "J", + "∆", + "Ô", + 0 + ], + "KeyD": [ + "e", + "E", + "´", + "´", + 4 + ], + "KeyE": [ + ".", + ">", + "≥", + "˘", + 0 + ], + "KeyF": [ + "u", + "U", + "¨", + "¨", + 4 + ], + "KeyG": [ + "i", + "I", + "ˆ", + "ˆ", + 4 + ], + "KeyH": [ + "d", + "D", + "∂", + "Î", + 0 + ], + "KeyI": [ + "c", + "C", + "ç", + "Ç", + 0 + ], + "KeyJ": [ + "h", + "H", + "˙", + "Ó", + 0 + ], + "KeyK": [ + "t", + "T", + "†", + "ˇ", + 0 + ], + "KeyL": [ + "n", + "N", + "˜", + "˜", + 4 + ], + "KeyM": [ + "m", + "M", + "µ", + "Â", + 0 + ], + "KeyN": [ + "b", + "B", + "∫", + "ı", + 0 + ], + "KeyO": [ + "r", + "R", + "®", + "‰", + 0 + ], + "KeyP": [ + "l", + "L", + "¬", + "Ò", + 0 + ], + "KeyQ": [ + "'", + "\"", + "æ", + "Æ", + 0 + ], + "KeyR": [ + "p", + "P", + "π", + "∏", + 0 + ], + "KeyS": [ + "o", + "O", + "ø", + "Ø", + 0 + ], + "KeyT": [ + "y", + "Y", + "¥", + "Á", + 0 + ], + "KeyU": [ + "g", + "G", + "©", + "˝", + 0 + ], + "KeyV": [ + "k", + "K", + "˚", + "", + 0 + ], + "KeyW": [ + ",", + "<", + "≤", + "¯", + 0 + ], + "KeyX": [ + "q", + "Q", + "œ", + "Œ", + 0 + ], + "KeyY": [ + "f", + "F", + "ƒ", + "Ï", + 0 + ], + "KeyZ": [ + ";", + ":", + "…", + "Ú", + 0 + ], + "Digit1": [ + "1", + "!", + "¡", + "⁄", + 0 + ], + "Digit2": [ + "2", + "@", + "™", + "€", + 0 + ], + "Digit3": [ + "3", + "#", + "£", + "‹", + 0 + ], + "Digit4": [ + "4", + "$", + "¢", + "›", + 0 + ], + "Digit5": [ + "5", + "%", + "∞", + "fi", + 0 + ], + "Digit6": [ + "6", + "^", + "§", + "fl", + 0 + ], + "Digit7": [ + "7", + "&", + "¶", + "‡", + 0 + ], + "Digit8": [ + "8", + "*", + "•", + "°", + 0 + ], + "Digit9": [ + "9", + "(", + "ª", + "·", + 0 + ], + "Digit0": [ + "0", + ")", + "º", + "‚", + 0 + ], + "Minus": [ + "[", + "{", + "“", + "”", + 0 + ], + "Equal": [ + "]", + "}", + "‘", + "’", + 0 + ], + "BracketLeft": [ + "/", + "?", + "÷", + "¿", + 0 + ], + "BracketRight": [ + "=", + "+", + "≠", + "±", + 0 + ], + "Backslash": [ + "\\", + "|", + "«", + "»", + 0 + ], + "Semicolon": [ + "s", + "S", + "ß", + "Í", + 0 + ], + "Quote": [ + "-", + "_", + "–", + "—", + 0 + ], + "Backquote": [ + "`", + "~", + "`", + "`", + 4 + ], + "Comma": [ + "w", + "W", + "∑", + "„", + 0 + ], + "Period": [ + "v", + "V", + "√", + "◊", + 0 + ], + "Slash": [ + "z", + "Z", + "Ω", + "¸", + 0 + ] + } + }, + { + "language": "en", + "platform": "win", + "entries": { + "KeyA": [ + "a", + "A", + "", + "", + 0 + ], + "KeyB": [ + "b", + "B", + "", + "", + 0 + ], + "KeyC": [ + "c", + "C", + "", + "", + 0 + ], + "KeyD": [ + "d", + "D", + "", + "", + 0 + ], + "KeyE": [ + "e", + "E", + "", + "", + 0 + ], + "KeyF": [ + "f", + "F", + "", + "", + 0 + ], + "KeyG": [ + "g", + "G", + "", + "", + 0 + ], + "KeyH": [ + "h", + "H", + "", + "", + 0 + ], + "KeyI": [ + "i", + "I", + "", + "", + 0 + ], + "KeyJ": [ + "j", + "J", + "", + "", + 0 + ], + "KeyK": [ + "k", + "K", + "", + "", + 0 + ], + "KeyL": [ + "l", + "L", + "", + "", + 0 + ], + "KeyM": [ + "m", + "M", + "", + "", + 0 + ], + "KeyN": [ + "n", + "N", + "", + "", + 0 + ], + "KeyO": [ + "o", + "O", + "", + "", + 0 + ], + "KeyP": [ + "p", + "P", + "", + "", + 0 + ], + "KeyQ": [ + "q", + "Q", + "", + "", + 0 + ], + "KeyR": [ + "r", + "R", + "", + "", + 0 + ], + "KeyS": [ + "s", + "S", + "", + "", + 0 + ], + "KeyT": [ + "t", + "T", + "", + "", + 0 + ], + "KeyU": [ + "u", + "U", + "", + "", + 0 + ], + "KeyV": [ + "v", + "V", + "", + "", + 0 + ], + "KeyW": [ + "w", + "W", + "", + "", + 0 + ], + "KeyX": [ + "x", + "X", + "", + "", + 0 + ], + "KeyY": [ + "y", + "Y", + "", + "", + 0 + ], + "KeyZ": [ + "z", + "Z", + "", + "", + 0 + ], + "Digit1": [ + "1", + "!", + "", + "", + 0 + ], + "Digit2": [ + "2", + "@", + "", + "", + 0 + ], + "Digit3": [ + "3", + "#", + "", + "", + 0 + ], + "Digit4": [ + "4", + "$", + "", + "", + 0 + ], + "Digit5": [ + "5", + "%", + "", + "", + 0 + ], + "Digit6": [ + "6", + "^", + "", + "", + 0 + ], + "Digit7": [ + "7", + "&", + "", + "", + 0 + ], + "Digit8": [ + "8", + "*", + "", + "", + 0 + ], + "Digit9": [ + "9", + "(", + "", + "", + 0 + ], + "Digit0": [ + "0", + ")", + "", + "", + 0 + ], + "Minus": [ + "-", + "_", + "", + "", + 0 + ], + "Equal": [ + "=", + "+", + "", + "", + 0 + ], + "BracketLeft": [ + "[", + "{", + "", + "", + 0 + ], + "BracketRight": [ + "]", + "}", + "", + "", + 0 + ], + "Backslash": [ + "\\", + "|", + "", + "", + 0 + ], + "Semicolon": [ + ";", + ":", + "", + "", + 0 + ], + "Quote": [ + "'", + "\"", + "", + "", + 0 + ], + "Backquote": [ + "`", + "~", + "", + "", + 0 + ], + "Comma": [ + ",", + "<", + "", + "", + 0 + ], + "Period": [ + ".", + ">", + "", + "", + 0 + ], + "Slash": [ + "/", + "?", + "", + "", + 0 + ] + } + }, + { + "language": "en", + "platform": "linux", + "entries": { + "KeyA": [ + "a", + "A", + "a", + "A", + 0 + ], + "KeyB": [ + "b", + "B", + "b", + "B", + 0 + ], + "KeyC": [ + "c", + "C", + "c", + "C", + 0 + ], + "KeyD": [ + "d", + "D", + "d", + "D", + 0 + ], + "KeyE": [ + "e", + "E", + "e", + "E", + 0 + ], + "KeyF": [ + "f", + "F", + "f", + "F", + 0 + ], + "KeyG": [ + "g", + "G", + "g", + "G", + 0 + ], + "KeyH": [ + "h", + "H", + "h", + "H", + 0 + ], + "KeyI": [ + "i", + "I", + "i", + "I", + 0 + ], + "KeyJ": [ + "j", + "J", + "j", + "J", + 0 + ], + "KeyK": [ + "k", + "K", + "k", + "K", + 0 + ], + "KeyL": [ + "l", + "L", + "l", + "L", + 0 + ], + "KeyM": [ + "m", + "M", + "m", + "M", + 0 + ], + "KeyN": [ + "n", + "N", + "n", + "N", + 0 + ], + "KeyO": [ + "o", + "O", + "o", + "O", + 0 + ], + "KeyP": [ + "p", + "P", + "p", + "P", + 0 + ], + "KeyQ": [ + "q", + "Q", + "q", + "Q", + 0 + ], + "KeyR": [ + "r", + "R", + "r", + "R", + 0 + ], + "KeyS": [ + "s", + "S", + "s", + "S", + 0 + ], + "KeyT": [ + "t", + "T", + "t", + "T", + 0 + ], + "KeyU": [ + "u", + "U", + "u", + "U", + 0 + ], + "KeyV": [ + "v", + "V", + "v", + "V", + 0 + ], + "KeyW": [ + "w", + "W", + "w", + "W", + 0 + ], + "KeyX": [ + "x", + "X", + "x", + "X", + 0 + ], + "KeyY": [ + "y", + "Y", + "y", + "Y", + 0 + ], + "KeyZ": [ + "z", + "Z", + "z", + "Z", + 0 + ], + "Digit1": [ + "1", + "!", + "1", + "!", + 0 + ], + "Digit2": [ + "2", + "@", + "2", + "@", + 0 + ], + "Digit3": [ + "3", + "#", + "3", + "#", + 0 + ], + "Digit4": [ + "4", + "$", + "4", + "$", + 0 + ], + "Digit5": [ + "5", + "%", + "5", + "%", + 0 + ], + "Digit6": [ + "6", + "^", + "6", + "^", + 0 + ], + "Digit7": [ + "7", + "&", + "7", + "&", + 0 + ], + "Digit8": [ + "8", + "*", + "8", + "*", + 0 + ], + "Digit9": [ + "9", + "(", + "9", + "(", + 0 + ], + "Digit0": [ + "0", + ")", + "0", + ")", + 0 + ], + "Minus": [ + "-", + "_", + "-", + "_", + 0 + ], + "Equal": [ + "=", + "+", + "=", + "+", + 0 + ], + "BracketLeft": [ + "[", + "{", + "[", + "{", + 0 + ], + "BracketRight": [ + "]", + "}", + "]", + "}", + 0 + ], + "Backslash": [ + "\\", + "|", + "\\", + "|", + 0 + ], + "Semicolon": [ + ";", + ":", + ";", + ":", + 0 + ], + "Quote": [ + "'", + "\"", + "'", + "\"", + 0 + ], + "Backquote": [ + "`", + "~", + "`", + "~", + 0 + ], + "Comma": [ + ",", + "<", + ",", + "<", + 0 + ], + "Period": [ + ".", + ">", + ".", + ">", + 0 + ], + "Slash": [ + "/", + "?", + "/", + "?", + 0 + ] + } + }, + { + "language": "en", + "platform": "darwin", + "entries": { + "KeyA": [ + "a", + "A", + "å", + "Å", + 0 + ], + "KeyB": [ + "b", + "B", + "∫", + "ı", + 0 + ], + "KeyC": [ + "c", + "C", + "ç", + "Ç", + 0 + ], + "KeyD": [ + "d", + "D", + "∂", + "Î", + 0 + ], + "KeyE": [ + "e", + "E", + "´", + "´", + 4 + ], + "KeyF": [ + "f", + "F", + "ƒ", + "Ï", + 0 + ], + "KeyG": [ + "g", + "G", + "©", + "˝", + 0 + ], + "KeyH": [ + "h", + "H", + "˙", + "Ó", + 0 + ], + "KeyI": [ + "i", + "I", + "ˆ", + "ˆ", + 4 + ], + "KeyJ": [ + "j", + "J", + "∆", + "Ô", + 0 + ], + "KeyK": [ + "k", + "K", + "˚", + "", + 0 + ], + "KeyL": [ + "l", + "L", + "¬", + "Ò", + 0 + ], + "KeyM": [ + "m", + "M", + "µ", + "Â", + 0 + ], + "KeyN": [ + "n", + "N", + "˜", + "˜", + 4 + ], + "KeyO": [ + "o", + "O", + "ø", + "Ø", + 0 + ], + "KeyP": [ + "p", + "P", + "π", + "∏", + 0 + ], + "KeyQ": [ + "q", + "Q", + "œ", + "Œ", + 0 + ], + "KeyR": [ + "r", + "R", + "®", + "‰", + 0 + ], + "KeyS": [ + "s", + "S", + "ß", + "Í", + 0 + ], + "KeyT": [ + "t", + "T", + "†", + "ˇ", + 0 + ], + "KeyU": [ + "u", + "U", + "¨", + "¨", + 4 + ], + "KeyV": [ + "v", + "V", + "√", + "◊", + 0 + ], + "KeyW": [ + "w", + "W", + "∑", + "„", + 0 + ], + "KeyX": [ + "x", + "X", + "≈", + "˛", + 0 + ], + "KeyY": [ + "y", + "Y", + "¥", + "Á", + 0 + ], + "KeyZ": [ + "z", + "Z", + "Ω", + "¸", + 0 + ], + "Digit1": [ + "1", + "!", + "¡", + "⁄", + 0 + ], + "Digit2": [ + "2", + "@", + "™", + "€", + 0 + ], + "Digit3": [ + "3", + "#", + "£", + "‹", + 0 + ], + "Digit4": [ + "4", + "$", + "¢", + "›", + 0 + ], + "Digit5": [ + "5", + "%", + "∞", + "fi", + 0 + ], + "Digit6": [ + "6", + "^", + "§", + "fl", + 0 + ], + "Digit7": [ + "7", + "&", + "¶", + "‡", + 0 + ], + "Digit8": [ + "8", + "*", + "•", + "°", + 0 + ], + "Digit9": [ + "9", + "(", + "ª", + "·", + 0 + ], + "Digit0": [ + "0", + ")", + "º", + "‚", + 0 + ], + "Minus": [ + "-", + "_", + "–", + "—", + 0 + ], + "Equal": [ + "=", + "+", + "≠", + "±", + 0 + ], + "BracketLeft": [ + "[", + "{", + "“", + "”", + 0 + ], + "BracketRight": [ + "]", + "}", + "‘", + "’", + 0 + ], + "Backslash": [ + "\\", + "|", + "«", + "»", + 0 + ], + "Semicolon": [ + ";", + ":", + "…", + "Ú", + 0 + ], + "Quote": [ + "'", + "\"", + "æ", + "Æ", + 0 + ], + "Backquote": [ + "`", + "~", + "`", + "`", + 4 + ], + "Comma": [ + ",", + "<", + "≤", + "¯", + 0 + ], + "Period": [ + ".", + ">", + "≥", + "˘", + 0 + ], + "Slash": [ + "/", + "?", + "÷", + "¿", + 0 + ] + } + }, + { + "language": "en-belgian", + "platform": "win", + "entries": { + "KeyA": [ + "q", + "Q", + "", + "", + 0 + ], + "KeyB": [ + "b", + "B", + "", + "", + 0 + ], + "KeyC": [ + "c", + "C", + "", + "", + 0 + ], + "KeyD": [ + "d", + "D", + "", + "", + 0 + ], + "KeyE": [ + "e", + "E", + "€", + "", + 0 + ], + "KeyF": [ + "f", + "F", + "", + "", + 0 + ], + "KeyG": [ + "g", + "G", + "", + "", + 0 + ], + "KeyH": [ + "h", + "H", + "", + "", + 0 + ], + "KeyI": [ + "i", + "I", + "", + "", + 0 + ], + "KeyJ": [ + "j", + "J", + "", + "", + 0 + ], + "KeyK": [ + "k", + "K", + "", + "", + 0 + ], + "KeyL": [ + "l", + "L", + "", + "", + 0 + ], + "KeyM": [ + ",", + "?", + "", + "", + 0 + ], + "KeyN": [ + "n", + "N", + "", + "", + 0 + ], + "KeyO": [ + "o", + "O", + "", + "", + 0 + ], + "KeyP": [ + "p", + "P", + "", + "", + 0 + ], + "KeyQ": [ + "a", + "A", + "", + "", + 0 + ], + "KeyR": [ + "r", + "R", + "", + "", + 0 + ], + "KeyS": [ + "s", + "S", + "", + "", + 0 + ], + "KeyT": [ + "t", + "T", + "", + "", + 0 + ], + "KeyU": [ + "u", + "U", + "", + "", + 0 + ], + "KeyV": [ + "v", + "V", + "", + "", + 0 + ], + "KeyW": [ + "z", + "Z", + "", + "", + 0 + ], + "KeyX": [ + "x", + "X", + "", + "", + 0 + ], + "KeyY": [ + "y", + "Y", + "", + "", + 0 + ], + "KeyZ": [ + "w", + "W", + "", + "", + 0 + ], + "Digit1": [ + "&", + "1", + "|", + "", + 0 + ], + "Digit2": [ + "é", + "2", + "@", + "", + 0 + ], + "Digit3": [ + "\"", + "3", + "#", + "", + 0 + ], + "Digit4": [ + "'", + "4", + "{", + "", + 0 + ], + "Digit5": [ + "(", + "5", + "[", + "", + 0 + ], + "Digit6": [ + "§", + "6", + "^", + "", + 0 + ], + "Digit7": [ + "è", + "7", + "", + "", + 0 + ], + "Digit8": [ + "!", + "8", + "", + "", + 0 + ], + "Digit9": [ + "ç", + "9", + "{", + "", + 0 + ], + "Digit0": [ + "à", + "0", + "}", + "", + 0 + ], + "Minus": [ + ")", + "°", + "", + "", + 0 + ], + "Equal": [ + "-", + "_", + "", + "", + 0 + ], + "BracketLeft": [ + "^", + "¨", + "[", + "", + 0 + ], + "BracketRight": [ + "$", + "*", + "]", + "", + 0 + ], + "Backslash": [ + "µ", + "£", + "`", + "`", + 0 + ], + "Semicolon": [ + "m", + "M", + "", + "", + 0 + ], + "Quote": [ + "ù", + "%", + "´", + "´", + 0 + ], + "Backquote": [ + "²", + "³", + "", + "", + 0 + ], + "Comma": [ + ";", + ".", + "", + "", + 0 + ], + "Period": [ + ":", + "/", + "", + "", + 0 + ], + "Slash": [ + "=", + "+", + "~", + "~", + 0 + ] + } + }, + { + "language": "en-ext", + "platform": "darwin", + "entries": { + "KeyA": [ + "a", + "A", + "¯", + "̄", + 4 + ], + "KeyB": [ + "b", + "B", + "˘", + "̆", + 4 + ], + "KeyC": [ + "c", + "C", + "¸", + "̧", + 4 + ], + "KeyD": [ + "d", + "D", + "ð", + "Ð", + 0 + ], + "KeyE": [ + "e", + "E", + "´", + "́", + 4 + ], + "KeyF": [ + "f", + "F", + "ƒ", + "", + 0 + ], + "KeyG": [ + "g", + "G", + "©", + "‸", + 8 + ], + "KeyH": [ + "h", + "H", + "ˍ", + "̱", + 4 + ], + "KeyI": [ + "i", + "I", + "ʼ", + "̛", + 4 + ], + "KeyJ": [ + "j", + "J", + "˝", + "̋", + 4 + ], + "KeyK": [ + "k", + "K", + "˚", + "̊", + 4 + ], + "KeyL": [ + "l", + "L", + "-", + "̵", + 4 + ], + "KeyM": [ + "m", + "M", + "˛", + "̨", + 4 + ], + "KeyN": [ + "n", + "N", + "˜", + "̃", + 4 + ], + "KeyO": [ + "o", + "O", + "ø", + "Ø", + 0 + ], + "KeyP": [ + "p", + "P", + ",", + "̦", + 4 + ], + "KeyQ": [ + "q", + "Q", + "œ", + "Œ", + 0 + ], + "KeyR": [ + "r", + "R", + "®", + "‰", + 0 + ], + "KeyS": [ + "s", + "S", + "ß", + "", + 0 + ], + "KeyT": [ + "t", + "T", + "þ", + "Þ", + 0 + ], + "KeyU": [ + "u", + "U", + "¨", + "̈", + 4 + ], + "KeyV": [ + "v", + "V", + "ˇ", + "̌", + 4 + ], + "KeyW": [ + "w", + "W", + "˙", + "̇", + 4 + ], + "KeyX": [ + "x", + "X", + ".", + "̣", + 4 + ], + "KeyY": [ + "y", + "Y", + "¥", + "", + 0 + ], + "KeyZ": [ + "z", + "Z", + "ˀ", + "̉", + 4 + ], + "Digit1": [ + "1", + "!", + "¡", + "⁄", + 0 + ], + "Digit2": [ + "2", + "@", + "™", + "€", + 0 + ], + "Digit3": [ + "3", + "#", + "£", + "‹", + 0 + ], + "Digit4": [ + "4", + "$", + "¢", + "›", + 0 + ], + "Digit5": [ + "5", + "%", + "§", + "†", + 0 + ], + "Digit6": [ + "6", + "^", + "ˆ", + "̂", + 4 + ], + "Digit7": [ + "7", + "&", + "¶", + "‡", + 0 + ], + "Digit8": [ + "8", + "*", + "•", + "°", + 0 + ], + "Digit9": [ + "9", + "(", + "ª", + "·", + 0 + ], + "Digit0": [ + "0", + ")", + "º", + "‚", + 0 + ], + "Minus": [ + "-", + "_", + "–", + "—", + 0 + ], + "Equal": [ + "=", + "+", + "≠", + "±", + 0 + ], + "BracketLeft": [ + "[", + "{", + "“", + "”", + 0 + ], + "BracketRight": [ + "]", + "}", + "‘", + "’", + 0 + ], + "Backslash": [ + "\\", + "|", + "«", + "»", + 0 + ], + "Semicolon": [ + ";", + ":", + "…", + "№", + 8 + ], + "Quote": [ + "'", + "\"", + "æ", + "Æ", + 0 + ], + "Backquote": [ + "`", + "~", + "`", + "̀", + 4 + ], + "Comma": [ + ",", + "<", + "≤", + "„", + 0 + ], + "Period": [ + ".", + ">", + "≥", + "ʔ", + 8 + ], + "Slash": [ + "/", + "?", + "÷", + "¿", + 0 + ] + } + }, + { + "language": "en-in", + "platform": "win", + "entries": { + "KeyA": [ + "a", + "A", + "ā", + "Ā", + 0 + ], + "KeyB": [ + "b", + "B", + "", + "", + 0 + ], + "KeyC": [ + "c", + "C", + "", + "", + 0 + ], + "KeyD": [ + "d", + "D", + "ḍ", + "Ḍ", + 0 + ], + "KeyE": [ + "e", + "E", + "ē", + "Ē", + 0 + ], + "KeyF": [ + "f", + "F", + "", + "", + 0 + ], + "KeyG": [ + "g", + "G", + "ṅ", + "Ṅ", + 0 + ], + "KeyH": [ + "h", + "H", + "ḥ", + "Ḥ", + 0 + ], + "KeyI": [ + "i", + "I", + "ī", + "Ī", + 0 + ], + "KeyJ": [ + "j", + "J", + "", + "", + 0 + ], + "KeyK": [ + "k", + "K", + "", + "", + 0 + ], + "KeyL": [ + "l", + "L", + "l̥", + "L̥", + 0 + ], + "KeyM": [ + "m", + "M", + "ṁ", + "Ṁ", + 0 + ], + "KeyN": [ + "n", + "N", + "ṇ", + "Ṇ", + 0 + ], + "KeyO": [ + "o", + "O", + "ō", + "Ō", + 0 + ], + "KeyP": [ + "p", + "P", + "", + "", + 0 + ], + "KeyQ": [ + "q", + "Q", + "æ", + "Æ", + 0 + ], + "KeyR": [ + "r", + "R", + "r̥", + "R̥", + 0 + ], + "KeyS": [ + "s", + "S", + "ś", + "Ś", + 0 + ], + "KeyT": [ + "t", + "T", + "ṭ", + "Ṭ", + 0 + ], + "KeyU": [ + "u", + "U", + "ū", + "Ū", + 0 + ], + "KeyV": [ + "v", + "V", + "", + "", + 0 + ], + "KeyW": [ + "w", + "W", + "", + "", + 0 + ], + "KeyX": [ + "x", + "X", + "ṣ", + "Ṣ", + 0 + ], + "KeyY": [ + "y", + "Y", + "ñ", + "Ñ", + 0 + ], + "KeyZ": [ + "z", + "Z", + "", + "", + 0 + ], + "Digit1": [ + "1", + "!", + "", + "", + 0 + ], + "Digit2": [ + "2", + "@", + "", + "", + 0 + ], + "Digit3": [ + "3", + "#", + "", + "", + 0 + ], + "Digit4": [ + "4", + "$", + "₹", + "", + 0 + ], + "Digit5": [ + "5", + "%", + "", + "", + 0 + ], + "Digit6": [ + "6", + "^", + "", + "ˆ", + 0 + ], + "Digit7": [ + "7", + "&", + "", + "", + 0 + ], + "Digit8": [ + "8", + "*", + "", + "", + 0 + ], + "Digit9": [ + "9", + "(", + "", + "˘", + 0 + ], + "Digit0": [ + "0", + ")", + "", + "", + 0 + ], + "Minus": [ + "-", + "_", + "-", + "ˍ", + 0 + ], + "Equal": [ + "=", + "+", + "", + "", + 0 + ], + "BracketLeft": [ + "[", + "{", + "", + "", + 0 + ], + "BracketRight": [ + "]", + "}", + "", + "", + 0 + ], + "Backslash": [ + "\\", + "|", + "", + "", + 0 + ], + "Semicolon": [ + ";", + ":", + "", + "", + 0 + ], + "Quote": [ + "'", + "\"", + "", + "", + 0 + ], + "Backquote": [ + "`", + "~", + "", + "~", + 0 + ], + "Comma": [ + ",", + "<", + ",", + "<", + 0 + ], + "Period": [ + ".", + ">", + ".", + "", + 0 + ], + "Slash": [ + "/", + "?", + "", + "", + 0 + ] + } + }, + { + "language": "en-intl", + "platform": "win", + "entries": { + "KeyA": [ + "a", + "A", + "á", + "Á", + 0 + ], + "KeyB": [ + "b", + "B", + "", + "", + 0 + ], + "KeyC": [ + "c", + "C", + "©", + "¢", + 0 + ], + "KeyD": [ + "d", + "D", + "ð", + "Ð", + 0 + ], + "KeyE": [ + "e", + "E", + "é", + "É", + 0 + ], + "KeyF": [ + "f", + "F", + "", + "", + 0 + ], + "KeyG": [ + "g", + "G", + "", + "", + 0 + ], + "KeyH": [ + "h", + "H", + "", + "", + 0 + ], + "KeyI": [ + "i", + "I", + "í", + "Í", + 0 + ], + "KeyJ": [ + "j", + "J", + "", + "", + 0 + ], + "KeyK": [ + "k", + "K", + "", + "", + 0 + ], + "KeyL": [ + "l", + "L", + "ø", + "Ø", + 0 + ], + "KeyM": [ + "m", + "M", + "µ", + "", + 0 + ], + "KeyN": [ + "n", + "N", + "ñ", + "Ñ", + 0 + ], + "KeyO": [ + "o", + "O", + "ó", + "Ó", + 0 + ], + "KeyP": [ + "p", + "P", + "ö", + "Ö", + 0 + ], + "KeyQ": [ + "q", + "Q", + "ä", + "Ä", + 0 + ], + "KeyR": [ + "r", + "R", + "®", + "", + 0 + ], + "KeyS": [ + "s", + "S", + "ß", + "§", + 0 + ], + "KeyT": [ + "t", + "T", + "þ", + "Þ", + 0 + ], + "KeyU": [ + "u", + "U", + "ú", + "Ú", + 0 + ], + "KeyV": [ + "v", + "V", + "", + "", + 0 + ], + "KeyW": [ + "w", + "W", + "å", + "Å", + 0 + ], + "KeyX": [ + "x", + "X", + "", + "", + 0 + ], + "KeyY": [ + "y", + "Y", + "ü", + "Ü", + 0 + ], + "KeyZ": [ + "z", + "Z", + "æ", + "Æ", + 0 + ], + "Digit1": [ + "1", + "!", + "¡", + "¹", + 0 + ], + "Digit2": [ + "2", + "@", + "²", + "", + 0 + ], + "Digit3": [ + "3", + "#", + "³", + "", + 0 + ], + "Digit4": [ + "4", + "$", + "¤", + "£", + 0 + ], + "Digit5": [ + "5", + "%", + "€", + "", + 0 + ], + "Digit6": [ + "6", + "^", + "¼", + "", + 0 + ], + "Digit7": [ + "7", + "&", + "½", + "", + 0 + ], + "Digit8": [ + "8", + "*", + "¾", + "", + 0 + ], + "Digit9": [ + "9", + "(", + "‘", + "", + 0 + ], + "Digit0": [ + "0", + ")", + "’", + "", + 0 + ], + "Minus": [ + "-", + "_", + "¥", + "", + 0 + ], + "Equal": [ + "=", + "+", + "×", + "÷", + 0 + ], + "BracketLeft": [ + "[", + "{", + "«", + "", + 0 + ], + "BracketRight": [ + "]", + "}", + "»", + "", + 0 + ], + "Backslash": [ + "\\", + "|", + "¬", + "¦", + 0 + ], + "Semicolon": [ + ";", + ":", + "¶", + "°", + 0 + ], + "Quote": [ + "'", + "\"", + "´", + "¨", + 0 + ], + "Backquote": [ + "`", + "~", + "", + "", + 0 + ], + "Comma": [ + ",", + "<", + "ç", + "Ç", + 0 + ], + "Period": [ + ".", + ">", + "", + "", + 0 + ], + "Slash": [ + "/", + "?", + "¿", + "", + 0 + ] + } + }, + { + "language": "en-intl", + "platform": "darwin", + "entries": { + "KeyA": [ + "a", + "A", + "å", + "Å", + 0 + ], + "KeyB": [ + "b", + "B", + "∫", + "ı", + 0 + ], + "KeyC": [ + "c", + "C", + "ç", + "Ç", + 0 + ], + "KeyD": [ + "d", + "D", + "∂", + "Î", + 0 + ], + "KeyE": [ + "e", + "E", + "´", + "´", + 4 + ], + "KeyF": [ + "f", + "F", + "ƒ", + "Ï", + 0 + ], + "KeyG": [ + "g", + "G", + "©", + "˝", + 0 + ], + "KeyH": [ + "h", + "H", + "˙", + "Ó", + 0 + ], + "KeyI": [ + "i", + "I", + "ˆ", + "ˆ", + 4 + ], + "KeyJ": [ + "j", + "J", + "∆", + "Ô", + 0 + ], + "KeyK": [ + "k", + "K", + "˚", + "", + 0 + ], + "KeyL": [ + "l", + "L", + "¬", + "Ò", + 0 + ], + "KeyM": [ + "m", + "M", + "µ", + "Â", + 0 + ], + "KeyN": [ + "n", + "N", + "˜", + "˜", + 4 + ], + "KeyO": [ + "o", + "O", + "ø", + "Ø", + 0 + ], + "KeyP": [ + "p", + "P", + "π", + "∏", + 0 + ], + "KeyQ": [ + "q", + "Q", + "œ", + "Œ", + 0 + ], + "KeyR": [ + "r", + "R", + "®", + "‰", + 0 + ], + "KeyS": [ + "s", + "S", + "ß", + "Í", + 0 + ], + "KeyT": [ + "t", + "T", + "†", + "ˇ", + 0 + ], + "KeyU": [ + "u", + "U", + "¨", + "¨", + 4 + ], + "KeyV": [ + "v", + "V", + "√", + "◊", + 0 + ], + "KeyW": [ + "w", + "W", + "∑", + "„", + 0 + ], + "KeyX": [ + "x", + "X", + "≈", + "˛", + 0 + ], + "KeyY": [ + "y", + "Y", + "¥", + "Á", + 0 + ], + "KeyZ": [ + "z", + "Z", + "Ω", + "¸", + 0 + ], + "Digit1": [ + "1", + "!", + "¡", + "⁄", + 0 + ], + "Digit2": [ + "2", + "@", + "™", + "€", + 0 + ], + "Digit3": [ + "3", + "#", + "£", + "‹", + 0 + ], + "Digit4": [ + "4", + "$", + "¢", + "›", + 0 + ], + "Digit5": [ + "5", + "%", + "∞", + "fi", + 0 + ], + "Digit6": [ + "6", + "ˆ", + "§", + "fl", + 2 + ], + "Digit7": [ + "7", + "&", + "¶", + "‡", + 0 + ], + "Digit8": [ + "8", + "*", + "•", + "°", + 0 + ], + "Digit9": [ + "9", + "(", + "ª", + "·", + 0 + ], + "Digit0": [ + "0", + ")", + "º", + "‚", + 0 + ], + "Minus": [ + "-", + "_", + "–", + "—", + 0 + ], + "Equal": [ + "=", + "+", + "≠", + "±", + 0 + ], + "BracketLeft": [ + "[", + "{", + "“", + "”", + 0 + ], + "BracketRight": [ + "]", + "}", + "‘", + "’", + 0 + ], + "Backslash": [ + "\\", + "|", + "«", + "»", + 0 + ], + "Semicolon": [ + ";", + ":", + "…", + "Ú", + 0 + ], + "Quote": [ + "'", + "\"", + "æ", + "Æ", + 3 + ], + "Backquote": [ + "`", + "˜", + "`", + "`", + 7 + ], + "Comma": [ + ",", + "<", + "≤", + "¯", + 0 + ], + "Period": [ + ".", + ">", + "≥", + "˘", + 0 + ], + "Slash": [ + "/", + "?", + "÷", + "¿", + 0 + ] + } + }, + { + "language": "en-uk", + "platform": "win", + "entries": { + "KeyA": [ + "a", + "A", + "á", + "Á", + 0 + ], + "KeyB": [ + "b", + "B", + "", + "", + 0 + ], + "KeyC": [ + "c", + "C", + "", + "", + 0 + ], + "KeyD": [ + "d", + "D", + "", + "", + 0 + ], + "KeyE": [ + "e", + "E", + "é", + "É", + 0 + ], + "KeyF": [ + "f", + "F", + "", + "", + 0 + ], + "KeyG": [ + "g", + "G", + "", + "", + 0 + ], + "KeyH": [ + "h", + "H", + "", + "", + 0 + ], + "KeyI": [ + "i", + "I", + "í", + "Í", + 0 + ], + "KeyJ": [ + "j", + "J", + "", + "", + 0 + ], + "KeyK": [ + "k", + "K", + "", + "", + 0 + ], + "KeyL": [ + "l", + "L", + "", + "", + 0 + ], + "KeyM": [ + "m", + "M", + "", + "", + 0 + ], + "KeyN": [ + "n", + "N", + "", + "", + 0 + ], + "KeyO": [ + "o", + "O", + "ó", + "Ó", + 0 + ], + "KeyP": [ + "p", + "P", + "", + "", + 0 + ], + "KeyQ": [ + "q", + "Q", + "", + "", + 0 + ], + "KeyR": [ + "r", + "R", + "", + "", + 0 + ], + "KeyS": [ + "s", + "S", + "", + "", + 0 + ], + "KeyT": [ + "t", + "T", + "", + "", + 0 + ], + "KeyU": [ + "u", + "U", + "ú", + "Ú", + 0 + ], + "KeyV": [ + "v", + "V", + "", + "", + 0 + ], + "KeyW": [ + "w", + "W", + "", + "", + 0 + ], + "KeyX": [ + "x", + "X", + "", + "", + 0 + ], + "KeyY": [ + "y", + "Y", + "", + "", + 0 + ], + "KeyZ": [ + "z", + "Z", + "", + "", + 0 + ], + "Digit1": [ + "1", + "!", + "", + "", + 0 + ], + "Digit2": [ + "2", + "\"", + "", + "", + 0 + ], + "Digit3": [ + "3", + "£", + "", + "", + 0 + ], + "Digit4": [ + "4", + "$", + "€", + "", + 0 + ], + "Digit5": [ + "5", + "%", + "", + "", + 0 + ], + "Digit6": [ + "6", + "^", + "", + "", + 0 + ], + "Digit7": [ + "7", + "&", + "", + "", + 0 + ], + "Digit8": [ + "8", + "*", + "", + "", + 0 + ], + "Digit9": [ + "9", + "(", + "", + "", + 0 + ], + "Digit0": [ + "0", + ")", + "", + "", + 0 + ], + "Minus": [ + "-", + "_", + "", + "", + 0 + ], + "Equal": [ + "=", + "+", + "", + "", + 0 + ], + "BracketLeft": [ + "[", + "{", + "", + "", + 0 + ], + "BracketRight": [ + "]", + "}", + "", + "", + 0 + ], + "Backslash": [ + "#", + "~", + "\\", + "|", + 0 + ], + "Semicolon": [ + ";", + ":", + "", + "", + 0 + ], + "Quote": [ + "'", + "@", + "", + "", + 0 + ], + "Backquote": [ + "`", + "¬", + "¦", + "", + 0 + ], + "Comma": [ + ",", + "<", + "", + "", + 0 + ], + "Period": [ + ".", + ">", + "", + "", + 0 + ], + "Slash": [ + "/", + "?", + "", + "", + 0 + ] + } + }, + { + "language": "en-uk", + "platform": "darwin", + "entries": { + "KeyA": [ + "a", + "A", + "å", + "Å", + 0 + ], + "KeyB": [ + "b", + "B", + "∫", + "ı", + 0 + ], + "KeyC": [ + "c", + "C", + "ç", + "Ç", + 0 + ], + "KeyD": [ + "d", + "D", + "∂", + "Î", + 0 + ], + "KeyE": [ + "e", + "E", + "´", + "‰", + 4 + ], + "KeyF": [ + "f", + "F", + "ƒ", + "Ï", + 0 + ], + "KeyG": [ + "g", + "G", + "©", + "Ì", + 0 + ], + "KeyH": [ + "h", + "H", + "˙", + "Ó", + 0 + ], + "KeyI": [ + "i", + "I", + "^", + "È", + 4 + ], + "KeyJ": [ + "j", + "J", + "∆", + "Ô", + 0 + ], + "KeyK": [ + "k", + "K", + "˚", + "", + 0 + ], + "KeyL": [ + "l", + "L", + "¬", + "Ò", + 0 + ], + "KeyM": [ + "m", + "M", + "µ", + "˜", + 0 + ], + "KeyN": [ + "n", + "N", + "~", + "ˆ", + 4 + ], + "KeyO": [ + "o", + "O", + "ø", + "Ø", + 0 + ], + "KeyP": [ + "p", + "P", + "π", + "∏", + 0 + ], + "KeyQ": [ + "q", + "Q", + "œ", + "Œ", + 0 + ], + "KeyR": [ + "r", + "R", + "®", + "Â", + 0 + ], + "KeyS": [ + "s", + "S", + "ß", + "Í", + 0 + ], + "KeyT": [ + "t", + "T", + "†", + "Ê", + 0 + ], + "KeyU": [ + "u", + "U", + "¨", + "Ë", + 4 + ], + "KeyV": [ + "v", + "V", + "√", + "◊", + 0 + ], + "KeyW": [ + "w", + "W", + "∑", + "„", + 0 + ], + "KeyX": [ + "x", + "X", + "≈", + "Ù", + 0 + ], + "KeyY": [ + "y", + "Y", + "¥", + "Á", + 0 + ], + "KeyZ": [ + "z", + "Z", + "Ω", + "Û", + 0 + ], + "Digit1": [ + "1", + "!", + "¡", + "⁄", + 0 + ], + "Digit2": [ + "2", + "@", + "€", + "™", + 0 + ], + "Digit3": [ + "3", + "£", + "#", + "‹", + 0 + ], + "Digit4": [ + "4", + "$", + "¢", + "›", + 0 + ], + "Digit5": [ + "5", + "%", + "∞", + "fi", + 0 + ], + "Digit6": [ + "6", + "^", + "§", + "fl", + 0 + ], + "Digit7": [ + "7", + "&", + "¶", + "‡", + 0 + ], + "Digit8": [ + "8", + "*", + "•", + "°", + 0 + ], + "Digit9": [ + "9", + "(", + "ª", + "·", + 0 + ], + "Digit0": [ + "0", + ")", + "º", + "‚", + 0 + ], + "Minus": [ + "-", + "_", + "–", + "—", + 0 + ], + "Equal": [ + "=", + "+", + "≠", + "±", + 0 + ], + "BracketLeft": [ + "[", + "{", + "“", + "”", + 0 + ], + "BracketRight": [ + "]", + "}", + "‘", + "’", + 0 + ], + "Backslash": [ + "\\", + "|", + "«", + "»", + 0 + ], + "Semicolon": [ + ";", + ":", + "…", + "Ú", + 0 + ], + "Quote": [ + "'", + "\"", + "æ", + "Æ", + 0 + ], + "Backquote": [ + "`", + "~", + "`", + "Ÿ", + 4 + ], + "Comma": [ + ",", + "<", + "≤", + "¯", + 0 + ], + "Period": [ + ".", + ">", + "≥", + "˘", + 0 + ], + "Slash": [ + "/", + "?", + "÷", + "¿", + 0 + ] + } + }, + { + "language": "es", + "platform": "win", + "entries": { + "KeyA": [ + "a", + "A", + "", + "", + 0 + ], + "KeyB": [ + "b", + "B", + "", + "", + 0 + ], + "KeyC": [ + "c", + "C", + "", + "", + 0 + ], + "KeyD": [ + "d", + "D", + "", + "", + 0 + ], + "KeyE": [ + "e", + "E", + "€", + "", + 0 + ], + "KeyF": [ + "f", + "F", + "", + "", + 0 + ], + "KeyG": [ + "g", + "G", + "", + "", + 0 + ], + "KeyH": [ + "h", + "H", + "", + "", + 0 + ], + "KeyI": [ + "i", + "I", + "", + "", + 0 + ], + "KeyJ": [ + "j", + "J", + "", + "", + 0 + ], + "KeyK": [ + "k", + "K", + "", + "", + 0 + ], + "KeyL": [ + "l", + "L", + "", + "", + 0 + ], + "KeyM": [ + "m", + "M", + "", + "", + 0 + ], + "KeyN": [ + "n", + "N", + "", + "", + 0 + ], + "KeyO": [ + "o", + "O", + "", + "", + 0 + ], + "KeyP": [ + "p", + "P", + "", + "", + 0 + ], + "KeyQ": [ + "q", + "Q", + "", + "", + 0 + ], + "KeyR": [ + "r", + "R", + "", + "", + 0 + ], + "KeyS": [ + "s", + "S", + "", + "", + 0 + ], + "KeyT": [ + "t", + "T", + "", + "", + 0 + ], + "KeyU": [ + "u", + "U", + "", + "", + 0 + ], + "KeyV": [ + "v", + "V", + "", + "", + 0 + ], + "KeyW": [ + "w", + "W", + "", + "", + 0 + ], + "KeyX": [ + "x", + "X", + "", + "", + 0 + ], + "KeyY": [ + "y", + "Y", + "", + "", + 0 + ], + "KeyZ": [ + "z", + "Z", + "", + "", + 0 + ], + "Digit1": [ + "1", + "!", + "|", + "", + 0 + ], + "Digit2": [ + "2", + "\"", + "@", + "", + 0 + ], + "Digit3": [ + "3", + "·", + "#", + "", + 0 + ], + "Digit4": [ + "4", + "$", + "~", + "", + 0 + ], + "Digit5": [ + "5", + "%", + "€", + "", + 0 + ], + "Digit6": [ + "6", + "&", + "¬", + "", + 0 + ], + "Digit7": [ + "7", + "/", + "", + "", + 0 + ], + "Digit8": [ + "8", + "(", + "", + "", + 0 + ], + "Digit9": [ + "9", + ")", + "", + "", + 0 + ], + "Digit0": [ + "0", + "=", + "", + "", + 0 + ], + "Minus": [ + "'", + "?", + "", + "", + 0 + ], + "Equal": [ + "¡", + "¿", + "", + "", + 0 + ], + "BracketLeft": [ + "`", + "^", + "[", + "", + 0 + ], + "BracketRight": [ + "+", + "*", + "]", + "", + 0 + ], + "Backslash": [ + "ç", + "Ç", + "}", + "", + 0 + ], + "Semicolon": [ + "ñ", + "Ñ", + "", + "", + 0 + ], + "Quote": [ + "´", + "¨", + "{", + "", + 0 + ], + "Backquote": [ + "º", + "ª", + "\\", + "", + 0 + ], + "Comma": [ + ",", + ";", + "", + "", + 0 + ], + "Period": [ + ".", + ":", + "", + "", + 0 + ], + "Slash": [ + "-", + "_", + "", + "", + 0 + ] + } + }, + { + "language": "es", + "platform": "linux", + "entries": { + "KeyA": [ + "a", + "A", + "æ", + "Æ", + 0 + ], + "KeyB": [ + "b", + "B", + "”", + "’", + 0 + ], + "KeyC": [ + "c", + "C", + "¢", + "©", + 0 + ], + "KeyD": [ + "d", + "D", + "ð", + "Ð", + 0 + ], + "KeyE": [ + "e", + "E", + "€", + "¢", + 0 + ], + "KeyF": [ + "f", + "F", + "đ", + "ª", + 0 + ], + "KeyG": [ + "g", + "G", + "ŋ", + "Ŋ", + 0 + ], + "KeyH": [ + "h", + "H", + "ħ", + "Ħ", + 0 + ], + "KeyI": [ + "i", + "I", + "→", + "ı", + 0 + ], + "KeyJ": [ + "j", + "J", + "̉", + "̛", + 0 + ], + "KeyK": [ + "k", + "K", + "ĸ", + "&", + 0 + ], + "KeyL": [ + "l", + "L", + "ł", + "Ł", + 0 + ], + "KeyM": [ + "m", + "M", + "µ", + "º", + 0 + ], + "KeyN": [ + "n", + "N", + "n", + "N", + 0 + ], + "KeyO": [ + "o", + "O", + "ø", + "Ø", + 0 + ], + "KeyP": [ + "p", + "P", + "þ", + "Þ", + 0 + ], + "KeyQ": [ + "q", + "Q", + "@", + "Ω", + 0 + ], + "KeyR": [ + "r", + "R", + "¶", + "®", + 0 + ], + "KeyS": [ + "s", + "S", + "ß", + "§", + 0 + ], + "KeyT": [ + "t", + "T", + "ŧ", + "Ŧ", + 0 + ], + "KeyU": [ + "u", + "U", + "↓", + "↑", + 0 + ], + "KeyV": [ + "v", + "V", + "“", + "‘", + 0 + ], + "KeyW": [ + "w", + "W", + "ł", + "Ł", + 0 + ], + "KeyX": [ + "x", + "X", + "»", + ">", + 0 + ], + "KeyY": [ + "y", + "Y", + "←", + "¥", + 0 + ], + "KeyZ": [ + "z", + "Z", + "«", + "<", + 0 + ], + "Digit1": [ + "1", + "!", + "|", + "¡", + 0 + ], + "Digit2": [ + "2", + "\"", + "@", + "⅛", + 0 + ], + "Digit3": [ + "3", + "·", + "#", + "£", + 0 + ], + "Digit4": [ + "4", + "$", + "~", + "$", + 0 + ], + "Digit5": [ + "5", + "%", + "½", + "⅜", + 0 + ], + "Digit6": [ + "6", + "&", + "¬", + "⅝", + 0 + ], + "Digit7": [ + "7", + "/", + "{", + "⅞", + 0 + ], + "Digit8": [ + "8", + "(", + "[", + "™", + 0 + ], + "Digit9": [ + "9", + ")", + "]", + "±", + 0 + ], + "Digit0": [ + "0", + "=", + "}", + "°", + 0 + ], + "Minus": [ + "'", + "?", + "\\", + "¿", + 0 + ], + "Equal": [ + "¡", + "¿", + "̃", + "~", + 0 + ], + "BracketLeft": [ + "̀", + "̂", + "[", + "̊", + 0 + ], + "BracketRight": [ + "+", + "*", + "]", + "̄", + 0 + ], + "Backslash": [ + "ç", + "Ç", + "}", + "̆", + 0 + ], + "Semicolon": [ + "ñ", + "Ñ", + "~", + "̋", + 0 + ], + "Quote": [ + "́", + "̈", + "{", + "{", + 0 + ], + "Backquote": [ + "º", + "ª", + "\\", + "\\", + 0 + ], + "Comma": [ + ",", + ";", + "─", + "×", + 0 + ], + "Period": [ + ".", + ":", + "·", + "÷", + 0 + ], + "Slash": [ + "-", + "_", + "̣", + "̇", + 0 + ] + } + }, + { + "language": "es", + "platform": "darwin", + "entries": { + "KeyA": [ + "a", + "A", + "å", + "Å", + 0 + ], + "KeyB": [ + "b", + "B", + "ß", + "", + 0 + ], + "KeyC": [ + "c", + "C", + "©", + " ", + 0 + ], + "KeyD": [ + "d", + "D", + "∂", + "∆", + 0 + ], + "KeyE": [ + "e", + "E", + "€", + "€", + 0 + ], + "KeyF": [ + "f", + "F", + "ƒ", + "fi", + 0 + ], + "KeyG": [ + "g", + "G", + "", + "fl", + 0 + ], + "KeyH": [ + "h", + "H", + "™", + " ", + 0 + ], + "KeyI": [ + "i", + "I", + " ", + " ", + 0 + ], + "KeyJ": [ + "j", + "J", + "¶", + "¯", + 0 + ], + "KeyK": [ + "k", + "K", + "§", + "ˇ", + 0 + ], + "KeyL": [ + "l", + "L", + " ", + "˘", + 0 + ], + "KeyM": [ + "m", + "M", + "µ", + "˚", + 0 + ], + "KeyN": [ + "n", + "N", + " ", + "˙", + 0 + ], + "KeyO": [ + "o", + "O", + "ø", + "Ø", + 0 + ], + "KeyP": [ + "p", + "P", + "π", + "∏", + 0 + ], + "KeyQ": [ + "q", + "Q", + "œ", + "Œ", + 0 + ], + "KeyR": [ + "r", + "R", + "®", + " ", + 0 + ], + "KeyS": [ + "s", + "S", + "∫", + " ", + 0 + ], + "KeyT": [ + "t", + "T", + "†", + "‡", + 0 + ], + "KeyU": [ + "u", + "U", + " ", + " ", + 0 + ], + "KeyV": [ + "v", + "V", + "√", + "◊", + 0 + ], + "KeyW": [ + "w", + "W", + "æ", + "Æ", + 0 + ], + "KeyX": [ + "x", + "X", + "∑", + "›", + 0 + ], + "KeyY": [ + "y", + "Y", + "¥", + " ", + 0 + ], + "KeyZ": [ + "z", + "Z", + "Ω", + "‹", + 0 + ], + "Digit1": [ + "1", + "!", + "|", + "ı", + 0 + ], + "Digit2": [ + "2", + "\"", + "@", + "˝", + 0 + ], + "Digit3": [ + "3", + "·", + "#", + "•", + 0 + ], + "Digit4": [ + "4", + "$", + "¢", + "£", + 0 + ], + "Digit5": [ + "5", + "%", + "∞", + "‰", + 0 + ], + "Digit6": [ + "6", + "&", + "¬", + " ", + 0 + ], + "Digit7": [ + "7", + "/", + "÷", + "⁄", + 0 + ], + "Digit8": [ + "8", + "(", + "“", + "‘", + 0 + ], + "Digit9": [ + "9", + ")", + "”", + "’", + 0 + ], + "Digit0": [ + "0", + "=", + "≠", + "≈", + 0 + ], + "Minus": [ + "'", + "?", + "´", + "¸", + 0 + ], + "Equal": [ + "¡", + "¿", + "‚", + "˛", + 0 + ], + "BracketLeft": [ + "`", + "^", + "[", + "ˆ", + 3 + ], + "BracketRight": [ + "+", + "*", + "]", + "±", + 0 + ], + "Backslash": [ + "ç", + "Ç", + "}", + "»", + 0 + ], + "Semicolon": [ + "ñ", + "Ñ", + "~", + "˜", + 4 + ], + "Quote": [ + "´", + "¨", + "{", + "«", + 3 + ], + "Backquote": [ + "<", + ">", + "≤", + "≥", + 0 + ], + "Comma": [ + ",", + ";", + "„", + "", + 0 + ], + "Period": [ + ".", + ":", + "…", + "…", + 0 + ], + "Slash": [ + "-", + "_", + "–", + "—", + 0 + ] + } + }, + { + "language": "es-latin", + "platform": "win", + "entries": { + "KeyA": [ + "a", + "A", + "", + "", + 0 + ], + "KeyB": [ + "b", + "B", + "", + "", + 0 + ], + "KeyC": [ + "c", + "C", + "", + "", + 0 + ], + "KeyD": [ + "d", + "D", + "", + "", + 0 + ], + "KeyE": [ + "e", + "E", + "", + "", + 0 + ], + "KeyF": [ + "f", + "F", + "", + "", + 0 + ], + "KeyG": [ + "g", + "G", + "", + "", + 0 + ], + "KeyH": [ + "h", + "H", + "", + "", + 0 + ], + "KeyI": [ + "i", + "I", + "", + "", + 0 + ], + "KeyJ": [ + "j", + "J", + "", + "", + 0 + ], + "KeyK": [ + "k", + "K", + "", + "", + 0 + ], + "KeyL": [ + "l", + "L", + "", + "", + 0 + ], + "KeyM": [ + "m", + "M", + "", + "", + 0 + ], + "KeyN": [ + "n", + "N", + "", + "", + 0 + ], + "KeyO": [ + "o", + "O", + "", + "", + 0 + ], + "KeyP": [ + "p", + "P", + "", + "", + 0 + ], + "KeyQ": [ + "q", + "Q", + "@", + "", + 0 + ], + "KeyR": [ + "r", + "R", + "", + "", + 0 + ], + "KeyS": [ + "s", + "S", + "", + "", + 0 + ], + "KeyT": [ + "t", + "T", + "", + "", + 0 + ], + "KeyU": [ + "u", + "U", + "", + "", + 0 + ], + "KeyV": [ + "v", + "V", + "", + "", + 0 + ], + "KeyW": [ + "w", + "W", + "", + "", + 0 + ], + "KeyX": [ + "x", + "X", + "", + "", + 0 + ], + "KeyY": [ + "y", + "Y", + "", + "", + 0 + ], + "KeyZ": [ + "z", + "Z", + "", + "", + 0 + ], + "Digit1": [ + "1", + "!", + "", + "", + 0 + ], + "Digit2": [ + "2", + "\"", + "", + "", + 0 + ], + "Digit3": [ + "3", + "#", + "", + "", + 0 + ], + "Digit4": [ + "4", + "$", + "", + "", + 0 + ], + "Digit5": [ + "5", + "%", + "", + "", + 0 + ], + "Digit6": [ + "6", + "&", + "", + "", + 0 + ], + "Digit7": [ + "7", + "/", + "", + "", + 0 + ], + "Digit8": [ + "8", + "(", + "", + "", + 0 + ], + "Digit9": [ + "9", + ")", + "", + "", + 0 + ], + "Digit0": [ + "0", + "=", + "", + "", + 0 + ], + "Minus": [ + "'", + "?", + "\\", + "", + 0 + ], + "Equal": [ + "¿", + "¡", + "", + "", + 0 + ], + "BracketLeft": [ + "´", + "¨", + "", + "", + 0 + ], + "BracketRight": [ + "+", + "*", + "~", + "", + 0 + ], + "Backslash": [ + "}", + "]", + "`", + "", + 0 + ], + "Semicolon": [ + "ñ", + "Ñ", + "", + "", + 0 + ], + "Quote": [ + "{", + "[", + "^", + "", + 0 + ], + "Backquote": [ + "|", + "°", + "¬", + "", + 0 + ], + "Comma": [ + ",", + ";", + "", + "", + 0 + ], + "Period": [ + ".", + ":", + "", + "", + 0 + ], + "Slash": [ + "-", + "_", + "", + "", + 0 + ] + } + }, + { + "language": "fr", + "platform": "win", + "entries": { + "KeyA": [ + "q", + "Q", + "", + "", + 0 + ], + "KeyB": [ + "b", + "B", + "", + "", + 0 + ], + "KeyC": [ + "c", + "C", + "", + "", + 0 + ], + "KeyD": [ + "d", + "D", + "", + "", + 0 + ], + "KeyE": [ + "e", + "E", + "€", + "", + 0 + ], + "KeyF": [ + "f", + "F", + "", + "", + 0 + ], + "KeyG": [ + "g", + "G", + "", + "", + 0 + ], + "KeyH": [ + "h", + "H", + "", + "", + 0 + ], + "KeyI": [ + "i", + "I", + "", + "", + 0 + ], + "KeyJ": [ + "j", + "J", + "", + "", + 0 + ], + "KeyK": [ + "k", + "K", + "", + "", + 0 + ], + "KeyL": [ + "l", + "L", + "", + "", + 0 + ], + "KeyM": [ + ",", + "?", + "", + "", + 0 + ], + "KeyN": [ + "n", + "N", + "", + "", + 0 + ], + "KeyO": [ + "o", + "O", + "", + "", + 0 + ], + "KeyP": [ + "p", + "P", + "", + "", + 0 + ], + "KeyQ": [ + "a", + "A", + "", + "", + 0 + ], + "KeyR": [ + "r", + "R", + "", + "", + 0 + ], + "KeyS": [ + "s", + "S", + "", + "", + 0 + ], + "KeyT": [ + "t", + "T", + "", + "", + 0 + ], + "KeyU": [ + "u", + "U", + "", + "", + 0 + ], + "KeyV": [ + "v", + "V", + "", + "", + 0 + ], + "KeyW": [ + "z", + "Z", + "", + "", + 0 + ], + "KeyX": [ + "x", + "X", + "", + "", + 0 + ], + "KeyY": [ + "y", + "Y", + "", + "", + 0 + ], + "KeyZ": [ + "w", + "W", + "", + "", + 0 + ], + "Digit1": [ + "&", + "1", + "", + "", + 0 + ], + "Digit2": [ + "é", + "2", + "~", + "", + 0 + ], + "Digit3": [ + "\"", + "3", + "#", + "", + 0 + ], + "Digit4": [ + "'", + "4", + "{", + "", + 0 + ], + "Digit5": [ + "(", + "5", + "[", + "", + 0 + ], + "Digit6": [ + "-", + "6", + "|", + "", + 0 + ], + "Digit7": [ + "è", + "7", + "`", + "", + 0 + ], + "Digit8": [ + "_", + "8", + "\\", + "", + 0 + ], + "Digit9": [ + "ç", + "9", + "^", + "", + 0 + ], + "Digit0": [ + "à", + "0", + "@", + "", + 0 + ], + "Minus": [ + ")", + "°", + "]", + "", + 0 + ], + "Equal": [ + "=", + "+", + "}", + "", + 0 + ], + "BracketLeft": [ + "^", + "¨", + "", + "", + 0 + ], + "BracketRight": [ + "$", + "£", + "¤", + "", + 0 + ], + "Backslash": [ + "*", + "µ", + "", + "", + 0 + ], + "Semicolon": [ + "m", + "M", + "", + "", + 0 + ], + "Quote": [ + "ù", + "%", + "", + "", + 0 + ], + "Backquote": [ + "²", + "", + "", + "", + 0 + ], + "Comma": [ + ";", + ".", + "", + "", + 0 + ], + "Period": [ + ":", + "/", + "", + "", + 0 + ], + "Slash": [ + "!", + "§", + "", + "", + 0 + ] + } + }, + { + "language": "fr", + "platform": "linux", + "entries": { + "KeyA": [ + "q", + "Q", + "@", + "Ω", + 0 + ], + "KeyB": [ + "b", + "B", + "”", + "’", + 0 + ], + "KeyC": [ + "c", + "C", + "¢", + "©", + 0 + ], + "KeyD": [ + "d", + "D", + "ð", + "Ð", + 0 + ], + "KeyE": [ + "e", + "E", + "€", + "¢", + 0 + ], + "KeyF": [ + "f", + "F", + "đ", + "ª", + 0 + ], + "KeyG": [ + "g", + "G", + "ŋ", + "Ŋ", + 0 + ], + "KeyH": [ + "h", + "H", + "ħ", + "Ħ", + 0 + ], + "KeyI": [ + "i", + "I", + "→", + "ı", + 0 + ], + "KeyJ": [ + "j", + "J", + "̉", + "̛", + 0 + ], + "KeyK": [ + "k", + "K", + "ĸ", + "&", + 0 + ], + "KeyL": [ + "l", + "L", + "ł", + "Ł", + 0 + ], + "KeyM": [ + ",", + "?", + "́", + "̋", + 0 + ], + "KeyN": [ + "n", + "N", + "n", + "N", + 0 + ], + "KeyO": [ + "o", + "O", + "ø", + "Ø", + 0 + ], + "KeyP": [ + "p", + "P", + "þ", + "Þ", + 0 + ], + "KeyQ": [ + "a", + "A", + "æ", + "Æ", + 0 + ], + "KeyR": [ + "r", + "R", + "¶", + "®", + 0 + ], + "KeyS": [ + "s", + "S", + "ß", + "§", + 0 + ], + "KeyT": [ + "t", + "T", + "ŧ", + "Ŧ", + 0 + ], + "KeyU": [ + "u", + "U", + "↓", + "↑", + 0 + ], + "KeyV": [ + "v", + "V", + "“", + "‘", + 0 + ], + "KeyW": [ + "z", + "Z", + "«", + "<", + 0 + ], + "KeyX": [ + "x", + "X", + "»", + ">", + 0 + ], + "KeyY": [ + "y", + "Y", + "←", + "¥", + 0 + ], + "KeyZ": [ + "w", + "W", + "ł", + "Ł", + 0 + ], + "Digit1": [ + "&", + "1", + "¹", + "¡", + 0 + ], + "Digit2": [ + "é", + "2", + "~", + "⅛", + 0 + ], + "Digit3": [ + "\"", + "3", + "#", + "£", + 0 + ], + "Digit4": [ + "'", + "4", + "{", + "$", + 0 + ], + "Digit5": [ + "(", + "5", + "[", + "⅜", + 0 + ], + "Digit6": [ + "-", + "6", + "|", + "⅝", + 0 + ], + "Digit7": [ + "è", + "7", + "`", + "⅞", + 0 + ], + "Digit8": [ + "_", + "8", + "\\", + "™", + 0 + ], + "Digit9": [ + "ç", + "9", + "^", + "±", + 0 + ], + "Digit0": [ + "à", + "0", + "@", + "°", + 0 + ], + "Minus": [ + ")", + "°", + "]", + "¿", + 0 + ], + "Equal": [ + "=", + "+", + "}", + "̨", + 0 + ], + "BracketLeft": [ + "̂", + "̈", + "̈", + "̊", + 0 + ], + "BracketRight": [ + "$", + "£", + "¤", + "̄", + 0 + ], + "Backslash": [ + "*", + "µ", + "̀", + "̆", + 0 + ], + "Semicolon": [ + "m", + "M", + "µ", + "º", + 0 + ], + "Quote": [ + "ù", + "%", + "̂", + "̌", + 0 + ], + "Backquote": [ + "²", + "~", + "¬", + "¬", + 0 + ], + "Comma": [ + ";", + ".", + "─", + "×", + 0 + ], + "Period": [ + ":", + "/", + "·", + "÷", + 0 + ], + "Slash": [ + "!", + "§", + "̣", + "̇", + 0 + ] + } + }, + { + "language": "fr", + "platform": "darwin", + "entries": { + "KeyA": [ + "q", + "Q", + "‡", + "Ω", + 0 + ], + "KeyB": [ + "b", + "B", + "ß", + "∫", + 0 + ], + "KeyC": [ + "c", + "C", + "©", + "¢", + 0 + ], + "KeyD": [ + "d", + "D", + "∂", + "∆", + 0 + ], + "KeyE": [ + "e", + "E", + "ê", + "Ê", + 0 + ], + "KeyF": [ + "f", + "F", + "ƒ", + "·", + 0 + ], + "KeyG": [ + "g", + "G", + "fi", + "fl", + 0 + ], + "KeyH": [ + "h", + "H", + "Ì", + "Î", + 0 + ], + "KeyI": [ + "i", + "I", + "î", + "ï", + 0 + ], + "KeyJ": [ + "j", + "J", + "Ï", + "Í", + 0 + ], + "KeyK": [ + "k", + "K", + "È", + "Ë", + 0 + ], + "KeyL": [ + "l", + "L", + "¬", + "|", + 0 + ], + "KeyM": [ + ",", + "?", + "∞", + "¿", + 0 + ], + "KeyN": [ + "n", + "N", + "~", + "ı", + 4 + ], + "KeyO": [ + "o", + "O", + "œ", + "Œ", + 0 + ], + "KeyP": [ + "p", + "P", + "π", + "∏", + 0 + ], + "KeyQ": [ + "a", + "A", + "æ", + "Æ", + 0 + ], + "KeyR": [ + "r", + "R", + "®", + "‚", + 0 + ], + "KeyS": [ + "s", + "S", + "Ò", + "∑", + 0 + ], + "KeyT": [ + "t", + "T", + "†", + "™", + 0 + ], + "KeyU": [ + "u", + "U", + "º", + "ª", + 0 + ], + "KeyV": [ + "v", + "V", + "◊", + "√", + 0 + ], + "KeyW": [ + "z", + "Z", + "Â", + "Å", + 0 + ], + "KeyX": [ + "x", + "X", + "≈", + "⁄", + 0 + ], + "KeyY": [ + "y", + "Y", + "Ú", + "Ÿ", + 0 + ], + "KeyZ": [ + "w", + "W", + "‹", + "›", + 0 + ], + "Digit1": [ + "&", + "1", + "", + "´", + 8 + ], + "Digit2": [ + "é", + "2", + "ë", + "„", + 0 + ], + "Digit3": [ + "\"", + "3", + "“", + "”", + 0 + ], + "Digit4": [ + "'", + "4", + "‘", + "’", + 0 + ], + "Digit5": [ + "(", + "5", + "{", + "[", + 0 + ], + "Digit6": [ + "§", + "6", + "¶", + "å", + 0 + ], + "Digit7": [ + "è", + "7", + "«", + "»", + 0 + ], + "Digit8": [ + "!", + "8", + "¡", + "Û", + 0 + ], + "Digit9": [ + "ç", + "9", + "Ç", + "Á", + 0 + ], + "Digit0": [ + "à", + "0", + "ø", + "Ø", + 0 + ], + "Minus": [ + ")", + "°", + "}", + "]", + 0 + ], + "Equal": [ + "-", + "_", + "—", + "–", + 0 + ], + "BracketLeft": [ + "^", + "¨", + "ô", + "Ô", + 3 + ], + "BracketRight": [ + "$", + "*", + "€", + "¥", + 0 + ], + "Backslash": [ + "`", + "£", + "@", + "#", + 1 + ], + "Semicolon": [ + "m", + "M", + "µ", + "Ó", + 0 + ], + "Quote": [ + "ù", + "%", + "Ù", + "‰", + 0 + ], + "Backquote": [ + "<", + ">", + "≤", + "≥", + 0 + ], + "Comma": [ + ";", + ".", + "…", + "•", + 0 + ], + "Period": [ + ":", + "/", + "÷", + "\\", + 0 + ], + "Slash": [ + "=", + "+", + "≠", + "±", + 0 + ] + } + }, + { + "language": "hu", + "platform": "win", + "entries": { + "KeyA": [ + "a", + "A", + "ä", + "", + 0 + ], + "KeyB": [ + "b", + "B", + "{", + "", + 0 + ], + "KeyC": [ + "c", + "C", + "&", + "", + 0 + ], + "KeyD": [ + "d", + "D", + "Đ", + "", + 0 + ], + "KeyE": [ + "e", + "E", + "Ä", + "", + 0 + ], + "KeyF": [ + "f", + "F", + "[", + "", + 0 + ], + "KeyG": [ + "g", + "G", + "]", + "", + 0 + ], + "KeyH": [ + "h", + "H", + "", + "", + 0 + ], + "KeyI": [ + "i", + "I", + "Í", + "", + 0 + ], + "KeyJ": [ + "j", + "J", + "í", + "", + 0 + ], + "KeyK": [ + "k", + "K", + "ł", + "", + 0 + ], + "KeyL": [ + "l", + "L", + "Ł", + "", + 0 + ], + "KeyM": [ + "m", + "M", + "<", + "", + 0 + ], + "KeyN": [ + "n", + "N", + "}", + "", + 0 + ], + "KeyO": [ + "o", + "O", + "", + "", + 0 + ], + "KeyP": [ + "p", + "P", + "", + "", + 0 + ], + "KeyQ": [ + "q", + "Q", + "\\", + "", + 0 + ], + "KeyR": [ + "r", + "R", + "", + "", + 0 + ], + "KeyS": [ + "s", + "S", + "đ", + "", + 0 + ], + "KeyT": [ + "t", + "T", + "", + "", + 0 + ], + "KeyU": [ + "u", + "U", + "€", + "", + 0 + ], + "KeyV": [ + "v", + "V", + "@", + "", + 0 + ], + "KeyW": [ + "w", + "W", + "|", + "", + 0 + ], + "KeyX": [ + "x", + "X", + "#", + "", + 0 + ], + "KeyY": [ + "z", + "Z", + "", + "", + 0 + ], + "KeyZ": [ + "y", + "Y", + ">", + "", + 0 + ], + "Digit1": [ + "1", + "'", + "~", + "", + 0 + ], + "Digit2": [ + "2", + "\"", + "ˇ", + "", + 0 + ], + "Digit3": [ + "3", + "+", + "^", + "", + 0 + ], + "Digit4": [ + "4", + "!", + "˘", + "", + 0 + ], + "Digit5": [ + "5", + "%", + "°", + "", + 0 + ], + "Digit6": [ + "6", + "/", + "˛", + "", + 0 + ], + "Digit7": [ + "7", + "=", + "`", + "", + 0 + ], + "Digit8": [ + "8", + "(", + "˙", + "", + 0 + ], + "Digit9": [ + "9", + ")", + "´", + "", + 0 + ], + "Digit0": [ + "ö", + "Ö", + "˝", + "", + 0 + ], + "Minus": [ + "ü", + "Ü", + "¨", + "", + 0 + ], + "Equal": [ + "ó", + "Ó", + "¸", + "", + 0 + ], + "BracketLeft": [ + "ő", + "Ő", + "÷", + "", + 0 + ], + "BracketRight": [ + "ú", + "Ú", + "×", + "", + 0 + ], + "Backslash": [ + "ű", + "Ű", + "¤", + "", + 0 + ], + "Semicolon": [ + "é", + "É", + "$", + "", + 0 + ], + "Quote": [ + "á", + "Á", + "ß", + "", + 0 + ], + "Backquote": [ + "0", + "§", + "", + "", + 0 + ], + "Comma": [ + ",", + "?", + ";", + "", + 0 + ], + "Period": [ + ".", + ":", + ">", + "", + 0 + ], + "Slash": [ + "-", + "_", + "*", + "", + 0 + ] + } + }, + { + "language": "it", + "platform": "win", + "entries": { + "KeyA": [ + "a", + "A", + "", + "", + 0 + ], + "KeyB": [ + "b", + "B", + "", + "", + 0 + ], + "KeyC": [ + "c", + "C", + "", + "", + 0 + ], + "KeyD": [ + "d", + "D", + "", + "", + 0 + ], + "KeyE": [ + "e", + "E", + "€", + "", + 0 + ], + "KeyF": [ + "f", + "F", + "", + "", + 0 + ], + "KeyG": [ + "g", + "G", + "", + "", + 0 + ], + "KeyH": [ + "h", + "H", + "", + "", + 0 + ], + "KeyI": [ + "i", + "I", + "", + "", + 0 + ], + "KeyJ": [ + "j", + "J", + "", + "", + 0 + ], + "KeyK": [ + "k", + "K", + "", + "", + 0 + ], + "KeyL": [ + "l", + "L", + "", + "", + 0 + ], + "KeyM": [ + "m", + "M", + "", + "", + 0 + ], + "KeyN": [ + "n", + "N", + "", + "", + 0 + ], + "KeyO": [ + "o", + "O", + "", + "", + 0 + ], + "KeyP": [ + "p", + "P", + "", + "", + 0 + ], + "KeyQ": [ + "q", + "Q", + "", + "", + 0 + ], + "KeyR": [ + "r", + "R", + "", + "", + 0 + ], + "KeyS": [ + "s", + "S", + "", + "", + 0 + ], + "KeyT": [ + "t", + "T", + "", + "", + 0 + ], + "KeyU": [ + "u", + "U", + "", + "", + 0 + ], + "KeyV": [ + "v", + "V", + "", + "", + 0 + ], + "KeyW": [ + "w", + "W", + "", + "", + 0 + ], + "KeyX": [ + "x", + "X", + "", + "", + 0 + ], + "KeyY": [ + "y", + "Y", + "", + "", + 0 + ], + "KeyZ": [ + "z", + "Z", + "", + "", + 0 + ], + "Digit1": [ + "1", + "!", + "", + "", + 0 + ], + "Digit2": [ + "2", + "\"", + "", + "", + 0 + ], + "Digit3": [ + "3", + "£", + "", + "", + 0 + ], + "Digit4": [ + "4", + "$", + "", + "", + 0 + ], + "Digit5": [ + "5", + "%", + "€", + "", + 0 + ], + "Digit6": [ + "6", + "&", + "", + "", + 0 + ], + "Digit7": [ + "7", + "/", + "", + "", + 0 + ], + "Digit8": [ + "8", + "(", + "", + "", + 0 + ], + "Digit9": [ + "9", + ")", + "", + "", + 0 + ], + "Digit0": [ + "0", + "=", + "", + "", + 0 + ], + "Minus": [ + "'", + "?", + "", + "", + 0 + ], + "Equal": [ + "ì", + "^", + "", + "", + 0 + ], + "BracketLeft": [ + "è", + "é", + "[", + "{", + 0 + ], + "BracketRight": [ + "+", + "*", + "]", + "}", + 0 + ], + "Backslash": [ + "ù", + "§", + "", + "", + 0 + ], + "Semicolon": [ + "ò", + "ç", + "@", + "", + 0 + ], + "Quote": [ + "à", + "°", + "#", + "", + 0 + ], + "Backquote": [ + "\\", + "|", + "", + "", + 0 + ], + "Comma": [ + ",", + ";", + "", + "", + 0 + ], + "Period": [ + ".", + ":", + "", + "", + 0 + ], + "Slash": [ + "-", + "_", + "", + "", + 0 + ] + } + }, + { + "language": "it", + "platform": "darwin", + "entries": { + "KeyA": [ + "a", + "A", + "å", + "Å", + 0 + ], + "KeyB": [ + "b", + "B", + "∫", + "Í", + 0 + ], + "KeyC": [ + "c", + "C", + "©", + "Á", + 0 + ], + "KeyD": [ + "d", + "D", + "∂", + "˘", + 0 + ], + "KeyE": [ + "e", + "E", + "€", + "È", + 0 + ], + "KeyF": [ + "f", + "F", + "ƒ", + "˙", + 0 + ], + "KeyG": [ + "g", + "G", + "∞", + "˚", + 0 + ], + "KeyH": [ + "h", + "H", + "∆", + "¸", + 0 + ], + "KeyI": [ + "i", + "I", + "œ", + "Œ", + 0 + ], + "KeyJ": [ + "j", + "J", + "ª", + "˝", + 0 + ], + "KeyK": [ + "k", + "K", + "º", + "˛", + 0 + ], + "KeyL": [ + "l", + "L", + "¬", + "ˇ", + 0 + ], + "KeyM": [ + "m", + "M", + "µ", + "Ú", + 0 + ], + "KeyN": [ + "n", + "N", + "˜", + "Ó", + 4 + ], + "KeyO": [ + "o", + "O", + "ø", + "Ø", + 0 + ], + "KeyP": [ + "p", + "P", + "π", + "∏", + 0 + ], + "KeyQ": [ + "q", + "Q", + "„", + "‚", + 0 + ], + "KeyR": [ + "r", + "R", + "®", + "Ì", + 0 + ], + "KeyS": [ + "s", + "S", + "ß", + "¯", + 0 + ], + "KeyT": [ + "t", + "T", + "™", + "Ò", + 0 + ], + "KeyU": [ + "u", + "U", + "¨", + "Ù", + 4 + ], + "KeyV": [ + "v", + "V", + "√", + "É", + 0 + ], + "KeyW": [ + "w", + "W", + "Ω", + "À", + 0 + ], + "KeyX": [ + "x", + "X", + "†", + "‡", + 0 + ], + "KeyY": [ + "y", + "Y", + "æ", + "Æ", + 0 + ], + "KeyZ": [ + "z", + "Z", + "∑", + " ", + 0 + ], + "Digit1": [ + "1", + "!", + "«", + "»", + 0 + ], + "Digit2": [ + "2", + "\"", + "“", + "”", + 0 + ], + "Digit3": [ + "3", + "£", + "‘", + "’", + 0 + ], + "Digit4": [ + "4", + "$", + "¥", + "¢", + 0 + ], + "Digit5": [ + "5", + "%", + "~", + "‰", + 0 + ], + "Digit6": [ + "6", + "&", + "‹", + "›", + 0 + ], + "Digit7": [ + "7", + "/", + "÷", + "⁄", + 0 + ], + "Digit8": [ + "8", + "(", + "´", + "", + 4 + ], + "Digit9": [ + "9", + ")", + "`", + " ", + 4 + ], + "Digit0": [ + "0", + "=", + "≠", + "≈", + 0 + ], + "Minus": [ + "'", + "?", + "¡", + "¿", + 0 + ], + "Equal": [ + "ì", + "^", + "ˆ", + "±", + 4 + ], + "BracketLeft": [ + "è", + "é", + "[", + "{", + 0 + ], + "BracketRight": [ + "+", + "*", + "]", + "}", + 0 + ], + "Backslash": [ + "ù", + "§", + "¶", + "◊", + 0 + ], + "Semicolon": [ + "ò", + "ç", + "@", + "Ç", + 0 + ], + "Quote": [ + "à", + "°", + "#", + "∞", + 0 + ], + "Backquote": [ + "<", + ">", + "≤", + "≥", + 0 + ], + "Comma": [ + ",", + ";", + "…", + " ", + 0 + ], + "Period": [ + ".", + ":", + "•", + "·", + 0 + ], + "Slash": [ + "-", + "_", + "–", + "—", + 0 + ] + } + }, + { + "language": "jp", + "platform": "darwin", + "entries": { + "KeyA": [ + "a", + "A", + "å", + "Å", + 0 + ], + "KeyB": [ + "b", + "B", + "∫", + "ı", + 0 + ], + "KeyC": [ + "c", + "C", + "ç", + "Ç", + 0 + ], + "KeyD": [ + "d", + "D", + "∂", + "Î", + 0 + ], + "KeyE": [ + "e", + "E", + "´", + "´", + 4 + ], + "KeyF": [ + "f", + "F", + "ƒ", + "Ï", + 0 + ], + "KeyG": [ + "g", + "G", + "©", + "˝", + 0 + ], + "KeyH": [ + "h", + "H", + "˙", + "Ó", + 0 + ], + "KeyI": [ + "i", + "I", + "ˆ", + "ˆ", + 4 + ], + "KeyJ": [ + "j", + "J", + "∆", + "Ô", + 0 + ], + "KeyK": [ + "k", + "K", + "˚", + "", + 0 + ], + "KeyL": [ + "l", + "L", + "¬", + "Ò", + 0 + ], + "KeyM": [ + "m", + "M", + "µ", + "Â", + 0 + ], + "KeyN": [ + "n", + "N", + "˜", + "˜", + 4 + ], + "KeyO": [ + "o", + "O", + "ø", + "Ø", + 0 + ], + "KeyP": [ + "p", + "P", + "π", + "∏", + 0 + ], + "KeyQ": [ + "q", + "Q", + "œ", + "Œ", + 0 + ], + "KeyR": [ + "r", + "R", + "®", + "‰", + 0 + ], + "KeyS": [ + "s", + "S", + "ß", + "Í", + 0 + ], + "KeyT": [ + "t", + "T", + "†", + "ˇ", + 0 + ], + "KeyU": [ + "u", + "U", + "¨", + "¨", + 4 + ], + "KeyV": [ + "v", + "V", + "√", + "◊", + 0 + ], + "KeyW": [ + "w", + "W", + "∑", + "„", + 0 + ], + "KeyX": [ + "x", + "X", + "≈", + "˛", + 0 + ], + "KeyY": [ + "y", + "Y", + "¥", + "Á", + 0 + ], + "KeyZ": [ + "z", + "Z", + "Ω", + "¸", + 0 + ], + "Digit1": [ + "1", + "!", + "¡", + "⁄", + 0 + ], + "Digit2": [ + "2", + "@", + "™", + "€", + 0 + ], + "Digit3": [ + "3", + "#", + "£", + "‹", + 0 + ], + "Digit4": [ + "4", + "$", + "¢", + "›", + 0 + ], + "Digit5": [ + "5", + "%", + "∞", + "fi", + 0 + ], + "Digit6": [ + "6", + "^", + "§", + "fl", + 0 + ], + "Digit7": [ + "7", + "&", + "¶", + "‡", + 0 + ], + "Digit8": [ + "8", + "*", + "•", + "°", + 0 + ], + "Digit9": [ + "9", + "(", + "ª", + "·", + 0 + ], + "Digit0": [ + "0", + ")", + "º", + "‚", + 0 + ], + "Minus": [ + "-", + "_", + "–", + "—", + 0 + ], + "Equal": [ + "=", + "+", + "≠", + "±", + 0 + ], + "BracketLeft": [ + "[", + "{", + "“", + "”", + 0 + ], + "BracketRight": [ + "]", + "}", + "‘", + "’", + 0 + ], + "Backslash": [ + "\\", + "|", + "«", + "»", + 0 + ], + "Semicolon": [ + ";", + ":", + "…", + "Ú", + 0 + ], + "Quote": [ + "'", + "\"", + "æ", + "Æ", + 0 + ], + "Backquote": [ + "`", + "~", + "`", + "`", + 4 + ], + "Comma": [ + ",", + "<", + "≤", + "¯", + 0 + ], + "Period": [ + ".", + ">", + "≥", + "˘", + 0 + ], + "Slash": [ + "/", + "?", + "÷", + "¿", + 0 + ] + } + }, + { + "language": "jp-roman", + "platform": "darwin", + "entries": { + "KeyA": [ + "a", + "A", + "¯", + "̄", + 4 + ], + "KeyB": [ + "b", + "B", + "˘", + "̆", + 4 + ], + "KeyC": [ + "c", + "C", + "¸", + "̧", + 4 + ], + "KeyD": [ + "d", + "D", + "ð", + "Ð", + 0 + ], + "KeyE": [ + "e", + "E", + "´", + "́", + 4 + ], + "KeyF": [ + "f", + "F", + "ƒ", + "", + 0 + ], + "KeyG": [ + "g", + "G", + "©", + "‸", + 8 + ], + "KeyH": [ + "h", + "H", + "ˍ", + "̱", + 4 + ], + "KeyI": [ + "i", + "I", + "ʼ", + "̛", + 4 + ], + "KeyJ": [ + "j", + "J", + "˝", + "̋", + 4 + ], + "KeyK": [ + "k", + "K", + "˚", + "̊", + 4 + ], + "KeyL": [ + "l", + "L", + "-", + "̵", + 4 + ], + "KeyM": [ + "m", + "M", + "˛", + "̨", + 4 + ], + "KeyN": [ + "n", + "N", + "˜", + "̃", + 4 + ], + "KeyO": [ + "o", + "O", + "ø", + "Ø", + 0 + ], + "KeyP": [ + "p", + "P", + ",", + "̦", + 4 + ], + "KeyQ": [ + "q", + "Q", + "œ", + "Œ", + 0 + ], + "KeyR": [ + "r", + "R", + "®", + "‰", + 0 + ], + "KeyS": [ + "s", + "S", + "ß", + "", + 0 + ], + "KeyT": [ + "t", + "T", + "þ", + "Þ", + 0 + ], + "KeyU": [ + "u", + "U", + "¨", + "̈", + 4 + ], + "KeyV": [ + "v", + "V", + "ˇ", + "̌", + 4 + ], + "KeyW": [ + "w", + "W", + "˙", + "̇", + 4 + ], + "KeyX": [ + "x", + "X", + ".", + "̣", + 4 + ], + "KeyY": [ + "y", + "Y", + "¥", + "", + 0 + ], + "KeyZ": [ + "z", + "Z", + "ˀ", + "̉", + 4 + ], + "Digit1": [ + "1", + "!", + "¡", + "⁄", + 0 + ], + "Digit2": [ + "2", + "@", + "™", + "€", + 0 + ], + "Digit3": [ + "3", + "#", + "£", + "‹", + 0 + ], + "Digit4": [ + "4", + "$", + "¢", + "›", + 0 + ], + "Digit5": [ + "5", + "%", + "§", + "†", + 0 + ], + "Digit6": [ + "6", + "^", + "ˆ", + "̂", + 4 + ], + "Digit7": [ + "7", + "&", + "¶", + "‡", + 0 + ], + "Digit8": [ + "8", + "*", + "•", + "°", + 0 + ], + "Digit9": [ + "9", + "(", + "ª", + "·", + 0 + ], + "Digit0": [ + "0", + ")", + "º", + "‚", + 0 + ], + "Minus": [ + "-", + "_", + "–", + "—", + 0 + ], + "Equal": [ + "=", + "+", + "≠", + "±", + 0 + ], + "BracketLeft": [ + "[", + "{", + "“", + "”", + 0 + ], + "BracketRight": [ + "]", + "}", + "‘", + "’", + 0 + ], + "Backslash": [ + "\\", + "|", + "«", + "»", + 0 + ], + "Semicolon": [ + ";", + ":", + "…", + "№", + 8 + ], + "Quote": [ + "'", + "\"", + "æ", + "Æ", + 0 + ], + "Backquote": [ + "`", + "~", + "`", + "̀", + 4 + ], + "Comma": [ + ",", + "<", + "≤", + "„", + 0 + ], + "Period": [ + ".", + ">", + "≥", + "ʔ", + 8 + ], + "Slash": [ + "/", + "?", + "÷", + "¿", + 0 + ] + } + }, + { + "language": "ko", + "platform": "darwin", + "entries": { + "KeyA": [ + "ㅁ", + "ㅁ", + "a", + "A", + 0 + ], + "KeyB": [ + "ㅠ", + "ㅠ", + "b", + "B", + 0 + ], + "KeyC": [ + "ㅊ", + "ㅊ", + "c", + "C", + 0 + ], + "KeyD": [ + "ㅇ", + "ㅇ", + "d", + "D", + 0 + ], + "KeyE": [ + "ㄷ", + "ㄸ", + "e", + "E", + 0 + ], + "KeyF": [ + "ㄹ", + "ㄹ", + "f", + "F", + 0 + ], + "KeyG": [ + "ㅎ", + "ㅎ", + "g", + "G", + 0 + ], + "KeyH": [ + "ㅗ", + "ㅗ", + "h", + "H", + 0 + ], + "KeyI": [ + "ㅑ", + "ㅑ", + "i", + "I", + 0 + ], + "KeyJ": [ + "ㅓ", + "ㅓ", + "j", + "J", + 0 + ], + "KeyK": [ + "ㅏ", + "ㅏ", + "k", + "K", + 0 + ], + "KeyL": [ + "ㅣ", + "ㅣ", + "l", + "L", + 0 + ], + "KeyM": [ + "ㅡ", + "ㅡ", + "m", + "M", + 0 + ], + "KeyN": [ + "ㅜ", + "ㅜ", + "n", + "N", + 0 + ], + "KeyO": [ + "ㅐ", + "ㅒ", + "o", + "O", + 0 + ], + "KeyP": [ + "ㅔ", + "ㅖ", + "p", + "P", + 0 + ], + "KeyQ": [ + "ㅂ", + "ㅃ", + "q", + "Q", + 0 + ], + "KeyR": [ + "ㄱ", + "ㄲ", + "r", + "R", + 0 + ], + "KeyS": [ + "ㄴ", + "ㄴ", + "s", + "S", + 0 + ], + "KeyT": [ + "ㅅ", + "ㅆ", + "t", + "T", + 0 + ], + "KeyU": [ + "ㅕ", + "ㅕ", + "u", + "U", + 0 + ], + "KeyV": [ + "ㅍ", + "ㅍ", + "v", + "V", + 0 + ], + "KeyW": [ + "ㅈ", + "ㅉ", + "w", + "W", + 0 + ], + "KeyX": [ + "ㅌ", + "ㅌ", + "x", + "X", + 0 + ], + "KeyY": [ + "ㅛ", + "ㅛ", + "y", + "Y", + 0 + ], + "KeyZ": [ + "ㅋ", + "ㅋ", + "z", + "Z", + 0 + ], + "Digit1": [ + "1", + "!", + "1", + "!", + 0 + ], + "Digit2": [ + "2", + "@", + "2", + "@", + 0 + ], + "Digit3": [ + "3", + "#", + "3", + "#", + 0 + ], + "Digit4": [ + "4", + "$", + "4", + "$", + 0 + ], + "Digit5": [ + "5", + "%", + "5", + "%", + 0 + ], + "Digit6": [ + "6", + "^", + "6", + "^", + 0 + ], + "Digit7": [ + "7", + "&", + "7", + "&", + 0 + ], + "Digit8": [ + "8", + "*", + "8", + "*", + 0 + ], + "Digit9": [ + "9", + "(", + "9", + "(", + 0 + ], + "Digit0": [ + "0", + ")", + "0", + ")", + 0 + ], + "Minus": [ + "-", + "_", + "-", + "_", + 0 + ], + "Equal": [ + "=", + "+", + "=", + "+", + 0 + ], + "BracketLeft": [ + "[", + "{", + "[", + "{", + 0 + ], + "BracketRight": [ + "]", + "}", + "]", + "}", + 0 + ], + "Backslash": [ + "\\", + "|", + "\\", + "|", + 0 + ], + "Semicolon": [ + ";", + ":", + ";", + ":", + 0 + ], + "Quote": [ + "'", + "\"", + "'", + "\"", + 0 + ], + "Backquote": [ + "₩", + "~", + "`", + "~", + 0 + ], + "Comma": [ + ",", + "<", + ",", + "<", + 0 + ], + "Period": [ + ".", + ">", + ".", + ">", + 0 + ], + "Slash": [ + "/", + "?", + "/", + "?", + 0 + ] + } + }, + { + "language": "no", + "platform": "win", + "entries": { + "KeyA": [ + "a", + "A", + "", + "", + 0 + ], + "KeyB": [ + "b", + "B", + "", + "", + 0 + ], + "KeyC": [ + "c", + "C", + "", + "", + 0 + ], + "KeyD": [ + "d", + "D", + "", + "", + 0 + ], + "KeyE": [ + "e", + "E", + "€", + "", + 0 + ], + "KeyF": [ + "f", + "F", + "", + "", + 0 + ], + "KeyG": [ + "g", + "G", + "", + "", + 0 + ], + "KeyH": [ + "h", + "H", + "", + "", + 0 + ], + "KeyI": [ + "i", + "I", + "", + "", + 0 + ], + "KeyJ": [ + "j", + "J", + "", + "", + 0 + ], + "KeyK": [ + "k", + "K", + "", + "", + 0 + ], + "KeyL": [ + "l", + "L", + "", + "", + 0 + ], + "KeyM": [ + "m", + "M", + "µ", + "", + 0 + ], + "KeyN": [ + "n", + "N", + "", + "", + 0 + ], + "KeyO": [ + "o", + "O", + "", + "", + 0 + ], + "KeyP": [ + "p", + "P", + "", + "", + 0 + ], + "KeyQ": [ + "q", + "Q", + "", + "", + 0 + ], + "KeyR": [ + "r", + "R", + "", + "", + 0 + ], + "KeyS": [ + "s", + "S", + "", + "", + 0 + ], + "KeyT": [ + "t", + "T", + "", + "", + 0 + ], + "KeyU": [ + "u", + "U", + "", + "", + 0 + ], + "KeyV": [ + "v", + "V", + "", + "", + 0 + ], + "KeyW": [ + "w", + "W", + "", + "", + 0 + ], + "KeyX": [ + "x", + "X", + "", + "", + 0 + ], + "KeyY": [ + "y", + "Y", + "", + "", + 0 + ], + "KeyZ": [ + "z", + "Z", + "", + "", + 0 + ], + "Digit1": [ + "1", + "!", + "", + "", + 0 + ], + "Digit2": [ + "2", + "\"", + "@", + "", + 0 + ], + "Digit3": [ + "3", + "#", + "£", + "", + 0 + ], + "Digit4": [ + "4", + "¤", + "$", + "", + 0 + ], + "Digit5": [ + "5", + "%", + "€", + "", + 0 + ], + "Digit6": [ + "6", + "&", + "", + "", + 0 + ], + "Digit7": [ + "7", + "/", + "{", + "", + 0 + ], + "Digit8": [ + "8", + "(", + "[", + "", + 0 + ], + "Digit9": [ + "9", + ")", + "]", + "", + 0 + ], + "Digit0": [ + "0", + "=", + "}", + "", + 0 + ], + "Minus": [ + "+", + "?", + "", + "", + 0 + ], + "Equal": [ + "\\", + "`", + "´", + "", + 0 + ], + "BracketLeft": [ + "å", + "Å", + "", + "", + 0 + ], + "BracketRight": [ + "¨", + "^", + "~", + "", + 0 + ], + "Backslash": [ + "'", + "*", + "", + "", + 0 + ], + "Semicolon": [ + "ø", + "Ø", + "", + "", + 0 + ], + "Quote": [ + "æ", + "Æ", + "", + "", + 0 + ], + "Backquote": [ + "|", + "§", + "", + "", + 0 + ], + "Comma": [ + ",", + ";", + "", + "", + 0 + ], + "Period": [ + ".", + ":", + "", + "", + 0 + ], + "Slash": [ + "-", + "_", + "", + "", + 0 + ] + } + }, + { + "language": "pl", + "platform": "win", + "entries": { + "KeyA": [ + "a", + "A", + "ą", + "Ą", + 0 + ], + "KeyB": [ + "b", + "B", + "", + "", + 0 + ], + "KeyC": [ + "c", + "C", + "ć", + "Ć", + 0 + ], + "KeyD": [ + "d", + "D", + "", + "", + 0 + ], + "KeyE": [ + "e", + "E", + "ę", + "Ę", + 0 + ], + "KeyF": [ + "f", + "F", + "", + "", + 0 + ], + "KeyG": [ + "g", + "G", + "", + "", + 0 + ], + "KeyH": [ + "h", + "H", + "", + "", + 0 + ], + "KeyI": [ + "i", + "I", + "", + "", + 0 + ], + "KeyJ": [ + "j", + "J", + "", + "", + 0 + ], + "KeyK": [ + "k", + "K", + "", + "", + 0 + ], + "KeyL": [ + "l", + "L", + "ł", + "Ł", + 0 + ], + "KeyM": [ + "m", + "M", + "", + "", + 0 + ], + "KeyN": [ + "n", + "N", + "ń", + "Ń", + 0 + ], + "KeyO": [ + "o", + "O", + "ó", + "Ó", + 0 + ], + "KeyP": [ + "p", + "P", + "", + "", + 0 + ], + "KeyQ": [ + "q", + "Q", + "", + "", + 0 + ], + "KeyR": [ + "r", + "R", + "", + "", + 0 + ], + "KeyS": [ + "s", + "S", + "ś", + "Ś", + 0 + ], + "KeyT": [ + "t", + "T", + "", + "", + 0 + ], + "KeyU": [ + "u", + "U", + "€", + "", + 0 + ], + "KeyV": [ + "v", + "V", + "", + "", + 0 + ], + "KeyW": [ + "w", + "W", + "", + "", + 0 + ], + "KeyX": [ + "x", + "X", + "ź", + "Ź", + 0 + ], + "KeyY": [ + "y", + "Y", + "", + "", + 0 + ], + "KeyZ": [ + "z", + "Z", + "ż", + "Ż", + 0 + ], + "Digit1": [ + "1", + "!", + "", + "", + 0 + ], + "Digit2": [ + "2", + "@", + "", + "", + 0 + ], + "Digit3": [ + "3", + "#", + "", + "", + 0 + ], + "Digit4": [ + "4", + "$", + "", + "", + 0 + ], + "Digit5": [ + "5", + "%", + "", + "", + 0 + ], + "Digit6": [ + "6", + "^", + "", + "", + 0 + ], + "Digit7": [ + "7", + "&", + "", + "", + 0 + ], + "Digit8": [ + "8", + "*", + "", + "", + 0 + ], + "Digit9": [ + "9", + "(", + "", + "", + 0 + ], + "Digit0": [ + "0", + ")", + "", + "", + 0 + ], + "Minus": [ + "-", + "_", + "", + "", + 0 + ], + "Equal": [ + "=", + "+", + "", + "", + 0 + ], + "BracketLeft": [ + "[", + "{", + "", + "", + 0 + ], + "BracketRight": [ + "]", + "}", + "", + "", + 0 + ], + "Backslash": [ + "\\", + "|", + "", + "", + 0 + ], + "Semicolon": [ + ";", + ":", + "", + "", + 0 + ], + "Quote": [ + "'", + "\"", + "", + "", + 0 + ], + "Backquote": [ + "`", + "~", + "", + "", + 0 + ], + "Comma": [ + ",", + "<", + "", + "", + 0 + ], + "Period": [ + ".", + ">", + "", + "", + 0 + ], + "Slash": [ + "/", + "?", + "", + "", + 0 + ] + } + }, + { + "language": "pl", + "platform": "darwin", + "entries": { + "KeyA": [ + "a", + "A", + "ą", + "Ą", + 0 + ], + "KeyB": [ + "b", + "B", + "ļ", + "ű", + 0 + ], + "KeyC": [ + "c", + "C", + "ć", + "Ć", + 0 + ], + "KeyD": [ + "d", + "D", + "∂", + "Ž", + 0 + ], + "KeyE": [ + "e", + "E", + "ę", + "Ę", + 0 + ], + "KeyF": [ + "f", + "F", + "ń", + "ž", + 0 + ], + "KeyG": [ + "g", + "G", + "©", + "Ū", + 0 + ], + "KeyH": [ + "h", + "H", + "ķ", + "Ó", + 0 + ], + "KeyI": [ + "i", + "I", + "^", + "ť", + 4 + ], + "KeyJ": [ + "j", + "J", + "∆", + "Ô", + 0 + ], + "KeyK": [ + "k", + "K", + "Ż", + "ū", + 0 + ], + "KeyL": [ + "l", + "L", + "ł", + "Ł", + 0 + ], + "KeyM": [ + "m", + "M", + "Ķ", + "ų", + 0 + ], + "KeyN": [ + "n", + "N", + "ń", + "Ń", + 0 + ], + "KeyO": [ + "o", + "O", + "ó", + "Ó", + 0 + ], + "KeyP": [ + "p", + "P", + "Ļ", + "ł", + 0 + ], + "KeyQ": [ + "q", + "Q", + "Ō", + "ő", + 0 + ], + "KeyR": [ + "r", + "R", + "®", + "£", + 0 + ], + "KeyS": [ + "s", + "S", + "ś", + "Ś", + 0 + ], + "KeyT": [ + "t", + "T", + "†", + "ś", + 0 + ], + "KeyU": [ + "u", + "U", + "¨", + "Ť", + 4 + ], + "KeyV": [ + "v", + "V", + "√", + "◊", + 0 + ], + "KeyW": [ + "w", + "W", + "∑", + "„", + 0 + ], + "KeyX": [ + "x", + "X", + "ź", + "Ź", + 0 + ], + "KeyY": [ + "y", + "Y", + "ī", + "Á", + 0 + ], + "KeyZ": [ + "z", + "Z", + "ż", + "Ż", + 0 + ], + "Digit1": [ + "1", + "!", + "Ń", + "ŕ", + 0 + ], + "Digit2": [ + "2", + "@", + "™", + "Ř", + 0 + ], + "Digit3": [ + "3", + "#", + "€", + "‹", + 0 + ], + "Digit4": [ + "4", + "$", + "ß", + "›", + 0 + ], + "Digit5": [ + "5", + "%", + "į", + "ř", + 0 + ], + "Digit6": [ + "6", + "^", + "§", + "Ŗ", + 0 + ], + "Digit7": [ + "7", + "&", + "¶", + "ŗ", + 0 + ], + "Digit8": [ + "8", + "*", + "•", + "°", + 0 + ], + "Digit9": [ + "9", + "(", + "Ľ", + "Š", + 0 + ], + "Digit0": [ + "0", + ")", + "ľ", + "‚", + 0 + ], + "Minus": [ + "-", + "_", + "–", + "—", + 0 + ], + "Equal": [ + "=", + "+", + "≠", + "Ī", + 0 + ], + "BracketLeft": [ + "[", + "{", + "„", + "”", + 0 + ], + "BracketRight": [ + "]", + "}", + "‚", + "’", + 0 + ], + "Backslash": [ + "\\", + "|", + "«", + "»", + 0 + ], + "Semicolon": [ + ";", + ":", + "…", + "Ú", + 0 + ], + "Quote": [ + "'", + "\"", + "ĺ", + "ģ", + 0 + ], + "Backquote": [ + "`", + "~", + "`", + "Ŕ", + 4 + ], + "Comma": [ + ",", + "<", + "≤", + "Ý", + 0 + ], + "Period": [ + ".", + ">", + "≥", + "ý", + 0 + ], + "Slash": [ + "/", + "?", + "÷", + "ņ", + 0 + ] + } + }, + { + "language": "pt", + "platform": "win", + "entries": { + "KeyA": [ + "a", + "A", + "", + "", + 0 + ], + "KeyB": [ + "b", + "B", + "", + "", + 0 + ], + "KeyC": [ + "c", + "C", + "", + "", + 0 + ], + "KeyD": [ + "d", + "D", + "", + "", + 0 + ], + "KeyE": [ + "e", + "E", + "€", + "", + 0 + ], + "KeyF": [ + "f", + "F", + "", + "", + 0 + ], + "KeyG": [ + "g", + "G", + "", + "", + 0 + ], + "KeyH": [ + "h", + "H", + "", + "", + 0 + ], + "KeyI": [ + "i", + "I", + "", + "", + 0 + ], + "KeyJ": [ + "j", + "J", + "", + "", + 0 + ], + "KeyK": [ + "k", + "K", + "", + "", + 0 + ], + "KeyL": [ + "l", + "L", + "", + "", + 0 + ], + "KeyM": [ + "m", + "M", + "", + "", + 0 + ], + "KeyN": [ + "n", + "N", + "", + "", + 0 + ], + "KeyO": [ + "o", + "O", + "", + "", + 0 + ], + "KeyP": [ + "p", + "P", + "", + "", + 0 + ], + "KeyQ": [ + "q", + "Q", + "", + "", + 0 + ], + "KeyR": [ + "r", + "R", + "", + "", + 0 + ], + "KeyS": [ + "s", + "S", + "", + "", + 0 + ], + "KeyT": [ + "t", + "T", + "", + "", + 0 + ], + "KeyU": [ + "u", + "U", + "", + "", + 0 + ], + "KeyV": [ + "v", + "V", + "", + "", + 0 + ], + "KeyW": [ + "w", + "W", + "", + "", + 0 + ], + "KeyX": [ + "x", + "X", + "", + "", + 0 + ], + "KeyY": [ + "y", + "Y", + "", + "", + 0 + ], + "KeyZ": [ + "z", + "Z", + "", + "", + 0 + ], + "Digit1": [ + "1", + "!", + "", + "", + 0 + ], + "Digit2": [ + "2", + "\"", + "@", + "", + 0 + ], + "Digit3": [ + "3", + "#", + "£", + "", + 0 + ], + "Digit4": [ + "4", + "$", + "§", + "", + 0 + ], + "Digit5": [ + "5", + "%", + "€", + "", + 0 + ], + "Digit6": [ + "6", + "&", + "", + "", + 0 + ], + "Digit7": [ + "7", + "/", + "{", + "", + 0 + ], + "Digit8": [ + "8", + "(", + "[", + "", + 0 + ], + "Digit9": [ + "9", + ")", + "]", + "", + 0 + ], + "Digit0": [ + "0", + "=", + "}", + "", + 0 + ], + "Minus": [ + "'", + "?", + "", + "", + 0 + ], + "Equal": [ + "«", + "»", + "", + "", + 0 + ], + "BracketLeft": [ + "+", + "*", + "¨", + "", + 0 + ], + "BracketRight": [ + "´", + "`", + "]", + "", + 0 + ], + "Backslash": [ + "~", + "^", + "", + "", + 0 + ], + "Semicolon": [ + "ç", + "Ç", + "", + "", + 0 + ], + "Quote": [ + "º", + "ª", + "", + "", + 0 + ], + "Backquote": [ + "\\", + "|", + "", + "", + 0 + ], + "Comma": [ + ",", + ";", + "", + "", + 0 + ], + "Period": [ + ".", + ":", + "", + "", + 0 + ], + "Slash": [ + "-", + "_", + "", + "", + 0 + ] + } + }, + { + "language": "pt", + "platform": "darwin", + "entries": { + "KeyA": [ + "a", + "A", + "å", + "Å", + 0 + ], + "KeyB": [ + "b", + "B", + "∫", + "ı", + 0 + ], + "KeyC": [ + "c", + "C", + "ç", + "Ç", + 0 + ], + "KeyD": [ + "d", + "D", + "∂", + "Î", + 0 + ], + "KeyE": [ + "e", + "E", + "´", + "´", + 4 + ], + "KeyF": [ + "f", + "F", + "ƒ", + "Ï", + 0 + ], + "KeyG": [ + "g", + "G", + "©", + "˝", + 0 + ], + "KeyH": [ + "h", + "H", + "˙", + "Ó", + 0 + ], + "KeyI": [ + "i", + "I", + "ˆ", + "ˆ", + 4 + ], + "KeyJ": [ + "j", + "J", + "∆", + "Ô", + 0 + ], + "KeyK": [ + "k", + "K", + "˚", + "", + 0 + ], + "KeyL": [ + "l", + "L", + "¬", + "Ò", + 0 + ], + "KeyM": [ + "m", + "M", + "µ", + "Â", + 0 + ], + "KeyN": [ + "n", + "N", + "˜", + "˜", + 4 + ], + "KeyO": [ + "o", + "O", + "ø", + "Ø", + 0 + ], + "KeyP": [ + "p", + "P", + "π", + "∏", + 0 + ], + "KeyQ": [ + "q", + "Q", + "œ", + "Œ", + 0 + ], + "KeyR": [ + "r", + "R", + "®", + "‰", + 0 + ], + "KeyS": [ + "s", + "S", + "ß", + "Í", + 0 + ], + "KeyT": [ + "t", + "T", + "†", + "ˇ", + 0 + ], + "KeyU": [ + "u", + "U", + "¨", + "¨", + 4 + ], + "KeyV": [ + "v", + "V", + "√", + "◊", + 0 + ], + "KeyW": [ + "w", + "W", + "∑", + "„", + 0 + ], + "KeyX": [ + "x", + "X", + "≈", + "˛", + 0 + ], + "KeyY": [ + "y", + "Y", + "¥", + "Á", + 0 + ], + "KeyZ": [ + "z", + "Z", + "Ω", + "¸", + 0 + ], + "Digit1": [ + "1", + "!", + "¡", + "⁄", + 0 + ], + "Digit2": [ + "2", + "@", + "™", + "€", + 0 + ], + "Digit3": [ + "3", + "#", + "£", + "‹", + 0 + ], + "Digit4": [ + "4", + "$", + "¢", + "›", + 0 + ], + "Digit5": [ + "5", + "%", + "∞", + "fi", + 0 + ], + "Digit6": [ + "6", + "ˆ", + "§", + "fl", + 2 + ], + "Digit7": [ + "7", + "&", + "¶", + "‡", + 0 + ], + "Digit8": [ + "8", + "*", + "•", + "°", + 0 + ], + "Digit9": [ + "9", + "(", + "ª", + "·", + 0 + ], + "Digit0": [ + "0", + ")", + "º", + "‚", + 0 + ], + "Minus": [ + "-", + "_", + "–", + "—", + 0 + ], + "Equal": [ + "=", + "+", + "≠", + "±", + 0 + ], + "BracketLeft": [ + "[", + "{", + "“", + "”", + 0 + ], + "BracketRight": [ + "]", + "}", + "‘", + "’", + 0 + ], + "Backslash": [ + "\\", + "|", + "«", + "»", + 0 + ], + "Semicolon": [ + ";", + ":", + "…", + "Ú", + 0 + ], + "Quote": [ + "'", + "\"", + "æ", + "Æ", + 3 + ], + "Backquote": [ + "`", + "˜", + "`", + "`", + 7 + ], + "Comma": [ + ",", + "<", + "≤", + "¯", + 0 + ], + "Period": [ + ".", + ">", + "≥", + "˘", + 0 + ], + "Slash": [ + "/", + "?", + "÷", + "¿", + 0 + ] + } + }, + { + "language": "pt-br", + "platform": "win", + "entries": { + "KeyA": [ + "a", + "A", + "", + "", + 0 + ], + "KeyB": [ + "b", + "B", + "", + "", + 0 + ], + "KeyC": [ + "c", + "C", + "₢", + "", + 0 + ], + "KeyD": [ + "d", + "D", + "", + "", + 0 + ], + "KeyE": [ + "e", + "E", + "°", + "", + 0 + ], + "KeyF": [ + "f", + "F", + "", + "", + 0 + ], + "KeyG": [ + "g", + "G", + "", + "", + 0 + ], + "KeyH": [ + "h", + "H", + "", + "", + 0 + ], + "KeyI": [ + "i", + "I", + "", + "", + 0 + ], + "KeyJ": [ + "j", + "J", + "", + "", + 0 + ], + "KeyK": [ + "k", + "K", + "", + "", + 0 + ], + "KeyL": [ + "l", + "L", + "", + "", + 0 + ], + "KeyM": [ + "m", + "M", + "", + "", + 0 + ], + "KeyN": [ + "n", + "N", + "", + "", + 0 + ], + "KeyO": [ + "o", + "O", + "", + "", + 0 + ], + "KeyP": [ + "p", + "P", + "", + "", + 0 + ], + "KeyQ": [ + "q", + "Q", + "/", + "", + 0 + ], + "KeyR": [ + "r", + "R", + "", + "", + 0 + ], + "KeyS": [ + "s", + "S", + "", + "", + 0 + ], + "KeyT": [ + "t", + "T", + "", + "", + 0 + ], + "KeyU": [ + "u", + "U", + "", + "", + 0 + ], + "KeyV": [ + "v", + "V", + "", + "", + 0 + ], + "KeyW": [ + "w", + "W", + "?", + "", + 0 + ], + "KeyX": [ + "x", + "X", + "", + "", + 0 + ], + "KeyY": [ + "y", + "Y", + "", + "", + 0 + ], + "KeyZ": [ + "z", + "Z", + "", + "", + 0 + ], + "Digit1": [ + "1", + "!", + "¹", + "", + 0 + ], + "Digit2": [ + "2", + "@", + "²", + "", + 0 + ], + "Digit3": [ + "3", + "#", + "³", + "", + 0 + ], + "Digit4": [ + "4", + "$", + "£", + "", + 0 + ], + "Digit5": [ + "5", + "%", + "¢", + "", + 0 + ], + "Digit6": [ + "6", + "¨", + "¬", + "", + 0 + ], + "Digit7": [ + "7", + "&", + "", + "", + 0 + ], + "Digit8": [ + "8", + "*", + "", + "", + 0 + ], + "Digit9": [ + "9", + "(", + "", + "", + 0 + ], + "Digit0": [ + "0", + ")", + "", + "", + 0 + ], + "Minus": [ + "-", + "_", + "", + "", + 0 + ], + "Equal": [ + "=", + "+", + "§", + "", + 0 + ], + "BracketLeft": [ + "´", + "`", + "", + "", + 0 + ], + "BracketRight": [ + "[", + "{", + "ª", + "", + 0 + ], + "Backslash": [ + "]", + "}", + "º", + "", + 0 + ], + "Semicolon": [ + "ç", + "Ç", + "", + "", + 0 + ], + "Quote": [ + "~", + "^", + "", + "", + 0 + ], + "Backquote": [ + "'", + "\"", + "", + "", + 0 + ], + "Comma": [ + ",", + "<", + "", + "", + 0 + ], + "Period": [ + ".", + ">", + "", + "", + 0 + ], + "Slash": [ + ";", + ":", + "", + "", + 0 + ] + } + }, + { + "language": "ru", + "platform": "win", + "entries": { + "KeyA": [ + "ф", + "Ф", + "", + "", + 0 + ], + "KeyB": [ + "и", + "И", + "", + "", + 0 + ], + "KeyC": [ + "с", + "С", + "", + "", + 0 + ], + "KeyD": [ + "в", + "В", + "", + "", + 0 + ], + "KeyE": [ + "у", + "У", + "", + "", + 0 + ], + "KeyF": [ + "а", + "А", + "", + "", + 0 + ], + "KeyG": [ + "п", + "П", + "", + "", + 0 + ], + "KeyH": [ + "р", + "Р", + "", + "", + 0 + ], + "KeyI": [ + "ш", + "Ш", + "", + "", + 0 + ], + "KeyJ": [ + "о", + "О", + "", + "", + 0 + ], + "KeyK": [ + "л", + "Л", + "", + "", + 0 + ], + "KeyL": [ + "д", + "Д", + "", + "", + 0 + ], + "KeyM": [ + "ь", + "Ь", + "", + "", + 0 + ], + "KeyN": [ + "т", + "Т", + "", + "", + 0 + ], + "KeyO": [ + "щ", + "Щ", + "", + "", + 0 + ], + "KeyP": [ + "з", + "З", + "", + "", + 0 + ], + "KeyQ": [ + "й", + "Й", + "", + "", + 0 + ], + "KeyR": [ + "к", + "К", + "", + "", + 0 + ], + "KeyS": [ + "ы", + "Ы", + "", + "", + 0 + ], + "KeyT": [ + "е", + "Е", + "", + "", + 0 + ], + "KeyU": [ + "г", + "Г", + "", + "", + 0 + ], + "KeyV": [ + "м", + "М", + "", + "", + 0 + ], + "KeyW": [ + "ц", + "Ц", + "", + "", + 0 + ], + "KeyX": [ + "ч", + "Ч", + "", + "", + 0 + ], + "KeyY": [ + "н", + "Н", + "", + "", + 0 + ], + "KeyZ": [ + "я", + "Я", + "", + "", + 0 + ], + "Digit1": [ + "1", + "!", + "", + "", + 0 + ], + "Digit2": [ + "2", + "\"", + "", + "", + 0 + ], + "Digit3": [ + "3", + "№", + "", + "", + 0 + ], + "Digit4": [ + "4", + ";", + "", + "", + 0 + ], + "Digit5": [ + "5", + "%", + "", + "", + 0 + ], + "Digit6": [ + "6", + ":", + "", + "", + 0 + ], + "Digit7": [ + "7", + "?", + "", + "", + 0 + ], + "Digit8": [ + "8", + "*", + "₽", + "", + 0 + ], + "Digit9": [ + "9", + "(", + "", + "", + 0 + ], + "Digit0": [ + "0", + ")", + "", + "", + 0 + ], + "Minus": [ + "-", + "_", + "", + "", + 0 + ], + "Equal": [ + "=", + "+", + "", + "", + 0 + ], + "BracketLeft": [ + "х", + "Х", + "", + "", + 0 + ], + "BracketRight": [ + "ъ", + "Ъ", + "", + "", + 0 + ], + "Backslash": [ + "\\", + "/", + "", + "", + 0 + ], + "Semicolon": [ + "ж", + "Ж", + "", + "", + 0 + ], + "Quote": [ + "э", + "Э", + "", + "", + 0 + ], + "Backquote": [ + "ё", + "Ё", + "", + "", + 0 + ], + "Comma": [ + "б", + "Б", + "", + "", + 0 + ], + "Period": [ + "ю", + "Ю", + "", + "", + 0 + ], + "Slash": [ + ".", + ",", + "", + "", + 0 + ] + } + }, + { + "language": "ru", + "platform": "linux", + "entries": { + "KeyA": [ + "ф", + "Ф", + "ф", + "Ф", + 0 + ], + "KeyB": [ + "и", + "И", + "и", + "И", + 0 + ], + "KeyC": [ + "с", + "С", + "с", + "С", + 0 + ], + "KeyD": [ + "в", + "В", + "в", + "В", + 0 + ], + "KeyE": [ + "у", + "У", + "у", + "У", + 0 + ], + "KeyF": [ + "а", + "А", + "а", + "А", + 0 + ], + "KeyG": [ + "п", + "П", + "п", + "П", + 0 + ], + "KeyH": [ + "р", + "Р", + "р", + "Р", + 0 + ], + "KeyI": [ + "ш", + "Ш", + "ш", + "Ш", + 0 + ], + "KeyJ": [ + "о", + "О", + "о", + "О", + 0 + ], + "KeyK": [ + "л", + "Л", + "л", + "Л", + 0 + ], + "KeyL": [ + "д", + "Д", + "д", + "Д", + 0 + ], + "KeyM": [ + "ь", + "Ь", + "ь", + "Ь", + 0 + ], + "KeyN": [ + "т", + "Т", + "т", + "Т", + 0 + ], + "KeyO": [ + "щ", + "Щ", + "щ", + "Щ", + 0 + ], + "KeyP": [ + "з", + "З", + "з", + "З", + 0 + ], + "KeyQ": [ + "й", + "Й", + "й", + "Й", + 0 + ], + "KeyR": [ + "к", + "К", + "к", + "К", + 0 + ], + "KeyS": [ + "ы", + "Ы", + "ы", + "Ы", + 0 + ], + "KeyT": [ + "е", + "Е", + "е", + "Е", + 0 + ], + "KeyU": [ + "г", + "Г", + "г", + "Г", + 0 + ], + "KeyV": [ + "м", + "М", + "м", + "М", + 0 + ], + "KeyW": [ + "ц", + "Ц", + "ц", + "Ц", + 0 + ], + "KeyX": [ + "ч", + "Ч", + "ч", + "Ч", + 0 + ], + "KeyY": [ + "н", + "Н", + "н", + "Н", + 0 + ], + "KeyZ": [ + "я", + "Я", + "я", + "Я", + 0 + ], + "Digit1": [ + "1", + "!", + "1", + "!", + 0 + ], + "Digit2": [ + "2", + "\"", + "2", + "\"", + 0 + ], + "Digit3": [ + "3", + "№", + "3", + "№", + 0 + ], + "Digit4": [ + "4", + ";", + "4", + ";", + 0 + ], + "Digit5": [ + "5", + "%", + "5", + "%", + 0 + ], + "Digit6": [ + "6", + ":", + "6", + ":", + 0 + ], + "Digit7": [ + "7", + "?", + "7", + "?", + 0 + ], + "Digit8": [ + "8", + "*", + "₽", + "", + 0 + ], + "Digit9": [ + "9", + "(", + "9", + "(", + 0 + ], + "Digit0": [ + "0", + ")", + "0", + ")", + 0 + ], + "Minus": [ + "-", + "_", + "-", + "_", + 0 + ], + "Equal": [ + "=", + "+", + "=", + "+", + 0 + ], + "BracketLeft": [ + "х", + "Х", + "х", + "Х", + 0 + ], + "BracketRight": [ + "ъ", + "Ъ", + "ъ", + "Ъ", + 0 + ], + "Backslash": [ + "\\", + "/", + "\\", + "/", + 0 + ], + "Semicolon": [ + "ж", + "Ж", + "ж", + "Ж", + 0 + ], + "Quote": [ + "э", + "Э", + "э", + "Э", + 0 + ], + "Backquote": [ + "ё", + "Ё", + "ё", + "Ё", + 0 + ], + "Comma": [ + "б", + "Б", + "б", + "Б", + 0 + ], + "Period": [ + "ю", + "Ю", + "ю", + "Ю", + 0 + ], + "Slash": [ + ".", + ",", + ".", + ",", + 0 + ] + } + }, + { + "language": "ru", + "platform": "darwin", + "entries": { + "KeyA": [ + "ф", + "Ф", + "ƒ", + "ƒ", + 0 + ], + "KeyB": [ + "и", + "И", + "и", + "И", + 0 + ], + "KeyC": [ + "с", + "С", + "≠", + "≠", + 0 + ], + "KeyD": [ + "в", + "В", + "ћ", + "Ћ", + 0 + ], + "KeyE": [ + "у", + "У", + "ќ", + "Ќ", + 0 + ], + "KeyF": [ + "а", + "А", + "÷", + "÷", + 0 + ], + "KeyG": [ + "п", + "П", + "©", + "©", + 0 + ], + "KeyH": [ + "р", + "Р", + "₽", + "₽", + 0 + ], + "KeyI": [ + "ш", + "Ш", + "ѕ", + "Ѕ", + 0 + ], + "KeyJ": [ + "о", + "О", + "°", + "•", + 0 + ], + "KeyK": [ + "л", + "Л", + "љ", + "Љ", + 0 + ], + "KeyL": [ + "д", + "Д", + "∆", + "∆", + 0 + ], + "KeyM": [ + "ь", + "Ь", + "~", + "~", + 0 + ], + "KeyN": [ + "т", + "Т", + "™", + "™", + 0 + ], + "KeyO": [ + "щ", + "Щ", + "ў", + "Ў", + 0 + ], + "KeyP": [ + "з", + "З", + "‘", + "’", + 0 + ], + "KeyQ": [ + "й", + "Й", + "ј", + "Ј", + 0 + ], + "KeyR": [ + "к", + "К", + "®", + "®", + 0 + ], + "KeyS": [ + "ы", + "Ы", + "ы", + "Ы", + 0 + ], + "KeyT": [ + "е", + "Е", + "†", + "†", + 0 + ], + "KeyU": [ + "г", + "Г", + "ѓ", + "Ѓ", + 0 + ], + "KeyV": [ + "м", + "М", + "µ", + "µ", + 0 + ], + "KeyW": [ + "ц", + "Ц", + "џ", + "Џ", + 0 + ], + "KeyX": [ + "ч", + "Ч", + "≈", + "≈", + 0 + ], + "KeyY": [ + "н", + "Н", + "њ", + "Њ", + 0 + ], + "KeyZ": [ + "я", + "Я", + "ђ", + "Ђ", + 0 + ], + "Digit1": [ + "1", + "!", + "!", + "|", + 0 + ], + "Digit2": [ + "2", + "\"", + "@", + "\"", + 0 + ], + "Digit3": [ + "3", + "№", + "#", + "£", + 0 + ], + "Digit4": [ + "4", + "%", + "$", + "€", + 0 + ], + "Digit5": [ + "5", + ":", + "%", + "∞", + 0 + ], + "Digit6": [ + "6", + ",", + "^", + "¬", + 0 + ], + "Digit7": [ + "7", + ".", + "&", + "¶", + 0 + ], + "Digit8": [ + "8", + ";", + "*", + "√", + 0 + ], + "Digit9": [ + "9", + "(", + "{", + "'", + 0 + ], + "Digit0": [ + "0", + ")", + "}", + "`", + 0 + ], + "Minus": [ + "-", + "_", + "–", + "—", + 0 + ], + "Equal": [ + "=", + "+", + "»", + "«", + 0 + ], + "BracketLeft": [ + "х", + "Х", + "“", + "”", + 0 + ], + "BracketRight": [ + "ъ", + "Ъ", + "ъ", + "Ъ", + 0 + ], + "Backslash": [ + "ё", + "Ё", + "ё", + "Ё", + 0 + ], + "Semicolon": [ + "ж", + "Ж", + "…", + "…", + 0 + ], + "Quote": [ + "э", + "Э", + "э", + "Э", + 0 + ], + "Backquote": [ + "]", + "[", + "]", + "[", + 0 + ], + "Comma": [ + "б", + "Б", + "≤", + "<", + 0 + ], + "Period": [ + "ю", + "Ю", + "≥", + ">", + 0 + ], + "Slash": [ + "/", + "?", + "“", + "„", + 0 + ] + } + }, + { + "language": "sv", + "platform": "win", + "entries": { + "KeyA": [ + "a", + "A", + "", + "", + 0 + ], + "KeyB": [ + "b", + "B", + "", + "", + 0 + ], + "KeyC": [ + "c", + "C", + "", + "", + 0 + ], + "KeyD": [ + "d", + "D", + "", + "", + 0 + ], + "KeyE": [ + "e", + "E", + "€", + "", + 0 + ], + "KeyF": [ + "f", + "F", + "", + "", + 0 + ], + "KeyG": [ + "g", + "G", + "", + "", + 0 + ], + "KeyH": [ + "h", + "H", + "", + "", + 0 + ], + "KeyI": [ + "i", + "I", + "", + "", + 0 + ], + "KeyJ": [ + "j", + "J", + "", + "", + 0 + ], + "KeyK": [ + "k", + "K", + "", + "", + 0 + ], + "KeyL": [ + "l", + "L", + "", + "", + 0 + ], + "KeyM": [ + "m", + "M", + "µ", + "", + 0 + ], + "KeyN": [ + "n", + "N", + "", + "", + 0 + ], + "KeyO": [ + "o", + "O", + "", + "", + 0 + ], + "KeyP": [ + "p", + "P", + "", + "", + 0 + ], + "KeyQ": [ + "q", + "Q", + "", + "", + 0 + ], + "KeyR": [ + "r", + "R", + "", + "", + 0 + ], + "KeyS": [ + "s", + "S", + "", + "", + 0 + ], + "KeyT": [ + "t", + "T", + "", + "", + 0 + ], + "KeyU": [ + "u", + "U", + "", + "", + 0 + ], + "KeyV": [ + "v", + "V", + "", + "", + 0 + ], + "KeyW": [ + "w", + "W", + "", + "", + 0 + ], + "KeyX": [ + "x", + "X", + "", + "", + 0 + ], + "KeyY": [ + "y", + "Y", + "", + "", + 0 + ], + "KeyZ": [ + "z", + "Z", + "", + "", + 0 + ], + "Digit1": [ + "1", + "!", + "", + "", + 0 + ], + "Digit2": [ + "2", + "\"", + "@", + "", + 0 + ], + "Digit3": [ + "3", + "#", + "£", + "", + 0 + ], + "Digit4": [ + "4", + "¤", + "$", + "", + 0 + ], + "Digit5": [ + "5", + "%", + "€", + "", + 0 + ], + "Digit6": [ + "6", + "&", + "", + "", + 0 + ], + "Digit7": [ + "7", + "/", + "{", + "", + 0 + ], + "Digit8": [ + "8", + "(", + "[", + "", + 0 + ], + "Digit9": [ + "9", + ")", + "]", + "", + 0 + ], + "Digit0": [ + "0", + "=", + "}", + "", + 0 + ], + "Minus": [ + "+", + "?", + "\\", + "", + 0 + ], + "Equal": [ + "´", + "`", + "", + "", + 0 + ], + "BracketLeft": [ + "å", + "Å", + "", + "", + 0 + ], + "BracketRight": [ + "¨", + "^", + "~", + "", + 0 + ], + "Backslash": [ + "'", + "*", + "", + "", + 0 + ], + "Semicolon": [ + "ö", + "Ö", + "", + "", + 0 + ], + "Quote": [ + "ä", + "Ä", + "", + "", + 0 + ], + "Backquote": [ + "§", + "½", + "", + "", + 0 + ], + "Comma": [ + ",", + ";", + "", + "", + 0 + ], + "Period": [ + ".", + ":", + "", + "", + 0 + ], + "Slash": [ + "-", + "_", + "", + "", + 0 + ] + } + }, + { + "language": "sv", + "platform": "darwin", + "entries": { + "KeyA": [ + "a", + "A", + "", + "◊", + 0 + ], + "KeyB": [ + "b", + "B", + "›", + "»", + 0 + ], + "KeyC": [ + "c", + "C", + "ç", + "Ç", + 0 + ], + "KeyD": [ + "d", + "D", + "∂", + "∆", + 0 + ], + "KeyE": [ + "e", + "E", + "é", + "É", + 0 + ], + "KeyF": [ + "f", + "F", + "ƒ", + "∫", + 0 + ], + "KeyG": [ + "g", + "G", + "¸", + "¯", + 0 + ], + "KeyH": [ + "h", + "H", + "˛", + "˘", + 0 + ], + "KeyI": [ + "i", + "I", + "ı", + "ˆ", + 0 + ], + "KeyJ": [ + "j", + "J", + "√", + "¬", + 0 + ], + "KeyK": [ + "k", + "K", + "ª", + "º", + 0 + ], + "KeyL": [ + "l", + "L", + "fi", + "fl", + 0 + ], + "KeyM": [ + "m", + "M", + "’", + "”", + 0 + ], + "KeyN": [ + "n", + "N", + "‘", + "“", + 0 + ], + "KeyO": [ + "o", + "O", + "œ", + "Œ", + 0 + ], + "KeyP": [ + "p", + "P", + "π", + "∏", + 0 + ], + "KeyQ": [ + "q", + "Q", + "•", + "°", + 0 + ], + "KeyR": [ + "r", + "R", + "®", + "√", + 0 + ], + "KeyS": [ + "s", + "S", + "ß", + "∑", + 0 + ], + "KeyT": [ + "t", + "T", + "†", + "‡", + 0 + ], + "KeyU": [ + "u", + "U", + "ü", + "Ü", + 0 + ], + "KeyV": [ + "v", + "V", + "‹", + "«", + 0 + ], + "KeyW": [ + "w", + "W", + "Ω", + "˝", + 0 + ], + "KeyX": [ + "x", + "X", + "≈", + "ˇ", + 0 + ], + "KeyY": [ + "y", + "Y", + "µ", + "˜", + 0 + ], + "KeyZ": [ + "z", + "Z", + "÷", + "⁄", + 0 + ], + "Digit1": [ + "1", + "!", + "©", + "¡", + 0 + ], + "Digit2": [ + "2", + "\"", + "@", + "”", + 0 + ], + "Digit3": [ + "3", + "#", + "£", + "¥", + 0 + ], + "Digit4": [ + "4", + "€", + "$", + "¢", + 0 + ], + "Digit5": [ + "5", + "%", + "∞", + "‰", + 0 + ], + "Digit6": [ + "6", + "&", + "§", + "¶", + 0 + ], + "Digit7": [ + "7", + "/", + "|", + "\\", + 0 + ], + "Digit8": [ + "8", + "(", + "[", + "{", + 0 + ], + "Digit9": [ + "9", + ")", + "]", + "}", + 0 + ], + "Digit0": [ + "0", + "=", + "≈", + "≠", + 0 + ], + "Minus": [ + "+", + "?", + "±", + "¿", + 0 + ], + "Equal": [ + "´", + "`", + "´", + "`", + 3 + ], + "BracketLeft": [ + "å", + "Å", + "˙", + "˚", + 0 + ], + "BracketRight": [ + "¨", + "^", + "~", + "^", + 7 + ], + "Backslash": [ + "'", + "*", + "™", + "’", + 0 + ], + "Semicolon": [ + "ö", + "Ö", + "ø", + "Ø", + 0 + ], + "Quote": [ + "ä", + "Ä", + "æ", + "Æ", + 0 + ], + "Backquote": [ + "<", + ">", + "≤", + "≥", + 0 + ], + "Comma": [ + ",", + ";", + "‚", + "„", + 0 + ], + "Period": [ + ".", + ":", + "…", + "·", + 0 + ], + "Slash": [ + "-", + "_", + "–", + "—", + 0 + ] + } + }, + { + "language": "thai", + "platform": "win", + "entries": { + "KeyA": [ + "ฟ", + "ฤ", + "", + "", + 0 + ], + "KeyB": [ + "ิ", + "ฺ", + "", + "", + 0 + ], + "KeyC": [ + "แ", + "ฉ", + "", + "", + 0 + ], + "KeyD": [ + "ก", + "ฏ", + "", + "", + 0 + ], + "KeyE": [ + "ำ", + "ฎ", + "", + "", + 0 + ], + "KeyF": [ + "ด", + "โ", + "", + "", + 0 + ], + "KeyG": [ + "เ", + "ฌ", + "", + "", + 0 + ], + "KeyH": [ + "้", + "็", + "", + "", + 0 + ], + "KeyI": [ + "ร", + "ณ", + "", + "", + 0 + ], + "KeyJ": [ + "่", + "๋", + "", + "", + 0 + ], + "KeyK": [ + "า", + "ษ", + "", + "", + 0 + ], + "KeyL": [ + "ส", + "ศ", + "", + "", + 0 + ], + "KeyM": [ + "ท", + "?", + "", + "", + 0 + ], + "KeyN": [ + "ื", + "์", + "", + "", + 0 + ], + "KeyO": [ + "น", + "ฯ", + "", + "", + 0 + ], + "KeyP": [ + "ย", + "ญ", + "", + "", + 0 + ], + "KeyQ": [ + "ๆ", + "๐", + "", + "", + 0 + ], + "KeyR": [ + "พ", + "ฑ", + "", + "", + 0 + ], + "KeyS": [ + "ห", + "ฆ", + "", + "", + 0 + ], + "KeyT": [ + "ะ", + "ธ", + "", + "", + 0 + ], + "KeyU": [ + "ี", + "๊", + "", + "", + 0 + ], + "KeyV": [ + "อ", + "ฮ", + "", + "", + 0 + ], + "KeyW": [ + "ไ", + "\"", + "", + "", + 0 + ], + "KeyX": [ + "ป", + ")", + "", + "", + 0 + ], + "KeyY": [ + "ั", + "ํ", + "", + "", + 0 + ], + "KeyZ": [ + "ผ", + "(", + "", + "", + 0 + ], + "Digit1": [ + "ๅ", + "+", + "", + "", + 0 + ], + "Digit2": [ + "/", + "๑", + "", + "", + 0 + ], + "Digit3": [ + "-", + "๒", + "", + "", + 0 + ], + "Digit4": [ + "ภ", + "๓", + "", + "", + 0 + ], + "Digit5": [ + "ถ", + "๔", + "", + "", + 0 + ], + "Digit6": [ + "ุ", + "ู", + "", + "", + 0 + ], + "Digit7": [ + "ึ", + "฿", + "", + "", + 0 + ], + "Digit8": [ + "ค", + "๕", + "", + "", + 0 + ], + "Digit9": [ + "ต", + "๖", + "", + "", + 0 + ], + "Digit0": [ + "จ", + "๗", + "", + "", + 0 + ], + "Minus": [ + "ข", + "๘", + "", + "", + 0 + ], + "Equal": [ + "ช", + "๙", + "", + "", + 0 + ], + "BracketLeft": [ + "บ", + "ฐ", + "", + "", + 0 + ], + "BracketRight": [ + "ล", + ",", + "", + "", + 0 + ], + "Backslash": [ + "ฃ", + "ฅ", + "", + "", + 0 + ], + "Semicolon": [ + "ว", + "ซ", + "", + "", + 0 + ], + "Quote": [ + "ง", + ".", + "", + "", + 0 + ], + "Backquote": [ + "_", + "%", + "", + "", + 0 + ], + "Comma": [ + "ม", + "ฒ", + "", + "", + 0 + ], + "Period": [ + "ใ", + "ฬ", + "", + "", + 0 + ], + "Slash": [ + "ฝ", + "ฦ", + "", + "", + 0 + ] + } + }, + { + "language": "tr", + "platform": "win", + "entries": { + "KeyA": [ + "a", + "A", + "æ", + "Æ", + 0 + ], + "KeyB": [ + "b", + "B", + "", + "", + 0 + ], + "KeyC": [ + "c", + "C", + "", + "", + 0 + ], + "KeyD": [ + "d", + "D", + "", + "", + 0 + ], + "KeyE": [ + "e", + "E", + "€", + "", + 0 + ], + "KeyF": [ + "f", + "F", + "", + "", + 0 + ], + "KeyG": [ + "g", + "G", + "", + "", + 0 + ], + "KeyH": [ + "h", + "H", + "", + "", + 0 + ], + "KeyI": [ + "ı", + "I", + "i", + "İ", + 0 + ], + "KeyJ": [ + "j", + "J", + "", + "", + 0 + ], + "KeyK": [ + "k", + "K", + "", + "", + 0 + ], + "KeyL": [ + "l", + "L", + "", + "", + 0 + ], + "KeyM": [ + "m", + "M", + "", + "", + 0 + ], + "KeyN": [ + "n", + "N", + "", + "", + 0 + ], + "KeyO": [ + "o", + "O", + "", + "", + 0 + ], + "KeyP": [ + "p", + "P", + "", + "", + 0 + ], + "KeyQ": [ + "q", + "Q", + "@", + "", + 0 + ], + "KeyR": [ + "r", + "R", + "", + "", + 0 + ], + "KeyS": [ + "s", + "S", + "ß", + "", + 0 + ], + "KeyT": [ + "t", + "T", + "₺", + "", + 0 + ], + "KeyU": [ + "u", + "U", + "", + "", + 0 + ], + "KeyV": [ + "v", + "V", + "", + "", + 0 + ], + "KeyW": [ + "w", + "W", + "", + "", + 0 + ], + "KeyX": [ + "x", + "X", + "", + "", + 0 + ], + "KeyY": [ + "y", + "Y", + "", + "", + 0 + ], + "KeyZ": [ + "z", + "Z", + "", + "", + 0 + ], + "Digit1": [ + "1", + "!", + ">", + "", + 0 + ], + "Digit2": [ + "2", + "'", + "£", + "", + 0 + ], + "Digit3": [ + "3", + "^", + "#", + "", + 0 + ], + "Digit4": [ + "4", + "+", + "$", + "", + 0 + ], + "Digit5": [ + "5", + "%", + "½", + "", + 0 + ], + "Digit6": [ + "6", + "&", + "", + "", + 0 + ], + "Digit7": [ + "7", + "/", + "{", + "", + 0 + ], + "Digit8": [ + "8", + "(", + "[", + "", + 0 + ], + "Digit9": [ + "9", + ")", + "]", + "", + 0 + ], + "Digit0": [ + "0", + "=", + "}", + "", + 0 + ], + "Minus": [ + "*", + "?", + "\\", + "", + 0 + ], + "Equal": [ + "-", + "_", + "|", + "", + 0 + ], + "BracketLeft": [ + "ğ", + "Ğ", + "¨", + "", + 0 + ], + "BracketRight": [ + "ü", + "Ü", + "~", + "", + 0 + ], + "Backslash": [ + ",", + ";", + "`", + "", + 0 + ], + "Semicolon": [ + "ş", + "Ş", + "´", + "", + 0 + ], + "Quote": [ + "i", + "İ", + "", + "", + 0 + ], + "Backquote": [ + "\"", + "é", + "<", + "", + 0 + ], + "Comma": [ + "ö", + "Ö", + "", + "", + 0 + ], + "Period": [ + "ç", + "Ç", + "", + "", + 0 + ], + "Slash": [ + ".", + ":", + "", + "", + 0 + ] + } + }, + { + "language": "zh-hans", + "platform": "darwin", + "entries": { + "KeyA": [ + "a", + "A", + "å", + "Å", + 0 + ], + "KeyB": [ + "b", + "B", + "∫", + "ı", + 0 + ], + "KeyC": [ + "c", + "C", + "ç", + "Ç", + 0 + ], + "KeyD": [ + "d", + "D", + "∂", + "Î", + 0 + ], + "KeyE": [ + "e", + "E", + "´", + "´", + 4 + ], + "KeyF": [ + "f", + "F", + "ƒ", + "Ï", + 0 + ], + "KeyG": [ + "g", + "G", + "©", + "˝", + 0 + ], + "KeyH": [ + "h", + "H", + "˙", + "Ó", + 0 + ], + "KeyI": [ + "i", + "I", + "ˆ", + "ˆ", + 4 + ], + "KeyJ": [ + "j", + "J", + "∆", + "Ô", + 0 + ], + "KeyK": [ + "k", + "K", + "˚", + "", + 0 + ], + "KeyL": [ + "l", + "L", + "¬", + "Ò", + 0 + ], + "KeyM": [ + "m", + "M", + "µ", + "Â", + 0 + ], + "KeyN": [ + "n", + "N", + "˜", + "˜", + 4 + ], + "KeyO": [ + "o", + "O", + "ø", + "Ø", + 0 + ], + "KeyP": [ + "p", + "P", + "π", + "∏", + 0 + ], + "KeyQ": [ + "q", + "Q", + "œ", + "Œ", + 0 + ], + "KeyR": [ + "r", + "R", + "®", + "‰", + 0 + ], + "KeyS": [ + "s", + "S", + "ß", + "Í", + 0 + ], + "KeyT": [ + "t", + "T", + "†", + "ˇ", + 0 + ], + "KeyU": [ + "u", + "U", + "¨", + "¨", + 4 + ], + "KeyV": [ + "v", + "V", + "√", + "◊", + 0 + ], + "KeyW": [ + "w", + "W", + "∑", + "„", + 0 + ], + "KeyX": [ + "x", + "X", + "≈", + "˛", + 0 + ], + "KeyY": [ + "y", + "Y", + "¥", + "Á", + 0 + ], + "KeyZ": [ + "z", + "Z", + "Ω", + "¸", + 0 + ], + "Digit1": [ + "1", + "!", + "¡", + "⁄", + 0 + ], + "Digit2": [ + "2", + "@", + "™", + "€", + 0 + ], + "Digit3": [ + "3", + "#", + "£", + "‹", + 0 + ], + "Digit4": [ + "4", + "¥", + "¢", + "›", + 0 + ], + "Digit5": [ + "5", + "%", + "∞", + "fi", + 0 + ], + "Digit6": [ + "6", + "", + "§", + "fl", + 0 + ], + "Digit7": [ + "7", + "&", + "¶", + "‡", + 0 + ], + "Digit8": [ + "8", + "*", + "•", + "°", + 0 + ], + "Digit9": [ + "9", + "(", + "ª", + "·", + 0 + ], + "Digit0": [ + "0", + ")", + "º", + "‚", + 0 + ], + "Minus": [ + "-", + "", + "–", + "—", + 0 + ], + "Equal": [ + "=", + "+", + "≠", + "±", + 0 + ], + "BracketLeft": [ + "【", + "「", + "“", + "”", + 0 + ], + "BracketRight": [ + "】", + "」", + "‘", + "’", + 0 + ], + "Backslash": [ + "、", + "|", + "«", + "»", + 0 + ], + "Semicolon": [ + ";", + ":", + "…", + "Ú", + 0 + ], + "Quote": [ + "'", + "\"", + "æ", + "Æ", + 0 + ], + "Backquote": [ + "·", + "~", + "`", + "`", + 4 + ], + "Comma": [ + ",", + "《", + "≤", + "¯", + 0 + ], + "Period": [ + "。", + "》", + "≥", + "˘", + 0 + ], + "Slash": [ + "/", + "?", + "÷", + "¿", + 0 + ] + } + } + ] +} \ No newline at end of file diff --git a/tools/gen_web_keyboard_layouts/lib/json_get.dart b/tools/gen_web_keyboard_layouts/lib/json_get.dart index 7ed4792ead4c7..fe900be634e0b 100644 --- a/tools/gen_web_keyboard_layouts/lib/json_get.dart +++ b/tools/gen_web_keyboard_layouts/lib/json_get.dart @@ -40,7 +40,7 @@ JsonContext jsonGetIndex(JsonContext context, int index) { return JsonContext(result, [...context.path, '$index']); } -JsonContext jsonGetPath(JsonContext context, List path) { +JsonContext jsonGetPath(JsonContext context, String path) { JsonContext current = context; void jsonGetKeyOrIndex(dynamic key, int depth) { assert(key is String || key is int, 'Key at $depth is a ${key.runtimeType}.'); @@ -63,17 +63,18 @@ JsonContext jsonGetPath(JsonContext context, List path) } } - for (int depth = 0; depth < path.length; depth += 1) { - if (depth != path.length - 1) { - jsonGetKeyOrIndexForNext(path[depth], path[depth + 1], depth); + final List pathSegments = _jsonPathSplit(path); + for (int depth = 0; depth < pathSegments.length; depth += 1) { + if (depth != pathSegments.length - 1) { + jsonGetKeyOrIndexForNext(pathSegments[depth], pathSegments[depth + 1], depth); } else { - jsonGetKeyOrIndex(path[depth], depth); + jsonGetKeyOrIndex(pathSegments[depth], depth); } } return current as JsonContext; } -List jsonPathSplit(String path) { +List _jsonPathSplit(String path) { return path.split('.').map((String key) { final int? index = int.tryParse(key); if (index != null) { diff --git a/tools/gen_web_keyboard_layouts/lib/layout_types.dart b/tools/gen_web_keyboard_layouts/lib/layout_types.dart index e2c77ed534819..7f32fa964a97c 100644 --- a/tools/gen_web_keyboard_layouts/lib/layout_types.dart +++ b/tools/gen_web_keyboard_layouts/lib/layout_types.dart @@ -333,3 +333,35 @@ void verifyLayoutStoreEqual(LayoutStore store1, LayoutStore store2) { }); }); } + +String _layoutPlatformToString(LayoutPlatform platform) { + switch (platform) { + case LayoutPlatform.win: + return 'win'; + case LayoutPlatform.linux: + return 'linux'; + case LayoutPlatform.darwin: + return 'darwin'; + } +} + +/// Marshall a store into a JSON. +/// +/// The JSON is not to be parsed by scripts, but read by human. +Map jsonifyStore(LayoutStore store) { + final Map storeJson = {}; + storeJson['goals'] = Map.from(store.goals); + storeJson['layouts'] = store.layouts.map((Layout layout) { + final Map layoutJson = {}; + layoutJson['language'] = layout.language; + layoutJson['platform'] = _layoutPlatformToString(layout.platform); + layoutJson['entries'] = Map.fromIterables( + layout.entries.keys, + layout.entries.values.map((LayoutEntry entry) => + [...entry.printables, entry.deadMasks] + ), + ); + return layoutJson; + }).toList(); + return storeJson; +} diff --git a/tools/gen_web_keyboard_layouts/lib/main.dart b/tools/gen_web_keyboard_layouts/lib/main.dart index 55f200b4ed5dc..cb41174431f41 100644 --- a/tools/gen_web_keyboard_layouts/lib/main.dart +++ b/tools/gen_web_keyboard_layouts/lib/main.dart @@ -164,7 +164,7 @@ _GitHubFile _jsonGetGithubFile(JsonContext files, int index) { final JsonContext file = jsonGetIndex(files, index); return _GitHubFile( name: jsonGetKey(file, 'name').current, - content: jsonGetPath(file, ['object', 'text']).current, + content: jsonGetPath(file, 'object.text').current, ); } @@ -288,17 +288,6 @@ LayoutPlatform _platformFromGithubString(String origin) { } } -String _platformToString(LayoutPlatform value) { - switch (value) { - case LayoutPlatform.win: - return 'win'; - case LayoutPlatform.linux: - return 'linux'; - case LayoutPlatform.darwin: - return 'darwin'; - } -} - int _sortLayout(Layout a, Layout b) { int result = a.language.compareTo(b.language); if (result == 0) { @@ -351,12 +340,12 @@ Future generate(Options options) async { // Parse the result from GitHub. final JsonContext commitJson = jsonGetPath( JsonContext.root(githubBody), - jsonPathSplit('data.repository.defaultBranchRef.target.history.nodes.0'), + 'data.repository.defaultBranchRef.target.history.nodes.0', ); final String commitId = jsonGetKey(commitJson, 'oid').current; final JsonContext fileListJson = jsonGetPath( commitJson, - jsonPathSplit('file.object.entries'), + 'file.object.entries', ); final Iterable<_GitHubFile> files = Iterable<_GitHubFile>.generate( fileListJson.current.length, @@ -405,4 +394,11 @@ Future generate(Options options) async { }, ), ); + + // Generate the JSON file. + _writeFileTo( + options.dataRoot, + 'definitions_uncompressed.g.json', + const JsonEncoder.withIndent(' ').convert(jsonifyStore(store)), + ); } From 0227c4c4943d957a711592cd1ce600b8c2be9a7a Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 17 Oct 2022 17:13:54 -0700 Subject: [PATCH 22/74] engine compilable --- .../src/engine/keyboard_layout_detector.dart | 143 ++++++++---------- lib/web_ui/pubspec.yaml | 4 +- .../lib/definitions.g.dart | 2 +- .../web_keyboard_layouts/lib/types.g.dart | 5 +- .../data/definitions.dart.tmpl | 2 +- .../data/types.dart.tmpl | 2 +- .../lib/layout_types.dart | 4 +- tools/gen_web_keyboard_layouts/lib/main.dart | 2 +- 8 files changed, 77 insertions(+), 87 deletions(-) diff --git a/lib/web_ui/lib/src/engine/keyboard_layout_detector.dart b/lib/web_ui/lib/src/engine/keyboard_layout_detector.dart index 67a75c3050403..2bd249dba0a44 100644 --- a/lib/web_ui/lib/src/engine/keyboard_layout_detector.dart +++ b/lib/web_ui/lib/src/engine/keyboard_layout_detector.dart @@ -13,34 +13,23 @@ void _debugLog(String message) { } } -bool _isEascii(int clue) { - // This also excludes kDeadKey. - return clue < 256; -} +// bool _isEascii(String clue) { +// return clue.length == 1 && clue.codeUnitAt(0) < 256; +// } class KeyboardLayoutDetector { - KeyboardLayoutDetector() { - int index = 0; - for (final String code in keyboard_layouts.kLayoutGoals.keys) { - _goalToIndex[code] = index; - index += 1; - } - print('Goal: $_goalToIndex'); - } - void update(DomKeyboardEvent event) { if (event.type != 'keydown') { return; } - final int? goalIndex = _goalToIndex[event.code]; - if (goalIndex == null) { + if (!keyboard_layouts.kLayoutStore.goals.containsKey(event.code)) { return; } - print('Cue ${event.code} index $goalIndex key ${event.key}'); + print('Cue ${event.code} key ${event.key}'); // There is an existing candidate list. Filter based on it. if (_candidates.isNotEmpty) { - final bool effectiveCue = _filterCandidates(_candidates, event, goalIndex); + final bool effectiveCue = _filterCandidates(_candidates, event); if (effectiveCue) { _debugCues.add(event); } @@ -49,20 +38,20 @@ class KeyboardLayoutDetector { return; } else { _debugLog('[Debug] Keyboard layout: Candidates exhausted. Past cues:' - + _debugCuesToString(_debugCues)); + '${_debugCuesToString(_debugCues)}'); } } // Start anew: Filter based on the entire list. _candidates.addAll(_fullCandidates); _debugCues.clear(); - final bool effectiveCue = _filterCandidates(_candidates, event, goalIndex); + final bool effectiveCue = _filterCandidates(_candidates, event); if (effectiveCue) { _debugCues.add(event); } if (_candidates.isEmpty) { _debugLog('[Debug] Keyboard layout: Candidates exhausted on first try. Past cues:' - + _debugCuesToString(_debugCues)); + '${_debugCuesToString(_debugCues)}'); } } @@ -70,32 +59,30 @@ class KeyboardLayoutDetector { if (_candidates.isEmpty) { return null; } - final keyboard_layouts.LayoutInfo candidate = _candidates.first; - if (candidate.name != _debugLastLayout) { - _debugLog('[Debug] Switching to layout ${candidate.name}.'); - _debugLastLayout = candidate.name; - } - if (!_calculatedLayouts.containsKey(candidate.name)) { - _calculatedLayouts[candidate.name] = _buildLayout(candidate.mapping, candidate.name); + final keyboard_layouts.Layout candidate = _candidates.first; + if (candidate.language != _debugLastLayout) { + _debugLog('[Debug] Switching to layout ${candidate.language}.'); + _debugLastLayout = candidate.language; } - final Map map = _calculatedLayouts[candidate.name]!; + final Map map = _calculatedLayouts.putIfAbsent( + candidate.language, + () => _buildLayout(candidate.entries, candidate.language)); return map[code]; } - static bool _filterCandidates(List candidates, DomKeyboardEvent event, int goalIndex) { + static bool _filterCandidates(List candidates, DomKeyboardEvent event) { final int beforeCandidateNum = candidates.length; final bool thisIsDead = event.key == 'Dead'; final bool thisHasAltGr = event.getModifierState('AltGraph'); final bool thisHasShift = event.shiftKey; - final int index = (thisHasShift ? 1 : 0) + (thisHasAltGr ? 2 : 0); - candidates.retainWhere((keyboard_layouts.LayoutInfo element) { - final int expected = element.mapping[goalIndex][index]; + final int printableIndex = (thisHasShift ? 1 : 0) + (thisHasAltGr ? 2 : 0); + final int deadMask = 1 << printableIndex; + candidates.retainWhere((keyboard_layouts.Layout layout) { + final keyboard_layouts.LayoutEntry entry = layout.entries[event.code!]!; if (thisIsDead) { - return expected == keyboard_layouts.kDeadKey; + return (entry.deadMasks & deadMask) != 0; } else { - final String key = event.key ?? ''; - // TODO: Correctly process Utf16 - return key.length == 1 && key.codeUnitAt(0) == expected; + return entry.printables[printableIndex] == event.key; } }); final int afterCandidateNum = candidates.length; @@ -103,46 +90,52 @@ class KeyboardLayoutDetector { return afterCandidateNum < beforeCandidateNum; } - static Map _buildLayout(List> clueMap, String debugLayoutName) { + static Map _buildLayout(Map entries, String debugLayoutName) { _debugLog('Building layout for $debugLayoutName'); - final Map mandatoryGoalsByChar = {..._mandatoryGoalsByChar}; + // Unresolved mandatory goals, mapped from printables to KeyboardEvent.code. + // This map will be modified during this function and thus is a clone. + final Map mandatoryGoalsByChar = {..._mandatoryGoalsByChar}; + // The result mapping from KeyboardEvent.code to logical key. final Map result = {}; // The logical key should be the first available clue from below: // - // - Mandatory goal, if it matches any clue. This ensures that all alnum - // keys can be found somewhere. - // - US layout, if neither clue of the key is EASCII. This ensures that - // there are no non-latin logical keys. - // - Derived on the fly from keyCode & characters. - int goalIndex = 0; - keyboard_layouts.kLayoutGoals.forEach((String code, String? goalKey) { - // Skip optional goals. - if (goalKey == null) { - return; - } - final List clues = clueMap[goalIndex]; - // See if any clue on this key matches a mandatory char. - for (final int clue in clues) { - final String? foundCode = mandatoryGoalsByChar[clue]; - if (foundCode != null) { - result[code] = clue; - mandatoryGoalsByChar.remove(foundCode); - return; + // 1. Mandatory goal, if it matches any clue. This ensures that all alnum + // keys can be found somewhere. + // 2. US layout, if neither clue of the key is EASCII. This ensures that + // there are no non-latin logical keys. + // 3. Derived on the fly from keyCode & characters. + + entries.forEach((String eventCode, keyboard_layouts.LayoutEntry entry) { + // bool anyEascii = false; + for (int index = 0; index < 4; index += 1) { + // Ignore dead keys. + if (entry.deadMasks & (1 << index) != 0) { + continue; } - } - // See if all clues on this key are non-EASCII. If not, use the verbatim key. - if (!clues.any(_isEascii)) { - final int character = keyboard_layouts.kLayoutGoals[code]!.codeUnitAt(0); - result[code] = character; - mandatoryGoalsByChar.remove(character); + // A printable of this key is a mandatory goal: Use it. + final String printable = entry.printables[index]; + if (mandatoryGoalsByChar.containsKey(printable)) { + result[eventCode] = printable.codeUnitAt(0); + mandatoryGoalsByChar.remove(printable); + } + // if (_isEascii(entry.printables[index])) { + // anyEascii = true; + // } } - goalIndex += 1; + // // If all clues on this key are non-EASCII, use the verbatim key. + // if (!anyEascii) { + // final String? verbatimPrintable = kLayoutStore.goals[eventCode]; + // if (verbatimPrintable != null + // && mandatoryGoalsByChar.remove(verbatimPrintable) != null) { + // result[eventCode] = verbatimPrintable.codeUnitAt(0); + // } + // } }); // Ensure all mandatory goals are assigned. - mandatoryGoalsByChar.forEach((int character, String code) { - result[code] = character; + mandatoryGoalsByChar.forEach((String character, String code) { + result[code] = character.codeUnitAt(0); }); assert(() { print(result); @@ -151,8 +144,7 @@ class KeyboardLayoutDetector { return result; } - final Map _goalToIndex = {}; - final List _candidates = []; + final List _candidates = []; final Map> _calculatedLayouts = >{}; // Record all effective cues since the last reset. That is, cues that filtered @@ -160,19 +152,18 @@ class KeyboardLayoutDetector { final List _debugCues = []; String _debugLastLayout = ''; - static late final List _fullCandidates = keyboard_layouts.kLayouts.where( - (keyboard_layouts.LayoutInfo layout) => layout.platform == _currentPlatform, + static final List _fullCandidates = keyboard_layouts.kLayoutStore.layouts.where( + (keyboard_layouts.Layout layout) => layout.platform == _currentPlatform, ).toList(); - static late final keyboard_layouts.LayoutPlatform _currentPlatform = () { + static final keyboard_layouts.LayoutPlatform _currentPlatform = () { // TODO return keyboard_layouts.LayoutPlatform.win; }(); - static late final Map _mandatoryGoalsByChar = Map.fromEntries( - keyboard_layouts.kLayoutGoals + static final Map _mandatoryGoalsByChar = Map.fromEntries( + keyboard_layouts.kLayoutStore.goals .entries .where((MapEntry entry) => entry.value != null) - // TODO: correctly handle UTF - .map((MapEntry entry) => MapEntry(entry.value!.codeUnitAt(0), entry.key)) + .map((MapEntry entry) => MapEntry(entry.value!, entry.key)) ); static String _debugEventToString(DomKeyboardEvent event) { @@ -190,6 +181,6 @@ class KeyboardLayoutDetector { static String _debugCuesToString(List cues) { return cues.map((DomKeyboardEvent event) => - '\n ${_debugEventToString(event)}').join(''); + '\n ${_debugEventToString(event)}').join(); } } diff --git a/lib/web_ui/pubspec.yaml b/lib/web_ui/pubspec.yaml index e8c62f8cb4118..a8e02e160ac32 100644 --- a/lib/web_ui/pubspec.yaml +++ b/lib/web_ui/pubspec.yaml @@ -8,6 +8,8 @@ environment: dependencies: js: 0.6.4 meta: 1.3.0 + web_keyboard_layouts: + path: ../../third_party/web_keyboard_layouts dev_dependencies: archive: 3.1.2 @@ -43,5 +45,3 @@ dev_dependencies: path: ../../web_sdk/web_engine_tester skia_gold_client: path: ../../testing/skia_gold_client - web_keyboard_layouts: - path: ../../third_party/web_keyboard_layouts diff --git a/third_party/web_keyboard_layouts/lib/definitions.g.dart b/third_party/web_keyboard_layouts/lib/definitions.g.dart index f5889a90aaf04..546539318b414 100644 --- a/third_party/web_keyboard_layouts/lib/definitions.g.dart +++ b/third_party/web_keyboard_layouts/lib/definitions.g.dart @@ -15,7 +15,7 @@ part of web_keyboard_layouts; -final LayoutStore kCompressedBody = unmarshallStoreCompressed( +final LayoutStore kLayoutStore = unmarshallStoreCompressed( 'H4sIAAAAAAAAE+1c+XdUVba+51ShdPf7IwTbdgAEBRnUVpzneRaliRolgoAh2N2K' 'rCSEDBBkFEgCARJCGAIkjEkgsFbdKn/o1Hqv+A+e+Af4L7z9ffucW7cqlQHa99S3' 'WIuz7qnKpVK1v29/ezi7MjP5Qvk/HzOP4fK4eRyXJ8wTuDxpnsTlKfMULk+bp3F5' diff --git a/third_party/web_keyboard_layouts/lib/types.g.dart b/third_party/web_keyboard_layouts/lib/types.g.dart index e167a84ef29de..738f4ee9cedc4 100644 --- a/third_party/web_keyboard_layouts/lib/types.g.dart +++ b/third_party/web_keyboard_layouts/lib/types.g.dart @@ -71,7 +71,7 @@ class Layout { /// The platform that the browser is running on. final LayoutPlatform platform; - /// Maps from DOM `KeyboardKey.key`s to the characters they produce. + /// Maps from DOM `KeyboardKey.code`s to the characters they produce. final Map entries; } @@ -81,7 +81,7 @@ class LayoutStore { /// Create a [LayoutStore]. const LayoutStore(this.goals, this.layouts); - /// The list of goals, mapping from DOM `KeyboardKey.key` to their mandatory + /// The list of goals, mapping from DOM `KeyboardKey.code` to their mandatory /// goal characters, or null if this goal is optional. /// /// Mandatory goals are characters that must be fulfilled during keyboard @@ -197,4 +197,3 @@ LayoutEntry _unmarshallLayoutEntry(_ByteStream stream) { final int deadMasks = stream.readUint8(); return LayoutEntry(printables, deadMasks); } -; diff --git a/tools/gen_web_keyboard_layouts/data/definitions.dart.tmpl b/tools/gen_web_keyboard_layouts/data/definitions.dart.tmpl index 9a2c56fb12445..b145130fa3016 100644 --- a/tools/gen_web_keyboard_layouts/data/definitions.dart.tmpl +++ b/tools/gen_web_keyboard_layouts/data/definitions.dart.tmpl @@ -15,5 +15,5 @@ part of web_keyboard_layouts; -final LayoutStore kCompressedBody = unmarshallStoreCompressed( +final LayoutStore kLayoutStore = unmarshallStoreCompressed( @@@BODY@@@); // @@@BODY_LENGTH@@@ bytes diff --git a/tools/gen_web_keyboard_layouts/data/types.dart.tmpl b/tools/gen_web_keyboard_layouts/data/types.dart.tmpl index 23b77ef470b60..9a2723e2118e6 100644 --- a/tools/gen_web_keyboard_layouts/data/types.dart.tmpl +++ b/tools/gen_web_keyboard_layouts/data/types.dart.tmpl @@ -14,4 +14,4 @@ // See flutter/engine:flutter/tools/gen_web_keyboard_layouts/README.md for more information. part of web_keyboard_layouts; -@@@BODY@@@; +@@@BODY@@@ diff --git a/tools/gen_web_keyboard_layouts/lib/layout_types.dart b/tools/gen_web_keyboard_layouts/lib/layout_types.dart index 7f32fa964a97c..3db89d4f4354d 100644 --- a/tools/gen_web_keyboard_layouts/lib/layout_types.dart +++ b/tools/gen_web_keyboard_layouts/lib/layout_types.dart @@ -73,7 +73,7 @@ class Layout { /// The platform that the browser is running on. final LayoutPlatform platform; - /// Maps from DOM `KeyboardKey.key`s to the characters they produce. + /// Maps from DOM `KeyboardKey.code`s to the characters they produce. final Map entries; } @@ -83,7 +83,7 @@ class LayoutStore { /// Create a [LayoutStore]. const LayoutStore(this.goals, this.layouts); - /// The list of goals, mapping from DOM `KeyboardKey.key` to their mandatory + /// The list of goals, mapping from DOM `KeyboardKey.code` to their mandatory /// goal characters, or null if this goal is optional. /// /// Mandatory goals are characters that must be fulfilled during keyboard diff --git a/tools/gen_web_keyboard_layouts/lib/main.dart b/tools/gen_web_keyboard_layouts/lib/main.dart index cb41174431f41..8139596951c4a 100644 --- a/tools/gen_web_keyboard_layouts/lib/main.dart +++ b/tools/gen_web_keyboard_layouts/lib/main.dart @@ -326,7 +326,7 @@ String _readSharedSegment(String path) { } } assert(startLine < endLine); - return lines.sublist(startLine + 1, endLine).join('\n'); + return lines.sublist(startLine + 1, endLine).join('\n').trimRight(); } Future generate(Options options) async { From 9d8e1cec26f383f47ce511e42df91a80342aeb02 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Tue, 25 Oct 2022 13:28:28 -0700 Subject: [PATCH 23/74] benchmark_detector --- .../lib/benchmark_detector.dart | 146 ++++++++++++++++++ tools/gen_web_keyboard_layouts/lib/main.dart | 82 +++++----- 2 files changed, 189 insertions(+), 39 deletions(-) create mode 100644 tools/gen_web_keyboard_layouts/lib/benchmark_detector.dart diff --git a/tools/gen_web_keyboard_layouts/lib/benchmark_detector.dart b/tools/gen_web_keyboard_layouts/lib/benchmark_detector.dart new file mode 100644 index 0000000000000..6cb3c7650e7ae --- /dev/null +++ b/tools/gen_web_keyboard_layouts/lib/benchmark_detector.dart @@ -0,0 +1,146 @@ +import 'layout_types.dart'; + +const Map _kLayoutGoals = { + 'KeyA': 'A', + 'KeyB': 'B', + 'KeyC': 'C', + 'KeyD': 'D', + 'KeyE': 'E', + 'KeyF': 'F', + 'KeyG': 'G', + 'KeyH': 'H', + 'KeyI': 'I', + 'KeyJ': 'J', + 'KeyK': 'K', + 'KeyL': 'L', + 'KeyM': 'M', + 'KeyN': 'N', + 'KeyO': 'O', + 'KeyP': 'P', + 'KeyQ': 'Q', + 'KeyR': 'R', + 'KeyS': 'S', + 'KeyT': 'T', + 'KeyU': 'U', + 'KeyV': 'V', + 'KeyW': 'W', + 'KeyX': 'X', + 'KeyY': 'Y', + 'KeyZ': 'Z', + 'Digit1': '1', + 'Digit2': '2', + 'Digit3': '3', + 'Digit4': '4', + 'Digit5': '5', + 'Digit6': '6', + 'Digit7': '7', + 'Digit8': '8', + 'Digit9': '9', + 'Digit0': '0', + 'Minus': null, + 'Equal': null, + 'BracketLeft': null, + 'BracketRight': null, + 'Backslash': null, + 'Semicolon': null, + 'Quote': null, + 'Backquote': null, + 'Comma': null, + 'Period': null, + 'Slash': null, +}; + +final Map _kMandatoryGoalsByChar = Map.fromEntries( + _kLayoutGoals + .entries + .where((MapEntry entry) => entry.value != null) + .map((MapEntry entry) => MapEntry(entry.value!, entry.key)) +); + +Map _buildLayout(Map entries) { + // Unresolved mandatory goals, mapped from printables to KeyboardEvent.code. + // This map will be modified during this function and thus is a clone. + final Map mandatoryGoalsByChar = {..._kMandatoryGoalsByChar}; + // The result mapping from KeyboardEvent.code to logical key. + final Map result = {}; + // The logical key should be the first available clue from below: + // + // 1. Mandatory goal, if it matches any clue. This ensures that all alnum + // keys can be found somewhere. + // 2. US layout, if neither clue of the key is EASCII. This ensures that + // there are no non-latin logical keys. + // 3. Derived on the fly from keyCode & characters. + + entries.forEach((String eventCode, LayoutEntry entry) { + // bool anyEascii = false; + for (int index = 0; index < 4; index += 1) { + // Ignore dead keys. + if (entry.deadMasks & (1 << index) != 0) { + continue; + } + // A printable of this key is a mandatory goal: Use it. + final String printable = entry.printables[index]; + if (mandatoryGoalsByChar.containsKey(printable)) { + result[eventCode] = printable.codeUnitAt(0); + mandatoryGoalsByChar.remove(printable); + } + // if (_isEascii(entry.printables[index])) { + // anyEascii = true; + // } + } + + // // If all clues on this key are non-EASCII, use the verbatim key. + // if (!anyEascii) { + // final String? verbatimPrintable = kLayoutStore.goals[eventCode]; + // if (verbatimPrintable != null + // && mandatoryGoalsByChar.remove(verbatimPrintable) != null) { + // result[eventCode] = verbatimPrintable.codeUnitAt(0); + // } + // } + }); + + // Ensure all mandatory goals are assigned. + mandatoryGoalsByChar.forEach((String character, String code) { + result[code] = character.codeUnitAt(0); + }); + // assert(() { + // print(result); + // return true; + // }()); + return result; +} + +class _ResultRecord { + _ResultRecord(this.logicalKey, this.language); + + final int logicalKey; + final String language; +} + +// Return a map of EventCode -> EventKey -> logicalKey +void buildMap(Iterable layouts) { + final Map> result = >{}; + for (final Layout layout in layouts) { + _buildLayout(layout.entries).forEach((String eventCode, int logicalKey) { + final Map codeMap = result.putIfAbsent(eventCode, () => {}); + final LayoutEntry entry = layout.entries[eventCode]!; + for (int charIndex = 0; charIndex < 4; charIndex += 1) { + final bool isDeadKey = entry.deadMasks & (1 << charIndex) != 0; + final String printable = entry.printables[charIndex]; + if (!isDeadKey && printable.isEmpty) { + continue; + } + final String eventKey = isDeadKey ? 'Deadkey' : printable; + if (codeMap.containsKey(eventKey) && codeMap[eventKey]!.logicalKey != logicalKey) { + print('Error assigning ($eventCode, $eventKey) as ' + '0x${logicalKey.toRadixString(16)} (${layout.language}): ' + 'already assigned as 0x${codeMap[eventKey]!.logicalKey.toRadixString(16)} ' + '(${codeMap[eventKey]!.language})'); + } else { + codeMap[eventKey] = _ResultRecord(logicalKey, layout.language); + } + } + }); + } + // return result; +} diff --git a/tools/gen_web_keyboard_layouts/lib/main.dart b/tools/gen_web_keyboard_layouts/lib/main.dart index 8139596951c4a..5ef68f815f73d 100644 --- a/tools/gen_web_keyboard_layouts/lib/main.dart +++ b/tools/gen_web_keyboard_layouts/lib/main.dart @@ -9,8 +9,8 @@ import 'package:http/http.dart' as http; import 'package:meta/meta.dart' show immutable; import 'package:path/path.dart' as path; +import 'benchmark_detector.dart'; import 'data.dart'; - import 'json_get.dart'; import 'layout_types.dart'; @@ -363,42 +363,46 @@ Future generate(Options options) async { // Build store. final LayoutStore store = LayoutStore(kLayoutGoals, layouts); - final String body = marshallStoreCompressed(store); - - // Verify that the store can be unmarshalled correctly. - // Inconcistencies will cause exceptions. - verifyLayoutStoreEqual(store, unmarshallStoreCompressed(body)); - - // Generate the definition file. - _writeFileTo( - options.outputRoot, - 'definitions.g.dart', - _renderTemplate( - File(path.join(options.dataRoot, 'definitions.dart.tmpl')).readAsStringSync(), - { - 'COMMIT_ID': commitId, - 'BODY': _prettyPrintBody(body, 64), - 'BODY_LENGTH': '${body.length}', - }, - ), - ); - - // Generate the type file. - _writeFileTo( - options.outputRoot, - 'types.g.dart', - _renderTemplate( - File(path.join(options.dataRoot, 'types.dart.tmpl')).readAsStringSync(), - { - 'BODY': _readSharedSegment(path.join(options.libRoot, 'layout_types.dart')), - }, - ), - ); - - // Generate the JSON file. - _writeFileTo( - options.dataRoot, - 'definitions_uncompressed.g.json', - const JsonEncoder.withIndent(' ').convert(jsonifyStore(store)), - ); + buildMap(store.layouts.where((Layout layout) => layout.platform == LayoutPlatform.win)); + buildMap(store.layouts.where((Layout layout) => layout.platform == LayoutPlatform.linux)); + buildMap(store.layouts.where((Layout layout) => layout.platform == LayoutPlatform.darwin)); + + // final String body = marshallStoreCompressed(store); + + // // Verify that the store can be unmarshalled correctly. + // // Inconcistencies will cause exceptions. + // verifyLayoutStoreEqual(store, unmarshallStoreCompressed(body)); + + // // Generate the definition file. + // _writeFileTo( + // options.outputRoot, + // 'definitions.g.dart', + // _renderTemplate( + // File(path.join(options.dataRoot, 'definitions.dart.tmpl')).readAsStringSync(), + // { + // 'COMMIT_ID': commitId, + // 'BODY': _prettyPrintBody(body, 64), + // 'BODY_LENGTH': '${body.length}', + // }, + // ), + // ); + + // // Generate the type file. + // _writeFileTo( + // options.outputRoot, + // 'types.g.dart', + // _renderTemplate( + // File(path.join(options.dataRoot, 'types.dart.tmpl')).readAsStringSync(), + // { + // 'BODY': _readSharedSegment(path.join(options.libRoot, 'layout_types.dart')), + // }, + // ), + // ); + + // // Generate the JSON file. + // _writeFileTo( + // options.dataRoot, + // 'definitions_uncompressed.g.json', + // const JsonEncoder.withIndent(' ').convert(jsonifyStore(store)), + // ); } From ca874730b8545a53248587ffaa827ca331a723b8 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Tue, 25 Oct 2022 13:35:56 -0700 Subject: [PATCH 24/74] Move github to separate file --- .../gen_web_keyboard_layouts/lib/github.dart | 281 ++++++++++++++++++ tools/gen_web_keyboard_layouts/lib/main.dart | 266 +---------------- 2 files changed, 286 insertions(+), 261 deletions(-) create mode 100644 tools/gen_web_keyboard_layouts/lib/github.dart diff --git a/tools/gen_web_keyboard_layouts/lib/github.dart b/tools/gen_web_keyboard_layouts/lib/github.dart new file mode 100644 index 0000000000000..d6d7870e3d989 --- /dev/null +++ b/tools/gen_web_keyboard_layouts/lib/github.dart @@ -0,0 +1,281 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + + +import 'dart:convert'; +import 'dart:io'; +import 'package:http/http.dart' as http; +import 'package:meta/meta.dart' show immutable; +import 'package:path/path.dart' as path; + +import 'data.dart'; +import 'json_get.dart'; +import 'layout_types.dart'; + +/// Signature for function that asynchonously returns a value. +typedef AsyncGetter = Future Function(); + +const String githubCacheFileName = 'github-response.json'; +const String githubTargetFolder = 'src/vs/workbench/services/keybinding/browser/keyboardLayouts'; + +const String githubQuery = ''' +{ + repository(owner: "microsoft", name: "vscode") { + defaultBranchRef { + target { + ... on Commit { + history(first: 1) { + nodes { + oid + file(path: "$githubTargetFolder") { + extension lineCount object { + ... on Tree { + entries { + name object { + ... on Blob { + text + } + } + } + } + } + } + } + } + } + } + } + } +} +'''; + +/// All goals in the form of KeyboardEvent.key. +final List kGoalKeys = kLayoutGoals.keys.toList(); + +/// A map from the key of `kLayoutGoals` (KeyboardEvent.key) to an +/// auto-incremental index. +final Map kGoalToIndex = Map.fromEntries( + kGoalKeys.asMap().entries.map( + (MapEntry entry) => MapEntry(entry.value, entry.key)), +); + +/// Retrieve a string using the procedure defined by `ifNotExist` based on the +/// cache file at `cachePath`. +/// +/// If `forceRefresh` is false, this function tries to read the cache file, calls +/// `ifNotExist` when necessary, and writes the result to the cache. +/// +/// If `forceRefresh` is true, this function never read the cache file, always +/// calls `ifNotExist` when necessary, and still writes the result to the cache. +/// +/// Exceptions from `ifNotExist` will be thrown, while exceptions related to +/// caching are only printed. +Future _tryCached(String cachePath, bool forceRefresh, AsyncGetter ifNotExist) async { + final File cacheFile = File(cachePath); + if (!forceRefresh && cacheFile.existsSync()) { + try { + final String result = cacheFile.readAsStringSync(); + print('Using GitHub cache.'); + return result; + } catch (exception) { + print('Error reading GitHub cache, rebuilding. Details: $exception'); + } + } + final String result = await ifNotExist(); + IOSink? sink; + try { + print('Requesting from GitHub...'); + Directory(path.dirname(cachePath)).createSync(recursive: true); + sink = cacheFile.openWrite(); + cacheFile.writeAsStringSync(result); + } catch (exception) { + print('Error writing GitHub cache. Details: $exception'); + } finally { + sink?.close(); + } + return result; +} + +Future> _fetchGithub(String githubToken, bool forceRefresh, String cachePath) async { + final String response = await _tryCached(cachePath, forceRefresh, () async { + final String condensedQuery = githubQuery + .replaceAll(RegExp(r'\{ +'), '{') + .replaceAll(RegExp(r' +\}'), '}'); + final http.Response response = await http.post( + Uri.parse('https://api.github.com/graphql'), + headers: { + 'Content-Type': 'application/json; charset=UTF-8', + 'Authorization': 'bearer $githubToken', + }, + body: jsonEncode({ + 'query': condensedQuery, + }), + ); + if (response.statusCode != 200) { + throw Exception('Request to GitHub failed with status code ${response.statusCode}: ${response.reasonPhrase}'); + } + return response.body; + }); + return jsonDecode(response) as Map; +} + +@immutable +class _GitHubFile { + const _GitHubFile({required this.name, required this.content}); + + final String name; + final String content; +} + +_GitHubFile _jsonGetGithubFile(JsonContext files, int index) { + final JsonContext file = jsonGetIndex(files, index); + return _GitHubFile( + name: jsonGetKey(file, 'name').current, + content: jsonGetPath(file, 'object.text').current, + ); +} + +String _parsePrintable(String rawString) { + // Parse a char represented in unicode hex, such as \u001b. + final RegExp hexParser = RegExp(r'^\\u([0-9a-fA-F]+)$'); + + if (rawString.isEmpty) { + return ''; + } + final RegExpMatch? hexMatch = hexParser.firstMatch(rawString); + if (hexMatch != null) { + final int codeUnit = int.parse(hexMatch.group(1)!, radix: 16); + return String.fromCharCode(codeUnit); + } + return const { + r'\\': r'\', + r'\r': '\r', + r'\b': '\b', + r'\t': '\t', + r"\'": "'", + }[rawString] ?? rawString; +} + +LayoutPlatform _platformFromGithubString(String origin) { + switch (origin) { + case 'win': + return LayoutPlatform.win; + case 'linux': + return LayoutPlatform.linux; + case 'darwin': + return LayoutPlatform.darwin; + default: + throw ArgumentError('Unexpected platform "$origin".'); + } +} + +Layout _parseLayoutFromGithubFile(_GitHubFile file) { + final Map entries = {}; + + // Parse a line that looks like the following, and get its key as well as + // the content within the square bracket. + // + // F19: [], + // KeyZ: ['y', 'Y', '', '', 0, 'VK_Y'], + final RegExp lineParser = RegExp(r'^[ \t]*(.+?): \[(.*)\],$'); + // Parse each child of the content within the square bracket. + final RegExp listParser = RegExp(r"^'(.*?)', '(.*?)', '(.*?)', '(.*?)', (\d)(?:, '(.+)')?$"); + file.content.split('\n').forEach((String line) { + final RegExpMatch? lineMatch = lineParser.firstMatch(line); + if (lineMatch == null) { + return; + } + // KeyboardKey.key, such as "KeyZ". + final String eventKey = lineMatch.group(1)!; + // Only record goals. + if (!kGoalToIndex.containsKey(eventKey)) { + return; + } + + // Comma-separated definition as a string, such as "'y', 'Y', '', '', 0, 'VK_Y'". + final String definition = lineMatch.group(2)!; + if (definition.isEmpty) { + return; + } + // Group 1-4 are single strings for an entry, such as "y", "", "\u001b". + // Group 5 is the dead mask. + final RegExpMatch? listMatch = listParser.firstMatch(definition); + assert(listMatch != null, 'Unable to match $definition'); + final int deadMask = int.parse(listMatch!.group(5)!, radix: 10); + + entries[eventKey] = LayoutEntry( + [ + _parsePrintable(listMatch.group(1)!), + _parsePrintable(listMatch.group(2)!), + _parsePrintable(listMatch.group(3)!), + _parsePrintable(listMatch.group(4)!), + ], + deadMask, + ); + }); + + for (final String goalKey in kGoalKeys) { + entries.putIfAbsent(goalKey, () => LayoutEntry.empty); + } + + // Parse the file name, which looks like "en-belgian.win.ts". + final RegExp fileNameParser = RegExp(r'^([^.]+)\.([^.]+)\.ts$'); + late final Layout layout; + try { + final RegExpMatch? match = fileNameParser.firstMatch(file.name); + final String layoutName = match!.group(1)!; + final LayoutPlatform platform = _platformFromGithubString(match.group(2)!); + layout = Layout(layoutName, platform, entries); + } catch (exception) { + throw ArgumentError('Unrecognizable file name ${file.name}.'); + } + return layout; +} + +int _sortLayout(Layout a, Layout b) { + int result = a.language.compareTo(b.language); + if (result == 0) { + result = a.platform.index.compareTo(b.platform.index); + } + return result; +} + +Future> fetchFromGithub({ + required String githubToken, + required bool force, + required String cacheRoot, +}) async { + // Fetch files from GitHub. + final Map githubBody = await _fetchGithub( + githubToken, + force, + path.join(cacheRoot, githubCacheFileName), + ); + + // Parse the result from GitHub. + final JsonContext commitJson = jsonGetPath( + JsonContext.root(githubBody), + 'data.repository.defaultBranchRef.target.history.nodes.0', + ); + // final String commitId = jsonGetKey(commitJson, 'oid').current; + final JsonContext fileListJson = jsonGetPath( + commitJson, + 'file.object.entries', + ); + final Iterable<_GitHubFile> files = Iterable<_GitHubFile>.generate( + fileListJson.current.length, + (int index) => _jsonGetGithubFile(fileListJson, index), + ).where( + // Exclude controlling files, which contain no layout information. + (_GitHubFile file) => !file.name.startsWith('layout.contribution.') + && !file.name.startsWith('_.contribution'), + ); + + // Layouts must be sorted to ensure that the output file has a fixed order. + final List layouts = files.map(_parseLayoutFromGithubFile) + .toList() + ..sort(_sortLayout); + + return layouts; +} diff --git a/tools/gen_web_keyboard_layouts/lib/main.dart b/tools/gen_web_keyboard_layouts/lib/main.dart index 5ef68f815f73d..be960797f4141 100644 --- a/tools/gen_web_keyboard_layouts/lib/main.dart +++ b/tools/gen_web_keyboard_layouts/lib/main.dart @@ -3,64 +3,15 @@ // found in the LICENSE file. -import 'dart:convert'; import 'dart:io'; -import 'package:http/http.dart' as http; import 'package:meta/meta.dart' show immutable; import 'package:path/path.dart' as path; import 'benchmark_detector.dart'; import 'data.dart'; -import 'json_get.dart'; +import 'github.dart'; import 'layout_types.dart'; -/// Signature for function that asynchonously returns a value. -typedef AsyncGetter = Future Function(); - -const String githubCacheFileName = 'github-response.json'; -const String githubTargetFolder = 'src/vs/workbench/services/keybinding/browser/keyboardLayouts'; - -const String githubQuery = ''' -{ - repository(owner: "microsoft", name: "vscode") { - defaultBranchRef { - target { - ... on Commit { - history(first: 1) { - nodes { - oid - file(path: "$githubTargetFolder") { - extension lineCount object { - ... on Tree { - entries { - name object { - ... on Blob { - text - } - } - } - } - } - } - } - } - } - } - } - } -} -'''; - -/// All goals in the form of KeyboardEvent.key. -final List kGoalKeys = kLayoutGoals.keys.toList(); - -/// A map from the key of `kLayoutGoals` (KeyboardEvent.key) to an -/// auto-incremental index. -final Map kGoalToIndex = Map.fromEntries( - kGoalKeys.asMap().entries.map( - (MapEntry entry) => MapEntry(entry.value, entry.key)), -); - @immutable class Options { /// Build an option. @@ -92,166 +43,6 @@ class Options { final String outputRoot; } -/// Retrieve a string using the procedure defined by `ifNotExist` based on the -/// cache file at `cachePath`. -/// -/// If `forceRefresh` is false, this function tries to read the cache file, calls -/// `ifNotExist` when necessary, and writes the result to the cache. -/// -/// If `forceRefresh` is true, this function never read the cache file, always -/// calls `ifNotExist` when necessary, and still writes the result to the cache. -/// -/// Exceptions from `ifNotExist` will be thrown, while exceptions related to -/// caching are only printed. -Future _tryCached(String cachePath, bool forceRefresh, AsyncGetter ifNotExist) async { - final File cacheFile = File(cachePath); - if (!forceRefresh && cacheFile.existsSync()) { - try { - final String result = cacheFile.readAsStringSync(); - print('Using GitHub cache.'); - return result; - } catch (exception) { - print('Error reading GitHub cache, rebuilding. Details: $exception'); - } - } - final String result = await ifNotExist(); - IOSink? sink; - try { - print('Requesting from GitHub...'); - Directory(path.dirname(cachePath)).createSync(recursive: true); - sink = cacheFile.openWrite(); - cacheFile.writeAsStringSync(result); - } catch (exception) { - print('Error writing GitHub cache. Details: $exception'); - } finally { - sink?.close(); - } - return result; -} - -Future> _fetchGithub(String githubToken, bool forceRefresh, String cachePath) async { - final String response = await _tryCached(cachePath, forceRefresh, () async { - final String condensedQuery = githubQuery - .replaceAll(RegExp(r'\{ +'), '{') - .replaceAll(RegExp(r' +\}'), '}'); - final http.Response response = await http.post( - Uri.parse('https://api.github.com/graphql'), - headers: { - 'Content-Type': 'application/json; charset=UTF-8', - 'Authorization': 'bearer $githubToken', - }, - body: jsonEncode({ - 'query': condensedQuery, - }), - ); - if (response.statusCode != 200) { - throw Exception('Request to GitHub failed with status code ${response.statusCode}: ${response.reasonPhrase}'); - } - return response.body; - }); - return jsonDecode(response) as Map; -} - -@immutable -class _GitHubFile { - const _GitHubFile({required this.name, required this.content}); - - final String name; - final String content; -} - -_GitHubFile _jsonGetGithubFile(JsonContext files, int index) { - final JsonContext file = jsonGetIndex(files, index); - return _GitHubFile( - name: jsonGetKey(file, 'name').current, - content: jsonGetPath(file, 'object.text').current, - ); -} - -String _parsePrintable(String rawString) { - // Parse a char represented in unicode hex, such as \u001b. - final RegExp hexParser = RegExp(r'^\\u([0-9a-fA-F]+)$'); - - if (rawString.isEmpty) { - return ''; - } - final RegExpMatch? hexMatch = hexParser.firstMatch(rawString); - if (hexMatch != null) { - final int codeUnit = int.parse(hexMatch.group(1)!, radix: 16); - return String.fromCharCode(codeUnit); - } - return const { - r'\\': r'\', - r'\r': '\r', - r'\b': '\b', - r'\t': '\t', - r"\'": "'", - }[rawString] ?? rawString; -} - -Layout _parseLayoutFromGithubFile(_GitHubFile file) { - final Map entries = {}; - - // Parse a line that looks like the following, and get its key as well as - // the content within the square bracket. - // - // F19: [], - // KeyZ: ['y', 'Y', '', '', 0, 'VK_Y'], - final RegExp lineParser = RegExp(r'^[ \t]*(.+?): \[(.*)\],$'); - // Parse each child of the content within the square bracket. - final RegExp listParser = RegExp(r"^'(.*?)', '(.*?)', '(.*?)', '(.*?)', (\d)(?:, '(.+)')?$"); - file.content.split('\n').forEach((String line) { - final RegExpMatch? lineMatch = lineParser.firstMatch(line); - if (lineMatch == null) { - return; - } - // KeyboardKey.key, such as "KeyZ". - final String eventKey = lineMatch.group(1)!; - // Only record goals. - if (!kGoalToIndex.containsKey(eventKey)) { - return; - } - - // Comma-separated definition as a string, such as "'y', 'Y', '', '', 0, 'VK_Y'". - final String definition = lineMatch.group(2)!; - if (definition.isEmpty) { - return; - } - // Group 1-4 are single strings for an entry, such as "y", "", "\u001b". - // Group 5 is the dead mask. - final RegExpMatch? listMatch = listParser.firstMatch(definition); - assert(listMatch != null, 'Unable to match $definition'); - final int deadMask = int.parse(listMatch!.group(5)!, radix: 10); - - entries[eventKey] = LayoutEntry( - [ - _parsePrintable(listMatch.group(1)!), - _parsePrintable(listMatch.group(2)!), - _parsePrintable(listMatch.group(3)!), - _parsePrintable(listMatch.group(4)!), - ], - deadMask, - ); - }); - - for (final String goalKey in kGoalKeys) { - entries.putIfAbsent(goalKey, () => LayoutEntry.empty); - } - - // Parse the file name, which looks like "en-belgian.win.ts". - final RegExp fileNameParser = RegExp(r'^([^.]+)\.([^.]+)\.ts$'); - late final Layout layout; - try { - final RegExpMatch? match = fileNameParser.firstMatch(file.name); - final String layoutName = match!.group(1)!; - final LayoutPlatform platform = _platformFromGithubString(match.group(2)!); - layout = Layout(layoutName, platform, entries); - } catch (exception) { - throw ArgumentError('Unrecognizable file name ${file.name}.'); - } - return layout; -} - String _renderTemplate( String template, Map dictionary) { String result = template; @@ -275,27 +66,6 @@ void _writeFileTo( } -LayoutPlatform _platformFromGithubString(String origin) { - switch (origin) { - case 'win': - return LayoutPlatform.win; - case 'linux': - return LayoutPlatform.linux; - case 'darwin': - return LayoutPlatform.darwin; - default: - throw ArgumentError('Unexpected platform "$origin".'); - } -} - -int _sortLayout(Layout a, Layout b) { - int result = a.language.compareTo(b.language); - if (result == 0) { - result = a.platform.index.compareTo(b.platform.index); - } - return result; -} - String _prettyPrintBody(String body, int width) { int min(int a, int b) { return a < b ? a : b; @@ -330,37 +100,11 @@ String _readSharedSegment(String path) { } Future generate(Options options) async { - // Fetch files from GitHub. - final Map githubBody = await _fetchGithub( - options.githubToken, - options.force, - path.join(options.cacheRoot, githubCacheFileName), - ); - - // Parse the result from GitHub. - final JsonContext commitJson = jsonGetPath( - JsonContext.root(githubBody), - 'data.repository.defaultBranchRef.target.history.nodes.0', - ); - final String commitId = jsonGetKey(commitJson, 'oid').current; - final JsonContext fileListJson = jsonGetPath( - commitJson, - 'file.object.entries', + final List layouts = await fetchFromGithub( + githubToken: options.githubToken, + force: options.force, + cacheRoot: options.cacheRoot, ); - final Iterable<_GitHubFile> files = Iterable<_GitHubFile>.generate( - fileListJson.current.length, - (int index) => _jsonGetGithubFile(fileListJson, index), - ).where( - // Exclude controlling files, which contain no layout information. - (_GitHubFile file) => !file.name.startsWith('layout.contribution.') - && !file.name.startsWith('_.contribution'), - ); - - // Layouts must be sorted to ensure that the output file has a fixed order. - final List layouts = files.map(_parseLayoutFromGithubFile) - .toList() - ..sort(_sortLayout); - // Build store. final LayoutStore store = LayoutStore(kLayoutGoals, layouts); buildMap(store.layouts.where((Layout layout) => layout.platform == LayoutPlatform.win)); From b894f719fefda801dd9af82d2710f8f2b4712749 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 31 Oct 2022 00:49:57 -0700 Subject: [PATCH 25/74] Generate full mapping --- lib/web_ui/lib/src/engine/key_mappings.g.dart | 1652 +++++++++++++++++ .../bin/gen_web_keyboard_layouts.dart | 2 +- ...tions.dart.tmpl => key_mappings.dart.tmpl} | 7 +- .../lib/benchmark_detector.dart | 35 +- tools/gen_web_keyboard_layouts/lib/main.dart | 74 +- 5 files changed, 1736 insertions(+), 34 deletions(-) create mode 100644 lib/web_ui/lib/src/engine/key_mappings.g.dart rename tools/gen_web_keyboard_layouts/data/{definitions.dart.tmpl => key_mappings.dart.tmpl} (74%) diff --git a/lib/web_ui/lib/src/engine/key_mappings.g.dart b/lib/web_ui/lib/src/engine/key_mappings.g.dart new file mode 100644 index 0000000000000..3df8a33a71272 --- /dev/null +++ b/lib/web_ui/lib/src/engine/key_mappings.g.dart @@ -0,0 +1,1652 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. + +// DO NOT EDIT -- DO NOT EDIT -- DO NOT EDIT +// +// This file is auto generated by flutter/engine:flutter/tools/gen_web_keyboard_layouts based on +// https://github.com/microsoft/vscode/tree/@@@COMMIT_ID@@@/src/vs/workbench/services/keybinding/browser/keyboardLayouts +// +// Edit the following files instead: +// +// - Script: lib/main.dart +// - Templates: data/*.tmpl +// +// See flutter/engine:flutter/tools/gen_web_keyboard_layouts/README.md for more information. + +final Map> kWinMapping = >{ + 'Backquote': { + '0': 0x30, + '§': 0x30, + }, + 'Digit0': { + ')': 0x30, + '0': 0x30, + '=': 0x30, + '@': 0x30, + '}': 0x30, + 'à': 0x30, + 'é': 0x30, + '˝': 0x30, + 'จ': 0x30, + '๗': 0x30, + '’': 0x30, + }, + 'Digit1': { + '!': 0x31, + '&': 0x31, + "'": 0x31, + '+': 0x31, + '1': 0x31, + '>': 0x31, + '|': 0x31, + '~': 0x31, + '¡': 0x31, + '¦': 0x31, + '¹': 0x31, + 'ๅ': 0x31, + }, + 'Digit2': { + '"': 0x32, + "'": 0x32, + '/': 0x32, + '2': 0x32, + '@': 0x32, + '~': 0x32, + '£': 0x32, + '²': 0x32, + 'é': 0x32, + 'ě': 0x32, + 'ˇ': 0x32, + '๑': 0x32, + }, + 'Digit3': { + '"': 0x33, + '#': 0x33, + '*': 0x33, + '+': 0x33, + '-': 0x33, + '3': 0x33, + '^': 0x33, + '£': 0x33, + '§': 0x33, + '³': 0x33, + '·': 0x33, + 'š': 0x33, + '๒': 0x33, + '№': 0x33, + }, + 'Digit4': { + '!': 0x34, + r'$': 0x34, + "'": 0x34, + '+': 0x34, + '4': 0x34, + ';': 0x34, + '{': 0x34, + '~': 0x34, + '£': 0x34, + '¤': 0x34, + '§': 0x34, + '°': 0x34, + 'ç': 0x34, + 'č': 0x34, + '˘': 0x34, + 'ภ': 0x34, + '๓': 0x34, + '€': 0x34, + '₹': 0x34, + }, + 'Digit5': { + '%': 0x35, + '(': 0x35, + '5': 0x35, + '[': 0x35, + '¢': 0x35, + '§': 0x35, + '°': 0x35, + '½': 0x35, + 'ř': 0x35, + 'ถ': 0x35, + '๔': 0x35, + '€': 0x35, + }, + 'Digit6': { + '&': 0x36, + '-': 0x36, + '/': 0x36, + '6': 0x36, + ':': 0x36, + '^': 0x36, + '|': 0x36, + '§': 0x36, + '¨': 0x36, + '¬': 0x36, + '¼': 0x36, + 'ž': 0x36, + 'ˆ': 0x36, + '˛': 0x36, + 'ุ': 0x36, + 'ู': 0x36, + }, + 'Digit7': { + '&': 0x37, + '/': 0x37, + '7': 0x37, + '=': 0x37, + '?': 0x37, + '`': 0x37, + '{': 0x37, + '|': 0x37, + '½': 0x37, + 'è': 0x37, + 'ý': 0x37, + 'ึ': 0x37, + '฿': 0x37, + }, + 'Digit8': { + '!': 0x38, + '(': 0x38, + '*': 0x38, + '8': 0x38, + '[': 0x38, + r'\': 0x38, + '_': 0x38, + '¢': 0x38, + '¾': 0x38, + 'á': 0x38, + '˙': 0x38, + 'ค': 0x38, + '๕': 0x38, + '₽': 0x38, + }, + 'Digit9': { + '(': 0x39, + ')': 0x39, + '9': 0x39, + ']': 0x39, + '^': 0x39, + '{': 0x39, + '´': 0x39, + 'ç': 0x39, + 'í': 0x39, + '˘': 0x39, + 'ต': 0x39, + '๖': 0x39, + '‘': 0x39, + }, + 'KeyA': { + 'A': 0x41, + 'Q': 0x51, + 'a': 0x41, + 'q': 0x51, + 'Á': 0x41, + 'Æ': 0x41, + 'á': 0x41, + 'ä': 0x41, + 'æ': 0x41, + 'Ā': 0x41, + 'ā': 0x41, + 'Ą': 0x41, + 'ą': 0x41, + 'Ф': 0x41, + 'ф': 0x41, + 'ฟ': 0x41, + 'ฤ': 0x41, + }, + 'KeyB': { + 'B': 0x42, + 'b': 0x42, + '{': 0x42, + 'И': 0x42, + 'и': 0x42, + 'ิ': 0x42, + 'ฺ': 0x42, + }, + 'KeyC': { + '&': 0x43, + 'C': 0x43, + 'c': 0x43, + '¢': 0x43, + '©': 0x43, + 'Ć': 0x43, + 'ć': 0x43, + 'С': 0x43, + 'с': 0x43, + 'ฉ': 0x43, + 'แ': 0x43, + '₢': 0x43, + }, + 'KeyD': { + 'D': 0x44, + 'd': 0x44, + 'Ð': 0x44, + 'ð': 0x44, + 'Đ': 0x44, + 'В': 0x44, + 'в': 0x44, + 'ก': 0x44, + 'ฏ': 0x44, + 'Ḍ': 0x44, + 'ḍ': 0x44, + }, + 'KeyE': { + 'E': 0x45, + 'e': 0x45, + '°': 0x45, + 'Ä': 0x45, + 'É': 0x45, + 'é': 0x45, + 'Ē': 0x45, + 'ē': 0x45, + 'Ę': 0x45, + 'ę': 0x45, + 'У': 0x45, + 'у': 0x45, + 'ฎ': 0x45, + 'ำ': 0x45, + '€': 0x45, + }, + 'KeyF': { + 'F': 0x46, + '[': 0x46, + 'f': 0x46, + 'А': 0x46, + 'а': 0x46, + 'ด': 0x46, + 'โ': 0x46, + }, + 'KeyG': { + 'G': 0x47, + ']': 0x47, + 'g': 0x47, + 'П': 0x47, + 'п': 0x47, + 'ฌ': 0x47, + 'เ': 0x47, + 'Ṅ': 0x47, + 'ṅ': 0x47, + }, + 'KeyH': { + 'H': 0x48, + 'h': 0x48, + 'Р': 0x48, + 'р': 0x48, + '็': 0x48, + '้': 0x48, + 'Ḥ': 0x48, + 'ḥ': 0x48, + }, + 'KeyI': { + 'I': 0x49, + 'i': 0x49, + 'Í': 0x49, + 'í': 0x49, + 'Ī': 0x49, + 'ī': 0x49, + 'İ': 0x49, + 'ı': 0x49, + 'Ш': 0x49, + 'ш': 0x49, + 'ณ': 0x49, + 'ร': 0x49, + }, + 'KeyJ': { + 'J': 0x4a, + 'j': 0x4a, + 'í': 0x4a, + 'О': 0x4a, + 'о': 0x4a, + '่': 0x4a, + '๋': 0x4a, + }, + 'KeyK': { + 'K': 0x4b, + 'k': 0x4b, + 'ł': 0x4b, + 'Л': 0x4b, + 'л': 0x4b, + 'ษ': 0x4b, + 'า': 0x4b, + }, + 'KeyL': { + 'L': 0x4c, + 'L̥': 0x4c, + 'l': 0x4c, + 'l̥': 0x4c, + 'Ø': 0x4c, + 'ø': 0x4c, + 'Ł': 0x4c, + 'ł': 0x4c, + 'Д': 0x4c, + 'д': 0x4c, + 'ศ': 0x4c, + 'ส': 0x4c, + }, + 'KeyM': { + '<': 0x4d, + '?': 0x4d, + 'M': 0x4d, + 'm': 0x4d, + 'µ': 0x4d, + 'Ь': 0x4d, + 'ь': 0x4d, + 'ท': 0x4d, + 'Ṁ': 0x4d, + 'ṁ': 0x4d, + }, + 'KeyN': { + 'N': 0x4e, + 'n': 0x4e, + '}': 0x4e, + 'Ñ': 0x4e, + 'ñ': 0x4e, + 'Ń': 0x4e, + 'ń': 0x4e, + 'Т': 0x4e, + 'т': 0x4e, + 'ื': 0x4e, + '์': 0x4e, + 'Ṇ': 0x4e, + 'ṇ': 0x4e, + }, + 'KeyO': { + 'O': 0x4f, + 'o': 0x4f, + 'Ó': 0x4f, + 'ó': 0x4f, + 'Ō': 0x4f, + 'ō': 0x4f, + 'Щ': 0x4f, + 'щ': 0x4f, + 'น': 0x4f, + 'ฯ': 0x4f, + }, + 'KeyP': { + 'P': 0x50, + 'p': 0x50, + 'Ö': 0x50, + 'ö': 0x50, + 'З': 0x50, + 'з': 0x50, + 'ญ': 0x50, + 'ย': 0x50, + }, + 'KeyQ': { + '/': 0x51, + '@': 0x51, + 'A': 0x41, + 'Q': 0x51, + r'\': 0x51, + 'a': 0x41, + 'q': 0x51, + 'Ä': 0x51, + 'Æ': 0x51, + 'ä': 0x51, + 'æ': 0x51, + 'Й': 0x51, + 'й': 0x51, + 'ๆ': 0x51, + '๐': 0x51, + }, + 'KeyR': { + 'R': 0x52, + 'R̥': 0x52, + 'r': 0x52, + 'r̥': 0x52, + '®': 0x52, + 'К': 0x52, + 'к': 0x52, + 'ฑ': 0x52, + 'พ': 0x52, + }, + 'KeyS': { + 'S': 0x53, + 's': 0x53, + '§': 0x53, + 'ß': 0x53, + 'đ': 0x53, + 'Ś': 0x53, + 'ś': 0x53, + 'Ы': 0x53, + 'ы': 0x53, + 'ฆ': 0x53, + 'ห': 0x53, + }, + 'KeyT': { + 'T': 0x54, + 't': 0x54, + 'Þ': 0x54, + 'þ': 0x54, + 'Е': 0x54, + 'е': 0x54, + 'ธ': 0x54, + 'ะ': 0x54, + 'Ṭ': 0x54, + 'ṭ': 0x54, + '₺': 0x54, + }, + 'KeyU': { + 'U': 0x55, + 'u': 0x55, + 'Ú': 0x55, + 'ú': 0x55, + 'Ū': 0x55, + 'ū': 0x55, + 'Г': 0x55, + 'г': 0x55, + 'ี': 0x55, + '๊': 0x55, + '€': 0x55, + }, + 'KeyV': { + '@': 0x56, + 'V': 0x56, + 'v': 0x56, + 'М': 0x56, + 'м': 0x56, + 'อ': 0x56, + 'ฮ': 0x56, + }, + 'KeyW': { + '"': 0x57, + '?': 0x57, + 'W': 0x57, + 'Z': 0x5a, + 'w': 0x57, + 'z': 0x5a, + '|': 0x57, + 'Å': 0x57, + 'å': 0x57, + 'Ц': 0x57, + 'ц': 0x57, + 'ไ': 0x57, + }, + 'KeyX': { + '#': 0x58, + ')': 0x58, + 'X': 0x58, + 'x': 0x58, + 'Ź': 0x58, + 'ź': 0x58, + 'Ч': 0x58, + 'ч': 0x58, + 'ป': 0x58, + 'Ṣ': 0x58, + 'ṣ': 0x58, + }, + 'KeyY': { + 'Y': 0x59, + 'Z': 0x5a, + 'y': 0x59, + 'z': 0x5a, + 'Ñ': 0x59, + 'Ü': 0x59, + 'ñ': 0x59, + 'ü': 0x59, + 'Н': 0x59, + 'н': 0x59, + 'ั': 0x59, + 'ํ': 0x59, + }, + 'KeyZ': { + '(': 0x5a, + '>': 0x59, + 'W': 0x57, + 'Y': 0x59, + 'Z': 0x5a, + 'w': 0x57, + 'y': 0x59, + 'z': 0x5a, + 'Æ': 0x5a, + 'æ': 0x5a, + 'Ż': 0x5a, + 'ż': 0x5a, + 'Я': 0x5a, + 'я': 0x5a, + 'ผ': 0x5a, + }, + 'Semicolon': { + 'M': 0x4d, + 'm': 0x4d, + }, +}; + +final Map> kLinuxMapping = >{ + 'Digit0': { + ')': 0x30, + '0': 0x30, + '=': 0x30, + '@': 0x30, + '}': 0x30, + '°': 0x30, + 'à': 0x30, + }, + 'Digit1': { + '!': 0x31, + '&': 0x31, + '1': 0x31, + '|': 0x31, + '¡': 0x31, + '¹': 0x31, + }, + 'Digit2': { + '"': 0x32, + '2': 0x32, + '@': 0x32, + '~': 0x32, + '²': 0x32, + 'é': 0x32, + '⅛': 0x32, + }, + 'Digit3': { + '"': 0x33, + '#': 0x33, + '3': 0x33, + '£': 0x33, + '§': 0x33, + '³': 0x33, + '·': 0x33, + '№': 0x33, + }, + 'Digit4': { + r'$': 0x34, + "'": 0x34, + '4': 0x34, + ';': 0x34, + '{': 0x34, + '~': 0x34, + '¤': 0x34, + '¼': 0x34, + }, + 'Digit5': { + '%': 0x35, + '(': 0x35, + '5': 0x35, + '[': 0x35, + '½': 0x35, + '⅜': 0x35, + }, + 'Digit6': { + '&': 0x36, + '-': 0x36, + '6': 0x36, + ':': 0x36, + '^': 0x36, + '|': 0x36, + '¬': 0x36, + '⅝': 0x36, + }, + 'Digit7': { + '&': 0x37, + '/': 0x37, + '7': 0x37, + '?': 0x37, + '`': 0x37, + '{': 0x37, + 'è': 0x37, + '⅞': 0x37, + }, + 'Digit8': { + '(': 0x38, + '*': 0x38, + '8': 0x38, + '[': 0x38, + r'\': 0x38, + '_': 0x38, + '₽': 0x38, + '™': 0x38, + }, + 'Digit9': { + '(': 0x39, + ')': 0x39, + '9': 0x39, + ']': 0x39, + '^': 0x39, + '±': 0x39, + 'ç': 0x39, + }, + 'KeyA': { + '@': 0x51, + 'A': 0x41, + 'Q': 0x51, + 'a': 0x41, + 'q': 0x51, + 'Æ': 0x41, + 'æ': 0x41, + 'Ω': 0x51, + 'Ф': 0x41, + 'ф': 0x41, + }, + 'KeyB': { + 'B': 0x42, + 'b': 0x42, + 'И': 0x42, + 'и': 0x42, + '‘': 0x42, + '’': 0x42, + '“': 0x42, + '”': 0x42, + }, + 'KeyC': { + 'C': 0x43, + 'c': 0x43, + '¢': 0x43, + '©': 0x43, + 'С': 0x43, + 'с': 0x43, + }, + 'KeyD': { + 'D': 0x44, + 'd': 0x44, + 'Ð': 0x44, + 'ð': 0x44, + 'В': 0x44, + 'в': 0x44, + }, + 'KeyE': { + 'E': 0x45, + 'e': 0x45, + '¢': 0x45, + 'У': 0x45, + 'у': 0x45, + '€': 0x45, + }, + 'KeyF': { + 'F': 0x46, + 'f': 0x46, + 'ª': 0x46, + 'đ': 0x46, + 'А': 0x46, + 'а': 0x46, + }, + 'KeyG': { + 'G': 0x47, + 'g': 0x47, + 'Ŋ': 0x47, + 'ŋ': 0x47, + 'П': 0x47, + 'п': 0x47, + }, + 'KeyH': { + 'H': 0x48, + 'h': 0x48, + 'Ħ': 0x48, + 'ħ': 0x48, + 'Р': 0x48, + 'р': 0x48, + }, + 'KeyI': { + 'I': 0x49, + 'i': 0x49, + 'ı': 0x49, + 'Ш': 0x49, + 'ш': 0x49, + '→': 0x49, + }, + 'KeyJ': { + 'J': 0x4a, + 'j': 0x4a, + '̇': 0x4a, + '̉': 0x4a, + '̛': 0x4a, + '̣': 0x4a, + 'О': 0x4a, + 'о': 0x4a, + }, + 'KeyK': { + '&': 0x4b, + 'K': 0x4b, + 'k': 0x4b, + 'ĸ': 0x4b, + 'Л': 0x4b, + 'л': 0x4b, + }, + 'KeyL': { + 'L': 0x4c, + 'l': 0x4c, + 'Ł': 0x4c, + 'ł': 0x4c, + 'Д': 0x4c, + 'д': 0x4c, + }, + 'KeyM': { + 'M': 0x4d, + 'm': 0x4d, + 'µ': 0x4d, + 'º': 0x4d, + 'Ь': 0x4d, + 'ь': 0x4d, + }, + 'KeyN': { + 'N': 0x4e, + 'n': 0x4e, + 'Т': 0x4e, + 'т': 0x4e, + '’': 0x4e, + '”': 0x4e, + }, + 'KeyO': { + 'O': 0x4f, + 'o': 0x4f, + 'Ø': 0x4f, + 'ø': 0x4f, + 'Щ': 0x4f, + 'щ': 0x4f, + }, + 'KeyP': { + 'P': 0x50, + 'p': 0x50, + 'Þ': 0x50, + 'þ': 0x50, + 'З': 0x50, + 'з': 0x50, + }, + 'KeyQ': { + '@': 0x51, + 'A': 0x41, + 'Q': 0x51, + 'a': 0x41, + 'q': 0x51, + 'Æ': 0x41, + 'æ': 0x41, + 'Ω': 0x51, + 'Й': 0x51, + 'й': 0x51, + }, + 'KeyR': { + 'R': 0x52, + 'r': 0x52, + '®': 0x52, + '¶': 0x52, + 'К': 0x52, + 'к': 0x52, + }, + 'KeyS': { + 'S': 0x53, + 's': 0x53, + '§': 0x53, + 'ß': 0x53, + 'ſ': 0x53, + 'Ы': 0x53, + 'ы': 0x53, + 'ẞ': 0x53, + }, + 'KeyT': { + 'T': 0x54, + 't': 0x54, + 'Ŧ': 0x54, + 'ŧ': 0x54, + 'Е': 0x54, + 'е': 0x54, + }, + 'KeyU': { + 'U': 0x55, + 'u': 0x55, + 'Г': 0x55, + 'г': 0x55, + '↑': 0x55, + '↓': 0x55, + }, + 'KeyV': { + 'V': 0x56, + 'v': 0x56, + 'М': 0x56, + 'м': 0x56, + '‘': 0x56, + '‚': 0x56, + '“': 0x56, + '„': 0x56, + }, + 'KeyW': { + '<': 0x5a, + 'W': 0x57, + 'Z': 0x5a, + 'w': 0x57, + 'z': 0x5a, + '«': 0x5a, + 'Ł': 0x57, + 'ł': 0x57, + 'Ц': 0x57, + 'ц': 0x57, + }, + 'KeyX': { + '>': 0x58, + 'X': 0x58, + 'x': 0x58, + '«': 0x58, + '»': 0x58, + 'Ч': 0x58, + 'ч': 0x58, + '‹': 0x58, + }, + 'KeyY': { + 'Y': 0x59, + 'Z': 0x5a, + 'y': 0x59, + 'z': 0x5a, + '¥': 0x1, + 'Н': 0x59, + 'н': 0x59, + '←': 0x1, + }, + 'KeyZ': { + '<': 0x5a, + 'W': 0x57, + 'Y': 0x59, + 'Z': 0x5a, + 'w': 0x57, + 'y': 0x59, + 'z': 0x5a, + '«': 0x5a, + '»': 0x59, + 'Ł': 0x57, + 'ł': 0x57, + 'Я': 0x5a, + 'я': 0x5a, + '›': 0x59, + }, + 'Semicolon': { + 'M': 0x4d, + 'm': 0x4d, + 'µ': 0x4d, + 'º': 0x4d, + }, +}; + +final Map> kDarwinMapping = >{ + 'Comma': { + 'W': 0x57, + 'w': 0x57, + '„': 0x57, + '∑': 0x57, + }, + 'Digit0': { + ')': 0x30, + '0': 0x30, + '=': 0x30, + '`': 0x30, + '}': 0x30, + '¯': 0x30, + 'º': 0x30, + 'Ø': 0x30, + 'à': 0x30, + 'ø': 0x30, + 'ľ': 0x30, + '‚': 0x30, + '≈': 0x30, + '≠': 0x30, + ')': 0x30, + }, + 'Digit1': { + '!': 0x31, + '&': 0x31, + '1': 0x31, + 'Deadkey': 0x31, + '|': 0x31, + '¡': 0x31, + '©': 0x31, + '«': 0x31, + '¬': 0x31, + '»': 0x31, + 'ı': 0x31, + 'Ń': 0x31, + 'ŕ': 0x31, + '⁄': 0x31, + '': 0x31, + '!': 0x31, + }, + 'Digit2': { + '"': 0x32, + '2': 0x32, + '@': 0x32, + 'é': 0x32, + 'ë': 0x32, + 'Ř': 0x32, + '˝': 0x32, + '“': 0x32, + '”': 0x32, + '„': 0x32, + '€': 0x32, + '™': 0x32, + }, + 'Digit3': { + '"': 0x33, + '#': 0x33, + '3': 0x33, + '£': 0x33, + '¥': 0x33, + '§': 0x33, + '¶': 0x33, + '·': 0x33, + '‘': 0x33, + '’': 0x33, + '“': 0x33, + '”': 0x33, + '•': 0x33, + '‹': 0x33, + '€': 0x33, + '№': 0x33, + }, + 'Digit4': { + r'$': 0x34, + '%': 0x34, + "'": 0x34, + '4': 0x34, + '¢': 0x34, + '£': 0x34, + '¥': 0x34, + 'ß': 0x34, + '‘': 0x34, + '’': 0x34, + '›': 0x34, + '€': 0x34, + }, + 'Digit5': { + '%': 0x35, + '(': 0x35, + '5': 0x35, + ':': 0x35, + '[': 0x35, + '{': 0x35, + '~': 0x35, + '§': 0x35, + 'į': 0x35, + 'ř': 0x35, + '†': 0x35, + '‰': 0x35, + '∞': 0x35, + 'fi': 0x35, + }, + 'Digit6': { + ' ': 0x36, + '&': 0x36, + ',': 0x36, + '6': 0x36, + 'Deadkey': 0x36, + ']': 0x36, + '^': 0x36, + '§': 0x36, + '¬': 0x36, + '¶': 0x36, + 'å': 0x36, + 'Ŗ': 0x36, + '̂': 0x36, + '‹': 0x36, + '›': 0x36, + 'fl': 0x36, + }, + 'Digit7': { + '&': 0x37, + '.': 0x37, + '/': 0x37, + '7': 0x37, + r'\': 0x37, + '|': 0x37, + '«': 0x37, + '¶': 0x37, + '»': 0x37, + 'è': 0x37, + '÷': 0x37, + 'ŗ': 0x37, + '‡': 0x37, + '⁄': 0x37, + }, + 'Digit8': { + '!': 0x38, + '(': 0x38, + '*': 0x38, + '8': 0x38, + ';': 0x38, + 'Deadkey': 0x38, + '[': 0x38, + '{': 0x38, + '¡': 0x38, + '°': 0x38, + 'Û': 0x38, + '˜': 0x38, + '‘': 0x38, + '“': 0x38, + '•': 0x38, + '√': 0x38, + '': 0x38, + }, + 'Digit9': { + ' ': 0x39, + "'": 0x39, + '(': 0x39, + ')': 0x39, + '9': 0x39, + 'Deadkey': 0x39, + ']': 0x39, + '{': 0x39, + '}': 0x39, + 'ª': 0x39, + '·': 0x39, + 'Á': 0x39, + 'Ç': 0x39, + 'ç': 0x39, + 'Ľ': 0x39, + 'Š': 0x39, + '’': 0x39, + '”': 0x39, + '(': 0x39, + }, + 'KeyA': { + 'A': 0x41, + 'Deadkey': 0x41, + 'Q': 0x51, + 'a': 0x41, + 'q': 0x51, + 'Å': 0x41, + 'å': 0x41, + 'Ą': 0x41, + 'ą': 0x41, + 'ƒ': 0x41, + '̄': 0x41, + 'Ω': 0x51, + 'Ф': 0x41, + 'ф': 0x41, + '‡': 0x51, + '◊': 0x41, + 'ㅁ': 0x41, + '': 0x41, + }, + 'KeyB': { + 'B': 0x42, + 'Deadkey': 0x42, + 'X': 0x58, + 'b': 0x42, + 'x': 0x58, + '»': 0x42, + 'Í': 0x42, + 'ß': 0x42, + 'ı': 0x42, + 'ļ': 0x42, + 'ű': 0x42, + '˛': 0x58, + '̆': 0x42, + 'И': 0x42, + 'и': 0x42, + '‹': 0x42, + '›': 0x42, + '∫': 0x42, + '≈': 0x58, + 'ㅠ': 0x42, + }, + 'KeyC': { + ' ': 0x43, + 'C': 0x43, + 'Deadkey': 0x43, + 'J': 0x4a, + 'c': 0x43, + 'j': 0x4a, + '¢': 0x43, + '©': 0x43, + 'Á': 0x43, + 'Ç': 0x43, + 'Ô': 0x4a, + 'ç': 0x43, + 'Ć': 0x43, + 'ć': 0x43, + '̧': 0x43, + 'С': 0x43, + 'с': 0x43, + '∆': 0x4a, + '≠': 0x43, + 'ㅊ': 0x43, + }, + 'KeyD': { + 'D': 0x44, + 'Deadkey': 0x45, + 'E': 0x45, + 'd': 0x44, + 'e': 0x45, + '´': 0x45, + 'Î': 0x44, + 'Ð': 0x44, + 'ð': 0x44, + 'Ž': 0x44, + '˘': 0x44, + 'Ћ': 0x44, + 'В': 0x44, + 'в': 0x44, + 'ћ': 0x44, + '™': 0x44, + '∂': 0x44, + '∆': 0x44, + 'ㅇ': 0x44, + }, + 'KeyE': { + 'Deadkey': 0x45, + 'E': 0x45, + 'e': 0x45, + '´': 0x45, + 'È': 0x45, + 'É': 0x45, + 'Ê': 0x45, + 'é': 0x45, + 'ê': 0x45, + 'Ę': 0x45, + 'ę': 0x45, + '́': 0x45, + 'Ќ': 0x45, + 'У': 0x45, + 'у': 0x45, + 'ќ': 0x45, + '‰': 0x45, + '€': 0x45, + 'ㄷ': 0x45, + 'ㄸ': 0x45, + }, + 'KeyF': { + 'Deadkey': 0x55, + 'F': 0x46, + 'U': 0x55, + 'f': 0x46, + 'u': 0x55, + '¨': 0x55, + '·': 0x46, + 'Ï': 0x46, + '÷': 0x46, + 'ń': 0x46, + 'ž': 0x46, + 'ƒ': 0x46, + '˙': 0x46, + 'А': 0x46, + 'а': 0x46, + '∫': 0x46, + 'ㄹ': 0x46, + 'fi': 0x46, + }, + 'KeyG': { + 'Deadkey': 0x1, + 'G': 0x47, + 'I': 0x49, + 'g': 0x47, + 'i': 0x49, + '©': 0x47, + '¯': 0x47, + '¸': 0x47, + 'Ì': 0x47, + 'Ū': 0x47, + 'ˆ': 0x49, + '˚': 0x47, + '˝': 0x47, + 'П': 0x47, + 'п': 0x47, + '∞': 0x47, + 'ㅎ': 0x47, + '': 0x47, + 'fi': 0x47, + 'fl': 0x47, + }, + 'KeyH': { + ' ': 0x48, + 'D': 0x44, + 'Deadkey': 0x48, + 'H': 0x48, + 'd': 0x44, + 'h': 0x48, + 'ª': 0x48, + '¸': 0x48, + 'Ì': 0x48, + 'Î': 0x1, + 'Ó': 0x48, + 'ķ': 0x48, + '˘': 0x48, + '˙': 0x48, + '˛': 0x48, + '̱': 0x48, + 'Р': 0x48, + 'р': 0x48, + '₽': 0x48, + '™': 0x48, + '∂': 0x44, + '∆': 0x48, + 'ㅗ': 0x48, + }, + 'KeyI': { + ' ': 0x49, + 'C': 0x43, + 'Deadkey': 0x49, + 'I': 0x49, + 'c': 0x43, + 'i': 0x49, + 'Ç': 0x43, + 'È': 0x49, + 'Û': 0x49, + 'ç': 0x43, + 'î': 0x49, + 'ï': 0x49, + 'ı': 0x49, + 'Œ': 0x49, + 'œ': 0x49, + 'ť': 0x49, + 'ˆ': 0x49, + '̛': 0x49, + 'Ѕ': 0x49, + 'Ш': 0x49, + 'ш': 0x49, + 'ѕ': 0x49, + '⁄': 0x49, + 'ㅑ': 0x49, + }, + 'KeyJ': { + 'Deadkey': 0x4a, + 'H': 0x48, + 'J': 0x4a, + 'h': 0x48, + 'j': 0x4a, + 'ª': 0x4a, + '¬': 0x4a, + '¯': 0x4a, + '°': 0x4a, + '¶': 0x4a, + 'º': 0x4a, + 'Í': 0x4a, + 'Ï': 0x4a, + 'Ó': 0x48, + 'Ô': 0x4a, + 'ı': 0x4a, + '˙': 0x48, + '˝': 0x4a, + '̋': 0x4a, + 'О': 0x4a, + 'о': 0x4a, + '•': 0x4a, + '∆': 0x4a, + '√': 0x4a, + 'ㅓ': 0x4a, + }, + 'KeyK': { + 'Deadkey': 0x4b, + 'K': 0x4b, + 'T': 0x54, + 'k': 0x4b, + 't': 0x54, + '§': 0x4b, + 'ª': 0x4b, + 'º': 0x4b, + 'È': 0x4b, + 'Ë': 0x4b, + 'ū': 0x4b, + 'Ż': 0x4b, + 'ˆ': 0x4b, + 'ˇ': 0x1, + '˚': 0x4b, + '˛': 0x4b, + '̊': 0x4b, + 'Љ': 0x4b, + 'Л': 0x4b, + 'л': 0x4b, + 'љ': 0x4b, + '†': 0x54, + '∆': 0x4b, + 'ㅏ': 0x4b, + '': 0x4b, + }, + 'KeyL': { + ' ': 0x4c, + '@': 0x4c, + 'Deadkey': 0x1, + 'L': 0x4c, + 'N': 0x4e, + 'l': 0x4c, + 'n': 0x4e, + '|': 0x4c, + '¬': 0x4c, + 'Ò': 0x4c, + 'Ł': 0x4c, + 'ł': 0x4c, + 'ˇ': 0x4c, + '˘': 0x4c, + '˜': 0x4e, + '̵': 0x4c, + 'Д': 0x4c, + 'д': 0x4c, + '∆': 0x4c, + 'ㅣ': 0x4c, + 'fi': 0x4c, + 'fl': 0x4c, + }, + 'KeyM': { + 'Deadkey': 0x4d, + 'M': 0x4d, + 'm': 0x4d, + '~': 0x4d, + 'µ': 0x4d, + 'Â': 0x4d, + 'Ú': 0x4d, + 'Ķ': 0x4d, + 'ų': 0x4d, + '˘': 0x4d, + '˚': 0x4d, + '˜': 0x4d, + '̨': 0x4d, + 'Ь': 0x4d, + 'ь': 0x4d, + '’': 0x4d, + '”': 0x4d, + 'ㅡ': 0x4d, + }, + 'KeyN': { + ' ': 0x4e, + 'B': 0x42, + 'Deadkey': 0x4e, + 'N': 0x4e, + 'b': 0x42, + 'n': 0x4e, + 'Ó': 0x4e, + 'ı': 0x1, + 'Ń': 0x4e, + 'ń': 0x4e, + 'ˆ': 0x4e, + '˙': 0x4e, + '˜': 0x4e, + '̃': 0x4e, + 'Т': 0x4e, + 'т': 0x4e, + '‘': 0x4e, + '“': 0x4e, + '›': 0x4e, + '™': 0x4e, + '∫': 0x42, + 'ㅜ': 0x4e, + }, + 'KeyO': { + 'O': 0x4f, + 'R': 0x52, + 'o': 0x4f, + 'r': 0x52, + '®': 0x52, + 'Ó': 0x4f, + 'Ø': 0x4f, + 'ó': 0x4f, + 'ø': 0x4f, + 'Œ': 0x4f, + 'œ': 0x4f, + 'Ў': 0x4f, + 'Щ': 0x4f, + 'щ': 0x4f, + 'ў': 0x4f, + '‰': 0x52, + 'ㅐ': 0x4f, + 'ㅒ': 0x4f, + }, + 'KeyP': { + 'Deadkey': 0x50, + 'L': 0x4c, + 'P': 0x50, + 'l': 0x4c, + 'p': 0x50, + '¬': 0x4c, + 'Ò': 0x4c, + 'Ļ': 0x50, + 'ł': 0x50, + '̦': 0x50, + 'π': 0x50, + 'З': 0x50, + 'з': 0x50, + '‘': 0x50, + '’': 0x50, + '∏': 0x50, + 'ㅔ': 0x50, + 'ㅖ': 0x50, + }, + 'KeyQ': { + 'A': 0x41, + 'Q': 0x51, + 'a': 0x41, + 'q': 0x51, + '«': 0x51, + '°': 0x51, + '»': 0x51, + 'Æ': 0x41, + 'æ': 0x41, + 'Ō': 0x51, + 'ő': 0x51, + 'Œ': 0x51, + 'œ': 0x51, + 'Ј': 0x51, + 'Й': 0x51, + 'й': 0x51, + 'ј': 0x51, + '‚': 0x51, + '„': 0x51, + '•': 0x51, + 'ㅂ': 0x51, + 'ㅃ': 0x51, + }, + 'KeyR': { + ' ': 0x52, + 'P': 0x50, + 'R': 0x52, + 'p': 0x50, + 'r': 0x52, + '£': 0x52, + '®': 0x52, + '¸': 0x52, + 'Â': 0x52, + 'Ì': 0x52, + 'π': 0x50, + 'К': 0x52, + 'к': 0x52, + '‚': 0x52, + '‰': 0x52, + '∏': 0x50, + '√': 0x52, + 'ㄱ': 0x52, + 'ㄲ': 0x52, + }, + 'KeyS': { + ' ': 0x53, + 'O': 0x4f, + 'S': 0x53, + 'o': 0x4f, + 's': 0x53, + '¯': 0x53, + 'Í': 0x53, + 'Ò': 0x53, + 'Ø': 0x4f, + 'ß': 0x53, + 'ø': 0x4f, + 'Ś': 0x53, + 'ś': 0x53, + 'Ы': 0x53, + 'ы': 0x53, + '‚': 0x53, + '∑': 0x53, + '∫': 0x53, + 'ㄴ': 0x53, + }, + 'KeyT': { + 'T': 0x54, + 'Y': 0x59, + 't': 0x54, + 'y': 0x59, + '¥': 0x59, + 'Á': 0x59, + 'Ê': 0x54, + 'Ò': 0x54, + 'Þ': 0x54, + 'þ': 0x54, + 'ś': 0x54, + 'ˇ': 0x54, + '˝': 0x54, + 'Е': 0x54, + 'е': 0x54, + '†': 0x54, + '‡': 0x54, + '™': 0x54, + 'ㅅ': 0x54, + 'ㅆ': 0x54, + }, + 'KeyU': { + ' ': 0x55, + 'Deadkey': 0x55, + 'G': 0x47, + 'U': 0x55, + 'g': 0x47, + 'u': 0x55, + '¨': 0x55, + '©': 0x47, + 'ª': 0x55, + 'º': 0x55, + 'Á': 0x55, + 'Ë': 0x55, + 'Ù': 0x55, + 'Ü': 0x55, + 'ü': 0x55, + 'Ť': 0x55, + '˝': 0x47, + '̈': 0x55, + 'Ѓ': 0x55, + 'Г': 0x55, + 'г': 0x55, + 'ѓ': 0x55, + 'ㅕ': 0x55, + }, + 'KeyV': { + 'Deadkey': 0x56, + 'K': 0x4b, + 'V': 0x56, + 'k': 0x4b, + 'v': 0x56, + '«': 0x56, + 'µ': 0x56, + 'É': 0x56, + '˚': 0x4b, + '̌': 0x56, + 'М': 0x56, + 'м': 0x56, + '‹': 0x56, + '√': 0x56, + '◊': 0x56, + 'ㅍ': 0x56, + '': 0x4b, + }, + 'KeyW': { + 'Deadkey': 0x57, + 'W': 0x57, + 'Z': 0x5a, + 'w': 0x57, + 'z': 0x5a, + 'À': 0x57, + 'Â': 0x5a, + 'Å': 0x5a, + 'Æ': 0x57, + 'æ': 0x57, + '˝': 0x57, + '̇': 0x57, + 'Ω': 0x57, + 'Џ': 0x57, + 'Ц': 0x57, + 'ц': 0x57, + 'џ': 0x57, + '„': 0x57, + '∑': 0x57, + 'ㅈ': 0x57, + 'ㅉ': 0x57, + }, + 'KeyX': { + 'Deadkey': 0x58, + 'Q': 0x51, + 'X': 0x58, + 'q': 0x51, + 'x': 0x58, + 'Ù': 0x58, + 'Œ': 0x51, + 'œ': 0x51, + 'Ź': 0x58, + 'ź': 0x58, + 'ˇ': 0x58, + '˛': 0x58, + '̣': 0x58, + 'Ч': 0x58, + 'ч': 0x58, + '†': 0x58, + '‡': 0x58, + '›': 0x58, + '⁄': 0x58, + '∑': 0x58, + '≈': 0x58, + 'ㅌ': 0x58, + }, + 'KeyY': { + ' ': 0x59, + 'F': 0x46, + 'Y': 0x59, + 'Z': 0x5a, + 'f': 0x46, + 'y': 0x59, + 'z': 0x5a, + '¥': 0x59, + 'µ': 0x59, + 'Á': 0x59, + 'Æ': 0x59, + 'Ï': 0x46, + 'Ú': 0x59, + 'æ': 0x59, + 'ī': 0x59, + 'Ÿ': 0x59, + 'ƒ': 0x46, + 'ˇ': 0x5a, + '˜': 0x59, + 'Ω': 0x5a, + 'Њ': 0x59, + 'Н': 0x59, + 'н': 0x59, + 'њ': 0x59, + 'ㅛ': 0x59, + }, + 'KeyZ': { + ' ': 0x5a, + 'Deadkey': 0x5a, + 'W': 0x57, + 'Y': 0x59, + 'Z': 0x5a, + 'w': 0x57, + 'y': 0x59, + 'z': 0x5a, + '¥': 0x59, + '¸': 0x5a, + 'Û': 0x5a, + '÷': 0x5a, + 'Ż': 0x5a, + 'ż': 0x5a, + '̉': 0x5a, + 'Ω': 0x5a, + 'Ђ': 0x5a, + 'Я': 0x5a, + 'я': 0x5a, + 'ђ': 0x5a, + '‡': 0x59, + '‹': 0x1, + '›': 0x57, + '⁄': 0x5a, + '∑': 0x5a, + 'ㅋ': 0x5a, + }, + 'Period': { + 'V': 0x56, + 'v': 0x56, + '√': 0x56, + '◊': 0x56, + }, + 'Semicolon': { + 'M': 0x4d, + 'S': 0x53, + 'm': 0x4d, + 's': 0x53, + 'µ': 0x4d, + 'Í': 0x53, + 'Ó': 0x4d, + 'ß': 0x53, + }, + 'Slash': { + 'Z': 0x5a, + 'z': 0x5a, + '¸': 0x5a, + 'Ω': 0x5a, + }, +}; diff --git a/tools/gen_web_keyboard_layouts/bin/gen_web_keyboard_layouts.dart b/tools/gen_web_keyboard_layouts/bin/gen_web_keyboard_layouts.dart index 7e09ef9e56d3c..7003d8f171883 100644 --- a/tools/gen_web_keyboard_layouts/bin/gen_web_keyboard_layouts.dart +++ b/tools/gen_web_keyboard_layouts/bin/gen_web_keyboard_layouts.dart @@ -65,6 +65,6 @@ Future main(List rawArguments) async { libRoot: path.join(packageRoot.path, 'lib'), force: parsedArguments['force'] as bool, outputRoot: path.join(packageRoot.parent.parent.path, - 'third_party', 'web_keyboard_layouts', 'lib'), + 'lib', 'web_ui', 'lib', 'src', 'engine'), )); } diff --git a/tools/gen_web_keyboard_layouts/data/definitions.dart.tmpl b/tools/gen_web_keyboard_layouts/data/key_mappings.dart.tmpl similarity index 74% rename from tools/gen_web_keyboard_layouts/data/definitions.dart.tmpl rename to tools/gen_web_keyboard_layouts/data/key_mappings.dart.tmpl index b145130fa3016..252e10dadcae0 100644 --- a/tools/gen_web_keyboard_layouts/data/definitions.dart.tmpl +++ b/tools/gen_web_keyboard_layouts/data/key_mappings.dart.tmpl @@ -13,7 +13,8 @@ // // See flutter/engine:flutter/tools/gen_web_keyboard_layouts/README.md for more information. -part of web_keyboard_layouts; +final Map> kWinMapping = @@@WIN_MAPPING@@@; -final LayoutStore kLayoutStore = unmarshallStoreCompressed( -@@@BODY@@@); // @@@BODY_LENGTH@@@ bytes +final Map> kLinuxMapping = @@@LINUX_MAPPING@@@; + +final Map> kDarwinMapping = @@@DARWIN_MAPPING@@@; diff --git a/tools/gen_web_keyboard_layouts/lib/benchmark_detector.dart b/tools/gen_web_keyboard_layouts/lib/benchmark_detector.dart index 6cb3c7650e7ae..6828d6ad660f7 100644 --- a/tools/gen_web_keyboard_layouts/lib/benchmark_detector.dart +++ b/tools/gen_web_keyboard_layouts/lib/benchmark_detector.dart @@ -110,19 +110,27 @@ Map _buildLayout(Map entries) { return result; } -class _ResultRecord { - _ResultRecord(this.logicalKey, this.language); +final int _kLowerA = 'a'.codeUnitAt(0); +final int _kUpperA = 'A'.codeUnitAt(0); +final int _kLowerZ = 'z'.codeUnitAt(0); +final int _kUpperZ = 'Z'.codeUnitAt(0); +bool _charCodeIsLetter(int charCode) { + return (charCode >= _kLowerA && charCode <= _kLowerZ) + || (charCode >= _kUpperA && charCode <= _kUpperZ); +} + +const int _kUseKeyCode = 1; - final int logicalKey; - final String language; +bool _mappedToKeyCode(int charCode) { + return _charCodeIsLetter(charCode) || charCode == _kUseKeyCode; } // Return a map of EventCode -> EventKey -> logicalKey -void buildMap(Iterable layouts) { - final Map> result = >{}; +Map> buildMap(Iterable layouts) { + final Map> result = >{}; for (final Layout layout in layouts) { _buildLayout(layout.entries).forEach((String eventCode, int logicalKey) { - final Map codeMap = result.putIfAbsent(eventCode, () => {}); + final Map codeMap = result.putIfAbsent(eventCode, () => {}); final LayoutEntry entry = layout.entries[eventCode]!; for (int charIndex = 0; charIndex < 4; charIndex += 1) { final bool isDeadKey = entry.deadMasks & (1 << charIndex) != 0; @@ -131,16 +139,15 @@ void buildMap(Iterable layouts) { continue; } final String eventKey = isDeadKey ? 'Deadkey' : printable; - if (codeMap.containsKey(eventKey) && codeMap[eventKey]!.logicalKey != logicalKey) { - print('Error assigning ($eventCode, $eventKey) as ' - '0x${logicalKey.toRadixString(16)} (${layout.language}): ' - 'already assigned as 0x${codeMap[eventKey]!.logicalKey.toRadixString(16)} ' - '(${codeMap[eventKey]!.language})'); + if (codeMap.containsKey(eventKey) && codeMap[eventKey] != logicalKey) { + assert(_mappedToKeyCode(codeMap[eventKey]!)); + assert(_mappedToKeyCode(logicalKey)); + codeMap[eventKey] = _kUseKeyCode; } else { - codeMap[eventKey] = _ResultRecord(logicalKey, layout.language); + codeMap[eventKey] = logicalKey; } } }); } - // return result; + return result; } diff --git a/tools/gen_web_keyboard_layouts/lib/main.dart b/tools/gen_web_keyboard_layouts/lib/main.dart index be960797f4141..5cddcceb33a3a 100644 --- a/tools/gen_web_keyboard_layouts/lib/main.dart +++ b/tools/gen_web_keyboard_layouts/lib/main.dart @@ -99,6 +99,45 @@ String _readSharedSegment(String path) { return lines.sublist(startLine + 1, endLine).join('\n').trimRight(); } +typedef _ForEachAction = void Function(String key, V value); +void _sortedForEach(Map map, _ForEachAction action) { + map + .entries + .toList() + ..sort((MapEntry a, MapEntry b) => a.key.compareTo(b.key)) + ..forEach((MapEntry entry) { + action(entry.key, entry.value); + }); +} + +String _escapeEventKey(String original) { + switch (original) { + case "'": + return '"\'"'; + case r'\': + return r"r'\'"; + case r'$': + return r"r'$'"; + default: + return "'$original'"; + } +} + +String _buildMapString(Iterable layouts) { + final List codeStrings = []; + _sortedForEach(buildMap(layouts), (String eventCode, Map eventKeyToLogicalKeys) { + final List codeStringBodies = []; + _sortedForEach(eventKeyToLogicalKeys, (String eventKey, int result) { + codeStringBodies.add(' ${_escapeEventKey(eventKey)}: 0x${result.toRadixString(16)},'); + }); + codeStrings.add(''' + '$eventCode': { +${codeStringBodies.join('\n').trimRight()} + },'''); + }); + return '>{\n${codeStrings.join('\n')}\n}'; +} + Future generate(Options options) async { final List layouts = await fetchFromGithub( githubToken: options.githubToken, @@ -107,9 +146,9 @@ Future generate(Options options) async { ); // Build store. final LayoutStore store = LayoutStore(kLayoutGoals, layouts); - buildMap(store.layouts.where((Layout layout) => layout.platform == LayoutPlatform.win)); - buildMap(store.layouts.where((Layout layout) => layout.platform == LayoutPlatform.linux)); - buildMap(store.layouts.where((Layout layout) => layout.platform == LayoutPlatform.darwin)); + + _buildMapString(store.layouts.where((Layout layout) => layout.platform == LayoutPlatform.linux)); + _buildMapString(store.layouts.where((Layout layout) => layout.platform == LayoutPlatform.darwin)); // final String body = marshallStoreCompressed(store); @@ -117,19 +156,22 @@ Future generate(Options options) async { // // Inconcistencies will cause exceptions. // verifyLayoutStoreEqual(store, unmarshallStoreCompressed(body)); - // // Generate the definition file. - // _writeFileTo( - // options.outputRoot, - // 'definitions.g.dart', - // _renderTemplate( - // File(path.join(options.dataRoot, 'definitions.dart.tmpl')).readAsStringSync(), - // { - // 'COMMIT_ID': commitId, - // 'BODY': _prettyPrintBody(body, 64), - // 'BODY_LENGTH': '${body.length}', - // }, - // ), - // ); + // Generate the definition file. + _writeFileTo( + options.outputRoot, + 'key_mappings.g.dart', + _renderTemplate( + File(path.join(options.dataRoot, 'key_mappings.dart.tmpl')).readAsStringSync(), + { + 'WIN_MAPPING': _buildMapString(store.layouts.where((Layout layout) => + layout.platform == LayoutPlatform.win)), + 'LINUX_MAPPING': _buildMapString(store.layouts.where((Layout layout) => + layout.platform == LayoutPlatform.linux)), + 'DARWIN_MAPPING': _buildMapString(store.layouts.where((Layout layout) => + layout.platform == LayoutPlatform.darwin)), + }, + ), + ); // // Generate the type file. // _writeFileTo( From 0a40d4d966bbed6ca45823614c7f7d2070b907db Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Tue, 1 Nov 2022 13:04:45 -0700 Subject: [PATCH 26/74] test cases --- .../lib/definitions.g.dart | 143 -- .../lib/key_mappings.g.dart | 1654 ++++++++++++++++ .../web_keyboard_layouts/lib/types.g.dart | 199 -- .../lib/web_keyboard_layouts.dart | 29 +- third_party/web_keyboard_layouts/pubspec.yaml | 3 + .../test/layout_mapping_tests.dart | 18 + .../test/test_cases.g.dart | 1740 +++++++++++++++++ .../web_keyboard_layouts/test/testing.dart | 29 + .../bin/gen_web_keyboard_layouts.dart | 2 +- .../data/key_mappings.dart.tmpl | 2 + .../data/test_cases.dart.tmpl | 30 + .../lib/benchmark_detector.dart | 5 +- tools/gen_web_keyboard_layouts/lib/main.dart | 75 +- 13 files changed, 3553 insertions(+), 376 deletions(-) delete mode 100644 third_party/web_keyboard_layouts/lib/definitions.g.dart create mode 100644 third_party/web_keyboard_layouts/lib/key_mappings.g.dart delete mode 100644 third_party/web_keyboard_layouts/lib/types.g.dart create mode 100644 third_party/web_keyboard_layouts/test/layout_mapping_tests.dart create mode 100644 third_party/web_keyboard_layouts/test/test_cases.g.dart create mode 100644 third_party/web_keyboard_layouts/test/testing.dart create mode 100644 tools/gen_web_keyboard_layouts/data/test_cases.dart.tmpl diff --git a/third_party/web_keyboard_layouts/lib/definitions.g.dart b/third_party/web_keyboard_layouts/lib/definitions.g.dart deleted file mode 100644 index 546539318b414..0000000000000 --- a/third_party/web_keyboard_layouts/lib/definitions.g.dart +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -// DO NOT EDIT -- DO NOT EDIT -- DO NOT EDIT -// -// This file is auto generated by flutter/engine:flutter/tools/gen_web_keyboard_layouts based on -// https://github.com/microsoft/vscode/tree/ae34e8d2df286f8c8882d22db417e6dc4cdb01f5/src/vs/workbench/services/keybinding/browser/keyboardLayouts -// -// Edit the following files instead: -// -// - Script: lib/main.dart -// - Templates: data/*.tmpl -// -// See flutter/engine:flutter/tools/gen_web_keyboard_layouts/README.md for more information. - -part of web_keyboard_layouts; - -final LayoutStore kLayoutStore = unmarshallStoreCompressed( - 'H4sIAAAAAAAAE+1c+XdUVba+51ShdPf7IwTbdgAEBRnUVpzneRaliRolgoAh2N2K' - 'rCSEDBBkFEgCARJCGAIkjEkgsFbdKn/o1Hqv+A+e+Af4L7z9ffucW7cqlQHa99S3' - 'WIuz7qnKpVK1v29/ezi7MjP5Qvk/HzOP4fK4eRyXJ8wTuDxpnsTlKfMULk+bp3F5' - 'xjyDy7PmWVyeM8/h8rx5HpcXzAu4vGhexOUl8xIuL5uXcXnFvILLq+ZVXF4zr+Hy' - 'unkdlzfMG7i8ad7E5S3zFi5vm7dxece8g8u75l1c3jPv4fK+ef+WJys+q6i6z9yn' - 'm/vN/bqZbWbrZo6Zo5sHzAO6mWvm6maemaeb+Wa+bhaYBbqZZWZNeqlixZrVwaSn' - 'vlxTtjz40+OVZR8vK696sfzTquA/3IPXKz5bWhX84XF5sHp52eqlwR/eKP+i4uOV' - 'y1euCCa9tmZlVbn+8EtuJz2x8osvyoJbXi2vrFj5STDpDf6X6fbjrwNTZh4LgsB8' - 'ZB4338j1Y/OE+YtcPzFP2vRW2ZSbpxLXantk96l52iyS62fmGfOhXJeaZ/E/K8xz' - 'uHxunsdlmXnBZmpls9y8aDM1svnCvIQfrDAvm2/lutK8goerzKu4fGleMx/ItdK8' - 'joerzRs2vU02VeZNPF5j3sLlK/O2WSjXv5t3zFq5/sO8a26X69fmffz4n+Y9XKaZ' - '+8y6ILDpNnO/HW6QXeagmW0W46nNZo4d3oOnWswDNtWL3WUz1w63yS4cMvPMEmwO' - 'mvl2uAW7E2aBTZ3F7qiZZYf3yev/1dxhU0fkqdRZeXmb6sdPB81MG16Qn95t7rLh' - 'bvz0iLnTpg7hN5wyU82f8VS3mWLD/XLXQ/zdgZluHjUPy/Ve86B5RK4zzN/MPXLn' - 'J+VxRAIFJFA8gmI0AgUjGAOLQJEIFAebOqdIBCWBWFgARFAKhkBRCBSEYAQG95kp' - 'uNxvptrUadnMls9uU2dkNweWCMwD5g5c5oJkgZh9Jlk339xFai0QM4Jas8TY38K8' - '+8VOHyR+HGyH1YGRPHfJhnsV73uAt7nd3Mnnz9twFzeHbFiHGxZHxn4oUFsHauqA' - 'ljawtA0P27Ce1k5cq94raw9tblMdNnVU/SDsteHWyPa0P8wvTLWpY4TAZjbZzEbC' - 'YNPdNn2YUCSu1W+36T7iYbOdNtug/pHul0+vDlILH3HQ2NQgwZH3sE9WCyGyYb8N' - '9xAmG162YbuDyv7nUYJlU+dt6qR6TuYKLQXUbKbbZg4TOXkXO2RtI37yuu2yWomi' - '//WCpE0dl6cHCKfcvNWmuoipTV2U5wcJrE0N2NRBD27i2oa2CF+b6iTCNnUJ1AfK' - 'NjUkt+wl1DYlVtuwz+Et23YHeeJaXYdD3ab6HO5AzSFvU1cCm62x2Wqb7bbZIw59' - 'm2202Y2OATZ1ihyAyWy23hHBZjeJyR0ZbLbWZpsDXFK9cp+8+eoz5IVNXYDXghvy' - '3GG4Mggie7FZ9U7QxCpNumy4wdGk0dkKNAm7bdhAmsjztfp5IqJU9ypRfthuwy1K' - 'lNRRGzYrUVLHbLjDEaWmzoZtSpTUIDkjRJFXrLfD9aSKWZj4uac2oopoGRV1HdBJ' - 'FhPlv6rlv24hUwRYwdBR5SREC1QBBWy4mVSR/QEIHLgi4mXDmqQypbE1cW33RjJF' - 'HmwDdciVxLWmRhu2kCtCQ0itUqVLbjnoqHJQMCdVnFft81w5L8qtVOkga4QqwoOf' - 'e2rIFPOhWTyZNFkrcYEk+cYO71WOCDMukCPyDg4AdrJEOALNpj6I8g63JpQk8ks7' - 'QCWwRMiV+LnziufJHrqXI0pmh81s90RxavCweUR+xyFZXaSJfP52xIpReTL5k/IZ' - 'q/9esXr1/6Z8B2OId/BLaPc0mzqs6s1YMFvcC2F2DlgOKVW/7g68UzsFX6sKLoiq' - 'hAeq4LjcCXzOQosFnHVOvY9A6xEnp1DshQqdqvaCx1Gv4AcQGMiYMTR82a8XLW/I' - '4M7Szu75YOnMfTs8AvZOHUK0hLnd+59YvBSqPxoEzhXWwpBULTX2YgbLO5FmBI7n' - '2FA1cMcQkS1t6Vs++WplZdmyAin0SjCsukWxCnfS6MiQUmeT8hpwoy6qlVOX1JEk' - '7C6yJv+SXjdt+F2BnEIeh1soj5FCNRALEQP5l/Q6GNZGmkzVVJlT5UWATfXYcDs+' - '9VTv2nF9jMmmCpiIXyTTkEREaxEUSsd08zA0geEGwqq6Edf3h7w4tHoRhLAD4IUI' - 'DJo4KMoaQFQGNcAS68Z2r4SSu3Sr4s+Dq51XaZ1v7olkbQE87piTxLslbGhcX4QA' - '6yX3Q/NtJHdCnUdFtxBShS3TVEPFZB+YtT5IIIkI9zMwxMUNritrSbIwFBQECRcL' - 'JL7Y8hXjemXwW1HAURxyYaD+GJRIXBerI9If59ObAIVq3t15l4GNcVkEhyUSuHwA' - 'tyRTVB2n4kJlJMHU8R7BZaa6cvkKpqk0KIs0mJRVGowKk9KsMCoNyyoNpmWZBuPC' - 'tDQvjEsDw7w0MQxMIzPDgJlhZBqa2QVMDUPT2DA1zc0EFAaHuWlyGJxGh8lpdhid' - 'hmftBtOzeIPxWb3B/DA+AYD5CQEAIAiAgDAABAIBGAgFEwaAASgIB8AgIICDkAAQ' - 'ggJICAsLLAADWAgNgCE4gIbwABwCBHgIEQAiSM4D1hEkAgWYCBWAIlgCValUkbI0' - 'MlOk4sWkcmSaCP2J6WBMNONqG1eomODF5DEmmmOkiU7N4voZU4O4CMeEfPw0EcEh' - 'Jq15lfj1BLJA2eJCOLpyxiQyrvGxqBIpZDxKxMNfXnz/WL5ixkflyz+rKFsR6dYv' - 'nb1Mp3iUlkonzROQSqeKhVLp9PMvAuBabY9QLsVRqJdilDlMUe4SwBZp74OaibRv' - 'Hv7nFDOfiUe3AIQUTzK9WUxe7napntPPxUhakOT8Wbz6Q7zSOSSKYmUfCmw4gHwU' - 'DiQ/Pc0+AxC6F5cHzUynwgLNuuAWsXr5P6rUQ1OnbLYuCasLNlIzJrXi75ciM1lU' - '8ePlszXePwPvncKB/snqnptttk9zmn9dstk2uqc4rxSgSeedUqsmqbAzbPacpi7D' - 'bVLNJr1vZtcX+6aZbrOHk2N7psLmuwLOLbONdEs0qLLNDNgQkGxDkrJ7r9TESeeQ' - 'CrAdltK6KXlD7ggPFFVQbxRtytYmfxVnlDe7a/IIb7TZ6sgdVZS8P/5r5+SYP04S' - 'ZlRoymLTNTZdXcIdEz/2b5bVrJRI77Dp7XGvTPw4sEFWHX1T7uuSdUglOy0B4FgJ' - 'L00sz3YlXsx2kcvyf2tkVWv758eBBln1mp5mNttMczzN8Z9R+JColNd4Ha/B7k+b' - 'zbSqVP84cEJWj5Iic9xmjpVIf+SOTlkdKtBhnw23jZsICSUGCnMh9idGZkPUvHw+' - 'JMwf3ny9KdHIcBulRbcSs6rlilp4kMEljxrCpxSjxa4cHrVh0+hqasMTDHYjsPJ+' - 'Ga8JvcHotmcYodmiYxNScWIb0vltEIVTKbKK3TYcZDjJIxQrsZzyuq4nPdYRwLdZ' - 'BoiTa7fCWV23VYpI32CJikjR1EuBi5hDiphNXVbM2PokaPQz4qYyIbDZcDd7HgKd' - 'OJ+CBxd07tiDxgEgZDuyV0MjhPlIPLv1KVA+w4X/RWDezJ7+z7In2ELTJ/sbSJ8S' - 'ItbDexHZb51A/gS9XrNsFM8vTJ9u2ONLlpsxP59AyTnSq8cvOyl9s9kE8nLb84uV' - 'nrdLUPTVjSotxX2J897S9aca+8Y8E35QyjV9/zvvmqJLYeP1eCY6wmx/06Mn6ph0' - '6BJ+GW7MN783TbT5PdIv0cAf4Zc4BsCZAFA1t/8eqxqb6Z9IWWPLf1+97xEuyDZ2' - '1IsVA2vvW8qPdUFRKzZqfasj3qWOWNT3RoGC+HxF85nFrGWmuVqGTqNNb+YReqos' - 'BQ+b3oOCMI/FS3a9y1eXOLl0J4ZjnlwyJ7r+g8smqWomdHAZ9Yuu59AylhKNfmbp' - 'zmWLzywvov8iQEYnlvDE1HHkiwTUH1fCEd1p5QVtsiuurp307x1VAmt3Ukm4pZoT' - 'xvDIstYsis4pP5SSM8JdzymBvEhYdpOecTaabwR+jz6Ov3jytLPan1DysFIPntxx' - 'snChWJu1MNQk2NwWO5lsrC9xhP3DdlUeFDGitSo9KGLk0+J/Q5xvw4Ynk+fp/2BC' - 'qpvZDIra2ygEXphblQm34UhuwsKMX8BTycbj2DpdVu1DI5HvoFiWPf8pylToQa/K' - 'uF1FWQVXyQBCkwxMDpULkNXi40jqMXM45QNebR7HPFTX5zNXdpRcwHTZeZ87mkSM' - '8Edf7IiTFzxzRUZHLZDAlXC8EDZFvBAxjnghOacXBRzPlziUlJgUHUliFZ1Jlq+e' - 'sbysquLXacff2DTJmIlR6X68PxgbS4shpnBN0QOvtEGQnyBB/3dJTIvZGZZkCwrS' - 'q2JfUok/rfx9d/AC38CDEUZp4MlnnaudviM6JSXV/Hzakx28xb6DB7jRweN5JLpu' - 'aOktdobGES9nolBvnsuzhx08QiLVa1Dcu5uiJ5JiZhOLH79mvBNUKNWbxo13sQD9' - 'bwS8fDwrHe9iAVHgdAM6DlINeVP9sbLiiohHYDXgEVvGOwevBjwizIDnQFaNIswM' - 'eQq0P0pEPDvC6RrM5ehojkMcQY+YMx7WxzMG7d66yZzUaQzy9HBoREgQRT1hgo96' - 'YIMPe59WWjACEcJzQuyK+FHc/ymIfTY8xmTf1STIoRn4emqiwCfVCUsYVodSMZxS' - 'UoRbWDGAFKHk/5t8UYJ6SkjB+RBYQ4uSdJ8WJS7IxWNfMS9OavpOYmxHHIuFPyQc' - 'rEsGSV8yY/dGBEHXCKqNH8RrcGKvqFVydle6VA9oYBR6IMCL9k0mP2x4XGsaIUi+' - 'PhCO5OsD8ESEUFv4YHDYpTTxVcMUMx+hTeoe0kQiGMoh8sR7BIki8uoj005EJ9UF' - 'G56VSi+B9r46axeL0U6zUErVqAWzw/EkbNGQXBAEyRSGvg6lSngBaVOs/LFL1zib' - 'HwrGHnLlzOAYM67A33HhRDDKnCtHOm900NVFivFnXTkwep9gtU5jI2ddxc2nMWTN' - 'EUfBpKsmtr0MkTM55yr+/VcKOGZ1MOWKOOmGXDkJhSlXN2DHOVf2O3TONbPNZrZy' - '0FX7GjrqmumzmV6ddWWnhcOu7MloFjorGil5FOFzxLRrRdXvu2SMJyf5ro3LTkZM' - '7oxXLIY9bPCIi8FDeTTNBFHYJD7gYmF4Gr62kFEXvgVquA56yRSloqpk8wZi5oQS' - 'HQzfvEEm74Nn2BgJJXJ5CCWn4FpdgdBYz04kXMPpHGuEY9HgjMgW0l3XvUG54J26' - 'NeqrhjvGat8komlV38BpzsfQU04p6zrYGfINnJaogcPWHyIkejPVTid9WUGdVB3m' - 'yGvjNqT5bN+ouBWPLnbmhZHlQhcjDIYR1kXFQl5ui+oFdMNEfZOsH5eY25IlSgW2' - 'CkgCdmf7kqMTgY0hKYM8G9CA83wASKUGGKsP4wNqsdDB0Fcw5/r5qpvt95vDC+N2' - '+SZ/vmpG5covylbcPEi/eZBedJBul620iZ821GAxrMvmABaDu2w2YjHEy6YBi4E+' - '8VPdBVn97ETIZgCLEV9u+Q6LcV82u7EY/WWzDYs5gGx2YDETkM0WLOYDsunEYlYg' - 'm4NYzA1ksxeLGYJstsrazjxBNjtl7WK2IJtaWeuZM8j76pN1mpmDbM5iMX+QWzbI' - 'qmcWIZvvsZhLyGYzFjMK2TTKamJeIZtmLGYXsmnDYo4hm01Yv+2ZOGH10QlMxa1Y' - 'eXNGu8SMthh1icu9R53R9qPZflgb/jrqiLZd5aYh0htsuq5gGiLdYNP1Beei6Rab' - '3nOdFo/1/F1mbTN1NrN+QmejsemUEeVOIQQ2M2gzA3EYbOaSzVz8TU7nrnJDC3mb' - '27S82b5iuzNpygwVG58GvBwlTRjTYWPqQuxgNNM1MmfKXLSZ4yMOYtLnbebMGMDY' - '9EWUrBoLm6Wky38rqHPECBESpkxbFA0zh8ZJmGKwYebJ50t56OQN2cz3UUy0mT3E' - '0H1RysVE9HB8TEyfspkWnyzZzC6fK9nM7pERMT1kMwc0IqYvjxERMYulEbE9HhFb' - 'x02V0oM23RmdiO7M50rhvnw8DIeiXClTL+z4/1HeFgkfUpfuGxE+fyZKAwfue1lH' - '/NdVcOc6VwCz2PAHoTHHLK17pSvcm5XLzcGhosGhVVUzPqos4ZJigI4Cr9S+2S9+' - 'IjZzwl4JTxnVLTHyN+rMX2fgKgp8orlkTM+EIyId23/RWmf9jgVu1m8w5pjOUX2E' - 'LAyNGj1t5ZrAXq2zuUN4kOu3OaYyV2tsjmdwudM2t53PrLe5Tj7Ta3Nbublic/v5' - 'o2qbO8BNo80d4Y8u21w7Nxdtro2bsza3k/c021wPN7U218FNk83x64S5Cza3m5sB' - 'm2vhZtDmWnnPJps7zmfO2dz33JyxuR3cXLK5vbyn3uYOc9Ngc2zC5YZsbh+f2WJz' - 'pwrVkrkJCinNTh4qyE4eVJ181GEhxBsaO0GxVzfYXBc3G23OaeFMvofzNsevu1/d' - 'bHMnuNlmczX8UZ/NcaTk6nc2d1Khma6YGMXEIaO4OHQUG4eQ4uNQUowcUoqTQ0ux' - 'cogpXg41xcwhp7g59BQ7h6Di51BUDB2SiqNDU7F0iCqeDlXF1CGruDp0FVuHsOLr' - 'UFaMHdKKs0NbsXaIK94OdcXcIa+4O/TjBdpUMkDxdywAB8iDeJH2ILkAJpANhVwY' - 'r0pTTjhmKC8cO8AN8kPZ4TiiDHE8UZY4rihTHF+ULY4zYAxZI5yxjjMSJ3/YXooz' - 'rpF5wLPmqqC7KWKN2LbZsybkUZ5jDQ7pjjrW4NPTAp43gtUGzxt+Z7/DE+eqoN3k' - 'iIN4zNM9JQ2/6aGU0cBWl6eO0O87R50owDjyXJWP0+jJg3T4ZCnyuN7xAU+fq8Kg' - '9Z4+ONI8F9FHPGKLo4+ezDU1egJdFXpujAgkHlarBML4mSZbeQL5SaU73CSosOdB' - 'jcbg0HQkxj0g0b0MxGDRQ+ARjgdBo2/MnUqjb/GVmeLwK1EVk9xKoyj+FtCpiCsg' - 'UzRpUkAqiRCLsByhEIclJCiVEIhdQ8D9FpGA1V/dbAoUNwV0RsX/kZNRmwLFf+WE' - 'xwFDo2bHq79idszhLuaLOj4xyKSq1B+wiI7Ko9FpDInxZJ0Zcj8zLGbIbUyw+C2X' - 'Pn4PRDPkVtKSJ0DHOBqIr7tEZ+z4uov4nmZ7+tdO4Ix7g9FOzPUcSFNLnyc3+iPz' - '/UVH5m5izH9dQocpBkB0fxKE/D5Kk/1frtCJYp6pu0Mb5llH4wOEPAci0jyqngOA' - 'mSeXGhrrpkMW/B0L9tWIO/pqev7TSNkE+pIJ6wjhWfaFzJKEcgB1yHCr54FZfCuI' - 'oOKW/xMWWlyM9ycsWOW25/+GRfEZULJqaVlFkPjv/v2ykLbJ5aysQW4HamTbpM9i' - 'u0W3Z2R9p9udclOt3lstD5t12ySrQW/olLVDn22UtUmfPS3rqG6PyTqi291MkmRz' - 'Qe7Ul+pvkXVKtx2yNutL1cvaqs+2y9qm2+Oy6nXbK2uPbs/JvRt1e0LWSX2FOmZt' - '8riNGZhs+uRZffn+vUzO5PEG7RjNlC1nxGbIZrvec0C2+sH6d8l2p277ZQ3o9rys' - 'K7qtkxu+1+33st2lW9hjt25rZeve7kbZtui2VZb7lF1M5mSzXtYG3XbLcvZs0Bmq' - 'vzHnlMcHZen7HMB/6NFn98liUltVGRRNE1+vHIv344vlNt37i0wKRgcy8isHr1eW' - 'OV5wP/4AVyeFebEb4p7mZVm/9zRBVb5HVZkpGEbg0vttut3NRkBgKMziWxwezOy3' - 'mXb9Yye0hVyn4vz24QLV9hWUqvStXy+dsbRsxYgh3psdjDE6GImfL9VMoIehR/Sl' - 'mhjB+Kev8jsaoyaGPGjKtzGCkl2MxE/VW2U1R5mUPNgma3OUbMqDmqifIS/ZJqu1' - 'xHGs/M7Ez0PtPJGVW5rl/230nQ3Z18ralO9uyB37XX/jfwDr7kubSFEAAA=='); // 7996 bytes diff --git a/third_party/web_keyboard_layouts/lib/key_mappings.g.dart b/third_party/web_keyboard_layouts/lib/key_mappings.g.dart new file mode 100644 index 0000000000000..ba126fe626779 --- /dev/null +++ b/third_party/web_keyboard_layouts/lib/key_mappings.g.dart @@ -0,0 +1,1654 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. + +// DO NOT EDIT -- DO NOT EDIT -- DO NOT EDIT +// +// This file is auto generated by flutter/engine:flutter/tools/gen_web_keyboard_layouts based on +// https://github.com/microsoft/vscode/tree/@@@COMMIT_ID@@@/src/vs/workbench/services/keybinding/browser/keyboardLayouts +// +// Edit the following files instead: +// +// - Script: lib/main.dart +// - Templates: data/*.tmpl +// +// See flutter/engine:flutter/tools/gen_web_keyboard_layouts/README.md for more information. + +part of web_keyboard_layouts; + +final Map> kWinMapping = >{ + 'Backquote': { + '0': 0x30, + '§': 0x30, + }, + 'Digit0': { + ')': 0x30, + '0': 0x30, + '=': 0x30, + '@': 0x30, + '}': 0x30, + 'à': 0x30, + 'é': 0x30, + '˝': 0x30, + 'จ': 0x30, + '๗': 0x30, + '’': 0x30, + }, + 'Digit1': { + '!': 0x31, + '&': 0x31, + "'": 0x31, + '+': 0x31, + '1': 0x31, + '>': 0x31, + '|': 0x31, + '~': 0x31, + '¡': 0x31, + '¦': 0x31, + '¹': 0x31, + 'ๅ': 0x31, + }, + 'Digit2': { + '"': 0x32, + "'": 0x32, + '/': 0x32, + '2': 0x32, + '@': 0x32, + '~': 0x32, + '£': 0x32, + '²': 0x32, + 'é': 0x32, + 'ě': 0x32, + 'ˇ': 0x32, + '๑': 0x32, + }, + 'Digit3': { + '"': 0x33, + '#': 0x33, + '*': 0x33, + '+': 0x33, + '-': 0x33, + '3': 0x33, + '^': 0x33, + '£': 0x33, + '§': 0x33, + '³': 0x33, + '·': 0x33, + 'š': 0x33, + '๒': 0x33, + '№': 0x33, + }, + 'Digit4': { + '!': 0x34, + r'$': 0x34, + "'": 0x34, + '+': 0x34, + '4': 0x34, + ';': 0x34, + '{': 0x34, + '~': 0x34, + '£': 0x34, + '¤': 0x34, + '§': 0x34, + '°': 0x34, + 'ç': 0x34, + 'č': 0x34, + '˘': 0x34, + 'ภ': 0x34, + '๓': 0x34, + '€': 0x34, + '₹': 0x34, + }, + 'Digit5': { + '%': 0x35, + '(': 0x35, + '5': 0x35, + '[': 0x35, + '¢': 0x35, + '§': 0x35, + '°': 0x35, + '½': 0x35, + 'ř': 0x35, + 'ถ': 0x35, + '๔': 0x35, + '€': 0x35, + }, + 'Digit6': { + '&': 0x36, + '-': 0x36, + '/': 0x36, + '6': 0x36, + ':': 0x36, + '^': 0x36, + '|': 0x36, + '§': 0x36, + '¨': 0x36, + '¬': 0x36, + '¼': 0x36, + 'ž': 0x36, + 'ˆ': 0x36, + '˛': 0x36, + 'ุ': 0x36, + 'ู': 0x36, + }, + 'Digit7': { + '&': 0x37, + '/': 0x37, + '7': 0x37, + '=': 0x37, + '?': 0x37, + '`': 0x37, + '{': 0x37, + '|': 0x37, + '½': 0x37, + 'è': 0x37, + 'ý': 0x37, + 'ึ': 0x37, + '฿': 0x37, + }, + 'Digit8': { + '!': 0x38, + '(': 0x38, + '*': 0x38, + '8': 0x38, + '[': 0x38, + r'\': 0x38, + '_': 0x38, + '¢': 0x38, + '¾': 0x38, + 'á': 0x38, + '˙': 0x38, + 'ค': 0x38, + '๕': 0x38, + '₽': 0x38, + }, + 'Digit9': { + '(': 0x39, + ')': 0x39, + '9': 0x39, + ']': 0x39, + '^': 0x39, + '{': 0x39, + '´': 0x39, + 'ç': 0x39, + 'í': 0x39, + '˘': 0x39, + 'ต': 0x39, + '๖': 0x39, + '‘': 0x39, + }, + 'KeyA': { + 'A': 0x41, + 'Q': 0x51, + 'a': 0x41, + 'q': 0x51, + 'Á': 0x41, + 'Æ': 0x41, + 'á': 0x41, + 'ä': 0x41, + 'æ': 0x41, + 'Ā': 0x41, + 'ā': 0x41, + 'Ą': 0x41, + 'ą': 0x41, + 'Ф': 0x41, + 'ф': 0x41, + 'ฟ': 0x41, + 'ฤ': 0x41, + }, + 'KeyB': { + 'B': 0x42, + 'b': 0x42, + '{': 0x42, + 'И': 0x42, + 'и': 0x42, + 'ิ': 0x42, + 'ฺ': 0x42, + }, + 'KeyC': { + '&': 0x43, + 'C': 0x43, + 'c': 0x43, + '¢': 0x43, + '©': 0x43, + 'Ć': 0x43, + 'ć': 0x43, + 'С': 0x43, + 'с': 0x43, + 'ฉ': 0x43, + 'แ': 0x43, + '₢': 0x43, + }, + 'KeyD': { + 'D': 0x44, + 'd': 0x44, + 'Ð': 0x44, + 'ð': 0x44, + 'Đ': 0x44, + 'В': 0x44, + 'в': 0x44, + 'ก': 0x44, + 'ฏ': 0x44, + 'Ḍ': 0x44, + 'ḍ': 0x44, + }, + 'KeyE': { + 'E': 0x45, + 'e': 0x45, + '°': 0x45, + 'Ä': 0x45, + 'É': 0x45, + 'é': 0x45, + 'Ē': 0x45, + 'ē': 0x45, + 'Ę': 0x45, + 'ę': 0x45, + 'У': 0x45, + 'у': 0x45, + 'ฎ': 0x45, + 'ำ': 0x45, + '€': 0x45, + }, + 'KeyF': { + 'F': 0x46, + '[': 0x46, + 'f': 0x46, + 'А': 0x46, + 'а': 0x46, + 'ด': 0x46, + 'โ': 0x46, + }, + 'KeyG': { + 'G': 0x47, + ']': 0x47, + 'g': 0x47, + 'П': 0x47, + 'п': 0x47, + 'ฌ': 0x47, + 'เ': 0x47, + 'Ṅ': 0x47, + 'ṅ': 0x47, + }, + 'KeyH': { + 'H': 0x48, + 'h': 0x48, + 'Р': 0x48, + 'р': 0x48, + '็': 0x48, + '้': 0x48, + 'Ḥ': 0x48, + 'ḥ': 0x48, + }, + 'KeyI': { + 'I': 0x49, + 'i': 0x49, + 'Í': 0x49, + 'í': 0x49, + 'Ī': 0x49, + 'ī': 0x49, + 'İ': 0x49, + 'ı': 0x49, + 'Ш': 0x49, + 'ш': 0x49, + 'ณ': 0x49, + 'ร': 0x49, + }, + 'KeyJ': { + 'J': 0x4a, + 'j': 0x4a, + 'í': 0x4a, + 'О': 0x4a, + 'о': 0x4a, + '่': 0x4a, + '๋': 0x4a, + }, + 'KeyK': { + 'K': 0x4b, + 'k': 0x4b, + 'ł': 0x4b, + 'Л': 0x4b, + 'л': 0x4b, + 'ษ': 0x4b, + 'า': 0x4b, + }, + 'KeyL': { + 'L': 0x4c, + 'L̥': 0x4c, + 'l': 0x4c, + 'l̥': 0x4c, + 'Ø': 0x4c, + 'ø': 0x4c, + 'Ł': 0x4c, + 'ł': 0x4c, + 'Д': 0x4c, + 'д': 0x4c, + 'ศ': 0x4c, + 'ส': 0x4c, + }, + 'KeyM': { + '<': 0x4d, + '?': 0x4d, + 'M': 0x4d, + 'm': 0x4d, + 'µ': 0x4d, + 'Ь': 0x4d, + 'ь': 0x4d, + 'ท': 0x4d, + 'Ṁ': 0x4d, + 'ṁ': 0x4d, + }, + 'KeyN': { + 'N': 0x4e, + 'n': 0x4e, + '}': 0x4e, + 'Ñ': 0x4e, + 'ñ': 0x4e, + 'Ń': 0x4e, + 'ń': 0x4e, + 'Т': 0x4e, + 'т': 0x4e, + 'ื': 0x4e, + '์': 0x4e, + 'Ṇ': 0x4e, + 'ṇ': 0x4e, + }, + 'KeyO': { + 'O': 0x4f, + 'o': 0x4f, + 'Ó': 0x4f, + 'ó': 0x4f, + 'Ō': 0x4f, + 'ō': 0x4f, + 'Щ': 0x4f, + 'щ': 0x4f, + 'น': 0x4f, + 'ฯ': 0x4f, + }, + 'KeyP': { + 'P': 0x50, + 'p': 0x50, + 'Ö': 0x50, + 'ö': 0x50, + 'З': 0x50, + 'з': 0x50, + 'ญ': 0x50, + 'ย': 0x50, + }, + 'KeyQ': { + '/': 0x51, + '@': 0x51, + 'A': 0x41, + 'Q': 0x51, + r'\': 0x51, + 'a': 0x41, + 'q': 0x51, + 'Ä': 0x51, + 'Æ': 0x51, + 'ä': 0x51, + 'æ': 0x51, + 'Й': 0x51, + 'й': 0x51, + 'ๆ': 0x51, + '๐': 0x51, + }, + 'KeyR': { + 'R': 0x52, + 'R̥': 0x52, + 'r': 0x52, + 'r̥': 0x52, + '®': 0x52, + 'К': 0x52, + 'к': 0x52, + 'ฑ': 0x52, + 'พ': 0x52, + }, + 'KeyS': { + 'S': 0x53, + 's': 0x53, + '§': 0x53, + 'ß': 0x53, + 'đ': 0x53, + 'Ś': 0x53, + 'ś': 0x53, + 'Ы': 0x53, + 'ы': 0x53, + 'ฆ': 0x53, + 'ห': 0x53, + }, + 'KeyT': { + 'T': 0x54, + 't': 0x54, + 'Þ': 0x54, + 'þ': 0x54, + 'Е': 0x54, + 'е': 0x54, + 'ธ': 0x54, + 'ะ': 0x54, + 'Ṭ': 0x54, + 'ṭ': 0x54, + '₺': 0x54, + }, + 'KeyU': { + 'U': 0x55, + 'u': 0x55, + 'Ú': 0x55, + 'ú': 0x55, + 'Ū': 0x55, + 'ū': 0x55, + 'Г': 0x55, + 'г': 0x55, + 'ี': 0x55, + '๊': 0x55, + '€': 0x55, + }, + 'KeyV': { + '@': 0x56, + 'V': 0x56, + 'v': 0x56, + 'М': 0x56, + 'м': 0x56, + 'อ': 0x56, + 'ฮ': 0x56, + }, + 'KeyW': { + '"': 0x57, + '?': 0x57, + 'W': 0x57, + 'Z': 0x5a, + 'w': 0x57, + 'z': 0x5a, + '|': 0x57, + 'Å': 0x57, + 'å': 0x57, + 'Ц': 0x57, + 'ц': 0x57, + 'ไ': 0x57, + }, + 'KeyX': { + '#': 0x58, + ')': 0x58, + 'X': 0x58, + 'x': 0x58, + 'Ź': 0x58, + 'ź': 0x58, + 'Ч': 0x58, + 'ч': 0x58, + 'ป': 0x58, + 'Ṣ': 0x58, + 'ṣ': 0x58, + }, + 'KeyY': { + 'Y': 0x59, + 'Z': 0x5a, + 'y': 0x59, + 'z': 0x5a, + 'Ñ': 0x59, + 'Ü': 0x59, + 'ñ': 0x59, + 'ü': 0x59, + 'Н': 0x59, + 'н': 0x59, + 'ั': 0x59, + 'ํ': 0x59, + }, + 'KeyZ': { + '(': 0x5a, + '>': 0x59, + 'W': 0x57, + 'Y': 0x59, + 'Z': 0x5a, + 'w': 0x57, + 'y': 0x59, + 'z': 0x5a, + 'Æ': 0x5a, + 'æ': 0x5a, + 'Ż': 0x5a, + 'ż': 0x5a, + 'Я': 0x5a, + 'я': 0x5a, + 'ผ': 0x5a, + }, + 'Semicolon': { + 'M': 0x4d, + 'm': 0x4d, + }, +}; + +final Map> kLinuxMapping = >{ + 'Digit0': { + ')': 0x30, + '0': 0x30, + '=': 0x30, + '@': 0x30, + '}': 0x30, + '°': 0x30, + 'à': 0x30, + }, + 'Digit1': { + '!': 0x31, + '&': 0x31, + '1': 0x31, + '|': 0x31, + '¡': 0x31, + '¹': 0x31, + }, + 'Digit2': { + '"': 0x32, + '2': 0x32, + '@': 0x32, + '~': 0x32, + '²': 0x32, + 'é': 0x32, + '⅛': 0x32, + }, + 'Digit3': { + '"': 0x33, + '#': 0x33, + '3': 0x33, + '£': 0x33, + '§': 0x33, + '³': 0x33, + '·': 0x33, + '№': 0x33, + }, + 'Digit4': { + r'$': 0x34, + "'": 0x34, + '4': 0x34, + ';': 0x34, + '{': 0x34, + '~': 0x34, + '¤': 0x34, + '¼': 0x34, + }, + 'Digit5': { + '%': 0x35, + '(': 0x35, + '5': 0x35, + '[': 0x35, + '½': 0x35, + '⅜': 0x35, + }, + 'Digit6': { + '&': 0x36, + '-': 0x36, + '6': 0x36, + ':': 0x36, + '^': 0x36, + '|': 0x36, + '¬': 0x36, + '⅝': 0x36, + }, + 'Digit7': { + '&': 0x37, + '/': 0x37, + '7': 0x37, + '?': 0x37, + '`': 0x37, + '{': 0x37, + 'è': 0x37, + '⅞': 0x37, + }, + 'Digit8': { + '(': 0x38, + '*': 0x38, + '8': 0x38, + '[': 0x38, + r'\': 0x38, + '_': 0x38, + '₽': 0x38, + '™': 0x38, + }, + 'Digit9': { + '(': 0x39, + ')': 0x39, + '9': 0x39, + ']': 0x39, + '^': 0x39, + '±': 0x39, + 'ç': 0x39, + }, + 'KeyA': { + '@': 0x51, + 'A': 0x41, + 'Q': 0x51, + 'a': 0x41, + 'q': 0x51, + 'Æ': 0x41, + 'æ': 0x41, + 'Ω': 0x51, + 'Ф': 0x41, + 'ф': 0x41, + }, + 'KeyB': { + 'B': 0x42, + 'b': 0x42, + 'И': 0x42, + 'и': 0x42, + '‘': 0x42, + '’': 0x42, + '“': 0x42, + '”': 0x42, + }, + 'KeyC': { + 'C': 0x43, + 'c': 0x43, + '¢': 0x43, + '©': 0x43, + 'С': 0x43, + 'с': 0x43, + }, + 'KeyD': { + 'D': 0x44, + 'd': 0x44, + 'Ð': 0x44, + 'ð': 0x44, + 'В': 0x44, + 'в': 0x44, + }, + 'KeyE': { + 'E': 0x45, + 'e': 0x45, + '¢': 0x45, + 'У': 0x45, + 'у': 0x45, + '€': 0x45, + }, + 'KeyF': { + 'F': 0x46, + 'f': 0x46, + 'ª': 0x46, + 'đ': 0x46, + 'А': 0x46, + 'а': 0x46, + }, + 'KeyG': { + 'G': 0x47, + 'g': 0x47, + 'Ŋ': 0x47, + 'ŋ': 0x47, + 'П': 0x47, + 'п': 0x47, + }, + 'KeyH': { + 'H': 0x48, + 'h': 0x48, + 'Ħ': 0x48, + 'ħ': 0x48, + 'Р': 0x48, + 'р': 0x48, + }, + 'KeyI': { + 'I': 0x49, + 'i': 0x49, + 'ı': 0x49, + 'Ш': 0x49, + 'ш': 0x49, + '→': 0x49, + }, + 'KeyJ': { + 'J': 0x4a, + 'j': 0x4a, + '̇': 0x4a, + '̉': 0x4a, + '̛': 0x4a, + '̣': 0x4a, + 'О': 0x4a, + 'о': 0x4a, + }, + 'KeyK': { + '&': 0x4b, + 'K': 0x4b, + 'k': 0x4b, + 'ĸ': 0x4b, + 'Л': 0x4b, + 'л': 0x4b, + }, + 'KeyL': { + 'L': 0x4c, + 'l': 0x4c, + 'Ł': 0x4c, + 'ł': 0x4c, + 'Д': 0x4c, + 'д': 0x4c, + }, + 'KeyM': { + 'M': 0x4d, + 'm': 0x4d, + 'µ': 0x4d, + 'º': 0x4d, + 'Ь': 0x4d, + 'ь': 0x4d, + }, + 'KeyN': { + 'N': 0x4e, + 'n': 0x4e, + 'Т': 0x4e, + 'т': 0x4e, + '’': 0x4e, + '”': 0x4e, + }, + 'KeyO': { + 'O': 0x4f, + 'o': 0x4f, + 'Ø': 0x4f, + 'ø': 0x4f, + 'Щ': 0x4f, + 'щ': 0x4f, + }, + 'KeyP': { + 'P': 0x50, + 'p': 0x50, + 'Þ': 0x50, + 'þ': 0x50, + 'З': 0x50, + 'з': 0x50, + }, + 'KeyQ': { + '@': 0x51, + 'A': 0x41, + 'Q': 0x51, + 'a': 0x41, + 'q': 0x51, + 'Æ': 0x41, + 'æ': 0x41, + 'Ω': 0x51, + 'Й': 0x51, + 'й': 0x51, + }, + 'KeyR': { + 'R': 0x52, + 'r': 0x52, + '®': 0x52, + '¶': 0x52, + 'К': 0x52, + 'к': 0x52, + }, + 'KeyS': { + 'S': 0x53, + 's': 0x53, + '§': 0x53, + 'ß': 0x53, + 'ſ': 0x53, + 'Ы': 0x53, + 'ы': 0x53, + 'ẞ': 0x53, + }, + 'KeyT': { + 'T': 0x54, + 't': 0x54, + 'Ŧ': 0x54, + 'ŧ': 0x54, + 'Е': 0x54, + 'е': 0x54, + }, + 'KeyU': { + 'U': 0x55, + 'u': 0x55, + 'Г': 0x55, + 'г': 0x55, + '↑': 0x55, + '↓': 0x55, + }, + 'KeyV': { + 'V': 0x56, + 'v': 0x56, + 'М': 0x56, + 'м': 0x56, + '‘': 0x56, + '‚': 0x56, + '“': 0x56, + '„': 0x56, + }, + 'KeyW': { + '<': 0x5a, + 'W': 0x57, + 'Z': 0x5a, + 'w': 0x57, + 'z': 0x5a, + '«': 0x5a, + 'Ł': 0x57, + 'ł': 0x57, + 'Ц': 0x57, + 'ц': 0x57, + }, + 'KeyX': { + '>': 0x58, + 'X': 0x58, + 'x': 0x58, + '«': 0x58, + '»': 0x58, + 'Ч': 0x58, + 'ч': 0x58, + '‹': 0x58, + }, + 'KeyY': { + 'Y': 0x59, + 'Z': 0x5a, + 'y': 0x59, + 'z': 0x5a, + '¥': 0x1, + 'Н': 0x59, + 'н': 0x59, + '←': 0x1, + }, + 'KeyZ': { + '<': 0x5a, + 'W': 0x57, + 'Y': 0x59, + 'Z': 0x5a, + 'w': 0x57, + 'y': 0x59, + 'z': 0x5a, + '«': 0x5a, + '»': 0x59, + 'Ł': 0x57, + 'ł': 0x57, + 'Я': 0x5a, + 'я': 0x5a, + '›': 0x59, + }, + 'Semicolon': { + 'M': 0x4d, + 'm': 0x4d, + 'µ': 0x4d, + 'º': 0x4d, + }, +}; + +final Map> kDarwinMapping = >{ + 'Comma': { + 'W': 0x57, + 'w': 0x57, + '„': 0x57, + '∑': 0x57, + }, + 'Digit0': { + ')': 0x30, + '0': 0x30, + '=': 0x30, + '`': 0x30, + '}': 0x30, + '¯': 0x30, + 'º': 0x30, + 'Ø': 0x30, + 'à': 0x30, + 'ø': 0x30, + 'ľ': 0x30, + '‚': 0x30, + '≈': 0x30, + '≠': 0x30, + ')': 0x30, + }, + 'Digit1': { + '!': 0x31, + '&': 0x31, + '1': 0x31, + 'Deadkey': 0x31, + '|': 0x31, + '¡': 0x31, + '©': 0x31, + '«': 0x31, + '¬': 0x31, + '»': 0x31, + 'ı': 0x31, + 'Ń': 0x31, + 'ŕ': 0x31, + '⁄': 0x31, + '': 0x31, + '!': 0x31, + }, + 'Digit2': { + '"': 0x32, + '2': 0x32, + '@': 0x32, + 'é': 0x32, + 'ë': 0x32, + 'Ř': 0x32, + '˝': 0x32, + '“': 0x32, + '”': 0x32, + '„': 0x32, + '€': 0x32, + '™': 0x32, + }, + 'Digit3': { + '"': 0x33, + '#': 0x33, + '3': 0x33, + '£': 0x33, + '¥': 0x33, + '§': 0x33, + '¶': 0x33, + '·': 0x33, + '‘': 0x33, + '’': 0x33, + '“': 0x33, + '”': 0x33, + '•': 0x33, + '‹': 0x33, + '€': 0x33, + '№': 0x33, + }, + 'Digit4': { + r'$': 0x34, + '%': 0x34, + "'": 0x34, + '4': 0x34, + '¢': 0x34, + '£': 0x34, + '¥': 0x34, + 'ß': 0x34, + '‘': 0x34, + '’': 0x34, + '›': 0x34, + '€': 0x34, + }, + 'Digit5': { + '%': 0x35, + '(': 0x35, + '5': 0x35, + ':': 0x35, + '[': 0x35, + '{': 0x35, + '~': 0x35, + '§': 0x35, + 'į': 0x35, + 'ř': 0x35, + '†': 0x35, + '‰': 0x35, + '∞': 0x35, + 'fi': 0x35, + }, + 'Digit6': { + ' ': 0x36, + '&': 0x36, + ',': 0x36, + '6': 0x36, + 'Deadkey': 0x36, + ']': 0x36, + '^': 0x36, + '§': 0x36, + '¬': 0x36, + '¶': 0x36, + 'å': 0x36, + 'Ŗ': 0x36, + '̂': 0x36, + '‹': 0x36, + '›': 0x36, + 'fl': 0x36, + }, + 'Digit7': { + '&': 0x37, + '.': 0x37, + '/': 0x37, + '7': 0x37, + r'\': 0x37, + '|': 0x37, + '«': 0x37, + '¶': 0x37, + '»': 0x37, + 'è': 0x37, + '÷': 0x37, + 'ŗ': 0x37, + '‡': 0x37, + '⁄': 0x37, + }, + 'Digit8': { + '!': 0x38, + '(': 0x38, + '*': 0x38, + '8': 0x38, + ';': 0x38, + 'Deadkey': 0x38, + '[': 0x38, + '{': 0x38, + '¡': 0x38, + '°': 0x38, + 'Û': 0x38, + '˜': 0x38, + '‘': 0x38, + '“': 0x38, + '•': 0x38, + '√': 0x38, + '': 0x38, + }, + 'Digit9': { + ' ': 0x39, + "'": 0x39, + '(': 0x39, + ')': 0x39, + '9': 0x39, + 'Deadkey': 0x39, + ']': 0x39, + '{': 0x39, + '}': 0x39, + 'ª': 0x39, + '·': 0x39, + 'Á': 0x39, + 'Ç': 0x39, + 'ç': 0x39, + 'Ľ': 0x39, + 'Š': 0x39, + '’': 0x39, + '”': 0x39, + '(': 0x39, + }, + 'KeyA': { + 'A': 0x41, + 'Deadkey': 0x41, + 'Q': 0x51, + 'a': 0x41, + 'q': 0x51, + 'Å': 0x41, + 'å': 0x41, + 'Ą': 0x41, + 'ą': 0x41, + 'ƒ': 0x41, + '̄': 0x41, + 'Ω': 0x51, + 'Ф': 0x41, + 'ф': 0x41, + '‡': 0x51, + '◊': 0x41, + 'ㅁ': 0x41, + '': 0x41, + }, + 'KeyB': { + 'B': 0x42, + 'Deadkey': 0x42, + 'X': 0x58, + 'b': 0x42, + 'x': 0x58, + '»': 0x42, + 'Í': 0x42, + 'ß': 0x42, + 'ı': 0x42, + 'ļ': 0x42, + 'ű': 0x42, + '˛': 0x58, + '̆': 0x42, + 'И': 0x42, + 'и': 0x42, + '‹': 0x42, + '›': 0x42, + '∫': 0x42, + '≈': 0x58, + 'ㅠ': 0x42, + }, + 'KeyC': { + ' ': 0x43, + 'C': 0x43, + 'Deadkey': 0x43, + 'J': 0x4a, + 'c': 0x43, + 'j': 0x4a, + '¢': 0x43, + '©': 0x43, + 'Á': 0x43, + 'Ç': 0x43, + 'Ô': 0x4a, + 'ç': 0x43, + 'Ć': 0x43, + 'ć': 0x43, + '̧': 0x43, + 'С': 0x43, + 'с': 0x43, + '∆': 0x4a, + '≠': 0x43, + 'ㅊ': 0x43, + }, + 'KeyD': { + 'D': 0x44, + 'Deadkey': 0x45, + 'E': 0x45, + 'd': 0x44, + 'e': 0x45, + '´': 0x45, + 'Î': 0x44, + 'Ð': 0x44, + 'ð': 0x44, + 'Ž': 0x44, + '˘': 0x44, + 'Ћ': 0x44, + 'В': 0x44, + 'в': 0x44, + 'ћ': 0x44, + '™': 0x44, + '∂': 0x44, + '∆': 0x44, + 'ㅇ': 0x44, + }, + 'KeyE': { + 'Deadkey': 0x45, + 'E': 0x45, + 'e': 0x45, + '´': 0x45, + 'È': 0x45, + 'É': 0x45, + 'Ê': 0x45, + 'é': 0x45, + 'ê': 0x45, + 'Ę': 0x45, + 'ę': 0x45, + '́': 0x45, + 'Ќ': 0x45, + 'У': 0x45, + 'у': 0x45, + 'ќ': 0x45, + '‰': 0x45, + '€': 0x45, + 'ㄷ': 0x45, + 'ㄸ': 0x45, + }, + 'KeyF': { + 'Deadkey': 0x55, + 'F': 0x46, + 'U': 0x55, + 'f': 0x46, + 'u': 0x55, + '¨': 0x55, + '·': 0x46, + 'Ï': 0x46, + '÷': 0x46, + 'ń': 0x46, + 'ž': 0x46, + 'ƒ': 0x46, + '˙': 0x46, + 'А': 0x46, + 'а': 0x46, + '∫': 0x46, + 'ㄹ': 0x46, + 'fi': 0x46, + }, + 'KeyG': { + 'Deadkey': 0x1, + 'G': 0x47, + 'I': 0x49, + 'g': 0x47, + 'i': 0x49, + '©': 0x47, + '¯': 0x47, + '¸': 0x47, + 'Ì': 0x47, + 'Ū': 0x47, + 'ˆ': 0x49, + '˚': 0x47, + '˝': 0x47, + 'П': 0x47, + 'п': 0x47, + '∞': 0x47, + 'ㅎ': 0x47, + '': 0x47, + 'fi': 0x47, + 'fl': 0x47, + }, + 'KeyH': { + ' ': 0x48, + 'D': 0x44, + 'Deadkey': 0x48, + 'H': 0x48, + 'd': 0x44, + 'h': 0x48, + 'ª': 0x48, + '¸': 0x48, + 'Ì': 0x48, + 'Î': 0x1, + 'Ó': 0x48, + 'ķ': 0x48, + '˘': 0x48, + '˙': 0x48, + '˛': 0x48, + '̱': 0x48, + 'Р': 0x48, + 'р': 0x48, + '₽': 0x48, + '™': 0x48, + '∂': 0x44, + '∆': 0x48, + 'ㅗ': 0x48, + }, + 'KeyI': { + ' ': 0x49, + 'C': 0x43, + 'Deadkey': 0x49, + 'I': 0x49, + 'c': 0x43, + 'i': 0x49, + 'Ç': 0x43, + 'È': 0x49, + 'Û': 0x49, + 'ç': 0x43, + 'î': 0x49, + 'ï': 0x49, + 'ı': 0x49, + 'Œ': 0x49, + 'œ': 0x49, + 'ť': 0x49, + 'ˆ': 0x49, + '̛': 0x49, + 'Ѕ': 0x49, + 'Ш': 0x49, + 'ш': 0x49, + 'ѕ': 0x49, + '⁄': 0x49, + 'ㅑ': 0x49, + }, + 'KeyJ': { + 'Deadkey': 0x4a, + 'H': 0x48, + 'J': 0x4a, + 'h': 0x48, + 'j': 0x4a, + 'ª': 0x4a, + '¬': 0x4a, + '¯': 0x4a, + '°': 0x4a, + '¶': 0x4a, + 'º': 0x4a, + 'Í': 0x4a, + 'Ï': 0x4a, + 'Ó': 0x48, + 'Ô': 0x4a, + 'ı': 0x4a, + '˙': 0x48, + '˝': 0x4a, + '̋': 0x4a, + 'О': 0x4a, + 'о': 0x4a, + '•': 0x4a, + '∆': 0x4a, + '√': 0x4a, + 'ㅓ': 0x4a, + }, + 'KeyK': { + 'Deadkey': 0x4b, + 'K': 0x4b, + 'T': 0x54, + 'k': 0x4b, + 't': 0x54, + '§': 0x4b, + 'ª': 0x4b, + 'º': 0x4b, + 'È': 0x4b, + 'Ë': 0x4b, + 'ū': 0x4b, + 'Ż': 0x4b, + 'ˆ': 0x4b, + 'ˇ': 0x1, + '˚': 0x4b, + '˛': 0x4b, + '̊': 0x4b, + 'Љ': 0x4b, + 'Л': 0x4b, + 'л': 0x4b, + 'љ': 0x4b, + '†': 0x54, + '∆': 0x4b, + 'ㅏ': 0x4b, + '': 0x4b, + }, + 'KeyL': { + ' ': 0x4c, + '@': 0x4c, + 'Deadkey': 0x1, + 'L': 0x4c, + 'N': 0x4e, + 'l': 0x4c, + 'n': 0x4e, + '|': 0x4c, + '¬': 0x4c, + 'Ò': 0x4c, + 'Ł': 0x4c, + 'ł': 0x4c, + 'ˇ': 0x4c, + '˘': 0x4c, + '˜': 0x4e, + '̵': 0x4c, + 'Д': 0x4c, + 'д': 0x4c, + '∆': 0x4c, + 'ㅣ': 0x4c, + 'fi': 0x4c, + 'fl': 0x4c, + }, + 'KeyM': { + 'Deadkey': 0x4d, + 'M': 0x4d, + 'm': 0x4d, + '~': 0x4d, + 'µ': 0x4d, + 'Â': 0x4d, + 'Ú': 0x4d, + 'Ķ': 0x4d, + 'ų': 0x4d, + '˘': 0x4d, + '˚': 0x4d, + '˜': 0x4d, + '̨': 0x4d, + 'Ь': 0x4d, + 'ь': 0x4d, + '’': 0x4d, + '”': 0x4d, + 'ㅡ': 0x4d, + }, + 'KeyN': { + ' ': 0x4e, + 'B': 0x42, + 'Deadkey': 0x4e, + 'N': 0x4e, + 'b': 0x42, + 'n': 0x4e, + 'Ó': 0x4e, + 'ı': 0x1, + 'Ń': 0x4e, + 'ń': 0x4e, + 'ˆ': 0x4e, + '˙': 0x4e, + '˜': 0x4e, + '̃': 0x4e, + 'Т': 0x4e, + 'т': 0x4e, + '‘': 0x4e, + '“': 0x4e, + '›': 0x4e, + '™': 0x4e, + '∫': 0x42, + 'ㅜ': 0x4e, + }, + 'KeyO': { + 'O': 0x4f, + 'R': 0x52, + 'o': 0x4f, + 'r': 0x52, + '®': 0x52, + 'Ó': 0x4f, + 'Ø': 0x4f, + 'ó': 0x4f, + 'ø': 0x4f, + 'Œ': 0x4f, + 'œ': 0x4f, + 'Ў': 0x4f, + 'Щ': 0x4f, + 'щ': 0x4f, + 'ў': 0x4f, + '‰': 0x52, + 'ㅐ': 0x4f, + 'ㅒ': 0x4f, + }, + 'KeyP': { + 'Deadkey': 0x50, + 'L': 0x4c, + 'P': 0x50, + 'l': 0x4c, + 'p': 0x50, + '¬': 0x4c, + 'Ò': 0x4c, + 'Ļ': 0x50, + 'ł': 0x50, + '̦': 0x50, + 'π': 0x50, + 'З': 0x50, + 'з': 0x50, + '‘': 0x50, + '’': 0x50, + '∏': 0x50, + 'ㅔ': 0x50, + 'ㅖ': 0x50, + }, + 'KeyQ': { + 'A': 0x41, + 'Q': 0x51, + 'a': 0x41, + 'q': 0x51, + '«': 0x51, + '°': 0x51, + '»': 0x51, + 'Æ': 0x41, + 'æ': 0x41, + 'Ō': 0x51, + 'ő': 0x51, + 'Œ': 0x51, + 'œ': 0x51, + 'Ј': 0x51, + 'Й': 0x51, + 'й': 0x51, + 'ј': 0x51, + '‚': 0x51, + '„': 0x51, + '•': 0x51, + 'ㅂ': 0x51, + 'ㅃ': 0x51, + }, + 'KeyR': { + ' ': 0x52, + 'P': 0x50, + 'R': 0x52, + 'p': 0x50, + 'r': 0x52, + '£': 0x52, + '®': 0x52, + '¸': 0x52, + 'Â': 0x52, + 'Ì': 0x52, + 'π': 0x50, + 'К': 0x52, + 'к': 0x52, + '‚': 0x52, + '‰': 0x52, + '∏': 0x50, + '√': 0x52, + 'ㄱ': 0x52, + 'ㄲ': 0x52, + }, + 'KeyS': { + ' ': 0x53, + 'O': 0x4f, + 'S': 0x53, + 'o': 0x4f, + 's': 0x53, + '¯': 0x53, + 'Í': 0x53, + 'Ò': 0x53, + 'Ø': 0x4f, + 'ß': 0x53, + 'ø': 0x4f, + 'Ś': 0x53, + 'ś': 0x53, + 'Ы': 0x53, + 'ы': 0x53, + '‚': 0x53, + '∑': 0x53, + '∫': 0x53, + 'ㄴ': 0x53, + }, + 'KeyT': { + 'T': 0x54, + 'Y': 0x59, + 't': 0x54, + 'y': 0x59, + '¥': 0x59, + 'Á': 0x59, + 'Ê': 0x54, + 'Ò': 0x54, + 'Þ': 0x54, + 'þ': 0x54, + 'ś': 0x54, + 'ˇ': 0x54, + '˝': 0x54, + 'Е': 0x54, + 'е': 0x54, + '†': 0x54, + '‡': 0x54, + '™': 0x54, + 'ㅅ': 0x54, + 'ㅆ': 0x54, + }, + 'KeyU': { + ' ': 0x55, + 'Deadkey': 0x55, + 'G': 0x47, + 'U': 0x55, + 'g': 0x47, + 'u': 0x55, + '¨': 0x55, + '©': 0x47, + 'ª': 0x55, + 'º': 0x55, + 'Á': 0x55, + 'Ë': 0x55, + 'Ù': 0x55, + 'Ü': 0x55, + 'ü': 0x55, + 'Ť': 0x55, + '˝': 0x47, + '̈': 0x55, + 'Ѓ': 0x55, + 'Г': 0x55, + 'г': 0x55, + 'ѓ': 0x55, + 'ㅕ': 0x55, + }, + 'KeyV': { + 'Deadkey': 0x56, + 'K': 0x4b, + 'V': 0x56, + 'k': 0x4b, + 'v': 0x56, + '«': 0x56, + 'µ': 0x56, + 'É': 0x56, + '˚': 0x4b, + '̌': 0x56, + 'М': 0x56, + 'м': 0x56, + '‹': 0x56, + '√': 0x56, + '◊': 0x56, + 'ㅍ': 0x56, + '': 0x4b, + }, + 'KeyW': { + 'Deadkey': 0x57, + 'W': 0x57, + 'Z': 0x5a, + 'w': 0x57, + 'z': 0x5a, + 'À': 0x57, + 'Â': 0x5a, + 'Å': 0x5a, + 'Æ': 0x57, + 'æ': 0x57, + '˝': 0x57, + '̇': 0x57, + 'Ω': 0x57, + 'Џ': 0x57, + 'Ц': 0x57, + 'ц': 0x57, + 'џ': 0x57, + '„': 0x57, + '∑': 0x57, + 'ㅈ': 0x57, + 'ㅉ': 0x57, + }, + 'KeyX': { + 'Deadkey': 0x58, + 'Q': 0x51, + 'X': 0x58, + 'q': 0x51, + 'x': 0x58, + 'Ù': 0x58, + 'Œ': 0x51, + 'œ': 0x51, + 'Ź': 0x58, + 'ź': 0x58, + 'ˇ': 0x58, + '˛': 0x58, + '̣': 0x58, + 'Ч': 0x58, + 'ч': 0x58, + '†': 0x58, + '‡': 0x58, + '›': 0x58, + '⁄': 0x58, + '∑': 0x58, + '≈': 0x58, + 'ㅌ': 0x58, + }, + 'KeyY': { + ' ': 0x59, + 'F': 0x46, + 'Y': 0x59, + 'Z': 0x5a, + 'f': 0x46, + 'y': 0x59, + 'z': 0x5a, + '¥': 0x59, + 'µ': 0x59, + 'Á': 0x59, + 'Æ': 0x59, + 'Ï': 0x46, + 'Ú': 0x59, + 'æ': 0x59, + 'ī': 0x59, + 'Ÿ': 0x59, + 'ƒ': 0x46, + 'ˇ': 0x5a, + '˜': 0x59, + 'Ω': 0x5a, + 'Њ': 0x59, + 'Н': 0x59, + 'н': 0x59, + 'њ': 0x59, + 'ㅛ': 0x59, + }, + 'KeyZ': { + ' ': 0x5a, + 'Deadkey': 0x5a, + 'W': 0x57, + 'Y': 0x59, + 'Z': 0x5a, + 'w': 0x57, + 'y': 0x59, + 'z': 0x5a, + '¥': 0x59, + '¸': 0x5a, + 'Û': 0x5a, + '÷': 0x5a, + 'Ż': 0x5a, + 'ż': 0x5a, + '̉': 0x5a, + 'Ω': 0x5a, + 'Ђ': 0x5a, + 'Я': 0x5a, + 'я': 0x5a, + 'ђ': 0x5a, + '‡': 0x59, + '‹': 0x1, + '›': 0x57, + '⁄': 0x5a, + '∑': 0x5a, + 'ㅋ': 0x5a, + }, + 'Period': { + 'V': 0x56, + 'v': 0x56, + '√': 0x56, + '◊': 0x56, + }, + 'Semicolon': { + 'M': 0x4d, + 'S': 0x53, + 'm': 0x4d, + 's': 0x53, + 'µ': 0x4d, + 'Í': 0x53, + 'Ó': 0x4d, + 'ß': 0x53, + }, + 'Slash': { + 'Z': 0x5a, + 'z': 0x5a, + '¸': 0x5a, + 'Ω': 0x5a, + }, +}; diff --git a/third_party/web_keyboard_layouts/lib/types.g.dart b/third_party/web_keyboard_layouts/lib/types.g.dart deleted file mode 100644 index 738f4ee9cedc4..0000000000000 --- a/third_party/web_keyboard_layouts/lib/types.g.dart +++ /dev/null @@ -1,199 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -// DO NOT EDIT -- DO NOT EDIT -- DO NOT EDIT -// -// This file is auto generated by flutter/engine:flutter/tools/gen_web_keyboard_layouts based on -// layout_types.dart in the same pacakge. -// -// Edit the following files instead: -// -// - Script: lib/main.dart -// - Templates: data/*.tmpl -// -// See flutter/engine:flutter/tools/gen_web_keyboard_layouts/README.md for more information. - -part of web_keyboard_layouts; - -/// The platform that the browser is running on. -enum LayoutPlatform { - /// Windows. - win, - /// Linux. - linux, - /// MacOS or iOS. - darwin, -} - -// The length of [LayoutEntry.printable]. -const int _kPrintableLength = 4; - -/// Describes the characters that a physical keyboard key will be mapped to -/// under different modifier states, for a given language on a given -/// platform. -class LayoutEntry { - /// Create a layout entry. - LayoutEntry(this.printables, this.deadMasks) - : assert(printables.length == _kPrintableLength); - - /// The printable characters that a key should be mapped to under different - /// modifier states. - /// - /// The [printables] always have a length of 4, corresponding to "without any - /// modifiers", "with Shift", "with AltGr", and "with Shift and AltGr" - /// respectively. Some values might be empty, or be dead keys that are - /// indiecated by [deadMasks]. - final List printables; - - /// Whether the outcome of a key is a dead key under different modifier - /// states. - /// - /// The four LSB [deadMasks] correspond to the four conditions of - /// [printables]: 0x1 for "without any modifiers", 0x2 for "with Shift", - /// 0x4 for "with AltGr", and 0x8 for "with Shift and AltGr". A set bit means - /// the character is a dead key. - final int deadMasks; - - /// An empty [LayoutEntry] that produces dead keys under all conditions. - static final LayoutEntry empty = LayoutEntry( - const ['', '', '', ''], 0xf); -} - -/// Describes the characters that all goal keys will be mapped to for a given -/// language on a given platform. -class Layout { - /// Create a [Layout]. - const Layout(this.language, this.platform, this.entries); - - /// The language being used. - final String language; - - /// The platform that the browser is running on. - final LayoutPlatform platform; - - /// Maps from DOM `KeyboardKey.code`s to the characters they produce. - final Map entries; -} - -/// Describes all information needed to detect keyboard layout for any languages -/// on any platforms. -class LayoutStore { - /// Create a [LayoutStore]. - const LayoutStore(this.goals, this.layouts); - - /// The list of goals, mapping from DOM `KeyboardKey.code` to their mandatory - /// goal characters, or null if this goal is optional. - /// - /// Mandatory goals are characters that must be fulfilled during keyboard - /// layout detection. If the character of a mandatory goal is not assigned in - /// earlier stages, this character (the value of this map) will be assigned - /// to its corresponding key (the key of this map). - /// - /// Optional goals are keys that will be tested to see if they can be mapped - /// to mandatory goal characters. - final Map goals; - - /// The layout information for different languages on different platforms. - final List layouts; -} - -// A [ByteBuffer] that records a offset for the convenience of reading -// sequentially. -class _ByteStream { - _ByteStream(this.buffer) - : _data = buffer.asByteData(), _offset = 0; - - final ByteBuffer buffer; - final ByteData _data; - - // The current offset. - // - // The next read will start from this byte (inclusive). - int get offest => _offset; - int _offset; - - // Read the next byte as an 8-bit unsigned integer, and increase [offset] by - // 1. - int readUint8() { - final int result = _data.getUint8(_offset); - _offset += 1; - return result; - } - - // Read the next few bytes as a UTF-8 string, and increase [offset] - // accordingly. - // - // The first byte will be a uint8, `length`, the number of bytes of the UTF-8 - // sequence. Following that is the UTF-8 sequence. Therefore, the total - // increment for [offset] is `length + 1`. - // - // If the `length` is 0, then an empty string is returned. - String readString() { - final int length = _data.getUint8(_offset); - if (length == 0) { - _offset += 1; - return ''; - } - final Uint8List bytes = buffer.asUint8List(_offset + 1, length); - final String result = utf8.decode(bytes); - _offset += 1 + length; - return result; - } - - // Read the next few bytes as a nullable UTF-8 string, and increase [offset] - // accordingly. - // - // It is the same as [readString], except that if the `length` is 0, a null is - // returned. - String? readNullableString() { - final int length = _data.getUint8(_offset); - if (length == 0) { - _offset += 1; - return null; - } - return readString(); - } -} - -/// Decode a [LayoutStore] out of the compressed binary data. -LayoutStore unmarshallStoreCompressed(String compressed) { - final Uint8List bytes = Uint8List.fromList(gzip.decode(base64.decode(compressed))); - return _unmarshallStore(bytes.buffer); -} - -LayoutStore _unmarshallStore(ByteBuffer buffer) { - final _ByteStream stream = _ByteStream(buffer); - final Map goals = _unmarshallGoals(stream); - final List goalKeys = goals.keys.toList(); - final int layoutNum = stream.readUint8(); - final List layouts = List.generate(layoutNum, (_) { - return _unmarshallLayout(stream, goalKeys); - }); - return LayoutStore(goals, layouts); -} - -Map _unmarshallGoals(_ByteStream stream) { - final int goalsLength = stream.readUint8(); - return Map.fromEntries((() sync* { - for (int goalIndex = 0; goalIndex < goalsLength; goalIndex += 1) { - yield MapEntry(stream.readString(), stream.readNullableString()); - } - })()); -} - -Layout _unmarshallLayout(_ByteStream stream, List goalKeys) { - final String language = stream.readString(); - final LayoutPlatform platform = LayoutPlatform.values[stream.readUint8()]; - final Map entries = Map.fromIterables( - goalKeys, - goalKeys.map((_) => _unmarshallLayoutEntry(stream)), - ); - return Layout(language, platform, entries); -} - -LayoutEntry _unmarshallLayoutEntry(_ByteStream stream) { - final List printables = List.generate(_kPrintableLength, - (_) => stream.readString()); - final int deadMasks = stream.readUint8(); - return LayoutEntry(printables, deadMasks); -} diff --git a/third_party/web_keyboard_layouts/lib/web_keyboard_layouts.dart b/third_party/web_keyboard_layouts/lib/web_keyboard_layouts.dart index e6461a29657d5..f9d4f3e978b9f 100644 --- a/third_party/web_keyboard_layouts/lib/web_keyboard_layouts.dart +++ b/third_party/web_keyboard_layouts/lib/web_keyboard_layouts.dart @@ -3,9 +3,28 @@ library web_keyboard_layouts; -import 'dart:convert' show base64, utf8; -import 'dart:io' hide BytesBuilder; -import 'dart:typed_data'; +part 'key_mappings.g.dart'; -part 'types.g.dart'; -part 'definitions.g.dart'; +const int _kUseKeyCode = 1; + +class LayoutMapping { + LayoutMapping.win() : _mapping = kWinMapping; + LayoutMapping.linux() : _mapping = kLinuxMapping; + LayoutMapping.darwin() : _mapping = kDarwinMapping; + + int? getLogicalKey(String eventCode, String eventKey, String eventKeyCode) { + print('$eventCode, $eventKey, $eventKeyCode'); + final int? result = _mapping[eventCode]?[eventKey]; + if (result == _kUseKeyCode) { + return getLetterCode(eventKeyCode.toUpperCase()); + } + return result; + } + + final Map> _mapping; + + static int? getLetterCode(String letter) { + assert (letter.length == 1); + return letter.codeUnitAt(0); + } +} diff --git a/third_party/web_keyboard_layouts/pubspec.yaml b/third_party/web_keyboard_layouts/pubspec.yaml index 920661f58ad57..79587f449f860 100644 --- a/third_party/web_keyboard_layouts/pubspec.yaml +++ b/third_party/web_keyboard_layouts/pubspec.yaml @@ -7,3 +7,6 @@ version: 0.1.1 environment: sdk: ">=2.12.0 <3.0.0" + +dev_dependencies: + test: ^1.21.7 diff --git a/third_party/web_keyboard_layouts/test/layout_mapping_tests.dart b/third_party/web_keyboard_layouts/test/layout_mapping_tests.dart new file mode 100644 index 0000000000000..a7e45028a1d15 --- /dev/null +++ b/third_party/web_keyboard_layouts/test/layout_mapping_tests.dart @@ -0,0 +1,18 @@ +import 'package:test/test.dart'; +import 'package:web_keyboard_layouts/web_keyboard_layouts.dart'; + +import 'test_cases.g.dart'; + +void main() { + group('Win', () { + testWin(LayoutMapping.win()); + }); + + group('Linux', () { + testLinux(LayoutMapping.linux()); + }); + + group('Darwin', () { + testDarwin(LayoutMapping.darwin()); + }); +} diff --git a/third_party/web_keyboard_layouts/test/test_cases.g.dart b/third_party/web_keyboard_layouts/test/test_cases.g.dart new file mode 100644 index 0000000000000..865d938d6eaea --- /dev/null +++ b/third_party/web_keyboard_layouts/test/test_cases.g.dart @@ -0,0 +1,1740 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. + +// DO NOT EDIT -- DO NOT EDIT -- DO NOT EDIT +// +// This file is auto generated by flutter/engine:flutter/tools/gen_web_keyboard_layouts based on +// https://github.com/microsoft/vscode/tree/@@@COMMIT_ID@@@/src/vs/workbench/services/keybinding/browser/keyboardLayouts +// +// Edit the following files instead: +// +// - Script: lib/main.dart +// - Templates: data/*.tmpl +// +// See flutter/engine:flutter/tools/gen_web_keyboard_layouts/README.md for more information. + +import 'package:test/test.dart'; +import 'package:web_keyboard_layouts/web_keyboard_layouts.dart'; +import 'testing.dart'; + +void testWin(LayoutMapping mapping) { + group('cz', () { + verifyEntry(mapping, 'Digit0', ['é', '0', '˝', ''], 0x30); + verifyEntry(mapping, 'Digit1', ['+', '1', '~', ''], 0x31); + verifyEntry(mapping, 'Digit2', ['ě', '2', 'ˇ', ''], 0x32); + verifyEntry(mapping, 'Digit3', ['š', '3', '^', ''], 0x33); + verifyEntry(mapping, 'Digit4', ['č', '4', '˘', ''], 0x34); + verifyEntry(mapping, 'Digit5', ['ř', '5', '°', ''], 0x35); + verifyEntry(mapping, 'Digit6', ['ž', '6', '˛', ''], 0x36); + verifyEntry(mapping, 'Digit7', ['ý', '7', '`', ''], 0x37); + verifyEntry(mapping, 'Digit8', ['á', '8', '˙', ''], 0x38); + verifyEntry(mapping, 'Digit9', ['í', '9', '´', ''], 0x39); + verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 0x41); + verifyEntry(mapping, 'KeyB', ['b', 'B', '{', ''], 0x42); + verifyEntry(mapping, 'KeyC', ['c', 'C', '&', ''], 0x43); + verifyEntry(mapping, 'KeyD', ['d', 'D', 'Đ', ''], 0x44); + verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 0x45); + verifyEntry(mapping, 'KeyF', ['f', 'F', '[', ''], 0x46); + verifyEntry(mapping, 'KeyG', ['g', 'G', ']', ''], 0x47); + verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 0x48); + verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 0x49); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 0x4a); + verifyEntry(mapping, 'KeyK', ['k', 'K', 'ł', ''], 0x4b); + verifyEntry(mapping, 'KeyL', ['l', 'L', 'Ł', ''], 0x4c); + verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 0x4d); + verifyEntry(mapping, 'KeyN', ['n', 'N', '}', ''], 0x4e); + verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 0x4f); + verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 0x50); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', r'\', ''], 0x51); + verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 0x52); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'đ', ''], 0x53); + verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 0x54); + verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 0x55); + verifyEntry(mapping, 'KeyV', ['v', 'V', '@', ''], 0x56); + verifyEntry(mapping, 'KeyW', ['w', 'W', '|', ''], 0x57); + verifyEntry(mapping, 'KeyX', ['x', 'X', '#', ''], 0x58); + verifyEntry(mapping, 'KeyY', ['z', 'Z', '', ''], 0x5a); + verifyEntry(mapping, 'KeyZ', ['y', 'Y', '', ''], 0x59); +}); + + group('de', () { + verifyEntry(mapping, 'Digit0', ['0', '=', '}', ''], 0x30); + verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], 0x31); + verifyEntry(mapping, 'Digit2', ['2', '"', '²', ''], 0x32); + verifyEntry(mapping, 'Digit3', ['3', '§', '³', ''], 0x33); + verifyEntry(mapping, 'Digit4', ['4', r'$', '', ''], 0x34); + verifyEntry(mapping, 'Digit5', ['5', '%', '', ''], 0x35); + verifyEntry(mapping, 'Digit6', ['6', '&', '', ''], 0x36); + verifyEntry(mapping, 'Digit7', ['7', '/', '{', ''], 0x37); + verifyEntry(mapping, 'Digit8', ['8', '(', '[', ''], 0x38); + verifyEntry(mapping, 'Digit9', ['9', ')', ']', ''], 0x39); + verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 0x41); + verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 0x42); + verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 0x43); + verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 0x44); + verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 0x45); + verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 0x46); + verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 0x47); + verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 0x48); + verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 0x49); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 0x4a); + verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 0x4b); + verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 0x4c); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', ''], 0x4d); + verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 0x4e); + verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 0x4f); + verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 0x50); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', '@', ''], 0x51); + verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 0x52); + verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 0x53); + verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 0x54); + verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 0x55); + verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 0x56); + verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 0x57); + verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 0x58); + verifyEntry(mapping, 'KeyY', ['z', 'Z', '', ''], 0x5a); + verifyEntry(mapping, 'KeyZ', ['y', 'Y', '', ''], 0x59); +}); + + group('de-swiss', () { + verifyEntry(mapping, 'Digit0', ['0', '=', '', ''], 0x30); + verifyEntry(mapping, 'Digit1', ['1', '+', '¦', ''], 0x31); + verifyEntry(mapping, 'Digit2', ['2', '"', '@', ''], 0x32); + verifyEntry(mapping, 'Digit3', ['3', '*', '#', ''], 0x33); + verifyEntry(mapping, 'Digit4', ['4', 'ç', '°', ''], 0x34); + verifyEntry(mapping, 'Digit5', ['5', '%', '§', ''], 0x35); + verifyEntry(mapping, 'Digit6', ['6', '&', '¬', ''], 0x36); + verifyEntry(mapping, 'Digit7', ['7', '/', '|', ''], 0x37); + verifyEntry(mapping, 'Digit8', ['8', '(', '¢', ''], 0x38); + verifyEntry(mapping, 'Digit9', ['9', ')', '', ''], 0x39); + verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 0x41); + verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 0x42); + verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 0x43); + verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 0x44); + verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 0x45); + verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 0x46); + verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 0x47); + verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 0x48); + verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 0x49); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 0x4a); + verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 0x4b); + verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 0x4c); + verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 0x4d); + verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 0x4e); + verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 0x4f); + verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 0x50); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 0x51); + verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 0x52); + verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 0x53); + verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 0x54); + verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 0x55); + verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 0x56); + verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 0x57); + verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 0x58); + verifyEntry(mapping, 'KeyY', ['z', 'Z', '', ''], 0x5a); + verifyEntry(mapping, 'KeyZ', ['y', 'Y', '', ''], 0x59); +}); + + group('dk', () { + verifyEntry(mapping, 'Digit0', ['0', '=', '}', ''], 0x30); + verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], 0x31); + verifyEntry(mapping, 'Digit2', ['2', '"', '@', ''], 0x32); + verifyEntry(mapping, 'Digit3', ['3', '#', '£', ''], 0x33); + verifyEntry(mapping, 'Digit4', ['4', '¤', r'$', ''], 0x34); + verifyEntry(mapping, 'Digit5', ['5', '%', '€', ''], 0x35); + verifyEntry(mapping, 'Digit6', ['6', '&', '', ''], 0x36); + verifyEntry(mapping, 'Digit7', ['7', '/', '{', ''], 0x37); + verifyEntry(mapping, 'Digit8', ['8', '(', '[', ''], 0x38); + verifyEntry(mapping, 'Digit9', ['9', ')', ']', ''], 0x39); + verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 0x41); + verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 0x42); + verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 0x43); + verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 0x44); + verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 0x45); + verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 0x46); + verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 0x47); + verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 0x48); + verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 0x49); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 0x4a); + verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 0x4b); + verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 0x4c); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', ''], 0x4d); + verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 0x4e); + verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 0x4f); + verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 0x50); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 0x51); + verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 0x52); + verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 0x53); + verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 0x54); + verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 0x55); + verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 0x56); + verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 0x57); + verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 0x58); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 0x59); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 0x5a); +}); + + group('en', () { + verifyEntry(mapping, 'Digit0', ['0', ')', '', ''], 0x30); + verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], 0x31); + verifyEntry(mapping, 'Digit2', ['2', '@', '', ''], 0x32); + verifyEntry(mapping, 'Digit3', ['3', '#', '', ''], 0x33); + verifyEntry(mapping, 'Digit4', ['4', r'$', '', ''], 0x34); + verifyEntry(mapping, 'Digit5', ['5', '%', '', ''], 0x35); + verifyEntry(mapping, 'Digit6', ['6', '^', '', ''], 0x36); + verifyEntry(mapping, 'Digit7', ['7', '&', '', ''], 0x37); + verifyEntry(mapping, 'Digit8', ['8', '*', '', ''], 0x38); + verifyEntry(mapping, 'Digit9', ['9', '(', '', ''], 0x39); + verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 0x41); + verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 0x42); + verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 0x43); + verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 0x44); + verifyEntry(mapping, 'KeyE', ['e', 'E', '', ''], 0x45); + verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 0x46); + verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 0x47); + verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 0x48); + verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 0x49); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 0x4a); + verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 0x4b); + verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 0x4c); + verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 0x4d); + verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 0x4e); + verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 0x4f); + verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 0x50); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 0x51); + verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 0x52); + verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 0x53); + verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 0x54); + verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 0x55); + verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 0x56); + verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 0x57); + verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 0x58); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 0x59); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 0x5a); +}); + + group('en-belgian', () { + verifyEntry(mapping, 'Digit0', ['à', '0', '}', ''], 0x30); + verifyEntry(mapping, 'Digit1', ['&', '1', '|', ''], 0x31); + verifyEntry(mapping, 'Digit2', ['é', '2', '@', ''], 0x32); + verifyEntry(mapping, 'Digit3', ['"', '3', '#', ''], 0x33); + verifyEntry(mapping, 'Digit4', ["'", '4', '{', ''], 0x34); + verifyEntry(mapping, 'Digit5', ['(', '5', '[', ''], 0x35); + verifyEntry(mapping, 'Digit6', ['§', '6', '^', ''], 0x36); + verifyEntry(mapping, 'Digit7', ['è', '7', '', ''], 0x37); + verifyEntry(mapping, 'Digit8', ['!', '8', '', ''], 0x38); + verifyEntry(mapping, 'Digit9', ['ç', '9', '{', ''], 0x39); + verifyEntry(mapping, 'KeyA', ['q', 'Q', '', ''], 0x51); + verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 0x42); + verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 0x43); + verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 0x44); + verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 0x45); + verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 0x46); + verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 0x47); + verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 0x48); + verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 0x49); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 0x4a); + verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 0x4b); + verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 0x4c); + verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 0x4e); + verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 0x4f); + verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 0x50); + verifyEntry(mapping, 'KeyQ', ['a', 'A', '', ''], 0x41); + verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 0x52); + verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 0x53); + verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 0x54); + verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 0x55); + verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 0x56); + verifyEntry(mapping, 'KeyW', ['z', 'Z', '', ''], 0x5a); + verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 0x58); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 0x59); + verifyEntry(mapping, 'KeyZ', ['w', 'W', '', ''], 0x57); + verifyEntry(mapping, 'Semicolon', ['m', 'M', '', ''], 0x4d); +}); + + group('en-in', () { + verifyEntry(mapping, 'Digit0', ['0', ')', '', ''], 0x30); + verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], 0x31); + verifyEntry(mapping, 'Digit2', ['2', '@', '', ''], 0x32); + verifyEntry(mapping, 'Digit3', ['3', '#', '', ''], 0x33); + verifyEntry(mapping, 'Digit4', ['4', r'$', '₹', ''], 0x34); + verifyEntry(mapping, 'Digit5', ['5', '%', '', ''], 0x35); + verifyEntry(mapping, 'Digit6', ['6', '^', '', 'ˆ'], 0x36); + verifyEntry(mapping, 'Digit7', ['7', '&', '', ''], 0x37); + verifyEntry(mapping, 'Digit8', ['8', '*', '', ''], 0x38); + verifyEntry(mapping, 'Digit9', ['9', '(', '', '˘'], 0x39); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'ā', 'Ā'], 0x41); + verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 0x42); + verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 0x43); + verifyEntry(mapping, 'KeyD', ['d', 'D', 'ḍ', 'Ḍ'], 0x44); + verifyEntry(mapping, 'KeyE', ['e', 'E', 'ē', 'Ē'], 0x45); + verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 0x46); + verifyEntry(mapping, 'KeyG', ['g', 'G', 'ṅ', 'Ṅ'], 0x47); + verifyEntry(mapping, 'KeyH', ['h', 'H', 'ḥ', 'Ḥ'], 0x48); + verifyEntry(mapping, 'KeyI', ['i', 'I', 'ī', 'Ī'], 0x49); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 0x4a); + verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 0x4b); + verifyEntry(mapping, 'KeyL', ['l', 'L', 'l̥', 'L̥'], 0x4c); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'ṁ', 'Ṁ'], 0x4d); + verifyEntry(mapping, 'KeyN', ['n', 'N', 'ṇ', 'Ṇ'], 0x4e); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'ō', 'Ō'], 0x4f); + verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 0x50); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'æ', 'Æ'], 0x51); + verifyEntry(mapping, 'KeyR', ['r', 'R', 'r̥', 'R̥'], 0x52); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'ś', 'Ś'], 0x53); + verifyEntry(mapping, 'KeyT', ['t', 'T', 'ṭ', 'Ṭ'], 0x54); + verifyEntry(mapping, 'KeyU', ['u', 'U', 'ū', 'Ū'], 0x55); + verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 0x56); + verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 0x57); + verifyEntry(mapping, 'KeyX', ['x', 'X', 'ṣ', 'Ṣ'], 0x58); + verifyEntry(mapping, 'KeyY', ['y', 'Y', 'ñ', 'Ñ'], 0x59); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 0x5a); +}); + + group('en-intl', () { + verifyEntry(mapping, 'Digit0', ['0', ')', '’', ''], 0x30); + verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '¹'], 0x31); + verifyEntry(mapping, 'Digit2', ['2', '@', '²', ''], 0x32); + verifyEntry(mapping, 'Digit3', ['3', '#', '³', ''], 0x33); + verifyEntry(mapping, 'Digit4', ['4', r'$', '¤', '£'], 0x34); + verifyEntry(mapping, 'Digit5', ['5', '%', '€', ''], 0x35); + verifyEntry(mapping, 'Digit6', ['6', '^', '¼', ''], 0x36); + verifyEntry(mapping, 'Digit7', ['7', '&', '½', ''], 0x37); + verifyEntry(mapping, 'Digit8', ['8', '*', '¾', ''], 0x38); + verifyEntry(mapping, 'Digit9', ['9', '(', '‘', ''], 0x39); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'á', 'Á'], 0x41); + verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 0x42); + verifyEntry(mapping, 'KeyC', ['c', 'C', '©', '¢'], 0x43); + verifyEntry(mapping, 'KeyD', ['d', 'D', 'ð', 'Ð'], 0x44); + verifyEntry(mapping, 'KeyE', ['e', 'E', 'é', 'É'], 0x45); + verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 0x46); + verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 0x47); + verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 0x48); + verifyEntry(mapping, 'KeyI', ['i', 'I', 'í', 'Í'], 0x49); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 0x4a); + verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 0x4b); + verifyEntry(mapping, 'KeyL', ['l', 'L', 'ø', 'Ø'], 0x4c); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', ''], 0x4d); + verifyEntry(mapping, 'KeyN', ['n', 'N', 'ñ', 'Ñ'], 0x4e); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'ó', 'Ó'], 0x4f); + verifyEntry(mapping, 'KeyP', ['p', 'P', 'ö', 'Ö'], 0x50); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'ä', 'Ä'], 0x51); + verifyEntry(mapping, 'KeyR', ['r', 'R', '®', ''], 0x52); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', '§'], 0x53); + verifyEntry(mapping, 'KeyT', ['t', 'T', 'þ', 'Þ'], 0x54); + verifyEntry(mapping, 'KeyU', ['u', 'U', 'ú', 'Ú'], 0x55); + verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 0x56); + verifyEntry(mapping, 'KeyW', ['w', 'W', 'å', 'Å'], 0x57); + verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 0x58); + verifyEntry(mapping, 'KeyY', ['y', 'Y', 'ü', 'Ü'], 0x59); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'æ', 'Æ'], 0x5a); +}); + + group('en-uk', () { + verifyEntry(mapping, 'Digit0', ['0', ')', '', ''], 0x30); + verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], 0x31); + verifyEntry(mapping, 'Digit2', ['2', '"', '', ''], 0x32); + verifyEntry(mapping, 'Digit3', ['3', '£', '', ''], 0x33); + verifyEntry(mapping, 'Digit4', ['4', r'$', '€', ''], 0x34); + verifyEntry(mapping, 'Digit5', ['5', '%', '', ''], 0x35); + verifyEntry(mapping, 'Digit6', ['6', '^', '', ''], 0x36); + verifyEntry(mapping, 'Digit7', ['7', '&', '', ''], 0x37); + verifyEntry(mapping, 'Digit8', ['8', '*', '', ''], 0x38); + verifyEntry(mapping, 'Digit9', ['9', '(', '', ''], 0x39); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'á', 'Á'], 0x41); + verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 0x42); + verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 0x43); + verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 0x44); + verifyEntry(mapping, 'KeyE', ['e', 'E', 'é', 'É'], 0x45); + verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 0x46); + verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 0x47); + verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 0x48); + verifyEntry(mapping, 'KeyI', ['i', 'I', 'í', 'Í'], 0x49); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 0x4a); + verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 0x4b); + verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 0x4c); + verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 0x4d); + verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 0x4e); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'ó', 'Ó'], 0x4f); + verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 0x50); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 0x51); + verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 0x52); + verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 0x53); + verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 0x54); + verifyEntry(mapping, 'KeyU', ['u', 'U', 'ú', 'Ú'], 0x55); + verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 0x56); + verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 0x57); + verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 0x58); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 0x59); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 0x5a); +}); + + group('es', () { + verifyEntry(mapping, 'Digit0', ['0', '=', '', ''], 0x30); + verifyEntry(mapping, 'Digit1', ['1', '!', '|', ''], 0x31); + verifyEntry(mapping, 'Digit2', ['2', '"', '@', ''], 0x32); + verifyEntry(mapping, 'Digit3', ['3', '·', '#', ''], 0x33); + verifyEntry(mapping, 'Digit4', ['4', r'$', '~', ''], 0x34); + verifyEntry(mapping, 'Digit5', ['5', '%', '€', ''], 0x35); + verifyEntry(mapping, 'Digit6', ['6', '&', '¬', ''], 0x36); + verifyEntry(mapping, 'Digit7', ['7', '/', '', ''], 0x37); + verifyEntry(mapping, 'Digit8', ['8', '(', '', ''], 0x38); + verifyEntry(mapping, 'Digit9', ['9', ')', '', ''], 0x39); + verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 0x41); + verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 0x42); + verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 0x43); + verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 0x44); + verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 0x45); + verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 0x46); + verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 0x47); + verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 0x48); + verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 0x49); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 0x4a); + verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 0x4b); + verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 0x4c); + verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 0x4d); + verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 0x4e); + verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 0x4f); + verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 0x50); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 0x51); + verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 0x52); + verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 0x53); + verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 0x54); + verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 0x55); + verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 0x56); + verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 0x57); + verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 0x58); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 0x59); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 0x5a); +}); + + group('es-latin', () { + verifyEntry(mapping, 'Digit0', ['0', '=', '', ''], 0x30); + verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], 0x31); + verifyEntry(mapping, 'Digit2', ['2', '"', '', ''], 0x32); + verifyEntry(mapping, 'Digit3', ['3', '#', '', ''], 0x33); + verifyEntry(mapping, 'Digit4', ['4', r'$', '', ''], 0x34); + verifyEntry(mapping, 'Digit5', ['5', '%', '', ''], 0x35); + verifyEntry(mapping, 'Digit6', ['6', '&', '', ''], 0x36); + verifyEntry(mapping, 'Digit7', ['7', '/', '', ''], 0x37); + verifyEntry(mapping, 'Digit8', ['8', '(', '', ''], 0x38); + verifyEntry(mapping, 'Digit9', ['9', ')', '', ''], 0x39); + verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 0x41); + verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 0x42); + verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 0x43); + verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 0x44); + verifyEntry(mapping, 'KeyE', ['e', 'E', '', ''], 0x45); + verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 0x46); + verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 0x47); + verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 0x48); + verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 0x49); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 0x4a); + verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 0x4b); + verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 0x4c); + verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 0x4d); + verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 0x4e); + verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 0x4f); + verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 0x50); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', '@', ''], 0x51); + verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 0x52); + verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 0x53); + verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 0x54); + verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 0x55); + verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 0x56); + verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 0x57); + verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 0x58); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 0x59); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 0x5a); +}); + + group('fr', () { + verifyEntry(mapping, 'Digit0', ['à', '0', '@', ''], 0x30); + verifyEntry(mapping, 'Digit1', ['&', '1', '', ''], 0x31); + verifyEntry(mapping, 'Digit2', ['é', '2', '~', ''], 0x32); + verifyEntry(mapping, 'Digit3', ['"', '3', '#', ''], 0x33); + verifyEntry(mapping, 'Digit4', ["'", '4', '{', ''], 0x34); + verifyEntry(mapping, 'Digit5', ['(', '5', '[', ''], 0x35); + verifyEntry(mapping, 'Digit6', ['-', '6', '|', ''], 0x36); + verifyEntry(mapping, 'Digit7', ['è', '7', '`', ''], 0x37); + verifyEntry(mapping, 'Digit8', ['_', '8', r'\', ''], 0x38); + verifyEntry(mapping, 'Digit9', ['ç', '9', '^', ''], 0x39); + verifyEntry(mapping, 'KeyA', ['q', 'Q', '', ''], 0x51); + verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 0x42); + verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 0x43); + verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 0x44); + verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 0x45); + verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 0x46); + verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 0x47); + verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 0x48); + verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 0x49); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 0x4a); + verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 0x4b); + verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 0x4c); + verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 0x4e); + verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 0x4f); + verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 0x50); + verifyEntry(mapping, 'KeyQ', ['a', 'A', '', ''], 0x41); + verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 0x52); + verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 0x53); + verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 0x54); + verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 0x55); + verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 0x56); + verifyEntry(mapping, 'KeyW', ['z', 'Z', '', ''], 0x5a); + verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 0x58); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 0x59); + verifyEntry(mapping, 'KeyZ', ['w', 'W', '', ''], 0x57); + verifyEntry(mapping, 'Semicolon', ['m', 'M', '', ''], 0x4d); +}); + + group('hu', () { + verifyEntry(mapping, 'Backquote', ['0', '§', '', ''], 0x30); + verifyEntry(mapping, 'Digit1', ['1', "'", '~', ''], 0x31); + verifyEntry(mapping, 'Digit2', ['2', '"', 'ˇ', ''], 0x32); + verifyEntry(mapping, 'Digit3', ['3', '+', '^', ''], 0x33); + verifyEntry(mapping, 'Digit4', ['4', '!', '˘', ''], 0x34); + verifyEntry(mapping, 'Digit5', ['5', '%', '°', ''], 0x35); + verifyEntry(mapping, 'Digit6', ['6', '/', '˛', ''], 0x36); + verifyEntry(mapping, 'Digit7', ['7', '=', '`', ''], 0x37); + verifyEntry(mapping, 'Digit8', ['8', '(', '˙', ''], 0x38); + verifyEntry(mapping, 'Digit9', ['9', ')', '´', ''], 0x39); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'ä', ''], 0x41); + verifyEntry(mapping, 'KeyB', ['b', 'B', '{', ''], 0x42); + verifyEntry(mapping, 'KeyC', ['c', 'C', '&', ''], 0x43); + verifyEntry(mapping, 'KeyD', ['d', 'D', 'Đ', ''], 0x44); + verifyEntry(mapping, 'KeyE', ['e', 'E', 'Ä', ''], 0x45); + verifyEntry(mapping, 'KeyF', ['f', 'F', '[', ''], 0x46); + verifyEntry(mapping, 'KeyG', ['g', 'G', ']', ''], 0x47); + verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 0x48); + verifyEntry(mapping, 'KeyI', ['i', 'I', 'Í', ''], 0x49); + verifyEntry(mapping, 'KeyJ', ['j', 'J', 'í', ''], 0x4a); + verifyEntry(mapping, 'KeyK', ['k', 'K', 'ł', ''], 0x4b); + verifyEntry(mapping, 'KeyL', ['l', 'L', 'Ł', ''], 0x4c); + verifyEntry(mapping, 'KeyM', ['m', 'M', '<', ''], 0x4d); + verifyEntry(mapping, 'KeyN', ['n', 'N', '}', ''], 0x4e); + verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 0x4f); + verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 0x50); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', r'\', ''], 0x51); + verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 0x52); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'đ', ''], 0x53); + verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 0x54); + verifyEntry(mapping, 'KeyU', ['u', 'U', '€', ''], 0x55); + verifyEntry(mapping, 'KeyV', ['v', 'V', '@', ''], 0x56); + verifyEntry(mapping, 'KeyW', ['w', 'W', '|', ''], 0x57); + verifyEntry(mapping, 'KeyX', ['x', 'X', '#', ''], 0x58); + verifyEntry(mapping, 'KeyY', ['z', 'Z', '', ''], 0x5a); + verifyEntry(mapping, 'KeyZ', ['y', 'Y', '>', ''], 0x59); +}); + + group('it', () { + verifyEntry(mapping, 'Digit0', ['0', '=', '', ''], 0x30); + verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], 0x31); + verifyEntry(mapping, 'Digit2', ['2', '"', '', ''], 0x32); + verifyEntry(mapping, 'Digit3', ['3', '£', '', ''], 0x33); + verifyEntry(mapping, 'Digit4', ['4', r'$', '', ''], 0x34); + verifyEntry(mapping, 'Digit5', ['5', '%', '€', ''], 0x35); + verifyEntry(mapping, 'Digit6', ['6', '&', '', ''], 0x36); + verifyEntry(mapping, 'Digit7', ['7', '/', '', ''], 0x37); + verifyEntry(mapping, 'Digit8', ['8', '(', '', ''], 0x38); + verifyEntry(mapping, 'Digit9', ['9', ')', '', ''], 0x39); + verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 0x41); + verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 0x42); + verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 0x43); + verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 0x44); + verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 0x45); + verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 0x46); + verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 0x47); + verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 0x48); + verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 0x49); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 0x4a); + verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 0x4b); + verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 0x4c); + verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 0x4d); + verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 0x4e); + verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 0x4f); + verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 0x50); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 0x51); + verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 0x52); + verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 0x53); + verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 0x54); + verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 0x55); + verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 0x56); + verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 0x57); + verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 0x58); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 0x59); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 0x5a); +}); + + group('no', () { + verifyEntry(mapping, 'Digit0', ['0', '=', '}', ''], 0x30); + verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], 0x31); + verifyEntry(mapping, 'Digit2', ['2', '"', '@', ''], 0x32); + verifyEntry(mapping, 'Digit3', ['3', '#', '£', ''], 0x33); + verifyEntry(mapping, 'Digit4', ['4', '¤', r'$', ''], 0x34); + verifyEntry(mapping, 'Digit5', ['5', '%', '€', ''], 0x35); + verifyEntry(mapping, 'Digit6', ['6', '&', '', ''], 0x36); + verifyEntry(mapping, 'Digit7', ['7', '/', '{', ''], 0x37); + verifyEntry(mapping, 'Digit8', ['8', '(', '[', ''], 0x38); + verifyEntry(mapping, 'Digit9', ['9', ')', ']', ''], 0x39); + verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 0x41); + verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 0x42); + verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 0x43); + verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 0x44); + verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 0x45); + verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 0x46); + verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 0x47); + verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 0x48); + verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 0x49); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 0x4a); + verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 0x4b); + verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 0x4c); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', ''], 0x4d); + verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 0x4e); + verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 0x4f); + verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 0x50); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 0x51); + verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 0x52); + verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 0x53); + verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 0x54); + verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 0x55); + verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 0x56); + verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 0x57); + verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 0x58); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 0x59); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 0x5a); +}); + + group('pl', () { + verifyEntry(mapping, 'Digit0', ['0', ')', '', ''], 0x30); + verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], 0x31); + verifyEntry(mapping, 'Digit2', ['2', '@', '', ''], 0x32); + verifyEntry(mapping, 'Digit3', ['3', '#', '', ''], 0x33); + verifyEntry(mapping, 'Digit4', ['4', r'$', '', ''], 0x34); + verifyEntry(mapping, 'Digit5', ['5', '%', '', ''], 0x35); + verifyEntry(mapping, 'Digit6', ['6', '^', '', ''], 0x36); + verifyEntry(mapping, 'Digit7', ['7', '&', '', ''], 0x37); + verifyEntry(mapping, 'Digit8', ['8', '*', '', ''], 0x38); + verifyEntry(mapping, 'Digit9', ['9', '(', '', ''], 0x39); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'ą', 'Ą'], 0x41); + verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 0x42); + verifyEntry(mapping, 'KeyC', ['c', 'C', 'ć', 'Ć'], 0x43); + verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 0x44); + verifyEntry(mapping, 'KeyE', ['e', 'E', 'ę', 'Ę'], 0x45); + verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 0x46); + verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 0x47); + verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 0x48); + verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 0x49); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 0x4a); + verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 0x4b); + verifyEntry(mapping, 'KeyL', ['l', 'L', 'ł', 'Ł'], 0x4c); + verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 0x4d); + verifyEntry(mapping, 'KeyN', ['n', 'N', 'ń', 'Ń'], 0x4e); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'ó', 'Ó'], 0x4f); + verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 0x50); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 0x51); + verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 0x52); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'ś', 'Ś'], 0x53); + verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 0x54); + verifyEntry(mapping, 'KeyU', ['u', 'U', '€', ''], 0x55); + verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 0x56); + verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 0x57); + verifyEntry(mapping, 'KeyX', ['x', 'X', 'ź', 'Ź'], 0x58); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 0x59); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'ż', 'Ż'], 0x5a); +}); + + group('pt', () { + verifyEntry(mapping, 'Digit0', ['0', '=', '}', ''], 0x30); + verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], 0x31); + verifyEntry(mapping, 'Digit2', ['2', '"', '@', ''], 0x32); + verifyEntry(mapping, 'Digit3', ['3', '#', '£', ''], 0x33); + verifyEntry(mapping, 'Digit4', ['4', r'$', '§', ''], 0x34); + verifyEntry(mapping, 'Digit5', ['5', '%', '€', ''], 0x35); + verifyEntry(mapping, 'Digit6', ['6', '&', '', ''], 0x36); + verifyEntry(mapping, 'Digit7', ['7', '/', '{', ''], 0x37); + verifyEntry(mapping, 'Digit8', ['8', '(', '[', ''], 0x38); + verifyEntry(mapping, 'Digit9', ['9', ')', ']', ''], 0x39); + verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 0x41); + verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 0x42); + verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 0x43); + verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 0x44); + verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 0x45); + verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 0x46); + verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 0x47); + verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 0x48); + verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 0x49); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 0x4a); + verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 0x4b); + verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 0x4c); + verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 0x4d); + verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 0x4e); + verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 0x4f); + verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 0x50); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 0x51); + verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 0x52); + verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 0x53); + verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 0x54); + verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 0x55); + verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 0x56); + verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 0x57); + verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 0x58); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 0x59); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 0x5a); +}); + + group('pt-br', () { + verifyEntry(mapping, 'Digit0', ['0', ')', '', ''], 0x30); + verifyEntry(mapping, 'Digit1', ['1', '!', '¹', ''], 0x31); + verifyEntry(mapping, 'Digit2', ['2', '@', '²', ''], 0x32); + verifyEntry(mapping, 'Digit3', ['3', '#', '³', ''], 0x33); + verifyEntry(mapping, 'Digit4', ['4', r'$', '£', ''], 0x34); + verifyEntry(mapping, 'Digit5', ['5', '%', '¢', ''], 0x35); + verifyEntry(mapping, 'Digit6', ['6', '¨', '¬', ''], 0x36); + verifyEntry(mapping, 'Digit7', ['7', '&', '', ''], 0x37); + verifyEntry(mapping, 'Digit8', ['8', '*', '', ''], 0x38); + verifyEntry(mapping, 'Digit9', ['9', '(', '', ''], 0x39); + verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 0x41); + verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 0x42); + verifyEntry(mapping, 'KeyC', ['c', 'C', '₢', ''], 0x43); + verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 0x44); + verifyEntry(mapping, 'KeyE', ['e', 'E', '°', ''], 0x45); + verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 0x46); + verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 0x47); + verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 0x48); + verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 0x49); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 0x4a); + verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 0x4b); + verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 0x4c); + verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 0x4d); + verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 0x4e); + verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 0x4f); + verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 0x50); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', '/', ''], 0x51); + verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 0x52); + verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 0x53); + verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 0x54); + verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 0x55); + verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 0x56); + verifyEntry(mapping, 'KeyW', ['w', 'W', '?', ''], 0x57); + verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 0x58); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 0x59); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 0x5a); +}); + + group('ru', () { + verifyEntry(mapping, 'Digit0', ['0', ')', '', ''], 0x30); + verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], 0x31); + verifyEntry(mapping, 'Digit2', ['2', '"', '', ''], 0x32); + verifyEntry(mapping, 'Digit3', ['3', '№', '', ''], 0x33); + verifyEntry(mapping, 'Digit4', ['4', ';', '', ''], 0x34); + verifyEntry(mapping, 'Digit5', ['5', '%', '', ''], 0x35); + verifyEntry(mapping, 'Digit6', ['6', ':', '', ''], 0x36); + verifyEntry(mapping, 'Digit7', ['7', '?', '', ''], 0x37); + verifyEntry(mapping, 'Digit8', ['8', '*', '₽', ''], 0x38); + verifyEntry(mapping, 'Digit9', ['9', '(', '', ''], 0x39); + verifyEntry(mapping, 'KeyA', ['ф', 'Ф', '', ''], 0x41); + verifyEntry(mapping, 'KeyB', ['и', 'И', '', ''], 0x42); + verifyEntry(mapping, 'KeyC', ['с', 'С', '', ''], 0x43); + verifyEntry(mapping, 'KeyD', ['в', 'В', '', ''], 0x44); + verifyEntry(mapping, 'KeyE', ['у', 'У', '', ''], 0x45); + verifyEntry(mapping, 'KeyF', ['а', 'А', '', ''], 0x46); + verifyEntry(mapping, 'KeyG', ['п', 'П', '', ''], 0x47); + verifyEntry(mapping, 'KeyH', ['р', 'Р', '', ''], 0x48); + verifyEntry(mapping, 'KeyI', ['ш', 'Ш', '', ''], 0x49); + verifyEntry(mapping, 'KeyJ', ['о', 'О', '', ''], 0x4a); + verifyEntry(mapping, 'KeyK', ['л', 'Л', '', ''], 0x4b); + verifyEntry(mapping, 'KeyL', ['д', 'Д', '', ''], 0x4c); + verifyEntry(mapping, 'KeyM', ['ь', 'Ь', '', ''], 0x4d); + verifyEntry(mapping, 'KeyN', ['т', 'Т', '', ''], 0x4e); + verifyEntry(mapping, 'KeyO', ['щ', 'Щ', '', ''], 0x4f); + verifyEntry(mapping, 'KeyP', ['з', 'З', '', ''], 0x50); + verifyEntry(mapping, 'KeyQ', ['й', 'Й', '', ''], 0x51); + verifyEntry(mapping, 'KeyR', ['к', 'К', '', ''], 0x52); + verifyEntry(mapping, 'KeyS', ['ы', 'Ы', '', ''], 0x53); + verifyEntry(mapping, 'KeyT', ['е', 'Е', '', ''], 0x54); + verifyEntry(mapping, 'KeyU', ['г', 'Г', '', ''], 0x55); + verifyEntry(mapping, 'KeyV', ['м', 'М', '', ''], 0x56); + verifyEntry(mapping, 'KeyW', ['ц', 'Ц', '', ''], 0x57); + verifyEntry(mapping, 'KeyX', ['ч', 'Ч', '', ''], 0x58); + verifyEntry(mapping, 'KeyY', ['н', 'Н', '', ''], 0x59); + verifyEntry(mapping, 'KeyZ', ['я', 'Я', '', ''], 0x5a); +}); + + group('sv', () { + verifyEntry(mapping, 'Digit0', ['0', '=', '}', ''], 0x30); + verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], 0x31); + verifyEntry(mapping, 'Digit2', ['2', '"', '@', ''], 0x32); + verifyEntry(mapping, 'Digit3', ['3', '#', '£', ''], 0x33); + verifyEntry(mapping, 'Digit4', ['4', '¤', r'$', ''], 0x34); + verifyEntry(mapping, 'Digit5', ['5', '%', '€', ''], 0x35); + verifyEntry(mapping, 'Digit6', ['6', '&', '', ''], 0x36); + verifyEntry(mapping, 'Digit7', ['7', '/', '{', ''], 0x37); + verifyEntry(mapping, 'Digit8', ['8', '(', '[', ''], 0x38); + verifyEntry(mapping, 'Digit9', ['9', ')', ']', ''], 0x39); + verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 0x41); + verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 0x42); + verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 0x43); + verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 0x44); + verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 0x45); + verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 0x46); + verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 0x47); + verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 0x48); + verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 0x49); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 0x4a); + verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 0x4b); + verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 0x4c); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', ''], 0x4d); + verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 0x4e); + verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 0x4f); + verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 0x50); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 0x51); + verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 0x52); + verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 0x53); + verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 0x54); + verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 0x55); + verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 0x56); + verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 0x57); + verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 0x58); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 0x59); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 0x5a); +}); + + group('thai', () { + verifyEntry(mapping, 'Digit0', ['จ', '๗', '', ''], 0x30); + verifyEntry(mapping, 'Digit1', ['ๅ', '+', '', ''], 0x31); + verifyEntry(mapping, 'Digit2', ['/', '๑', '', ''], 0x32); + verifyEntry(mapping, 'Digit3', ['-', '๒', '', ''], 0x33); + verifyEntry(mapping, 'Digit4', ['ภ', '๓', '', ''], 0x34); + verifyEntry(mapping, 'Digit5', ['ถ', '๔', '', ''], 0x35); + verifyEntry(mapping, 'Digit6', ['ุ', 'ู', '', ''], 0x36); + verifyEntry(mapping, 'Digit7', ['ึ', '฿', '', ''], 0x37); + verifyEntry(mapping, 'Digit8', ['ค', '๕', '', ''], 0x38); + verifyEntry(mapping, 'Digit9', ['ต', '๖', '', ''], 0x39); + verifyEntry(mapping, 'KeyA', ['ฟ', 'ฤ', '', ''], 0x41); + verifyEntry(mapping, 'KeyB', ['ิ', 'ฺ', '', ''], 0x42); + verifyEntry(mapping, 'KeyC', ['แ', 'ฉ', '', ''], 0x43); + verifyEntry(mapping, 'KeyD', ['ก', 'ฏ', '', ''], 0x44); + verifyEntry(mapping, 'KeyE', ['ำ', 'ฎ', '', ''], 0x45); + verifyEntry(mapping, 'KeyF', ['ด', 'โ', '', ''], 0x46); + verifyEntry(mapping, 'KeyG', ['เ', 'ฌ', '', ''], 0x47); + verifyEntry(mapping, 'KeyH', ['้', '็', '', ''], 0x48); + verifyEntry(mapping, 'KeyI', ['ร', 'ณ', '', ''], 0x49); + verifyEntry(mapping, 'KeyJ', ['่', '๋', '', ''], 0x4a); + verifyEntry(mapping, 'KeyK', ['า', 'ษ', '', ''], 0x4b); + verifyEntry(mapping, 'KeyL', ['ส', 'ศ', '', ''], 0x4c); + verifyEntry(mapping, 'KeyM', ['ท', '?', '', ''], 0x4d); + verifyEntry(mapping, 'KeyN', ['ื', '์', '', ''], 0x4e); + verifyEntry(mapping, 'KeyO', ['น', 'ฯ', '', ''], 0x4f); + verifyEntry(mapping, 'KeyP', ['ย', 'ญ', '', ''], 0x50); + verifyEntry(mapping, 'KeyQ', ['ๆ', '๐', '', ''], 0x51); + verifyEntry(mapping, 'KeyR', ['พ', 'ฑ', '', ''], 0x52); + verifyEntry(mapping, 'KeyS', ['ห', 'ฆ', '', ''], 0x53); + verifyEntry(mapping, 'KeyT', ['ะ', 'ธ', '', ''], 0x54); + verifyEntry(mapping, 'KeyU', ['ี', '๊', '', ''], 0x55); + verifyEntry(mapping, 'KeyV', ['อ', 'ฮ', '', ''], 0x56); + verifyEntry(mapping, 'KeyW', ['ไ', '"', '', ''], 0x57); + verifyEntry(mapping, 'KeyX', ['ป', ')', '', ''], 0x58); + verifyEntry(mapping, 'KeyY', ['ั', 'ํ', '', ''], 0x59); + verifyEntry(mapping, 'KeyZ', ['ผ', '(', '', ''], 0x5a); +}); + + group('tr', () { + verifyEntry(mapping, 'Digit0', ['0', '=', '}', ''], 0x30); + verifyEntry(mapping, 'Digit1', ['1', '!', '>', ''], 0x31); + verifyEntry(mapping, 'Digit2', ['2', "'", '£', ''], 0x32); + verifyEntry(mapping, 'Digit3', ['3', '^', '#', ''], 0x33); + verifyEntry(mapping, 'Digit4', ['4', '+', r'$', ''], 0x34); + verifyEntry(mapping, 'Digit5', ['5', '%', '½', ''], 0x35); + verifyEntry(mapping, 'Digit6', ['6', '&', '', ''], 0x36); + verifyEntry(mapping, 'Digit7', ['7', '/', '{', ''], 0x37); + verifyEntry(mapping, 'Digit8', ['8', '(', '[', ''], 0x38); + verifyEntry(mapping, 'Digit9', ['9', ')', ']', ''], 0x39); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'æ', 'Æ'], 0x41); + verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 0x42); + verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 0x43); + verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 0x44); + verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 0x45); + verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 0x46); + verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 0x47); + verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 0x48); + verifyEntry(mapping, 'KeyI', ['ı', 'I', 'i', 'İ'], 0x49); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 0x4a); + verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 0x4b); + verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 0x4c); + verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 0x4d); + verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 0x4e); + verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 0x4f); + verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 0x50); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', '@', ''], 0x51); + verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 0x52); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', ''], 0x53); + verifyEntry(mapping, 'KeyT', ['t', 'T', '₺', ''], 0x54); + verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 0x55); + verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 0x56); + verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 0x57); + verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 0x58); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 0x59); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 0x5a); +}); +} + +void testLinux(LayoutMapping mapping) { + group('de', () { + verifyEntry(mapping, 'Digit0', ['0', '=', '}', '°'], 0x30); + verifyEntry(mapping, 'Digit1', ['1', '!', '¹', '¡'], 0x31); + verifyEntry(mapping, 'Digit2', ['2', '"', '²', '⅛'], 0x32); + verifyEntry(mapping, 'Digit3', ['3', '§', '³', '£'], 0x33); + verifyEntry(mapping, 'Digit4', ['4', r'$', '¼', '¤'], 0x34); + verifyEntry(mapping, 'Digit5', ['5', '%', '½', '⅜'], 0x35); + verifyEntry(mapping, 'Digit6', ['6', '&', '¬', '⅝'], 0x36); + verifyEntry(mapping, 'Digit7', ['7', '/', '{', '⅞'], 0x37); + verifyEntry(mapping, 'Digit8', ['8', '(', '[', '™'], 0x38); + verifyEntry(mapping, 'Digit9', ['9', ')', ']', '±'], 0x39); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'æ', 'Æ'], 0x41); + verifyEntry(mapping, 'KeyB', ['b', 'B', '“', '‘'], 0x42); + verifyEntry(mapping, 'KeyC', ['c', 'C', '¢', '©'], 0x43); + verifyEntry(mapping, 'KeyD', ['d', 'D', 'ð', 'Ð'], 0x44); + verifyEntry(mapping, 'KeyE', ['e', 'E', '€', '€'], 0x45); + verifyEntry(mapping, 'KeyF', ['f', 'F', 'đ', 'ª'], 0x46); + verifyEntry(mapping, 'KeyG', ['g', 'G', 'ŋ', 'Ŋ'], 0x47); + verifyEntry(mapping, 'KeyH', ['h', 'H', 'ħ', 'Ħ'], 0x48); + verifyEntry(mapping, 'KeyI', ['i', 'I', '→', 'ı'], 0x49); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '̣', '̇'], 0x4a); + verifyEntry(mapping, 'KeyK', ['k', 'K', 'ĸ', '&'], 0x4b); + verifyEntry(mapping, 'KeyL', ['l', 'L', 'ł', 'Ł'], 0x4c); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', 'º'], 0x4d); + verifyEntry(mapping, 'KeyN', ['n', 'N', '”', '’'], 0x4e); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 0x4f); + verifyEntry(mapping, 'KeyP', ['p', 'P', 'þ', 'Þ'], 0x50); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', '@', 'Ω'], 0x51); + verifyEntry(mapping, 'KeyR', ['r', 'R', '¶', '®'], 0x52); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'ſ', 'ẞ'], 0x53); + verifyEntry(mapping, 'KeyT', ['t', 'T', 'ŧ', 'Ŧ'], 0x54); + verifyEntry(mapping, 'KeyU', ['u', 'U', '↓', '↑'], 0x55); + verifyEntry(mapping, 'KeyV', ['v', 'V', '„', '‚'], 0x56); + verifyEntry(mapping, 'KeyW', ['w', 'W', 'ł', 'Ł'], 0x57); + verifyEntry(mapping, 'KeyX', ['x', 'X', '«', '‹'], 0x58); + verifyEntry(mapping, 'KeyY', ['z', 'Z', '←', '¥'], 0x5a); + verifyEntry(mapping, 'KeyZ', ['y', 'Y', '»', '›'], 0x59); +}); + + group('en', () { + verifyEntry(mapping, 'Digit0', ['0', ')', '0', ')'], 0x30); + verifyEntry(mapping, 'Digit1', ['1', '!', '1', '!'], 0x31); + verifyEntry(mapping, 'Digit2', ['2', '@', '2', '@'], 0x32); + verifyEntry(mapping, 'Digit3', ['3', '#', '3', '#'], 0x33); + verifyEntry(mapping, 'Digit4', ['4', r'$', '4', r'$'], 0x34); + verifyEntry(mapping, 'Digit5', ['5', '%', '5', '%'], 0x35); + verifyEntry(mapping, 'Digit6', ['6', '^', '6', '^'], 0x36); + verifyEntry(mapping, 'Digit7', ['7', '&', '7', '&'], 0x37); + verifyEntry(mapping, 'Digit8', ['8', '*', '8', '*'], 0x38); + verifyEntry(mapping, 'Digit9', ['9', '(', '9', '('], 0x39); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'a', 'A'], 0x41); + verifyEntry(mapping, 'KeyB', ['b', 'B', 'b', 'B'], 0x42); + verifyEntry(mapping, 'KeyC', ['c', 'C', 'c', 'C'], 0x43); + verifyEntry(mapping, 'KeyD', ['d', 'D', 'd', 'D'], 0x44); + verifyEntry(mapping, 'KeyE', ['e', 'E', 'e', 'E'], 0x45); + verifyEntry(mapping, 'KeyF', ['f', 'F', 'f', 'F'], 0x46); + verifyEntry(mapping, 'KeyG', ['g', 'G', 'g', 'G'], 0x47); + verifyEntry(mapping, 'KeyH', ['h', 'H', 'h', 'H'], 0x48); + verifyEntry(mapping, 'KeyI', ['i', 'I', 'i', 'I'], 0x49); + verifyEntry(mapping, 'KeyJ', ['j', 'J', 'j', 'J'], 0x4a); + verifyEntry(mapping, 'KeyK', ['k', 'K', 'k', 'K'], 0x4b); + verifyEntry(mapping, 'KeyL', ['l', 'L', 'l', 'L'], 0x4c); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'm', 'M'], 0x4d); + verifyEntry(mapping, 'KeyN', ['n', 'N', 'n', 'N'], 0x4e); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'o', 'O'], 0x4f); + verifyEntry(mapping, 'KeyP', ['p', 'P', 'p', 'P'], 0x50); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'q', 'Q'], 0x51); + verifyEntry(mapping, 'KeyR', ['r', 'R', 'r', 'R'], 0x52); + verifyEntry(mapping, 'KeyS', ['s', 'S', 's', 'S'], 0x53); + verifyEntry(mapping, 'KeyT', ['t', 'T', 't', 'T'], 0x54); + verifyEntry(mapping, 'KeyU', ['u', 'U', 'u', 'U'], 0x55); + verifyEntry(mapping, 'KeyV', ['v', 'V', 'v', 'V'], 0x56); + verifyEntry(mapping, 'KeyW', ['w', 'W', 'w', 'W'], 0x57); + verifyEntry(mapping, 'KeyX', ['x', 'X', 'x', 'X'], 0x58); + verifyEntry(mapping, 'KeyY', ['y', 'Y', 'y', 'Y'], 0x59); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'z', 'Z'], 0x5a); +}); + + group('es', () { + verifyEntry(mapping, 'Digit0', ['0', '=', '}', '°'], 0x30); + verifyEntry(mapping, 'Digit1', ['1', '!', '|', '¡'], 0x31); + verifyEntry(mapping, 'Digit2', ['2', '"', '@', '⅛'], 0x32); + verifyEntry(mapping, 'Digit3', ['3', '·', '#', '£'], 0x33); + verifyEntry(mapping, 'Digit4', ['4', r'$', '~', r'$'], 0x34); + verifyEntry(mapping, 'Digit5', ['5', '%', '½', '⅜'], 0x35); + verifyEntry(mapping, 'Digit6', ['6', '&', '¬', '⅝'], 0x36); + verifyEntry(mapping, 'Digit7', ['7', '/', '{', '⅞'], 0x37); + verifyEntry(mapping, 'Digit8', ['8', '(', '[', '™'], 0x38); + verifyEntry(mapping, 'Digit9', ['9', ')', ']', '±'], 0x39); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'æ', 'Æ'], 0x41); + verifyEntry(mapping, 'KeyB', ['b', 'B', '”', '’'], 0x42); + verifyEntry(mapping, 'KeyC', ['c', 'C', '¢', '©'], 0x43); + verifyEntry(mapping, 'KeyD', ['d', 'D', 'ð', 'Ð'], 0x44); + verifyEntry(mapping, 'KeyE', ['e', 'E', '€', '¢'], 0x45); + verifyEntry(mapping, 'KeyF', ['f', 'F', 'đ', 'ª'], 0x46); + verifyEntry(mapping, 'KeyG', ['g', 'G', 'ŋ', 'Ŋ'], 0x47); + verifyEntry(mapping, 'KeyH', ['h', 'H', 'ħ', 'Ħ'], 0x48); + verifyEntry(mapping, 'KeyI', ['i', 'I', '→', 'ı'], 0x49); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '̉', '̛'], 0x4a); + verifyEntry(mapping, 'KeyK', ['k', 'K', 'ĸ', '&'], 0x4b); + verifyEntry(mapping, 'KeyL', ['l', 'L', 'ł', 'Ł'], 0x4c); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', 'º'], 0x4d); + verifyEntry(mapping, 'KeyN', ['n', 'N', 'n', 'N'], 0x4e); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 0x4f); + verifyEntry(mapping, 'KeyP', ['p', 'P', 'þ', 'Þ'], 0x50); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', '@', 'Ω'], 0x51); + verifyEntry(mapping, 'KeyR', ['r', 'R', '¶', '®'], 0x52); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', '§'], 0x53); + verifyEntry(mapping, 'KeyT', ['t', 'T', 'ŧ', 'Ŧ'], 0x54); + verifyEntry(mapping, 'KeyU', ['u', 'U', '↓', '↑'], 0x55); + verifyEntry(mapping, 'KeyV', ['v', 'V', '“', '‘'], 0x56); + verifyEntry(mapping, 'KeyW', ['w', 'W', 'ł', 'Ł'], 0x57); + verifyEntry(mapping, 'KeyX', ['x', 'X', '»', '>'], 0x58); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '←', '¥'], 0x59); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', '«', '<'], 0x5a); +}); + + group('fr', () { + verifyEntry(mapping, 'Digit0', ['à', '0', '@', '°'], 0x30); + verifyEntry(mapping, 'Digit1', ['&', '1', '¹', '¡'], 0x31); + verifyEntry(mapping, 'Digit2', ['é', '2', '~', '⅛'], 0x32); + verifyEntry(mapping, 'Digit3', ['"', '3', '#', '£'], 0x33); + verifyEntry(mapping, 'Digit4', ["'", '4', '{', r'$'], 0x34); + verifyEntry(mapping, 'Digit5', ['(', '5', '[', '⅜'], 0x35); + verifyEntry(mapping, 'Digit6', ['-', '6', '|', '⅝'], 0x36); + verifyEntry(mapping, 'Digit7', ['è', '7', '`', '⅞'], 0x37); + verifyEntry(mapping, 'Digit8', ['_', '8', r'\', '™'], 0x38); + verifyEntry(mapping, 'Digit9', ['ç', '9', '^', '±'], 0x39); + verifyEntry(mapping, 'KeyA', ['q', 'Q', '@', 'Ω'], 0x51); + verifyEntry(mapping, 'KeyB', ['b', 'B', '”', '’'], 0x42); + verifyEntry(mapping, 'KeyC', ['c', 'C', '¢', '©'], 0x43); + verifyEntry(mapping, 'KeyD', ['d', 'D', 'ð', 'Ð'], 0x44); + verifyEntry(mapping, 'KeyE', ['e', 'E', '€', '¢'], 0x45); + verifyEntry(mapping, 'KeyF', ['f', 'F', 'đ', 'ª'], 0x46); + verifyEntry(mapping, 'KeyG', ['g', 'G', 'ŋ', 'Ŋ'], 0x47); + verifyEntry(mapping, 'KeyH', ['h', 'H', 'ħ', 'Ħ'], 0x48); + verifyEntry(mapping, 'KeyI', ['i', 'I', '→', 'ı'], 0x49); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '̉', '̛'], 0x4a); + verifyEntry(mapping, 'KeyK', ['k', 'K', 'ĸ', '&'], 0x4b); + verifyEntry(mapping, 'KeyL', ['l', 'L', 'ł', 'Ł'], 0x4c); + verifyEntry(mapping, 'KeyN', ['n', 'N', 'n', 'N'], 0x4e); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 0x4f); + verifyEntry(mapping, 'KeyP', ['p', 'P', 'þ', 'Þ'], 0x50); + verifyEntry(mapping, 'KeyQ', ['a', 'A', 'æ', 'Æ'], 0x41); + verifyEntry(mapping, 'KeyR', ['r', 'R', '¶', '®'], 0x52); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', '§'], 0x53); + verifyEntry(mapping, 'KeyT', ['t', 'T', 'ŧ', 'Ŧ'], 0x54); + verifyEntry(mapping, 'KeyU', ['u', 'U', '↓', '↑'], 0x55); + verifyEntry(mapping, 'KeyV', ['v', 'V', '“', '‘'], 0x56); + verifyEntry(mapping, 'KeyW', ['z', 'Z', '«', '<'], 0x5a); + verifyEntry(mapping, 'KeyX', ['x', 'X', '»', '>'], 0x58); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '←', '¥'], 0x59); + verifyEntry(mapping, 'KeyZ', ['w', 'W', 'ł', 'Ł'], 0x57); + verifyEntry(mapping, 'Semicolon', ['m', 'M', 'µ', 'º'], 0x4d); +}); + + group('ru', () { + verifyEntry(mapping, 'Digit0', ['0', ')', '0', ')'], 0x30); + verifyEntry(mapping, 'Digit1', ['1', '!', '1', '!'], 0x31); + verifyEntry(mapping, 'Digit2', ['2', '"', '2', '"'], 0x32); + verifyEntry(mapping, 'Digit3', ['3', '№', '3', '№'], 0x33); + verifyEntry(mapping, 'Digit4', ['4', ';', '4', ';'], 0x34); + verifyEntry(mapping, 'Digit5', ['5', '%', '5', '%'], 0x35); + verifyEntry(mapping, 'Digit6', ['6', ':', '6', ':'], 0x36); + verifyEntry(mapping, 'Digit7', ['7', '?', '7', '?'], 0x37); + verifyEntry(mapping, 'Digit8', ['8', '*', '₽', ''], 0x38); + verifyEntry(mapping, 'Digit9', ['9', '(', '9', '('], 0x39); + verifyEntry(mapping, 'KeyA', ['ф', 'Ф', 'ф', 'Ф'], 0x41); + verifyEntry(mapping, 'KeyB', ['и', 'И', 'и', 'И'], 0x42); + verifyEntry(mapping, 'KeyC', ['с', 'С', 'с', 'С'], 0x43); + verifyEntry(mapping, 'KeyD', ['в', 'В', 'в', 'В'], 0x44); + verifyEntry(mapping, 'KeyE', ['у', 'У', 'у', 'У'], 0x45); + verifyEntry(mapping, 'KeyF', ['а', 'А', 'а', 'А'], 0x46); + verifyEntry(mapping, 'KeyG', ['п', 'П', 'п', 'П'], 0x47); + verifyEntry(mapping, 'KeyH', ['р', 'Р', 'р', 'Р'], 0x48); + verifyEntry(mapping, 'KeyI', ['ш', 'Ш', 'ш', 'Ш'], 0x49); + verifyEntry(mapping, 'KeyJ', ['о', 'О', 'о', 'О'], 0x4a); + verifyEntry(mapping, 'KeyK', ['л', 'Л', 'л', 'Л'], 0x4b); + verifyEntry(mapping, 'KeyL', ['д', 'Д', 'д', 'Д'], 0x4c); + verifyEntry(mapping, 'KeyM', ['ь', 'Ь', 'ь', 'Ь'], 0x4d); + verifyEntry(mapping, 'KeyN', ['т', 'Т', 'т', 'Т'], 0x4e); + verifyEntry(mapping, 'KeyO', ['щ', 'Щ', 'щ', 'Щ'], 0x4f); + verifyEntry(mapping, 'KeyP', ['з', 'З', 'з', 'З'], 0x50); + verifyEntry(mapping, 'KeyQ', ['й', 'Й', 'й', 'Й'], 0x51); + verifyEntry(mapping, 'KeyR', ['к', 'К', 'к', 'К'], 0x52); + verifyEntry(mapping, 'KeyS', ['ы', 'Ы', 'ы', 'Ы'], 0x53); + verifyEntry(mapping, 'KeyT', ['е', 'Е', 'е', 'Е'], 0x54); + verifyEntry(mapping, 'KeyU', ['г', 'Г', 'г', 'Г'], 0x55); + verifyEntry(mapping, 'KeyV', ['м', 'М', 'м', 'М'], 0x56); + verifyEntry(mapping, 'KeyW', ['ц', 'Ц', 'ц', 'Ц'], 0x57); + verifyEntry(mapping, 'KeyX', ['ч', 'Ч', 'ч', 'Ч'], 0x58); + verifyEntry(mapping, 'KeyY', ['н', 'Н', 'н', 'Н'], 0x59); + verifyEntry(mapping, 'KeyZ', ['я', 'Я', 'я', 'Я'], 0x5a); +}); +} + +void testDarwin(LayoutMapping mapping) { + group('de', () { + verifyEntry(mapping, 'Digit0', ['0', '=', '≠', '¯'], 0x30); + verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '¬'], 0x31); + verifyEntry(mapping, 'Digit2', ['2', '"', '“', '”'], 0x32); + verifyEntry(mapping, 'Digit3', ['3', '§', '¶', '#'], 0x33); + verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '£'], 0x34); + verifyEntry(mapping, 'Digit5', ['5', '%', '[', 'fi'], 0x35); + verifyEntry(mapping, 'Digit6', ['6', '&', ']', 'Dead'], 0x36); + verifyEntry(mapping, 'Digit7', ['7', '/', '|', r'\'], 0x37); + verifyEntry(mapping, 'Digit8', ['8', '(', '{', '˜'], 0x38); + verifyEntry(mapping, 'Digit9', ['9', ')', '}', '·'], 0x39); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 0x41); + verifyEntry(mapping, 'KeyB', ['b', 'B', '∫', '‹'], 0x42); + verifyEntry(mapping, 'KeyC', ['c', 'C', 'ç', 'Ç'], 0x43); + verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', '™'], 0x44); + verifyEntry(mapping, 'KeyE', ['e', 'E', '€', '‰'], 0x45); + verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', 'Ï'], 0x46); + verifyEntry(mapping, 'KeyG', ['g', 'G', '©', 'Ì'], 0x47); + verifyEntry(mapping, 'KeyH', ['h', 'H', 'ª', 'Ó'], 0x48); + verifyEntry(mapping, 'KeyI', ['i', 'I', '⁄', 'Û'], 0x49); + verifyEntry(mapping, 'KeyJ', ['j', 'J', 'º', 'ı'], 0x4a); + verifyEntry(mapping, 'KeyK', ['k', 'K', '∆', 'ˆ'], 0x4b); + verifyEntry(mapping, 'KeyL', ['l', 'L', '@', 'fl'], 0x4c); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', '˘'], 0x4d); + verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', '›'], 0x4e); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 0x4f); + verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 0x50); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', '«', '»'], 0x51); + verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '¸'], 0x52); + verifyEntry(mapping, 'KeyS', ['s', 'S', '‚', 'Í'], 0x53); + verifyEntry(mapping, 'KeyT', ['t', 'T', '†', '˝'], 0x54); + verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', 'Á'], 0x55); + verifyEntry(mapping, 'KeyV', ['v', 'V', '√', '◊'], 0x56); + verifyEntry(mapping, 'KeyW', ['w', 'W', '∑', '„'], 0x57); + verifyEntry(mapping, 'KeyX', ['x', 'X', '≈', 'Ù'], 0x58); + verifyEntry(mapping, 'KeyY', ['z', 'Z', 'Ω', 'ˇ'], 0x5a); + verifyEntry(mapping, 'KeyZ', ['y', 'Y', '¥', '‡'], 0x59); +}); + + group('dvorak', () { + verifyEntry(mapping, 'Comma', ['w', 'W', '∑', '„'], 0x57); + verifyEntry(mapping, 'Digit0', ['0', ')', 'º', '‚'], 0x30); + verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '⁄'], 0x31); + verifyEntry(mapping, 'Digit2', ['2', '@', '™', '€'], 0x32); + verifyEntry(mapping, 'Digit3', ['3', '#', '£', '‹'], 0x33); + verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '›'], 0x34); + verifyEntry(mapping, 'Digit5', ['5', '%', '∞', 'fi'], 0x35); + verifyEntry(mapping, 'Digit6', ['6', '^', '§', 'fl'], 0x36); + verifyEntry(mapping, 'Digit7', ['7', '&', '¶', '‡'], 0x37); + verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], 0x38); + verifyEntry(mapping, 'Digit9', ['9', '(', 'ª', '·'], 0x39); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 0x41); + verifyEntry(mapping, 'KeyB', ['x', 'X', '≈', '˛'], 0x58); + verifyEntry(mapping, 'KeyC', ['j', 'J', '∆', 'Ô'], 0x4a); + verifyEntry(mapping, 'KeyD', ['e', 'E', 'Dead', '´'], 0x45); + verifyEntry(mapping, 'KeyF', ['u', 'U', 'Dead', '¨'], 0x55); + verifyEntry(mapping, 'KeyG', ['i', 'I', 'Dead', 'ˆ'], 0x49); + verifyEntry(mapping, 'KeyH', ['d', 'D', '∂', 'Î'], 0x44); + verifyEntry(mapping, 'KeyI', ['c', 'C', 'ç', 'Ç'], 0x43); + verifyEntry(mapping, 'KeyJ', ['h', 'H', '˙', 'Ó'], 0x48); + verifyEntry(mapping, 'KeyK', ['t', 'T', '†', 'ˇ'], 0x54); + verifyEntry(mapping, 'KeyL', ['n', 'N', 'Dead', '˜'], 0x4e); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', 'Â'], 0x4d); + verifyEntry(mapping, 'KeyN', ['b', 'B', '∫', 'ı'], 0x42); + verifyEntry(mapping, 'KeyO', ['r', 'R', '®', '‰'], 0x52); + verifyEntry(mapping, 'KeyP', ['l', 'L', '¬', 'Ò'], 0x4c); + verifyEntry(mapping, 'KeyR', ['p', 'P', 'π', '∏'], 0x50); + verifyEntry(mapping, 'KeyS', ['o', 'O', 'ø', 'Ø'], 0x4f); + verifyEntry(mapping, 'KeyT', ['y', 'Y', '¥', 'Á'], 0x59); + verifyEntry(mapping, 'KeyU', ['g', 'G', '©', '˝'], 0x47); + verifyEntry(mapping, 'KeyV', ['k', 'K', '˚', ''], 0x4b); + verifyEntry(mapping, 'KeyX', ['q', 'Q', 'œ', 'Œ'], 0x51); + verifyEntry(mapping, 'KeyY', ['f', 'F', 'ƒ', 'Ï'], 0x46); + verifyEntry(mapping, 'Period', ['v', 'V', '√', '◊'], 0x56); + verifyEntry(mapping, 'Semicolon', ['s', 'S', 'ß', 'Í'], 0x53); + verifyEntry(mapping, 'Slash', ['z', 'Z', 'Ω', '¸'], 0x5a); +}); + + group('en', () { + verifyEntry(mapping, 'Digit0', ['0', ')', 'º', '‚'], 0x30); + verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '⁄'], 0x31); + verifyEntry(mapping, 'Digit2', ['2', '@', '™', '€'], 0x32); + verifyEntry(mapping, 'Digit3', ['3', '#', '£', '‹'], 0x33); + verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '›'], 0x34); + verifyEntry(mapping, 'Digit5', ['5', '%', '∞', 'fi'], 0x35); + verifyEntry(mapping, 'Digit6', ['6', '^', '§', 'fl'], 0x36); + verifyEntry(mapping, 'Digit7', ['7', '&', '¶', '‡'], 0x37); + verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], 0x38); + verifyEntry(mapping, 'Digit9', ['9', '(', 'ª', '·'], 0x39); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 0x41); + verifyEntry(mapping, 'KeyB', ['b', 'B', '∫', 'ı'], 0x42); + verifyEntry(mapping, 'KeyC', ['c', 'C', 'ç', 'Ç'], 0x43); + verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', 'Î'], 0x44); + verifyEntry(mapping, 'KeyE', ['e', 'E', 'Dead', '´'], 0x45); + verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', 'Ï'], 0x46); + verifyEntry(mapping, 'KeyG', ['g', 'G', '©', '˝'], 0x47); + verifyEntry(mapping, 'KeyH', ['h', 'H', '˙', 'Ó'], 0x48); + verifyEntry(mapping, 'KeyI', ['i', 'I', 'Dead', 'ˆ'], 0x49); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '∆', 'Ô'], 0x4a); + verifyEntry(mapping, 'KeyK', ['k', 'K', '˚', ''], 0x4b); + verifyEntry(mapping, 'KeyL', ['l', 'L', '¬', 'Ò'], 0x4c); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', 'Â'], 0x4d); + verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', '˜'], 0x4e); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 0x4f); + verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 0x50); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'œ', 'Œ'], 0x51); + verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '‰'], 0x52); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', 'Í'], 0x53); + verifyEntry(mapping, 'KeyT', ['t', 'T', '†', 'ˇ'], 0x54); + verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', '¨'], 0x55); + verifyEntry(mapping, 'KeyV', ['v', 'V', '√', '◊'], 0x56); + verifyEntry(mapping, 'KeyW', ['w', 'W', '∑', '„'], 0x57); + verifyEntry(mapping, 'KeyX', ['x', 'X', '≈', '˛'], 0x58); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '¥', 'Á'], 0x59); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'Ω', '¸'], 0x5a); +}); + + group('en-ext', () { + verifyEntry(mapping, 'Digit0', ['0', ')', 'º', '‚'], 0x30); + verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '⁄'], 0x31); + verifyEntry(mapping, 'Digit2', ['2', '@', '™', '€'], 0x32); + verifyEntry(mapping, 'Digit3', ['3', '#', '£', '‹'], 0x33); + verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '›'], 0x34); + verifyEntry(mapping, 'Digit5', ['5', '%', '§', '†'], 0x35); + verifyEntry(mapping, 'Digit6', ['6', '^', 'Dead', '̂'], 0x36); + verifyEntry(mapping, 'Digit7', ['7', '&', '¶', '‡'], 0x37); + verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], 0x38); + verifyEntry(mapping, 'Digit9', ['9', '(', 'ª', '·'], 0x39); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'Dead', '̄'], 0x41); + verifyEntry(mapping, 'KeyB', ['b', 'B', 'Dead', '̆'], 0x42); + verifyEntry(mapping, 'KeyC', ['c', 'C', 'Dead', '̧'], 0x43); + verifyEntry(mapping, 'KeyD', ['d', 'D', 'ð', 'Ð'], 0x44); + verifyEntry(mapping, 'KeyE', ['e', 'E', 'Dead', '́'], 0x45); + verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', ''], 0x46); + verifyEntry(mapping, 'KeyG', ['g', 'G', '©', 'Dead'], 0x47); + verifyEntry(mapping, 'KeyH', ['h', 'H', 'Dead', '̱'], 0x48); + verifyEntry(mapping, 'KeyI', ['i', 'I', 'Dead', '̛'], 0x49); + verifyEntry(mapping, 'KeyJ', ['j', 'J', 'Dead', '̋'], 0x4a); + verifyEntry(mapping, 'KeyK', ['k', 'K', 'Dead', '̊'], 0x4b); + verifyEntry(mapping, 'KeyL', ['l', 'L', 'Dead', '̵'], 0x4c); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'Dead', '̨'], 0x4d); + verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', '̃'], 0x4e); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 0x4f); + verifyEntry(mapping, 'KeyP', ['p', 'P', 'Dead', '̦'], 0x50); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'œ', 'Œ'], 0x51); + verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '‰'], 0x52); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', ''], 0x53); + verifyEntry(mapping, 'KeyT', ['t', 'T', 'þ', 'Þ'], 0x54); + verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', '̈'], 0x55); + verifyEntry(mapping, 'KeyV', ['v', 'V', 'Dead', '̌'], 0x56); + verifyEntry(mapping, 'KeyW', ['w', 'W', 'Dead', '̇'], 0x57); + verifyEntry(mapping, 'KeyX', ['x', 'X', 'Dead', '̣'], 0x58); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '¥', ''], 0x59); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'Dead', '̉'], 0x5a); +}); + + group('en-intl', () { + verifyEntry(mapping, 'Digit0', ['0', ')', 'º', '‚'], 0x30); + verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '⁄'], 0x31); + verifyEntry(mapping, 'Digit2', ['2', '@', '™', '€'], 0x32); + verifyEntry(mapping, 'Digit3', ['3', '#', '£', '‹'], 0x33); + verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '›'], 0x34); + verifyEntry(mapping, 'Digit5', ['5', '%', '∞', 'fi'], 0x35); + verifyEntry(mapping, 'Digit6', ['6', 'Dead', '§', 'fl'], 0x36); + verifyEntry(mapping, 'Digit7', ['7', '&', '¶', '‡'], 0x37); + verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], 0x38); + verifyEntry(mapping, 'Digit9', ['9', '(', 'ª', '·'], 0x39); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 0x41); + verifyEntry(mapping, 'KeyB', ['b', 'B', '∫', 'ı'], 0x42); + verifyEntry(mapping, 'KeyC', ['c', 'C', 'ç', 'Ç'], 0x43); + verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', 'Î'], 0x44); + verifyEntry(mapping, 'KeyE', ['e', 'E', 'Dead', '´'], 0x45); + verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', 'Ï'], 0x46); + verifyEntry(mapping, 'KeyG', ['g', 'G', '©', '˝'], 0x47); + verifyEntry(mapping, 'KeyH', ['h', 'H', '˙', 'Ó'], 0x48); + verifyEntry(mapping, 'KeyI', ['i', 'I', 'Dead', 'ˆ'], 0x49); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '∆', 'Ô'], 0x4a); + verifyEntry(mapping, 'KeyK', ['k', 'K', '˚', ''], 0x4b); + verifyEntry(mapping, 'KeyL', ['l', 'L', '¬', 'Ò'], 0x4c); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', 'Â'], 0x4d); + verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', '˜'], 0x4e); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 0x4f); + verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 0x50); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'œ', 'Œ'], 0x51); + verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '‰'], 0x52); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', 'Í'], 0x53); + verifyEntry(mapping, 'KeyT', ['t', 'T', '†', 'ˇ'], 0x54); + verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', '¨'], 0x55); + verifyEntry(mapping, 'KeyV', ['v', 'V', '√', '◊'], 0x56); + verifyEntry(mapping, 'KeyW', ['w', 'W', '∑', '„'], 0x57); + verifyEntry(mapping, 'KeyX', ['x', 'X', '≈', '˛'], 0x58); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '¥', 'Á'], 0x59); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'Ω', '¸'], 0x5a); +}); + + group('en-uk', () { + verifyEntry(mapping, 'Digit0', ['0', ')', 'º', '‚'], 0x30); + verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '⁄'], 0x31); + verifyEntry(mapping, 'Digit2', ['2', '@', '€', '™'], 0x32); + verifyEntry(mapping, 'Digit3', ['3', '£', '#', '‹'], 0x33); + verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '›'], 0x34); + verifyEntry(mapping, 'Digit5', ['5', '%', '∞', 'fi'], 0x35); + verifyEntry(mapping, 'Digit6', ['6', '^', '§', 'fl'], 0x36); + verifyEntry(mapping, 'Digit7', ['7', '&', '¶', '‡'], 0x37); + verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], 0x38); + verifyEntry(mapping, 'Digit9', ['9', '(', 'ª', '·'], 0x39); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 0x41); + verifyEntry(mapping, 'KeyB', ['b', 'B', '∫', 'ı'], 0x42); + verifyEntry(mapping, 'KeyC', ['c', 'C', 'ç', 'Ç'], 0x43); + verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', 'Î'], 0x44); + verifyEntry(mapping, 'KeyE', ['e', 'E', 'Dead', '‰'], 0x45); + verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', 'Ï'], 0x46); + verifyEntry(mapping, 'KeyG', ['g', 'G', '©', 'Ì'], 0x47); + verifyEntry(mapping, 'KeyH', ['h', 'H', '˙', 'Ó'], 0x48); + verifyEntry(mapping, 'KeyI', ['i', 'I', 'Dead', 'È'], 0x49); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '∆', 'Ô'], 0x4a); + verifyEntry(mapping, 'KeyK', ['k', 'K', '˚', ''], 0x4b); + verifyEntry(mapping, 'KeyL', ['l', 'L', '¬', 'Ò'], 0x4c); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', '˜'], 0x4d); + verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', 'ˆ'], 0x4e); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 0x4f); + verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 0x50); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'œ', 'Œ'], 0x51); + verifyEntry(mapping, 'KeyR', ['r', 'R', '®', 'Â'], 0x52); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', 'Í'], 0x53); + verifyEntry(mapping, 'KeyT', ['t', 'T', '†', 'Ê'], 0x54); + verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', 'Ë'], 0x55); + verifyEntry(mapping, 'KeyV', ['v', 'V', '√', '◊'], 0x56); + verifyEntry(mapping, 'KeyW', ['w', 'W', '∑', '„'], 0x57); + verifyEntry(mapping, 'KeyX', ['x', 'X', '≈', 'Ù'], 0x58); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '¥', 'Á'], 0x59); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'Ω', 'Û'], 0x5a); +}); + + group('es', () { + verifyEntry(mapping, 'Digit0', ['0', '=', '≠', '≈'], 0x30); + verifyEntry(mapping, 'Digit1', ['1', '!', '|', 'ı'], 0x31); + verifyEntry(mapping, 'Digit2', ['2', '"', '@', '˝'], 0x32); + verifyEntry(mapping, 'Digit3', ['3', '·', '#', '•'], 0x33); + verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '£'], 0x34); + verifyEntry(mapping, 'Digit5', ['5', '%', '∞', '‰'], 0x35); + verifyEntry(mapping, 'Digit6', ['6', '&', '¬', ' '], 0x36); + verifyEntry(mapping, 'Digit7', ['7', '/', '÷', '⁄'], 0x37); + verifyEntry(mapping, 'Digit8', ['8', '(', '“', '‘'], 0x38); + verifyEntry(mapping, 'Digit9', ['9', ')', '”', '’'], 0x39); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 0x41); + verifyEntry(mapping, 'KeyB', ['b', 'B', 'ß', ''], 0x42); + verifyEntry(mapping, 'KeyC', ['c', 'C', '©', ' '], 0x43); + verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', '∆'], 0x44); + verifyEntry(mapping, 'KeyE', ['e', 'E', '€', '€'], 0x45); + verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', 'fi'], 0x46); + verifyEntry(mapping, 'KeyG', ['g', 'G', '', 'fl'], 0x47); + verifyEntry(mapping, 'KeyH', ['h', 'H', '™', ' '], 0x48); + verifyEntry(mapping, 'KeyI', ['i', 'I', ' ', ' '], 0x49); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '¶', '¯'], 0x4a); + verifyEntry(mapping, 'KeyK', ['k', 'K', '§', 'ˇ'], 0x4b); + verifyEntry(mapping, 'KeyL', ['l', 'L', ' ', '˘'], 0x4c); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', '˚'], 0x4d); + verifyEntry(mapping, 'KeyN', ['n', 'N', ' ', '˙'], 0x4e); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 0x4f); + verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 0x50); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'œ', 'Œ'], 0x51); + verifyEntry(mapping, 'KeyR', ['r', 'R', '®', ' '], 0x52); + verifyEntry(mapping, 'KeyS', ['s', 'S', '∫', ' '], 0x53); + verifyEntry(mapping, 'KeyT', ['t', 'T', '†', '‡'], 0x54); + verifyEntry(mapping, 'KeyU', ['u', 'U', ' ', ' '], 0x55); + verifyEntry(mapping, 'KeyV', ['v', 'V', '√', '◊'], 0x56); + verifyEntry(mapping, 'KeyW', ['w', 'W', 'æ', 'Æ'], 0x57); + verifyEntry(mapping, 'KeyX', ['x', 'X', '∑', '›'], 0x58); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '¥', ' '], 0x59); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'Ω', '‹'], 0x5a); +}); + + group('fr', () { + verifyEntry(mapping, 'Digit0', ['à', '0', 'ø', 'Ø'], 0x30); + verifyEntry(mapping, 'Digit1', ['&', '1', '', 'Dead'], 0x31); + verifyEntry(mapping, 'Digit2', ['é', '2', 'ë', '„'], 0x32); + verifyEntry(mapping, 'Digit3', ['"', '3', '“', '”'], 0x33); + verifyEntry(mapping, 'Digit4', ["'", '4', '‘', '’'], 0x34); + verifyEntry(mapping, 'Digit5', ['(', '5', '{', '['], 0x35); + verifyEntry(mapping, 'Digit6', ['§', '6', '¶', 'å'], 0x36); + verifyEntry(mapping, 'Digit7', ['è', '7', '«', '»'], 0x37); + verifyEntry(mapping, 'Digit8', ['!', '8', '¡', 'Û'], 0x38); + verifyEntry(mapping, 'Digit9', ['ç', '9', 'Ç', 'Á'], 0x39); + verifyEntry(mapping, 'KeyA', ['q', 'Q', '‡', 'Ω'], 0x51); + verifyEntry(mapping, 'KeyB', ['b', 'B', 'ß', '∫'], 0x42); + verifyEntry(mapping, 'KeyC', ['c', 'C', '©', '¢'], 0x43); + verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', '∆'], 0x44); + verifyEntry(mapping, 'KeyE', ['e', 'E', 'ê', 'Ê'], 0x45); + verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', '·'], 0x46); + verifyEntry(mapping, 'KeyG', ['g', 'G', 'fi', 'fl'], 0x47); + verifyEntry(mapping, 'KeyH', ['h', 'H', 'Ì', 'Î'], 0x48); + verifyEntry(mapping, 'KeyI', ['i', 'I', 'î', 'ï'], 0x49); + verifyEntry(mapping, 'KeyJ', ['j', 'J', 'Ï', 'Í'], 0x4a); + verifyEntry(mapping, 'KeyK', ['k', 'K', 'È', 'Ë'], 0x4b); + verifyEntry(mapping, 'KeyL', ['l', 'L', '¬', '|'], 0x4c); + verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', 'ı'], 0x4e); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'œ', 'Œ'], 0x4f); + verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 0x50); + verifyEntry(mapping, 'KeyQ', ['a', 'A', 'æ', 'Æ'], 0x41); + verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '‚'], 0x52); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'Ò', '∑'], 0x53); + verifyEntry(mapping, 'KeyT', ['t', 'T', '†', '™'], 0x54); + verifyEntry(mapping, 'KeyU', ['u', 'U', 'º', 'ª'], 0x55); + verifyEntry(mapping, 'KeyV', ['v', 'V', '◊', '√'], 0x56); + verifyEntry(mapping, 'KeyW', ['z', 'Z', 'Â', 'Å'], 0x5a); + verifyEntry(mapping, 'KeyX', ['x', 'X', '≈', '⁄'], 0x58); + verifyEntry(mapping, 'KeyY', ['y', 'Y', 'Ú', 'Ÿ'], 0x59); + verifyEntry(mapping, 'KeyZ', ['w', 'W', '‹', '›'], 0x57); + verifyEntry(mapping, 'Semicolon', ['m', 'M', 'µ', 'Ó'], 0x4d); +}); + + group('it', () { + verifyEntry(mapping, 'Digit0', ['0', '=', '≠', '≈'], 0x30); + verifyEntry(mapping, 'Digit1', ['1', '!', '«', '»'], 0x31); + verifyEntry(mapping, 'Digit2', ['2', '"', '“', '”'], 0x32); + verifyEntry(mapping, 'Digit3', ['3', '£', '‘', '’'], 0x33); + verifyEntry(mapping, 'Digit4', ['4', r'$', '¥', '¢'], 0x34); + verifyEntry(mapping, 'Digit5', ['5', '%', '~', '‰'], 0x35); + verifyEntry(mapping, 'Digit6', ['6', '&', '‹', '›'], 0x36); + verifyEntry(mapping, 'Digit7', ['7', '/', '÷', '⁄'], 0x37); + verifyEntry(mapping, 'Digit8', ['8', '(', 'Dead', ''], 0x38); + verifyEntry(mapping, 'Digit9', ['9', ')', 'Dead', ' '], 0x39); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 0x41); + verifyEntry(mapping, 'KeyB', ['b', 'B', '∫', 'Í'], 0x42); + verifyEntry(mapping, 'KeyC', ['c', 'C', '©', 'Á'], 0x43); + verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', '˘'], 0x44); + verifyEntry(mapping, 'KeyE', ['e', 'E', '€', 'È'], 0x45); + verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', '˙'], 0x46); + verifyEntry(mapping, 'KeyG', ['g', 'G', '∞', '˚'], 0x47); + verifyEntry(mapping, 'KeyH', ['h', 'H', '∆', '¸'], 0x48); + verifyEntry(mapping, 'KeyI', ['i', 'I', 'œ', 'Œ'], 0x49); + verifyEntry(mapping, 'KeyJ', ['j', 'J', 'ª', '˝'], 0x4a); + verifyEntry(mapping, 'KeyK', ['k', 'K', 'º', '˛'], 0x4b); + verifyEntry(mapping, 'KeyL', ['l', 'L', '¬', 'ˇ'], 0x4c); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', 'Ú'], 0x4d); + verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', 'Ó'], 0x4e); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 0x4f); + verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 0x50); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', '„', '‚'], 0x51); + verifyEntry(mapping, 'KeyR', ['r', 'R', '®', 'Ì'], 0x52); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', '¯'], 0x53); + verifyEntry(mapping, 'KeyT', ['t', 'T', '™', 'Ò'], 0x54); + verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', 'Ù'], 0x55); + verifyEntry(mapping, 'KeyV', ['v', 'V', '√', 'É'], 0x56); + verifyEntry(mapping, 'KeyW', ['w', 'W', 'Ω', 'À'], 0x57); + verifyEntry(mapping, 'KeyX', ['x', 'X', '†', '‡'], 0x58); + verifyEntry(mapping, 'KeyY', ['y', 'Y', 'æ', 'Æ'], 0x59); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', '∑', ' '], 0x5a); +}); + + group('jp', () { + verifyEntry(mapping, 'Digit0', ['0', ')', 'º', '‚'], 0x30); + verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '⁄'], 0x31); + verifyEntry(mapping, 'Digit2', ['2', '@', '™', '€'], 0x32); + verifyEntry(mapping, 'Digit3', ['3', '#', '£', '‹'], 0x33); + verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '›'], 0x34); + verifyEntry(mapping, 'Digit5', ['5', '%', '∞', 'fi'], 0x35); + verifyEntry(mapping, 'Digit6', ['6', '^', '§', 'fl'], 0x36); + verifyEntry(mapping, 'Digit7', ['7', '&', '¶', '‡'], 0x37); + verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], 0x38); + verifyEntry(mapping, 'Digit9', ['9', '(', 'ª', '·'], 0x39); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 0x41); + verifyEntry(mapping, 'KeyB', ['b', 'B', '∫', 'ı'], 0x42); + verifyEntry(mapping, 'KeyC', ['c', 'C', 'ç', 'Ç'], 0x43); + verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', 'Î'], 0x44); + verifyEntry(mapping, 'KeyE', ['e', 'E', 'Dead', '´'], 0x45); + verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', 'Ï'], 0x46); + verifyEntry(mapping, 'KeyG', ['g', 'G', '©', '˝'], 0x47); + verifyEntry(mapping, 'KeyH', ['h', 'H', '˙', 'Ó'], 0x48); + verifyEntry(mapping, 'KeyI', ['i', 'I', 'Dead', 'ˆ'], 0x49); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '∆', 'Ô'], 0x4a); + verifyEntry(mapping, 'KeyK', ['k', 'K', '˚', ''], 0x4b); + verifyEntry(mapping, 'KeyL', ['l', 'L', '¬', 'Ò'], 0x4c); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', 'Â'], 0x4d); + verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', '˜'], 0x4e); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 0x4f); + verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 0x50); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'œ', 'Œ'], 0x51); + verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '‰'], 0x52); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', 'Í'], 0x53); + verifyEntry(mapping, 'KeyT', ['t', 'T', '†', 'ˇ'], 0x54); + verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', '¨'], 0x55); + verifyEntry(mapping, 'KeyV', ['v', 'V', '√', '◊'], 0x56); + verifyEntry(mapping, 'KeyW', ['w', 'W', '∑', '„'], 0x57); + verifyEntry(mapping, 'KeyX', ['x', 'X', '≈', '˛'], 0x58); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '¥', 'Á'], 0x59); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'Ω', '¸'], 0x5a); +}); + + group('jp-roman', () { + verifyEntry(mapping, 'Digit0', ['0', ')', 'º', '‚'], 0x30); + verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '⁄'], 0x31); + verifyEntry(mapping, 'Digit2', ['2', '@', '™', '€'], 0x32); + verifyEntry(mapping, 'Digit3', ['3', '#', '£', '‹'], 0x33); + verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '›'], 0x34); + verifyEntry(mapping, 'Digit5', ['5', '%', '§', '†'], 0x35); + verifyEntry(mapping, 'Digit6', ['6', '^', 'Dead', '̂'], 0x36); + verifyEntry(mapping, 'Digit7', ['7', '&', '¶', '‡'], 0x37); + verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], 0x38); + verifyEntry(mapping, 'Digit9', ['9', '(', 'ª', '·'], 0x39); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'Dead', '̄'], 0x41); + verifyEntry(mapping, 'KeyB', ['b', 'B', 'Dead', '̆'], 0x42); + verifyEntry(mapping, 'KeyC', ['c', 'C', 'Dead', '̧'], 0x43); + verifyEntry(mapping, 'KeyD', ['d', 'D', 'ð', 'Ð'], 0x44); + verifyEntry(mapping, 'KeyE', ['e', 'E', 'Dead', '́'], 0x45); + verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', ''], 0x46); + verifyEntry(mapping, 'KeyG', ['g', 'G', '©', 'Dead'], 0x47); + verifyEntry(mapping, 'KeyH', ['h', 'H', 'Dead', '̱'], 0x48); + verifyEntry(mapping, 'KeyI', ['i', 'I', 'Dead', '̛'], 0x49); + verifyEntry(mapping, 'KeyJ', ['j', 'J', 'Dead', '̋'], 0x4a); + verifyEntry(mapping, 'KeyK', ['k', 'K', 'Dead', '̊'], 0x4b); + verifyEntry(mapping, 'KeyL', ['l', 'L', 'Dead', '̵'], 0x4c); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'Dead', '̨'], 0x4d); + verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', '̃'], 0x4e); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 0x4f); + verifyEntry(mapping, 'KeyP', ['p', 'P', 'Dead', '̦'], 0x50); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'œ', 'Œ'], 0x51); + verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '‰'], 0x52); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', ''], 0x53); + verifyEntry(mapping, 'KeyT', ['t', 'T', 'þ', 'Þ'], 0x54); + verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', '̈'], 0x55); + verifyEntry(mapping, 'KeyV', ['v', 'V', 'Dead', '̌'], 0x56); + verifyEntry(mapping, 'KeyW', ['w', 'W', 'Dead', '̇'], 0x57); + verifyEntry(mapping, 'KeyX', ['x', 'X', 'Dead', '̣'], 0x58); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '¥', ''], 0x59); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'Dead', '̉'], 0x5a); +}); + + group('ko', () { + verifyEntry(mapping, 'Digit0', ['0', ')', '0', ')'], 0x30); + verifyEntry(mapping, 'Digit1', ['1', '!', '1', '!'], 0x31); + verifyEntry(mapping, 'Digit2', ['2', '@', '2', '@'], 0x32); + verifyEntry(mapping, 'Digit3', ['3', '#', '3', '#'], 0x33); + verifyEntry(mapping, 'Digit4', ['4', r'$', '4', r'$'], 0x34); + verifyEntry(mapping, 'Digit5', ['5', '%', '5', '%'], 0x35); + verifyEntry(mapping, 'Digit6', ['6', '^', '6', '^'], 0x36); + verifyEntry(mapping, 'Digit7', ['7', '&', '7', '&'], 0x37); + verifyEntry(mapping, 'Digit8', ['8', '*', '8', '*'], 0x38); + verifyEntry(mapping, 'Digit9', ['9', '(', '9', '('], 0x39); + verifyEntry(mapping, 'KeyA', ['ㅁ', 'ㅁ', 'a', 'A'], 0x41); + verifyEntry(mapping, 'KeyB', ['ㅠ', 'ㅠ', 'b', 'B'], 0x42); + verifyEntry(mapping, 'KeyC', ['ㅊ', 'ㅊ', 'c', 'C'], 0x43); + verifyEntry(mapping, 'KeyD', ['ㅇ', 'ㅇ', 'd', 'D'], 0x44); + verifyEntry(mapping, 'KeyE', ['ㄷ', 'ㄸ', 'e', 'E'], 0x45); + verifyEntry(mapping, 'KeyF', ['ㄹ', 'ㄹ', 'f', 'F'], 0x46); + verifyEntry(mapping, 'KeyG', ['ㅎ', 'ㅎ', 'g', 'G'], 0x47); + verifyEntry(mapping, 'KeyH', ['ㅗ', 'ㅗ', 'h', 'H'], 0x48); + verifyEntry(mapping, 'KeyI', ['ㅑ', 'ㅑ', 'i', 'I'], 0x49); + verifyEntry(mapping, 'KeyJ', ['ㅓ', 'ㅓ', 'j', 'J'], 0x4a); + verifyEntry(mapping, 'KeyK', ['ㅏ', 'ㅏ', 'k', 'K'], 0x4b); + verifyEntry(mapping, 'KeyL', ['ㅣ', 'ㅣ', 'l', 'L'], 0x4c); + verifyEntry(mapping, 'KeyM', ['ㅡ', 'ㅡ', 'm', 'M'], 0x4d); + verifyEntry(mapping, 'KeyN', ['ㅜ', 'ㅜ', 'n', 'N'], 0x4e); + verifyEntry(mapping, 'KeyO', ['ㅐ', 'ㅒ', 'o', 'O'], 0x4f); + verifyEntry(mapping, 'KeyP', ['ㅔ', 'ㅖ', 'p', 'P'], 0x50); + verifyEntry(mapping, 'KeyQ', ['ㅂ', 'ㅃ', 'q', 'Q'], 0x51); + verifyEntry(mapping, 'KeyR', ['ㄱ', 'ㄲ', 'r', 'R'], 0x52); + verifyEntry(mapping, 'KeyS', ['ㄴ', 'ㄴ', 's', 'S'], 0x53); + verifyEntry(mapping, 'KeyT', ['ㅅ', 'ㅆ', 't', 'T'], 0x54); + verifyEntry(mapping, 'KeyU', ['ㅕ', 'ㅕ', 'u', 'U'], 0x55); + verifyEntry(mapping, 'KeyV', ['ㅍ', 'ㅍ', 'v', 'V'], 0x56); + verifyEntry(mapping, 'KeyW', ['ㅈ', 'ㅉ', 'w', 'W'], 0x57); + verifyEntry(mapping, 'KeyX', ['ㅌ', 'ㅌ', 'x', 'X'], 0x58); + verifyEntry(mapping, 'KeyY', ['ㅛ', 'ㅛ', 'y', 'Y'], 0x59); + verifyEntry(mapping, 'KeyZ', ['ㅋ', 'ㅋ', 'z', 'Z'], 0x5a); +}); + + group('pl', () { + verifyEntry(mapping, 'Digit0', ['0', ')', 'ľ', '‚'], 0x30); + verifyEntry(mapping, 'Digit1', ['1', '!', 'Ń', 'ŕ'], 0x31); + verifyEntry(mapping, 'Digit2', ['2', '@', '™', 'Ř'], 0x32); + verifyEntry(mapping, 'Digit3', ['3', '#', '€', '‹'], 0x33); + verifyEntry(mapping, 'Digit4', ['4', r'$', 'ß', '›'], 0x34); + verifyEntry(mapping, 'Digit5', ['5', '%', 'į', 'ř'], 0x35); + verifyEntry(mapping, 'Digit6', ['6', '^', '§', 'Ŗ'], 0x36); + verifyEntry(mapping, 'Digit7', ['7', '&', '¶', 'ŗ'], 0x37); + verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], 0x38); + verifyEntry(mapping, 'Digit9', ['9', '(', 'Ľ', 'Š'], 0x39); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'ą', 'Ą'], 0x41); + verifyEntry(mapping, 'KeyB', ['b', 'B', 'ļ', 'ű'], 0x42); + verifyEntry(mapping, 'KeyC', ['c', 'C', 'ć', 'Ć'], 0x43); + verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', 'Ž'], 0x44); + verifyEntry(mapping, 'KeyE', ['e', 'E', 'ę', 'Ę'], 0x45); + verifyEntry(mapping, 'KeyF', ['f', 'F', 'ń', 'ž'], 0x46); + verifyEntry(mapping, 'KeyG', ['g', 'G', '©', 'Ū'], 0x47); + verifyEntry(mapping, 'KeyH', ['h', 'H', 'ķ', 'Ó'], 0x48); + verifyEntry(mapping, 'KeyI', ['i', 'I', 'Dead', 'ť'], 0x49); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '∆', 'Ô'], 0x4a); + verifyEntry(mapping, 'KeyK', ['k', 'K', 'Ż', 'ū'], 0x4b); + verifyEntry(mapping, 'KeyL', ['l', 'L', 'ł', 'Ł'], 0x4c); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'Ķ', 'ų'], 0x4d); + verifyEntry(mapping, 'KeyN', ['n', 'N', 'ń', 'Ń'], 0x4e); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'ó', 'Ó'], 0x4f); + verifyEntry(mapping, 'KeyP', ['p', 'P', 'Ļ', 'ł'], 0x50); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'Ō', 'ő'], 0x51); + verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '£'], 0x52); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'ś', 'Ś'], 0x53); + verifyEntry(mapping, 'KeyT', ['t', 'T', '†', 'ś'], 0x54); + verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', 'Ť'], 0x55); + verifyEntry(mapping, 'KeyV', ['v', 'V', '√', '◊'], 0x56); + verifyEntry(mapping, 'KeyW', ['w', 'W', '∑', '„'], 0x57); + verifyEntry(mapping, 'KeyX', ['x', 'X', 'ź', 'Ź'], 0x58); + verifyEntry(mapping, 'KeyY', ['y', 'Y', 'ī', 'Á'], 0x59); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'ż', 'Ż'], 0x5a); +}); + + group('pt', () { + verifyEntry(mapping, 'Digit0', ['0', ')', 'º', '‚'], 0x30); + verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '⁄'], 0x31); + verifyEntry(mapping, 'Digit2', ['2', '@', '™', '€'], 0x32); + verifyEntry(mapping, 'Digit3', ['3', '#', '£', '‹'], 0x33); + verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '›'], 0x34); + verifyEntry(mapping, 'Digit5', ['5', '%', '∞', 'fi'], 0x35); + verifyEntry(mapping, 'Digit6', ['6', 'Dead', '§', 'fl'], 0x36); + verifyEntry(mapping, 'Digit7', ['7', '&', '¶', '‡'], 0x37); + verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], 0x38); + verifyEntry(mapping, 'Digit9', ['9', '(', 'ª', '·'], 0x39); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 0x41); + verifyEntry(mapping, 'KeyB', ['b', 'B', '∫', 'ı'], 0x42); + verifyEntry(mapping, 'KeyC', ['c', 'C', 'ç', 'Ç'], 0x43); + verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', 'Î'], 0x44); + verifyEntry(mapping, 'KeyE', ['e', 'E', 'Dead', '´'], 0x45); + verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', 'Ï'], 0x46); + verifyEntry(mapping, 'KeyG', ['g', 'G', '©', '˝'], 0x47); + verifyEntry(mapping, 'KeyH', ['h', 'H', '˙', 'Ó'], 0x48); + verifyEntry(mapping, 'KeyI', ['i', 'I', 'Dead', 'ˆ'], 0x49); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '∆', 'Ô'], 0x4a); + verifyEntry(mapping, 'KeyK', ['k', 'K', '˚', ''], 0x4b); + verifyEntry(mapping, 'KeyL', ['l', 'L', '¬', 'Ò'], 0x4c); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', 'Â'], 0x4d); + verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', '˜'], 0x4e); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 0x4f); + verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 0x50); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'œ', 'Œ'], 0x51); + verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '‰'], 0x52); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', 'Í'], 0x53); + verifyEntry(mapping, 'KeyT', ['t', 'T', '†', 'ˇ'], 0x54); + verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', '¨'], 0x55); + verifyEntry(mapping, 'KeyV', ['v', 'V', '√', '◊'], 0x56); + verifyEntry(mapping, 'KeyW', ['w', 'W', '∑', '„'], 0x57); + verifyEntry(mapping, 'KeyX', ['x', 'X', '≈', '˛'], 0x58); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '¥', 'Á'], 0x59); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'Ω', '¸'], 0x5a); +}); + + group('ru', () { + verifyEntry(mapping, 'Digit0', ['0', ')', '}', '`'], 0x30); + verifyEntry(mapping, 'Digit1', ['1', '!', '!', '|'], 0x31); + verifyEntry(mapping, 'Digit2', ['2', '"', '@', '"'], 0x32); + verifyEntry(mapping, 'Digit3', ['3', '№', '#', '£'], 0x33); + verifyEntry(mapping, 'Digit4', ['4', '%', r'$', '€'], 0x34); + verifyEntry(mapping, 'Digit5', ['5', ':', '%', '∞'], 0x35); + verifyEntry(mapping, 'Digit6', ['6', ',', '^', '¬'], 0x36); + verifyEntry(mapping, 'Digit7', ['7', '.', '&', '¶'], 0x37); + verifyEntry(mapping, 'Digit8', ['8', ';', '*', '√'], 0x38); + verifyEntry(mapping, 'Digit9', ['9', '(', '{', "'"], 0x39); + verifyEntry(mapping, 'KeyA', ['ф', 'Ф', 'ƒ', 'ƒ'], 0x41); + verifyEntry(mapping, 'KeyB', ['и', 'И', 'и', 'И'], 0x42); + verifyEntry(mapping, 'KeyC', ['с', 'С', '≠', '≠'], 0x43); + verifyEntry(mapping, 'KeyD', ['в', 'В', 'ћ', 'Ћ'], 0x44); + verifyEntry(mapping, 'KeyE', ['у', 'У', 'ќ', 'Ќ'], 0x45); + verifyEntry(mapping, 'KeyF', ['а', 'А', '÷', '÷'], 0x46); + verifyEntry(mapping, 'KeyG', ['п', 'П', '©', '©'], 0x47); + verifyEntry(mapping, 'KeyH', ['р', 'Р', '₽', '₽'], 0x48); + verifyEntry(mapping, 'KeyI', ['ш', 'Ш', 'ѕ', 'Ѕ'], 0x49); + verifyEntry(mapping, 'KeyJ', ['о', 'О', '°', '•'], 0x4a); + verifyEntry(mapping, 'KeyK', ['л', 'Л', 'љ', 'Љ'], 0x4b); + verifyEntry(mapping, 'KeyL', ['д', 'Д', '∆', '∆'], 0x4c); + verifyEntry(mapping, 'KeyM', ['ь', 'Ь', '~', '~'], 0x4d); + verifyEntry(mapping, 'KeyN', ['т', 'Т', '™', '™'], 0x4e); + verifyEntry(mapping, 'KeyO', ['щ', 'Щ', 'ў', 'Ў'], 0x4f); + verifyEntry(mapping, 'KeyP', ['з', 'З', '‘', '’'], 0x50); + verifyEntry(mapping, 'KeyQ', ['й', 'Й', 'ј', 'Ј'], 0x51); + verifyEntry(mapping, 'KeyR', ['к', 'К', '®', '®'], 0x52); + verifyEntry(mapping, 'KeyS', ['ы', 'Ы', 'ы', 'Ы'], 0x53); + verifyEntry(mapping, 'KeyT', ['е', 'Е', '†', '†'], 0x54); + verifyEntry(mapping, 'KeyU', ['г', 'Г', 'ѓ', 'Ѓ'], 0x55); + verifyEntry(mapping, 'KeyV', ['м', 'М', 'µ', 'µ'], 0x56); + verifyEntry(mapping, 'KeyW', ['ц', 'Ц', 'џ', 'Џ'], 0x57); + verifyEntry(mapping, 'KeyX', ['ч', 'Ч', '≈', '≈'], 0x58); + verifyEntry(mapping, 'KeyY', ['н', 'Н', 'њ', 'Њ'], 0x59); + verifyEntry(mapping, 'KeyZ', ['я', 'Я', 'ђ', 'Ђ'], 0x5a); +}); + + group('sv', () { + verifyEntry(mapping, 'Digit0', ['0', '=', '≈', '≠'], 0x30); + verifyEntry(mapping, 'Digit1', ['1', '!', '©', '¡'], 0x31); + verifyEntry(mapping, 'Digit2', ['2', '"', '@', '”'], 0x32); + verifyEntry(mapping, 'Digit3', ['3', '#', '£', '¥'], 0x33); + verifyEntry(mapping, 'Digit4', ['4', '€', r'$', '¢'], 0x34); + verifyEntry(mapping, 'Digit5', ['5', '%', '∞', '‰'], 0x35); + verifyEntry(mapping, 'Digit6', ['6', '&', '§', '¶'], 0x36); + verifyEntry(mapping, 'Digit7', ['7', '/', '|', r'\'], 0x37); + verifyEntry(mapping, 'Digit8', ['8', '(', '[', '{'], 0x38); + verifyEntry(mapping, 'Digit9', ['9', ')', ']', '}'], 0x39); + verifyEntry(mapping, 'KeyA', ['a', 'A', '', '◊'], 0x41); + verifyEntry(mapping, 'KeyB', ['b', 'B', '›', '»'], 0x42); + verifyEntry(mapping, 'KeyC', ['c', 'C', 'ç', 'Ç'], 0x43); + verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', '∆'], 0x44); + verifyEntry(mapping, 'KeyE', ['e', 'E', 'é', 'É'], 0x45); + verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', '∫'], 0x46); + verifyEntry(mapping, 'KeyG', ['g', 'G', '¸', '¯'], 0x47); + verifyEntry(mapping, 'KeyH', ['h', 'H', '˛', '˘'], 0x48); + verifyEntry(mapping, 'KeyI', ['i', 'I', 'ı', 'ˆ'], 0x49); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '√', '¬'], 0x4a); + verifyEntry(mapping, 'KeyK', ['k', 'K', 'ª', 'º'], 0x4b); + verifyEntry(mapping, 'KeyL', ['l', 'L', 'fi', 'fl'], 0x4c); + verifyEntry(mapping, 'KeyM', ['m', 'M', '’', '”'], 0x4d); + verifyEntry(mapping, 'KeyN', ['n', 'N', '‘', '“'], 0x4e); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'œ', 'Œ'], 0x4f); + verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 0x50); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', '•', '°'], 0x51); + verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '√'], 0x52); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', '∑'], 0x53); + verifyEntry(mapping, 'KeyT', ['t', 'T', '†', '‡'], 0x54); + verifyEntry(mapping, 'KeyU', ['u', 'U', 'ü', 'Ü'], 0x55); + verifyEntry(mapping, 'KeyV', ['v', 'V', '‹', '«'], 0x56); + verifyEntry(mapping, 'KeyW', ['w', 'W', 'Ω', '˝'], 0x57); + verifyEntry(mapping, 'KeyX', ['x', 'X', '≈', 'ˇ'], 0x58); + verifyEntry(mapping, 'KeyY', ['y', 'Y', 'µ', '˜'], 0x59); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', '÷', '⁄'], 0x5a); +}); + + group('zh-hans', () { + verifyEntry(mapping, 'Digit0', ['0', ')', 'º', '‚'], 0x30); + verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '⁄'], 0x31); + verifyEntry(mapping, 'Digit2', ['2', '@', '™', '€'], 0x32); + verifyEntry(mapping, 'Digit3', ['3', '#', '£', '‹'], 0x33); + verifyEntry(mapping, 'Digit4', ['4', '¥', '¢', '›'], 0x34); + verifyEntry(mapping, 'Digit5', ['5', '%', '∞', 'fi'], 0x35); + verifyEntry(mapping, 'Digit6', ['6', '', '§', 'fl'], 0x36); + verifyEntry(mapping, 'Digit7', ['7', '&', '¶', '‡'], 0x37); + verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], 0x38); + verifyEntry(mapping, 'Digit9', ['9', '(', 'ª', '·'], 0x39); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 0x41); + verifyEntry(mapping, 'KeyB', ['b', 'B', '∫', 'ı'], 0x42); + verifyEntry(mapping, 'KeyC', ['c', 'C', 'ç', 'Ç'], 0x43); + verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', 'Î'], 0x44); + verifyEntry(mapping, 'KeyE', ['e', 'E', 'Dead', '´'], 0x45); + verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', 'Ï'], 0x46); + verifyEntry(mapping, 'KeyG', ['g', 'G', '©', '˝'], 0x47); + verifyEntry(mapping, 'KeyH', ['h', 'H', '˙', 'Ó'], 0x48); + verifyEntry(mapping, 'KeyI', ['i', 'I', 'Dead', 'ˆ'], 0x49); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '∆', 'Ô'], 0x4a); + verifyEntry(mapping, 'KeyK', ['k', 'K', '˚', ''], 0x4b); + verifyEntry(mapping, 'KeyL', ['l', 'L', '¬', 'Ò'], 0x4c); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', 'Â'], 0x4d); + verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', '˜'], 0x4e); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 0x4f); + verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 0x50); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'œ', 'Œ'], 0x51); + verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '‰'], 0x52); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', 'Í'], 0x53); + verifyEntry(mapping, 'KeyT', ['t', 'T', '†', 'ˇ'], 0x54); + verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', '¨'], 0x55); + verifyEntry(mapping, 'KeyV', ['v', 'V', '√', '◊'], 0x56); + verifyEntry(mapping, 'KeyW', ['w', 'W', '∑', '„'], 0x57); + verifyEntry(mapping, 'KeyX', ['x', 'X', '≈', '˛'], 0x58); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '¥', 'Á'], 0x59); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'Ω', '¸'], 0x5a); +}); +} diff --git a/third_party/web_keyboard_layouts/test/testing.dart b/third_party/web_keyboard_layouts/test/testing.dart new file mode 100644 index 0000000000000..7a21bd97e0246 --- /dev/null +++ b/third_party/web_keyboard_layouts/test/testing.dart @@ -0,0 +1,29 @@ +// import 'package:litetest/litetest.dart'; +import 'package:test/test.dart'; +import 'package:web_keyboard_layouts/web_keyboard_layouts.dart'; + +void verifyEntry(LayoutMapping mapping, String eventCode, List eventKeys, int logicalKey) { + // If the KeyboardEvent.code is a letter key such as "KeyA", then + // KeyboardEvent.keyCode is the upper letter such as "A". Otherwise, this + // field must not be used (in reality this field may or may not be platform + // independent). + String? eventKeyCode; + { + final RegExp regexLetterKey = RegExp(r'^Key([A-Z])$'); + final RegExpMatch? matchLetterKey = regexLetterKey.firstMatch(eventCode); + if (matchLetterKey != null) { + eventKeyCode = matchLetterKey.group(1)!.toUpperCase(); + } + } + + int index = 0; + for (final String eventKey in eventKeys) { + if (eventKey.isEmpty) { + continue; + } + test('$eventCode $index', () { + expect(mapping.getLogicalKey(eventCode, eventKey, eventKeyCode ?? ''), logicalKey); + }); + index += 1; + } +} diff --git a/tools/gen_web_keyboard_layouts/bin/gen_web_keyboard_layouts.dart b/tools/gen_web_keyboard_layouts/bin/gen_web_keyboard_layouts.dart index 7003d8f171883..1b5a7674463e3 100644 --- a/tools/gen_web_keyboard_layouts/bin/gen_web_keyboard_layouts.dart +++ b/tools/gen_web_keyboard_layouts/bin/gen_web_keyboard_layouts.dart @@ -65,6 +65,6 @@ Future main(List rawArguments) async { libRoot: path.join(packageRoot.path, 'lib'), force: parsedArguments['force'] as bool, outputRoot: path.join(packageRoot.parent.parent.path, - 'lib', 'web_ui', 'lib', 'src', 'engine'), + 'third_party', 'web_keyboard_layouts'), )); } diff --git a/tools/gen_web_keyboard_layouts/data/key_mappings.dart.tmpl b/tools/gen_web_keyboard_layouts/data/key_mappings.dart.tmpl index 252e10dadcae0..0807122660c45 100644 --- a/tools/gen_web_keyboard_layouts/data/key_mappings.dart.tmpl +++ b/tools/gen_web_keyboard_layouts/data/key_mappings.dart.tmpl @@ -13,6 +13,8 @@ // // See flutter/engine:flutter/tools/gen_web_keyboard_layouts/README.md for more information. +part of web_keyboard_layouts; + final Map> kWinMapping = @@@WIN_MAPPING@@@; final Map> kLinuxMapping = @@@LINUX_MAPPING@@@; diff --git a/tools/gen_web_keyboard_layouts/data/test_cases.dart.tmpl b/tools/gen_web_keyboard_layouts/data/test_cases.dart.tmpl new file mode 100644 index 0000000000000..a3ba5d8f1c772 --- /dev/null +++ b/tools/gen_web_keyboard_layouts/data/test_cases.dart.tmpl @@ -0,0 +1,30 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. + +// DO NOT EDIT -- DO NOT EDIT -- DO NOT EDIT +// +// This file is auto generated by flutter/engine:flutter/tools/gen_web_keyboard_layouts based on +// https://github.com/microsoft/vscode/tree/@@@COMMIT_ID@@@/src/vs/workbench/services/keybinding/browser/keyboardLayouts +// +// Edit the following files instead: +// +// - Script: lib/main.dart +// - Templates: data/*.tmpl +// +// See flutter/engine:flutter/tools/gen_web_keyboard_layouts/README.md for more information. + +import 'package:test/test.dart'; +import 'package:web_keyboard_layouts/web_keyboard_layouts.dart'; +import 'testing.dart'; + +void testWin(LayoutMapping mapping) { +@@@WIN_CASES@@@ +} + +void testLinux(LayoutMapping mapping) { +@@@LINUX_CASES@@@ +} + +void testDarwin(LayoutMapping mapping) { +@@@DARWIN_CASES@@@ +} diff --git a/tools/gen_web_keyboard_layouts/lib/benchmark_detector.dart b/tools/gen_web_keyboard_layouts/lib/benchmark_detector.dart index 6828d6ad660f7..4e4e072459a27 100644 --- a/tools/gen_web_keyboard_layouts/lib/benchmark_detector.dart +++ b/tools/gen_web_keyboard_layouts/lib/benchmark_detector.dart @@ -57,7 +57,8 @@ final Map _kMandatoryGoalsByChar = Map.fromEntri .map((MapEntry entry) => MapEntry(entry.value!, entry.key)) ); -Map _buildLayout(Map entries) { +// Returns a mapping from eventCode to logical key for this layout. +Map buildLayout(Map entries) { // Unresolved mandatory goals, mapped from printables to KeyboardEvent.code. // This map will be modified during this function and thus is a clone. final Map mandatoryGoalsByChar = {..._kMandatoryGoalsByChar}; @@ -129,7 +130,7 @@ bool _mappedToKeyCode(int charCode) { Map> buildMap(Iterable layouts) { final Map> result = >{}; for (final Layout layout in layouts) { - _buildLayout(layout.entries).forEach((String eventCode, int logicalKey) { + buildLayout(layout.entries).forEach((String eventCode, int logicalKey) { final Map codeMap = result.putIfAbsent(eventCode, () => {}); final LayoutEntry entry = layout.entries[eventCode]!; for (int charIndex = 0; charIndex < 4; charIndex += 1) { diff --git a/tools/gen_web_keyboard_layouts/lib/main.dart b/tools/gen_web_keyboard_layouts/lib/main.dart index 5cddcceb33a3a..03ea999df76f2 100644 --- a/tools/gen_web_keyboard_layouts/lib/main.dart +++ b/tools/gen_web_keyboard_layouts/lib/main.dart @@ -138,6 +138,31 @@ ${codeStringBodies.join('\n').trimRight()} return '>{\n${codeStrings.join('\n')}\n}'; } +String _buildTestCasesString(List layouts) { + final List layoutsString = []; + for (final Layout layout in layouts) { + final List layoutEntries = []; + _sortedForEach(buildLayout(layout.entries), (String eventCode, int logicalKey) { + final LayoutEntry entry = layout.entries[eventCode]!; + layoutEntries.add(" verifyEntry(mapping, '$eventCode', [" + '${List.generate(4, (int modifierIndex) { + if (entry.deadMasks & (1 << modifierIndex) != 0) { + return "'Dead'"; + } else { + return _escapeEventKey(entry.printables[modifierIndex]); + } + }).join(', ')}' + '], 0x${logicalKey.toRadixString(16)});'); + }); + layoutsString.add(''' + group('${layout.language}', () { +${layoutEntries.join('\n')} +}); +'''); + } + return layoutsString.join('\n').trimRight(); +} + Future generate(Options options) async { final List layouts = await fetchFromGithub( githubToken: options.githubToken, @@ -147,43 +172,41 @@ Future generate(Options options) async { // Build store. final LayoutStore store = LayoutStore(kLayoutGoals, layouts); - _buildMapString(store.layouts.where((Layout layout) => layout.platform == LayoutPlatform.linux)); - _buildMapString(store.layouts.where((Layout layout) => layout.platform == LayoutPlatform.darwin)); - - // final String body = marshallStoreCompressed(store); - - // // Verify that the store can be unmarshalled correctly. - // // Inconcistencies will cause exceptions. - // verifyLayoutStoreEqual(store, unmarshallStoreCompressed(body)); + final List winLayouts = store.layouts.where((Layout layout) => + layout.platform == LayoutPlatform.win).toList(); + final List linuxLayouts = store.layouts.where((Layout layout) => + layout.platform == LayoutPlatform.linux).toList(); + final List darwinLayouts = store.layouts.where((Layout layout) => + layout.platform == LayoutPlatform.darwin).toList(); // Generate the definition file. _writeFileTo( - options.outputRoot, + path.join(options.outputRoot, 'lib'), 'key_mappings.g.dart', _renderTemplate( File(path.join(options.dataRoot, 'key_mappings.dart.tmpl')).readAsStringSync(), { - 'WIN_MAPPING': _buildMapString(store.layouts.where((Layout layout) => - layout.platform == LayoutPlatform.win)), - 'LINUX_MAPPING': _buildMapString(store.layouts.where((Layout layout) => - layout.platform == LayoutPlatform.linux)), - 'DARWIN_MAPPING': _buildMapString(store.layouts.where((Layout layout) => - layout.platform == LayoutPlatform.darwin)), + 'WIN_MAPPING': _buildMapString(winLayouts), + 'LINUX_MAPPING': _buildMapString(linuxLayouts), + 'DARWIN_MAPPING': _buildMapString(darwinLayouts), + }, + ), + ); + + // Generate the test cases. + _writeFileTo( + path.join(options.outputRoot, 'test'), + 'test_cases.g.dart', + _renderTemplate( + File(path.join(options.dataRoot, 'test_cases.dart.tmpl')).readAsStringSync(), + { + 'WIN_CASES': _buildTestCasesString(winLayouts), + 'LINUX_CASES': _buildTestCasesString(linuxLayouts), + 'DARWIN_CASES': _buildTestCasesString(darwinLayouts), }, ), ); - // // Generate the type file. - // _writeFileTo( - // options.outputRoot, - // 'types.g.dart', - // _renderTemplate( - // File(path.join(options.dataRoot, 'types.dart.tmpl')).readAsStringSync(), - // { - // 'BODY': _readSharedSegment(path.join(options.libRoot, 'layout_types.dart')), - // }, - // ), - // ); // // Generate the JSON file. // _writeFileTo( From ae05f6b90fd9adf5513da8b8a668cddf86499665 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Tue, 1 Nov 2022 13:37:29 -0700 Subject: [PATCH 27/74] Unified dead key --- .../lib/key_mappings.g.dart | 48 +- .../lib/web_keyboard_layouts.dart | 1 - .../lib/benchmark_detector.dart | 13 +- .../gen_web_keyboard_layouts/lib/github.dart | 14 +- .../lib/layout_types.dart | 557 +++++++++--------- tools/gen_web_keyboard_layouts/lib/main.dart | 8 +- 6 files changed, 315 insertions(+), 326 deletions(-) diff --git a/third_party/web_keyboard_layouts/lib/key_mappings.g.dart b/third_party/web_keyboard_layouts/lib/key_mappings.g.dart index ba126fe626779..050318d87d6f6 100644 --- a/third_party/web_keyboard_layouts/lib/key_mappings.g.dart +++ b/third_party/web_keyboard_layouts/lib/key_mappings.g.dart @@ -883,7 +883,7 @@ final Map> kDarwinMapping = >{ '!': 0x31, '&': 0x31, '1': 0x31, - 'Deadkey': 0x31, + 'Dead': 0x31, '|': 0x31, '¡': 0x31, '©': 0x31, @@ -964,7 +964,7 @@ final Map> kDarwinMapping = >{ '&': 0x36, ',': 0x36, '6': 0x36, - 'Deadkey': 0x36, + 'Dead': 0x36, ']': 0x36, '^': 0x36, '§': 0x36, @@ -999,7 +999,7 @@ final Map> kDarwinMapping = >{ '*': 0x38, '8': 0x38, ';': 0x38, - 'Deadkey': 0x38, + 'Dead': 0x38, '[': 0x38, '{': 0x38, '¡': 0x38, @@ -1018,7 +1018,7 @@ final Map> kDarwinMapping = >{ '(': 0x39, ')': 0x39, '9': 0x39, - 'Deadkey': 0x39, + 'Dead': 0x39, ']': 0x39, '{': 0x39, '}': 0x39, @@ -1035,7 +1035,7 @@ final Map> kDarwinMapping = >{ }, 'KeyA': { 'A': 0x41, - 'Deadkey': 0x41, + 'Dead': 0x41, 'Q': 0x51, 'a': 0x41, 'q': 0x51, @@ -1055,7 +1055,7 @@ final Map> kDarwinMapping = >{ }, 'KeyB': { 'B': 0x42, - 'Deadkey': 0x42, + 'Dead': 0x42, 'X': 0x58, 'b': 0x42, 'x': 0x58, @@ -1078,7 +1078,7 @@ final Map> kDarwinMapping = >{ 'KeyC': { ' ': 0x43, 'C': 0x43, - 'Deadkey': 0x43, + 'Dead': 0x43, 'J': 0x4a, 'c': 0x43, 'j': 0x4a, @@ -1099,7 +1099,7 @@ final Map> kDarwinMapping = >{ }, 'KeyD': { 'D': 0x44, - 'Deadkey': 0x45, + 'Dead': 0x45, 'E': 0x45, 'd': 0x44, 'e': 0x45, @@ -1119,7 +1119,7 @@ final Map> kDarwinMapping = >{ 'ㅇ': 0x44, }, 'KeyE': { - 'Deadkey': 0x45, + 'Dead': 0x45, 'E': 0x45, 'e': 0x45, '´': 0x45, @@ -1141,7 +1141,7 @@ final Map> kDarwinMapping = >{ 'ㄸ': 0x45, }, 'KeyF': { - 'Deadkey': 0x55, + 'Dead': 0x55, 'F': 0x46, 'U': 0x55, 'f': 0x46, @@ -1161,7 +1161,7 @@ final Map> kDarwinMapping = >{ 'fi': 0x46, }, 'KeyG': { - 'Deadkey': 0x1, + 'Dead': 0x1, 'G': 0x47, 'I': 0x49, 'g': 0x47, @@ -1185,7 +1185,7 @@ final Map> kDarwinMapping = >{ 'KeyH': { ' ': 0x48, 'D': 0x44, - 'Deadkey': 0x48, + 'Dead': 0x48, 'H': 0x48, 'd': 0x44, 'h': 0x48, @@ -1210,7 +1210,7 @@ final Map> kDarwinMapping = >{ 'KeyI': { ' ': 0x49, 'C': 0x43, - 'Deadkey': 0x49, + 'Dead': 0x49, 'I': 0x49, 'c': 0x43, 'i': 0x49, @@ -1234,7 +1234,7 @@ final Map> kDarwinMapping = >{ 'ㅑ': 0x49, }, 'KeyJ': { - 'Deadkey': 0x4a, + 'Dead': 0x4a, 'H': 0x48, 'J': 0x4a, 'h': 0x48, @@ -1261,7 +1261,7 @@ final Map> kDarwinMapping = >{ 'ㅓ': 0x4a, }, 'KeyK': { - 'Deadkey': 0x4b, + 'Dead': 0x4b, 'K': 0x4b, 'T': 0x54, 'k': 0x4b, @@ -1290,7 +1290,7 @@ final Map> kDarwinMapping = >{ 'KeyL': { ' ': 0x4c, '@': 0x4c, - 'Deadkey': 0x1, + 'Dead': 0x1, 'L': 0x4c, 'N': 0x4e, 'l': 0x4c, @@ -1312,7 +1312,7 @@ final Map> kDarwinMapping = >{ 'fl': 0x4c, }, 'KeyM': { - 'Deadkey': 0x4d, + 'Dead': 0x4d, 'M': 0x4d, 'm': 0x4d, '~': 0x4d, @@ -1334,7 +1334,7 @@ final Map> kDarwinMapping = >{ 'KeyN': { ' ': 0x4e, 'B': 0x42, - 'Deadkey': 0x4e, + 'Dead': 0x4e, 'N': 0x4e, 'b': 0x42, 'n': 0x4e, @@ -1376,7 +1376,7 @@ final Map> kDarwinMapping = >{ 'ㅒ': 0x4f, }, 'KeyP': { - 'Deadkey': 0x50, + 'Dead': 0x50, 'L': 0x4c, 'P': 0x50, 'l': 0x4c, @@ -1485,7 +1485,7 @@ final Map> kDarwinMapping = >{ }, 'KeyU': { ' ': 0x55, - 'Deadkey': 0x55, + 'Dead': 0x55, 'G': 0x47, 'U': 0x55, 'g': 0x47, @@ -1509,7 +1509,7 @@ final Map> kDarwinMapping = >{ 'ㅕ': 0x55, }, 'KeyV': { - 'Deadkey': 0x56, + 'Dead': 0x56, 'K': 0x4b, 'V': 0x56, 'k': 0x4b, @@ -1528,7 +1528,7 @@ final Map> kDarwinMapping = >{ '': 0x4b, }, 'KeyW': { - 'Deadkey': 0x57, + 'Dead': 0x57, 'W': 0x57, 'Z': 0x5a, 'w': 0x57, @@ -1551,7 +1551,7 @@ final Map> kDarwinMapping = >{ 'ㅉ': 0x57, }, 'KeyX': { - 'Deadkey': 0x58, + 'Dead': 0x58, 'Q': 0x51, 'X': 0x58, 'q': 0x51, @@ -1603,7 +1603,7 @@ final Map> kDarwinMapping = >{ }, 'KeyZ': { ' ': 0x5a, - 'Deadkey': 0x5a, + 'Dead': 0x5a, 'W': 0x57, 'Y': 0x59, 'Z': 0x5a, diff --git a/third_party/web_keyboard_layouts/lib/web_keyboard_layouts.dart b/third_party/web_keyboard_layouts/lib/web_keyboard_layouts.dart index f9d4f3e978b9f..ad3b5e8b671b8 100644 --- a/third_party/web_keyboard_layouts/lib/web_keyboard_layouts.dart +++ b/third_party/web_keyboard_layouts/lib/web_keyboard_layouts.dart @@ -13,7 +13,6 @@ class LayoutMapping { LayoutMapping.darwin() : _mapping = kDarwinMapping; int? getLogicalKey(String eventCode, String eventKey, String eventKeyCode) { - print('$eventCode, $eventKey, $eventKeyCode'); final int? result = _mapping[eventCode]?[eventKey]; if (result == _kUseKeyCode) { return getLetterCode(eventKeyCode.toUpperCase()); diff --git a/tools/gen_web_keyboard_layouts/lib/benchmark_detector.dart b/tools/gen_web_keyboard_layouts/lib/benchmark_detector.dart index 4e4e072459a27..252e46bc79963 100644 --- a/tools/gen_web_keyboard_layouts/lib/benchmark_detector.dart +++ b/tools/gen_web_keyboard_layouts/lib/benchmark_detector.dart @@ -74,13 +74,11 @@ Map buildLayout(Map entries) { entries.forEach((String eventCode, LayoutEntry entry) { // bool anyEascii = false; - for (int index = 0; index < 4; index += 1) { + for (final String printable in entry.printables) { // Ignore dead keys. - if (entry.deadMasks & (1 << index) != 0) { + if (printable == LayoutEntry.kDeadKey) { continue; } - // A printable of this key is a mandatory goal: Use it. - final String printable = entry.printables[index]; if (mandatoryGoalsByChar.containsKey(printable)) { result[eventCode] = printable.codeUnitAt(0); mandatoryGoalsByChar.remove(printable); @@ -133,13 +131,10 @@ Map> buildMap(Iterable layouts) { buildLayout(layout.entries).forEach((String eventCode, int logicalKey) { final Map codeMap = result.putIfAbsent(eventCode, () => {}); final LayoutEntry entry = layout.entries[eventCode]!; - for (int charIndex = 0; charIndex < 4; charIndex += 1) { - final bool isDeadKey = entry.deadMasks & (1 << charIndex) != 0; - final String printable = entry.printables[charIndex]; - if (!isDeadKey && printable.isEmpty) { + for (final String eventKey in entry.printables) { + if (eventKey.isEmpty) { continue; } - final String eventKey = isDeadKey ? 'Deadkey' : printable; if (codeMap.containsKey(eventKey) && codeMap[eventKey] != logicalKey) { assert(_mappedToKeyCode(codeMap[eventKey]!)); assert(_mappedToKeyCode(logicalKey)); diff --git a/tools/gen_web_keyboard_layouts/lib/github.dart b/tools/gen_web_keyboard_layouts/lib/github.dart index d6d7870e3d989..2df0c8a9c1c8e 100644 --- a/tools/gen_web_keyboard_layouts/lib/github.dart +++ b/tools/gen_web_keyboard_layouts/lib/github.dart @@ -136,10 +136,13 @@ _GitHubFile _jsonGetGithubFile(JsonContext files, int index) { ); } -String _parsePrintable(String rawString) { +String _parsePrintable(String rawString, int isDeadKey) { // Parse a char represented in unicode hex, such as \u001b. final RegExp hexParser = RegExp(r'^\\u([0-9a-fA-F]+)$'); + if (isDeadKey != 0) { + return LayoutEntry.kDeadKey; + } if (rawString.isEmpty) { return ''; } @@ -206,12 +209,11 @@ Layout _parseLayoutFromGithubFile(_GitHubFile file) { entries[eventKey] = LayoutEntry( [ - _parsePrintable(listMatch.group(1)!), - _parsePrintable(listMatch.group(2)!), - _parsePrintable(listMatch.group(3)!), - _parsePrintable(listMatch.group(4)!), + _parsePrintable(listMatch.group(1)!, deadMask & 0x1), + _parsePrintable(listMatch.group(2)!, deadMask & 0x2), + _parsePrintable(listMatch.group(3)!, deadMask & 0x4), + _parsePrintable(listMatch.group(4)!, deadMask & 0x8), ], - deadMask, ); }); diff --git a/tools/gen_web_keyboard_layouts/lib/layout_types.dart b/tools/gen_web_keyboard_layouts/lib/layout_types.dart index 3db89d4f4354d..73d73b9c355d2 100644 --- a/tools/gen_web_keyboard_layouts/lib/layout_types.dart +++ b/tools/gen_web_keyboard_layouts/lib/layout_types.dart @@ -35,7 +35,7 @@ const int _kPrintableLength = 4; /// platform. class LayoutEntry { /// Create a layout entry. - LayoutEntry(this.printables, this.deadMasks) + LayoutEntry(this.printables) : assert(printables.length == _kPrintableLength); /// The printable characters that a key should be mapped to under different @@ -43,22 +43,21 @@ class LayoutEntry { /// /// The [printables] always have a length of 4, corresponding to "without any /// modifiers", "with Shift", "with AltGr", and "with Shift and AltGr" - /// respectively. Some values might be empty, or be dead keys that are - /// indiecated by [deadMasks]. - final List printables; - - /// Whether the outcome of a key is a dead key under different modifier - /// states. + /// respectively. + /// + /// Some values might be empty. It doesn't mean that these combinations will + /// have an empty KeyboardKey.key, but usually these values are trivial, + /// i.e. same as their non-modified counterparts. /// - /// The four LSB [deadMasks] correspond to the four conditions of - /// [printables]: 0x1 for "without any modifiers", 0x2 for "with Shift", - /// 0x4 for "with AltGr", and 0x8 for "with Shift and AltGr". A set bit means - /// the character is a dead key. - final int deadMasks; + /// Some other values can be [kDeadKey]s. Dead keys are non-printable accents + /// that will be combined into the following letter character. + final List printables; /// An empty [LayoutEntry] that produces dead keys under all conditions. static final LayoutEntry empty = LayoutEntry( - const ['', '', '', ''], 0xf); + const ['', '', '', '']); + + static const String kDeadKey = 'Dead'; } /// Describes the characters that all goal keys will be mapped to for a given @@ -99,269 +98,269 @@ class LayoutStore { final List layouts; } -// A [ByteBuffer] that records a offset for the convenience of reading -// sequentially. -class _ByteStream { - _ByteStream(this.buffer) - : _data = buffer.asByteData(), _offset = 0; - - final ByteBuffer buffer; - final ByteData _data; - - // The current offset. - // - // The next read will start from this byte (inclusive). - int get offest => _offset; - int _offset; - - // Read the next byte as an 8-bit unsigned integer, and increase [offset] by - // 1. - int readUint8() { - final int result = _data.getUint8(_offset); - _offset += 1; - return result; - } - - // Read the next few bytes as a UTF-8 string, and increase [offset] - // accordingly. - // - // The first byte will be a uint8, `length`, the number of bytes of the UTF-8 - // sequence. Following that is the UTF-8 sequence. Therefore, the total - // increment for [offset] is `length + 1`. - // - // If the `length` is 0, then an empty string is returned. - String readString() { - final int length = _data.getUint8(_offset); - if (length == 0) { - _offset += 1; - return ''; - } - final Uint8List bytes = buffer.asUint8List(_offset + 1, length); - final String result = utf8.decode(bytes); - _offset += 1 + length; - return result; - } - - // Read the next few bytes as a nullable UTF-8 string, and increase [offset] - // accordingly. - // - // It is the same as [readString], except that if the `length` is 0, a null is - // returned. - String? readNullableString() { - final int length = _data.getUint8(_offset); - if (length == 0) { - _offset += 1; - return null; - } - return readString(); - } -} - -/// Decode a [LayoutStore] out of the compressed binary data. -LayoutStore unmarshallStoreCompressed(String compressed) { - final Uint8List bytes = Uint8List.fromList(gzip.decode(base64.decode(compressed))); - return _unmarshallStore(bytes.buffer); -} - -LayoutStore _unmarshallStore(ByteBuffer buffer) { - final _ByteStream stream = _ByteStream(buffer); - final Map goals = _unmarshallGoals(stream); - final List goalKeys = goals.keys.toList(); - final int layoutNum = stream.readUint8(); - final List layouts = List.generate(layoutNum, (_) { - return _unmarshallLayout(stream, goalKeys); - }); - return LayoutStore(goals, layouts); -} - -Map _unmarshallGoals(_ByteStream stream) { - final int goalsLength = stream.readUint8(); - return Map.fromEntries((() sync* { - for (int goalIndex = 0; goalIndex < goalsLength; goalIndex += 1) { - yield MapEntry(stream.readString(), stream.readNullableString()); - } - })()); -} - -Layout _unmarshallLayout(_ByteStream stream, List goalKeys) { - final String language = stream.readString(); - final LayoutPlatform platform = LayoutPlatform.values[stream.readUint8()]; - final Map entries = Map.fromIterables( - goalKeys, - goalKeys.map((_) => _unmarshallLayoutEntry(stream)), - ); - return Layout(language, platform, entries); -} - -LayoutEntry _unmarshallLayoutEntry(_ByteStream stream) { - final List printables = List.generate(_kPrintableLength, - (_) => stream.readString()); - final int deadMasks = stream.readUint8(); - return LayoutEntry(printables, deadMasks); -} - -/*@@@ SHARED SEGMENT END @@@*/ - -/// Compress a [LayoutStore] into the compressed binary data. -/// -/// See [unmarshallStoreCompressed] for decompression. -/// -/// The corretness of compression and decompression is checked by -/// [verifyLayoutStoreEqual], which is run at the end of every generation. -String marshallStoreCompressed(LayoutStore store) { - final BytesBuilder bodyBuilder = BytesBuilder(); - _marshallStore(bodyBuilder, store); - final Uint8List bytes = bodyBuilder.takeBytes(); - return base64.encode(gzip.encode(bytes)); -} - -void _marshallStore(BytesBuilder builder, LayoutStore store) { - final List goalKeys = store.goals.keys.toList(); - // Sanity check: All layouts should have the same list of keys. - for (final Layout layout in store.layouts) { - if (layout.entries.length != goalKeys.length) { - throw Exception('Unmatched key list for ${layout.language}.${layout.platform}: ' - 'Expect length ${goalKeys.length}, found length ${layout.entries.length}'); - } - final Set unfoundKeys = goalKeys.toSet().difference(layout.entries.keys.toSet()); - if (unfoundKeys.isNotEmpty) { - throw Exception('Unmatched key list for ${layout.language}.${layout.platform}: ' - 'The following keys are not found: ${unfoundKeys.join(', ')}.'); - } - } - - _marshallGoals(builder, store.goals); - _marshallUint8(builder, store.layouts.length); - for (final Layout layout in store.layouts) { - _marshallLayout(builder, layout, goalKeys); - } -} - -void _marshallUint8(BytesBuilder builder, int value) { - if (value < 0 || value >= 256) { - throw Exception('Out of range uint8: $value'); - } - builder.addByte(value); -} - -void _marshallString(BytesBuilder builder, String? string) { - if (string == null) { - _marshallUint8(builder, 0); - return; - } - final List encoded = utf8.encode(string); - _marshallUint8(builder, encoded.length); - builder.add(encoded); -} - -void _marshallGoals(BytesBuilder builder, Map goals) { - _marshallUint8(builder, goals.length); - goals.forEach((String key, String? value) { - _marshallString(builder, key); - _marshallString(builder, value); - }); -} - -void _marshallLayout(BytesBuilder builder, Layout layout, List goalKeys) { - _marshallString(builder, layout.language); - _marshallUint8(builder, layout.platform.index); - for (final String key in goalKeys) { - _marshallLayoutEntry(builder, layout.entries[key]!); - } -} - -void _marshallLayoutEntry(BytesBuilder builder, LayoutEntry entry) { - if (entry.printables.length != _kPrintableLength) { - throw Exception('Malshaped entry printables: ${entry.printables}'); - } - for (final String printable in entry.printables) { - _marshallString(builder, printable); - } - builder.addByte(entry.deadMasks); -} - -typedef _VerifyCallback = void Function(T value1, T value2, String path); - -/// Verify that two [LayoutStore]s are equal. -/// -/// It verifies all fields of all children objects of the store. For maps, -/// it also verifies that the two stores have the same order of entries. -/// -/// Inconsistencies will lead to throwing [Exception]. -void verifyLayoutStoreEqual(LayoutStore store1, LayoutStore store2) { - // Test if two values are equal by `==`, or throw an exception. - void expectEqual(T a, T b, String path) { - if (a != b) { - throw Exception('Error verifying unmarshalled layout on $path: $a != $b'); - } - } - // Test that two iterables are of the same length, and each of their elements - // are verifies by `body`. - void verifyEach(Iterable a, Iterable b, String path, _VerifyCallback body) { - expectEqual(a.length, b.length, '$path.length'); - final Iterator aIter = a.iterator; - final Iterator bIter = b.iterator; - int index = 0; - while (aIter.moveNext()) { - assert(bIter.moveNext()); // Guaranteed true since they're of the same length. - body(aIter.current, bIter.current, '$path[$index]'); - index += 1; - } - } - - // Verify Store.goals - verifyEach(store1.goals.entries, store2.goals.entries, 'Store.goals', - (MapEntry entry1, MapEntry entry2, String path) { - expectEqual(entry1.key, entry2.key, '$path.key'); - expectEqual(entry1.value, entry2.value, '$path.value'); - }); - - // Verify Layout - verifyEach(store1.layouts, store2.layouts, 'Store.layouts', - (Layout layout1, Layout layout2, String path) { - expectEqual(layout1.language, layout2.language, '$path.language'); - expectEqual(layout1.platform, layout2.platform, '$path.platform'); - // Verify LayoutEntry - verifyEach(layout1.entries.entries, layout2.entries.entries, '$path.entries', - (MapEntry entry1, MapEntry entry2, String path) { - expectEqual(entry1.key, entry2.key, '$path.key'); - verifyEach(entry1.value.printables, entry2.value.printables, '$path.printables', - (String printable1, String printable2, String path) { - expectEqual(printable1, printable2, path); - }); - expectEqual(entry1.value.deadMasks, entry2.value.deadMasks, '$path.deadMasks'); - }); - }); -} - -String _layoutPlatformToString(LayoutPlatform platform) { - switch (platform) { - case LayoutPlatform.win: - return 'win'; - case LayoutPlatform.linux: - return 'linux'; - case LayoutPlatform.darwin: - return 'darwin'; - } -} - -/// Marshall a store into a JSON. -/// -/// The JSON is not to be parsed by scripts, but read by human. -Map jsonifyStore(LayoutStore store) { - final Map storeJson = {}; - storeJson['goals'] = Map.from(store.goals); - storeJson['layouts'] = store.layouts.map((Layout layout) { - final Map layoutJson = {}; - layoutJson['language'] = layout.language; - layoutJson['platform'] = _layoutPlatformToString(layout.platform); - layoutJson['entries'] = Map.fromIterables( - layout.entries.keys, - layout.entries.values.map((LayoutEntry entry) => - [...entry.printables, entry.deadMasks] - ), - ); - return layoutJson; - }).toList(); - return storeJson; -} +// // A [ByteBuffer] that records a offset for the convenience of reading +// // sequentially. +// class _ByteStream { +// _ByteStream(this.buffer) +// : _data = buffer.asByteData(), _offset = 0; + +// final ByteBuffer buffer; +// final ByteData _data; + +// // The current offset. +// // +// // The next read will start from this byte (inclusive). +// int get offest => _offset; +// int _offset; + +// // Read the next byte as an 8-bit unsigned integer, and increase [offset] by +// // 1. +// int readUint8() { +// final int result = _data.getUint8(_offset); +// _offset += 1; +// return result; +// } + +// // Read the next few bytes as a UTF-8 string, and increase [offset] +// // accordingly. +// // +// // The first byte will be a uint8, `length`, the number of bytes of the UTF-8 +// // sequence. Following that is the UTF-8 sequence. Therefore, the total +// // increment for [offset] is `length + 1`. +// // +// // If the `length` is 0, then an empty string is returned. +// String readString() { +// final int length = _data.getUint8(_offset); +// if (length == 0) { +// _offset += 1; +// return ''; +// } +// final Uint8List bytes = buffer.asUint8List(_offset + 1, length); +// final String result = utf8.decode(bytes); +// _offset += 1 + length; +// return result; +// } + +// // Read the next few bytes as a nullable UTF-8 string, and increase [offset] +// // accordingly. +// // +// // It is the same as [readString], except that if the `length` is 0, a null is +// // returned. +// String? readNullableString() { +// final int length = _data.getUint8(_offset); +// if (length == 0) { +// _offset += 1; +// return null; +// } +// return readString(); +// } +// } + +// /// Decode a [LayoutStore] out of the compressed binary data. +// LayoutStore unmarshallStoreCompressed(String compressed) { +// final Uint8List bytes = Uint8List.fromList(gzip.decode(base64.decode(compressed))); +// return _unmarshallStore(bytes.buffer); +// } + +// LayoutStore _unmarshallStore(ByteBuffer buffer) { +// final _ByteStream stream = _ByteStream(buffer); +// final Map goals = _unmarshallGoals(stream); +// final List goalKeys = goals.keys.toList(); +// final int layoutNum = stream.readUint8(); +// final List layouts = List.generate(layoutNum, (_) { +// return _unmarshallLayout(stream, goalKeys); +// }); +// return LayoutStore(goals, layouts); +// } + +// Map _unmarshallGoals(_ByteStream stream) { +// final int goalsLength = stream.readUint8(); +// return Map.fromEntries((() sync* { +// for (int goalIndex = 0; goalIndex < goalsLength; goalIndex += 1) { +// yield MapEntry(stream.readString(), stream.readNullableString()); +// } +// })()); +// } + +// Layout _unmarshallLayout(_ByteStream stream, List goalKeys) { +// final String language = stream.readString(); +// final LayoutPlatform platform = LayoutPlatform.values[stream.readUint8()]; +// final Map entries = Map.fromIterables( +// goalKeys, +// goalKeys.map((_) => _unmarshallLayoutEntry(stream)), +// ); +// return Layout(language, platform, entries); +// } + +// LayoutEntry _unmarshallLayoutEntry(_ByteStream stream) { +// final List printables = List.generate(_kPrintableLength, +// (_) => stream.readString()); +// final int deadMasks = stream.readUint8(); +// return LayoutEntry(printables, deadMasks); +// } + +// /*@@@ SHARED SEGMENT END @@@*/ + +// /// Compress a [LayoutStore] into the compressed binary data. +// /// +// /// See [unmarshallStoreCompressed] for decompression. +// /// +// /// The corretness of compression and decompression is checked by +// /// [verifyLayoutStoreEqual], which is run at the end of every generation. +// String marshallStoreCompressed(LayoutStore store) { +// final BytesBuilder bodyBuilder = BytesBuilder(); +// _marshallStore(bodyBuilder, store); +// final Uint8List bytes = bodyBuilder.takeBytes(); +// return base64.encode(gzip.encode(bytes)); +// } + +// void _marshallStore(BytesBuilder builder, LayoutStore store) { +// final List goalKeys = store.goals.keys.toList(); +// // Sanity check: All layouts should have the same list of keys. +// for (final Layout layout in store.layouts) { +// if (layout.entries.length != goalKeys.length) { +// throw Exception('Unmatched key list for ${layout.language}.${layout.platform}: ' +// 'Expect length ${goalKeys.length}, found length ${layout.entries.length}'); +// } +// final Set unfoundKeys = goalKeys.toSet().difference(layout.entries.keys.toSet()); +// if (unfoundKeys.isNotEmpty) { +// throw Exception('Unmatched key list for ${layout.language}.${layout.platform}: ' +// 'The following keys are not found: ${unfoundKeys.join(', ')}.'); +// } +// } + +// _marshallGoals(builder, store.goals); +// _marshallUint8(builder, store.layouts.length); +// for (final Layout layout in store.layouts) { +// _marshallLayout(builder, layout, goalKeys); +// } +// } + +// void _marshallUint8(BytesBuilder builder, int value) { +// if (value < 0 || value >= 256) { +// throw Exception('Out of range uint8: $value'); +// } +// builder.addByte(value); +// } + +// void _marshallString(BytesBuilder builder, String? string) { +// if (string == null) { +// _marshallUint8(builder, 0); +// return; +// } +// final List encoded = utf8.encode(string); +// _marshallUint8(builder, encoded.length); +// builder.add(encoded); +// } + +// void _marshallGoals(BytesBuilder builder, Map goals) { +// _marshallUint8(builder, goals.length); +// goals.forEach((String key, String? value) { +// _marshallString(builder, key); +// _marshallString(builder, value); +// }); +// } + +// void _marshallLayout(BytesBuilder builder, Layout layout, List goalKeys) { +// _marshallString(builder, layout.language); +// _marshallUint8(builder, layout.platform.index); +// for (final String key in goalKeys) { +// _marshallLayoutEntry(builder, layout.entries[key]!); +// } +// } + +// void _marshallLayoutEntry(BytesBuilder builder, LayoutEntry entry) { +// if (entry.printables.length != _kPrintableLength) { +// throw Exception('Malshaped entry printables: ${entry.printables}'); +// } +// for (final String printable in entry.printables) { +// _marshallString(builder, printable); +// } +// builder.addByte(entry.deadMasks); +// } + +// typedef _VerifyCallback = void Function(T value1, T value2, String path); + +// /// Verify that two [LayoutStore]s are equal. +// /// +// /// It verifies all fields of all children objects of the store. For maps, +// /// it also verifies that the two stores have the same order of entries. +// /// +// /// Inconsistencies will lead to throwing [Exception]. +// void verifyLayoutStoreEqual(LayoutStore store1, LayoutStore store2) { +// // Test if two values are equal by `==`, or throw an exception. +// void expectEqual(T a, T b, String path) { +// if (a != b) { +// throw Exception('Error verifying unmarshalled layout on $path: $a != $b'); +// } +// } +// // Test that two iterables are of the same length, and each of their elements +// // are verifies by `body`. +// void verifyEach(Iterable a, Iterable b, String path, _VerifyCallback body) { +// expectEqual(a.length, b.length, '$path.length'); +// final Iterator aIter = a.iterator; +// final Iterator bIter = b.iterator; +// int index = 0; +// while (aIter.moveNext()) { +// assert(bIter.moveNext()); // Guaranteed true since they're of the same length. +// body(aIter.current, bIter.current, '$path[$index]'); +// index += 1; +// } +// } + +// // Verify Store.goals +// verifyEach(store1.goals.entries, store2.goals.entries, 'Store.goals', +// (MapEntry entry1, MapEntry entry2, String path) { +// expectEqual(entry1.key, entry2.key, '$path.key'); +// expectEqual(entry1.value, entry2.value, '$path.value'); +// }); + +// // Verify Layout +// verifyEach(store1.layouts, store2.layouts, 'Store.layouts', +// (Layout layout1, Layout layout2, String path) { +// expectEqual(layout1.language, layout2.language, '$path.language'); +// expectEqual(layout1.platform, layout2.platform, '$path.platform'); +// // Verify LayoutEntry +// verifyEach(layout1.entries.entries, layout2.entries.entries, '$path.entries', +// (MapEntry entry1, MapEntry entry2, String path) { +// expectEqual(entry1.key, entry2.key, '$path.key'); +// verifyEach(entry1.value.printables, entry2.value.printables, '$path.printables', +// (String printable1, String printable2, String path) { +// expectEqual(printable1, printable2, path); +// }); +// expectEqual(entry1.value.deadMasks, entry2.value.deadMasks, '$path.deadMasks'); +// }); +// }); +// } + +// String _layoutPlatformToString(LayoutPlatform platform) { +// switch (platform) { +// case LayoutPlatform.win: +// return 'win'; +// case LayoutPlatform.linux: +// return 'linux'; +// case LayoutPlatform.darwin: +// return 'darwin'; +// } +// } + +// /// Marshall a store into a JSON. +// /// +// /// The JSON is not to be parsed by scripts, but read by human. +// Map jsonifyStore(LayoutStore store) { +// final Map storeJson = {}; +// storeJson['goals'] = Map.from(store.goals); +// storeJson['layouts'] = store.layouts.map((Layout layout) { +// final Map layoutJson = {}; +// layoutJson['language'] = layout.language; +// layoutJson['platform'] = _layoutPlatformToString(layout.platform); +// layoutJson['entries'] = Map.fromIterables( +// layout.entries.keys, +// layout.entries.values.map((LayoutEntry entry) => +// [...entry.printables, entry.deadMasks] +// ), +// ); +// return layoutJson; +// }).toList(); +// return storeJson; +// } diff --git a/tools/gen_web_keyboard_layouts/lib/main.dart b/tools/gen_web_keyboard_layouts/lib/main.dart index 03ea999df76f2..0da32ae247bb7 100644 --- a/tools/gen_web_keyboard_layouts/lib/main.dart +++ b/tools/gen_web_keyboard_layouts/lib/main.dart @@ -145,13 +145,7 @@ String _buildTestCasesString(List layouts) { _sortedForEach(buildLayout(layout.entries), (String eventCode, int logicalKey) { final LayoutEntry entry = layout.entries[eventCode]!; layoutEntries.add(" verifyEntry(mapping, '$eventCode', [" - '${List.generate(4, (int modifierIndex) { - if (entry.deadMasks & (1 << modifierIndex) != 0) { - return "'Dead'"; - } else { - return _escapeEventKey(entry.printables[modifierIndex]); - } - }).join(', ')}' + '${entry.printables.map(_escapeEventKey).join(', ')}' '], 0x${logicalKey.toRadixString(16)});'); }); layoutsString.add(''' From a6eb42d5c43ca2eb7b479cf3619f7546baeb7e78 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Tue, 1 Nov 2022 13:51:53 -0700 Subject: [PATCH 28/74] Correct key --- .../web_keyboard_layouts/test/testing.dart | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/third_party/web_keyboard_layouts/test/testing.dart b/third_party/web_keyboard_layouts/test/testing.dart index 7a21bd97e0246..995144a76f1f5 100644 --- a/third_party/web_keyboard_layouts/test/testing.dart +++ b/third_party/web_keyboard_layouts/test/testing.dart @@ -2,17 +2,29 @@ import 'package:test/test.dart'; import 'package:web_keyboard_layouts/web_keyboard_layouts.dart'; +final int _kLowerA = 'a'.codeUnitAt(0); +final int _kUpperA = 'A'.codeUnitAt(0); +final int _kLowerZ = 'z'.codeUnitAt(0); +final int _kUpperZ = 'Z'.codeUnitAt(0); + +bool _isLetter(String char) { + if (char.length != 1) { + return false; + } + final int charCode = char.codeUnitAt(0); + return (charCode >= _kLowerA && charCode <= _kLowerZ) + || (charCode >= _kUpperA && charCode <= _kUpperZ); +} + void verifyEntry(LayoutMapping mapping, String eventCode, List eventKeys, int logicalKey) { - // If the KeyboardEvent.code is a letter key such as "KeyA", then - // KeyboardEvent.keyCode is the upper letter such as "A". Otherwise, this - // field must not be used (in reality this field may or may not be platform - // independent). + // If the first two entry of KeyboardEvent.key are letter keys such as "a" and + // "A", then KeyboardEvent.keyCode is the upper letter such as "A". Otherwise, + // this field must not be used (in reality this field may or may not be + // platform independent). String? eventKeyCode; { - final RegExp regexLetterKey = RegExp(r'^Key([A-Z])$'); - final RegExpMatch? matchLetterKey = regexLetterKey.firstMatch(eventCode); - if (matchLetterKey != null) { - eventKeyCode = matchLetterKey.group(1)!.toUpperCase(); + if (_isLetter(eventKeys[0]) && _isLetter(eventKeys[1])) { + eventKeyCode = eventKeys[0].toUpperCase(); } } From 1a80988f94fe0ffdcf149afeda2214cf2782b3f5 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Tue, 1 Nov 2022 13:54:28 -0700 Subject: [PATCH 29/74] remove duplicate file --- lib/web_ui/lib/src/engine/key_mappings.g.dart | 1652 ----------------- 1 file changed, 1652 deletions(-) delete mode 100644 lib/web_ui/lib/src/engine/key_mappings.g.dart diff --git a/lib/web_ui/lib/src/engine/key_mappings.g.dart b/lib/web_ui/lib/src/engine/key_mappings.g.dart deleted file mode 100644 index 3df8a33a71272..0000000000000 --- a/lib/web_ui/lib/src/engine/key_mappings.g.dart +++ /dev/null @@ -1,1652 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -// DO NOT EDIT -- DO NOT EDIT -- DO NOT EDIT -// -// This file is auto generated by flutter/engine:flutter/tools/gen_web_keyboard_layouts based on -// https://github.com/microsoft/vscode/tree/@@@COMMIT_ID@@@/src/vs/workbench/services/keybinding/browser/keyboardLayouts -// -// Edit the following files instead: -// -// - Script: lib/main.dart -// - Templates: data/*.tmpl -// -// See flutter/engine:flutter/tools/gen_web_keyboard_layouts/README.md for more information. - -final Map> kWinMapping = >{ - 'Backquote': { - '0': 0x30, - '§': 0x30, - }, - 'Digit0': { - ')': 0x30, - '0': 0x30, - '=': 0x30, - '@': 0x30, - '}': 0x30, - 'à': 0x30, - 'é': 0x30, - '˝': 0x30, - 'จ': 0x30, - '๗': 0x30, - '’': 0x30, - }, - 'Digit1': { - '!': 0x31, - '&': 0x31, - "'": 0x31, - '+': 0x31, - '1': 0x31, - '>': 0x31, - '|': 0x31, - '~': 0x31, - '¡': 0x31, - '¦': 0x31, - '¹': 0x31, - 'ๅ': 0x31, - }, - 'Digit2': { - '"': 0x32, - "'": 0x32, - '/': 0x32, - '2': 0x32, - '@': 0x32, - '~': 0x32, - '£': 0x32, - '²': 0x32, - 'é': 0x32, - 'ě': 0x32, - 'ˇ': 0x32, - '๑': 0x32, - }, - 'Digit3': { - '"': 0x33, - '#': 0x33, - '*': 0x33, - '+': 0x33, - '-': 0x33, - '3': 0x33, - '^': 0x33, - '£': 0x33, - '§': 0x33, - '³': 0x33, - '·': 0x33, - 'š': 0x33, - '๒': 0x33, - '№': 0x33, - }, - 'Digit4': { - '!': 0x34, - r'$': 0x34, - "'": 0x34, - '+': 0x34, - '4': 0x34, - ';': 0x34, - '{': 0x34, - '~': 0x34, - '£': 0x34, - '¤': 0x34, - '§': 0x34, - '°': 0x34, - 'ç': 0x34, - 'č': 0x34, - '˘': 0x34, - 'ภ': 0x34, - '๓': 0x34, - '€': 0x34, - '₹': 0x34, - }, - 'Digit5': { - '%': 0x35, - '(': 0x35, - '5': 0x35, - '[': 0x35, - '¢': 0x35, - '§': 0x35, - '°': 0x35, - '½': 0x35, - 'ř': 0x35, - 'ถ': 0x35, - '๔': 0x35, - '€': 0x35, - }, - 'Digit6': { - '&': 0x36, - '-': 0x36, - '/': 0x36, - '6': 0x36, - ':': 0x36, - '^': 0x36, - '|': 0x36, - '§': 0x36, - '¨': 0x36, - '¬': 0x36, - '¼': 0x36, - 'ž': 0x36, - 'ˆ': 0x36, - '˛': 0x36, - 'ุ': 0x36, - 'ู': 0x36, - }, - 'Digit7': { - '&': 0x37, - '/': 0x37, - '7': 0x37, - '=': 0x37, - '?': 0x37, - '`': 0x37, - '{': 0x37, - '|': 0x37, - '½': 0x37, - 'è': 0x37, - 'ý': 0x37, - 'ึ': 0x37, - '฿': 0x37, - }, - 'Digit8': { - '!': 0x38, - '(': 0x38, - '*': 0x38, - '8': 0x38, - '[': 0x38, - r'\': 0x38, - '_': 0x38, - '¢': 0x38, - '¾': 0x38, - 'á': 0x38, - '˙': 0x38, - 'ค': 0x38, - '๕': 0x38, - '₽': 0x38, - }, - 'Digit9': { - '(': 0x39, - ')': 0x39, - '9': 0x39, - ']': 0x39, - '^': 0x39, - '{': 0x39, - '´': 0x39, - 'ç': 0x39, - 'í': 0x39, - '˘': 0x39, - 'ต': 0x39, - '๖': 0x39, - '‘': 0x39, - }, - 'KeyA': { - 'A': 0x41, - 'Q': 0x51, - 'a': 0x41, - 'q': 0x51, - 'Á': 0x41, - 'Æ': 0x41, - 'á': 0x41, - 'ä': 0x41, - 'æ': 0x41, - 'Ā': 0x41, - 'ā': 0x41, - 'Ą': 0x41, - 'ą': 0x41, - 'Ф': 0x41, - 'ф': 0x41, - 'ฟ': 0x41, - 'ฤ': 0x41, - }, - 'KeyB': { - 'B': 0x42, - 'b': 0x42, - '{': 0x42, - 'И': 0x42, - 'и': 0x42, - 'ิ': 0x42, - 'ฺ': 0x42, - }, - 'KeyC': { - '&': 0x43, - 'C': 0x43, - 'c': 0x43, - '¢': 0x43, - '©': 0x43, - 'Ć': 0x43, - 'ć': 0x43, - 'С': 0x43, - 'с': 0x43, - 'ฉ': 0x43, - 'แ': 0x43, - '₢': 0x43, - }, - 'KeyD': { - 'D': 0x44, - 'd': 0x44, - 'Ð': 0x44, - 'ð': 0x44, - 'Đ': 0x44, - 'В': 0x44, - 'в': 0x44, - 'ก': 0x44, - 'ฏ': 0x44, - 'Ḍ': 0x44, - 'ḍ': 0x44, - }, - 'KeyE': { - 'E': 0x45, - 'e': 0x45, - '°': 0x45, - 'Ä': 0x45, - 'É': 0x45, - 'é': 0x45, - 'Ē': 0x45, - 'ē': 0x45, - 'Ę': 0x45, - 'ę': 0x45, - 'У': 0x45, - 'у': 0x45, - 'ฎ': 0x45, - 'ำ': 0x45, - '€': 0x45, - }, - 'KeyF': { - 'F': 0x46, - '[': 0x46, - 'f': 0x46, - 'А': 0x46, - 'а': 0x46, - 'ด': 0x46, - 'โ': 0x46, - }, - 'KeyG': { - 'G': 0x47, - ']': 0x47, - 'g': 0x47, - 'П': 0x47, - 'п': 0x47, - 'ฌ': 0x47, - 'เ': 0x47, - 'Ṅ': 0x47, - 'ṅ': 0x47, - }, - 'KeyH': { - 'H': 0x48, - 'h': 0x48, - 'Р': 0x48, - 'р': 0x48, - '็': 0x48, - '้': 0x48, - 'Ḥ': 0x48, - 'ḥ': 0x48, - }, - 'KeyI': { - 'I': 0x49, - 'i': 0x49, - 'Í': 0x49, - 'í': 0x49, - 'Ī': 0x49, - 'ī': 0x49, - 'İ': 0x49, - 'ı': 0x49, - 'Ш': 0x49, - 'ш': 0x49, - 'ณ': 0x49, - 'ร': 0x49, - }, - 'KeyJ': { - 'J': 0x4a, - 'j': 0x4a, - 'í': 0x4a, - 'О': 0x4a, - 'о': 0x4a, - '่': 0x4a, - '๋': 0x4a, - }, - 'KeyK': { - 'K': 0x4b, - 'k': 0x4b, - 'ł': 0x4b, - 'Л': 0x4b, - 'л': 0x4b, - 'ษ': 0x4b, - 'า': 0x4b, - }, - 'KeyL': { - 'L': 0x4c, - 'L̥': 0x4c, - 'l': 0x4c, - 'l̥': 0x4c, - 'Ø': 0x4c, - 'ø': 0x4c, - 'Ł': 0x4c, - 'ł': 0x4c, - 'Д': 0x4c, - 'д': 0x4c, - 'ศ': 0x4c, - 'ส': 0x4c, - }, - 'KeyM': { - '<': 0x4d, - '?': 0x4d, - 'M': 0x4d, - 'm': 0x4d, - 'µ': 0x4d, - 'Ь': 0x4d, - 'ь': 0x4d, - 'ท': 0x4d, - 'Ṁ': 0x4d, - 'ṁ': 0x4d, - }, - 'KeyN': { - 'N': 0x4e, - 'n': 0x4e, - '}': 0x4e, - 'Ñ': 0x4e, - 'ñ': 0x4e, - 'Ń': 0x4e, - 'ń': 0x4e, - 'Т': 0x4e, - 'т': 0x4e, - 'ื': 0x4e, - '์': 0x4e, - 'Ṇ': 0x4e, - 'ṇ': 0x4e, - }, - 'KeyO': { - 'O': 0x4f, - 'o': 0x4f, - 'Ó': 0x4f, - 'ó': 0x4f, - 'Ō': 0x4f, - 'ō': 0x4f, - 'Щ': 0x4f, - 'щ': 0x4f, - 'น': 0x4f, - 'ฯ': 0x4f, - }, - 'KeyP': { - 'P': 0x50, - 'p': 0x50, - 'Ö': 0x50, - 'ö': 0x50, - 'З': 0x50, - 'з': 0x50, - 'ญ': 0x50, - 'ย': 0x50, - }, - 'KeyQ': { - '/': 0x51, - '@': 0x51, - 'A': 0x41, - 'Q': 0x51, - r'\': 0x51, - 'a': 0x41, - 'q': 0x51, - 'Ä': 0x51, - 'Æ': 0x51, - 'ä': 0x51, - 'æ': 0x51, - 'Й': 0x51, - 'й': 0x51, - 'ๆ': 0x51, - '๐': 0x51, - }, - 'KeyR': { - 'R': 0x52, - 'R̥': 0x52, - 'r': 0x52, - 'r̥': 0x52, - '®': 0x52, - 'К': 0x52, - 'к': 0x52, - 'ฑ': 0x52, - 'พ': 0x52, - }, - 'KeyS': { - 'S': 0x53, - 's': 0x53, - '§': 0x53, - 'ß': 0x53, - 'đ': 0x53, - 'Ś': 0x53, - 'ś': 0x53, - 'Ы': 0x53, - 'ы': 0x53, - 'ฆ': 0x53, - 'ห': 0x53, - }, - 'KeyT': { - 'T': 0x54, - 't': 0x54, - 'Þ': 0x54, - 'þ': 0x54, - 'Е': 0x54, - 'е': 0x54, - 'ธ': 0x54, - 'ะ': 0x54, - 'Ṭ': 0x54, - 'ṭ': 0x54, - '₺': 0x54, - }, - 'KeyU': { - 'U': 0x55, - 'u': 0x55, - 'Ú': 0x55, - 'ú': 0x55, - 'Ū': 0x55, - 'ū': 0x55, - 'Г': 0x55, - 'г': 0x55, - 'ี': 0x55, - '๊': 0x55, - '€': 0x55, - }, - 'KeyV': { - '@': 0x56, - 'V': 0x56, - 'v': 0x56, - 'М': 0x56, - 'м': 0x56, - 'อ': 0x56, - 'ฮ': 0x56, - }, - 'KeyW': { - '"': 0x57, - '?': 0x57, - 'W': 0x57, - 'Z': 0x5a, - 'w': 0x57, - 'z': 0x5a, - '|': 0x57, - 'Å': 0x57, - 'å': 0x57, - 'Ц': 0x57, - 'ц': 0x57, - 'ไ': 0x57, - }, - 'KeyX': { - '#': 0x58, - ')': 0x58, - 'X': 0x58, - 'x': 0x58, - 'Ź': 0x58, - 'ź': 0x58, - 'Ч': 0x58, - 'ч': 0x58, - 'ป': 0x58, - 'Ṣ': 0x58, - 'ṣ': 0x58, - }, - 'KeyY': { - 'Y': 0x59, - 'Z': 0x5a, - 'y': 0x59, - 'z': 0x5a, - 'Ñ': 0x59, - 'Ü': 0x59, - 'ñ': 0x59, - 'ü': 0x59, - 'Н': 0x59, - 'н': 0x59, - 'ั': 0x59, - 'ํ': 0x59, - }, - 'KeyZ': { - '(': 0x5a, - '>': 0x59, - 'W': 0x57, - 'Y': 0x59, - 'Z': 0x5a, - 'w': 0x57, - 'y': 0x59, - 'z': 0x5a, - 'Æ': 0x5a, - 'æ': 0x5a, - 'Ż': 0x5a, - 'ż': 0x5a, - 'Я': 0x5a, - 'я': 0x5a, - 'ผ': 0x5a, - }, - 'Semicolon': { - 'M': 0x4d, - 'm': 0x4d, - }, -}; - -final Map> kLinuxMapping = >{ - 'Digit0': { - ')': 0x30, - '0': 0x30, - '=': 0x30, - '@': 0x30, - '}': 0x30, - '°': 0x30, - 'à': 0x30, - }, - 'Digit1': { - '!': 0x31, - '&': 0x31, - '1': 0x31, - '|': 0x31, - '¡': 0x31, - '¹': 0x31, - }, - 'Digit2': { - '"': 0x32, - '2': 0x32, - '@': 0x32, - '~': 0x32, - '²': 0x32, - 'é': 0x32, - '⅛': 0x32, - }, - 'Digit3': { - '"': 0x33, - '#': 0x33, - '3': 0x33, - '£': 0x33, - '§': 0x33, - '³': 0x33, - '·': 0x33, - '№': 0x33, - }, - 'Digit4': { - r'$': 0x34, - "'": 0x34, - '4': 0x34, - ';': 0x34, - '{': 0x34, - '~': 0x34, - '¤': 0x34, - '¼': 0x34, - }, - 'Digit5': { - '%': 0x35, - '(': 0x35, - '5': 0x35, - '[': 0x35, - '½': 0x35, - '⅜': 0x35, - }, - 'Digit6': { - '&': 0x36, - '-': 0x36, - '6': 0x36, - ':': 0x36, - '^': 0x36, - '|': 0x36, - '¬': 0x36, - '⅝': 0x36, - }, - 'Digit7': { - '&': 0x37, - '/': 0x37, - '7': 0x37, - '?': 0x37, - '`': 0x37, - '{': 0x37, - 'è': 0x37, - '⅞': 0x37, - }, - 'Digit8': { - '(': 0x38, - '*': 0x38, - '8': 0x38, - '[': 0x38, - r'\': 0x38, - '_': 0x38, - '₽': 0x38, - '™': 0x38, - }, - 'Digit9': { - '(': 0x39, - ')': 0x39, - '9': 0x39, - ']': 0x39, - '^': 0x39, - '±': 0x39, - 'ç': 0x39, - }, - 'KeyA': { - '@': 0x51, - 'A': 0x41, - 'Q': 0x51, - 'a': 0x41, - 'q': 0x51, - 'Æ': 0x41, - 'æ': 0x41, - 'Ω': 0x51, - 'Ф': 0x41, - 'ф': 0x41, - }, - 'KeyB': { - 'B': 0x42, - 'b': 0x42, - 'И': 0x42, - 'и': 0x42, - '‘': 0x42, - '’': 0x42, - '“': 0x42, - '”': 0x42, - }, - 'KeyC': { - 'C': 0x43, - 'c': 0x43, - '¢': 0x43, - '©': 0x43, - 'С': 0x43, - 'с': 0x43, - }, - 'KeyD': { - 'D': 0x44, - 'd': 0x44, - 'Ð': 0x44, - 'ð': 0x44, - 'В': 0x44, - 'в': 0x44, - }, - 'KeyE': { - 'E': 0x45, - 'e': 0x45, - '¢': 0x45, - 'У': 0x45, - 'у': 0x45, - '€': 0x45, - }, - 'KeyF': { - 'F': 0x46, - 'f': 0x46, - 'ª': 0x46, - 'đ': 0x46, - 'А': 0x46, - 'а': 0x46, - }, - 'KeyG': { - 'G': 0x47, - 'g': 0x47, - 'Ŋ': 0x47, - 'ŋ': 0x47, - 'П': 0x47, - 'п': 0x47, - }, - 'KeyH': { - 'H': 0x48, - 'h': 0x48, - 'Ħ': 0x48, - 'ħ': 0x48, - 'Р': 0x48, - 'р': 0x48, - }, - 'KeyI': { - 'I': 0x49, - 'i': 0x49, - 'ı': 0x49, - 'Ш': 0x49, - 'ш': 0x49, - '→': 0x49, - }, - 'KeyJ': { - 'J': 0x4a, - 'j': 0x4a, - '̇': 0x4a, - '̉': 0x4a, - '̛': 0x4a, - '̣': 0x4a, - 'О': 0x4a, - 'о': 0x4a, - }, - 'KeyK': { - '&': 0x4b, - 'K': 0x4b, - 'k': 0x4b, - 'ĸ': 0x4b, - 'Л': 0x4b, - 'л': 0x4b, - }, - 'KeyL': { - 'L': 0x4c, - 'l': 0x4c, - 'Ł': 0x4c, - 'ł': 0x4c, - 'Д': 0x4c, - 'д': 0x4c, - }, - 'KeyM': { - 'M': 0x4d, - 'm': 0x4d, - 'µ': 0x4d, - 'º': 0x4d, - 'Ь': 0x4d, - 'ь': 0x4d, - }, - 'KeyN': { - 'N': 0x4e, - 'n': 0x4e, - 'Т': 0x4e, - 'т': 0x4e, - '’': 0x4e, - '”': 0x4e, - }, - 'KeyO': { - 'O': 0x4f, - 'o': 0x4f, - 'Ø': 0x4f, - 'ø': 0x4f, - 'Щ': 0x4f, - 'щ': 0x4f, - }, - 'KeyP': { - 'P': 0x50, - 'p': 0x50, - 'Þ': 0x50, - 'þ': 0x50, - 'З': 0x50, - 'з': 0x50, - }, - 'KeyQ': { - '@': 0x51, - 'A': 0x41, - 'Q': 0x51, - 'a': 0x41, - 'q': 0x51, - 'Æ': 0x41, - 'æ': 0x41, - 'Ω': 0x51, - 'Й': 0x51, - 'й': 0x51, - }, - 'KeyR': { - 'R': 0x52, - 'r': 0x52, - '®': 0x52, - '¶': 0x52, - 'К': 0x52, - 'к': 0x52, - }, - 'KeyS': { - 'S': 0x53, - 's': 0x53, - '§': 0x53, - 'ß': 0x53, - 'ſ': 0x53, - 'Ы': 0x53, - 'ы': 0x53, - 'ẞ': 0x53, - }, - 'KeyT': { - 'T': 0x54, - 't': 0x54, - 'Ŧ': 0x54, - 'ŧ': 0x54, - 'Е': 0x54, - 'е': 0x54, - }, - 'KeyU': { - 'U': 0x55, - 'u': 0x55, - 'Г': 0x55, - 'г': 0x55, - '↑': 0x55, - '↓': 0x55, - }, - 'KeyV': { - 'V': 0x56, - 'v': 0x56, - 'М': 0x56, - 'м': 0x56, - '‘': 0x56, - '‚': 0x56, - '“': 0x56, - '„': 0x56, - }, - 'KeyW': { - '<': 0x5a, - 'W': 0x57, - 'Z': 0x5a, - 'w': 0x57, - 'z': 0x5a, - '«': 0x5a, - 'Ł': 0x57, - 'ł': 0x57, - 'Ц': 0x57, - 'ц': 0x57, - }, - 'KeyX': { - '>': 0x58, - 'X': 0x58, - 'x': 0x58, - '«': 0x58, - '»': 0x58, - 'Ч': 0x58, - 'ч': 0x58, - '‹': 0x58, - }, - 'KeyY': { - 'Y': 0x59, - 'Z': 0x5a, - 'y': 0x59, - 'z': 0x5a, - '¥': 0x1, - 'Н': 0x59, - 'н': 0x59, - '←': 0x1, - }, - 'KeyZ': { - '<': 0x5a, - 'W': 0x57, - 'Y': 0x59, - 'Z': 0x5a, - 'w': 0x57, - 'y': 0x59, - 'z': 0x5a, - '«': 0x5a, - '»': 0x59, - 'Ł': 0x57, - 'ł': 0x57, - 'Я': 0x5a, - 'я': 0x5a, - '›': 0x59, - }, - 'Semicolon': { - 'M': 0x4d, - 'm': 0x4d, - 'µ': 0x4d, - 'º': 0x4d, - }, -}; - -final Map> kDarwinMapping = >{ - 'Comma': { - 'W': 0x57, - 'w': 0x57, - '„': 0x57, - '∑': 0x57, - }, - 'Digit0': { - ')': 0x30, - '0': 0x30, - '=': 0x30, - '`': 0x30, - '}': 0x30, - '¯': 0x30, - 'º': 0x30, - 'Ø': 0x30, - 'à': 0x30, - 'ø': 0x30, - 'ľ': 0x30, - '‚': 0x30, - '≈': 0x30, - '≠': 0x30, - ')': 0x30, - }, - 'Digit1': { - '!': 0x31, - '&': 0x31, - '1': 0x31, - 'Deadkey': 0x31, - '|': 0x31, - '¡': 0x31, - '©': 0x31, - '«': 0x31, - '¬': 0x31, - '»': 0x31, - 'ı': 0x31, - 'Ń': 0x31, - 'ŕ': 0x31, - '⁄': 0x31, - '': 0x31, - '!': 0x31, - }, - 'Digit2': { - '"': 0x32, - '2': 0x32, - '@': 0x32, - 'é': 0x32, - 'ë': 0x32, - 'Ř': 0x32, - '˝': 0x32, - '“': 0x32, - '”': 0x32, - '„': 0x32, - '€': 0x32, - '™': 0x32, - }, - 'Digit3': { - '"': 0x33, - '#': 0x33, - '3': 0x33, - '£': 0x33, - '¥': 0x33, - '§': 0x33, - '¶': 0x33, - '·': 0x33, - '‘': 0x33, - '’': 0x33, - '“': 0x33, - '”': 0x33, - '•': 0x33, - '‹': 0x33, - '€': 0x33, - '№': 0x33, - }, - 'Digit4': { - r'$': 0x34, - '%': 0x34, - "'": 0x34, - '4': 0x34, - '¢': 0x34, - '£': 0x34, - '¥': 0x34, - 'ß': 0x34, - '‘': 0x34, - '’': 0x34, - '›': 0x34, - '€': 0x34, - }, - 'Digit5': { - '%': 0x35, - '(': 0x35, - '5': 0x35, - ':': 0x35, - '[': 0x35, - '{': 0x35, - '~': 0x35, - '§': 0x35, - 'į': 0x35, - 'ř': 0x35, - '†': 0x35, - '‰': 0x35, - '∞': 0x35, - 'fi': 0x35, - }, - 'Digit6': { - ' ': 0x36, - '&': 0x36, - ',': 0x36, - '6': 0x36, - 'Deadkey': 0x36, - ']': 0x36, - '^': 0x36, - '§': 0x36, - '¬': 0x36, - '¶': 0x36, - 'å': 0x36, - 'Ŗ': 0x36, - '̂': 0x36, - '‹': 0x36, - '›': 0x36, - 'fl': 0x36, - }, - 'Digit7': { - '&': 0x37, - '.': 0x37, - '/': 0x37, - '7': 0x37, - r'\': 0x37, - '|': 0x37, - '«': 0x37, - '¶': 0x37, - '»': 0x37, - 'è': 0x37, - '÷': 0x37, - 'ŗ': 0x37, - '‡': 0x37, - '⁄': 0x37, - }, - 'Digit8': { - '!': 0x38, - '(': 0x38, - '*': 0x38, - '8': 0x38, - ';': 0x38, - 'Deadkey': 0x38, - '[': 0x38, - '{': 0x38, - '¡': 0x38, - '°': 0x38, - 'Û': 0x38, - '˜': 0x38, - '‘': 0x38, - '“': 0x38, - '•': 0x38, - '√': 0x38, - '': 0x38, - }, - 'Digit9': { - ' ': 0x39, - "'": 0x39, - '(': 0x39, - ')': 0x39, - '9': 0x39, - 'Deadkey': 0x39, - ']': 0x39, - '{': 0x39, - '}': 0x39, - 'ª': 0x39, - '·': 0x39, - 'Á': 0x39, - 'Ç': 0x39, - 'ç': 0x39, - 'Ľ': 0x39, - 'Š': 0x39, - '’': 0x39, - '”': 0x39, - '(': 0x39, - }, - 'KeyA': { - 'A': 0x41, - 'Deadkey': 0x41, - 'Q': 0x51, - 'a': 0x41, - 'q': 0x51, - 'Å': 0x41, - 'å': 0x41, - 'Ą': 0x41, - 'ą': 0x41, - 'ƒ': 0x41, - '̄': 0x41, - 'Ω': 0x51, - 'Ф': 0x41, - 'ф': 0x41, - '‡': 0x51, - '◊': 0x41, - 'ㅁ': 0x41, - '': 0x41, - }, - 'KeyB': { - 'B': 0x42, - 'Deadkey': 0x42, - 'X': 0x58, - 'b': 0x42, - 'x': 0x58, - '»': 0x42, - 'Í': 0x42, - 'ß': 0x42, - 'ı': 0x42, - 'ļ': 0x42, - 'ű': 0x42, - '˛': 0x58, - '̆': 0x42, - 'И': 0x42, - 'и': 0x42, - '‹': 0x42, - '›': 0x42, - '∫': 0x42, - '≈': 0x58, - 'ㅠ': 0x42, - }, - 'KeyC': { - ' ': 0x43, - 'C': 0x43, - 'Deadkey': 0x43, - 'J': 0x4a, - 'c': 0x43, - 'j': 0x4a, - '¢': 0x43, - '©': 0x43, - 'Á': 0x43, - 'Ç': 0x43, - 'Ô': 0x4a, - 'ç': 0x43, - 'Ć': 0x43, - 'ć': 0x43, - '̧': 0x43, - 'С': 0x43, - 'с': 0x43, - '∆': 0x4a, - '≠': 0x43, - 'ㅊ': 0x43, - }, - 'KeyD': { - 'D': 0x44, - 'Deadkey': 0x45, - 'E': 0x45, - 'd': 0x44, - 'e': 0x45, - '´': 0x45, - 'Î': 0x44, - 'Ð': 0x44, - 'ð': 0x44, - 'Ž': 0x44, - '˘': 0x44, - 'Ћ': 0x44, - 'В': 0x44, - 'в': 0x44, - 'ћ': 0x44, - '™': 0x44, - '∂': 0x44, - '∆': 0x44, - 'ㅇ': 0x44, - }, - 'KeyE': { - 'Deadkey': 0x45, - 'E': 0x45, - 'e': 0x45, - '´': 0x45, - 'È': 0x45, - 'É': 0x45, - 'Ê': 0x45, - 'é': 0x45, - 'ê': 0x45, - 'Ę': 0x45, - 'ę': 0x45, - '́': 0x45, - 'Ќ': 0x45, - 'У': 0x45, - 'у': 0x45, - 'ќ': 0x45, - '‰': 0x45, - '€': 0x45, - 'ㄷ': 0x45, - 'ㄸ': 0x45, - }, - 'KeyF': { - 'Deadkey': 0x55, - 'F': 0x46, - 'U': 0x55, - 'f': 0x46, - 'u': 0x55, - '¨': 0x55, - '·': 0x46, - 'Ï': 0x46, - '÷': 0x46, - 'ń': 0x46, - 'ž': 0x46, - 'ƒ': 0x46, - '˙': 0x46, - 'А': 0x46, - 'а': 0x46, - '∫': 0x46, - 'ㄹ': 0x46, - 'fi': 0x46, - }, - 'KeyG': { - 'Deadkey': 0x1, - 'G': 0x47, - 'I': 0x49, - 'g': 0x47, - 'i': 0x49, - '©': 0x47, - '¯': 0x47, - '¸': 0x47, - 'Ì': 0x47, - 'Ū': 0x47, - 'ˆ': 0x49, - '˚': 0x47, - '˝': 0x47, - 'П': 0x47, - 'п': 0x47, - '∞': 0x47, - 'ㅎ': 0x47, - '': 0x47, - 'fi': 0x47, - 'fl': 0x47, - }, - 'KeyH': { - ' ': 0x48, - 'D': 0x44, - 'Deadkey': 0x48, - 'H': 0x48, - 'd': 0x44, - 'h': 0x48, - 'ª': 0x48, - '¸': 0x48, - 'Ì': 0x48, - 'Î': 0x1, - 'Ó': 0x48, - 'ķ': 0x48, - '˘': 0x48, - '˙': 0x48, - '˛': 0x48, - '̱': 0x48, - 'Р': 0x48, - 'р': 0x48, - '₽': 0x48, - '™': 0x48, - '∂': 0x44, - '∆': 0x48, - 'ㅗ': 0x48, - }, - 'KeyI': { - ' ': 0x49, - 'C': 0x43, - 'Deadkey': 0x49, - 'I': 0x49, - 'c': 0x43, - 'i': 0x49, - 'Ç': 0x43, - 'È': 0x49, - 'Û': 0x49, - 'ç': 0x43, - 'î': 0x49, - 'ï': 0x49, - 'ı': 0x49, - 'Œ': 0x49, - 'œ': 0x49, - 'ť': 0x49, - 'ˆ': 0x49, - '̛': 0x49, - 'Ѕ': 0x49, - 'Ш': 0x49, - 'ш': 0x49, - 'ѕ': 0x49, - '⁄': 0x49, - 'ㅑ': 0x49, - }, - 'KeyJ': { - 'Deadkey': 0x4a, - 'H': 0x48, - 'J': 0x4a, - 'h': 0x48, - 'j': 0x4a, - 'ª': 0x4a, - '¬': 0x4a, - '¯': 0x4a, - '°': 0x4a, - '¶': 0x4a, - 'º': 0x4a, - 'Í': 0x4a, - 'Ï': 0x4a, - 'Ó': 0x48, - 'Ô': 0x4a, - 'ı': 0x4a, - '˙': 0x48, - '˝': 0x4a, - '̋': 0x4a, - 'О': 0x4a, - 'о': 0x4a, - '•': 0x4a, - '∆': 0x4a, - '√': 0x4a, - 'ㅓ': 0x4a, - }, - 'KeyK': { - 'Deadkey': 0x4b, - 'K': 0x4b, - 'T': 0x54, - 'k': 0x4b, - 't': 0x54, - '§': 0x4b, - 'ª': 0x4b, - 'º': 0x4b, - 'È': 0x4b, - 'Ë': 0x4b, - 'ū': 0x4b, - 'Ż': 0x4b, - 'ˆ': 0x4b, - 'ˇ': 0x1, - '˚': 0x4b, - '˛': 0x4b, - '̊': 0x4b, - 'Љ': 0x4b, - 'Л': 0x4b, - 'л': 0x4b, - 'љ': 0x4b, - '†': 0x54, - '∆': 0x4b, - 'ㅏ': 0x4b, - '': 0x4b, - }, - 'KeyL': { - ' ': 0x4c, - '@': 0x4c, - 'Deadkey': 0x1, - 'L': 0x4c, - 'N': 0x4e, - 'l': 0x4c, - 'n': 0x4e, - '|': 0x4c, - '¬': 0x4c, - 'Ò': 0x4c, - 'Ł': 0x4c, - 'ł': 0x4c, - 'ˇ': 0x4c, - '˘': 0x4c, - '˜': 0x4e, - '̵': 0x4c, - 'Д': 0x4c, - 'д': 0x4c, - '∆': 0x4c, - 'ㅣ': 0x4c, - 'fi': 0x4c, - 'fl': 0x4c, - }, - 'KeyM': { - 'Deadkey': 0x4d, - 'M': 0x4d, - 'm': 0x4d, - '~': 0x4d, - 'µ': 0x4d, - 'Â': 0x4d, - 'Ú': 0x4d, - 'Ķ': 0x4d, - 'ų': 0x4d, - '˘': 0x4d, - '˚': 0x4d, - '˜': 0x4d, - '̨': 0x4d, - 'Ь': 0x4d, - 'ь': 0x4d, - '’': 0x4d, - '”': 0x4d, - 'ㅡ': 0x4d, - }, - 'KeyN': { - ' ': 0x4e, - 'B': 0x42, - 'Deadkey': 0x4e, - 'N': 0x4e, - 'b': 0x42, - 'n': 0x4e, - 'Ó': 0x4e, - 'ı': 0x1, - 'Ń': 0x4e, - 'ń': 0x4e, - 'ˆ': 0x4e, - '˙': 0x4e, - '˜': 0x4e, - '̃': 0x4e, - 'Т': 0x4e, - 'т': 0x4e, - '‘': 0x4e, - '“': 0x4e, - '›': 0x4e, - '™': 0x4e, - '∫': 0x42, - 'ㅜ': 0x4e, - }, - 'KeyO': { - 'O': 0x4f, - 'R': 0x52, - 'o': 0x4f, - 'r': 0x52, - '®': 0x52, - 'Ó': 0x4f, - 'Ø': 0x4f, - 'ó': 0x4f, - 'ø': 0x4f, - 'Œ': 0x4f, - 'œ': 0x4f, - 'Ў': 0x4f, - 'Щ': 0x4f, - 'щ': 0x4f, - 'ў': 0x4f, - '‰': 0x52, - 'ㅐ': 0x4f, - 'ㅒ': 0x4f, - }, - 'KeyP': { - 'Deadkey': 0x50, - 'L': 0x4c, - 'P': 0x50, - 'l': 0x4c, - 'p': 0x50, - '¬': 0x4c, - 'Ò': 0x4c, - 'Ļ': 0x50, - 'ł': 0x50, - '̦': 0x50, - 'π': 0x50, - 'З': 0x50, - 'з': 0x50, - '‘': 0x50, - '’': 0x50, - '∏': 0x50, - 'ㅔ': 0x50, - 'ㅖ': 0x50, - }, - 'KeyQ': { - 'A': 0x41, - 'Q': 0x51, - 'a': 0x41, - 'q': 0x51, - '«': 0x51, - '°': 0x51, - '»': 0x51, - 'Æ': 0x41, - 'æ': 0x41, - 'Ō': 0x51, - 'ő': 0x51, - 'Œ': 0x51, - 'œ': 0x51, - 'Ј': 0x51, - 'Й': 0x51, - 'й': 0x51, - 'ј': 0x51, - '‚': 0x51, - '„': 0x51, - '•': 0x51, - 'ㅂ': 0x51, - 'ㅃ': 0x51, - }, - 'KeyR': { - ' ': 0x52, - 'P': 0x50, - 'R': 0x52, - 'p': 0x50, - 'r': 0x52, - '£': 0x52, - '®': 0x52, - '¸': 0x52, - 'Â': 0x52, - 'Ì': 0x52, - 'π': 0x50, - 'К': 0x52, - 'к': 0x52, - '‚': 0x52, - '‰': 0x52, - '∏': 0x50, - '√': 0x52, - 'ㄱ': 0x52, - 'ㄲ': 0x52, - }, - 'KeyS': { - ' ': 0x53, - 'O': 0x4f, - 'S': 0x53, - 'o': 0x4f, - 's': 0x53, - '¯': 0x53, - 'Í': 0x53, - 'Ò': 0x53, - 'Ø': 0x4f, - 'ß': 0x53, - 'ø': 0x4f, - 'Ś': 0x53, - 'ś': 0x53, - 'Ы': 0x53, - 'ы': 0x53, - '‚': 0x53, - '∑': 0x53, - '∫': 0x53, - 'ㄴ': 0x53, - }, - 'KeyT': { - 'T': 0x54, - 'Y': 0x59, - 't': 0x54, - 'y': 0x59, - '¥': 0x59, - 'Á': 0x59, - 'Ê': 0x54, - 'Ò': 0x54, - 'Þ': 0x54, - 'þ': 0x54, - 'ś': 0x54, - 'ˇ': 0x54, - '˝': 0x54, - 'Е': 0x54, - 'е': 0x54, - '†': 0x54, - '‡': 0x54, - '™': 0x54, - 'ㅅ': 0x54, - 'ㅆ': 0x54, - }, - 'KeyU': { - ' ': 0x55, - 'Deadkey': 0x55, - 'G': 0x47, - 'U': 0x55, - 'g': 0x47, - 'u': 0x55, - '¨': 0x55, - '©': 0x47, - 'ª': 0x55, - 'º': 0x55, - 'Á': 0x55, - 'Ë': 0x55, - 'Ù': 0x55, - 'Ü': 0x55, - 'ü': 0x55, - 'Ť': 0x55, - '˝': 0x47, - '̈': 0x55, - 'Ѓ': 0x55, - 'Г': 0x55, - 'г': 0x55, - 'ѓ': 0x55, - 'ㅕ': 0x55, - }, - 'KeyV': { - 'Deadkey': 0x56, - 'K': 0x4b, - 'V': 0x56, - 'k': 0x4b, - 'v': 0x56, - '«': 0x56, - 'µ': 0x56, - 'É': 0x56, - '˚': 0x4b, - '̌': 0x56, - 'М': 0x56, - 'м': 0x56, - '‹': 0x56, - '√': 0x56, - '◊': 0x56, - 'ㅍ': 0x56, - '': 0x4b, - }, - 'KeyW': { - 'Deadkey': 0x57, - 'W': 0x57, - 'Z': 0x5a, - 'w': 0x57, - 'z': 0x5a, - 'À': 0x57, - 'Â': 0x5a, - 'Å': 0x5a, - 'Æ': 0x57, - 'æ': 0x57, - '˝': 0x57, - '̇': 0x57, - 'Ω': 0x57, - 'Џ': 0x57, - 'Ц': 0x57, - 'ц': 0x57, - 'џ': 0x57, - '„': 0x57, - '∑': 0x57, - 'ㅈ': 0x57, - 'ㅉ': 0x57, - }, - 'KeyX': { - 'Deadkey': 0x58, - 'Q': 0x51, - 'X': 0x58, - 'q': 0x51, - 'x': 0x58, - 'Ù': 0x58, - 'Œ': 0x51, - 'œ': 0x51, - 'Ź': 0x58, - 'ź': 0x58, - 'ˇ': 0x58, - '˛': 0x58, - '̣': 0x58, - 'Ч': 0x58, - 'ч': 0x58, - '†': 0x58, - '‡': 0x58, - '›': 0x58, - '⁄': 0x58, - '∑': 0x58, - '≈': 0x58, - 'ㅌ': 0x58, - }, - 'KeyY': { - ' ': 0x59, - 'F': 0x46, - 'Y': 0x59, - 'Z': 0x5a, - 'f': 0x46, - 'y': 0x59, - 'z': 0x5a, - '¥': 0x59, - 'µ': 0x59, - 'Á': 0x59, - 'Æ': 0x59, - 'Ï': 0x46, - 'Ú': 0x59, - 'æ': 0x59, - 'ī': 0x59, - 'Ÿ': 0x59, - 'ƒ': 0x46, - 'ˇ': 0x5a, - '˜': 0x59, - 'Ω': 0x5a, - 'Њ': 0x59, - 'Н': 0x59, - 'н': 0x59, - 'њ': 0x59, - 'ㅛ': 0x59, - }, - 'KeyZ': { - ' ': 0x5a, - 'Deadkey': 0x5a, - 'W': 0x57, - 'Y': 0x59, - 'Z': 0x5a, - 'w': 0x57, - 'y': 0x59, - 'z': 0x5a, - '¥': 0x59, - '¸': 0x5a, - 'Û': 0x5a, - '÷': 0x5a, - 'Ż': 0x5a, - 'ż': 0x5a, - '̉': 0x5a, - 'Ω': 0x5a, - 'Ђ': 0x5a, - 'Я': 0x5a, - 'я': 0x5a, - 'ђ': 0x5a, - '‡': 0x59, - '‹': 0x1, - '›': 0x57, - '⁄': 0x5a, - '∑': 0x5a, - 'ㅋ': 0x5a, - }, - 'Period': { - 'V': 0x56, - 'v': 0x56, - '√': 0x56, - '◊': 0x56, - }, - 'Semicolon': { - 'M': 0x4d, - 'S': 0x53, - 'm': 0x4d, - 's': 0x53, - 'µ': 0x4d, - 'Í': 0x53, - 'Ó': 0x4d, - 'ß': 0x53, - }, - 'Slash': { - 'Z': 0x5a, - 'z': 0x5a, - '¸': 0x5a, - 'Ω': 0x5a, - }, -}; From 7f985ee335cdc107c3c81699800259d70329c2fe Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Tue, 1 Nov 2022 14:09:48 -0700 Subject: [PATCH 30/74] letter in test cases --- .../test/test_cases.g.dart | 3256 ++++++++--------- .../web_keyboard_layouts/test/testing.dart | 14 +- tools/gen_web_keyboard_layouts/lib/main.dart | 4 +- 3 files changed, 1642 insertions(+), 1632 deletions(-) diff --git a/third_party/web_keyboard_layouts/test/test_cases.g.dart b/third_party/web_keyboard_layouts/test/test_cases.g.dart index 865d938d6eaea..7bb5516c2cd35 100644 --- a/third_party/web_keyboard_layouts/test/test_cases.g.dart +++ b/third_party/web_keyboard_layouts/test/test_cases.g.dart @@ -19,1722 +19,1722 @@ import 'testing.dart'; void testWin(LayoutMapping mapping) { group('cz', () { - verifyEntry(mapping, 'Digit0', ['é', '0', '˝', ''], 0x30); - verifyEntry(mapping, 'Digit1', ['+', '1', '~', ''], 0x31); - verifyEntry(mapping, 'Digit2', ['ě', '2', 'ˇ', ''], 0x32); - verifyEntry(mapping, 'Digit3', ['š', '3', '^', ''], 0x33); - verifyEntry(mapping, 'Digit4', ['č', '4', '˘', ''], 0x34); - verifyEntry(mapping, 'Digit5', ['ř', '5', '°', ''], 0x35); - verifyEntry(mapping, 'Digit6', ['ž', '6', '˛', ''], 0x36); - verifyEntry(mapping, 'Digit7', ['ý', '7', '`', ''], 0x37); - verifyEntry(mapping, 'Digit8', ['á', '8', '˙', ''], 0x38); - verifyEntry(mapping, 'Digit9', ['í', '9', '´', ''], 0x39); - verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 0x41); - verifyEntry(mapping, 'KeyB', ['b', 'B', '{', ''], 0x42); - verifyEntry(mapping, 'KeyC', ['c', 'C', '&', ''], 0x43); - verifyEntry(mapping, 'KeyD', ['d', 'D', 'Đ', ''], 0x44); - verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 0x45); - verifyEntry(mapping, 'KeyF', ['f', 'F', '[', ''], 0x46); - verifyEntry(mapping, 'KeyG', ['g', 'G', ']', ''], 0x47); - verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 0x48); - verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 0x49); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 0x4a); - verifyEntry(mapping, 'KeyK', ['k', 'K', 'ł', ''], 0x4b); - verifyEntry(mapping, 'KeyL', ['l', 'L', 'Ł', ''], 0x4c); - verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 0x4d); - verifyEntry(mapping, 'KeyN', ['n', 'N', '}', ''], 0x4e); - verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 0x4f); - verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 0x50); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', r'\', ''], 0x51); - verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 0x52); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'đ', ''], 0x53); - verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 0x54); - verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 0x55); - verifyEntry(mapping, 'KeyV', ['v', 'V', '@', ''], 0x56); - verifyEntry(mapping, 'KeyW', ['w', 'W', '|', ''], 0x57); - verifyEntry(mapping, 'KeyX', ['x', 'X', '#', ''], 0x58); - verifyEntry(mapping, 'KeyY', ['z', 'Z', '', ''], 0x5a); - verifyEntry(mapping, 'KeyZ', ['y', 'Y', '', ''], 0x59); -}); + verifyEntry(mapping, 'Digit0', ['é', '0', '˝', ''], '0'); + verifyEntry(mapping, 'Digit1', ['+', '1', '~', ''], '1'); + verifyEntry(mapping, 'Digit2', ['ě', '2', 'ˇ', ''], '2'); + verifyEntry(mapping, 'Digit3', ['š', '3', '^', ''], '3'); + verifyEntry(mapping, 'Digit4', ['č', '4', '˘', ''], '4'); + verifyEntry(mapping, 'Digit5', ['ř', '5', '°', ''], '5'); + verifyEntry(mapping, 'Digit6', ['ž', '6', '˛', ''], '6'); + verifyEntry(mapping, 'Digit7', ['ý', '7', '`', ''], '7'); + verifyEntry(mapping, 'Digit8', ['á', '8', '˙', ''], '8'); + verifyEntry(mapping, 'Digit9', ['í', '9', '´', ''], '9'); + verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 'A'); + verifyEntry(mapping, 'KeyB', ['b', 'B', '{', ''], 'B'); + verifyEntry(mapping, 'KeyC', ['c', 'C', '&', ''], 'C'); + verifyEntry(mapping, 'KeyD', ['d', 'D', 'Đ', ''], 'D'); + verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 'E'); + verifyEntry(mapping, 'KeyF', ['f', 'F', '[', ''], 'F'); + verifyEntry(mapping, 'KeyG', ['g', 'G', ']', ''], 'G'); + verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 'H'); + verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 'I'); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 'J'); + verifyEntry(mapping, 'KeyK', ['k', 'K', 'ł', ''], 'K'); + verifyEntry(mapping, 'KeyL', ['l', 'L', 'Ł', ''], 'L'); + verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 'M'); + verifyEntry(mapping, 'KeyN', ['n', 'N', '}', ''], 'N'); + verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 'O'); + verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 'P'); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', r'\', ''], 'Q'); + verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 'R'); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'đ', ''], 'S'); + verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 'T'); + verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 'U'); + verifyEntry(mapping, 'KeyV', ['v', 'V', '@', ''], 'V'); + verifyEntry(mapping, 'KeyW', ['w', 'W', '|', ''], 'W'); + verifyEntry(mapping, 'KeyX', ['x', 'X', '#', ''], 'X'); + verifyEntry(mapping, 'KeyY', ['z', 'Z', '', ''], 'Z'); + verifyEntry(mapping, 'KeyZ', ['y', 'Y', '', ''], 'Y'); + }); group('de', () { - verifyEntry(mapping, 'Digit0', ['0', '=', '}', ''], 0x30); - verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], 0x31); - verifyEntry(mapping, 'Digit2', ['2', '"', '²', ''], 0x32); - verifyEntry(mapping, 'Digit3', ['3', '§', '³', ''], 0x33); - verifyEntry(mapping, 'Digit4', ['4', r'$', '', ''], 0x34); - verifyEntry(mapping, 'Digit5', ['5', '%', '', ''], 0x35); - verifyEntry(mapping, 'Digit6', ['6', '&', '', ''], 0x36); - verifyEntry(mapping, 'Digit7', ['7', '/', '{', ''], 0x37); - verifyEntry(mapping, 'Digit8', ['8', '(', '[', ''], 0x38); - verifyEntry(mapping, 'Digit9', ['9', ')', ']', ''], 0x39); - verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 0x41); - verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 0x42); - verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 0x43); - verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 0x44); - verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 0x45); - verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 0x46); - verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 0x47); - verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 0x48); - verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 0x49); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 0x4a); - verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 0x4b); - verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 0x4c); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', ''], 0x4d); - verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 0x4e); - verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 0x4f); - verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 0x50); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', '@', ''], 0x51); - verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 0x52); - verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 0x53); - verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 0x54); - verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 0x55); - verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 0x56); - verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 0x57); - verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 0x58); - verifyEntry(mapping, 'KeyY', ['z', 'Z', '', ''], 0x5a); - verifyEntry(mapping, 'KeyZ', ['y', 'Y', '', ''], 0x59); -}); + verifyEntry(mapping, 'Digit0', ['0', '=', '}', ''], '0'); + verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], '1'); + verifyEntry(mapping, 'Digit2', ['2', '"', '²', ''], '2'); + verifyEntry(mapping, 'Digit3', ['3', '§', '³', ''], '3'); + verifyEntry(mapping, 'Digit4', ['4', r'$', '', ''], '4'); + verifyEntry(mapping, 'Digit5', ['5', '%', '', ''], '5'); + verifyEntry(mapping, 'Digit6', ['6', '&', '', ''], '6'); + verifyEntry(mapping, 'Digit7', ['7', '/', '{', ''], '7'); + verifyEntry(mapping, 'Digit8', ['8', '(', '[', ''], '8'); + verifyEntry(mapping, 'Digit9', ['9', ')', ']', ''], '9'); + verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 'A'); + verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 'B'); + verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 'C'); + verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 'D'); + verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 'E'); + verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 'F'); + verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 'G'); + verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 'H'); + verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 'I'); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 'J'); + verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 'K'); + verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 'L'); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', ''], 'M'); + verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 'N'); + verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 'O'); + verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 'P'); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', '@', ''], 'Q'); + verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 'R'); + verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 'S'); + verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 'T'); + verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 'U'); + verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 'V'); + verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 'W'); + verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 'X'); + verifyEntry(mapping, 'KeyY', ['z', 'Z', '', ''], 'Z'); + verifyEntry(mapping, 'KeyZ', ['y', 'Y', '', ''], 'Y'); + }); group('de-swiss', () { - verifyEntry(mapping, 'Digit0', ['0', '=', '', ''], 0x30); - verifyEntry(mapping, 'Digit1', ['1', '+', '¦', ''], 0x31); - verifyEntry(mapping, 'Digit2', ['2', '"', '@', ''], 0x32); - verifyEntry(mapping, 'Digit3', ['3', '*', '#', ''], 0x33); - verifyEntry(mapping, 'Digit4', ['4', 'ç', '°', ''], 0x34); - verifyEntry(mapping, 'Digit5', ['5', '%', '§', ''], 0x35); - verifyEntry(mapping, 'Digit6', ['6', '&', '¬', ''], 0x36); - verifyEntry(mapping, 'Digit7', ['7', '/', '|', ''], 0x37); - verifyEntry(mapping, 'Digit8', ['8', '(', '¢', ''], 0x38); - verifyEntry(mapping, 'Digit9', ['9', ')', '', ''], 0x39); - verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 0x41); - verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 0x42); - verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 0x43); - verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 0x44); - verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 0x45); - verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 0x46); - verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 0x47); - verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 0x48); - verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 0x49); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 0x4a); - verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 0x4b); - verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 0x4c); - verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 0x4d); - verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 0x4e); - verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 0x4f); - verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 0x50); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 0x51); - verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 0x52); - verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 0x53); - verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 0x54); - verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 0x55); - verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 0x56); - verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 0x57); - verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 0x58); - verifyEntry(mapping, 'KeyY', ['z', 'Z', '', ''], 0x5a); - verifyEntry(mapping, 'KeyZ', ['y', 'Y', '', ''], 0x59); -}); + verifyEntry(mapping, 'Digit0', ['0', '=', '', ''], '0'); + verifyEntry(mapping, 'Digit1', ['1', '+', '¦', ''], '1'); + verifyEntry(mapping, 'Digit2', ['2', '"', '@', ''], '2'); + verifyEntry(mapping, 'Digit3', ['3', '*', '#', ''], '3'); + verifyEntry(mapping, 'Digit4', ['4', 'ç', '°', ''], '4'); + verifyEntry(mapping, 'Digit5', ['5', '%', '§', ''], '5'); + verifyEntry(mapping, 'Digit6', ['6', '&', '¬', ''], '6'); + verifyEntry(mapping, 'Digit7', ['7', '/', '|', ''], '7'); + verifyEntry(mapping, 'Digit8', ['8', '(', '¢', ''], '8'); + verifyEntry(mapping, 'Digit9', ['9', ')', '', ''], '9'); + verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 'A'); + verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 'B'); + verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 'C'); + verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 'D'); + verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 'E'); + verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 'F'); + verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 'G'); + verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 'H'); + verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 'I'); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 'J'); + verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 'K'); + verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 'L'); + verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 'M'); + verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 'N'); + verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 'O'); + verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 'P'); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 'Q'); + verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 'R'); + verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 'S'); + verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 'T'); + verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 'U'); + verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 'V'); + verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 'W'); + verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 'X'); + verifyEntry(mapping, 'KeyY', ['z', 'Z', '', ''], 'Z'); + verifyEntry(mapping, 'KeyZ', ['y', 'Y', '', ''], 'Y'); + }); group('dk', () { - verifyEntry(mapping, 'Digit0', ['0', '=', '}', ''], 0x30); - verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], 0x31); - verifyEntry(mapping, 'Digit2', ['2', '"', '@', ''], 0x32); - verifyEntry(mapping, 'Digit3', ['3', '#', '£', ''], 0x33); - verifyEntry(mapping, 'Digit4', ['4', '¤', r'$', ''], 0x34); - verifyEntry(mapping, 'Digit5', ['5', '%', '€', ''], 0x35); - verifyEntry(mapping, 'Digit6', ['6', '&', '', ''], 0x36); - verifyEntry(mapping, 'Digit7', ['7', '/', '{', ''], 0x37); - verifyEntry(mapping, 'Digit8', ['8', '(', '[', ''], 0x38); - verifyEntry(mapping, 'Digit9', ['9', ')', ']', ''], 0x39); - verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 0x41); - verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 0x42); - verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 0x43); - verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 0x44); - verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 0x45); - verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 0x46); - verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 0x47); - verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 0x48); - verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 0x49); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 0x4a); - verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 0x4b); - verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 0x4c); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', ''], 0x4d); - verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 0x4e); - verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 0x4f); - verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 0x50); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 0x51); - verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 0x52); - verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 0x53); - verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 0x54); - verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 0x55); - verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 0x56); - verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 0x57); - verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 0x58); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 0x59); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 0x5a); -}); + verifyEntry(mapping, 'Digit0', ['0', '=', '}', ''], '0'); + verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], '1'); + verifyEntry(mapping, 'Digit2', ['2', '"', '@', ''], '2'); + verifyEntry(mapping, 'Digit3', ['3', '#', '£', ''], '3'); + verifyEntry(mapping, 'Digit4', ['4', '¤', r'$', ''], '4'); + verifyEntry(mapping, 'Digit5', ['5', '%', '€', ''], '5'); + verifyEntry(mapping, 'Digit6', ['6', '&', '', ''], '6'); + verifyEntry(mapping, 'Digit7', ['7', '/', '{', ''], '7'); + verifyEntry(mapping, 'Digit8', ['8', '(', '[', ''], '8'); + verifyEntry(mapping, 'Digit9', ['9', ')', ']', ''], '9'); + verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 'A'); + verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 'B'); + verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 'C'); + verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 'D'); + verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 'E'); + verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 'F'); + verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 'G'); + verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 'H'); + verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 'I'); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 'J'); + verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 'K'); + verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 'L'); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', ''], 'M'); + verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 'N'); + verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 'O'); + verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 'P'); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 'Q'); + verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 'R'); + verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 'S'); + verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 'T'); + verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 'U'); + verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 'V'); + verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 'W'); + verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 'X'); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 'Y'); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 'Z'); + }); group('en', () { - verifyEntry(mapping, 'Digit0', ['0', ')', '', ''], 0x30); - verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], 0x31); - verifyEntry(mapping, 'Digit2', ['2', '@', '', ''], 0x32); - verifyEntry(mapping, 'Digit3', ['3', '#', '', ''], 0x33); - verifyEntry(mapping, 'Digit4', ['4', r'$', '', ''], 0x34); - verifyEntry(mapping, 'Digit5', ['5', '%', '', ''], 0x35); - verifyEntry(mapping, 'Digit6', ['6', '^', '', ''], 0x36); - verifyEntry(mapping, 'Digit7', ['7', '&', '', ''], 0x37); - verifyEntry(mapping, 'Digit8', ['8', '*', '', ''], 0x38); - verifyEntry(mapping, 'Digit9', ['9', '(', '', ''], 0x39); - verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 0x41); - verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 0x42); - verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 0x43); - verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 0x44); - verifyEntry(mapping, 'KeyE', ['e', 'E', '', ''], 0x45); - verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 0x46); - verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 0x47); - verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 0x48); - verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 0x49); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 0x4a); - verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 0x4b); - verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 0x4c); - verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 0x4d); - verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 0x4e); - verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 0x4f); - verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 0x50); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 0x51); - verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 0x52); - verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 0x53); - verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 0x54); - verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 0x55); - verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 0x56); - verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 0x57); - verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 0x58); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 0x59); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 0x5a); -}); + verifyEntry(mapping, 'Digit0', ['0', ')', '', ''], '0'); + verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], '1'); + verifyEntry(mapping, 'Digit2', ['2', '@', '', ''], '2'); + verifyEntry(mapping, 'Digit3', ['3', '#', '', ''], '3'); + verifyEntry(mapping, 'Digit4', ['4', r'$', '', ''], '4'); + verifyEntry(mapping, 'Digit5', ['5', '%', '', ''], '5'); + verifyEntry(mapping, 'Digit6', ['6', '^', '', ''], '6'); + verifyEntry(mapping, 'Digit7', ['7', '&', '', ''], '7'); + verifyEntry(mapping, 'Digit8', ['8', '*', '', ''], '8'); + verifyEntry(mapping, 'Digit9', ['9', '(', '', ''], '9'); + verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 'A'); + verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 'B'); + verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 'C'); + verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 'D'); + verifyEntry(mapping, 'KeyE', ['e', 'E', '', ''], 'E'); + verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 'F'); + verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 'G'); + verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 'H'); + verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 'I'); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 'J'); + verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 'K'); + verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 'L'); + verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 'M'); + verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 'N'); + verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 'O'); + verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 'P'); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 'Q'); + verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 'R'); + verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 'S'); + verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 'T'); + verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 'U'); + verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 'V'); + verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 'W'); + verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 'X'); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 'Y'); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 'Z'); + }); group('en-belgian', () { - verifyEntry(mapping, 'Digit0', ['à', '0', '}', ''], 0x30); - verifyEntry(mapping, 'Digit1', ['&', '1', '|', ''], 0x31); - verifyEntry(mapping, 'Digit2', ['é', '2', '@', ''], 0x32); - verifyEntry(mapping, 'Digit3', ['"', '3', '#', ''], 0x33); - verifyEntry(mapping, 'Digit4', ["'", '4', '{', ''], 0x34); - verifyEntry(mapping, 'Digit5', ['(', '5', '[', ''], 0x35); - verifyEntry(mapping, 'Digit6', ['§', '6', '^', ''], 0x36); - verifyEntry(mapping, 'Digit7', ['è', '7', '', ''], 0x37); - verifyEntry(mapping, 'Digit8', ['!', '8', '', ''], 0x38); - verifyEntry(mapping, 'Digit9', ['ç', '9', '{', ''], 0x39); - verifyEntry(mapping, 'KeyA', ['q', 'Q', '', ''], 0x51); - verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 0x42); - verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 0x43); - verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 0x44); - verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 0x45); - verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 0x46); - verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 0x47); - verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 0x48); - verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 0x49); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 0x4a); - verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 0x4b); - verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 0x4c); - verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 0x4e); - verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 0x4f); - verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 0x50); - verifyEntry(mapping, 'KeyQ', ['a', 'A', '', ''], 0x41); - verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 0x52); - verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 0x53); - verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 0x54); - verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 0x55); - verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 0x56); - verifyEntry(mapping, 'KeyW', ['z', 'Z', '', ''], 0x5a); - verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 0x58); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 0x59); - verifyEntry(mapping, 'KeyZ', ['w', 'W', '', ''], 0x57); - verifyEntry(mapping, 'Semicolon', ['m', 'M', '', ''], 0x4d); -}); + verifyEntry(mapping, 'Digit0', ['à', '0', '}', ''], '0'); + verifyEntry(mapping, 'Digit1', ['&', '1', '|', ''], '1'); + verifyEntry(mapping, 'Digit2', ['é', '2', '@', ''], '2'); + verifyEntry(mapping, 'Digit3', ['"', '3', '#', ''], '3'); + verifyEntry(mapping, 'Digit4', ["'", '4', '{', ''], '4'); + verifyEntry(mapping, 'Digit5', ['(', '5', '[', ''], '5'); + verifyEntry(mapping, 'Digit6', ['§', '6', '^', ''], '6'); + verifyEntry(mapping, 'Digit7', ['è', '7', '', ''], '7'); + verifyEntry(mapping, 'Digit8', ['!', '8', '', ''], '8'); + verifyEntry(mapping, 'Digit9', ['ç', '9', '{', ''], '9'); + verifyEntry(mapping, 'KeyA', ['q', 'Q', '', ''], 'Q'); + verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 'B'); + verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 'C'); + verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 'D'); + verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 'E'); + verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 'F'); + verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 'G'); + verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 'H'); + verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 'I'); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 'J'); + verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 'K'); + verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 'L'); + verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 'N'); + verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 'O'); + verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 'P'); + verifyEntry(mapping, 'KeyQ', ['a', 'A', '', ''], 'A'); + verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 'R'); + verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 'S'); + verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 'T'); + verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 'U'); + verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 'V'); + verifyEntry(mapping, 'KeyW', ['z', 'Z', '', ''], 'Z'); + verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 'X'); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 'Y'); + verifyEntry(mapping, 'KeyZ', ['w', 'W', '', ''], 'W'); + verifyEntry(mapping, 'Semicolon', ['m', 'M', '', ''], 'M'); + }); group('en-in', () { - verifyEntry(mapping, 'Digit0', ['0', ')', '', ''], 0x30); - verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], 0x31); - verifyEntry(mapping, 'Digit2', ['2', '@', '', ''], 0x32); - verifyEntry(mapping, 'Digit3', ['3', '#', '', ''], 0x33); - verifyEntry(mapping, 'Digit4', ['4', r'$', '₹', ''], 0x34); - verifyEntry(mapping, 'Digit5', ['5', '%', '', ''], 0x35); - verifyEntry(mapping, 'Digit6', ['6', '^', '', 'ˆ'], 0x36); - verifyEntry(mapping, 'Digit7', ['7', '&', '', ''], 0x37); - verifyEntry(mapping, 'Digit8', ['8', '*', '', ''], 0x38); - verifyEntry(mapping, 'Digit9', ['9', '(', '', '˘'], 0x39); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'ā', 'Ā'], 0x41); - verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 0x42); - verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 0x43); - verifyEntry(mapping, 'KeyD', ['d', 'D', 'ḍ', 'Ḍ'], 0x44); - verifyEntry(mapping, 'KeyE', ['e', 'E', 'ē', 'Ē'], 0x45); - verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 0x46); - verifyEntry(mapping, 'KeyG', ['g', 'G', 'ṅ', 'Ṅ'], 0x47); - verifyEntry(mapping, 'KeyH', ['h', 'H', 'ḥ', 'Ḥ'], 0x48); - verifyEntry(mapping, 'KeyI', ['i', 'I', 'ī', 'Ī'], 0x49); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 0x4a); - verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 0x4b); - verifyEntry(mapping, 'KeyL', ['l', 'L', 'l̥', 'L̥'], 0x4c); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'ṁ', 'Ṁ'], 0x4d); - verifyEntry(mapping, 'KeyN', ['n', 'N', 'ṇ', 'Ṇ'], 0x4e); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'ō', 'Ō'], 0x4f); - verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 0x50); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'æ', 'Æ'], 0x51); - verifyEntry(mapping, 'KeyR', ['r', 'R', 'r̥', 'R̥'], 0x52); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'ś', 'Ś'], 0x53); - verifyEntry(mapping, 'KeyT', ['t', 'T', 'ṭ', 'Ṭ'], 0x54); - verifyEntry(mapping, 'KeyU', ['u', 'U', 'ū', 'Ū'], 0x55); - verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 0x56); - verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 0x57); - verifyEntry(mapping, 'KeyX', ['x', 'X', 'ṣ', 'Ṣ'], 0x58); - verifyEntry(mapping, 'KeyY', ['y', 'Y', 'ñ', 'Ñ'], 0x59); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 0x5a); -}); + verifyEntry(mapping, 'Digit0', ['0', ')', '', ''], '0'); + verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], '1'); + verifyEntry(mapping, 'Digit2', ['2', '@', '', ''], '2'); + verifyEntry(mapping, 'Digit3', ['3', '#', '', ''], '3'); + verifyEntry(mapping, 'Digit4', ['4', r'$', '₹', ''], '4'); + verifyEntry(mapping, 'Digit5', ['5', '%', '', ''], '5'); + verifyEntry(mapping, 'Digit6', ['6', '^', '', 'ˆ'], '6'); + verifyEntry(mapping, 'Digit7', ['7', '&', '', ''], '7'); + verifyEntry(mapping, 'Digit8', ['8', '*', '', ''], '8'); + verifyEntry(mapping, 'Digit9', ['9', '(', '', '˘'], '9'); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'ā', 'Ā'], 'A'); + verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 'B'); + verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 'C'); + verifyEntry(mapping, 'KeyD', ['d', 'D', 'ḍ', 'Ḍ'], 'D'); + verifyEntry(mapping, 'KeyE', ['e', 'E', 'ē', 'Ē'], 'E'); + verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 'F'); + verifyEntry(mapping, 'KeyG', ['g', 'G', 'ṅ', 'Ṅ'], 'G'); + verifyEntry(mapping, 'KeyH', ['h', 'H', 'ḥ', 'Ḥ'], 'H'); + verifyEntry(mapping, 'KeyI', ['i', 'I', 'ī', 'Ī'], 'I'); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 'J'); + verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 'K'); + verifyEntry(mapping, 'KeyL', ['l', 'L', 'l̥', 'L̥'], 'L'); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'ṁ', 'Ṁ'], 'M'); + verifyEntry(mapping, 'KeyN', ['n', 'N', 'ṇ', 'Ṇ'], 'N'); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'ō', 'Ō'], 'O'); + verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 'P'); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'æ', 'Æ'], 'Q'); + verifyEntry(mapping, 'KeyR', ['r', 'R', 'r̥', 'R̥'], 'R'); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'ś', 'Ś'], 'S'); + verifyEntry(mapping, 'KeyT', ['t', 'T', 'ṭ', 'Ṭ'], 'T'); + verifyEntry(mapping, 'KeyU', ['u', 'U', 'ū', 'Ū'], 'U'); + verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 'V'); + verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 'W'); + verifyEntry(mapping, 'KeyX', ['x', 'X', 'ṣ', 'Ṣ'], 'X'); + verifyEntry(mapping, 'KeyY', ['y', 'Y', 'ñ', 'Ñ'], 'Y'); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 'Z'); + }); group('en-intl', () { - verifyEntry(mapping, 'Digit0', ['0', ')', '’', ''], 0x30); - verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '¹'], 0x31); - verifyEntry(mapping, 'Digit2', ['2', '@', '²', ''], 0x32); - verifyEntry(mapping, 'Digit3', ['3', '#', '³', ''], 0x33); - verifyEntry(mapping, 'Digit4', ['4', r'$', '¤', '£'], 0x34); - verifyEntry(mapping, 'Digit5', ['5', '%', '€', ''], 0x35); - verifyEntry(mapping, 'Digit6', ['6', '^', '¼', ''], 0x36); - verifyEntry(mapping, 'Digit7', ['7', '&', '½', ''], 0x37); - verifyEntry(mapping, 'Digit8', ['8', '*', '¾', ''], 0x38); - verifyEntry(mapping, 'Digit9', ['9', '(', '‘', ''], 0x39); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'á', 'Á'], 0x41); - verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 0x42); - verifyEntry(mapping, 'KeyC', ['c', 'C', '©', '¢'], 0x43); - verifyEntry(mapping, 'KeyD', ['d', 'D', 'ð', 'Ð'], 0x44); - verifyEntry(mapping, 'KeyE', ['e', 'E', 'é', 'É'], 0x45); - verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 0x46); - verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 0x47); - verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 0x48); - verifyEntry(mapping, 'KeyI', ['i', 'I', 'í', 'Í'], 0x49); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 0x4a); - verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 0x4b); - verifyEntry(mapping, 'KeyL', ['l', 'L', 'ø', 'Ø'], 0x4c); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', ''], 0x4d); - verifyEntry(mapping, 'KeyN', ['n', 'N', 'ñ', 'Ñ'], 0x4e); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'ó', 'Ó'], 0x4f); - verifyEntry(mapping, 'KeyP', ['p', 'P', 'ö', 'Ö'], 0x50); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'ä', 'Ä'], 0x51); - verifyEntry(mapping, 'KeyR', ['r', 'R', '®', ''], 0x52); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', '§'], 0x53); - verifyEntry(mapping, 'KeyT', ['t', 'T', 'þ', 'Þ'], 0x54); - verifyEntry(mapping, 'KeyU', ['u', 'U', 'ú', 'Ú'], 0x55); - verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 0x56); - verifyEntry(mapping, 'KeyW', ['w', 'W', 'å', 'Å'], 0x57); - verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 0x58); - verifyEntry(mapping, 'KeyY', ['y', 'Y', 'ü', 'Ü'], 0x59); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'æ', 'Æ'], 0x5a); -}); + verifyEntry(mapping, 'Digit0', ['0', ')', '’', ''], '0'); + verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '¹'], '1'); + verifyEntry(mapping, 'Digit2', ['2', '@', '²', ''], '2'); + verifyEntry(mapping, 'Digit3', ['3', '#', '³', ''], '3'); + verifyEntry(mapping, 'Digit4', ['4', r'$', '¤', '£'], '4'); + verifyEntry(mapping, 'Digit5', ['5', '%', '€', ''], '5'); + verifyEntry(mapping, 'Digit6', ['6', '^', '¼', ''], '6'); + verifyEntry(mapping, 'Digit7', ['7', '&', '½', ''], '7'); + verifyEntry(mapping, 'Digit8', ['8', '*', '¾', ''], '8'); + verifyEntry(mapping, 'Digit9', ['9', '(', '‘', ''], '9'); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'á', 'Á'], 'A'); + verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 'B'); + verifyEntry(mapping, 'KeyC', ['c', 'C', '©', '¢'], 'C'); + verifyEntry(mapping, 'KeyD', ['d', 'D', 'ð', 'Ð'], 'D'); + verifyEntry(mapping, 'KeyE', ['e', 'E', 'é', 'É'], 'E'); + verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 'F'); + verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 'G'); + verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 'H'); + verifyEntry(mapping, 'KeyI', ['i', 'I', 'í', 'Í'], 'I'); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 'J'); + verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 'K'); + verifyEntry(mapping, 'KeyL', ['l', 'L', 'ø', 'Ø'], 'L'); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', ''], 'M'); + verifyEntry(mapping, 'KeyN', ['n', 'N', 'ñ', 'Ñ'], 'N'); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'ó', 'Ó'], 'O'); + verifyEntry(mapping, 'KeyP', ['p', 'P', 'ö', 'Ö'], 'P'); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'ä', 'Ä'], 'Q'); + verifyEntry(mapping, 'KeyR', ['r', 'R', '®', ''], 'R'); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', '§'], 'S'); + verifyEntry(mapping, 'KeyT', ['t', 'T', 'þ', 'Þ'], 'T'); + verifyEntry(mapping, 'KeyU', ['u', 'U', 'ú', 'Ú'], 'U'); + verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 'V'); + verifyEntry(mapping, 'KeyW', ['w', 'W', 'å', 'Å'], 'W'); + verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 'X'); + verifyEntry(mapping, 'KeyY', ['y', 'Y', 'ü', 'Ü'], 'Y'); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'æ', 'Æ'], 'Z'); + }); group('en-uk', () { - verifyEntry(mapping, 'Digit0', ['0', ')', '', ''], 0x30); - verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], 0x31); - verifyEntry(mapping, 'Digit2', ['2', '"', '', ''], 0x32); - verifyEntry(mapping, 'Digit3', ['3', '£', '', ''], 0x33); - verifyEntry(mapping, 'Digit4', ['4', r'$', '€', ''], 0x34); - verifyEntry(mapping, 'Digit5', ['5', '%', '', ''], 0x35); - verifyEntry(mapping, 'Digit6', ['6', '^', '', ''], 0x36); - verifyEntry(mapping, 'Digit7', ['7', '&', '', ''], 0x37); - verifyEntry(mapping, 'Digit8', ['8', '*', '', ''], 0x38); - verifyEntry(mapping, 'Digit9', ['9', '(', '', ''], 0x39); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'á', 'Á'], 0x41); - verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 0x42); - verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 0x43); - verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 0x44); - verifyEntry(mapping, 'KeyE', ['e', 'E', 'é', 'É'], 0x45); - verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 0x46); - verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 0x47); - verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 0x48); - verifyEntry(mapping, 'KeyI', ['i', 'I', 'í', 'Í'], 0x49); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 0x4a); - verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 0x4b); - verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 0x4c); - verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 0x4d); - verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 0x4e); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'ó', 'Ó'], 0x4f); - verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 0x50); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 0x51); - verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 0x52); - verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 0x53); - verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 0x54); - verifyEntry(mapping, 'KeyU', ['u', 'U', 'ú', 'Ú'], 0x55); - verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 0x56); - verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 0x57); - verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 0x58); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 0x59); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 0x5a); -}); + verifyEntry(mapping, 'Digit0', ['0', ')', '', ''], '0'); + verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], '1'); + verifyEntry(mapping, 'Digit2', ['2', '"', '', ''], '2'); + verifyEntry(mapping, 'Digit3', ['3', '£', '', ''], '3'); + verifyEntry(mapping, 'Digit4', ['4', r'$', '€', ''], '4'); + verifyEntry(mapping, 'Digit5', ['5', '%', '', ''], '5'); + verifyEntry(mapping, 'Digit6', ['6', '^', '', ''], '6'); + verifyEntry(mapping, 'Digit7', ['7', '&', '', ''], '7'); + verifyEntry(mapping, 'Digit8', ['8', '*', '', ''], '8'); + verifyEntry(mapping, 'Digit9', ['9', '(', '', ''], '9'); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'á', 'Á'], 'A'); + verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 'B'); + verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 'C'); + verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 'D'); + verifyEntry(mapping, 'KeyE', ['e', 'E', 'é', 'É'], 'E'); + verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 'F'); + verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 'G'); + verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 'H'); + verifyEntry(mapping, 'KeyI', ['i', 'I', 'í', 'Í'], 'I'); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 'J'); + verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 'K'); + verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 'L'); + verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 'M'); + verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 'N'); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'ó', 'Ó'], 'O'); + verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 'P'); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 'Q'); + verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 'R'); + verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 'S'); + verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 'T'); + verifyEntry(mapping, 'KeyU', ['u', 'U', 'ú', 'Ú'], 'U'); + verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 'V'); + verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 'W'); + verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 'X'); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 'Y'); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 'Z'); + }); group('es', () { - verifyEntry(mapping, 'Digit0', ['0', '=', '', ''], 0x30); - verifyEntry(mapping, 'Digit1', ['1', '!', '|', ''], 0x31); - verifyEntry(mapping, 'Digit2', ['2', '"', '@', ''], 0x32); - verifyEntry(mapping, 'Digit3', ['3', '·', '#', ''], 0x33); - verifyEntry(mapping, 'Digit4', ['4', r'$', '~', ''], 0x34); - verifyEntry(mapping, 'Digit5', ['5', '%', '€', ''], 0x35); - verifyEntry(mapping, 'Digit6', ['6', '&', '¬', ''], 0x36); - verifyEntry(mapping, 'Digit7', ['7', '/', '', ''], 0x37); - verifyEntry(mapping, 'Digit8', ['8', '(', '', ''], 0x38); - verifyEntry(mapping, 'Digit9', ['9', ')', '', ''], 0x39); - verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 0x41); - verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 0x42); - verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 0x43); - verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 0x44); - verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 0x45); - verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 0x46); - verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 0x47); - verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 0x48); - verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 0x49); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 0x4a); - verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 0x4b); - verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 0x4c); - verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 0x4d); - verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 0x4e); - verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 0x4f); - verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 0x50); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 0x51); - verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 0x52); - verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 0x53); - verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 0x54); - verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 0x55); - verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 0x56); - verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 0x57); - verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 0x58); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 0x59); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 0x5a); -}); + verifyEntry(mapping, 'Digit0', ['0', '=', '', ''], '0'); + verifyEntry(mapping, 'Digit1', ['1', '!', '|', ''], '1'); + verifyEntry(mapping, 'Digit2', ['2', '"', '@', ''], '2'); + verifyEntry(mapping, 'Digit3', ['3', '·', '#', ''], '3'); + verifyEntry(mapping, 'Digit4', ['4', r'$', '~', ''], '4'); + verifyEntry(mapping, 'Digit5', ['5', '%', '€', ''], '5'); + verifyEntry(mapping, 'Digit6', ['6', '&', '¬', ''], '6'); + verifyEntry(mapping, 'Digit7', ['7', '/', '', ''], '7'); + verifyEntry(mapping, 'Digit8', ['8', '(', '', ''], '8'); + verifyEntry(mapping, 'Digit9', ['9', ')', '', ''], '9'); + verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 'A'); + verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 'B'); + verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 'C'); + verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 'D'); + verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 'E'); + verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 'F'); + verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 'G'); + verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 'H'); + verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 'I'); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 'J'); + verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 'K'); + verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 'L'); + verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 'M'); + verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 'N'); + verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 'O'); + verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 'P'); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 'Q'); + verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 'R'); + verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 'S'); + verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 'T'); + verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 'U'); + verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 'V'); + verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 'W'); + verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 'X'); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 'Y'); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 'Z'); + }); group('es-latin', () { - verifyEntry(mapping, 'Digit0', ['0', '=', '', ''], 0x30); - verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], 0x31); - verifyEntry(mapping, 'Digit2', ['2', '"', '', ''], 0x32); - verifyEntry(mapping, 'Digit3', ['3', '#', '', ''], 0x33); - verifyEntry(mapping, 'Digit4', ['4', r'$', '', ''], 0x34); - verifyEntry(mapping, 'Digit5', ['5', '%', '', ''], 0x35); - verifyEntry(mapping, 'Digit6', ['6', '&', '', ''], 0x36); - verifyEntry(mapping, 'Digit7', ['7', '/', '', ''], 0x37); - verifyEntry(mapping, 'Digit8', ['8', '(', '', ''], 0x38); - verifyEntry(mapping, 'Digit9', ['9', ')', '', ''], 0x39); - verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 0x41); - verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 0x42); - verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 0x43); - verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 0x44); - verifyEntry(mapping, 'KeyE', ['e', 'E', '', ''], 0x45); - verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 0x46); - verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 0x47); - verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 0x48); - verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 0x49); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 0x4a); - verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 0x4b); - verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 0x4c); - verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 0x4d); - verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 0x4e); - verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 0x4f); - verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 0x50); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', '@', ''], 0x51); - verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 0x52); - verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 0x53); - verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 0x54); - verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 0x55); - verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 0x56); - verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 0x57); - verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 0x58); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 0x59); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 0x5a); -}); + verifyEntry(mapping, 'Digit0', ['0', '=', '', ''], '0'); + verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], '1'); + verifyEntry(mapping, 'Digit2', ['2', '"', '', ''], '2'); + verifyEntry(mapping, 'Digit3', ['3', '#', '', ''], '3'); + verifyEntry(mapping, 'Digit4', ['4', r'$', '', ''], '4'); + verifyEntry(mapping, 'Digit5', ['5', '%', '', ''], '5'); + verifyEntry(mapping, 'Digit6', ['6', '&', '', ''], '6'); + verifyEntry(mapping, 'Digit7', ['7', '/', '', ''], '7'); + verifyEntry(mapping, 'Digit8', ['8', '(', '', ''], '8'); + verifyEntry(mapping, 'Digit9', ['9', ')', '', ''], '9'); + verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 'A'); + verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 'B'); + verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 'C'); + verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 'D'); + verifyEntry(mapping, 'KeyE', ['e', 'E', '', ''], 'E'); + verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 'F'); + verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 'G'); + verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 'H'); + verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 'I'); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 'J'); + verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 'K'); + verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 'L'); + verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 'M'); + verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 'N'); + verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 'O'); + verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 'P'); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', '@', ''], 'Q'); + verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 'R'); + verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 'S'); + verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 'T'); + verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 'U'); + verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 'V'); + verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 'W'); + verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 'X'); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 'Y'); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 'Z'); + }); group('fr', () { - verifyEntry(mapping, 'Digit0', ['à', '0', '@', ''], 0x30); - verifyEntry(mapping, 'Digit1', ['&', '1', '', ''], 0x31); - verifyEntry(mapping, 'Digit2', ['é', '2', '~', ''], 0x32); - verifyEntry(mapping, 'Digit3', ['"', '3', '#', ''], 0x33); - verifyEntry(mapping, 'Digit4', ["'", '4', '{', ''], 0x34); - verifyEntry(mapping, 'Digit5', ['(', '5', '[', ''], 0x35); - verifyEntry(mapping, 'Digit6', ['-', '6', '|', ''], 0x36); - verifyEntry(mapping, 'Digit7', ['è', '7', '`', ''], 0x37); - verifyEntry(mapping, 'Digit8', ['_', '8', r'\', ''], 0x38); - verifyEntry(mapping, 'Digit9', ['ç', '9', '^', ''], 0x39); - verifyEntry(mapping, 'KeyA', ['q', 'Q', '', ''], 0x51); - verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 0x42); - verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 0x43); - verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 0x44); - verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 0x45); - verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 0x46); - verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 0x47); - verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 0x48); - verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 0x49); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 0x4a); - verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 0x4b); - verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 0x4c); - verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 0x4e); - verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 0x4f); - verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 0x50); - verifyEntry(mapping, 'KeyQ', ['a', 'A', '', ''], 0x41); - verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 0x52); - verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 0x53); - verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 0x54); - verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 0x55); - verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 0x56); - verifyEntry(mapping, 'KeyW', ['z', 'Z', '', ''], 0x5a); - verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 0x58); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 0x59); - verifyEntry(mapping, 'KeyZ', ['w', 'W', '', ''], 0x57); - verifyEntry(mapping, 'Semicolon', ['m', 'M', '', ''], 0x4d); -}); + verifyEntry(mapping, 'Digit0', ['à', '0', '@', ''], '0'); + verifyEntry(mapping, 'Digit1', ['&', '1', '', ''], '1'); + verifyEntry(mapping, 'Digit2', ['é', '2', '~', ''], '2'); + verifyEntry(mapping, 'Digit3', ['"', '3', '#', ''], '3'); + verifyEntry(mapping, 'Digit4', ["'", '4', '{', ''], '4'); + verifyEntry(mapping, 'Digit5', ['(', '5', '[', ''], '5'); + verifyEntry(mapping, 'Digit6', ['-', '6', '|', ''], '6'); + verifyEntry(mapping, 'Digit7', ['è', '7', '`', ''], '7'); + verifyEntry(mapping, 'Digit8', ['_', '8', r'\', ''], '8'); + verifyEntry(mapping, 'Digit9', ['ç', '9', '^', ''], '9'); + verifyEntry(mapping, 'KeyA', ['q', 'Q', '', ''], 'Q'); + verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 'B'); + verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 'C'); + verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 'D'); + verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 'E'); + verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 'F'); + verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 'G'); + verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 'H'); + verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 'I'); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 'J'); + verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 'K'); + verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 'L'); + verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 'N'); + verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 'O'); + verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 'P'); + verifyEntry(mapping, 'KeyQ', ['a', 'A', '', ''], 'A'); + verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 'R'); + verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 'S'); + verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 'T'); + verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 'U'); + verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 'V'); + verifyEntry(mapping, 'KeyW', ['z', 'Z', '', ''], 'Z'); + verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 'X'); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 'Y'); + verifyEntry(mapping, 'KeyZ', ['w', 'W', '', ''], 'W'); + verifyEntry(mapping, 'Semicolon', ['m', 'M', '', ''], 'M'); + }); group('hu', () { - verifyEntry(mapping, 'Backquote', ['0', '§', '', ''], 0x30); - verifyEntry(mapping, 'Digit1', ['1', "'", '~', ''], 0x31); - verifyEntry(mapping, 'Digit2', ['2', '"', 'ˇ', ''], 0x32); - verifyEntry(mapping, 'Digit3', ['3', '+', '^', ''], 0x33); - verifyEntry(mapping, 'Digit4', ['4', '!', '˘', ''], 0x34); - verifyEntry(mapping, 'Digit5', ['5', '%', '°', ''], 0x35); - verifyEntry(mapping, 'Digit6', ['6', '/', '˛', ''], 0x36); - verifyEntry(mapping, 'Digit7', ['7', '=', '`', ''], 0x37); - verifyEntry(mapping, 'Digit8', ['8', '(', '˙', ''], 0x38); - verifyEntry(mapping, 'Digit9', ['9', ')', '´', ''], 0x39); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'ä', ''], 0x41); - verifyEntry(mapping, 'KeyB', ['b', 'B', '{', ''], 0x42); - verifyEntry(mapping, 'KeyC', ['c', 'C', '&', ''], 0x43); - verifyEntry(mapping, 'KeyD', ['d', 'D', 'Đ', ''], 0x44); - verifyEntry(mapping, 'KeyE', ['e', 'E', 'Ä', ''], 0x45); - verifyEntry(mapping, 'KeyF', ['f', 'F', '[', ''], 0x46); - verifyEntry(mapping, 'KeyG', ['g', 'G', ']', ''], 0x47); - verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 0x48); - verifyEntry(mapping, 'KeyI', ['i', 'I', 'Í', ''], 0x49); - verifyEntry(mapping, 'KeyJ', ['j', 'J', 'í', ''], 0x4a); - verifyEntry(mapping, 'KeyK', ['k', 'K', 'ł', ''], 0x4b); - verifyEntry(mapping, 'KeyL', ['l', 'L', 'Ł', ''], 0x4c); - verifyEntry(mapping, 'KeyM', ['m', 'M', '<', ''], 0x4d); - verifyEntry(mapping, 'KeyN', ['n', 'N', '}', ''], 0x4e); - verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 0x4f); - verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 0x50); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', r'\', ''], 0x51); - verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 0x52); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'đ', ''], 0x53); - verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 0x54); - verifyEntry(mapping, 'KeyU', ['u', 'U', '€', ''], 0x55); - verifyEntry(mapping, 'KeyV', ['v', 'V', '@', ''], 0x56); - verifyEntry(mapping, 'KeyW', ['w', 'W', '|', ''], 0x57); - verifyEntry(mapping, 'KeyX', ['x', 'X', '#', ''], 0x58); - verifyEntry(mapping, 'KeyY', ['z', 'Z', '', ''], 0x5a); - verifyEntry(mapping, 'KeyZ', ['y', 'Y', '>', ''], 0x59); -}); + verifyEntry(mapping, 'Backquote', ['0', '§', '', ''], '0'); + verifyEntry(mapping, 'Digit1', ['1', "'", '~', ''], '1'); + verifyEntry(mapping, 'Digit2', ['2', '"', 'ˇ', ''], '2'); + verifyEntry(mapping, 'Digit3', ['3', '+', '^', ''], '3'); + verifyEntry(mapping, 'Digit4', ['4', '!', '˘', ''], '4'); + verifyEntry(mapping, 'Digit5', ['5', '%', '°', ''], '5'); + verifyEntry(mapping, 'Digit6', ['6', '/', '˛', ''], '6'); + verifyEntry(mapping, 'Digit7', ['7', '=', '`', ''], '7'); + verifyEntry(mapping, 'Digit8', ['8', '(', '˙', ''], '8'); + verifyEntry(mapping, 'Digit9', ['9', ')', '´', ''], '9'); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'ä', ''], 'A'); + verifyEntry(mapping, 'KeyB', ['b', 'B', '{', ''], 'B'); + verifyEntry(mapping, 'KeyC', ['c', 'C', '&', ''], 'C'); + verifyEntry(mapping, 'KeyD', ['d', 'D', 'Đ', ''], 'D'); + verifyEntry(mapping, 'KeyE', ['e', 'E', 'Ä', ''], 'E'); + verifyEntry(mapping, 'KeyF', ['f', 'F', '[', ''], 'F'); + verifyEntry(mapping, 'KeyG', ['g', 'G', ']', ''], 'G'); + verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 'H'); + verifyEntry(mapping, 'KeyI', ['i', 'I', 'Í', ''], 'I'); + verifyEntry(mapping, 'KeyJ', ['j', 'J', 'í', ''], 'J'); + verifyEntry(mapping, 'KeyK', ['k', 'K', 'ł', ''], 'K'); + verifyEntry(mapping, 'KeyL', ['l', 'L', 'Ł', ''], 'L'); + verifyEntry(mapping, 'KeyM', ['m', 'M', '<', ''], 'M'); + verifyEntry(mapping, 'KeyN', ['n', 'N', '}', ''], 'N'); + verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 'O'); + verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 'P'); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', r'\', ''], 'Q'); + verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 'R'); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'đ', ''], 'S'); + verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 'T'); + verifyEntry(mapping, 'KeyU', ['u', 'U', '€', ''], 'U'); + verifyEntry(mapping, 'KeyV', ['v', 'V', '@', ''], 'V'); + verifyEntry(mapping, 'KeyW', ['w', 'W', '|', ''], 'W'); + verifyEntry(mapping, 'KeyX', ['x', 'X', '#', ''], 'X'); + verifyEntry(mapping, 'KeyY', ['z', 'Z', '', ''], 'Z'); + verifyEntry(mapping, 'KeyZ', ['y', 'Y', '>', ''], 'Y'); + }); group('it', () { - verifyEntry(mapping, 'Digit0', ['0', '=', '', ''], 0x30); - verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], 0x31); - verifyEntry(mapping, 'Digit2', ['2', '"', '', ''], 0x32); - verifyEntry(mapping, 'Digit3', ['3', '£', '', ''], 0x33); - verifyEntry(mapping, 'Digit4', ['4', r'$', '', ''], 0x34); - verifyEntry(mapping, 'Digit5', ['5', '%', '€', ''], 0x35); - verifyEntry(mapping, 'Digit6', ['6', '&', '', ''], 0x36); - verifyEntry(mapping, 'Digit7', ['7', '/', '', ''], 0x37); - verifyEntry(mapping, 'Digit8', ['8', '(', '', ''], 0x38); - verifyEntry(mapping, 'Digit9', ['9', ')', '', ''], 0x39); - verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 0x41); - verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 0x42); - verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 0x43); - verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 0x44); - verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 0x45); - verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 0x46); - verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 0x47); - verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 0x48); - verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 0x49); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 0x4a); - verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 0x4b); - verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 0x4c); - verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 0x4d); - verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 0x4e); - verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 0x4f); - verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 0x50); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 0x51); - verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 0x52); - verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 0x53); - verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 0x54); - verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 0x55); - verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 0x56); - verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 0x57); - verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 0x58); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 0x59); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 0x5a); -}); + verifyEntry(mapping, 'Digit0', ['0', '=', '', ''], '0'); + verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], '1'); + verifyEntry(mapping, 'Digit2', ['2', '"', '', ''], '2'); + verifyEntry(mapping, 'Digit3', ['3', '£', '', ''], '3'); + verifyEntry(mapping, 'Digit4', ['4', r'$', '', ''], '4'); + verifyEntry(mapping, 'Digit5', ['5', '%', '€', ''], '5'); + verifyEntry(mapping, 'Digit6', ['6', '&', '', ''], '6'); + verifyEntry(mapping, 'Digit7', ['7', '/', '', ''], '7'); + verifyEntry(mapping, 'Digit8', ['8', '(', '', ''], '8'); + verifyEntry(mapping, 'Digit9', ['9', ')', '', ''], '9'); + verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 'A'); + verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 'B'); + verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 'C'); + verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 'D'); + verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 'E'); + verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 'F'); + verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 'G'); + verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 'H'); + verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 'I'); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 'J'); + verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 'K'); + verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 'L'); + verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 'M'); + verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 'N'); + verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 'O'); + verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 'P'); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 'Q'); + verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 'R'); + verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 'S'); + verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 'T'); + verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 'U'); + verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 'V'); + verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 'W'); + verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 'X'); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 'Y'); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 'Z'); + }); group('no', () { - verifyEntry(mapping, 'Digit0', ['0', '=', '}', ''], 0x30); - verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], 0x31); - verifyEntry(mapping, 'Digit2', ['2', '"', '@', ''], 0x32); - verifyEntry(mapping, 'Digit3', ['3', '#', '£', ''], 0x33); - verifyEntry(mapping, 'Digit4', ['4', '¤', r'$', ''], 0x34); - verifyEntry(mapping, 'Digit5', ['5', '%', '€', ''], 0x35); - verifyEntry(mapping, 'Digit6', ['6', '&', '', ''], 0x36); - verifyEntry(mapping, 'Digit7', ['7', '/', '{', ''], 0x37); - verifyEntry(mapping, 'Digit8', ['8', '(', '[', ''], 0x38); - verifyEntry(mapping, 'Digit9', ['9', ')', ']', ''], 0x39); - verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 0x41); - verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 0x42); - verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 0x43); - verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 0x44); - verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 0x45); - verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 0x46); - verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 0x47); - verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 0x48); - verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 0x49); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 0x4a); - verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 0x4b); - verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 0x4c); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', ''], 0x4d); - verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 0x4e); - verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 0x4f); - verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 0x50); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 0x51); - verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 0x52); - verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 0x53); - verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 0x54); - verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 0x55); - verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 0x56); - verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 0x57); - verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 0x58); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 0x59); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 0x5a); -}); + verifyEntry(mapping, 'Digit0', ['0', '=', '}', ''], '0'); + verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], '1'); + verifyEntry(mapping, 'Digit2', ['2', '"', '@', ''], '2'); + verifyEntry(mapping, 'Digit3', ['3', '#', '£', ''], '3'); + verifyEntry(mapping, 'Digit4', ['4', '¤', r'$', ''], '4'); + verifyEntry(mapping, 'Digit5', ['5', '%', '€', ''], '5'); + verifyEntry(mapping, 'Digit6', ['6', '&', '', ''], '6'); + verifyEntry(mapping, 'Digit7', ['7', '/', '{', ''], '7'); + verifyEntry(mapping, 'Digit8', ['8', '(', '[', ''], '8'); + verifyEntry(mapping, 'Digit9', ['9', ')', ']', ''], '9'); + verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 'A'); + verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 'B'); + verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 'C'); + verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 'D'); + verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 'E'); + verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 'F'); + verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 'G'); + verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 'H'); + verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 'I'); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 'J'); + verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 'K'); + verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 'L'); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', ''], 'M'); + verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 'N'); + verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 'O'); + verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 'P'); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 'Q'); + verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 'R'); + verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 'S'); + verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 'T'); + verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 'U'); + verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 'V'); + verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 'W'); + verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 'X'); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 'Y'); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 'Z'); + }); group('pl', () { - verifyEntry(mapping, 'Digit0', ['0', ')', '', ''], 0x30); - verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], 0x31); - verifyEntry(mapping, 'Digit2', ['2', '@', '', ''], 0x32); - verifyEntry(mapping, 'Digit3', ['3', '#', '', ''], 0x33); - verifyEntry(mapping, 'Digit4', ['4', r'$', '', ''], 0x34); - verifyEntry(mapping, 'Digit5', ['5', '%', '', ''], 0x35); - verifyEntry(mapping, 'Digit6', ['6', '^', '', ''], 0x36); - verifyEntry(mapping, 'Digit7', ['7', '&', '', ''], 0x37); - verifyEntry(mapping, 'Digit8', ['8', '*', '', ''], 0x38); - verifyEntry(mapping, 'Digit9', ['9', '(', '', ''], 0x39); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'ą', 'Ą'], 0x41); - verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 0x42); - verifyEntry(mapping, 'KeyC', ['c', 'C', 'ć', 'Ć'], 0x43); - verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 0x44); - verifyEntry(mapping, 'KeyE', ['e', 'E', 'ę', 'Ę'], 0x45); - verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 0x46); - verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 0x47); - verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 0x48); - verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 0x49); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 0x4a); - verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 0x4b); - verifyEntry(mapping, 'KeyL', ['l', 'L', 'ł', 'Ł'], 0x4c); - verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 0x4d); - verifyEntry(mapping, 'KeyN', ['n', 'N', 'ń', 'Ń'], 0x4e); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'ó', 'Ó'], 0x4f); - verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 0x50); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 0x51); - verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 0x52); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'ś', 'Ś'], 0x53); - verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 0x54); - verifyEntry(mapping, 'KeyU', ['u', 'U', '€', ''], 0x55); - verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 0x56); - verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 0x57); - verifyEntry(mapping, 'KeyX', ['x', 'X', 'ź', 'Ź'], 0x58); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 0x59); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'ż', 'Ż'], 0x5a); -}); + verifyEntry(mapping, 'Digit0', ['0', ')', '', ''], '0'); + verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], '1'); + verifyEntry(mapping, 'Digit2', ['2', '@', '', ''], '2'); + verifyEntry(mapping, 'Digit3', ['3', '#', '', ''], '3'); + verifyEntry(mapping, 'Digit4', ['4', r'$', '', ''], '4'); + verifyEntry(mapping, 'Digit5', ['5', '%', '', ''], '5'); + verifyEntry(mapping, 'Digit6', ['6', '^', '', ''], '6'); + verifyEntry(mapping, 'Digit7', ['7', '&', '', ''], '7'); + verifyEntry(mapping, 'Digit8', ['8', '*', '', ''], '8'); + verifyEntry(mapping, 'Digit9', ['9', '(', '', ''], '9'); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'ą', 'Ą'], 'A'); + verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 'B'); + verifyEntry(mapping, 'KeyC', ['c', 'C', 'ć', 'Ć'], 'C'); + verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 'D'); + verifyEntry(mapping, 'KeyE', ['e', 'E', 'ę', 'Ę'], 'E'); + verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 'F'); + verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 'G'); + verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 'H'); + verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 'I'); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 'J'); + verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 'K'); + verifyEntry(mapping, 'KeyL', ['l', 'L', 'ł', 'Ł'], 'L'); + verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 'M'); + verifyEntry(mapping, 'KeyN', ['n', 'N', 'ń', 'Ń'], 'N'); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'ó', 'Ó'], 'O'); + verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 'P'); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 'Q'); + verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 'R'); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'ś', 'Ś'], 'S'); + verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 'T'); + verifyEntry(mapping, 'KeyU', ['u', 'U', '€', ''], 'U'); + verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 'V'); + verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 'W'); + verifyEntry(mapping, 'KeyX', ['x', 'X', 'ź', 'Ź'], 'X'); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 'Y'); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'ż', 'Ż'], 'Z'); + }); group('pt', () { - verifyEntry(mapping, 'Digit0', ['0', '=', '}', ''], 0x30); - verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], 0x31); - verifyEntry(mapping, 'Digit2', ['2', '"', '@', ''], 0x32); - verifyEntry(mapping, 'Digit3', ['3', '#', '£', ''], 0x33); - verifyEntry(mapping, 'Digit4', ['4', r'$', '§', ''], 0x34); - verifyEntry(mapping, 'Digit5', ['5', '%', '€', ''], 0x35); - verifyEntry(mapping, 'Digit6', ['6', '&', '', ''], 0x36); - verifyEntry(mapping, 'Digit7', ['7', '/', '{', ''], 0x37); - verifyEntry(mapping, 'Digit8', ['8', '(', '[', ''], 0x38); - verifyEntry(mapping, 'Digit9', ['9', ')', ']', ''], 0x39); - verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 0x41); - verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 0x42); - verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 0x43); - verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 0x44); - verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 0x45); - verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 0x46); - verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 0x47); - verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 0x48); - verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 0x49); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 0x4a); - verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 0x4b); - verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 0x4c); - verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 0x4d); - verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 0x4e); - verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 0x4f); - verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 0x50); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 0x51); - verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 0x52); - verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 0x53); - verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 0x54); - verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 0x55); - verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 0x56); - verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 0x57); - verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 0x58); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 0x59); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 0x5a); -}); + verifyEntry(mapping, 'Digit0', ['0', '=', '}', ''], '0'); + verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], '1'); + verifyEntry(mapping, 'Digit2', ['2', '"', '@', ''], '2'); + verifyEntry(mapping, 'Digit3', ['3', '#', '£', ''], '3'); + verifyEntry(mapping, 'Digit4', ['4', r'$', '§', ''], '4'); + verifyEntry(mapping, 'Digit5', ['5', '%', '€', ''], '5'); + verifyEntry(mapping, 'Digit6', ['6', '&', '', ''], '6'); + verifyEntry(mapping, 'Digit7', ['7', '/', '{', ''], '7'); + verifyEntry(mapping, 'Digit8', ['8', '(', '[', ''], '8'); + verifyEntry(mapping, 'Digit9', ['9', ')', ']', ''], '9'); + verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 'A'); + verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 'B'); + verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 'C'); + verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 'D'); + verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 'E'); + verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 'F'); + verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 'G'); + verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 'H'); + verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 'I'); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 'J'); + verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 'K'); + verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 'L'); + verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 'M'); + verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 'N'); + verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 'O'); + verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 'P'); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 'Q'); + verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 'R'); + verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 'S'); + verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 'T'); + verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 'U'); + verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 'V'); + verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 'W'); + verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 'X'); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 'Y'); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 'Z'); + }); group('pt-br', () { - verifyEntry(mapping, 'Digit0', ['0', ')', '', ''], 0x30); - verifyEntry(mapping, 'Digit1', ['1', '!', '¹', ''], 0x31); - verifyEntry(mapping, 'Digit2', ['2', '@', '²', ''], 0x32); - verifyEntry(mapping, 'Digit3', ['3', '#', '³', ''], 0x33); - verifyEntry(mapping, 'Digit4', ['4', r'$', '£', ''], 0x34); - verifyEntry(mapping, 'Digit5', ['5', '%', '¢', ''], 0x35); - verifyEntry(mapping, 'Digit6', ['6', '¨', '¬', ''], 0x36); - verifyEntry(mapping, 'Digit7', ['7', '&', '', ''], 0x37); - verifyEntry(mapping, 'Digit8', ['8', '*', '', ''], 0x38); - verifyEntry(mapping, 'Digit9', ['9', '(', '', ''], 0x39); - verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 0x41); - verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 0x42); - verifyEntry(mapping, 'KeyC', ['c', 'C', '₢', ''], 0x43); - verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 0x44); - verifyEntry(mapping, 'KeyE', ['e', 'E', '°', ''], 0x45); - verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 0x46); - verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 0x47); - verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 0x48); - verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 0x49); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 0x4a); - verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 0x4b); - verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 0x4c); - verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 0x4d); - verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 0x4e); - verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 0x4f); - verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 0x50); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', '/', ''], 0x51); - verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 0x52); - verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 0x53); - verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 0x54); - verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 0x55); - verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 0x56); - verifyEntry(mapping, 'KeyW', ['w', 'W', '?', ''], 0x57); - verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 0x58); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 0x59); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 0x5a); -}); + verifyEntry(mapping, 'Digit0', ['0', ')', '', ''], '0'); + verifyEntry(mapping, 'Digit1', ['1', '!', '¹', ''], '1'); + verifyEntry(mapping, 'Digit2', ['2', '@', '²', ''], '2'); + verifyEntry(mapping, 'Digit3', ['3', '#', '³', ''], '3'); + verifyEntry(mapping, 'Digit4', ['4', r'$', '£', ''], '4'); + verifyEntry(mapping, 'Digit5', ['5', '%', '¢', ''], '5'); + verifyEntry(mapping, 'Digit6', ['6', '¨', '¬', ''], '6'); + verifyEntry(mapping, 'Digit7', ['7', '&', '', ''], '7'); + verifyEntry(mapping, 'Digit8', ['8', '*', '', ''], '8'); + verifyEntry(mapping, 'Digit9', ['9', '(', '', ''], '9'); + verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 'A'); + verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 'B'); + verifyEntry(mapping, 'KeyC', ['c', 'C', '₢', ''], 'C'); + verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 'D'); + verifyEntry(mapping, 'KeyE', ['e', 'E', '°', ''], 'E'); + verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 'F'); + verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 'G'); + verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 'H'); + verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 'I'); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 'J'); + verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 'K'); + verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 'L'); + verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 'M'); + verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 'N'); + verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 'O'); + verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 'P'); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', '/', ''], 'Q'); + verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 'R'); + verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 'S'); + verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 'T'); + verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 'U'); + verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 'V'); + verifyEntry(mapping, 'KeyW', ['w', 'W', '?', ''], 'W'); + verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 'X'); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 'Y'); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 'Z'); + }); group('ru', () { - verifyEntry(mapping, 'Digit0', ['0', ')', '', ''], 0x30); - verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], 0x31); - verifyEntry(mapping, 'Digit2', ['2', '"', '', ''], 0x32); - verifyEntry(mapping, 'Digit3', ['3', '№', '', ''], 0x33); - verifyEntry(mapping, 'Digit4', ['4', ';', '', ''], 0x34); - verifyEntry(mapping, 'Digit5', ['5', '%', '', ''], 0x35); - verifyEntry(mapping, 'Digit6', ['6', ':', '', ''], 0x36); - verifyEntry(mapping, 'Digit7', ['7', '?', '', ''], 0x37); - verifyEntry(mapping, 'Digit8', ['8', '*', '₽', ''], 0x38); - verifyEntry(mapping, 'Digit9', ['9', '(', '', ''], 0x39); - verifyEntry(mapping, 'KeyA', ['ф', 'Ф', '', ''], 0x41); - verifyEntry(mapping, 'KeyB', ['и', 'И', '', ''], 0x42); - verifyEntry(mapping, 'KeyC', ['с', 'С', '', ''], 0x43); - verifyEntry(mapping, 'KeyD', ['в', 'В', '', ''], 0x44); - verifyEntry(mapping, 'KeyE', ['у', 'У', '', ''], 0x45); - verifyEntry(mapping, 'KeyF', ['а', 'А', '', ''], 0x46); - verifyEntry(mapping, 'KeyG', ['п', 'П', '', ''], 0x47); - verifyEntry(mapping, 'KeyH', ['р', 'Р', '', ''], 0x48); - verifyEntry(mapping, 'KeyI', ['ш', 'Ш', '', ''], 0x49); - verifyEntry(mapping, 'KeyJ', ['о', 'О', '', ''], 0x4a); - verifyEntry(mapping, 'KeyK', ['л', 'Л', '', ''], 0x4b); - verifyEntry(mapping, 'KeyL', ['д', 'Д', '', ''], 0x4c); - verifyEntry(mapping, 'KeyM', ['ь', 'Ь', '', ''], 0x4d); - verifyEntry(mapping, 'KeyN', ['т', 'Т', '', ''], 0x4e); - verifyEntry(mapping, 'KeyO', ['щ', 'Щ', '', ''], 0x4f); - verifyEntry(mapping, 'KeyP', ['з', 'З', '', ''], 0x50); - verifyEntry(mapping, 'KeyQ', ['й', 'Й', '', ''], 0x51); - verifyEntry(mapping, 'KeyR', ['к', 'К', '', ''], 0x52); - verifyEntry(mapping, 'KeyS', ['ы', 'Ы', '', ''], 0x53); - verifyEntry(mapping, 'KeyT', ['е', 'Е', '', ''], 0x54); - verifyEntry(mapping, 'KeyU', ['г', 'Г', '', ''], 0x55); - verifyEntry(mapping, 'KeyV', ['м', 'М', '', ''], 0x56); - verifyEntry(mapping, 'KeyW', ['ц', 'Ц', '', ''], 0x57); - verifyEntry(mapping, 'KeyX', ['ч', 'Ч', '', ''], 0x58); - verifyEntry(mapping, 'KeyY', ['н', 'Н', '', ''], 0x59); - verifyEntry(mapping, 'KeyZ', ['я', 'Я', '', ''], 0x5a); -}); + verifyEntry(mapping, 'Digit0', ['0', ')', '', ''], '0'); + verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], '1'); + verifyEntry(mapping, 'Digit2', ['2', '"', '', ''], '2'); + verifyEntry(mapping, 'Digit3', ['3', '№', '', ''], '3'); + verifyEntry(mapping, 'Digit4', ['4', ';', '', ''], '4'); + verifyEntry(mapping, 'Digit5', ['5', '%', '', ''], '5'); + verifyEntry(mapping, 'Digit6', ['6', ':', '', ''], '6'); + verifyEntry(mapping, 'Digit7', ['7', '?', '', ''], '7'); + verifyEntry(mapping, 'Digit8', ['8', '*', '₽', ''], '8'); + verifyEntry(mapping, 'Digit9', ['9', '(', '', ''], '9'); + verifyEntry(mapping, 'KeyA', ['ф', 'Ф', '', ''], 'A'); + verifyEntry(mapping, 'KeyB', ['и', 'И', '', ''], 'B'); + verifyEntry(mapping, 'KeyC', ['с', 'С', '', ''], 'C'); + verifyEntry(mapping, 'KeyD', ['в', 'В', '', ''], 'D'); + verifyEntry(mapping, 'KeyE', ['у', 'У', '', ''], 'E'); + verifyEntry(mapping, 'KeyF', ['а', 'А', '', ''], 'F'); + verifyEntry(mapping, 'KeyG', ['п', 'П', '', ''], 'G'); + verifyEntry(mapping, 'KeyH', ['р', 'Р', '', ''], 'H'); + verifyEntry(mapping, 'KeyI', ['ш', 'Ш', '', ''], 'I'); + verifyEntry(mapping, 'KeyJ', ['о', 'О', '', ''], 'J'); + verifyEntry(mapping, 'KeyK', ['л', 'Л', '', ''], 'K'); + verifyEntry(mapping, 'KeyL', ['д', 'Д', '', ''], 'L'); + verifyEntry(mapping, 'KeyM', ['ь', 'Ь', '', ''], 'M'); + verifyEntry(mapping, 'KeyN', ['т', 'Т', '', ''], 'N'); + verifyEntry(mapping, 'KeyO', ['щ', 'Щ', '', ''], 'O'); + verifyEntry(mapping, 'KeyP', ['з', 'З', '', ''], 'P'); + verifyEntry(mapping, 'KeyQ', ['й', 'Й', '', ''], 'Q'); + verifyEntry(mapping, 'KeyR', ['к', 'К', '', ''], 'R'); + verifyEntry(mapping, 'KeyS', ['ы', 'Ы', '', ''], 'S'); + verifyEntry(mapping, 'KeyT', ['е', 'Е', '', ''], 'T'); + verifyEntry(mapping, 'KeyU', ['г', 'Г', '', ''], 'U'); + verifyEntry(mapping, 'KeyV', ['м', 'М', '', ''], 'V'); + verifyEntry(mapping, 'KeyW', ['ц', 'Ц', '', ''], 'W'); + verifyEntry(mapping, 'KeyX', ['ч', 'Ч', '', ''], 'X'); + verifyEntry(mapping, 'KeyY', ['н', 'Н', '', ''], 'Y'); + verifyEntry(mapping, 'KeyZ', ['я', 'Я', '', ''], 'Z'); + }); group('sv', () { - verifyEntry(mapping, 'Digit0', ['0', '=', '}', ''], 0x30); - verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], 0x31); - verifyEntry(mapping, 'Digit2', ['2', '"', '@', ''], 0x32); - verifyEntry(mapping, 'Digit3', ['3', '#', '£', ''], 0x33); - verifyEntry(mapping, 'Digit4', ['4', '¤', r'$', ''], 0x34); - verifyEntry(mapping, 'Digit5', ['5', '%', '€', ''], 0x35); - verifyEntry(mapping, 'Digit6', ['6', '&', '', ''], 0x36); - verifyEntry(mapping, 'Digit7', ['7', '/', '{', ''], 0x37); - verifyEntry(mapping, 'Digit8', ['8', '(', '[', ''], 0x38); - verifyEntry(mapping, 'Digit9', ['9', ')', ']', ''], 0x39); - verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 0x41); - verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 0x42); - verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 0x43); - verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 0x44); - verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 0x45); - verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 0x46); - verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 0x47); - verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 0x48); - verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 0x49); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 0x4a); - verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 0x4b); - verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 0x4c); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', ''], 0x4d); - verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 0x4e); - verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 0x4f); - verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 0x50); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 0x51); - verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 0x52); - verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 0x53); - verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 0x54); - verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 0x55); - verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 0x56); - verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 0x57); - verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 0x58); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 0x59); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 0x5a); -}); + verifyEntry(mapping, 'Digit0', ['0', '=', '}', ''], '0'); + verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], '1'); + verifyEntry(mapping, 'Digit2', ['2', '"', '@', ''], '2'); + verifyEntry(mapping, 'Digit3', ['3', '#', '£', ''], '3'); + verifyEntry(mapping, 'Digit4', ['4', '¤', r'$', ''], '4'); + verifyEntry(mapping, 'Digit5', ['5', '%', '€', ''], '5'); + verifyEntry(mapping, 'Digit6', ['6', '&', '', ''], '6'); + verifyEntry(mapping, 'Digit7', ['7', '/', '{', ''], '7'); + verifyEntry(mapping, 'Digit8', ['8', '(', '[', ''], '8'); + verifyEntry(mapping, 'Digit9', ['9', ')', ']', ''], '9'); + verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 'A'); + verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 'B'); + verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 'C'); + verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 'D'); + verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 'E'); + verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 'F'); + verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 'G'); + verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 'H'); + verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 'I'); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 'J'); + verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 'K'); + verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 'L'); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', ''], 'M'); + verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 'N'); + verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 'O'); + verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 'P'); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 'Q'); + verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 'R'); + verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 'S'); + verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 'T'); + verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 'U'); + verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 'V'); + verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 'W'); + verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 'X'); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 'Y'); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 'Z'); + }); group('thai', () { - verifyEntry(mapping, 'Digit0', ['จ', '๗', '', ''], 0x30); - verifyEntry(mapping, 'Digit1', ['ๅ', '+', '', ''], 0x31); - verifyEntry(mapping, 'Digit2', ['/', '๑', '', ''], 0x32); - verifyEntry(mapping, 'Digit3', ['-', '๒', '', ''], 0x33); - verifyEntry(mapping, 'Digit4', ['ภ', '๓', '', ''], 0x34); - verifyEntry(mapping, 'Digit5', ['ถ', '๔', '', ''], 0x35); - verifyEntry(mapping, 'Digit6', ['ุ', 'ู', '', ''], 0x36); - verifyEntry(mapping, 'Digit7', ['ึ', '฿', '', ''], 0x37); - verifyEntry(mapping, 'Digit8', ['ค', '๕', '', ''], 0x38); - verifyEntry(mapping, 'Digit9', ['ต', '๖', '', ''], 0x39); - verifyEntry(mapping, 'KeyA', ['ฟ', 'ฤ', '', ''], 0x41); - verifyEntry(mapping, 'KeyB', ['ิ', 'ฺ', '', ''], 0x42); - verifyEntry(mapping, 'KeyC', ['แ', 'ฉ', '', ''], 0x43); - verifyEntry(mapping, 'KeyD', ['ก', 'ฏ', '', ''], 0x44); - verifyEntry(mapping, 'KeyE', ['ำ', 'ฎ', '', ''], 0x45); - verifyEntry(mapping, 'KeyF', ['ด', 'โ', '', ''], 0x46); - verifyEntry(mapping, 'KeyG', ['เ', 'ฌ', '', ''], 0x47); - verifyEntry(mapping, 'KeyH', ['้', '็', '', ''], 0x48); - verifyEntry(mapping, 'KeyI', ['ร', 'ณ', '', ''], 0x49); - verifyEntry(mapping, 'KeyJ', ['่', '๋', '', ''], 0x4a); - verifyEntry(mapping, 'KeyK', ['า', 'ษ', '', ''], 0x4b); - verifyEntry(mapping, 'KeyL', ['ส', 'ศ', '', ''], 0x4c); - verifyEntry(mapping, 'KeyM', ['ท', '?', '', ''], 0x4d); - verifyEntry(mapping, 'KeyN', ['ื', '์', '', ''], 0x4e); - verifyEntry(mapping, 'KeyO', ['น', 'ฯ', '', ''], 0x4f); - verifyEntry(mapping, 'KeyP', ['ย', 'ญ', '', ''], 0x50); - verifyEntry(mapping, 'KeyQ', ['ๆ', '๐', '', ''], 0x51); - verifyEntry(mapping, 'KeyR', ['พ', 'ฑ', '', ''], 0x52); - verifyEntry(mapping, 'KeyS', ['ห', 'ฆ', '', ''], 0x53); - verifyEntry(mapping, 'KeyT', ['ะ', 'ธ', '', ''], 0x54); - verifyEntry(mapping, 'KeyU', ['ี', '๊', '', ''], 0x55); - verifyEntry(mapping, 'KeyV', ['อ', 'ฮ', '', ''], 0x56); - verifyEntry(mapping, 'KeyW', ['ไ', '"', '', ''], 0x57); - verifyEntry(mapping, 'KeyX', ['ป', ')', '', ''], 0x58); - verifyEntry(mapping, 'KeyY', ['ั', 'ํ', '', ''], 0x59); - verifyEntry(mapping, 'KeyZ', ['ผ', '(', '', ''], 0x5a); -}); + verifyEntry(mapping, 'Digit0', ['จ', '๗', '', ''], '0'); + verifyEntry(mapping, 'Digit1', ['ๅ', '+', '', ''], '1'); + verifyEntry(mapping, 'Digit2', ['/', '๑', '', ''], '2'); + verifyEntry(mapping, 'Digit3', ['-', '๒', '', ''], '3'); + verifyEntry(mapping, 'Digit4', ['ภ', '๓', '', ''], '4'); + verifyEntry(mapping, 'Digit5', ['ถ', '๔', '', ''], '5'); + verifyEntry(mapping, 'Digit6', ['ุ', 'ู', '', ''], '6'); + verifyEntry(mapping, 'Digit7', ['ึ', '฿', '', ''], '7'); + verifyEntry(mapping, 'Digit8', ['ค', '๕', '', ''], '8'); + verifyEntry(mapping, 'Digit9', ['ต', '๖', '', ''], '9'); + verifyEntry(mapping, 'KeyA', ['ฟ', 'ฤ', '', ''], 'A'); + verifyEntry(mapping, 'KeyB', ['ิ', 'ฺ', '', ''], 'B'); + verifyEntry(mapping, 'KeyC', ['แ', 'ฉ', '', ''], 'C'); + verifyEntry(mapping, 'KeyD', ['ก', 'ฏ', '', ''], 'D'); + verifyEntry(mapping, 'KeyE', ['ำ', 'ฎ', '', ''], 'E'); + verifyEntry(mapping, 'KeyF', ['ด', 'โ', '', ''], 'F'); + verifyEntry(mapping, 'KeyG', ['เ', 'ฌ', '', ''], 'G'); + verifyEntry(mapping, 'KeyH', ['้', '็', '', ''], 'H'); + verifyEntry(mapping, 'KeyI', ['ร', 'ณ', '', ''], 'I'); + verifyEntry(mapping, 'KeyJ', ['่', '๋', '', ''], 'J'); + verifyEntry(mapping, 'KeyK', ['า', 'ษ', '', ''], 'K'); + verifyEntry(mapping, 'KeyL', ['ส', 'ศ', '', ''], 'L'); + verifyEntry(mapping, 'KeyM', ['ท', '?', '', ''], 'M'); + verifyEntry(mapping, 'KeyN', ['ื', '์', '', ''], 'N'); + verifyEntry(mapping, 'KeyO', ['น', 'ฯ', '', ''], 'O'); + verifyEntry(mapping, 'KeyP', ['ย', 'ญ', '', ''], 'P'); + verifyEntry(mapping, 'KeyQ', ['ๆ', '๐', '', ''], 'Q'); + verifyEntry(mapping, 'KeyR', ['พ', 'ฑ', '', ''], 'R'); + verifyEntry(mapping, 'KeyS', ['ห', 'ฆ', '', ''], 'S'); + verifyEntry(mapping, 'KeyT', ['ะ', 'ธ', '', ''], 'T'); + verifyEntry(mapping, 'KeyU', ['ี', '๊', '', ''], 'U'); + verifyEntry(mapping, 'KeyV', ['อ', 'ฮ', '', ''], 'V'); + verifyEntry(mapping, 'KeyW', ['ไ', '"', '', ''], 'W'); + verifyEntry(mapping, 'KeyX', ['ป', ')', '', ''], 'X'); + verifyEntry(mapping, 'KeyY', ['ั', 'ํ', '', ''], 'Y'); + verifyEntry(mapping, 'KeyZ', ['ผ', '(', '', ''], 'Z'); + }); group('tr', () { - verifyEntry(mapping, 'Digit0', ['0', '=', '}', ''], 0x30); - verifyEntry(mapping, 'Digit1', ['1', '!', '>', ''], 0x31); - verifyEntry(mapping, 'Digit2', ['2', "'", '£', ''], 0x32); - verifyEntry(mapping, 'Digit3', ['3', '^', '#', ''], 0x33); - verifyEntry(mapping, 'Digit4', ['4', '+', r'$', ''], 0x34); - verifyEntry(mapping, 'Digit5', ['5', '%', '½', ''], 0x35); - verifyEntry(mapping, 'Digit6', ['6', '&', '', ''], 0x36); - verifyEntry(mapping, 'Digit7', ['7', '/', '{', ''], 0x37); - verifyEntry(mapping, 'Digit8', ['8', '(', '[', ''], 0x38); - verifyEntry(mapping, 'Digit9', ['9', ')', ']', ''], 0x39); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'æ', 'Æ'], 0x41); - verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 0x42); - verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 0x43); - verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 0x44); - verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 0x45); - verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 0x46); - verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 0x47); - verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 0x48); - verifyEntry(mapping, 'KeyI', ['ı', 'I', 'i', 'İ'], 0x49); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 0x4a); - verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 0x4b); - verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 0x4c); - verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 0x4d); - verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 0x4e); - verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 0x4f); - verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 0x50); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', '@', ''], 0x51); - verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 0x52); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', ''], 0x53); - verifyEntry(mapping, 'KeyT', ['t', 'T', '₺', ''], 0x54); - verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 0x55); - verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 0x56); - verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 0x57); - verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 0x58); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 0x59); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 0x5a); -}); + verifyEntry(mapping, 'Digit0', ['0', '=', '}', ''], '0'); + verifyEntry(mapping, 'Digit1', ['1', '!', '>', ''], '1'); + verifyEntry(mapping, 'Digit2', ['2', "'", '£', ''], '2'); + verifyEntry(mapping, 'Digit3', ['3', '^', '#', ''], '3'); + verifyEntry(mapping, 'Digit4', ['4', '+', r'$', ''], '4'); + verifyEntry(mapping, 'Digit5', ['5', '%', '½', ''], '5'); + verifyEntry(mapping, 'Digit6', ['6', '&', '', ''], '6'); + verifyEntry(mapping, 'Digit7', ['7', '/', '{', ''], '7'); + verifyEntry(mapping, 'Digit8', ['8', '(', '[', ''], '8'); + verifyEntry(mapping, 'Digit9', ['9', ')', ']', ''], '9'); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'æ', 'Æ'], 'A'); + verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 'B'); + verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 'C'); + verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 'D'); + verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 'E'); + verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 'F'); + verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 'G'); + verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 'H'); + verifyEntry(mapping, 'KeyI', ['ı', 'I', 'i', 'İ'], 'I'); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 'J'); + verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 'K'); + verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 'L'); + verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 'M'); + verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 'N'); + verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 'O'); + verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 'P'); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', '@', ''], 'Q'); + verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 'R'); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', ''], 'S'); + verifyEntry(mapping, 'KeyT', ['t', 'T', '₺', ''], 'T'); + verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 'U'); + verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 'V'); + verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 'W'); + verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 'X'); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 'Y'); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 'Z'); + }); } void testLinux(LayoutMapping mapping) { group('de', () { - verifyEntry(mapping, 'Digit0', ['0', '=', '}', '°'], 0x30); - verifyEntry(mapping, 'Digit1', ['1', '!', '¹', '¡'], 0x31); - verifyEntry(mapping, 'Digit2', ['2', '"', '²', '⅛'], 0x32); - verifyEntry(mapping, 'Digit3', ['3', '§', '³', '£'], 0x33); - verifyEntry(mapping, 'Digit4', ['4', r'$', '¼', '¤'], 0x34); - verifyEntry(mapping, 'Digit5', ['5', '%', '½', '⅜'], 0x35); - verifyEntry(mapping, 'Digit6', ['6', '&', '¬', '⅝'], 0x36); - verifyEntry(mapping, 'Digit7', ['7', '/', '{', '⅞'], 0x37); - verifyEntry(mapping, 'Digit8', ['8', '(', '[', '™'], 0x38); - verifyEntry(mapping, 'Digit9', ['9', ')', ']', '±'], 0x39); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'æ', 'Æ'], 0x41); - verifyEntry(mapping, 'KeyB', ['b', 'B', '“', '‘'], 0x42); - verifyEntry(mapping, 'KeyC', ['c', 'C', '¢', '©'], 0x43); - verifyEntry(mapping, 'KeyD', ['d', 'D', 'ð', 'Ð'], 0x44); - verifyEntry(mapping, 'KeyE', ['e', 'E', '€', '€'], 0x45); - verifyEntry(mapping, 'KeyF', ['f', 'F', 'đ', 'ª'], 0x46); - verifyEntry(mapping, 'KeyG', ['g', 'G', 'ŋ', 'Ŋ'], 0x47); - verifyEntry(mapping, 'KeyH', ['h', 'H', 'ħ', 'Ħ'], 0x48); - verifyEntry(mapping, 'KeyI', ['i', 'I', '→', 'ı'], 0x49); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '̣', '̇'], 0x4a); - verifyEntry(mapping, 'KeyK', ['k', 'K', 'ĸ', '&'], 0x4b); - verifyEntry(mapping, 'KeyL', ['l', 'L', 'ł', 'Ł'], 0x4c); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', 'º'], 0x4d); - verifyEntry(mapping, 'KeyN', ['n', 'N', '”', '’'], 0x4e); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 0x4f); - verifyEntry(mapping, 'KeyP', ['p', 'P', 'þ', 'Þ'], 0x50); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', '@', 'Ω'], 0x51); - verifyEntry(mapping, 'KeyR', ['r', 'R', '¶', '®'], 0x52); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'ſ', 'ẞ'], 0x53); - verifyEntry(mapping, 'KeyT', ['t', 'T', 'ŧ', 'Ŧ'], 0x54); - verifyEntry(mapping, 'KeyU', ['u', 'U', '↓', '↑'], 0x55); - verifyEntry(mapping, 'KeyV', ['v', 'V', '„', '‚'], 0x56); - verifyEntry(mapping, 'KeyW', ['w', 'W', 'ł', 'Ł'], 0x57); - verifyEntry(mapping, 'KeyX', ['x', 'X', '«', '‹'], 0x58); - verifyEntry(mapping, 'KeyY', ['z', 'Z', '←', '¥'], 0x5a); - verifyEntry(mapping, 'KeyZ', ['y', 'Y', '»', '›'], 0x59); -}); + verifyEntry(mapping, 'Digit0', ['0', '=', '}', '°'], '0'); + verifyEntry(mapping, 'Digit1', ['1', '!', '¹', '¡'], '1'); + verifyEntry(mapping, 'Digit2', ['2', '"', '²', '⅛'], '2'); + verifyEntry(mapping, 'Digit3', ['3', '§', '³', '£'], '3'); + verifyEntry(mapping, 'Digit4', ['4', r'$', '¼', '¤'], '4'); + verifyEntry(mapping, 'Digit5', ['5', '%', '½', '⅜'], '5'); + verifyEntry(mapping, 'Digit6', ['6', '&', '¬', '⅝'], '6'); + verifyEntry(mapping, 'Digit7', ['7', '/', '{', '⅞'], '7'); + verifyEntry(mapping, 'Digit8', ['8', '(', '[', '™'], '8'); + verifyEntry(mapping, 'Digit9', ['9', ')', ']', '±'], '9'); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'æ', 'Æ'], 'A'); + verifyEntry(mapping, 'KeyB', ['b', 'B', '“', '‘'], 'B'); + verifyEntry(mapping, 'KeyC', ['c', 'C', '¢', '©'], 'C'); + verifyEntry(mapping, 'KeyD', ['d', 'D', 'ð', 'Ð'], 'D'); + verifyEntry(mapping, 'KeyE', ['e', 'E', '€', '€'], 'E'); + verifyEntry(mapping, 'KeyF', ['f', 'F', 'đ', 'ª'], 'F'); + verifyEntry(mapping, 'KeyG', ['g', 'G', 'ŋ', 'Ŋ'], 'G'); + verifyEntry(mapping, 'KeyH', ['h', 'H', 'ħ', 'Ħ'], 'H'); + verifyEntry(mapping, 'KeyI', ['i', 'I', '→', 'ı'], 'I'); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '̣', '̇'], 'J'); + verifyEntry(mapping, 'KeyK', ['k', 'K', 'ĸ', '&'], 'K'); + verifyEntry(mapping, 'KeyL', ['l', 'L', 'ł', 'Ł'], 'L'); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', 'º'], 'M'); + verifyEntry(mapping, 'KeyN', ['n', 'N', '”', '’'], 'N'); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 'O'); + verifyEntry(mapping, 'KeyP', ['p', 'P', 'þ', 'Þ'], 'P'); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', '@', 'Ω'], 'Q'); + verifyEntry(mapping, 'KeyR', ['r', 'R', '¶', '®'], 'R'); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'ſ', 'ẞ'], 'S'); + verifyEntry(mapping, 'KeyT', ['t', 'T', 'ŧ', 'Ŧ'], 'T'); + verifyEntry(mapping, 'KeyU', ['u', 'U', '↓', '↑'], 'U'); + verifyEntry(mapping, 'KeyV', ['v', 'V', '„', '‚'], 'V'); + verifyEntry(mapping, 'KeyW', ['w', 'W', 'ł', 'Ł'], 'W'); + verifyEntry(mapping, 'KeyX', ['x', 'X', '«', '‹'], 'X'); + verifyEntry(mapping, 'KeyY', ['z', 'Z', '←', '¥'], 'Z'); + verifyEntry(mapping, 'KeyZ', ['y', 'Y', '»', '›'], 'Y'); + }); group('en', () { - verifyEntry(mapping, 'Digit0', ['0', ')', '0', ')'], 0x30); - verifyEntry(mapping, 'Digit1', ['1', '!', '1', '!'], 0x31); - verifyEntry(mapping, 'Digit2', ['2', '@', '2', '@'], 0x32); - verifyEntry(mapping, 'Digit3', ['3', '#', '3', '#'], 0x33); - verifyEntry(mapping, 'Digit4', ['4', r'$', '4', r'$'], 0x34); - verifyEntry(mapping, 'Digit5', ['5', '%', '5', '%'], 0x35); - verifyEntry(mapping, 'Digit6', ['6', '^', '6', '^'], 0x36); - verifyEntry(mapping, 'Digit7', ['7', '&', '7', '&'], 0x37); - verifyEntry(mapping, 'Digit8', ['8', '*', '8', '*'], 0x38); - verifyEntry(mapping, 'Digit9', ['9', '(', '9', '('], 0x39); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'a', 'A'], 0x41); - verifyEntry(mapping, 'KeyB', ['b', 'B', 'b', 'B'], 0x42); - verifyEntry(mapping, 'KeyC', ['c', 'C', 'c', 'C'], 0x43); - verifyEntry(mapping, 'KeyD', ['d', 'D', 'd', 'D'], 0x44); - verifyEntry(mapping, 'KeyE', ['e', 'E', 'e', 'E'], 0x45); - verifyEntry(mapping, 'KeyF', ['f', 'F', 'f', 'F'], 0x46); - verifyEntry(mapping, 'KeyG', ['g', 'G', 'g', 'G'], 0x47); - verifyEntry(mapping, 'KeyH', ['h', 'H', 'h', 'H'], 0x48); - verifyEntry(mapping, 'KeyI', ['i', 'I', 'i', 'I'], 0x49); - verifyEntry(mapping, 'KeyJ', ['j', 'J', 'j', 'J'], 0x4a); - verifyEntry(mapping, 'KeyK', ['k', 'K', 'k', 'K'], 0x4b); - verifyEntry(mapping, 'KeyL', ['l', 'L', 'l', 'L'], 0x4c); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'm', 'M'], 0x4d); - verifyEntry(mapping, 'KeyN', ['n', 'N', 'n', 'N'], 0x4e); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'o', 'O'], 0x4f); - verifyEntry(mapping, 'KeyP', ['p', 'P', 'p', 'P'], 0x50); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'q', 'Q'], 0x51); - verifyEntry(mapping, 'KeyR', ['r', 'R', 'r', 'R'], 0x52); - verifyEntry(mapping, 'KeyS', ['s', 'S', 's', 'S'], 0x53); - verifyEntry(mapping, 'KeyT', ['t', 'T', 't', 'T'], 0x54); - verifyEntry(mapping, 'KeyU', ['u', 'U', 'u', 'U'], 0x55); - verifyEntry(mapping, 'KeyV', ['v', 'V', 'v', 'V'], 0x56); - verifyEntry(mapping, 'KeyW', ['w', 'W', 'w', 'W'], 0x57); - verifyEntry(mapping, 'KeyX', ['x', 'X', 'x', 'X'], 0x58); - verifyEntry(mapping, 'KeyY', ['y', 'Y', 'y', 'Y'], 0x59); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'z', 'Z'], 0x5a); -}); + verifyEntry(mapping, 'Digit0', ['0', ')', '0', ')'], '0'); + verifyEntry(mapping, 'Digit1', ['1', '!', '1', '!'], '1'); + verifyEntry(mapping, 'Digit2', ['2', '@', '2', '@'], '2'); + verifyEntry(mapping, 'Digit3', ['3', '#', '3', '#'], '3'); + verifyEntry(mapping, 'Digit4', ['4', r'$', '4', r'$'], '4'); + verifyEntry(mapping, 'Digit5', ['5', '%', '5', '%'], '5'); + verifyEntry(mapping, 'Digit6', ['6', '^', '6', '^'], '6'); + verifyEntry(mapping, 'Digit7', ['7', '&', '7', '&'], '7'); + verifyEntry(mapping, 'Digit8', ['8', '*', '8', '*'], '8'); + verifyEntry(mapping, 'Digit9', ['9', '(', '9', '('], '9'); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'a', 'A'], 'A'); + verifyEntry(mapping, 'KeyB', ['b', 'B', 'b', 'B'], 'B'); + verifyEntry(mapping, 'KeyC', ['c', 'C', 'c', 'C'], 'C'); + verifyEntry(mapping, 'KeyD', ['d', 'D', 'd', 'D'], 'D'); + verifyEntry(mapping, 'KeyE', ['e', 'E', 'e', 'E'], 'E'); + verifyEntry(mapping, 'KeyF', ['f', 'F', 'f', 'F'], 'F'); + verifyEntry(mapping, 'KeyG', ['g', 'G', 'g', 'G'], 'G'); + verifyEntry(mapping, 'KeyH', ['h', 'H', 'h', 'H'], 'H'); + verifyEntry(mapping, 'KeyI', ['i', 'I', 'i', 'I'], 'I'); + verifyEntry(mapping, 'KeyJ', ['j', 'J', 'j', 'J'], 'J'); + verifyEntry(mapping, 'KeyK', ['k', 'K', 'k', 'K'], 'K'); + verifyEntry(mapping, 'KeyL', ['l', 'L', 'l', 'L'], 'L'); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'm', 'M'], 'M'); + verifyEntry(mapping, 'KeyN', ['n', 'N', 'n', 'N'], 'N'); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'o', 'O'], 'O'); + verifyEntry(mapping, 'KeyP', ['p', 'P', 'p', 'P'], 'P'); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'q', 'Q'], 'Q'); + verifyEntry(mapping, 'KeyR', ['r', 'R', 'r', 'R'], 'R'); + verifyEntry(mapping, 'KeyS', ['s', 'S', 's', 'S'], 'S'); + verifyEntry(mapping, 'KeyT', ['t', 'T', 't', 'T'], 'T'); + verifyEntry(mapping, 'KeyU', ['u', 'U', 'u', 'U'], 'U'); + verifyEntry(mapping, 'KeyV', ['v', 'V', 'v', 'V'], 'V'); + verifyEntry(mapping, 'KeyW', ['w', 'W', 'w', 'W'], 'W'); + verifyEntry(mapping, 'KeyX', ['x', 'X', 'x', 'X'], 'X'); + verifyEntry(mapping, 'KeyY', ['y', 'Y', 'y', 'Y'], 'Y'); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'z', 'Z'], 'Z'); + }); group('es', () { - verifyEntry(mapping, 'Digit0', ['0', '=', '}', '°'], 0x30); - verifyEntry(mapping, 'Digit1', ['1', '!', '|', '¡'], 0x31); - verifyEntry(mapping, 'Digit2', ['2', '"', '@', '⅛'], 0x32); - verifyEntry(mapping, 'Digit3', ['3', '·', '#', '£'], 0x33); - verifyEntry(mapping, 'Digit4', ['4', r'$', '~', r'$'], 0x34); - verifyEntry(mapping, 'Digit5', ['5', '%', '½', '⅜'], 0x35); - verifyEntry(mapping, 'Digit6', ['6', '&', '¬', '⅝'], 0x36); - verifyEntry(mapping, 'Digit7', ['7', '/', '{', '⅞'], 0x37); - verifyEntry(mapping, 'Digit8', ['8', '(', '[', '™'], 0x38); - verifyEntry(mapping, 'Digit9', ['9', ')', ']', '±'], 0x39); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'æ', 'Æ'], 0x41); - verifyEntry(mapping, 'KeyB', ['b', 'B', '”', '’'], 0x42); - verifyEntry(mapping, 'KeyC', ['c', 'C', '¢', '©'], 0x43); - verifyEntry(mapping, 'KeyD', ['d', 'D', 'ð', 'Ð'], 0x44); - verifyEntry(mapping, 'KeyE', ['e', 'E', '€', '¢'], 0x45); - verifyEntry(mapping, 'KeyF', ['f', 'F', 'đ', 'ª'], 0x46); - verifyEntry(mapping, 'KeyG', ['g', 'G', 'ŋ', 'Ŋ'], 0x47); - verifyEntry(mapping, 'KeyH', ['h', 'H', 'ħ', 'Ħ'], 0x48); - verifyEntry(mapping, 'KeyI', ['i', 'I', '→', 'ı'], 0x49); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '̉', '̛'], 0x4a); - verifyEntry(mapping, 'KeyK', ['k', 'K', 'ĸ', '&'], 0x4b); - verifyEntry(mapping, 'KeyL', ['l', 'L', 'ł', 'Ł'], 0x4c); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', 'º'], 0x4d); - verifyEntry(mapping, 'KeyN', ['n', 'N', 'n', 'N'], 0x4e); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 0x4f); - verifyEntry(mapping, 'KeyP', ['p', 'P', 'þ', 'Þ'], 0x50); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', '@', 'Ω'], 0x51); - verifyEntry(mapping, 'KeyR', ['r', 'R', '¶', '®'], 0x52); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', '§'], 0x53); - verifyEntry(mapping, 'KeyT', ['t', 'T', 'ŧ', 'Ŧ'], 0x54); - verifyEntry(mapping, 'KeyU', ['u', 'U', '↓', '↑'], 0x55); - verifyEntry(mapping, 'KeyV', ['v', 'V', '“', '‘'], 0x56); - verifyEntry(mapping, 'KeyW', ['w', 'W', 'ł', 'Ł'], 0x57); - verifyEntry(mapping, 'KeyX', ['x', 'X', '»', '>'], 0x58); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '←', '¥'], 0x59); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', '«', '<'], 0x5a); -}); + verifyEntry(mapping, 'Digit0', ['0', '=', '}', '°'], '0'); + verifyEntry(mapping, 'Digit1', ['1', '!', '|', '¡'], '1'); + verifyEntry(mapping, 'Digit2', ['2', '"', '@', '⅛'], '2'); + verifyEntry(mapping, 'Digit3', ['3', '·', '#', '£'], '3'); + verifyEntry(mapping, 'Digit4', ['4', r'$', '~', r'$'], '4'); + verifyEntry(mapping, 'Digit5', ['5', '%', '½', '⅜'], '5'); + verifyEntry(mapping, 'Digit6', ['6', '&', '¬', '⅝'], '6'); + verifyEntry(mapping, 'Digit7', ['7', '/', '{', '⅞'], '7'); + verifyEntry(mapping, 'Digit8', ['8', '(', '[', '™'], '8'); + verifyEntry(mapping, 'Digit9', ['9', ')', ']', '±'], '9'); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'æ', 'Æ'], 'A'); + verifyEntry(mapping, 'KeyB', ['b', 'B', '”', '’'], 'B'); + verifyEntry(mapping, 'KeyC', ['c', 'C', '¢', '©'], 'C'); + verifyEntry(mapping, 'KeyD', ['d', 'D', 'ð', 'Ð'], 'D'); + verifyEntry(mapping, 'KeyE', ['e', 'E', '€', '¢'], 'E'); + verifyEntry(mapping, 'KeyF', ['f', 'F', 'đ', 'ª'], 'F'); + verifyEntry(mapping, 'KeyG', ['g', 'G', 'ŋ', 'Ŋ'], 'G'); + verifyEntry(mapping, 'KeyH', ['h', 'H', 'ħ', 'Ħ'], 'H'); + verifyEntry(mapping, 'KeyI', ['i', 'I', '→', 'ı'], 'I'); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '̉', '̛'], 'J'); + verifyEntry(mapping, 'KeyK', ['k', 'K', 'ĸ', '&'], 'K'); + verifyEntry(mapping, 'KeyL', ['l', 'L', 'ł', 'Ł'], 'L'); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', 'º'], 'M'); + verifyEntry(mapping, 'KeyN', ['n', 'N', 'n', 'N'], 'N'); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 'O'); + verifyEntry(mapping, 'KeyP', ['p', 'P', 'þ', 'Þ'], 'P'); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', '@', 'Ω'], 'Q'); + verifyEntry(mapping, 'KeyR', ['r', 'R', '¶', '®'], 'R'); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', '§'], 'S'); + verifyEntry(mapping, 'KeyT', ['t', 'T', 'ŧ', 'Ŧ'], 'T'); + verifyEntry(mapping, 'KeyU', ['u', 'U', '↓', '↑'], 'U'); + verifyEntry(mapping, 'KeyV', ['v', 'V', '“', '‘'], 'V'); + verifyEntry(mapping, 'KeyW', ['w', 'W', 'ł', 'Ł'], 'W'); + verifyEntry(mapping, 'KeyX', ['x', 'X', '»', '>'], 'X'); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '←', '¥'], 'Y'); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', '«', '<'], 'Z'); + }); group('fr', () { - verifyEntry(mapping, 'Digit0', ['à', '0', '@', '°'], 0x30); - verifyEntry(mapping, 'Digit1', ['&', '1', '¹', '¡'], 0x31); - verifyEntry(mapping, 'Digit2', ['é', '2', '~', '⅛'], 0x32); - verifyEntry(mapping, 'Digit3', ['"', '3', '#', '£'], 0x33); - verifyEntry(mapping, 'Digit4', ["'", '4', '{', r'$'], 0x34); - verifyEntry(mapping, 'Digit5', ['(', '5', '[', '⅜'], 0x35); - verifyEntry(mapping, 'Digit6', ['-', '6', '|', '⅝'], 0x36); - verifyEntry(mapping, 'Digit7', ['è', '7', '`', '⅞'], 0x37); - verifyEntry(mapping, 'Digit8', ['_', '8', r'\', '™'], 0x38); - verifyEntry(mapping, 'Digit9', ['ç', '9', '^', '±'], 0x39); - verifyEntry(mapping, 'KeyA', ['q', 'Q', '@', 'Ω'], 0x51); - verifyEntry(mapping, 'KeyB', ['b', 'B', '”', '’'], 0x42); - verifyEntry(mapping, 'KeyC', ['c', 'C', '¢', '©'], 0x43); - verifyEntry(mapping, 'KeyD', ['d', 'D', 'ð', 'Ð'], 0x44); - verifyEntry(mapping, 'KeyE', ['e', 'E', '€', '¢'], 0x45); - verifyEntry(mapping, 'KeyF', ['f', 'F', 'đ', 'ª'], 0x46); - verifyEntry(mapping, 'KeyG', ['g', 'G', 'ŋ', 'Ŋ'], 0x47); - verifyEntry(mapping, 'KeyH', ['h', 'H', 'ħ', 'Ħ'], 0x48); - verifyEntry(mapping, 'KeyI', ['i', 'I', '→', 'ı'], 0x49); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '̉', '̛'], 0x4a); - verifyEntry(mapping, 'KeyK', ['k', 'K', 'ĸ', '&'], 0x4b); - verifyEntry(mapping, 'KeyL', ['l', 'L', 'ł', 'Ł'], 0x4c); - verifyEntry(mapping, 'KeyN', ['n', 'N', 'n', 'N'], 0x4e); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 0x4f); - verifyEntry(mapping, 'KeyP', ['p', 'P', 'þ', 'Þ'], 0x50); - verifyEntry(mapping, 'KeyQ', ['a', 'A', 'æ', 'Æ'], 0x41); - verifyEntry(mapping, 'KeyR', ['r', 'R', '¶', '®'], 0x52); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', '§'], 0x53); - verifyEntry(mapping, 'KeyT', ['t', 'T', 'ŧ', 'Ŧ'], 0x54); - verifyEntry(mapping, 'KeyU', ['u', 'U', '↓', '↑'], 0x55); - verifyEntry(mapping, 'KeyV', ['v', 'V', '“', '‘'], 0x56); - verifyEntry(mapping, 'KeyW', ['z', 'Z', '«', '<'], 0x5a); - verifyEntry(mapping, 'KeyX', ['x', 'X', '»', '>'], 0x58); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '←', '¥'], 0x59); - verifyEntry(mapping, 'KeyZ', ['w', 'W', 'ł', 'Ł'], 0x57); - verifyEntry(mapping, 'Semicolon', ['m', 'M', 'µ', 'º'], 0x4d); -}); + verifyEntry(mapping, 'Digit0', ['à', '0', '@', '°'], '0'); + verifyEntry(mapping, 'Digit1', ['&', '1', '¹', '¡'], '1'); + verifyEntry(mapping, 'Digit2', ['é', '2', '~', '⅛'], '2'); + verifyEntry(mapping, 'Digit3', ['"', '3', '#', '£'], '3'); + verifyEntry(mapping, 'Digit4', ["'", '4', '{', r'$'], '4'); + verifyEntry(mapping, 'Digit5', ['(', '5', '[', '⅜'], '5'); + verifyEntry(mapping, 'Digit6', ['-', '6', '|', '⅝'], '6'); + verifyEntry(mapping, 'Digit7', ['è', '7', '`', '⅞'], '7'); + verifyEntry(mapping, 'Digit8', ['_', '8', r'\', '™'], '8'); + verifyEntry(mapping, 'Digit9', ['ç', '9', '^', '±'], '9'); + verifyEntry(mapping, 'KeyA', ['q', 'Q', '@', 'Ω'], 'Q'); + verifyEntry(mapping, 'KeyB', ['b', 'B', '”', '’'], 'B'); + verifyEntry(mapping, 'KeyC', ['c', 'C', '¢', '©'], 'C'); + verifyEntry(mapping, 'KeyD', ['d', 'D', 'ð', 'Ð'], 'D'); + verifyEntry(mapping, 'KeyE', ['e', 'E', '€', '¢'], 'E'); + verifyEntry(mapping, 'KeyF', ['f', 'F', 'đ', 'ª'], 'F'); + verifyEntry(mapping, 'KeyG', ['g', 'G', 'ŋ', 'Ŋ'], 'G'); + verifyEntry(mapping, 'KeyH', ['h', 'H', 'ħ', 'Ħ'], 'H'); + verifyEntry(mapping, 'KeyI', ['i', 'I', '→', 'ı'], 'I'); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '̉', '̛'], 'J'); + verifyEntry(mapping, 'KeyK', ['k', 'K', 'ĸ', '&'], 'K'); + verifyEntry(mapping, 'KeyL', ['l', 'L', 'ł', 'Ł'], 'L'); + verifyEntry(mapping, 'KeyN', ['n', 'N', 'n', 'N'], 'N'); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 'O'); + verifyEntry(mapping, 'KeyP', ['p', 'P', 'þ', 'Þ'], 'P'); + verifyEntry(mapping, 'KeyQ', ['a', 'A', 'æ', 'Æ'], 'A'); + verifyEntry(mapping, 'KeyR', ['r', 'R', '¶', '®'], 'R'); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', '§'], 'S'); + verifyEntry(mapping, 'KeyT', ['t', 'T', 'ŧ', 'Ŧ'], 'T'); + verifyEntry(mapping, 'KeyU', ['u', 'U', '↓', '↑'], 'U'); + verifyEntry(mapping, 'KeyV', ['v', 'V', '“', '‘'], 'V'); + verifyEntry(mapping, 'KeyW', ['z', 'Z', '«', '<'], 'Z'); + verifyEntry(mapping, 'KeyX', ['x', 'X', '»', '>'], 'X'); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '←', '¥'], 'Y'); + verifyEntry(mapping, 'KeyZ', ['w', 'W', 'ł', 'Ł'], 'W'); + verifyEntry(mapping, 'Semicolon', ['m', 'M', 'µ', 'º'], 'M'); + }); group('ru', () { - verifyEntry(mapping, 'Digit0', ['0', ')', '0', ')'], 0x30); - verifyEntry(mapping, 'Digit1', ['1', '!', '1', '!'], 0x31); - verifyEntry(mapping, 'Digit2', ['2', '"', '2', '"'], 0x32); - verifyEntry(mapping, 'Digit3', ['3', '№', '3', '№'], 0x33); - verifyEntry(mapping, 'Digit4', ['4', ';', '4', ';'], 0x34); - verifyEntry(mapping, 'Digit5', ['5', '%', '5', '%'], 0x35); - verifyEntry(mapping, 'Digit6', ['6', ':', '6', ':'], 0x36); - verifyEntry(mapping, 'Digit7', ['7', '?', '7', '?'], 0x37); - verifyEntry(mapping, 'Digit8', ['8', '*', '₽', ''], 0x38); - verifyEntry(mapping, 'Digit9', ['9', '(', '9', '('], 0x39); - verifyEntry(mapping, 'KeyA', ['ф', 'Ф', 'ф', 'Ф'], 0x41); - verifyEntry(mapping, 'KeyB', ['и', 'И', 'и', 'И'], 0x42); - verifyEntry(mapping, 'KeyC', ['с', 'С', 'с', 'С'], 0x43); - verifyEntry(mapping, 'KeyD', ['в', 'В', 'в', 'В'], 0x44); - verifyEntry(mapping, 'KeyE', ['у', 'У', 'у', 'У'], 0x45); - verifyEntry(mapping, 'KeyF', ['а', 'А', 'а', 'А'], 0x46); - verifyEntry(mapping, 'KeyG', ['п', 'П', 'п', 'П'], 0x47); - verifyEntry(mapping, 'KeyH', ['р', 'Р', 'р', 'Р'], 0x48); - verifyEntry(mapping, 'KeyI', ['ш', 'Ш', 'ш', 'Ш'], 0x49); - verifyEntry(mapping, 'KeyJ', ['о', 'О', 'о', 'О'], 0x4a); - verifyEntry(mapping, 'KeyK', ['л', 'Л', 'л', 'Л'], 0x4b); - verifyEntry(mapping, 'KeyL', ['д', 'Д', 'д', 'Д'], 0x4c); - verifyEntry(mapping, 'KeyM', ['ь', 'Ь', 'ь', 'Ь'], 0x4d); - verifyEntry(mapping, 'KeyN', ['т', 'Т', 'т', 'Т'], 0x4e); - verifyEntry(mapping, 'KeyO', ['щ', 'Щ', 'щ', 'Щ'], 0x4f); - verifyEntry(mapping, 'KeyP', ['з', 'З', 'з', 'З'], 0x50); - verifyEntry(mapping, 'KeyQ', ['й', 'Й', 'й', 'Й'], 0x51); - verifyEntry(mapping, 'KeyR', ['к', 'К', 'к', 'К'], 0x52); - verifyEntry(mapping, 'KeyS', ['ы', 'Ы', 'ы', 'Ы'], 0x53); - verifyEntry(mapping, 'KeyT', ['е', 'Е', 'е', 'Е'], 0x54); - verifyEntry(mapping, 'KeyU', ['г', 'Г', 'г', 'Г'], 0x55); - verifyEntry(mapping, 'KeyV', ['м', 'М', 'м', 'М'], 0x56); - verifyEntry(mapping, 'KeyW', ['ц', 'Ц', 'ц', 'Ц'], 0x57); - verifyEntry(mapping, 'KeyX', ['ч', 'Ч', 'ч', 'Ч'], 0x58); - verifyEntry(mapping, 'KeyY', ['н', 'Н', 'н', 'Н'], 0x59); - verifyEntry(mapping, 'KeyZ', ['я', 'Я', 'я', 'Я'], 0x5a); -}); + verifyEntry(mapping, 'Digit0', ['0', ')', '0', ')'], '0'); + verifyEntry(mapping, 'Digit1', ['1', '!', '1', '!'], '1'); + verifyEntry(mapping, 'Digit2', ['2', '"', '2', '"'], '2'); + verifyEntry(mapping, 'Digit3', ['3', '№', '3', '№'], '3'); + verifyEntry(mapping, 'Digit4', ['4', ';', '4', ';'], '4'); + verifyEntry(mapping, 'Digit5', ['5', '%', '5', '%'], '5'); + verifyEntry(mapping, 'Digit6', ['6', ':', '6', ':'], '6'); + verifyEntry(mapping, 'Digit7', ['7', '?', '7', '?'], '7'); + verifyEntry(mapping, 'Digit8', ['8', '*', '₽', ''], '8'); + verifyEntry(mapping, 'Digit9', ['9', '(', '9', '('], '9'); + verifyEntry(mapping, 'KeyA', ['ф', 'Ф', 'ф', 'Ф'], 'A'); + verifyEntry(mapping, 'KeyB', ['и', 'И', 'и', 'И'], 'B'); + verifyEntry(mapping, 'KeyC', ['с', 'С', 'с', 'С'], 'C'); + verifyEntry(mapping, 'KeyD', ['в', 'В', 'в', 'В'], 'D'); + verifyEntry(mapping, 'KeyE', ['у', 'У', 'у', 'У'], 'E'); + verifyEntry(mapping, 'KeyF', ['а', 'А', 'а', 'А'], 'F'); + verifyEntry(mapping, 'KeyG', ['п', 'П', 'п', 'П'], 'G'); + verifyEntry(mapping, 'KeyH', ['р', 'Р', 'р', 'Р'], 'H'); + verifyEntry(mapping, 'KeyI', ['ш', 'Ш', 'ш', 'Ш'], 'I'); + verifyEntry(mapping, 'KeyJ', ['о', 'О', 'о', 'О'], 'J'); + verifyEntry(mapping, 'KeyK', ['л', 'Л', 'л', 'Л'], 'K'); + verifyEntry(mapping, 'KeyL', ['д', 'Д', 'д', 'Д'], 'L'); + verifyEntry(mapping, 'KeyM', ['ь', 'Ь', 'ь', 'Ь'], 'M'); + verifyEntry(mapping, 'KeyN', ['т', 'Т', 'т', 'Т'], 'N'); + verifyEntry(mapping, 'KeyO', ['щ', 'Щ', 'щ', 'Щ'], 'O'); + verifyEntry(mapping, 'KeyP', ['з', 'З', 'з', 'З'], 'P'); + verifyEntry(mapping, 'KeyQ', ['й', 'Й', 'й', 'Й'], 'Q'); + verifyEntry(mapping, 'KeyR', ['к', 'К', 'к', 'К'], 'R'); + verifyEntry(mapping, 'KeyS', ['ы', 'Ы', 'ы', 'Ы'], 'S'); + verifyEntry(mapping, 'KeyT', ['е', 'Е', 'е', 'Е'], 'T'); + verifyEntry(mapping, 'KeyU', ['г', 'Г', 'г', 'Г'], 'U'); + verifyEntry(mapping, 'KeyV', ['м', 'М', 'м', 'М'], 'V'); + verifyEntry(mapping, 'KeyW', ['ц', 'Ц', 'ц', 'Ц'], 'W'); + verifyEntry(mapping, 'KeyX', ['ч', 'Ч', 'ч', 'Ч'], 'X'); + verifyEntry(mapping, 'KeyY', ['н', 'Н', 'н', 'Н'], 'Y'); + verifyEntry(mapping, 'KeyZ', ['я', 'Я', 'я', 'Я'], 'Z'); + }); } void testDarwin(LayoutMapping mapping) { group('de', () { - verifyEntry(mapping, 'Digit0', ['0', '=', '≠', '¯'], 0x30); - verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '¬'], 0x31); - verifyEntry(mapping, 'Digit2', ['2', '"', '“', '”'], 0x32); - verifyEntry(mapping, 'Digit3', ['3', '§', '¶', '#'], 0x33); - verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '£'], 0x34); - verifyEntry(mapping, 'Digit5', ['5', '%', '[', 'fi'], 0x35); - verifyEntry(mapping, 'Digit6', ['6', '&', ']', 'Dead'], 0x36); - verifyEntry(mapping, 'Digit7', ['7', '/', '|', r'\'], 0x37); - verifyEntry(mapping, 'Digit8', ['8', '(', '{', '˜'], 0x38); - verifyEntry(mapping, 'Digit9', ['9', ')', '}', '·'], 0x39); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 0x41); - verifyEntry(mapping, 'KeyB', ['b', 'B', '∫', '‹'], 0x42); - verifyEntry(mapping, 'KeyC', ['c', 'C', 'ç', 'Ç'], 0x43); - verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', '™'], 0x44); - verifyEntry(mapping, 'KeyE', ['e', 'E', '€', '‰'], 0x45); - verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', 'Ï'], 0x46); - verifyEntry(mapping, 'KeyG', ['g', 'G', '©', 'Ì'], 0x47); - verifyEntry(mapping, 'KeyH', ['h', 'H', 'ª', 'Ó'], 0x48); - verifyEntry(mapping, 'KeyI', ['i', 'I', '⁄', 'Û'], 0x49); - verifyEntry(mapping, 'KeyJ', ['j', 'J', 'º', 'ı'], 0x4a); - verifyEntry(mapping, 'KeyK', ['k', 'K', '∆', 'ˆ'], 0x4b); - verifyEntry(mapping, 'KeyL', ['l', 'L', '@', 'fl'], 0x4c); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', '˘'], 0x4d); - verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', '›'], 0x4e); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 0x4f); - verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 0x50); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', '«', '»'], 0x51); - verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '¸'], 0x52); - verifyEntry(mapping, 'KeyS', ['s', 'S', '‚', 'Í'], 0x53); - verifyEntry(mapping, 'KeyT', ['t', 'T', '†', '˝'], 0x54); - verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', 'Á'], 0x55); - verifyEntry(mapping, 'KeyV', ['v', 'V', '√', '◊'], 0x56); - verifyEntry(mapping, 'KeyW', ['w', 'W', '∑', '„'], 0x57); - verifyEntry(mapping, 'KeyX', ['x', 'X', '≈', 'Ù'], 0x58); - verifyEntry(mapping, 'KeyY', ['z', 'Z', 'Ω', 'ˇ'], 0x5a); - verifyEntry(mapping, 'KeyZ', ['y', 'Y', '¥', '‡'], 0x59); -}); + verifyEntry(mapping, 'Digit0', ['0', '=', '≠', '¯'], '0'); + verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '¬'], '1'); + verifyEntry(mapping, 'Digit2', ['2', '"', '“', '”'], '2'); + verifyEntry(mapping, 'Digit3', ['3', '§', '¶', '#'], '3'); + verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '£'], '4'); + verifyEntry(mapping, 'Digit5', ['5', '%', '[', 'fi'], '5'); + verifyEntry(mapping, 'Digit6', ['6', '&', ']', 'Dead'], '6'); + verifyEntry(mapping, 'Digit7', ['7', '/', '|', r'\'], '7'); + verifyEntry(mapping, 'Digit8', ['8', '(', '{', '˜'], '8'); + verifyEntry(mapping, 'Digit9', ['9', ')', '}', '·'], '9'); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 'A'); + verifyEntry(mapping, 'KeyB', ['b', 'B', '∫', '‹'], 'B'); + verifyEntry(mapping, 'KeyC', ['c', 'C', 'ç', 'Ç'], 'C'); + verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', '™'], 'D'); + verifyEntry(mapping, 'KeyE', ['e', 'E', '€', '‰'], 'E'); + verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', 'Ï'], 'F'); + verifyEntry(mapping, 'KeyG', ['g', 'G', '©', 'Ì'], 'G'); + verifyEntry(mapping, 'KeyH', ['h', 'H', 'ª', 'Ó'], 'H'); + verifyEntry(mapping, 'KeyI', ['i', 'I', '⁄', 'Û'], 'I'); + verifyEntry(mapping, 'KeyJ', ['j', 'J', 'º', 'ı'], 'J'); + verifyEntry(mapping, 'KeyK', ['k', 'K', '∆', 'ˆ'], 'K'); + verifyEntry(mapping, 'KeyL', ['l', 'L', '@', 'fl'], 'L'); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', '˘'], 'M'); + verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', '›'], 'N'); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 'O'); + verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 'P'); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', '«', '»'], 'Q'); + verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '¸'], 'R'); + verifyEntry(mapping, 'KeyS', ['s', 'S', '‚', 'Í'], 'S'); + verifyEntry(mapping, 'KeyT', ['t', 'T', '†', '˝'], 'T'); + verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', 'Á'], 'U'); + verifyEntry(mapping, 'KeyV', ['v', 'V', '√', '◊'], 'V'); + verifyEntry(mapping, 'KeyW', ['w', 'W', '∑', '„'], 'W'); + verifyEntry(mapping, 'KeyX', ['x', 'X', '≈', 'Ù'], 'X'); + verifyEntry(mapping, 'KeyY', ['z', 'Z', 'Ω', 'ˇ'], 'Z'); + verifyEntry(mapping, 'KeyZ', ['y', 'Y', '¥', '‡'], 'Y'); + }); group('dvorak', () { - verifyEntry(mapping, 'Comma', ['w', 'W', '∑', '„'], 0x57); - verifyEntry(mapping, 'Digit0', ['0', ')', 'º', '‚'], 0x30); - verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '⁄'], 0x31); - verifyEntry(mapping, 'Digit2', ['2', '@', '™', '€'], 0x32); - verifyEntry(mapping, 'Digit3', ['3', '#', '£', '‹'], 0x33); - verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '›'], 0x34); - verifyEntry(mapping, 'Digit5', ['5', '%', '∞', 'fi'], 0x35); - verifyEntry(mapping, 'Digit6', ['6', '^', '§', 'fl'], 0x36); - verifyEntry(mapping, 'Digit7', ['7', '&', '¶', '‡'], 0x37); - verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], 0x38); - verifyEntry(mapping, 'Digit9', ['9', '(', 'ª', '·'], 0x39); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 0x41); - verifyEntry(mapping, 'KeyB', ['x', 'X', '≈', '˛'], 0x58); - verifyEntry(mapping, 'KeyC', ['j', 'J', '∆', 'Ô'], 0x4a); - verifyEntry(mapping, 'KeyD', ['e', 'E', 'Dead', '´'], 0x45); - verifyEntry(mapping, 'KeyF', ['u', 'U', 'Dead', '¨'], 0x55); - verifyEntry(mapping, 'KeyG', ['i', 'I', 'Dead', 'ˆ'], 0x49); - verifyEntry(mapping, 'KeyH', ['d', 'D', '∂', 'Î'], 0x44); - verifyEntry(mapping, 'KeyI', ['c', 'C', 'ç', 'Ç'], 0x43); - verifyEntry(mapping, 'KeyJ', ['h', 'H', '˙', 'Ó'], 0x48); - verifyEntry(mapping, 'KeyK', ['t', 'T', '†', 'ˇ'], 0x54); - verifyEntry(mapping, 'KeyL', ['n', 'N', 'Dead', '˜'], 0x4e); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', 'Â'], 0x4d); - verifyEntry(mapping, 'KeyN', ['b', 'B', '∫', 'ı'], 0x42); - verifyEntry(mapping, 'KeyO', ['r', 'R', '®', '‰'], 0x52); - verifyEntry(mapping, 'KeyP', ['l', 'L', '¬', 'Ò'], 0x4c); - verifyEntry(mapping, 'KeyR', ['p', 'P', 'π', '∏'], 0x50); - verifyEntry(mapping, 'KeyS', ['o', 'O', 'ø', 'Ø'], 0x4f); - verifyEntry(mapping, 'KeyT', ['y', 'Y', '¥', 'Á'], 0x59); - verifyEntry(mapping, 'KeyU', ['g', 'G', '©', '˝'], 0x47); - verifyEntry(mapping, 'KeyV', ['k', 'K', '˚', ''], 0x4b); - verifyEntry(mapping, 'KeyX', ['q', 'Q', 'œ', 'Œ'], 0x51); - verifyEntry(mapping, 'KeyY', ['f', 'F', 'ƒ', 'Ï'], 0x46); - verifyEntry(mapping, 'Period', ['v', 'V', '√', '◊'], 0x56); - verifyEntry(mapping, 'Semicolon', ['s', 'S', 'ß', 'Í'], 0x53); - verifyEntry(mapping, 'Slash', ['z', 'Z', 'Ω', '¸'], 0x5a); -}); + verifyEntry(mapping, 'Comma', ['w', 'W', '∑', '„'], 'W'); + verifyEntry(mapping, 'Digit0', ['0', ')', 'º', '‚'], '0'); + verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '⁄'], '1'); + verifyEntry(mapping, 'Digit2', ['2', '@', '™', '€'], '2'); + verifyEntry(mapping, 'Digit3', ['3', '#', '£', '‹'], '3'); + verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '›'], '4'); + verifyEntry(mapping, 'Digit5', ['5', '%', '∞', 'fi'], '5'); + verifyEntry(mapping, 'Digit6', ['6', '^', '§', 'fl'], '6'); + verifyEntry(mapping, 'Digit7', ['7', '&', '¶', '‡'], '7'); + verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], '8'); + verifyEntry(mapping, 'Digit9', ['9', '(', 'ª', '·'], '9'); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 'A'); + verifyEntry(mapping, 'KeyB', ['x', 'X', '≈', '˛'], 'X'); + verifyEntry(mapping, 'KeyC', ['j', 'J', '∆', 'Ô'], 'J'); + verifyEntry(mapping, 'KeyD', ['e', 'E', 'Dead', '´'], 'E'); + verifyEntry(mapping, 'KeyF', ['u', 'U', 'Dead', '¨'], 'U'); + verifyEntry(mapping, 'KeyG', ['i', 'I', 'Dead', 'ˆ'], 'I'); + verifyEntry(mapping, 'KeyH', ['d', 'D', '∂', 'Î'], 'D'); + verifyEntry(mapping, 'KeyI', ['c', 'C', 'ç', 'Ç'], 'C'); + verifyEntry(mapping, 'KeyJ', ['h', 'H', '˙', 'Ó'], 'H'); + verifyEntry(mapping, 'KeyK', ['t', 'T', '†', 'ˇ'], 'T'); + verifyEntry(mapping, 'KeyL', ['n', 'N', 'Dead', '˜'], 'N'); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', 'Â'], 'M'); + verifyEntry(mapping, 'KeyN', ['b', 'B', '∫', 'ı'], 'B'); + verifyEntry(mapping, 'KeyO', ['r', 'R', '®', '‰'], 'R'); + verifyEntry(mapping, 'KeyP', ['l', 'L', '¬', 'Ò'], 'L'); + verifyEntry(mapping, 'KeyR', ['p', 'P', 'π', '∏'], 'P'); + verifyEntry(mapping, 'KeyS', ['o', 'O', 'ø', 'Ø'], 'O'); + verifyEntry(mapping, 'KeyT', ['y', 'Y', '¥', 'Á'], 'Y'); + verifyEntry(mapping, 'KeyU', ['g', 'G', '©', '˝'], 'G'); + verifyEntry(mapping, 'KeyV', ['k', 'K', '˚', ''], 'K'); + verifyEntry(mapping, 'KeyX', ['q', 'Q', 'œ', 'Œ'], 'Q'); + verifyEntry(mapping, 'KeyY', ['f', 'F', 'ƒ', 'Ï'], 'F'); + verifyEntry(mapping, 'Period', ['v', 'V', '√', '◊'], 'V'); + verifyEntry(mapping, 'Semicolon', ['s', 'S', 'ß', 'Í'], 'S'); + verifyEntry(mapping, 'Slash', ['z', 'Z', 'Ω', '¸'], 'Z'); + }); group('en', () { - verifyEntry(mapping, 'Digit0', ['0', ')', 'º', '‚'], 0x30); - verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '⁄'], 0x31); - verifyEntry(mapping, 'Digit2', ['2', '@', '™', '€'], 0x32); - verifyEntry(mapping, 'Digit3', ['3', '#', '£', '‹'], 0x33); - verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '›'], 0x34); - verifyEntry(mapping, 'Digit5', ['5', '%', '∞', 'fi'], 0x35); - verifyEntry(mapping, 'Digit6', ['6', '^', '§', 'fl'], 0x36); - verifyEntry(mapping, 'Digit7', ['7', '&', '¶', '‡'], 0x37); - verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], 0x38); - verifyEntry(mapping, 'Digit9', ['9', '(', 'ª', '·'], 0x39); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 0x41); - verifyEntry(mapping, 'KeyB', ['b', 'B', '∫', 'ı'], 0x42); - verifyEntry(mapping, 'KeyC', ['c', 'C', 'ç', 'Ç'], 0x43); - verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', 'Î'], 0x44); - verifyEntry(mapping, 'KeyE', ['e', 'E', 'Dead', '´'], 0x45); - verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', 'Ï'], 0x46); - verifyEntry(mapping, 'KeyG', ['g', 'G', '©', '˝'], 0x47); - verifyEntry(mapping, 'KeyH', ['h', 'H', '˙', 'Ó'], 0x48); - verifyEntry(mapping, 'KeyI', ['i', 'I', 'Dead', 'ˆ'], 0x49); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '∆', 'Ô'], 0x4a); - verifyEntry(mapping, 'KeyK', ['k', 'K', '˚', ''], 0x4b); - verifyEntry(mapping, 'KeyL', ['l', 'L', '¬', 'Ò'], 0x4c); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', 'Â'], 0x4d); - verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', '˜'], 0x4e); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 0x4f); - verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 0x50); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'œ', 'Œ'], 0x51); - verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '‰'], 0x52); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', 'Í'], 0x53); - verifyEntry(mapping, 'KeyT', ['t', 'T', '†', 'ˇ'], 0x54); - verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', '¨'], 0x55); - verifyEntry(mapping, 'KeyV', ['v', 'V', '√', '◊'], 0x56); - verifyEntry(mapping, 'KeyW', ['w', 'W', '∑', '„'], 0x57); - verifyEntry(mapping, 'KeyX', ['x', 'X', '≈', '˛'], 0x58); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '¥', 'Á'], 0x59); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'Ω', '¸'], 0x5a); -}); + verifyEntry(mapping, 'Digit0', ['0', ')', 'º', '‚'], '0'); + verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '⁄'], '1'); + verifyEntry(mapping, 'Digit2', ['2', '@', '™', '€'], '2'); + verifyEntry(mapping, 'Digit3', ['3', '#', '£', '‹'], '3'); + verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '›'], '4'); + verifyEntry(mapping, 'Digit5', ['5', '%', '∞', 'fi'], '5'); + verifyEntry(mapping, 'Digit6', ['6', '^', '§', 'fl'], '6'); + verifyEntry(mapping, 'Digit7', ['7', '&', '¶', '‡'], '7'); + verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], '8'); + verifyEntry(mapping, 'Digit9', ['9', '(', 'ª', '·'], '9'); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 'A'); + verifyEntry(mapping, 'KeyB', ['b', 'B', '∫', 'ı'], 'B'); + verifyEntry(mapping, 'KeyC', ['c', 'C', 'ç', 'Ç'], 'C'); + verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', 'Î'], 'D'); + verifyEntry(mapping, 'KeyE', ['e', 'E', 'Dead', '´'], 'E'); + verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', 'Ï'], 'F'); + verifyEntry(mapping, 'KeyG', ['g', 'G', '©', '˝'], 'G'); + verifyEntry(mapping, 'KeyH', ['h', 'H', '˙', 'Ó'], 'H'); + verifyEntry(mapping, 'KeyI', ['i', 'I', 'Dead', 'ˆ'], 'I'); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '∆', 'Ô'], 'J'); + verifyEntry(mapping, 'KeyK', ['k', 'K', '˚', ''], 'K'); + verifyEntry(mapping, 'KeyL', ['l', 'L', '¬', 'Ò'], 'L'); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', 'Â'], 'M'); + verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', '˜'], 'N'); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 'O'); + verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 'P'); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'œ', 'Œ'], 'Q'); + verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '‰'], 'R'); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', 'Í'], 'S'); + verifyEntry(mapping, 'KeyT', ['t', 'T', '†', 'ˇ'], 'T'); + verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', '¨'], 'U'); + verifyEntry(mapping, 'KeyV', ['v', 'V', '√', '◊'], 'V'); + verifyEntry(mapping, 'KeyW', ['w', 'W', '∑', '„'], 'W'); + verifyEntry(mapping, 'KeyX', ['x', 'X', '≈', '˛'], 'X'); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '¥', 'Á'], 'Y'); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'Ω', '¸'], 'Z'); + }); group('en-ext', () { - verifyEntry(mapping, 'Digit0', ['0', ')', 'º', '‚'], 0x30); - verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '⁄'], 0x31); - verifyEntry(mapping, 'Digit2', ['2', '@', '™', '€'], 0x32); - verifyEntry(mapping, 'Digit3', ['3', '#', '£', '‹'], 0x33); - verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '›'], 0x34); - verifyEntry(mapping, 'Digit5', ['5', '%', '§', '†'], 0x35); - verifyEntry(mapping, 'Digit6', ['6', '^', 'Dead', '̂'], 0x36); - verifyEntry(mapping, 'Digit7', ['7', '&', '¶', '‡'], 0x37); - verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], 0x38); - verifyEntry(mapping, 'Digit9', ['9', '(', 'ª', '·'], 0x39); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'Dead', '̄'], 0x41); - verifyEntry(mapping, 'KeyB', ['b', 'B', 'Dead', '̆'], 0x42); - verifyEntry(mapping, 'KeyC', ['c', 'C', 'Dead', '̧'], 0x43); - verifyEntry(mapping, 'KeyD', ['d', 'D', 'ð', 'Ð'], 0x44); - verifyEntry(mapping, 'KeyE', ['e', 'E', 'Dead', '́'], 0x45); - verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', ''], 0x46); - verifyEntry(mapping, 'KeyG', ['g', 'G', '©', 'Dead'], 0x47); - verifyEntry(mapping, 'KeyH', ['h', 'H', 'Dead', '̱'], 0x48); - verifyEntry(mapping, 'KeyI', ['i', 'I', 'Dead', '̛'], 0x49); - verifyEntry(mapping, 'KeyJ', ['j', 'J', 'Dead', '̋'], 0x4a); - verifyEntry(mapping, 'KeyK', ['k', 'K', 'Dead', '̊'], 0x4b); - verifyEntry(mapping, 'KeyL', ['l', 'L', 'Dead', '̵'], 0x4c); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'Dead', '̨'], 0x4d); - verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', '̃'], 0x4e); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 0x4f); - verifyEntry(mapping, 'KeyP', ['p', 'P', 'Dead', '̦'], 0x50); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'œ', 'Œ'], 0x51); - verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '‰'], 0x52); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', ''], 0x53); - verifyEntry(mapping, 'KeyT', ['t', 'T', 'þ', 'Þ'], 0x54); - verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', '̈'], 0x55); - verifyEntry(mapping, 'KeyV', ['v', 'V', 'Dead', '̌'], 0x56); - verifyEntry(mapping, 'KeyW', ['w', 'W', 'Dead', '̇'], 0x57); - verifyEntry(mapping, 'KeyX', ['x', 'X', 'Dead', '̣'], 0x58); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '¥', ''], 0x59); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'Dead', '̉'], 0x5a); -}); + verifyEntry(mapping, 'Digit0', ['0', ')', 'º', '‚'], '0'); + verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '⁄'], '1'); + verifyEntry(mapping, 'Digit2', ['2', '@', '™', '€'], '2'); + verifyEntry(mapping, 'Digit3', ['3', '#', '£', '‹'], '3'); + verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '›'], '4'); + verifyEntry(mapping, 'Digit5', ['5', '%', '§', '†'], '5'); + verifyEntry(mapping, 'Digit6', ['6', '^', 'Dead', '̂'], '6'); + verifyEntry(mapping, 'Digit7', ['7', '&', '¶', '‡'], '7'); + verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], '8'); + verifyEntry(mapping, 'Digit9', ['9', '(', 'ª', '·'], '9'); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'Dead', '̄'], 'A'); + verifyEntry(mapping, 'KeyB', ['b', 'B', 'Dead', '̆'], 'B'); + verifyEntry(mapping, 'KeyC', ['c', 'C', 'Dead', '̧'], 'C'); + verifyEntry(mapping, 'KeyD', ['d', 'D', 'ð', 'Ð'], 'D'); + verifyEntry(mapping, 'KeyE', ['e', 'E', 'Dead', '́'], 'E'); + verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', ''], 'F'); + verifyEntry(mapping, 'KeyG', ['g', 'G', '©', 'Dead'], 'G'); + verifyEntry(mapping, 'KeyH', ['h', 'H', 'Dead', '̱'], 'H'); + verifyEntry(mapping, 'KeyI', ['i', 'I', 'Dead', '̛'], 'I'); + verifyEntry(mapping, 'KeyJ', ['j', 'J', 'Dead', '̋'], 'J'); + verifyEntry(mapping, 'KeyK', ['k', 'K', 'Dead', '̊'], 'K'); + verifyEntry(mapping, 'KeyL', ['l', 'L', 'Dead', '̵'], 'L'); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'Dead', '̨'], 'M'); + verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', '̃'], 'N'); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 'O'); + verifyEntry(mapping, 'KeyP', ['p', 'P', 'Dead', '̦'], 'P'); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'œ', 'Œ'], 'Q'); + verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '‰'], 'R'); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', ''], 'S'); + verifyEntry(mapping, 'KeyT', ['t', 'T', 'þ', 'Þ'], 'T'); + verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', '̈'], 'U'); + verifyEntry(mapping, 'KeyV', ['v', 'V', 'Dead', '̌'], 'V'); + verifyEntry(mapping, 'KeyW', ['w', 'W', 'Dead', '̇'], 'W'); + verifyEntry(mapping, 'KeyX', ['x', 'X', 'Dead', '̣'], 'X'); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '¥', ''], 'Y'); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'Dead', '̉'], 'Z'); + }); group('en-intl', () { - verifyEntry(mapping, 'Digit0', ['0', ')', 'º', '‚'], 0x30); - verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '⁄'], 0x31); - verifyEntry(mapping, 'Digit2', ['2', '@', '™', '€'], 0x32); - verifyEntry(mapping, 'Digit3', ['3', '#', '£', '‹'], 0x33); - verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '›'], 0x34); - verifyEntry(mapping, 'Digit5', ['5', '%', '∞', 'fi'], 0x35); - verifyEntry(mapping, 'Digit6', ['6', 'Dead', '§', 'fl'], 0x36); - verifyEntry(mapping, 'Digit7', ['7', '&', '¶', '‡'], 0x37); - verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], 0x38); - verifyEntry(mapping, 'Digit9', ['9', '(', 'ª', '·'], 0x39); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 0x41); - verifyEntry(mapping, 'KeyB', ['b', 'B', '∫', 'ı'], 0x42); - verifyEntry(mapping, 'KeyC', ['c', 'C', 'ç', 'Ç'], 0x43); - verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', 'Î'], 0x44); - verifyEntry(mapping, 'KeyE', ['e', 'E', 'Dead', '´'], 0x45); - verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', 'Ï'], 0x46); - verifyEntry(mapping, 'KeyG', ['g', 'G', '©', '˝'], 0x47); - verifyEntry(mapping, 'KeyH', ['h', 'H', '˙', 'Ó'], 0x48); - verifyEntry(mapping, 'KeyI', ['i', 'I', 'Dead', 'ˆ'], 0x49); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '∆', 'Ô'], 0x4a); - verifyEntry(mapping, 'KeyK', ['k', 'K', '˚', ''], 0x4b); - verifyEntry(mapping, 'KeyL', ['l', 'L', '¬', 'Ò'], 0x4c); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', 'Â'], 0x4d); - verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', '˜'], 0x4e); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 0x4f); - verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 0x50); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'œ', 'Œ'], 0x51); - verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '‰'], 0x52); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', 'Í'], 0x53); - verifyEntry(mapping, 'KeyT', ['t', 'T', '†', 'ˇ'], 0x54); - verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', '¨'], 0x55); - verifyEntry(mapping, 'KeyV', ['v', 'V', '√', '◊'], 0x56); - verifyEntry(mapping, 'KeyW', ['w', 'W', '∑', '„'], 0x57); - verifyEntry(mapping, 'KeyX', ['x', 'X', '≈', '˛'], 0x58); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '¥', 'Á'], 0x59); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'Ω', '¸'], 0x5a); -}); + verifyEntry(mapping, 'Digit0', ['0', ')', 'º', '‚'], '0'); + verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '⁄'], '1'); + verifyEntry(mapping, 'Digit2', ['2', '@', '™', '€'], '2'); + verifyEntry(mapping, 'Digit3', ['3', '#', '£', '‹'], '3'); + verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '›'], '4'); + verifyEntry(mapping, 'Digit5', ['5', '%', '∞', 'fi'], '5'); + verifyEntry(mapping, 'Digit6', ['6', 'Dead', '§', 'fl'], '6'); + verifyEntry(mapping, 'Digit7', ['7', '&', '¶', '‡'], '7'); + verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], '8'); + verifyEntry(mapping, 'Digit9', ['9', '(', 'ª', '·'], '9'); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 'A'); + verifyEntry(mapping, 'KeyB', ['b', 'B', '∫', 'ı'], 'B'); + verifyEntry(mapping, 'KeyC', ['c', 'C', 'ç', 'Ç'], 'C'); + verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', 'Î'], 'D'); + verifyEntry(mapping, 'KeyE', ['e', 'E', 'Dead', '´'], 'E'); + verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', 'Ï'], 'F'); + verifyEntry(mapping, 'KeyG', ['g', 'G', '©', '˝'], 'G'); + verifyEntry(mapping, 'KeyH', ['h', 'H', '˙', 'Ó'], 'H'); + verifyEntry(mapping, 'KeyI', ['i', 'I', 'Dead', 'ˆ'], 'I'); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '∆', 'Ô'], 'J'); + verifyEntry(mapping, 'KeyK', ['k', 'K', '˚', ''], 'K'); + verifyEntry(mapping, 'KeyL', ['l', 'L', '¬', 'Ò'], 'L'); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', 'Â'], 'M'); + verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', '˜'], 'N'); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 'O'); + verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 'P'); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'œ', 'Œ'], 'Q'); + verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '‰'], 'R'); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', 'Í'], 'S'); + verifyEntry(mapping, 'KeyT', ['t', 'T', '†', 'ˇ'], 'T'); + verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', '¨'], 'U'); + verifyEntry(mapping, 'KeyV', ['v', 'V', '√', '◊'], 'V'); + verifyEntry(mapping, 'KeyW', ['w', 'W', '∑', '„'], 'W'); + verifyEntry(mapping, 'KeyX', ['x', 'X', '≈', '˛'], 'X'); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '¥', 'Á'], 'Y'); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'Ω', '¸'], 'Z'); + }); group('en-uk', () { - verifyEntry(mapping, 'Digit0', ['0', ')', 'º', '‚'], 0x30); - verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '⁄'], 0x31); - verifyEntry(mapping, 'Digit2', ['2', '@', '€', '™'], 0x32); - verifyEntry(mapping, 'Digit3', ['3', '£', '#', '‹'], 0x33); - verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '›'], 0x34); - verifyEntry(mapping, 'Digit5', ['5', '%', '∞', 'fi'], 0x35); - verifyEntry(mapping, 'Digit6', ['6', '^', '§', 'fl'], 0x36); - verifyEntry(mapping, 'Digit7', ['7', '&', '¶', '‡'], 0x37); - verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], 0x38); - verifyEntry(mapping, 'Digit9', ['9', '(', 'ª', '·'], 0x39); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 0x41); - verifyEntry(mapping, 'KeyB', ['b', 'B', '∫', 'ı'], 0x42); - verifyEntry(mapping, 'KeyC', ['c', 'C', 'ç', 'Ç'], 0x43); - verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', 'Î'], 0x44); - verifyEntry(mapping, 'KeyE', ['e', 'E', 'Dead', '‰'], 0x45); - verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', 'Ï'], 0x46); - verifyEntry(mapping, 'KeyG', ['g', 'G', '©', 'Ì'], 0x47); - verifyEntry(mapping, 'KeyH', ['h', 'H', '˙', 'Ó'], 0x48); - verifyEntry(mapping, 'KeyI', ['i', 'I', 'Dead', 'È'], 0x49); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '∆', 'Ô'], 0x4a); - verifyEntry(mapping, 'KeyK', ['k', 'K', '˚', ''], 0x4b); - verifyEntry(mapping, 'KeyL', ['l', 'L', '¬', 'Ò'], 0x4c); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', '˜'], 0x4d); - verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', 'ˆ'], 0x4e); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 0x4f); - verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 0x50); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'œ', 'Œ'], 0x51); - verifyEntry(mapping, 'KeyR', ['r', 'R', '®', 'Â'], 0x52); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', 'Í'], 0x53); - verifyEntry(mapping, 'KeyT', ['t', 'T', '†', 'Ê'], 0x54); - verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', 'Ë'], 0x55); - verifyEntry(mapping, 'KeyV', ['v', 'V', '√', '◊'], 0x56); - verifyEntry(mapping, 'KeyW', ['w', 'W', '∑', '„'], 0x57); - verifyEntry(mapping, 'KeyX', ['x', 'X', '≈', 'Ù'], 0x58); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '¥', 'Á'], 0x59); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'Ω', 'Û'], 0x5a); -}); + verifyEntry(mapping, 'Digit0', ['0', ')', 'º', '‚'], '0'); + verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '⁄'], '1'); + verifyEntry(mapping, 'Digit2', ['2', '@', '€', '™'], '2'); + verifyEntry(mapping, 'Digit3', ['3', '£', '#', '‹'], '3'); + verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '›'], '4'); + verifyEntry(mapping, 'Digit5', ['5', '%', '∞', 'fi'], '5'); + verifyEntry(mapping, 'Digit6', ['6', '^', '§', 'fl'], '6'); + verifyEntry(mapping, 'Digit7', ['7', '&', '¶', '‡'], '7'); + verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], '8'); + verifyEntry(mapping, 'Digit9', ['9', '(', 'ª', '·'], '9'); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 'A'); + verifyEntry(mapping, 'KeyB', ['b', 'B', '∫', 'ı'], 'B'); + verifyEntry(mapping, 'KeyC', ['c', 'C', 'ç', 'Ç'], 'C'); + verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', 'Î'], 'D'); + verifyEntry(mapping, 'KeyE', ['e', 'E', 'Dead', '‰'], 'E'); + verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', 'Ï'], 'F'); + verifyEntry(mapping, 'KeyG', ['g', 'G', '©', 'Ì'], 'G'); + verifyEntry(mapping, 'KeyH', ['h', 'H', '˙', 'Ó'], 'H'); + verifyEntry(mapping, 'KeyI', ['i', 'I', 'Dead', 'È'], 'I'); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '∆', 'Ô'], 'J'); + verifyEntry(mapping, 'KeyK', ['k', 'K', '˚', ''], 'K'); + verifyEntry(mapping, 'KeyL', ['l', 'L', '¬', 'Ò'], 'L'); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', '˜'], 'M'); + verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', 'ˆ'], 'N'); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 'O'); + verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 'P'); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'œ', 'Œ'], 'Q'); + verifyEntry(mapping, 'KeyR', ['r', 'R', '®', 'Â'], 'R'); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', 'Í'], 'S'); + verifyEntry(mapping, 'KeyT', ['t', 'T', '†', 'Ê'], 'T'); + verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', 'Ë'], 'U'); + verifyEntry(mapping, 'KeyV', ['v', 'V', '√', '◊'], 'V'); + verifyEntry(mapping, 'KeyW', ['w', 'W', '∑', '„'], 'W'); + verifyEntry(mapping, 'KeyX', ['x', 'X', '≈', 'Ù'], 'X'); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '¥', 'Á'], 'Y'); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'Ω', 'Û'], 'Z'); + }); group('es', () { - verifyEntry(mapping, 'Digit0', ['0', '=', '≠', '≈'], 0x30); - verifyEntry(mapping, 'Digit1', ['1', '!', '|', 'ı'], 0x31); - verifyEntry(mapping, 'Digit2', ['2', '"', '@', '˝'], 0x32); - verifyEntry(mapping, 'Digit3', ['3', '·', '#', '•'], 0x33); - verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '£'], 0x34); - verifyEntry(mapping, 'Digit5', ['5', '%', '∞', '‰'], 0x35); - verifyEntry(mapping, 'Digit6', ['6', '&', '¬', ' '], 0x36); - verifyEntry(mapping, 'Digit7', ['7', '/', '÷', '⁄'], 0x37); - verifyEntry(mapping, 'Digit8', ['8', '(', '“', '‘'], 0x38); - verifyEntry(mapping, 'Digit9', ['9', ')', '”', '’'], 0x39); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 0x41); - verifyEntry(mapping, 'KeyB', ['b', 'B', 'ß', ''], 0x42); - verifyEntry(mapping, 'KeyC', ['c', 'C', '©', ' '], 0x43); - verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', '∆'], 0x44); - verifyEntry(mapping, 'KeyE', ['e', 'E', '€', '€'], 0x45); - verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', 'fi'], 0x46); - verifyEntry(mapping, 'KeyG', ['g', 'G', '', 'fl'], 0x47); - verifyEntry(mapping, 'KeyH', ['h', 'H', '™', ' '], 0x48); - verifyEntry(mapping, 'KeyI', ['i', 'I', ' ', ' '], 0x49); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '¶', '¯'], 0x4a); - verifyEntry(mapping, 'KeyK', ['k', 'K', '§', 'ˇ'], 0x4b); - verifyEntry(mapping, 'KeyL', ['l', 'L', ' ', '˘'], 0x4c); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', '˚'], 0x4d); - verifyEntry(mapping, 'KeyN', ['n', 'N', ' ', '˙'], 0x4e); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 0x4f); - verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 0x50); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'œ', 'Œ'], 0x51); - verifyEntry(mapping, 'KeyR', ['r', 'R', '®', ' '], 0x52); - verifyEntry(mapping, 'KeyS', ['s', 'S', '∫', ' '], 0x53); - verifyEntry(mapping, 'KeyT', ['t', 'T', '†', '‡'], 0x54); - verifyEntry(mapping, 'KeyU', ['u', 'U', ' ', ' '], 0x55); - verifyEntry(mapping, 'KeyV', ['v', 'V', '√', '◊'], 0x56); - verifyEntry(mapping, 'KeyW', ['w', 'W', 'æ', 'Æ'], 0x57); - verifyEntry(mapping, 'KeyX', ['x', 'X', '∑', '›'], 0x58); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '¥', ' '], 0x59); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'Ω', '‹'], 0x5a); -}); + verifyEntry(mapping, 'Digit0', ['0', '=', '≠', '≈'], '0'); + verifyEntry(mapping, 'Digit1', ['1', '!', '|', 'ı'], '1'); + verifyEntry(mapping, 'Digit2', ['2', '"', '@', '˝'], '2'); + verifyEntry(mapping, 'Digit3', ['3', '·', '#', '•'], '3'); + verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '£'], '4'); + verifyEntry(mapping, 'Digit5', ['5', '%', '∞', '‰'], '5'); + verifyEntry(mapping, 'Digit6', ['6', '&', '¬', ' '], '6'); + verifyEntry(mapping, 'Digit7', ['7', '/', '÷', '⁄'], '7'); + verifyEntry(mapping, 'Digit8', ['8', '(', '“', '‘'], '8'); + verifyEntry(mapping, 'Digit9', ['9', ')', '”', '’'], '9'); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 'A'); + verifyEntry(mapping, 'KeyB', ['b', 'B', 'ß', ''], 'B'); + verifyEntry(mapping, 'KeyC', ['c', 'C', '©', ' '], 'C'); + verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', '∆'], 'D'); + verifyEntry(mapping, 'KeyE', ['e', 'E', '€', '€'], 'E'); + verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', 'fi'], 'F'); + verifyEntry(mapping, 'KeyG', ['g', 'G', '', 'fl'], 'G'); + verifyEntry(mapping, 'KeyH', ['h', 'H', '™', ' '], 'H'); + verifyEntry(mapping, 'KeyI', ['i', 'I', ' ', ' '], 'I'); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '¶', '¯'], 'J'); + verifyEntry(mapping, 'KeyK', ['k', 'K', '§', 'ˇ'], 'K'); + verifyEntry(mapping, 'KeyL', ['l', 'L', ' ', '˘'], 'L'); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', '˚'], 'M'); + verifyEntry(mapping, 'KeyN', ['n', 'N', ' ', '˙'], 'N'); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 'O'); + verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 'P'); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'œ', 'Œ'], 'Q'); + verifyEntry(mapping, 'KeyR', ['r', 'R', '®', ' '], 'R'); + verifyEntry(mapping, 'KeyS', ['s', 'S', '∫', ' '], 'S'); + verifyEntry(mapping, 'KeyT', ['t', 'T', '†', '‡'], 'T'); + verifyEntry(mapping, 'KeyU', ['u', 'U', ' ', ' '], 'U'); + verifyEntry(mapping, 'KeyV', ['v', 'V', '√', '◊'], 'V'); + verifyEntry(mapping, 'KeyW', ['w', 'W', 'æ', 'Æ'], 'W'); + verifyEntry(mapping, 'KeyX', ['x', 'X', '∑', '›'], 'X'); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '¥', ' '], 'Y'); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'Ω', '‹'], 'Z'); + }); group('fr', () { - verifyEntry(mapping, 'Digit0', ['à', '0', 'ø', 'Ø'], 0x30); - verifyEntry(mapping, 'Digit1', ['&', '1', '', 'Dead'], 0x31); - verifyEntry(mapping, 'Digit2', ['é', '2', 'ë', '„'], 0x32); - verifyEntry(mapping, 'Digit3', ['"', '3', '“', '”'], 0x33); - verifyEntry(mapping, 'Digit4', ["'", '4', '‘', '’'], 0x34); - verifyEntry(mapping, 'Digit5', ['(', '5', '{', '['], 0x35); - verifyEntry(mapping, 'Digit6', ['§', '6', '¶', 'å'], 0x36); - verifyEntry(mapping, 'Digit7', ['è', '7', '«', '»'], 0x37); - verifyEntry(mapping, 'Digit8', ['!', '8', '¡', 'Û'], 0x38); - verifyEntry(mapping, 'Digit9', ['ç', '9', 'Ç', 'Á'], 0x39); - verifyEntry(mapping, 'KeyA', ['q', 'Q', '‡', 'Ω'], 0x51); - verifyEntry(mapping, 'KeyB', ['b', 'B', 'ß', '∫'], 0x42); - verifyEntry(mapping, 'KeyC', ['c', 'C', '©', '¢'], 0x43); - verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', '∆'], 0x44); - verifyEntry(mapping, 'KeyE', ['e', 'E', 'ê', 'Ê'], 0x45); - verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', '·'], 0x46); - verifyEntry(mapping, 'KeyG', ['g', 'G', 'fi', 'fl'], 0x47); - verifyEntry(mapping, 'KeyH', ['h', 'H', 'Ì', 'Î'], 0x48); - verifyEntry(mapping, 'KeyI', ['i', 'I', 'î', 'ï'], 0x49); - verifyEntry(mapping, 'KeyJ', ['j', 'J', 'Ï', 'Í'], 0x4a); - verifyEntry(mapping, 'KeyK', ['k', 'K', 'È', 'Ë'], 0x4b); - verifyEntry(mapping, 'KeyL', ['l', 'L', '¬', '|'], 0x4c); - verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', 'ı'], 0x4e); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'œ', 'Œ'], 0x4f); - verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 0x50); - verifyEntry(mapping, 'KeyQ', ['a', 'A', 'æ', 'Æ'], 0x41); - verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '‚'], 0x52); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'Ò', '∑'], 0x53); - verifyEntry(mapping, 'KeyT', ['t', 'T', '†', '™'], 0x54); - verifyEntry(mapping, 'KeyU', ['u', 'U', 'º', 'ª'], 0x55); - verifyEntry(mapping, 'KeyV', ['v', 'V', '◊', '√'], 0x56); - verifyEntry(mapping, 'KeyW', ['z', 'Z', 'Â', 'Å'], 0x5a); - verifyEntry(mapping, 'KeyX', ['x', 'X', '≈', '⁄'], 0x58); - verifyEntry(mapping, 'KeyY', ['y', 'Y', 'Ú', 'Ÿ'], 0x59); - verifyEntry(mapping, 'KeyZ', ['w', 'W', '‹', '›'], 0x57); - verifyEntry(mapping, 'Semicolon', ['m', 'M', 'µ', 'Ó'], 0x4d); -}); + verifyEntry(mapping, 'Digit0', ['à', '0', 'ø', 'Ø'], '0'); + verifyEntry(mapping, 'Digit1', ['&', '1', '', 'Dead'], '1'); + verifyEntry(mapping, 'Digit2', ['é', '2', 'ë', '„'], '2'); + verifyEntry(mapping, 'Digit3', ['"', '3', '“', '”'], '3'); + verifyEntry(mapping, 'Digit4', ["'", '4', '‘', '’'], '4'); + verifyEntry(mapping, 'Digit5', ['(', '5', '{', '['], '5'); + verifyEntry(mapping, 'Digit6', ['§', '6', '¶', 'å'], '6'); + verifyEntry(mapping, 'Digit7', ['è', '7', '«', '»'], '7'); + verifyEntry(mapping, 'Digit8', ['!', '8', '¡', 'Û'], '8'); + verifyEntry(mapping, 'Digit9', ['ç', '9', 'Ç', 'Á'], '9'); + verifyEntry(mapping, 'KeyA', ['q', 'Q', '‡', 'Ω'], 'Q'); + verifyEntry(mapping, 'KeyB', ['b', 'B', 'ß', '∫'], 'B'); + verifyEntry(mapping, 'KeyC', ['c', 'C', '©', '¢'], 'C'); + verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', '∆'], 'D'); + verifyEntry(mapping, 'KeyE', ['e', 'E', 'ê', 'Ê'], 'E'); + verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', '·'], 'F'); + verifyEntry(mapping, 'KeyG', ['g', 'G', 'fi', 'fl'], 'G'); + verifyEntry(mapping, 'KeyH', ['h', 'H', 'Ì', 'Î'], 'H'); + verifyEntry(mapping, 'KeyI', ['i', 'I', 'î', 'ï'], 'I'); + verifyEntry(mapping, 'KeyJ', ['j', 'J', 'Ï', 'Í'], 'J'); + verifyEntry(mapping, 'KeyK', ['k', 'K', 'È', 'Ë'], 'K'); + verifyEntry(mapping, 'KeyL', ['l', 'L', '¬', '|'], 'L'); + verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', 'ı'], 'N'); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'œ', 'Œ'], 'O'); + verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 'P'); + verifyEntry(mapping, 'KeyQ', ['a', 'A', 'æ', 'Æ'], 'A'); + verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '‚'], 'R'); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'Ò', '∑'], 'S'); + verifyEntry(mapping, 'KeyT', ['t', 'T', '†', '™'], 'T'); + verifyEntry(mapping, 'KeyU', ['u', 'U', 'º', 'ª'], 'U'); + verifyEntry(mapping, 'KeyV', ['v', 'V', '◊', '√'], 'V'); + verifyEntry(mapping, 'KeyW', ['z', 'Z', 'Â', 'Å'], 'Z'); + verifyEntry(mapping, 'KeyX', ['x', 'X', '≈', '⁄'], 'X'); + verifyEntry(mapping, 'KeyY', ['y', 'Y', 'Ú', 'Ÿ'], 'Y'); + verifyEntry(mapping, 'KeyZ', ['w', 'W', '‹', '›'], 'W'); + verifyEntry(mapping, 'Semicolon', ['m', 'M', 'µ', 'Ó'], 'M'); + }); group('it', () { - verifyEntry(mapping, 'Digit0', ['0', '=', '≠', '≈'], 0x30); - verifyEntry(mapping, 'Digit1', ['1', '!', '«', '»'], 0x31); - verifyEntry(mapping, 'Digit2', ['2', '"', '“', '”'], 0x32); - verifyEntry(mapping, 'Digit3', ['3', '£', '‘', '’'], 0x33); - verifyEntry(mapping, 'Digit4', ['4', r'$', '¥', '¢'], 0x34); - verifyEntry(mapping, 'Digit5', ['5', '%', '~', '‰'], 0x35); - verifyEntry(mapping, 'Digit6', ['6', '&', '‹', '›'], 0x36); - verifyEntry(mapping, 'Digit7', ['7', '/', '÷', '⁄'], 0x37); - verifyEntry(mapping, 'Digit8', ['8', '(', 'Dead', ''], 0x38); - verifyEntry(mapping, 'Digit9', ['9', ')', 'Dead', ' '], 0x39); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 0x41); - verifyEntry(mapping, 'KeyB', ['b', 'B', '∫', 'Í'], 0x42); - verifyEntry(mapping, 'KeyC', ['c', 'C', '©', 'Á'], 0x43); - verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', '˘'], 0x44); - verifyEntry(mapping, 'KeyE', ['e', 'E', '€', 'È'], 0x45); - verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', '˙'], 0x46); - verifyEntry(mapping, 'KeyG', ['g', 'G', '∞', '˚'], 0x47); - verifyEntry(mapping, 'KeyH', ['h', 'H', '∆', '¸'], 0x48); - verifyEntry(mapping, 'KeyI', ['i', 'I', 'œ', 'Œ'], 0x49); - verifyEntry(mapping, 'KeyJ', ['j', 'J', 'ª', '˝'], 0x4a); - verifyEntry(mapping, 'KeyK', ['k', 'K', 'º', '˛'], 0x4b); - verifyEntry(mapping, 'KeyL', ['l', 'L', '¬', 'ˇ'], 0x4c); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', 'Ú'], 0x4d); - verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', 'Ó'], 0x4e); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 0x4f); - verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 0x50); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', '„', '‚'], 0x51); - verifyEntry(mapping, 'KeyR', ['r', 'R', '®', 'Ì'], 0x52); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', '¯'], 0x53); - verifyEntry(mapping, 'KeyT', ['t', 'T', '™', 'Ò'], 0x54); - verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', 'Ù'], 0x55); - verifyEntry(mapping, 'KeyV', ['v', 'V', '√', 'É'], 0x56); - verifyEntry(mapping, 'KeyW', ['w', 'W', 'Ω', 'À'], 0x57); - verifyEntry(mapping, 'KeyX', ['x', 'X', '†', '‡'], 0x58); - verifyEntry(mapping, 'KeyY', ['y', 'Y', 'æ', 'Æ'], 0x59); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', '∑', ' '], 0x5a); -}); + verifyEntry(mapping, 'Digit0', ['0', '=', '≠', '≈'], '0'); + verifyEntry(mapping, 'Digit1', ['1', '!', '«', '»'], '1'); + verifyEntry(mapping, 'Digit2', ['2', '"', '“', '”'], '2'); + verifyEntry(mapping, 'Digit3', ['3', '£', '‘', '’'], '3'); + verifyEntry(mapping, 'Digit4', ['4', r'$', '¥', '¢'], '4'); + verifyEntry(mapping, 'Digit5', ['5', '%', '~', '‰'], '5'); + verifyEntry(mapping, 'Digit6', ['6', '&', '‹', '›'], '6'); + verifyEntry(mapping, 'Digit7', ['7', '/', '÷', '⁄'], '7'); + verifyEntry(mapping, 'Digit8', ['8', '(', 'Dead', ''], '8'); + verifyEntry(mapping, 'Digit9', ['9', ')', 'Dead', ' '], '9'); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 'A'); + verifyEntry(mapping, 'KeyB', ['b', 'B', '∫', 'Í'], 'B'); + verifyEntry(mapping, 'KeyC', ['c', 'C', '©', 'Á'], 'C'); + verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', '˘'], 'D'); + verifyEntry(mapping, 'KeyE', ['e', 'E', '€', 'È'], 'E'); + verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', '˙'], 'F'); + verifyEntry(mapping, 'KeyG', ['g', 'G', '∞', '˚'], 'G'); + verifyEntry(mapping, 'KeyH', ['h', 'H', '∆', '¸'], 'H'); + verifyEntry(mapping, 'KeyI', ['i', 'I', 'œ', 'Œ'], 'I'); + verifyEntry(mapping, 'KeyJ', ['j', 'J', 'ª', '˝'], 'J'); + verifyEntry(mapping, 'KeyK', ['k', 'K', 'º', '˛'], 'K'); + verifyEntry(mapping, 'KeyL', ['l', 'L', '¬', 'ˇ'], 'L'); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', 'Ú'], 'M'); + verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', 'Ó'], 'N'); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 'O'); + verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 'P'); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', '„', '‚'], 'Q'); + verifyEntry(mapping, 'KeyR', ['r', 'R', '®', 'Ì'], 'R'); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', '¯'], 'S'); + verifyEntry(mapping, 'KeyT', ['t', 'T', '™', 'Ò'], 'T'); + verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', 'Ù'], 'U'); + verifyEntry(mapping, 'KeyV', ['v', 'V', '√', 'É'], 'V'); + verifyEntry(mapping, 'KeyW', ['w', 'W', 'Ω', 'À'], 'W'); + verifyEntry(mapping, 'KeyX', ['x', 'X', '†', '‡'], 'X'); + verifyEntry(mapping, 'KeyY', ['y', 'Y', 'æ', 'Æ'], 'Y'); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', '∑', ' '], 'Z'); + }); group('jp', () { - verifyEntry(mapping, 'Digit0', ['0', ')', 'º', '‚'], 0x30); - verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '⁄'], 0x31); - verifyEntry(mapping, 'Digit2', ['2', '@', '™', '€'], 0x32); - verifyEntry(mapping, 'Digit3', ['3', '#', '£', '‹'], 0x33); - verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '›'], 0x34); - verifyEntry(mapping, 'Digit5', ['5', '%', '∞', 'fi'], 0x35); - verifyEntry(mapping, 'Digit6', ['6', '^', '§', 'fl'], 0x36); - verifyEntry(mapping, 'Digit7', ['7', '&', '¶', '‡'], 0x37); - verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], 0x38); - verifyEntry(mapping, 'Digit9', ['9', '(', 'ª', '·'], 0x39); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 0x41); - verifyEntry(mapping, 'KeyB', ['b', 'B', '∫', 'ı'], 0x42); - verifyEntry(mapping, 'KeyC', ['c', 'C', 'ç', 'Ç'], 0x43); - verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', 'Î'], 0x44); - verifyEntry(mapping, 'KeyE', ['e', 'E', 'Dead', '´'], 0x45); - verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', 'Ï'], 0x46); - verifyEntry(mapping, 'KeyG', ['g', 'G', '©', '˝'], 0x47); - verifyEntry(mapping, 'KeyH', ['h', 'H', '˙', 'Ó'], 0x48); - verifyEntry(mapping, 'KeyI', ['i', 'I', 'Dead', 'ˆ'], 0x49); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '∆', 'Ô'], 0x4a); - verifyEntry(mapping, 'KeyK', ['k', 'K', '˚', ''], 0x4b); - verifyEntry(mapping, 'KeyL', ['l', 'L', '¬', 'Ò'], 0x4c); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', 'Â'], 0x4d); - verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', '˜'], 0x4e); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 0x4f); - verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 0x50); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'œ', 'Œ'], 0x51); - verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '‰'], 0x52); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', 'Í'], 0x53); - verifyEntry(mapping, 'KeyT', ['t', 'T', '†', 'ˇ'], 0x54); - verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', '¨'], 0x55); - verifyEntry(mapping, 'KeyV', ['v', 'V', '√', '◊'], 0x56); - verifyEntry(mapping, 'KeyW', ['w', 'W', '∑', '„'], 0x57); - verifyEntry(mapping, 'KeyX', ['x', 'X', '≈', '˛'], 0x58); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '¥', 'Á'], 0x59); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'Ω', '¸'], 0x5a); -}); + verifyEntry(mapping, 'Digit0', ['0', ')', 'º', '‚'], '0'); + verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '⁄'], '1'); + verifyEntry(mapping, 'Digit2', ['2', '@', '™', '€'], '2'); + verifyEntry(mapping, 'Digit3', ['3', '#', '£', '‹'], '3'); + verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '›'], '4'); + verifyEntry(mapping, 'Digit5', ['5', '%', '∞', 'fi'], '5'); + verifyEntry(mapping, 'Digit6', ['6', '^', '§', 'fl'], '6'); + verifyEntry(mapping, 'Digit7', ['7', '&', '¶', '‡'], '7'); + verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], '8'); + verifyEntry(mapping, 'Digit9', ['9', '(', 'ª', '·'], '9'); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 'A'); + verifyEntry(mapping, 'KeyB', ['b', 'B', '∫', 'ı'], 'B'); + verifyEntry(mapping, 'KeyC', ['c', 'C', 'ç', 'Ç'], 'C'); + verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', 'Î'], 'D'); + verifyEntry(mapping, 'KeyE', ['e', 'E', 'Dead', '´'], 'E'); + verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', 'Ï'], 'F'); + verifyEntry(mapping, 'KeyG', ['g', 'G', '©', '˝'], 'G'); + verifyEntry(mapping, 'KeyH', ['h', 'H', '˙', 'Ó'], 'H'); + verifyEntry(mapping, 'KeyI', ['i', 'I', 'Dead', 'ˆ'], 'I'); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '∆', 'Ô'], 'J'); + verifyEntry(mapping, 'KeyK', ['k', 'K', '˚', ''], 'K'); + verifyEntry(mapping, 'KeyL', ['l', 'L', '¬', 'Ò'], 'L'); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', 'Â'], 'M'); + verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', '˜'], 'N'); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 'O'); + verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 'P'); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'œ', 'Œ'], 'Q'); + verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '‰'], 'R'); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', 'Í'], 'S'); + verifyEntry(mapping, 'KeyT', ['t', 'T', '†', 'ˇ'], 'T'); + verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', '¨'], 'U'); + verifyEntry(mapping, 'KeyV', ['v', 'V', '√', '◊'], 'V'); + verifyEntry(mapping, 'KeyW', ['w', 'W', '∑', '„'], 'W'); + verifyEntry(mapping, 'KeyX', ['x', 'X', '≈', '˛'], 'X'); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '¥', 'Á'], 'Y'); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'Ω', '¸'], 'Z'); + }); group('jp-roman', () { - verifyEntry(mapping, 'Digit0', ['0', ')', 'º', '‚'], 0x30); - verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '⁄'], 0x31); - verifyEntry(mapping, 'Digit2', ['2', '@', '™', '€'], 0x32); - verifyEntry(mapping, 'Digit3', ['3', '#', '£', '‹'], 0x33); - verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '›'], 0x34); - verifyEntry(mapping, 'Digit5', ['5', '%', '§', '†'], 0x35); - verifyEntry(mapping, 'Digit6', ['6', '^', 'Dead', '̂'], 0x36); - verifyEntry(mapping, 'Digit7', ['7', '&', '¶', '‡'], 0x37); - verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], 0x38); - verifyEntry(mapping, 'Digit9', ['9', '(', 'ª', '·'], 0x39); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'Dead', '̄'], 0x41); - verifyEntry(mapping, 'KeyB', ['b', 'B', 'Dead', '̆'], 0x42); - verifyEntry(mapping, 'KeyC', ['c', 'C', 'Dead', '̧'], 0x43); - verifyEntry(mapping, 'KeyD', ['d', 'D', 'ð', 'Ð'], 0x44); - verifyEntry(mapping, 'KeyE', ['e', 'E', 'Dead', '́'], 0x45); - verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', ''], 0x46); - verifyEntry(mapping, 'KeyG', ['g', 'G', '©', 'Dead'], 0x47); - verifyEntry(mapping, 'KeyH', ['h', 'H', 'Dead', '̱'], 0x48); - verifyEntry(mapping, 'KeyI', ['i', 'I', 'Dead', '̛'], 0x49); - verifyEntry(mapping, 'KeyJ', ['j', 'J', 'Dead', '̋'], 0x4a); - verifyEntry(mapping, 'KeyK', ['k', 'K', 'Dead', '̊'], 0x4b); - verifyEntry(mapping, 'KeyL', ['l', 'L', 'Dead', '̵'], 0x4c); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'Dead', '̨'], 0x4d); - verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', '̃'], 0x4e); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 0x4f); - verifyEntry(mapping, 'KeyP', ['p', 'P', 'Dead', '̦'], 0x50); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'œ', 'Œ'], 0x51); - verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '‰'], 0x52); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', ''], 0x53); - verifyEntry(mapping, 'KeyT', ['t', 'T', 'þ', 'Þ'], 0x54); - verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', '̈'], 0x55); - verifyEntry(mapping, 'KeyV', ['v', 'V', 'Dead', '̌'], 0x56); - verifyEntry(mapping, 'KeyW', ['w', 'W', 'Dead', '̇'], 0x57); - verifyEntry(mapping, 'KeyX', ['x', 'X', 'Dead', '̣'], 0x58); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '¥', ''], 0x59); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'Dead', '̉'], 0x5a); -}); + verifyEntry(mapping, 'Digit0', ['0', ')', 'º', '‚'], '0'); + verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '⁄'], '1'); + verifyEntry(mapping, 'Digit2', ['2', '@', '™', '€'], '2'); + verifyEntry(mapping, 'Digit3', ['3', '#', '£', '‹'], '3'); + verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '›'], '4'); + verifyEntry(mapping, 'Digit5', ['5', '%', '§', '†'], '5'); + verifyEntry(mapping, 'Digit6', ['6', '^', 'Dead', '̂'], '6'); + verifyEntry(mapping, 'Digit7', ['7', '&', '¶', '‡'], '7'); + verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], '8'); + verifyEntry(mapping, 'Digit9', ['9', '(', 'ª', '·'], '9'); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'Dead', '̄'], 'A'); + verifyEntry(mapping, 'KeyB', ['b', 'B', 'Dead', '̆'], 'B'); + verifyEntry(mapping, 'KeyC', ['c', 'C', 'Dead', '̧'], 'C'); + verifyEntry(mapping, 'KeyD', ['d', 'D', 'ð', 'Ð'], 'D'); + verifyEntry(mapping, 'KeyE', ['e', 'E', 'Dead', '́'], 'E'); + verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', ''], 'F'); + verifyEntry(mapping, 'KeyG', ['g', 'G', '©', 'Dead'], 'G'); + verifyEntry(mapping, 'KeyH', ['h', 'H', 'Dead', '̱'], 'H'); + verifyEntry(mapping, 'KeyI', ['i', 'I', 'Dead', '̛'], 'I'); + verifyEntry(mapping, 'KeyJ', ['j', 'J', 'Dead', '̋'], 'J'); + verifyEntry(mapping, 'KeyK', ['k', 'K', 'Dead', '̊'], 'K'); + verifyEntry(mapping, 'KeyL', ['l', 'L', 'Dead', '̵'], 'L'); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'Dead', '̨'], 'M'); + verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', '̃'], 'N'); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 'O'); + verifyEntry(mapping, 'KeyP', ['p', 'P', 'Dead', '̦'], 'P'); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'œ', 'Œ'], 'Q'); + verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '‰'], 'R'); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', ''], 'S'); + verifyEntry(mapping, 'KeyT', ['t', 'T', 'þ', 'Þ'], 'T'); + verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', '̈'], 'U'); + verifyEntry(mapping, 'KeyV', ['v', 'V', 'Dead', '̌'], 'V'); + verifyEntry(mapping, 'KeyW', ['w', 'W', 'Dead', '̇'], 'W'); + verifyEntry(mapping, 'KeyX', ['x', 'X', 'Dead', '̣'], 'X'); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '¥', ''], 'Y'); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'Dead', '̉'], 'Z'); + }); group('ko', () { - verifyEntry(mapping, 'Digit0', ['0', ')', '0', ')'], 0x30); - verifyEntry(mapping, 'Digit1', ['1', '!', '1', '!'], 0x31); - verifyEntry(mapping, 'Digit2', ['2', '@', '2', '@'], 0x32); - verifyEntry(mapping, 'Digit3', ['3', '#', '3', '#'], 0x33); - verifyEntry(mapping, 'Digit4', ['4', r'$', '4', r'$'], 0x34); - verifyEntry(mapping, 'Digit5', ['5', '%', '5', '%'], 0x35); - verifyEntry(mapping, 'Digit6', ['6', '^', '6', '^'], 0x36); - verifyEntry(mapping, 'Digit7', ['7', '&', '7', '&'], 0x37); - verifyEntry(mapping, 'Digit8', ['8', '*', '8', '*'], 0x38); - verifyEntry(mapping, 'Digit9', ['9', '(', '9', '('], 0x39); - verifyEntry(mapping, 'KeyA', ['ㅁ', 'ㅁ', 'a', 'A'], 0x41); - verifyEntry(mapping, 'KeyB', ['ㅠ', 'ㅠ', 'b', 'B'], 0x42); - verifyEntry(mapping, 'KeyC', ['ㅊ', 'ㅊ', 'c', 'C'], 0x43); - verifyEntry(mapping, 'KeyD', ['ㅇ', 'ㅇ', 'd', 'D'], 0x44); - verifyEntry(mapping, 'KeyE', ['ㄷ', 'ㄸ', 'e', 'E'], 0x45); - verifyEntry(mapping, 'KeyF', ['ㄹ', 'ㄹ', 'f', 'F'], 0x46); - verifyEntry(mapping, 'KeyG', ['ㅎ', 'ㅎ', 'g', 'G'], 0x47); - verifyEntry(mapping, 'KeyH', ['ㅗ', 'ㅗ', 'h', 'H'], 0x48); - verifyEntry(mapping, 'KeyI', ['ㅑ', 'ㅑ', 'i', 'I'], 0x49); - verifyEntry(mapping, 'KeyJ', ['ㅓ', 'ㅓ', 'j', 'J'], 0x4a); - verifyEntry(mapping, 'KeyK', ['ㅏ', 'ㅏ', 'k', 'K'], 0x4b); - verifyEntry(mapping, 'KeyL', ['ㅣ', 'ㅣ', 'l', 'L'], 0x4c); - verifyEntry(mapping, 'KeyM', ['ㅡ', 'ㅡ', 'm', 'M'], 0x4d); - verifyEntry(mapping, 'KeyN', ['ㅜ', 'ㅜ', 'n', 'N'], 0x4e); - verifyEntry(mapping, 'KeyO', ['ㅐ', 'ㅒ', 'o', 'O'], 0x4f); - verifyEntry(mapping, 'KeyP', ['ㅔ', 'ㅖ', 'p', 'P'], 0x50); - verifyEntry(mapping, 'KeyQ', ['ㅂ', 'ㅃ', 'q', 'Q'], 0x51); - verifyEntry(mapping, 'KeyR', ['ㄱ', 'ㄲ', 'r', 'R'], 0x52); - verifyEntry(mapping, 'KeyS', ['ㄴ', 'ㄴ', 's', 'S'], 0x53); - verifyEntry(mapping, 'KeyT', ['ㅅ', 'ㅆ', 't', 'T'], 0x54); - verifyEntry(mapping, 'KeyU', ['ㅕ', 'ㅕ', 'u', 'U'], 0x55); - verifyEntry(mapping, 'KeyV', ['ㅍ', 'ㅍ', 'v', 'V'], 0x56); - verifyEntry(mapping, 'KeyW', ['ㅈ', 'ㅉ', 'w', 'W'], 0x57); - verifyEntry(mapping, 'KeyX', ['ㅌ', 'ㅌ', 'x', 'X'], 0x58); - verifyEntry(mapping, 'KeyY', ['ㅛ', 'ㅛ', 'y', 'Y'], 0x59); - verifyEntry(mapping, 'KeyZ', ['ㅋ', 'ㅋ', 'z', 'Z'], 0x5a); -}); + verifyEntry(mapping, 'Digit0', ['0', ')', '0', ')'], '0'); + verifyEntry(mapping, 'Digit1', ['1', '!', '1', '!'], '1'); + verifyEntry(mapping, 'Digit2', ['2', '@', '2', '@'], '2'); + verifyEntry(mapping, 'Digit3', ['3', '#', '3', '#'], '3'); + verifyEntry(mapping, 'Digit4', ['4', r'$', '4', r'$'], '4'); + verifyEntry(mapping, 'Digit5', ['5', '%', '5', '%'], '5'); + verifyEntry(mapping, 'Digit6', ['6', '^', '6', '^'], '6'); + verifyEntry(mapping, 'Digit7', ['7', '&', '7', '&'], '7'); + verifyEntry(mapping, 'Digit8', ['8', '*', '8', '*'], '8'); + verifyEntry(mapping, 'Digit9', ['9', '(', '9', '('], '9'); + verifyEntry(mapping, 'KeyA', ['ㅁ', 'ㅁ', 'a', 'A'], 'A'); + verifyEntry(mapping, 'KeyB', ['ㅠ', 'ㅠ', 'b', 'B'], 'B'); + verifyEntry(mapping, 'KeyC', ['ㅊ', 'ㅊ', 'c', 'C'], 'C'); + verifyEntry(mapping, 'KeyD', ['ㅇ', 'ㅇ', 'd', 'D'], 'D'); + verifyEntry(mapping, 'KeyE', ['ㄷ', 'ㄸ', 'e', 'E'], 'E'); + verifyEntry(mapping, 'KeyF', ['ㄹ', 'ㄹ', 'f', 'F'], 'F'); + verifyEntry(mapping, 'KeyG', ['ㅎ', 'ㅎ', 'g', 'G'], 'G'); + verifyEntry(mapping, 'KeyH', ['ㅗ', 'ㅗ', 'h', 'H'], 'H'); + verifyEntry(mapping, 'KeyI', ['ㅑ', 'ㅑ', 'i', 'I'], 'I'); + verifyEntry(mapping, 'KeyJ', ['ㅓ', 'ㅓ', 'j', 'J'], 'J'); + verifyEntry(mapping, 'KeyK', ['ㅏ', 'ㅏ', 'k', 'K'], 'K'); + verifyEntry(mapping, 'KeyL', ['ㅣ', 'ㅣ', 'l', 'L'], 'L'); + verifyEntry(mapping, 'KeyM', ['ㅡ', 'ㅡ', 'm', 'M'], 'M'); + verifyEntry(mapping, 'KeyN', ['ㅜ', 'ㅜ', 'n', 'N'], 'N'); + verifyEntry(mapping, 'KeyO', ['ㅐ', 'ㅒ', 'o', 'O'], 'O'); + verifyEntry(mapping, 'KeyP', ['ㅔ', 'ㅖ', 'p', 'P'], 'P'); + verifyEntry(mapping, 'KeyQ', ['ㅂ', 'ㅃ', 'q', 'Q'], 'Q'); + verifyEntry(mapping, 'KeyR', ['ㄱ', 'ㄲ', 'r', 'R'], 'R'); + verifyEntry(mapping, 'KeyS', ['ㄴ', 'ㄴ', 's', 'S'], 'S'); + verifyEntry(mapping, 'KeyT', ['ㅅ', 'ㅆ', 't', 'T'], 'T'); + verifyEntry(mapping, 'KeyU', ['ㅕ', 'ㅕ', 'u', 'U'], 'U'); + verifyEntry(mapping, 'KeyV', ['ㅍ', 'ㅍ', 'v', 'V'], 'V'); + verifyEntry(mapping, 'KeyW', ['ㅈ', 'ㅉ', 'w', 'W'], 'W'); + verifyEntry(mapping, 'KeyX', ['ㅌ', 'ㅌ', 'x', 'X'], 'X'); + verifyEntry(mapping, 'KeyY', ['ㅛ', 'ㅛ', 'y', 'Y'], 'Y'); + verifyEntry(mapping, 'KeyZ', ['ㅋ', 'ㅋ', 'z', 'Z'], 'Z'); + }); group('pl', () { - verifyEntry(mapping, 'Digit0', ['0', ')', 'ľ', '‚'], 0x30); - verifyEntry(mapping, 'Digit1', ['1', '!', 'Ń', 'ŕ'], 0x31); - verifyEntry(mapping, 'Digit2', ['2', '@', '™', 'Ř'], 0x32); - verifyEntry(mapping, 'Digit3', ['3', '#', '€', '‹'], 0x33); - verifyEntry(mapping, 'Digit4', ['4', r'$', 'ß', '›'], 0x34); - verifyEntry(mapping, 'Digit5', ['5', '%', 'į', 'ř'], 0x35); - verifyEntry(mapping, 'Digit6', ['6', '^', '§', 'Ŗ'], 0x36); - verifyEntry(mapping, 'Digit7', ['7', '&', '¶', 'ŗ'], 0x37); - verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], 0x38); - verifyEntry(mapping, 'Digit9', ['9', '(', 'Ľ', 'Š'], 0x39); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'ą', 'Ą'], 0x41); - verifyEntry(mapping, 'KeyB', ['b', 'B', 'ļ', 'ű'], 0x42); - verifyEntry(mapping, 'KeyC', ['c', 'C', 'ć', 'Ć'], 0x43); - verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', 'Ž'], 0x44); - verifyEntry(mapping, 'KeyE', ['e', 'E', 'ę', 'Ę'], 0x45); - verifyEntry(mapping, 'KeyF', ['f', 'F', 'ń', 'ž'], 0x46); - verifyEntry(mapping, 'KeyG', ['g', 'G', '©', 'Ū'], 0x47); - verifyEntry(mapping, 'KeyH', ['h', 'H', 'ķ', 'Ó'], 0x48); - verifyEntry(mapping, 'KeyI', ['i', 'I', 'Dead', 'ť'], 0x49); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '∆', 'Ô'], 0x4a); - verifyEntry(mapping, 'KeyK', ['k', 'K', 'Ż', 'ū'], 0x4b); - verifyEntry(mapping, 'KeyL', ['l', 'L', 'ł', 'Ł'], 0x4c); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'Ķ', 'ų'], 0x4d); - verifyEntry(mapping, 'KeyN', ['n', 'N', 'ń', 'Ń'], 0x4e); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'ó', 'Ó'], 0x4f); - verifyEntry(mapping, 'KeyP', ['p', 'P', 'Ļ', 'ł'], 0x50); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'Ō', 'ő'], 0x51); - verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '£'], 0x52); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'ś', 'Ś'], 0x53); - verifyEntry(mapping, 'KeyT', ['t', 'T', '†', 'ś'], 0x54); - verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', 'Ť'], 0x55); - verifyEntry(mapping, 'KeyV', ['v', 'V', '√', '◊'], 0x56); - verifyEntry(mapping, 'KeyW', ['w', 'W', '∑', '„'], 0x57); - verifyEntry(mapping, 'KeyX', ['x', 'X', 'ź', 'Ź'], 0x58); - verifyEntry(mapping, 'KeyY', ['y', 'Y', 'ī', 'Á'], 0x59); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'ż', 'Ż'], 0x5a); -}); + verifyEntry(mapping, 'Digit0', ['0', ')', 'ľ', '‚'], '0'); + verifyEntry(mapping, 'Digit1', ['1', '!', 'Ń', 'ŕ'], '1'); + verifyEntry(mapping, 'Digit2', ['2', '@', '™', 'Ř'], '2'); + verifyEntry(mapping, 'Digit3', ['3', '#', '€', '‹'], '3'); + verifyEntry(mapping, 'Digit4', ['4', r'$', 'ß', '›'], '4'); + verifyEntry(mapping, 'Digit5', ['5', '%', 'į', 'ř'], '5'); + verifyEntry(mapping, 'Digit6', ['6', '^', '§', 'Ŗ'], '6'); + verifyEntry(mapping, 'Digit7', ['7', '&', '¶', 'ŗ'], '7'); + verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], '8'); + verifyEntry(mapping, 'Digit9', ['9', '(', 'Ľ', 'Š'], '9'); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'ą', 'Ą'], 'A'); + verifyEntry(mapping, 'KeyB', ['b', 'B', 'ļ', 'ű'], 'B'); + verifyEntry(mapping, 'KeyC', ['c', 'C', 'ć', 'Ć'], 'C'); + verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', 'Ž'], 'D'); + verifyEntry(mapping, 'KeyE', ['e', 'E', 'ę', 'Ę'], 'E'); + verifyEntry(mapping, 'KeyF', ['f', 'F', 'ń', 'ž'], 'F'); + verifyEntry(mapping, 'KeyG', ['g', 'G', '©', 'Ū'], 'G'); + verifyEntry(mapping, 'KeyH', ['h', 'H', 'ķ', 'Ó'], 'H'); + verifyEntry(mapping, 'KeyI', ['i', 'I', 'Dead', 'ť'], 'I'); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '∆', 'Ô'], 'J'); + verifyEntry(mapping, 'KeyK', ['k', 'K', 'Ż', 'ū'], 'K'); + verifyEntry(mapping, 'KeyL', ['l', 'L', 'ł', 'Ł'], 'L'); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'Ķ', 'ų'], 'M'); + verifyEntry(mapping, 'KeyN', ['n', 'N', 'ń', 'Ń'], 'N'); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'ó', 'Ó'], 'O'); + verifyEntry(mapping, 'KeyP', ['p', 'P', 'Ļ', 'ł'], 'P'); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'Ō', 'ő'], 'Q'); + verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '£'], 'R'); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'ś', 'Ś'], 'S'); + verifyEntry(mapping, 'KeyT', ['t', 'T', '†', 'ś'], 'T'); + verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', 'Ť'], 'U'); + verifyEntry(mapping, 'KeyV', ['v', 'V', '√', '◊'], 'V'); + verifyEntry(mapping, 'KeyW', ['w', 'W', '∑', '„'], 'W'); + verifyEntry(mapping, 'KeyX', ['x', 'X', 'ź', 'Ź'], 'X'); + verifyEntry(mapping, 'KeyY', ['y', 'Y', 'ī', 'Á'], 'Y'); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'ż', 'Ż'], 'Z'); + }); group('pt', () { - verifyEntry(mapping, 'Digit0', ['0', ')', 'º', '‚'], 0x30); - verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '⁄'], 0x31); - verifyEntry(mapping, 'Digit2', ['2', '@', '™', '€'], 0x32); - verifyEntry(mapping, 'Digit3', ['3', '#', '£', '‹'], 0x33); - verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '›'], 0x34); - verifyEntry(mapping, 'Digit5', ['5', '%', '∞', 'fi'], 0x35); - verifyEntry(mapping, 'Digit6', ['6', 'Dead', '§', 'fl'], 0x36); - verifyEntry(mapping, 'Digit7', ['7', '&', '¶', '‡'], 0x37); - verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], 0x38); - verifyEntry(mapping, 'Digit9', ['9', '(', 'ª', '·'], 0x39); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 0x41); - verifyEntry(mapping, 'KeyB', ['b', 'B', '∫', 'ı'], 0x42); - verifyEntry(mapping, 'KeyC', ['c', 'C', 'ç', 'Ç'], 0x43); - verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', 'Î'], 0x44); - verifyEntry(mapping, 'KeyE', ['e', 'E', 'Dead', '´'], 0x45); - verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', 'Ï'], 0x46); - verifyEntry(mapping, 'KeyG', ['g', 'G', '©', '˝'], 0x47); - verifyEntry(mapping, 'KeyH', ['h', 'H', '˙', 'Ó'], 0x48); - verifyEntry(mapping, 'KeyI', ['i', 'I', 'Dead', 'ˆ'], 0x49); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '∆', 'Ô'], 0x4a); - verifyEntry(mapping, 'KeyK', ['k', 'K', '˚', ''], 0x4b); - verifyEntry(mapping, 'KeyL', ['l', 'L', '¬', 'Ò'], 0x4c); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', 'Â'], 0x4d); - verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', '˜'], 0x4e); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 0x4f); - verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 0x50); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'œ', 'Œ'], 0x51); - verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '‰'], 0x52); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', 'Í'], 0x53); - verifyEntry(mapping, 'KeyT', ['t', 'T', '†', 'ˇ'], 0x54); - verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', '¨'], 0x55); - verifyEntry(mapping, 'KeyV', ['v', 'V', '√', '◊'], 0x56); - verifyEntry(mapping, 'KeyW', ['w', 'W', '∑', '„'], 0x57); - verifyEntry(mapping, 'KeyX', ['x', 'X', '≈', '˛'], 0x58); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '¥', 'Á'], 0x59); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'Ω', '¸'], 0x5a); -}); + verifyEntry(mapping, 'Digit0', ['0', ')', 'º', '‚'], '0'); + verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '⁄'], '1'); + verifyEntry(mapping, 'Digit2', ['2', '@', '™', '€'], '2'); + verifyEntry(mapping, 'Digit3', ['3', '#', '£', '‹'], '3'); + verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '›'], '4'); + verifyEntry(mapping, 'Digit5', ['5', '%', '∞', 'fi'], '5'); + verifyEntry(mapping, 'Digit6', ['6', 'Dead', '§', 'fl'], '6'); + verifyEntry(mapping, 'Digit7', ['7', '&', '¶', '‡'], '7'); + verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], '8'); + verifyEntry(mapping, 'Digit9', ['9', '(', 'ª', '·'], '9'); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 'A'); + verifyEntry(mapping, 'KeyB', ['b', 'B', '∫', 'ı'], 'B'); + verifyEntry(mapping, 'KeyC', ['c', 'C', 'ç', 'Ç'], 'C'); + verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', 'Î'], 'D'); + verifyEntry(mapping, 'KeyE', ['e', 'E', 'Dead', '´'], 'E'); + verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', 'Ï'], 'F'); + verifyEntry(mapping, 'KeyG', ['g', 'G', '©', '˝'], 'G'); + verifyEntry(mapping, 'KeyH', ['h', 'H', '˙', 'Ó'], 'H'); + verifyEntry(mapping, 'KeyI', ['i', 'I', 'Dead', 'ˆ'], 'I'); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '∆', 'Ô'], 'J'); + verifyEntry(mapping, 'KeyK', ['k', 'K', '˚', ''], 'K'); + verifyEntry(mapping, 'KeyL', ['l', 'L', '¬', 'Ò'], 'L'); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', 'Â'], 'M'); + verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', '˜'], 'N'); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 'O'); + verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 'P'); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'œ', 'Œ'], 'Q'); + verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '‰'], 'R'); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', 'Í'], 'S'); + verifyEntry(mapping, 'KeyT', ['t', 'T', '†', 'ˇ'], 'T'); + verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', '¨'], 'U'); + verifyEntry(mapping, 'KeyV', ['v', 'V', '√', '◊'], 'V'); + verifyEntry(mapping, 'KeyW', ['w', 'W', '∑', '„'], 'W'); + verifyEntry(mapping, 'KeyX', ['x', 'X', '≈', '˛'], 'X'); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '¥', 'Á'], 'Y'); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'Ω', '¸'], 'Z'); + }); group('ru', () { - verifyEntry(mapping, 'Digit0', ['0', ')', '}', '`'], 0x30); - verifyEntry(mapping, 'Digit1', ['1', '!', '!', '|'], 0x31); - verifyEntry(mapping, 'Digit2', ['2', '"', '@', '"'], 0x32); - verifyEntry(mapping, 'Digit3', ['3', '№', '#', '£'], 0x33); - verifyEntry(mapping, 'Digit4', ['4', '%', r'$', '€'], 0x34); - verifyEntry(mapping, 'Digit5', ['5', ':', '%', '∞'], 0x35); - verifyEntry(mapping, 'Digit6', ['6', ',', '^', '¬'], 0x36); - verifyEntry(mapping, 'Digit7', ['7', '.', '&', '¶'], 0x37); - verifyEntry(mapping, 'Digit8', ['8', ';', '*', '√'], 0x38); - verifyEntry(mapping, 'Digit9', ['9', '(', '{', "'"], 0x39); - verifyEntry(mapping, 'KeyA', ['ф', 'Ф', 'ƒ', 'ƒ'], 0x41); - verifyEntry(mapping, 'KeyB', ['и', 'И', 'и', 'И'], 0x42); - verifyEntry(mapping, 'KeyC', ['с', 'С', '≠', '≠'], 0x43); - verifyEntry(mapping, 'KeyD', ['в', 'В', 'ћ', 'Ћ'], 0x44); - verifyEntry(mapping, 'KeyE', ['у', 'У', 'ќ', 'Ќ'], 0x45); - verifyEntry(mapping, 'KeyF', ['а', 'А', '÷', '÷'], 0x46); - verifyEntry(mapping, 'KeyG', ['п', 'П', '©', '©'], 0x47); - verifyEntry(mapping, 'KeyH', ['р', 'Р', '₽', '₽'], 0x48); - verifyEntry(mapping, 'KeyI', ['ш', 'Ш', 'ѕ', 'Ѕ'], 0x49); - verifyEntry(mapping, 'KeyJ', ['о', 'О', '°', '•'], 0x4a); - verifyEntry(mapping, 'KeyK', ['л', 'Л', 'љ', 'Љ'], 0x4b); - verifyEntry(mapping, 'KeyL', ['д', 'Д', '∆', '∆'], 0x4c); - verifyEntry(mapping, 'KeyM', ['ь', 'Ь', '~', '~'], 0x4d); - verifyEntry(mapping, 'KeyN', ['т', 'Т', '™', '™'], 0x4e); - verifyEntry(mapping, 'KeyO', ['щ', 'Щ', 'ў', 'Ў'], 0x4f); - verifyEntry(mapping, 'KeyP', ['з', 'З', '‘', '’'], 0x50); - verifyEntry(mapping, 'KeyQ', ['й', 'Й', 'ј', 'Ј'], 0x51); - verifyEntry(mapping, 'KeyR', ['к', 'К', '®', '®'], 0x52); - verifyEntry(mapping, 'KeyS', ['ы', 'Ы', 'ы', 'Ы'], 0x53); - verifyEntry(mapping, 'KeyT', ['е', 'Е', '†', '†'], 0x54); - verifyEntry(mapping, 'KeyU', ['г', 'Г', 'ѓ', 'Ѓ'], 0x55); - verifyEntry(mapping, 'KeyV', ['м', 'М', 'µ', 'µ'], 0x56); - verifyEntry(mapping, 'KeyW', ['ц', 'Ц', 'џ', 'Џ'], 0x57); - verifyEntry(mapping, 'KeyX', ['ч', 'Ч', '≈', '≈'], 0x58); - verifyEntry(mapping, 'KeyY', ['н', 'Н', 'њ', 'Њ'], 0x59); - verifyEntry(mapping, 'KeyZ', ['я', 'Я', 'ђ', 'Ђ'], 0x5a); -}); + verifyEntry(mapping, 'Digit0', ['0', ')', '}', '`'], '0'); + verifyEntry(mapping, 'Digit1', ['1', '!', '!', '|'], '1'); + verifyEntry(mapping, 'Digit2', ['2', '"', '@', '"'], '2'); + verifyEntry(mapping, 'Digit3', ['3', '№', '#', '£'], '3'); + verifyEntry(mapping, 'Digit4', ['4', '%', r'$', '€'], '4'); + verifyEntry(mapping, 'Digit5', ['5', ':', '%', '∞'], '5'); + verifyEntry(mapping, 'Digit6', ['6', ',', '^', '¬'], '6'); + verifyEntry(mapping, 'Digit7', ['7', '.', '&', '¶'], '7'); + verifyEntry(mapping, 'Digit8', ['8', ';', '*', '√'], '8'); + verifyEntry(mapping, 'Digit9', ['9', '(', '{', "'"], '9'); + verifyEntry(mapping, 'KeyA', ['ф', 'Ф', 'ƒ', 'ƒ'], 'A'); + verifyEntry(mapping, 'KeyB', ['и', 'И', 'и', 'И'], 'B'); + verifyEntry(mapping, 'KeyC', ['с', 'С', '≠', '≠'], 'C'); + verifyEntry(mapping, 'KeyD', ['в', 'В', 'ћ', 'Ћ'], 'D'); + verifyEntry(mapping, 'KeyE', ['у', 'У', 'ќ', 'Ќ'], 'E'); + verifyEntry(mapping, 'KeyF', ['а', 'А', '÷', '÷'], 'F'); + verifyEntry(mapping, 'KeyG', ['п', 'П', '©', '©'], 'G'); + verifyEntry(mapping, 'KeyH', ['р', 'Р', '₽', '₽'], 'H'); + verifyEntry(mapping, 'KeyI', ['ш', 'Ш', 'ѕ', 'Ѕ'], 'I'); + verifyEntry(mapping, 'KeyJ', ['о', 'О', '°', '•'], 'J'); + verifyEntry(mapping, 'KeyK', ['л', 'Л', 'љ', 'Љ'], 'K'); + verifyEntry(mapping, 'KeyL', ['д', 'Д', '∆', '∆'], 'L'); + verifyEntry(mapping, 'KeyM', ['ь', 'Ь', '~', '~'], 'M'); + verifyEntry(mapping, 'KeyN', ['т', 'Т', '™', '™'], 'N'); + verifyEntry(mapping, 'KeyO', ['щ', 'Щ', 'ў', 'Ў'], 'O'); + verifyEntry(mapping, 'KeyP', ['з', 'З', '‘', '’'], 'P'); + verifyEntry(mapping, 'KeyQ', ['й', 'Й', 'ј', 'Ј'], 'Q'); + verifyEntry(mapping, 'KeyR', ['к', 'К', '®', '®'], 'R'); + verifyEntry(mapping, 'KeyS', ['ы', 'Ы', 'ы', 'Ы'], 'S'); + verifyEntry(mapping, 'KeyT', ['е', 'Е', '†', '†'], 'T'); + verifyEntry(mapping, 'KeyU', ['г', 'Г', 'ѓ', 'Ѓ'], 'U'); + verifyEntry(mapping, 'KeyV', ['м', 'М', 'µ', 'µ'], 'V'); + verifyEntry(mapping, 'KeyW', ['ц', 'Ц', 'џ', 'Џ'], 'W'); + verifyEntry(mapping, 'KeyX', ['ч', 'Ч', '≈', '≈'], 'X'); + verifyEntry(mapping, 'KeyY', ['н', 'Н', 'њ', 'Њ'], 'Y'); + verifyEntry(mapping, 'KeyZ', ['я', 'Я', 'ђ', 'Ђ'], 'Z'); + }); group('sv', () { - verifyEntry(mapping, 'Digit0', ['0', '=', '≈', '≠'], 0x30); - verifyEntry(mapping, 'Digit1', ['1', '!', '©', '¡'], 0x31); - verifyEntry(mapping, 'Digit2', ['2', '"', '@', '”'], 0x32); - verifyEntry(mapping, 'Digit3', ['3', '#', '£', '¥'], 0x33); - verifyEntry(mapping, 'Digit4', ['4', '€', r'$', '¢'], 0x34); - verifyEntry(mapping, 'Digit5', ['5', '%', '∞', '‰'], 0x35); - verifyEntry(mapping, 'Digit6', ['6', '&', '§', '¶'], 0x36); - verifyEntry(mapping, 'Digit7', ['7', '/', '|', r'\'], 0x37); - verifyEntry(mapping, 'Digit8', ['8', '(', '[', '{'], 0x38); - verifyEntry(mapping, 'Digit9', ['9', ')', ']', '}'], 0x39); - verifyEntry(mapping, 'KeyA', ['a', 'A', '', '◊'], 0x41); - verifyEntry(mapping, 'KeyB', ['b', 'B', '›', '»'], 0x42); - verifyEntry(mapping, 'KeyC', ['c', 'C', 'ç', 'Ç'], 0x43); - verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', '∆'], 0x44); - verifyEntry(mapping, 'KeyE', ['e', 'E', 'é', 'É'], 0x45); - verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', '∫'], 0x46); - verifyEntry(mapping, 'KeyG', ['g', 'G', '¸', '¯'], 0x47); - verifyEntry(mapping, 'KeyH', ['h', 'H', '˛', '˘'], 0x48); - verifyEntry(mapping, 'KeyI', ['i', 'I', 'ı', 'ˆ'], 0x49); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '√', '¬'], 0x4a); - verifyEntry(mapping, 'KeyK', ['k', 'K', 'ª', 'º'], 0x4b); - verifyEntry(mapping, 'KeyL', ['l', 'L', 'fi', 'fl'], 0x4c); - verifyEntry(mapping, 'KeyM', ['m', 'M', '’', '”'], 0x4d); - verifyEntry(mapping, 'KeyN', ['n', 'N', '‘', '“'], 0x4e); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'œ', 'Œ'], 0x4f); - verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 0x50); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', '•', '°'], 0x51); - verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '√'], 0x52); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', '∑'], 0x53); - verifyEntry(mapping, 'KeyT', ['t', 'T', '†', '‡'], 0x54); - verifyEntry(mapping, 'KeyU', ['u', 'U', 'ü', 'Ü'], 0x55); - verifyEntry(mapping, 'KeyV', ['v', 'V', '‹', '«'], 0x56); - verifyEntry(mapping, 'KeyW', ['w', 'W', 'Ω', '˝'], 0x57); - verifyEntry(mapping, 'KeyX', ['x', 'X', '≈', 'ˇ'], 0x58); - verifyEntry(mapping, 'KeyY', ['y', 'Y', 'µ', '˜'], 0x59); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', '÷', '⁄'], 0x5a); -}); + verifyEntry(mapping, 'Digit0', ['0', '=', '≈', '≠'], '0'); + verifyEntry(mapping, 'Digit1', ['1', '!', '©', '¡'], '1'); + verifyEntry(mapping, 'Digit2', ['2', '"', '@', '”'], '2'); + verifyEntry(mapping, 'Digit3', ['3', '#', '£', '¥'], '3'); + verifyEntry(mapping, 'Digit4', ['4', '€', r'$', '¢'], '4'); + verifyEntry(mapping, 'Digit5', ['5', '%', '∞', '‰'], '5'); + verifyEntry(mapping, 'Digit6', ['6', '&', '§', '¶'], '6'); + verifyEntry(mapping, 'Digit7', ['7', '/', '|', r'\'], '7'); + verifyEntry(mapping, 'Digit8', ['8', '(', '[', '{'], '8'); + verifyEntry(mapping, 'Digit9', ['9', ')', ']', '}'], '9'); + verifyEntry(mapping, 'KeyA', ['a', 'A', '', '◊'], 'A'); + verifyEntry(mapping, 'KeyB', ['b', 'B', '›', '»'], 'B'); + verifyEntry(mapping, 'KeyC', ['c', 'C', 'ç', 'Ç'], 'C'); + verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', '∆'], 'D'); + verifyEntry(mapping, 'KeyE', ['e', 'E', 'é', 'É'], 'E'); + verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', '∫'], 'F'); + verifyEntry(mapping, 'KeyG', ['g', 'G', '¸', '¯'], 'G'); + verifyEntry(mapping, 'KeyH', ['h', 'H', '˛', '˘'], 'H'); + verifyEntry(mapping, 'KeyI', ['i', 'I', 'ı', 'ˆ'], 'I'); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '√', '¬'], 'J'); + verifyEntry(mapping, 'KeyK', ['k', 'K', 'ª', 'º'], 'K'); + verifyEntry(mapping, 'KeyL', ['l', 'L', 'fi', 'fl'], 'L'); + verifyEntry(mapping, 'KeyM', ['m', 'M', '’', '”'], 'M'); + verifyEntry(mapping, 'KeyN', ['n', 'N', '‘', '“'], 'N'); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'œ', 'Œ'], 'O'); + verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 'P'); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', '•', '°'], 'Q'); + verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '√'], 'R'); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', '∑'], 'S'); + verifyEntry(mapping, 'KeyT', ['t', 'T', '†', '‡'], 'T'); + verifyEntry(mapping, 'KeyU', ['u', 'U', 'ü', 'Ü'], 'U'); + verifyEntry(mapping, 'KeyV', ['v', 'V', '‹', '«'], 'V'); + verifyEntry(mapping, 'KeyW', ['w', 'W', 'Ω', '˝'], 'W'); + verifyEntry(mapping, 'KeyX', ['x', 'X', '≈', 'ˇ'], 'X'); + verifyEntry(mapping, 'KeyY', ['y', 'Y', 'µ', '˜'], 'Y'); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', '÷', '⁄'], 'Z'); + }); group('zh-hans', () { - verifyEntry(mapping, 'Digit0', ['0', ')', 'º', '‚'], 0x30); - verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '⁄'], 0x31); - verifyEntry(mapping, 'Digit2', ['2', '@', '™', '€'], 0x32); - verifyEntry(mapping, 'Digit3', ['3', '#', '£', '‹'], 0x33); - verifyEntry(mapping, 'Digit4', ['4', '¥', '¢', '›'], 0x34); - verifyEntry(mapping, 'Digit5', ['5', '%', '∞', 'fi'], 0x35); - verifyEntry(mapping, 'Digit6', ['6', '', '§', 'fl'], 0x36); - verifyEntry(mapping, 'Digit7', ['7', '&', '¶', '‡'], 0x37); - verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], 0x38); - verifyEntry(mapping, 'Digit9', ['9', '(', 'ª', '·'], 0x39); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 0x41); - verifyEntry(mapping, 'KeyB', ['b', 'B', '∫', 'ı'], 0x42); - verifyEntry(mapping, 'KeyC', ['c', 'C', 'ç', 'Ç'], 0x43); - verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', 'Î'], 0x44); - verifyEntry(mapping, 'KeyE', ['e', 'E', 'Dead', '´'], 0x45); - verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', 'Ï'], 0x46); - verifyEntry(mapping, 'KeyG', ['g', 'G', '©', '˝'], 0x47); - verifyEntry(mapping, 'KeyH', ['h', 'H', '˙', 'Ó'], 0x48); - verifyEntry(mapping, 'KeyI', ['i', 'I', 'Dead', 'ˆ'], 0x49); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '∆', 'Ô'], 0x4a); - verifyEntry(mapping, 'KeyK', ['k', 'K', '˚', ''], 0x4b); - verifyEntry(mapping, 'KeyL', ['l', 'L', '¬', 'Ò'], 0x4c); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', 'Â'], 0x4d); - verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', '˜'], 0x4e); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 0x4f); - verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 0x50); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'œ', 'Œ'], 0x51); - verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '‰'], 0x52); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', 'Í'], 0x53); - verifyEntry(mapping, 'KeyT', ['t', 'T', '†', 'ˇ'], 0x54); - verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', '¨'], 0x55); - verifyEntry(mapping, 'KeyV', ['v', 'V', '√', '◊'], 0x56); - verifyEntry(mapping, 'KeyW', ['w', 'W', '∑', '„'], 0x57); - verifyEntry(mapping, 'KeyX', ['x', 'X', '≈', '˛'], 0x58); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '¥', 'Á'], 0x59); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'Ω', '¸'], 0x5a); -}); + verifyEntry(mapping, 'Digit0', ['0', ')', 'º', '‚'], '0'); + verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '⁄'], '1'); + verifyEntry(mapping, 'Digit2', ['2', '@', '™', '€'], '2'); + verifyEntry(mapping, 'Digit3', ['3', '#', '£', '‹'], '3'); + verifyEntry(mapping, 'Digit4', ['4', '¥', '¢', '›'], '4'); + verifyEntry(mapping, 'Digit5', ['5', '%', '∞', 'fi'], '5'); + verifyEntry(mapping, 'Digit6', ['6', '', '§', 'fl'], '6'); + verifyEntry(mapping, 'Digit7', ['7', '&', '¶', '‡'], '7'); + verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], '8'); + verifyEntry(mapping, 'Digit9', ['9', '(', 'ª', '·'], '9'); + verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 'A'); + verifyEntry(mapping, 'KeyB', ['b', 'B', '∫', 'ı'], 'B'); + verifyEntry(mapping, 'KeyC', ['c', 'C', 'ç', 'Ç'], 'C'); + verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', 'Î'], 'D'); + verifyEntry(mapping, 'KeyE', ['e', 'E', 'Dead', '´'], 'E'); + verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', 'Ï'], 'F'); + verifyEntry(mapping, 'KeyG', ['g', 'G', '©', '˝'], 'G'); + verifyEntry(mapping, 'KeyH', ['h', 'H', '˙', 'Ó'], 'H'); + verifyEntry(mapping, 'KeyI', ['i', 'I', 'Dead', 'ˆ'], 'I'); + verifyEntry(mapping, 'KeyJ', ['j', 'J', '∆', 'Ô'], 'J'); + verifyEntry(mapping, 'KeyK', ['k', 'K', '˚', ''], 'K'); + verifyEntry(mapping, 'KeyL', ['l', 'L', '¬', 'Ò'], 'L'); + verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', 'Â'], 'M'); + verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', '˜'], 'N'); + verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 'O'); + verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 'P'); + verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'œ', 'Œ'], 'Q'); + verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '‰'], 'R'); + verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', 'Í'], 'S'); + verifyEntry(mapping, 'KeyT', ['t', 'T', '†', 'ˇ'], 'T'); + verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', '¨'], 'U'); + verifyEntry(mapping, 'KeyV', ['v', 'V', '√', '◊'], 'V'); + verifyEntry(mapping, 'KeyW', ['w', 'W', '∑', '„'], 'W'); + verifyEntry(mapping, 'KeyX', ['x', 'X', '≈', '˛'], 'X'); + verifyEntry(mapping, 'KeyY', ['y', 'Y', '¥', 'Á'], 'Y'); + verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'Ω', '¸'], 'Z'); + }); } diff --git a/third_party/web_keyboard_layouts/test/testing.dart b/third_party/web_keyboard_layouts/test/testing.dart index 995144a76f1f5..712ed4ed84a5d 100644 --- a/third_party/web_keyboard_layouts/test/testing.dart +++ b/third_party/web_keyboard_layouts/test/testing.dart @@ -16,7 +16,14 @@ bool _isLetter(String char) { || (charCode >= _kUpperA && charCode <= _kUpperZ); } -void verifyEntry(LayoutMapping mapping, String eventCode, List eventKeys, int logicalKey) { +String _fromCharCode(int? logicalKey) { + if (logicalKey == null) { + return ''; + } + return String.fromCharCode(logicalKey); +} + +void verifyEntry(LayoutMapping mapping, String eventCode, List eventKeys, String mappedResult) { // If the first two entry of KeyboardEvent.key are letter keys such as "a" and // "A", then KeyboardEvent.keyCode is the upper letter such as "A". Otherwise, // this field must not be used (in reality this field may or may not be @@ -34,7 +41,10 @@ void verifyEntry(LayoutMapping mapping, String eventCode, List eventKeys continue; } test('$eventCode $index', () { - expect(mapping.getLogicalKey(eventCode, eventKey, eventKeyCode ?? ''), logicalKey); + expect( + _fromCharCode(mapping.getLogicalKey(eventCode, eventKey, eventKeyCode ?? '')), + mappedResult, + ); }); index += 1; } diff --git a/tools/gen_web_keyboard_layouts/lib/main.dart b/tools/gen_web_keyboard_layouts/lib/main.dart index 0da32ae247bb7..345c5e21fc8f4 100644 --- a/tools/gen_web_keyboard_layouts/lib/main.dart +++ b/tools/gen_web_keyboard_layouts/lib/main.dart @@ -146,12 +146,12 @@ String _buildTestCasesString(List layouts) { final LayoutEntry entry = layout.entries[eventCode]!; layoutEntries.add(" verifyEntry(mapping, '$eventCode', [" '${entry.printables.map(_escapeEventKey).join(', ')}' - '], 0x${logicalKey.toRadixString(16)});'); + "], '${String.fromCharCode(logicalKey)}');"); }); layoutsString.add(''' group('${layout.language}', () { ${layoutEntries.join('\n')} -}); + }); '''); } return layoutsString.join('\n').trimRight(); From 9cec217effb8a6db3715a314f1f92015ab414744 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Tue, 8 Nov 2022 16:28:07 -0800 Subject: [PATCH 31/74] Compile --- lib/web_ui/lib/src/engine.dart | 1 - lib/web_ui/lib/src/engine/embedder.dart | 2 +- .../lib/src/engine/keyboard_binding.dart | 64 ++++-- .../src/engine/keyboard_layout_detector.dart | 186 ------------------ .../lib/web_keyboard_layouts.dart | 26 +-- .../key_mappings.g.dart | 2 - .../lib/web_keyboard_layouts/types.dart | 25 +++ web_sdk/BUILD.gn | 10 +- web_sdk/libraries.json | 9 +- 9 files changed, 87 insertions(+), 238 deletions(-) delete mode 100644 lib/web_ui/lib/src/engine/keyboard_layout_detector.dart rename third_party/web_keyboard_layouts/lib/{ => web_keyboard_layouts}/key_mappings.g.dart (99%) create mode 100644 third_party/web_keyboard_layouts/lib/web_keyboard_layouts/types.dart diff --git a/lib/web_ui/lib/src/engine.dart b/lib/web_ui/lib/src/engine.dart index 2f19dae2d79d4..f83e43ce5245d 100644 --- a/lib/web_ui/lib/src/engine.dart +++ b/lib/web_ui/lib/src/engine.dart @@ -109,7 +109,6 @@ export 'engine/js_interop/js_loader.dart'; export 'engine/js_interop/js_promise.dart'; export 'engine/key_map.g.dart'; export 'engine/keyboard_binding.dart'; -export 'engine/keyboard_layout_detector.dart'; export 'engine/mouse_cursor.dart'; export 'engine/navigation/history.dart'; export 'engine/navigation/js_url_strategy.dart'; diff --git a/lib/web_ui/lib/src/engine/embedder.dart b/lib/web_ui/lib/src/engine/embedder.dart index 42479a07c8b2f..18bc92d3de37d 100644 --- a/lib/web_ui/lib/src/engine/embedder.dart +++ b/lib/web_ui/lib/src/engine/embedder.dart @@ -324,7 +324,7 @@ class FlutterViewEmbedder { } KeyboardBinding.initInstance(); - PointerBinding.initInstance(glassPaneElement, KeyboardBinding.instance!.converter); + PointerBinding.initInstance(glassPaneElement, KeyboardBinding.instance.converter); if (domWindow.visualViewport == null && isWebKit) { // Older Safari versions sometimes give us bogus innerWidth/innerHeight diff --git a/lib/web_ui/lib/src/engine/keyboard_binding.dart b/lib/web_ui/lib/src/engine/keyboard_binding.dart index 4989895ac5a5b..e7dcc29691fb2 100644 --- a/lib/web_ui/lib/src/engine/keyboard_binding.dart +++ b/lib/web_ui/lib/src/engine/keyboard_binding.dart @@ -4,12 +4,12 @@ import 'package:meta/meta.dart'; import 'package:ui/ui.dart' as ui; +import 'package:web_keyboard_layouts/web_keyboard_layouts.dart' as keyboard_layouts; import '../engine.dart' show registerHotRestartListener; import 'browser_detection.dart'; import 'dom.dart'; import 'key_map.g.dart'; -import 'keyboard_layout_detector.dart'; import 'platform_dispatcher.dart'; import 'safe_browser_api.dart'; import 'semantics.dart'; @@ -101,11 +101,17 @@ Duration _eventTimeStampToDuration(num milliseconds) { class KeyboardBinding { KeyboardBinding._() { - _setup(); + _addEventListener('keydown', allowInterop((DomEvent domEvent) { + final FlutterHtmlKeyboardEvent event = FlutterHtmlKeyboardEvent(domEvent as DomKeyboardEvent); + return _converter.handleEvent(event); + })); + _addEventListener('keyup', allowInterop((DomEvent event) { + return _converter.handleEvent(FlutterHtmlKeyboardEvent(event as DomKeyboardEvent)); + })); } /// The singleton instance of this object. - static KeyboardBinding? get instance => _instance; + static KeyboardBinding get instance => _instance!; static KeyboardBinding? _instance; static void initInstance() { @@ -118,9 +124,23 @@ class KeyboardBinding { } } - final KeyboardLayoutDetector layoutDetector = KeyboardLayoutDetector(); + static void debugClearInstance() { + _instance = null; + } + + /// The platform as used in the initialization. + /// + /// By default it is derived from [operatingSystem]. + @protected + OperatingSystem get localPlatform { + return operatingSystem; + } + KeyboardConverter get converter => _converter; - late final KeyboardConverter _converter; + late final KeyboardConverter _converter = KeyboardConverter( + _onKeyData, + localPlatform, + ); final Map _listeners = {}; void _addEventListener(String eventName, DomEventListener handler) { @@ -156,18 +176,6 @@ class KeyboardBinding { return result!; } - void _setup() { - _addEventListener('keydown', allowInterop((DomEvent event) { - layoutDetector.update(event as DomKeyboardEvent); - print('${event.code} 0x${layoutDetector.getKey(event.code ?? '')?.toRadixString(16)}'); - return _converter.handleEvent(FlutterHtmlKeyboardEvent(event)); - })); - _addEventListener('keyup', allowInterop((DomEvent event) { - return _converter.handleEvent(FlutterHtmlKeyboardEvent(event as DomKeyboardEvent)); - })); - _converter = KeyboardConverter(_onKeyData, onMacOs: operatingSystem == OperatingSystem.macOs); - } - void _reset() { _clearListeners(); _converter.dispose(); @@ -214,10 +222,30 @@ class FlutterHtmlKeyboardEvent { // [dispatchKeyData] as given in the constructor. Some key data might be // dispatched asynchronously. class KeyboardConverter { - KeyboardConverter(this.performDispatchKeyData, {this.onMacOs = false}); + KeyboardConverter(this.performDispatchKeyData, OperatingSystem platform) + : onMacOs = platform == OperatingSystem.macOs, + _mapping = _mappingFromPlatform(platform); final DispatchKeyData performDispatchKeyData; + // Whether the current platform is macOS, which affects how certain key events + // are comprehended. final bool onMacOs; + // A huge map that maps certain key event properties to logical keys. + // + // It is a map of KeyboardEvent.code -> KeyboardEvent.key -> logical_key. + final Map> _mapping; + + static Map> _mappingFromPlatform(OperatingSystem platform) { + switch (platform) { + case OperatingSystem.iOs: + case OperatingSystem.macOs: + return keyboard_layouts.kDarwinMapping; + case OperatingSystem.windows: + return keyboard_layouts.kWinMapping; + default: + return keyboard_layouts.kLinuxMapping; + } + } // The `performDispatchKeyData` wrapped with tracking logic. // diff --git a/lib/web_ui/lib/src/engine/keyboard_layout_detector.dart b/lib/web_ui/lib/src/engine/keyboard_layout_detector.dart deleted file mode 100644 index 2bd249dba0a44..0000000000000 --- a/lib/web_ui/lib/src/engine/keyboard_layout_detector.dart +++ /dev/null @@ -1,186 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:web_keyboard_layouts/web_keyboard_layouts.dart' as keyboard_layouts; -import 'dom.dart'; - -// Set this flag to true to see the details during layout detection. -const bool _debugLogLayoutEvents = true; -void _debugLog(String message) { - if (_debugLogLayoutEvents) { - print(message); - } -} - -// bool _isEascii(String clue) { -// return clue.length == 1 && clue.codeUnitAt(0) < 256; -// } - -class KeyboardLayoutDetector { - void update(DomKeyboardEvent event) { - if (event.type != 'keydown') { - return; - } - if (!keyboard_layouts.kLayoutStore.goals.containsKey(event.code)) { - return; - } - print('Cue ${event.code} key ${event.key}'); - - // There is an existing candidate list. Filter based on it. - if (_candidates.isNotEmpty) { - final bool effectiveCue = _filterCandidates(_candidates, event); - if (effectiveCue) { - _debugCues.add(event); - } - if (_candidates.isNotEmpty) { - // There are some candidates left. Move forward. - return; - } else { - _debugLog('[Debug] Keyboard layout: Candidates exhausted. Past cues:' - '${_debugCuesToString(_debugCues)}'); - } - } - - // Start anew: Filter based on the entire list. - _candidates.addAll(_fullCandidates); - _debugCues.clear(); - final bool effectiveCue = _filterCandidates(_candidates, event); - if (effectiveCue) { - _debugCues.add(event); - } - if (_candidates.isEmpty) { - _debugLog('[Debug] Keyboard layout: Candidates exhausted on first try. Past cues:' - '${_debugCuesToString(_debugCues)}'); - } - } - - int? getKey(String code) { - if (_candidates.isEmpty) { - return null; - } - final keyboard_layouts.Layout candidate = _candidates.first; - if (candidate.language != _debugLastLayout) { - _debugLog('[Debug] Switching to layout ${candidate.language}.'); - _debugLastLayout = candidate.language; - } - final Map map = _calculatedLayouts.putIfAbsent( - candidate.language, - () => _buildLayout(candidate.entries, candidate.language)); - return map[code]; - } - - static bool _filterCandidates(List candidates, DomKeyboardEvent event) { - final int beforeCandidateNum = candidates.length; - final bool thisIsDead = event.key == 'Dead'; - final bool thisHasAltGr = event.getModifierState('AltGraph'); - final bool thisHasShift = event.shiftKey; - final int printableIndex = (thisHasShift ? 1 : 0) + (thisHasAltGr ? 2 : 0); - final int deadMask = 1 << printableIndex; - candidates.retainWhere((keyboard_layouts.Layout layout) { - final keyboard_layouts.LayoutEntry entry = layout.entries[event.code!]!; - if (thisIsDead) { - return (entry.deadMasks & deadMask) != 0; - } else { - return entry.printables[printableIndex] == event.key; - } - }); - final int afterCandidateNum = candidates.length; - print('Filter before $beforeCandidateNum after $afterCandidateNum'); - return afterCandidateNum < beforeCandidateNum; - } - - static Map _buildLayout(Map entries, String debugLayoutName) { - _debugLog('Building layout for $debugLayoutName'); - // Unresolved mandatory goals, mapped from printables to KeyboardEvent.code. - // This map will be modified during this function and thus is a clone. - final Map mandatoryGoalsByChar = {..._mandatoryGoalsByChar}; - // The result mapping from KeyboardEvent.code to logical key. - final Map result = {}; - // The logical key should be the first available clue from below: - // - // 1. Mandatory goal, if it matches any clue. This ensures that all alnum - // keys can be found somewhere. - // 2. US layout, if neither clue of the key is EASCII. This ensures that - // there are no non-latin logical keys. - // 3. Derived on the fly from keyCode & characters. - - entries.forEach((String eventCode, keyboard_layouts.LayoutEntry entry) { - // bool anyEascii = false; - for (int index = 0; index < 4; index += 1) { - // Ignore dead keys. - if (entry.deadMasks & (1 << index) != 0) { - continue; - } - // A printable of this key is a mandatory goal: Use it. - final String printable = entry.printables[index]; - if (mandatoryGoalsByChar.containsKey(printable)) { - result[eventCode] = printable.codeUnitAt(0); - mandatoryGoalsByChar.remove(printable); - } - // if (_isEascii(entry.printables[index])) { - // anyEascii = true; - // } - } - - // // If all clues on this key are non-EASCII, use the verbatim key. - // if (!anyEascii) { - // final String? verbatimPrintable = kLayoutStore.goals[eventCode]; - // if (verbatimPrintable != null - // && mandatoryGoalsByChar.remove(verbatimPrintable) != null) { - // result[eventCode] = verbatimPrintable.codeUnitAt(0); - // } - // } - }); - - // Ensure all mandatory goals are assigned. - mandatoryGoalsByChar.forEach((String character, String code) { - result[code] = character.codeUnitAt(0); - }); - assert(() { - print(result); - return true; - }()); - return result; - } - - final List _candidates = []; - final Map> _calculatedLayouts = >{}; - - // Record all effective cues since the last reset. That is, cues that filtered - // out any candidates. This is used to print out debug information. - final List _debugCues = []; - String _debugLastLayout = ''; - - static final List _fullCandidates = keyboard_layouts.kLayoutStore.layouts.where( - (keyboard_layouts.Layout layout) => layout.platform == _currentPlatform, - ).toList(); - static final keyboard_layouts.LayoutPlatform _currentPlatform = () { - // TODO - return keyboard_layouts.LayoutPlatform.win; - }(); - static final Map _mandatoryGoalsByChar = Map.fromEntries( - keyboard_layouts.kLayoutStore.goals - .entries - .where((MapEntry entry) => entry.value != null) - .map((MapEntry entry) => MapEntry(entry.value!, entry.key)) - ); - - static String _debugEventToString(DomKeyboardEvent event) { - final String flags = [ - if (event.altKey) 'Alt', - if (event.shiftKey) 'Shift', - ].join(' | '); - final String parameters = [ - event.code ?? '', - event.key ?? '', - if (flags.isNotEmpty) flags, - ].join(', '); - return 'Event($parameters)'; - } - - static String _debugCuesToString(List cues) { - return cues.map((DomKeyboardEvent event) => - '\n ${_debugEventToString(event)}').join(); - } -} diff --git a/third_party/web_keyboard_layouts/lib/web_keyboard_layouts.dart b/third_party/web_keyboard_layouts/lib/web_keyboard_layouts.dart index ad3b5e8b671b8..fa6af19447784 100644 --- a/third_party/web_keyboard_layouts/lib/web_keyboard_layouts.dart +++ b/third_party/web_keyboard_layouts/lib/web_keyboard_layouts.dart @@ -3,27 +3,5 @@ library web_keyboard_layouts; -part 'key_mappings.g.dart'; - -const int _kUseKeyCode = 1; - -class LayoutMapping { - LayoutMapping.win() : _mapping = kWinMapping; - LayoutMapping.linux() : _mapping = kLinuxMapping; - LayoutMapping.darwin() : _mapping = kDarwinMapping; - - int? getLogicalKey(String eventCode, String eventKey, String eventKeyCode) { - final int? result = _mapping[eventCode]?[eventKey]; - if (result == _kUseKeyCode) { - return getLetterCode(eventKeyCode.toUpperCase()); - } - return result; - } - - final Map> _mapping; - - static int? getLetterCode(String letter) { - assert (letter.length == 1); - return letter.codeUnitAt(0); - } -} +export 'web_keyboard_layouts/key_mappings.g.dart'; +export 'web_keyboard_layouts/types.dart'; diff --git a/third_party/web_keyboard_layouts/lib/key_mappings.g.dart b/third_party/web_keyboard_layouts/lib/web_keyboard_layouts/key_mappings.g.dart similarity index 99% rename from third_party/web_keyboard_layouts/lib/key_mappings.g.dart rename to third_party/web_keyboard_layouts/lib/web_keyboard_layouts/key_mappings.g.dart index 050318d87d6f6..e74af7f5931eb 100644 --- a/third_party/web_keyboard_layouts/lib/key_mappings.g.dart +++ b/third_party/web_keyboard_layouts/lib/web_keyboard_layouts/key_mappings.g.dart @@ -13,8 +13,6 @@ // // See flutter/engine:flutter/tools/gen_web_keyboard_layouts/README.md for more information. -part of web_keyboard_layouts; - final Map> kWinMapping = >{ 'Backquote': { '0': 0x30, diff --git a/third_party/web_keyboard_layouts/lib/web_keyboard_layouts/types.dart b/third_party/web_keyboard_layouts/lib/web_keyboard_layouts/types.dart new file mode 100644 index 0000000000000..ce6d6f53645db --- /dev/null +++ b/third_party/web_keyboard_layouts/lib/web_keyboard_layouts/types.dart @@ -0,0 +1,25 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. + +const int _kUseKeyCode = 1; + +class LayoutMapping { + LayoutMapping.win() : _mapping = kWinMapping; + LayoutMapping.linux() : _mapping = kLinuxMapping; + LayoutMapping.darwin() : _mapping = kDarwinMapping; + + int? getLogicalKey(String eventCode, String eventKey, String eventKeyCode) { + final int? result = _mapping[eventCode]?[eventKey]; + if (result == _kUseKeyCode) { + return getLetterCode(eventKeyCode.toUpperCase()); + } + return result; + } + + final Map> _mapping; + + static int? getLetterCode(String letter) { + assert (letter.length == 1); + return letter.codeUnitAt(0); + } +} diff --git a/web_sdk/BUILD.gn b/web_sdk/BUILD.gn index b3614cebacf78..dbfbd80a120c1 100644 --- a/web_sdk/BUILD.gn +++ b/web_sdk/BUILD.gn @@ -112,7 +112,8 @@ sdk_rewriter("web_ui_library_sources") { } sdk_rewriter("web_keyboard_layouts_library") { - ui = true + library_name = "web_keyboard_layouts" + api_file = "//flutter/third_party/web_keyboard_layouts/lib/web_keyboard_layouts.dart" input_dir = "//flutter/third_party/web_keyboard_layouts/lib/" output_dir = "$root_out_dir/flutter_web_sdk/lib/web_keyboard_layouts/" } @@ -286,7 +287,7 @@ template("_compile_platform") { assert(defined(invoker.output_dill), "output_dill must be defined for $target_name") _kernel_worker(target_name) { - inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_keyboard_layouts_sources outputs = [ invoker.output_dill ] @@ -324,6 +325,8 @@ template("_compile_platform") { "dart:_engine", "--source", "dart:_skwasm_stub", + "--source", + "dart:web_keyboard_layouts", ] if (flutter_prebuilt_dart_sdk) { args += [ @@ -454,7 +457,7 @@ template("_compile_ddc_modules") { "auto_detect must be defined for $target_name") _dartdevc(target_name) { - inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_keyboard_layouts_sources packages = dart_sdk_package_config @@ -495,6 +498,7 @@ template("_compile_ddc_modules") { "dart:ui", "dart:_engine", "dart:_skwasm_stub", + "dart:web_keyboard_layouts", "--no-summarize", "--packages", "file:///" + rebase_path(dart_sdk_package_config), diff --git a/web_sdk/libraries.json b/web_sdk/libraries.json index e1e79bade259c..d875c4dc71b6d 100644 --- a/web_sdk/libraries.json +++ b/web_sdk/libraries.json @@ -15,11 +15,11 @@ "_engine": { "uri": "lib/_engine/engine.dart" }, - "_skwasm_stub": { - "uri": "lib/_skwasm_stub/skwasm_stub.dart" - }, "web_keyboard_layouts": { "uri": "lib/web_keyboard_layouts/web_keyboard_layouts.dart" + }, + "_skwasm_stub": { + "uri": "lib/_skwasm_stub/skwasm_stub.dart" } } }, @@ -39,6 +39,9 @@ }, "_skwasm_stub": { "uri": "lib/_skwasm_stub/skwasm_stub.dart" + }, + "web_keyboard_layouts": { + "uri": "lib/web_keyboard_layouts/web_keyboard_layouts.dart" } } }, From 0010a73ac4d68dbd9d84fdf368321de6b54f51d9 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Tue, 8 Nov 2022 16:47:50 -0800 Subject: [PATCH 32/74] int keycode, and fix compile --- .../lib/src/engine/keyboard_binding.dart | 18 ++++++++++-------- .../lib/web_keyboard_layouts/types.dart | 11 ++++------- .../web_keyboard_layouts/test/testing.dart | 6 +++--- .../test/gen_defaults_test.dart | 2 +- web_sdk/BUILD.gn | 2 +- 5 files changed, 19 insertions(+), 20 deletions(-) diff --git a/lib/web_ui/lib/src/engine/keyboard_binding.dart b/lib/web_ui/lib/src/engine/keyboard_binding.dart index e7dcc29691fb2..0d502f087b337 100644 --- a/lib/web_ui/lib/src/engine/keyboard_binding.dart +++ b/lib/web_ui/lib/src/engine/keyboard_binding.dart @@ -230,20 +230,18 @@ class KeyboardConverter { // Whether the current platform is macOS, which affects how certain key events // are comprehended. final bool onMacOs; - // A huge map that maps certain key event properties to logical keys. - // - // It is a map of KeyboardEvent.code -> KeyboardEvent.key -> logical_key. - final Map> _mapping; + // Maps logical keys from key event properties. + final keyboard_layouts.LayoutMapping _mapping; - static Map> _mappingFromPlatform(OperatingSystem platform) { + static keyboard_layouts.LayoutMapping _mappingFromPlatform(OperatingSystem platform) { switch (platform) { case OperatingSystem.iOs: case OperatingSystem.macOs: - return keyboard_layouts.kDarwinMapping; + return keyboard_layouts.LayoutMapping.darwin(); case OperatingSystem.windows: - return keyboard_layouts.kWinMapping; + return keyboard_layouts.LayoutMapping.win(); default: - return keyboard_layouts.kLinuxMapping; + return keyboard_layouts.LayoutMapping.linux(); } } @@ -408,6 +406,10 @@ class KeyboardConverter { assert(result != null, 'Invalid modifier location: ${event.key}, ${event.location}'); return result!; } + final int? logicalKeyFromMap = _mapping.getLogicalKey(event.code, event.key, event.keyCode); + if (logicalKeyFromMap != null) { + return logicalKeyFromMap; + } if (character != null) { return _characterToLogicalKey(character); } diff --git a/third_party/web_keyboard_layouts/lib/web_keyboard_layouts/types.dart b/third_party/web_keyboard_layouts/lib/web_keyboard_layouts/types.dart index ce6d6f53645db..edb7bd281db17 100644 --- a/third_party/web_keyboard_layouts/lib/web_keyboard_layouts/types.dart +++ b/third_party/web_keyboard_layouts/lib/web_keyboard_layouts/types.dart @@ -1,6 +1,8 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. +import 'key_mappings.g.dart'; + const int _kUseKeyCode = 1; class LayoutMapping { @@ -8,18 +10,13 @@ class LayoutMapping { LayoutMapping.linux() : _mapping = kLinuxMapping; LayoutMapping.darwin() : _mapping = kDarwinMapping; - int? getLogicalKey(String eventCode, String eventKey, String eventKeyCode) { + int? getLogicalKey(String? eventCode, String? eventKey, int eventKeyCode) { final int? result = _mapping[eventCode]?[eventKey]; if (result == _kUseKeyCode) { - return getLetterCode(eventKeyCode.toUpperCase()); + return eventKeyCode; } return result; } final Map> _mapping; - - static int? getLetterCode(String letter) { - assert (letter.length == 1); - return letter.codeUnitAt(0); - } } diff --git a/third_party/web_keyboard_layouts/test/testing.dart b/third_party/web_keyboard_layouts/test/testing.dart index 712ed4ed84a5d..8c0460681a9a3 100644 --- a/third_party/web_keyboard_layouts/test/testing.dart +++ b/third_party/web_keyboard_layouts/test/testing.dart @@ -28,10 +28,10 @@ void verifyEntry(LayoutMapping mapping, String eventCode, List eventKeys // "A", then KeyboardEvent.keyCode is the upper letter such as "A". Otherwise, // this field must not be used (in reality this field may or may not be // platform independent). - String? eventKeyCode; + int? eventKeyCode; { if (_isLetter(eventKeys[0]) && _isLetter(eventKeys[1])) { - eventKeyCode = eventKeys[0].toUpperCase(); + eventKeyCode = eventKeys[0].toUpperCase().codeUnitAt(0); } } @@ -42,7 +42,7 @@ void verifyEntry(LayoutMapping mapping, String eventCode, List eventKeys } test('$eventCode $index', () { expect( - _fromCharCode(mapping.getLogicalKey(eventCode, eventKey, eventKeyCode ?? '')), + _fromCharCode(mapping.getLogicalKey(eventCode, eventKey, eventKeyCode ?? 0)), mappedResult, ); }); diff --git a/tools/gen_web_keyboard_layouts/test/gen_defaults_test.dart b/tools/gen_web_keyboard_layouts/test/gen_defaults_test.dart index b0f86982e522b..bde3334ea7716 100644 --- a/tools/gen_web_keyboard_layouts/test/gen_defaults_test.dart +++ b/tools/gen_web_keyboard_layouts/test/gen_defaults_test.dart @@ -4,7 +4,7 @@ import 'dart:io'; -import 'package:gen_web_keyboard_layouts/template.dart'; +import 'package:gen_web_keyboard_layouts/main.dart'; import 'package:path/path.dart' as path; import 'package:test/test.dart'; diff --git a/web_sdk/BUILD.gn b/web_sdk/BUILD.gn index dbfbd80a120c1..f7ed93aa186a7 100644 --- a/web_sdk/BUILD.gn +++ b/web_sdk/BUILD.gn @@ -114,7 +114,7 @@ sdk_rewriter("web_ui_library_sources") { sdk_rewriter("web_keyboard_layouts_library") { library_name = "web_keyboard_layouts" api_file = "//flutter/third_party/web_keyboard_layouts/lib/web_keyboard_layouts.dart" - input_dir = "//flutter/third_party/web_keyboard_layouts/lib/" + input_dir = "//flutter/third_party/web_keyboard_layouts/lib/web_keyboard_layouts/" output_dir = "$root_out_dir/flutter_web_sdk/lib/web_keyboard_layouts/" } From ca82c563b4d9a5026f1bee1090435164d11df4f4 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Thu, 10 Nov 2022 13:44:20 -0800 Subject: [PATCH 33/74] Correct gen directory --- .../data/key_mappings.dart.tmpl | 2 - .../lib/benchmark_detector.dart | 150 +++++++----------- tools/gen_web_keyboard_layouts/lib/main.dart | 2 +- 3 files changed, 56 insertions(+), 98 deletions(-) diff --git a/tools/gen_web_keyboard_layouts/data/key_mappings.dart.tmpl b/tools/gen_web_keyboard_layouts/data/key_mappings.dart.tmpl index 0807122660c45..252e10dadcae0 100644 --- a/tools/gen_web_keyboard_layouts/data/key_mappings.dart.tmpl +++ b/tools/gen_web_keyboard_layouts/data/key_mappings.dart.tmpl @@ -13,8 +13,6 @@ // // See flutter/engine:flutter/tools/gen_web_keyboard_layouts/README.md for more information. -part of web_keyboard_layouts; - final Map> kWinMapping = @@@WIN_MAPPING@@@; final Map> kLinuxMapping = @@@LINUX_MAPPING@@@; diff --git a/tools/gen_web_keyboard_layouts/lib/benchmark_detector.dart b/tools/gen_web_keyboard_layouts/lib/benchmark_detector.dart index 252e46bc79963..d7b93550c43ee 100644 --- a/tools/gen_web_keyboard_layouts/lib/benchmark_detector.dart +++ b/tools/gen_web_keyboard_layouts/lib/benchmark_detector.dart @@ -1,130 +1,90 @@ +import 'data.dart'; import 'layout_types.dart'; -const Map _kLayoutGoals = { - 'KeyA': 'A', - 'KeyB': 'B', - 'KeyC': 'C', - 'KeyD': 'D', - 'KeyE': 'E', - 'KeyF': 'F', - 'KeyG': 'G', - 'KeyH': 'H', - 'KeyI': 'I', - 'KeyJ': 'J', - 'KeyK': 'K', - 'KeyL': 'L', - 'KeyM': 'M', - 'KeyN': 'N', - 'KeyO': 'O', - 'KeyP': 'P', - 'KeyQ': 'Q', - 'KeyR': 'R', - 'KeyS': 'S', - 'KeyT': 'T', - 'KeyU': 'U', - 'KeyV': 'V', - 'KeyW': 'W', - 'KeyX': 'X', - 'KeyY': 'Y', - 'KeyZ': 'Z', - 'Digit1': '1', - 'Digit2': '2', - 'Digit3': '3', - 'Digit4': '4', - 'Digit5': '5', - 'Digit6': '6', - 'Digit7': '7', - 'Digit8': '8', - 'Digit9': '9', - 'Digit0': '0', - 'Minus': null, - 'Equal': null, - 'BracketLeft': null, - 'BracketRight': null, - 'Backslash': null, - 'Semicolon': null, - 'Quote': null, - 'Backquote': null, - 'Comma': null, - 'Period': null, - 'Slash': null, -}; +const int kUseKeyCode = 1; + +final int _kLowerA = 'a'.codeUnitAt(0); +final int _kUpperA = 'A'.codeUnitAt(0); +final int _kLowerZ = 'z'.codeUnitAt(0); +final int _kUpperZ = 'Z'.codeUnitAt(0); + +bool _isEascii(String key) { + if (key.length != 1) { + return false; + } + // 0x20 is the first printable character in ASCII. + return key.codeUnitAt(0) >= 0x20 && key.codeUnitAt(0) <= 0xFF; +} + +bool _isLetterChar(int charCode) { + return (charCode >= _kLowerA && charCode <= _kLowerZ) + || (charCode >= _kUpperA && charCode <= _kUpperZ); +} final Map _kMandatoryGoalsByChar = Map.fromEntries( - _kLayoutGoals + kLayoutGoals .entries .where((MapEntry entry) => entry.value != null) .map((MapEntry entry) => MapEntry(entry.value!, entry.key)) ); -// Returns a mapping from eventCode to logical key for this layout. +/// Returns a mapping from eventCode to logical key for this layout. +/// +/// If a eventCode does not exist in this map, then this event's logical key +/// should be derived on the fly. Map buildLayout(Map entries) { // Unresolved mandatory goals, mapped from printables to KeyboardEvent.code. // This map will be modified during this function and thus is a clone. final Map mandatoryGoalsByChar = {..._kMandatoryGoalsByChar}; // The result mapping from KeyboardEvent.code to logical key. final Map result = {}; - // The logical key should be the first available clue from below: + // The logical key is derived in the following rules: // - // 1. Mandatory goal, if it matches any clue. This ensures that all alnum - // keys can be found somewhere. - // 2. US layout, if neither clue of the key is EASCII. This ensures that - // there are no non-latin logical keys. - // 3. Derived on the fly from keyCode & characters. + // 1. If any clue (the four possible printables) of the key is a mandatory + // goal (alnum), then the goal is the logical key. + // 2. If a mandatory goal is not assigned in the way of #1, then it is + // assigned to the physical key as mapped in the US layout. + // 3. Derived on the fly from key, code, and keyCode. entries.forEach((String eventCode, LayoutEntry entry) { - // bool anyEascii = false; + bool matchedMandatoryGoal = false; for (final String printable in entry.printables) { - // Ignore dead keys. - if (printable == LayoutEntry.kDeadKey) { - continue; - } if (mandatoryGoalsByChar.containsKey(printable)) { result[eventCode] = printable.codeUnitAt(0); mandatoryGoalsByChar.remove(printable); + matchedMandatoryGoal = true; + break; + } + } + if (!matchedMandatoryGoal && + !_isEascii(entry.printables[0]) && + !_isEascii(entry.printables[1])) { + final String? verbatimPrintable = kLayoutGoals[eventCode]; + if (verbatimPrintable != null + && mandatoryGoalsByChar.remove(verbatimPrintable) != null) { + result[eventCode] = verbatimPrintable.codeUnitAt(0); } - // if (_isEascii(entry.printables[index])) { - // anyEascii = true; - // } } - - // // If all clues on this key are non-EASCII, use the verbatim key. - // if (!anyEascii) { - // final String? verbatimPrintable = kLayoutStore.goals[eventCode]; - // if (verbatimPrintable != null - // && mandatoryGoalsByChar.remove(verbatimPrintable) != null) { - // result[eventCode] = verbatimPrintable.codeUnitAt(0); - // } - // } }); // Ensure all mandatory goals are assigned. mandatoryGoalsByChar.forEach((String character, String code) { result[code] = character.codeUnitAt(0); }); - // assert(() { - // print(result); - // return true; - // }()); return result; } -final int _kLowerA = 'a'.codeUnitAt(0); -final int _kUpperA = 'A'.codeUnitAt(0); -final int _kLowerZ = 'z'.codeUnitAt(0); -final int _kUpperZ = 'Z'.codeUnitAt(0); -bool _charCodeIsLetter(int charCode) { - return (charCode >= _kLowerA && charCode <= _kLowerZ) - || (charCode >= _kUpperA && charCode <= _kUpperZ); -} - -const int _kUseKeyCode = 1; - -bool _mappedToKeyCode(int charCode) { - return _charCodeIsLetter(charCode) || charCode == _kUseKeyCode; +bool _isLetterOrMappedToKeyCode(int charCode) { + return _isLetterChar(charCode) || charCode == kUseKeyCode; } -// Return a map of EventCode -> EventKey -> logicalKey +/// Summarize all layouts into a huge table of EventCode -> EventKey -> +/// logicalKey. +/// +/// The resulting logicalKey can also be kUseKeyCode. +/// +/// If a eventCode does not exist in this map, then this event's logical key +/// should be derived on the fly. Map> buildMap(Iterable layouts) { final Map> result = >{}; for (final Layout layout in layouts) { @@ -136,9 +96,9 @@ Map> buildMap(Iterable layouts) { continue; } if (codeMap.containsKey(eventKey) && codeMap[eventKey] != logicalKey) { - assert(_mappedToKeyCode(codeMap[eventKey]!)); - assert(_mappedToKeyCode(logicalKey)); - codeMap[eventKey] = _kUseKeyCode; + assert(_isLetterChar(logicalKey)); + assert(_isLetterOrMappedToKeyCode(codeMap[eventKey]!)); + codeMap[eventKey] = kUseKeyCode; } else { codeMap[eventKey] = logicalKey; } diff --git a/tools/gen_web_keyboard_layouts/lib/main.dart b/tools/gen_web_keyboard_layouts/lib/main.dart index 345c5e21fc8f4..3f8c6cd2e9c51 100644 --- a/tools/gen_web_keyboard_layouts/lib/main.dart +++ b/tools/gen_web_keyboard_layouts/lib/main.dart @@ -175,7 +175,7 @@ Future generate(Options options) async { // Generate the definition file. _writeFileTo( - path.join(options.outputRoot, 'lib'), + path.join(options.outputRoot, 'lib', 'web_keyboard_layouts'), 'key_mappings.g.dart', _renderTemplate( File(path.join(options.dataRoot, 'key_mappings.dart.tmpl')).readAsStringSync(), From d0a7c45299a097d15e63c70f41a44f8abd51dd83 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Thu, 10 Nov 2022 14:51:07 -0800 Subject: [PATCH 34/74] Heuristic --- .../web_keyboard_layouts/key_mappings.g.dart | 1221 ----------------- .../lib/web_keyboard_layouts/types.dart | 95 +- 2 files changed, 93 insertions(+), 1223 deletions(-) diff --git a/third_party/web_keyboard_layouts/lib/web_keyboard_layouts/key_mappings.g.dart b/third_party/web_keyboard_layouts/lib/web_keyboard_layouts/key_mappings.g.dart index e74af7f5931eb..e53c031c15bea 100644 --- a/third_party/web_keyboard_layouts/lib/web_keyboard_layouts/key_mappings.g.dart +++ b/third_party/web_keyboard_layouts/lib/web_keyboard_layouts/key_mappings.g.dart @@ -15,49 +15,29 @@ final Map> kWinMapping = >{ 'Backquote': { - '0': 0x30, '§': 0x30, }, 'Digit0': { ')': 0x30, - '0': 0x30, '=': 0x30, '@': 0x30, '}': 0x30, - 'à': 0x30, - 'é': 0x30, - '˝': 0x30, - 'จ': 0x30, - '๗': 0x30, - '’': 0x30, }, 'Digit1': { '!': 0x31, '&': 0x31, "'": 0x31, '+': 0x31, - '1': 0x31, '>': 0x31, '|': 0x31, '~': 0x31, - '¡': 0x31, - '¦': 0x31, - '¹': 0x31, - 'ๅ': 0x31, }, 'Digit2': { '"': 0x32, "'": 0x32, '/': 0x32, - '2': 0x32, '@': 0x32, '~': 0x32, - '£': 0x32, - '²': 0x32, - 'é': 0x32, - 'ě': 0x32, - 'ˇ': 0x32, - '๑': 0x32, }, 'Digit3': { '"': 0x33, @@ -65,789 +45,187 @@ final Map> kWinMapping = >{ '*': 0x33, '+': 0x33, '-': 0x33, - '3': 0x33, '^': 0x33, - '£': 0x33, - '§': 0x33, - '³': 0x33, - '·': 0x33, - 'š': 0x33, - '๒': 0x33, - '№': 0x33, }, 'Digit4': { '!': 0x34, r'$': 0x34, "'": 0x34, '+': 0x34, - '4': 0x34, ';': 0x34, '{': 0x34, '~': 0x34, - '£': 0x34, - '¤': 0x34, - '§': 0x34, - '°': 0x34, - 'ç': 0x34, - 'č': 0x34, - '˘': 0x34, - 'ภ': 0x34, - '๓': 0x34, - '€': 0x34, - '₹': 0x34, }, 'Digit5': { '%': 0x35, '(': 0x35, - '5': 0x35, '[': 0x35, - '¢': 0x35, - '§': 0x35, - '°': 0x35, - '½': 0x35, - 'ř': 0x35, - 'ถ': 0x35, - '๔': 0x35, - '€': 0x35, }, 'Digit6': { '&': 0x36, '-': 0x36, '/': 0x36, - '6': 0x36, ':': 0x36, '^': 0x36, '|': 0x36, - '§': 0x36, - '¨': 0x36, - '¬': 0x36, - '¼': 0x36, - 'ž': 0x36, - 'ˆ': 0x36, - '˛': 0x36, - 'ุ': 0x36, - 'ู': 0x36, }, 'Digit7': { '&': 0x37, '/': 0x37, - '7': 0x37, '=': 0x37, '?': 0x37, '`': 0x37, '{': 0x37, '|': 0x37, - '½': 0x37, - 'è': 0x37, - 'ý': 0x37, - 'ึ': 0x37, - '฿': 0x37, }, 'Digit8': { '!': 0x38, '(': 0x38, '*': 0x38, - '8': 0x38, '[': 0x38, r'\': 0x38, '_': 0x38, - '¢': 0x38, - '¾': 0x38, - 'á': 0x38, - '˙': 0x38, - 'ค': 0x38, - '๕': 0x38, - '₽': 0x38, }, 'Digit9': { '(': 0x39, ')': 0x39, - '9': 0x39, ']': 0x39, '^': 0x39, '{': 0x39, - '´': 0x39, - 'ç': 0x39, - 'í': 0x39, - '˘': 0x39, - 'ต': 0x39, - '๖': 0x39, - '‘': 0x39, - }, - 'KeyA': { - 'A': 0x41, - 'Q': 0x51, - 'a': 0x41, - 'q': 0x51, - 'Á': 0x41, - 'Æ': 0x41, - 'á': 0x41, - 'ä': 0x41, - 'æ': 0x41, - 'Ā': 0x41, - 'ā': 0x41, - 'Ą': 0x41, - 'ą': 0x41, - 'Ф': 0x41, - 'ф': 0x41, - 'ฟ': 0x41, - 'ฤ': 0x41, }, 'KeyB': { - 'B': 0x42, - 'b': 0x42, '{': 0x42, - 'И': 0x42, - 'и': 0x42, - 'ิ': 0x42, - 'ฺ': 0x42, }, 'KeyC': { '&': 0x43, - 'C': 0x43, - 'c': 0x43, - '¢': 0x43, - '©': 0x43, - 'Ć': 0x43, - 'ć': 0x43, - 'С': 0x43, - 'с': 0x43, - 'ฉ': 0x43, - 'แ': 0x43, - '₢': 0x43, - }, - 'KeyD': { - 'D': 0x44, - 'd': 0x44, - 'Ð': 0x44, - 'ð': 0x44, - 'Đ': 0x44, - 'В': 0x44, - 'в': 0x44, - 'ก': 0x44, - 'ฏ': 0x44, - 'Ḍ': 0x44, - 'ḍ': 0x44, - }, - 'KeyE': { - 'E': 0x45, - 'e': 0x45, - '°': 0x45, - 'Ä': 0x45, - 'É': 0x45, - 'é': 0x45, - 'Ē': 0x45, - 'ē': 0x45, - 'Ę': 0x45, - 'ę': 0x45, - 'У': 0x45, - 'у': 0x45, - 'ฎ': 0x45, - 'ำ': 0x45, - '€': 0x45, }, 'KeyF': { - 'F': 0x46, '[': 0x46, - 'f': 0x46, - 'А': 0x46, - 'а': 0x46, - 'ด': 0x46, - 'โ': 0x46, }, 'KeyG': { - 'G': 0x47, ']': 0x47, - 'g': 0x47, - 'П': 0x47, - 'п': 0x47, - 'ฌ': 0x47, - 'เ': 0x47, - 'Ṅ': 0x47, - 'ṅ': 0x47, - }, - 'KeyH': { - 'H': 0x48, - 'h': 0x48, - 'Р': 0x48, - 'р': 0x48, - '็': 0x48, - '้': 0x48, - 'Ḥ': 0x48, - 'ḥ': 0x48, - }, - 'KeyI': { - 'I': 0x49, - 'i': 0x49, - 'Í': 0x49, - 'í': 0x49, - 'Ī': 0x49, - 'ī': 0x49, - 'İ': 0x49, - 'ı': 0x49, - 'Ш': 0x49, - 'ш': 0x49, - 'ณ': 0x49, - 'ร': 0x49, - }, - 'KeyJ': { - 'J': 0x4a, - 'j': 0x4a, - 'í': 0x4a, - 'О': 0x4a, - 'о': 0x4a, - '่': 0x4a, - '๋': 0x4a, - }, - 'KeyK': { - 'K': 0x4b, - 'k': 0x4b, - 'ł': 0x4b, - 'Л': 0x4b, - 'л': 0x4b, - 'ษ': 0x4b, - 'า': 0x4b, - }, - 'KeyL': { - 'L': 0x4c, - 'L̥': 0x4c, - 'l': 0x4c, - 'l̥': 0x4c, - 'Ø': 0x4c, - 'ø': 0x4c, - 'Ł': 0x4c, - 'ł': 0x4c, - 'Д': 0x4c, - 'д': 0x4c, - 'ศ': 0x4c, - 'ส': 0x4c, }, 'KeyM': { '<': 0x4d, '?': 0x4d, - 'M': 0x4d, - 'm': 0x4d, - 'µ': 0x4d, - 'Ь': 0x4d, - 'ь': 0x4d, - 'ท': 0x4d, - 'Ṁ': 0x4d, - 'ṁ': 0x4d, }, 'KeyN': { - 'N': 0x4e, - 'n': 0x4e, '}': 0x4e, - 'Ñ': 0x4e, - 'ñ': 0x4e, - 'Ń': 0x4e, - 'ń': 0x4e, - 'Т': 0x4e, - 'т': 0x4e, - 'ื': 0x4e, - '์': 0x4e, - 'Ṇ': 0x4e, - 'ṇ': 0x4e, - }, - 'KeyO': { - 'O': 0x4f, - 'o': 0x4f, - 'Ó': 0x4f, - 'ó': 0x4f, - 'Ō': 0x4f, - 'ō': 0x4f, - 'Щ': 0x4f, - 'щ': 0x4f, - 'น': 0x4f, - 'ฯ': 0x4f, - }, - 'KeyP': { - 'P': 0x50, - 'p': 0x50, - 'Ö': 0x50, - 'ö': 0x50, - 'З': 0x50, - 'з': 0x50, - 'ญ': 0x50, - 'ย': 0x50, }, 'KeyQ': { '/': 0x51, '@': 0x51, - 'A': 0x41, - 'Q': 0x51, r'\': 0x51, - 'a': 0x41, - 'q': 0x51, - 'Ä': 0x51, - 'Æ': 0x51, - 'ä': 0x51, - 'æ': 0x51, - 'Й': 0x51, - 'й': 0x51, - 'ๆ': 0x51, - '๐': 0x51, - }, - 'KeyR': { - 'R': 0x52, - 'R̥': 0x52, - 'r': 0x52, - 'r̥': 0x52, - '®': 0x52, - 'К': 0x52, - 'к': 0x52, - 'ฑ': 0x52, - 'พ': 0x52, - }, - 'KeyS': { - 'S': 0x53, - 's': 0x53, - '§': 0x53, - 'ß': 0x53, - 'đ': 0x53, - 'Ś': 0x53, - 'ś': 0x53, - 'Ы': 0x53, - 'ы': 0x53, - 'ฆ': 0x53, - 'ห': 0x53, - }, - 'KeyT': { - 'T': 0x54, - 't': 0x54, - 'Þ': 0x54, - 'þ': 0x54, - 'Е': 0x54, - 'е': 0x54, - 'ธ': 0x54, - 'ะ': 0x54, - 'Ṭ': 0x54, - 'ṭ': 0x54, - '₺': 0x54, - }, - 'KeyU': { - 'U': 0x55, - 'u': 0x55, - 'Ú': 0x55, - 'ú': 0x55, - 'Ū': 0x55, - 'ū': 0x55, - 'Г': 0x55, - 'г': 0x55, - 'ี': 0x55, - '๊': 0x55, - '€': 0x55, }, 'KeyV': { '@': 0x56, - 'V': 0x56, - 'v': 0x56, - 'М': 0x56, - 'м': 0x56, - 'อ': 0x56, - 'ฮ': 0x56, }, 'KeyW': { '"': 0x57, '?': 0x57, - 'W': 0x57, - 'Z': 0x5a, - 'w': 0x57, - 'z': 0x5a, '|': 0x57, - 'Å': 0x57, - 'å': 0x57, - 'Ц': 0x57, - 'ц': 0x57, - 'ไ': 0x57, }, 'KeyX': { '#': 0x58, ')': 0x58, - 'X': 0x58, - 'x': 0x58, - 'Ź': 0x58, - 'ź': 0x58, - 'Ч': 0x58, - 'ч': 0x58, - 'ป': 0x58, - 'Ṣ': 0x58, - 'ṣ': 0x58, - }, - 'KeyY': { - 'Y': 0x59, - 'Z': 0x5a, - 'y': 0x59, - 'z': 0x5a, - 'Ñ': 0x59, - 'Ü': 0x59, - 'ñ': 0x59, - 'ü': 0x59, - 'Н': 0x59, - 'н': 0x59, - 'ั': 0x59, - 'ํ': 0x59, }, 'KeyZ': { '(': 0x5a, '>': 0x59, - 'W': 0x57, - 'Y': 0x59, - 'Z': 0x5a, - 'w': 0x57, - 'y': 0x59, - 'z': 0x5a, - 'Æ': 0x5a, - 'æ': 0x5a, - 'Ż': 0x5a, - 'ż': 0x5a, - 'Я': 0x5a, - 'я': 0x5a, - 'ผ': 0x5a, - }, - 'Semicolon': { - 'M': 0x4d, - 'm': 0x4d, }, }; final Map> kLinuxMapping = >{ 'Digit0': { ')': 0x30, - '0': 0x30, '=': 0x30, '@': 0x30, '}': 0x30, - '°': 0x30, - 'à': 0x30, }, 'Digit1': { '!': 0x31, '&': 0x31, - '1': 0x31, '|': 0x31, - '¡': 0x31, - '¹': 0x31, }, 'Digit2': { '"': 0x32, - '2': 0x32, '@': 0x32, '~': 0x32, - '²': 0x32, - 'é': 0x32, - '⅛': 0x32, }, 'Digit3': { '"': 0x33, '#': 0x33, - '3': 0x33, - '£': 0x33, - '§': 0x33, - '³': 0x33, - '·': 0x33, - '№': 0x33, }, 'Digit4': { r'$': 0x34, "'": 0x34, - '4': 0x34, ';': 0x34, '{': 0x34, '~': 0x34, - '¤': 0x34, - '¼': 0x34, }, 'Digit5': { '%': 0x35, '(': 0x35, - '5': 0x35, '[': 0x35, - '½': 0x35, - '⅜': 0x35, }, 'Digit6': { '&': 0x36, '-': 0x36, - '6': 0x36, ':': 0x36, '^': 0x36, '|': 0x36, - '¬': 0x36, - '⅝': 0x36, }, 'Digit7': { '&': 0x37, '/': 0x37, - '7': 0x37, '?': 0x37, '`': 0x37, '{': 0x37, - 'è': 0x37, - '⅞': 0x37, }, 'Digit8': { '(': 0x38, '*': 0x38, - '8': 0x38, '[': 0x38, r'\': 0x38, '_': 0x38, - '₽': 0x38, - '™': 0x38, }, 'Digit9': { '(': 0x39, ')': 0x39, - '9': 0x39, ']': 0x39, '^': 0x39, - '±': 0x39, - 'ç': 0x39, }, 'KeyA': { '@': 0x51, - 'A': 0x41, - 'Q': 0x51, - 'a': 0x41, - 'q': 0x51, - 'Æ': 0x41, - 'æ': 0x41, 'Ω': 0x51, - 'Ф': 0x41, - 'ф': 0x41, - }, - 'KeyB': { - 'B': 0x42, - 'b': 0x42, - 'И': 0x42, - 'и': 0x42, - '‘': 0x42, - '’': 0x42, - '“': 0x42, - '”': 0x42, - }, - 'KeyC': { - 'C': 0x43, - 'c': 0x43, - '¢': 0x43, - '©': 0x43, - 'С': 0x43, - 'с': 0x43, - }, - 'KeyD': { - 'D': 0x44, - 'd': 0x44, - 'Ð': 0x44, - 'ð': 0x44, - 'В': 0x44, - 'в': 0x44, - }, - 'KeyE': { - 'E': 0x45, - 'e': 0x45, - '¢': 0x45, - 'У': 0x45, - 'у': 0x45, - '€': 0x45, - }, - 'KeyF': { - 'F': 0x46, - 'f': 0x46, - 'ª': 0x46, - 'đ': 0x46, - 'А': 0x46, - 'а': 0x46, - }, - 'KeyG': { - 'G': 0x47, - 'g': 0x47, - 'Ŋ': 0x47, - 'ŋ': 0x47, - 'П': 0x47, - 'п': 0x47, - }, - 'KeyH': { - 'H': 0x48, - 'h': 0x48, - 'Ħ': 0x48, - 'ħ': 0x48, - 'Р': 0x48, - 'р': 0x48, - }, - 'KeyI': { - 'I': 0x49, - 'i': 0x49, - 'ı': 0x49, - 'Ш': 0x49, - 'ш': 0x49, - '→': 0x49, - }, - 'KeyJ': { - 'J': 0x4a, - 'j': 0x4a, - '̇': 0x4a, - '̉': 0x4a, - '̛': 0x4a, - '̣': 0x4a, - 'О': 0x4a, - 'о': 0x4a, }, 'KeyK': { '&': 0x4b, - 'K': 0x4b, - 'k': 0x4b, - 'ĸ': 0x4b, - 'Л': 0x4b, - 'л': 0x4b, - }, - 'KeyL': { - 'L': 0x4c, - 'l': 0x4c, - 'Ł': 0x4c, - 'ł': 0x4c, - 'Д': 0x4c, - 'д': 0x4c, - }, - 'KeyM': { - 'M': 0x4d, - 'm': 0x4d, - 'µ': 0x4d, - 'º': 0x4d, - 'Ь': 0x4d, - 'ь': 0x4d, - }, - 'KeyN': { - 'N': 0x4e, - 'n': 0x4e, - 'Т': 0x4e, - 'т': 0x4e, - '’': 0x4e, - '”': 0x4e, - }, - 'KeyO': { - 'O': 0x4f, - 'o': 0x4f, - 'Ø': 0x4f, - 'ø': 0x4f, - 'Щ': 0x4f, - 'щ': 0x4f, - }, - 'KeyP': { - 'P': 0x50, - 'p': 0x50, - 'Þ': 0x50, - 'þ': 0x50, - 'З': 0x50, - 'з': 0x50, }, 'KeyQ': { '@': 0x51, - 'A': 0x41, - 'Q': 0x51, - 'a': 0x41, - 'q': 0x51, 'Æ': 0x41, 'æ': 0x41, - 'Ω': 0x51, - 'Й': 0x51, - 'й': 0x51, - }, - 'KeyR': { - 'R': 0x52, - 'r': 0x52, - '®': 0x52, - '¶': 0x52, - 'К': 0x52, - 'к': 0x52, - }, - 'KeyS': { - 'S': 0x53, - 's': 0x53, - '§': 0x53, - 'ß': 0x53, - 'ſ': 0x53, - 'Ы': 0x53, - 'ы': 0x53, - 'ẞ': 0x53, - }, - 'KeyT': { - 'T': 0x54, - 't': 0x54, - 'Ŧ': 0x54, - 'ŧ': 0x54, - 'Е': 0x54, - 'е': 0x54, - }, - 'KeyU': { - 'U': 0x55, - 'u': 0x55, - 'Г': 0x55, - 'г': 0x55, - '↑': 0x55, - '↓': 0x55, - }, - 'KeyV': { - 'V': 0x56, - 'v': 0x56, - 'М': 0x56, - 'м': 0x56, - '‘': 0x56, - '‚': 0x56, - '“': 0x56, - '„': 0x56, }, 'KeyW': { '<': 0x5a, - 'W': 0x57, - 'Z': 0x5a, - 'w': 0x57, - 'z': 0x5a, '«': 0x5a, - 'Ł': 0x57, - 'ł': 0x57, - 'Ц': 0x57, - 'ц': 0x57, }, 'KeyX': { '>': 0x58, - 'X': 0x58, - 'x': 0x58, - '«': 0x58, - '»': 0x58, - 'Ч': 0x58, - 'ч': 0x58, - '‹': 0x58, }, 'KeyY': { - 'Y': 0x59, - 'Z': 0x5a, - 'y': 0x59, - 'z': 0x5a, '¥': 0x1, - 'Н': 0x59, - 'н': 0x59, '←': 0x1, }, 'KeyZ': { '<': 0x5a, - 'W': 0x57, - 'Y': 0x59, - 'Z': 0x5a, - 'w': 0x57, - 'y': 0x59, - 'z': 0x5a, - '«': 0x5a, '»': 0x59, 'Ł': 0x57, 'ł': 0x57, - 'Я': 0x5a, - 'я': 0x5a, '›': 0x59, }, 'Semicolon': { - 'M': 0x4d, - 'm': 0x4d, 'µ': 0x4d, 'º': 0x4d, }, @@ -855,797 +233,198 @@ final Map> kLinuxMapping = >{ final Map> kDarwinMapping = >{ 'Comma': { - 'W': 0x57, - 'w': 0x57, '„': 0x57, '∑': 0x57, }, 'Digit0': { ')': 0x30, - '0': 0x30, '=': 0x30, '`': 0x30, '}': 0x30, - '¯': 0x30, - 'º': 0x30, - 'Ø': 0x30, - 'à': 0x30, - 'ø': 0x30, - 'ľ': 0x30, - '‚': 0x30, - '≈': 0x30, - '≠': 0x30, - ')': 0x30, }, 'Digit1': { '!': 0x31, '&': 0x31, - '1': 0x31, - 'Dead': 0x31, '|': 0x31, - '¡': 0x31, - '©': 0x31, - '«': 0x31, - '¬': 0x31, - '»': 0x31, - 'ı': 0x31, - 'Ń': 0x31, - 'ŕ': 0x31, - '⁄': 0x31, - '': 0x31, - '!': 0x31, }, 'Digit2': { '"': 0x32, - '2': 0x32, '@': 0x32, - 'é': 0x32, - 'ë': 0x32, - 'Ř': 0x32, - '˝': 0x32, - '“': 0x32, - '”': 0x32, - '„': 0x32, - '€': 0x32, - '™': 0x32, }, 'Digit3': { '"': 0x33, '#': 0x33, - '3': 0x33, - '£': 0x33, - '¥': 0x33, - '§': 0x33, - '¶': 0x33, - '·': 0x33, - '‘': 0x33, - '’': 0x33, - '“': 0x33, - '”': 0x33, - '•': 0x33, - '‹': 0x33, - '€': 0x33, - '№': 0x33, }, 'Digit4': { r'$': 0x34, '%': 0x34, "'": 0x34, - '4': 0x34, - '¢': 0x34, - '£': 0x34, - '¥': 0x34, - 'ß': 0x34, - '‘': 0x34, - '’': 0x34, - '›': 0x34, - '€': 0x34, }, 'Digit5': { '%': 0x35, '(': 0x35, - '5': 0x35, ':': 0x35, '[': 0x35, '{': 0x35, '~': 0x35, - '§': 0x35, - 'į': 0x35, - 'ř': 0x35, - '†': 0x35, - '‰': 0x35, - '∞': 0x35, - 'fi': 0x35, }, 'Digit6': { ' ': 0x36, '&': 0x36, ',': 0x36, - '6': 0x36, - 'Dead': 0x36, ']': 0x36, '^': 0x36, - '§': 0x36, - '¬': 0x36, - '¶': 0x36, - 'å': 0x36, - 'Ŗ': 0x36, - '̂': 0x36, - '‹': 0x36, - '›': 0x36, - 'fl': 0x36, }, 'Digit7': { '&': 0x37, '.': 0x37, '/': 0x37, - '7': 0x37, r'\': 0x37, '|': 0x37, - '«': 0x37, - '¶': 0x37, - '»': 0x37, - 'è': 0x37, - '÷': 0x37, - 'ŗ': 0x37, - '‡': 0x37, - '⁄': 0x37, }, 'Digit8': { '!': 0x38, '(': 0x38, '*': 0x38, - '8': 0x38, ';': 0x38, - 'Dead': 0x38, '[': 0x38, '{': 0x38, - '¡': 0x38, - '°': 0x38, - 'Û': 0x38, - '˜': 0x38, - '‘': 0x38, - '“': 0x38, - '•': 0x38, - '√': 0x38, - '': 0x38, }, 'Digit9': { ' ': 0x39, "'": 0x39, '(': 0x39, ')': 0x39, - '9': 0x39, - 'Dead': 0x39, ']': 0x39, '{': 0x39, '}': 0x39, - 'ª': 0x39, - '·': 0x39, - 'Á': 0x39, - 'Ç': 0x39, - 'ç': 0x39, - 'Ľ': 0x39, - 'Š': 0x39, - '’': 0x39, - '”': 0x39, - '(': 0x39, }, 'KeyA': { - 'A': 0x41, - 'Dead': 0x41, - 'Q': 0x51, - 'a': 0x41, - 'q': 0x51, - 'Å': 0x41, - 'å': 0x41, - 'Ą': 0x41, - 'ą': 0x41, - 'ƒ': 0x41, - '̄': 0x41, 'Ω': 0x51, - 'Ф': 0x41, - 'ф': 0x41, '‡': 0x51, - '◊': 0x41, - 'ㅁ': 0x41, - '': 0x41, }, 'KeyB': { - 'B': 0x42, - 'Dead': 0x42, - 'X': 0x58, - 'b': 0x42, - 'x': 0x58, - '»': 0x42, - 'Í': 0x42, - 'ß': 0x42, - 'ı': 0x42, - 'ļ': 0x42, - 'ű': 0x42, '˛': 0x58, - '̆': 0x42, - 'И': 0x42, - 'и': 0x42, - '‹': 0x42, - '›': 0x42, - '∫': 0x42, '≈': 0x58, - 'ㅠ': 0x42, }, 'KeyC': { ' ': 0x43, - 'C': 0x43, - 'Dead': 0x43, - 'J': 0x4a, - 'c': 0x43, - 'j': 0x4a, - '¢': 0x43, - '©': 0x43, - 'Á': 0x43, - 'Ç': 0x43, 'Ô': 0x4a, - 'ç': 0x43, - 'Ć': 0x43, - 'ć': 0x43, - '̧': 0x43, - 'С': 0x43, - 'с': 0x43, '∆': 0x4a, - '≠': 0x43, - 'ㅊ': 0x43, }, 'KeyD': { - 'D': 0x44, - 'Dead': 0x45, - 'E': 0x45, - 'd': 0x44, - 'e': 0x45, - '´': 0x45, - 'Î': 0x44, - 'Ð': 0x44, - 'ð': 0x44, - 'Ž': 0x44, - '˘': 0x44, - 'Ћ': 0x44, - 'В': 0x44, - 'в': 0x44, - 'ћ': 0x44, - '™': 0x44, - '∂': 0x44, - '∆': 0x44, - 'ㅇ': 0x44, - }, - 'KeyE': { 'Dead': 0x45, - 'E': 0x45, - 'e': 0x45, '´': 0x45, - 'È': 0x45, - 'É': 0x45, - 'Ê': 0x45, - 'é': 0x45, - 'ê': 0x45, - 'Ę': 0x45, - 'ę': 0x45, - '́': 0x45, - 'Ќ': 0x45, - 'У': 0x45, - 'у': 0x45, - 'ќ': 0x45, - '‰': 0x45, - '€': 0x45, - 'ㄷ': 0x45, - 'ㄸ': 0x45, }, 'KeyF': { 'Dead': 0x55, - 'F': 0x46, - 'U': 0x55, - 'f': 0x46, - 'u': 0x55, '¨': 0x55, - '·': 0x46, - 'Ï': 0x46, - '÷': 0x46, - 'ń': 0x46, - 'ž': 0x46, - 'ƒ': 0x46, - '˙': 0x46, - 'А': 0x46, - 'а': 0x46, - '∫': 0x46, - 'ㄹ': 0x46, - 'fi': 0x46, }, 'KeyG': { 'Dead': 0x1, - 'G': 0x47, - 'I': 0x49, - 'g': 0x47, - 'i': 0x49, - '©': 0x47, - '¯': 0x47, - '¸': 0x47, - 'Ì': 0x47, - 'Ū': 0x47, 'ˆ': 0x49, - '˚': 0x47, - '˝': 0x47, - 'П': 0x47, - 'п': 0x47, - '∞': 0x47, - 'ㅎ': 0x47, - '': 0x47, - 'fi': 0x47, - 'fl': 0x47, }, 'KeyH': { ' ': 0x48, - 'D': 0x44, - 'Dead': 0x48, - 'H': 0x48, - 'd': 0x44, - 'h': 0x48, - 'ª': 0x48, - '¸': 0x48, - 'Ì': 0x48, 'Î': 0x1, - 'Ó': 0x48, - 'ķ': 0x48, - '˘': 0x48, - '˙': 0x48, - '˛': 0x48, - '̱': 0x48, - 'Р': 0x48, - 'р': 0x48, - '₽': 0x48, - '™': 0x48, '∂': 0x44, - '∆': 0x48, - 'ㅗ': 0x48, }, 'KeyI': { ' ': 0x49, - 'C': 0x43, - 'Dead': 0x49, - 'I': 0x49, - 'c': 0x43, - 'i': 0x49, 'Ç': 0x43, - 'È': 0x49, - 'Û': 0x49, 'ç': 0x43, - 'î': 0x49, - 'ï': 0x49, - 'ı': 0x49, - 'Œ': 0x49, - 'œ': 0x49, - 'ť': 0x49, - 'ˆ': 0x49, - '̛': 0x49, - 'Ѕ': 0x49, - 'Ш': 0x49, - 'ш': 0x49, - 'ѕ': 0x49, - '⁄': 0x49, - 'ㅑ': 0x49, }, 'KeyJ': { - 'Dead': 0x4a, - 'H': 0x48, - 'J': 0x4a, - 'h': 0x48, - 'j': 0x4a, - 'ª': 0x4a, - '¬': 0x4a, - '¯': 0x4a, - '°': 0x4a, - '¶': 0x4a, - 'º': 0x4a, - 'Í': 0x4a, - 'Ï': 0x4a, 'Ó': 0x48, - 'Ô': 0x4a, - 'ı': 0x4a, '˙': 0x48, - '˝': 0x4a, - '̋': 0x4a, - 'О': 0x4a, - 'о': 0x4a, - '•': 0x4a, - '∆': 0x4a, - '√': 0x4a, - 'ㅓ': 0x4a, }, 'KeyK': { - 'Dead': 0x4b, - 'K': 0x4b, - 'T': 0x54, - 'k': 0x4b, - 't': 0x54, - '§': 0x4b, - 'ª': 0x4b, - 'º': 0x4b, - 'È': 0x4b, - 'Ë': 0x4b, - 'ū': 0x4b, - 'Ż': 0x4b, - 'ˆ': 0x4b, 'ˇ': 0x1, - '˚': 0x4b, - '˛': 0x4b, - '̊': 0x4b, - 'Љ': 0x4b, - 'Л': 0x4b, - 'л': 0x4b, - 'љ': 0x4b, '†': 0x54, - '∆': 0x4b, - 'ㅏ': 0x4b, - '': 0x4b, }, 'KeyL': { ' ': 0x4c, '@': 0x4c, 'Dead': 0x1, - 'L': 0x4c, - 'N': 0x4e, - 'l': 0x4c, - 'n': 0x4e, '|': 0x4c, - '¬': 0x4c, - 'Ò': 0x4c, - 'Ł': 0x4c, - 'ł': 0x4c, - 'ˇ': 0x4c, - '˘': 0x4c, '˜': 0x4e, - '̵': 0x4c, - 'Д': 0x4c, - 'д': 0x4c, - '∆': 0x4c, - 'ㅣ': 0x4c, - 'fi': 0x4c, - 'fl': 0x4c, }, 'KeyM': { - 'Dead': 0x4d, - 'M': 0x4d, - 'm': 0x4d, '~': 0x4d, - 'µ': 0x4d, - 'Â': 0x4d, - 'Ú': 0x4d, - 'Ķ': 0x4d, - 'ų': 0x4d, - '˘': 0x4d, - '˚': 0x4d, - '˜': 0x4d, - '̨': 0x4d, - 'Ь': 0x4d, - 'ь': 0x4d, - '’': 0x4d, - '”': 0x4d, - 'ㅡ': 0x4d, }, 'KeyN': { ' ': 0x4e, - 'B': 0x42, - 'Dead': 0x4e, - 'N': 0x4e, - 'b': 0x42, - 'n': 0x4e, - 'Ó': 0x4e, 'ı': 0x1, - 'Ń': 0x4e, - 'ń': 0x4e, - 'ˆ': 0x4e, - '˙': 0x4e, - '˜': 0x4e, - '̃': 0x4e, - 'Т': 0x4e, - 'т': 0x4e, - '‘': 0x4e, - '“': 0x4e, - '›': 0x4e, - '™': 0x4e, '∫': 0x42, - 'ㅜ': 0x4e, }, 'KeyO': { - 'O': 0x4f, - 'R': 0x52, - 'o': 0x4f, - 'r': 0x52, '®': 0x52, - 'Ó': 0x4f, - 'Ø': 0x4f, - 'ó': 0x4f, - 'ø': 0x4f, - 'Œ': 0x4f, - 'œ': 0x4f, - 'Ў': 0x4f, - 'Щ': 0x4f, - 'щ': 0x4f, - 'ў': 0x4f, '‰': 0x52, - 'ㅐ': 0x4f, - 'ㅒ': 0x4f, }, 'KeyP': { - 'Dead': 0x50, - 'L': 0x4c, - 'P': 0x50, - 'l': 0x4c, - 'p': 0x50, '¬': 0x4c, 'Ò': 0x4c, - 'Ļ': 0x50, - 'ł': 0x50, - '̦': 0x50, - 'π': 0x50, - 'З': 0x50, - 'з': 0x50, - '‘': 0x50, - '’': 0x50, - '∏': 0x50, - 'ㅔ': 0x50, - 'ㅖ': 0x50, }, 'KeyQ': { - 'A': 0x41, - 'Q': 0x51, - 'a': 0x41, - 'q': 0x51, - '«': 0x51, - '°': 0x51, - '»': 0x51, 'Æ': 0x41, 'æ': 0x41, - 'Ō': 0x51, - 'ő': 0x51, - 'Œ': 0x51, - 'œ': 0x51, - 'Ј': 0x51, - 'Й': 0x51, - 'й': 0x51, - 'ј': 0x51, - '‚': 0x51, - '„': 0x51, - '•': 0x51, - 'ㅂ': 0x51, - 'ㅃ': 0x51, }, 'KeyR': { ' ': 0x52, - 'P': 0x50, - 'R': 0x52, - 'p': 0x50, - 'r': 0x52, - '£': 0x52, - '®': 0x52, - '¸': 0x52, - 'Â': 0x52, - 'Ì': 0x52, 'π': 0x50, - 'К': 0x52, - 'к': 0x52, - '‚': 0x52, - '‰': 0x52, '∏': 0x50, - '√': 0x52, - 'ㄱ': 0x52, - 'ㄲ': 0x52, }, 'KeyS': { ' ': 0x53, - 'O': 0x4f, - 'S': 0x53, - 'o': 0x4f, - 's': 0x53, - '¯': 0x53, - 'Í': 0x53, - 'Ò': 0x53, 'Ø': 0x4f, - 'ß': 0x53, 'ø': 0x4f, - 'Ś': 0x53, - 'ś': 0x53, - 'Ы': 0x53, - 'ы': 0x53, - '‚': 0x53, - '∑': 0x53, - '∫': 0x53, - 'ㄴ': 0x53, }, 'KeyT': { - 'T': 0x54, - 'Y': 0x59, - 't': 0x54, - 'y': 0x59, '¥': 0x59, 'Á': 0x59, - 'Ê': 0x54, - 'Ò': 0x54, - 'Þ': 0x54, - 'þ': 0x54, - 'ś': 0x54, - 'ˇ': 0x54, - '˝': 0x54, - 'Е': 0x54, - 'е': 0x54, - '†': 0x54, - '‡': 0x54, - '™': 0x54, - 'ㅅ': 0x54, - 'ㅆ': 0x54, }, 'KeyU': { ' ': 0x55, - 'Dead': 0x55, - 'G': 0x47, - 'U': 0x55, - 'g': 0x47, - 'u': 0x55, - '¨': 0x55, '©': 0x47, - 'ª': 0x55, - 'º': 0x55, - 'Á': 0x55, - 'Ë': 0x55, - 'Ù': 0x55, - 'Ü': 0x55, - 'ü': 0x55, - 'Ť': 0x55, '˝': 0x47, - '̈': 0x55, - 'Ѓ': 0x55, - 'Г': 0x55, - 'г': 0x55, - 'ѓ': 0x55, - 'ㅕ': 0x55, }, 'KeyV': { - 'Dead': 0x56, - 'K': 0x4b, - 'V': 0x56, - 'k': 0x4b, - 'v': 0x56, - '«': 0x56, - 'µ': 0x56, - 'É': 0x56, '˚': 0x4b, - '̌': 0x56, - 'М': 0x56, - 'м': 0x56, - '‹': 0x56, - '√': 0x56, - '◊': 0x56, - 'ㅍ': 0x56, '': 0x4b, }, 'KeyW': { - 'Dead': 0x57, - 'W': 0x57, - 'Z': 0x5a, - 'w': 0x57, - 'z': 0x5a, - 'À': 0x57, 'Â': 0x5a, 'Å': 0x5a, - 'Æ': 0x57, - 'æ': 0x57, - '˝': 0x57, - '̇': 0x57, - 'Ω': 0x57, - 'Џ': 0x57, - 'Ц': 0x57, - 'ц': 0x57, - 'џ': 0x57, - '„': 0x57, - '∑': 0x57, - 'ㅈ': 0x57, - 'ㅉ': 0x57, }, 'KeyX': { - 'Dead': 0x58, - 'Q': 0x51, - 'X': 0x58, - 'q': 0x51, - 'x': 0x58, - 'Ù': 0x58, 'Œ': 0x51, 'œ': 0x51, - 'Ź': 0x58, - 'ź': 0x58, - 'ˇ': 0x58, - '˛': 0x58, - '̣': 0x58, - 'Ч': 0x58, - 'ч': 0x58, - '†': 0x58, - '‡': 0x58, - '›': 0x58, - '⁄': 0x58, - '∑': 0x58, - '≈': 0x58, - 'ㅌ': 0x58, }, 'KeyY': { ' ': 0x59, - 'F': 0x46, - 'Y': 0x59, - 'Z': 0x5a, - 'f': 0x46, - 'y': 0x59, - 'z': 0x5a, - '¥': 0x59, - 'µ': 0x59, - 'Á': 0x59, - 'Æ': 0x59, 'Ï': 0x46, - 'Ú': 0x59, - 'æ': 0x59, - 'ī': 0x59, - 'Ÿ': 0x59, 'ƒ': 0x46, 'ˇ': 0x5a, - '˜': 0x59, 'Ω': 0x5a, - 'Њ': 0x59, - 'Н': 0x59, - 'н': 0x59, - 'њ': 0x59, - 'ㅛ': 0x59, }, 'KeyZ': { ' ': 0x5a, - 'Dead': 0x5a, - 'W': 0x57, - 'Y': 0x59, - 'Z': 0x5a, - 'w': 0x57, - 'y': 0x59, - 'z': 0x5a, '¥': 0x59, - '¸': 0x5a, - 'Û': 0x5a, - '÷': 0x5a, - 'Ż': 0x5a, - 'ż': 0x5a, - '̉': 0x5a, - 'Ω': 0x5a, - 'Ђ': 0x5a, - 'Я': 0x5a, - 'я': 0x5a, - 'ђ': 0x5a, '‡': 0x59, '‹': 0x1, '›': 0x57, - '⁄': 0x5a, - '∑': 0x5a, - 'ㅋ': 0x5a, }, 'Period': { - 'V': 0x56, - 'v': 0x56, '√': 0x56, '◊': 0x56, }, 'Semicolon': { - 'M': 0x4d, - 'S': 0x53, - 'm': 0x4d, - 's': 0x53, 'µ': 0x4d, 'Í': 0x53, 'Ó': 0x4d, 'ß': 0x53, }, 'Slash': { - 'Z': 0x5a, - 'z': 0x5a, '¸': 0x5a, 'Ω': 0x5a, }, diff --git a/third_party/web_keyboard_layouts/lib/web_keyboard_layouts/types.dart b/third_party/web_keyboard_layouts/lib/web_keyboard_layouts/types.dart index edb7bd281db17..617f1ed700269 100644 --- a/third_party/web_keyboard_layouts/lib/web_keyboard_layouts/types.dart +++ b/third_party/web_keyboard_layouts/lib/web_keyboard_layouts/types.dart @@ -3,7 +3,92 @@ import 'key_mappings.g.dart'; -const int _kUseKeyCode = 1; +const int kUseKeyCode = 1; + +const Map _kFullLayoutGoals = { + 'KeyA': 'A', + 'KeyB': 'B', + 'KeyC': 'C', + 'KeyD': 'D', + 'KeyE': 'E', + 'KeyF': 'F', + 'KeyG': 'G', + 'KeyH': 'H', + 'KeyI': 'I', + 'KeyJ': 'J', + 'KeyK': 'K', + 'KeyL': 'L', + 'KeyM': 'M', + 'KeyN': 'N', + 'KeyO': 'O', + 'KeyP': 'P', + 'KeyQ': 'Q', + 'KeyR': 'R', + 'KeyS': 'S', + 'KeyT': 'T', + 'KeyU': 'U', + 'KeyV': 'V', + 'KeyW': 'W', + 'KeyX': 'X', + 'KeyY': 'Y', + 'KeyZ': 'Z', + 'Digit1': '1', + 'Digit2': '2', + 'Digit3': '3', + 'Digit4': '4', + 'Digit5': '5', + 'Digit6': '6', + 'Digit7': '7', + 'Digit8': '8', + 'Digit9': '9', + 'Digit0': '0', + 'Minus': '-', + 'Equal': '=', + 'BracketLeft': '[', + 'BracketRight': ']', + 'Backslash': r'\', + 'Semicolon': ';', + 'Quote': "'", + 'Backquote': '`', + 'Comma': ',', + 'Period': '.', + 'Slash': '/', +}; + +final int _kLowerA = 'a'.codeUnitAt(0); +final int _kUpperA = 'A'.codeUnitAt(0); +final int _kLowerZ = 'z'.codeUnitAt(0); +final int _kUpperZ = 'Z'.codeUnitAt(0); +final int _k0 = '0'.codeUnitAt(0); +final int _k9 = '9'.codeUnitAt(0); + +bool _isAscii(String key) { + if (key.length != 1) { + return false; + } + // 0x20 is the first printable character in ASCII. + return key.codeUnitAt(0) >= 0x20 && key.codeUnitAt(0) <= 0x7F; +} + +bool _isAlnum(String char) { + if (char.length != 1) { + return false; + } + final int charCode = char.codeUnitAt(0); + return (charCode >= _kLowerA && charCode <= _kLowerZ) + || (charCode >= _kUpperA && charCode <= _kUpperZ) + || (charCode >= _k0 && charCode <= _k9); +} + +int? _heuristicDetector(String code, String key) { + if (_isAlnum(key)) { + return key.toUpperCase().codeUnitAt(0); + } + if (!_isAscii(key)) { + return _kFullLayoutGoals[code]!.codeUnitAt(0); + } + return null; +} class LayoutMapping { LayoutMapping.win() : _mapping = kWinMapping; @@ -12,9 +97,15 @@ class LayoutMapping { int? getLogicalKey(String? eventCode, String? eventKey, int eventKeyCode) { final int? result = _mapping[eventCode]?[eventKey]; - if (result == _kUseKeyCode) { + if (result == kUseKeyCode) { return eventKeyCode; } + if (result == null) { + final int? heuristicResult = _heuristicDetector(eventCode ?? '', eventKey ?? ''); + if (heuristicResult != null) { + return heuristicResult; + } + } return result; } From 3a6812732883dd2abb07c75c8496114b1d745450 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 14 Nov 2022 11:47:46 -0800 Subject: [PATCH 35/74] Heuristic benchmark --- .../lib/benchmark_detector.dart | 112 +++++++++++++++--- 1 file changed, 93 insertions(+), 19 deletions(-) diff --git a/tools/gen_web_keyboard_layouts/lib/benchmark_detector.dart b/tools/gen_web_keyboard_layouts/lib/benchmark_detector.dart index d7b93550c43ee..3b557fd4e7520 100644 --- a/tools/gen_web_keyboard_layouts/lib/benchmark_detector.dart +++ b/tools/gen_web_keyboard_layouts/lib/benchmark_detector.dart @@ -3,17 +3,79 @@ import 'layout_types.dart'; const int kUseKeyCode = 1; +const Map _kFullLayoutGoals = { + 'KeyA': 'A', + 'KeyB': 'B', + 'KeyC': 'C', + 'KeyD': 'D', + 'KeyE': 'E', + 'KeyF': 'F', + 'KeyG': 'G', + 'KeyH': 'H', + 'KeyI': 'I', + 'KeyJ': 'J', + 'KeyK': 'K', + 'KeyL': 'L', + 'KeyM': 'M', + 'KeyN': 'N', + 'KeyO': 'O', + 'KeyP': 'P', + 'KeyQ': 'Q', + 'KeyR': 'R', + 'KeyS': 'S', + 'KeyT': 'T', + 'KeyU': 'U', + 'KeyV': 'V', + 'KeyW': 'W', + 'KeyX': 'X', + 'KeyY': 'Y', + 'KeyZ': 'Z', + 'Digit1': '1', + 'Digit2': '2', + 'Digit3': '3', + 'Digit4': '4', + 'Digit5': '5', + 'Digit6': '6', + 'Digit7': '7', + 'Digit8': '8', + 'Digit9': '9', + 'Digit0': '0', + 'Minus': '-', + 'Equal': '=', + 'BracketLeft': '[', + 'BracketRight': ']', + 'Backslash': r'\', + 'Semicolon': ';', + 'Quote': "'", + 'Backquote': '`', + 'Comma': ',', + 'Period': '.', + 'Slash': '/', +}; + final int _kLowerA = 'a'.codeUnitAt(0); final int _kUpperA = 'A'.codeUnitAt(0); final int _kLowerZ = 'z'.codeUnitAt(0); final int _kUpperZ = 'Z'.codeUnitAt(0); +final int _k0 = '0'.codeUnitAt(0); +final int _k9 = '9'.codeUnitAt(0); -bool _isEascii(String key) { +bool _isAscii(String key) { if (key.length != 1) { return false; } // 0x20 is the first printable character in ASCII. - return key.codeUnitAt(0) >= 0x20 && key.codeUnitAt(0) <= 0xFF; + return key.codeUnitAt(0) >= 0x20 && key.codeUnitAt(0) <= 0x7F; +} + +bool _isAlnum(String char) { + if (char.length != 1) { + return false; + } + final int charCode = char.codeUnitAt(0); + return (charCode >= _kLowerA && charCode <= _kLowerZ) + || (charCode >= _kUpperA && charCode <= _kUpperZ) + || (charCode >= _k0 && charCode <= _k9); } bool _isLetterChar(int charCode) { @@ -28,16 +90,21 @@ final Map _kMandatoryGoalsByChar = Map.fromEntri .map((MapEntry entry) => MapEntry(entry.value!, entry.key)) ); +int? _heuristicDetector(String code, String key) { + if (_isAlnum(key)) { + return key.toUpperCase().codeUnitAt(0); + } + if (!_isAscii(key)) { + return _kFullLayoutGoals[code]!.codeUnitAt(0); + } + return null; +} + /// Returns a mapping from eventCode to logical key for this layout. /// /// If a eventCode does not exist in this map, then this event's logical key /// should be derived on the fly. Map buildLayout(Map entries) { - // Unresolved mandatory goals, mapped from printables to KeyboardEvent.code. - // This map will be modified during this function and thus is a clone. - final Map mandatoryGoalsByChar = {..._kMandatoryGoalsByChar}; - // The result mapping from KeyboardEvent.code to logical key. - final Map result = {}; // The logical key is derived in the following rules: // // 1. If any clue (the four possible printables) of the key is a mandatory @@ -45,30 +112,28 @@ Map buildLayout(Map entries) { // 2. If a mandatory goal is not assigned in the way of #1, then it is // assigned to the physical key as mapped in the US layout. // 3. Derived on the fly from key, code, and keyCode. + // + // The map returned from this function contains the first two rules. + + // Unresolved mandatory goals, mapped from printables to KeyboardEvent.code. + // This map will be modified during this function and thus is a clone. + final Map mandatoryGoalsByChar = {..._kMandatoryGoalsByChar}; + // The result mapping from KeyboardEvent.code to logical key. + final Map result = {}; entries.forEach((String eventCode, LayoutEntry entry) { - bool matchedMandatoryGoal = false; for (final String printable in entry.printables) { if (mandatoryGoalsByChar.containsKey(printable)) { result[eventCode] = printable.codeUnitAt(0); mandatoryGoalsByChar.remove(printable); - matchedMandatoryGoal = true; break; } } - if (!matchedMandatoryGoal && - !_isEascii(entry.printables[0]) && - !_isEascii(entry.printables[1])) { - final String? verbatimPrintable = kLayoutGoals[eventCode]; - if (verbatimPrintable != null - && mandatoryGoalsByChar.remove(verbatimPrintable) != null) { - result[eventCode] = verbatimPrintable.codeUnitAt(0); - } - } }); // Ensure all mandatory goals are assigned. mandatoryGoalsByChar.forEach((String character, String code) { + assert(!result.containsKey(code), 'Code $code conflicts.'); result[code] = character.codeUnitAt(0); }); return result; @@ -95,9 +160,11 @@ Map> buildMap(Iterable layouts) { if (eventKey.isEmpty) { continue; } + // Found conflict. Assert that all such cases can be solved with + // keyCode. if (codeMap.containsKey(eventKey) && codeMap[eventKey] != logicalKey) { assert(_isLetterChar(logicalKey)); - assert(_isLetterOrMappedToKeyCode(codeMap[eventKey]!)); + assert(_isLetterOrMappedToKeyCode(codeMap[eventKey]!), '$eventCode, $eventKey, ${codeMap[eventKey]!}'); codeMap[eventKey] = kUseKeyCode; } else { codeMap[eventKey] = logicalKey; @@ -105,5 +172,12 @@ Map> buildMap(Iterable layouts) { } }); } + // Remove mapping results that can be derived using heuristics. + result.removeWhere((String eventCode, Map codeMap) { + codeMap.removeWhere((String eventKey, int logicalKey) => + _heuristicDetector(eventCode, eventKey) == logicalKey, + ); + return codeMap.isEmpty; + }); return result; } From 4953e1feb93707b3da0d336485ae8cb7d17604ae Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 14 Nov 2022 15:55:03 -0800 Subject: [PATCH 36/74] Reorganize logical key --- .../lib/src/engine/keyboard_binding.dart | 57 ++-- .../web_keyboard_layouts/key_mappings.g.dart | 318 ++++++++++++++++++ .../lib/web_keyboard_layouts/types.dart | 21 +- .../lib/benchmark_detector.dart | 2 +- 4 files changed, 362 insertions(+), 36 deletions(-) diff --git a/lib/web_ui/lib/src/engine/keyboard_binding.dart b/lib/web_ui/lib/src/engine/keyboard_binding.dart index 0d502f087b337..5a40d85249b1a 100644 --- a/lib/web_ui/lib/src/engine/keyboard_binding.dart +++ b/lib/web_ui/lib/src/engine/keyboard_binding.dart @@ -302,31 +302,16 @@ class KeyboardConverter { (metaDown ? _kDeadKeyMeta : 0); } - // Whether `event.key` should be considered a key name. + // Whether `event.key` is a key name, such as "Shift", or otherwise a + // character, such as "S" or "ж". // - // The `event.key` can either be a key name or the printable character. If the - // first character is an alphabet, it must be either 'A' to 'Z' ( and return - // true), or be a key name (and return false). Otherwise, return true. + // A key name always starts with a capitalized character, and has more than + // 1 letter. static bool _eventKeyIsKeyname(String key) { assert(key.isNotEmpty); return isAlphabet(key.codeUnitAt(0)) && key.length > 1; } - static int _characterToLogicalKey(String key) { - // Assume the length being <= 2 to be sufficient in all cases. If not, - // extend the algorithm. - assert(key.length <= 2); - int result = key.codeUnitAt(0) & 0xffff; - if (key.length == 2) { - result += key.codeUnitAt(1) << 16; - } - // Convert upper letters to lower letters - if (result >= _kCharUpperA && result <= _kCharUpperZ) { - result = result + _kCharLowerA - _kCharUpperA; - } - return result; - } - static int _deadKeyToLogicalKey(int physicalKey, FlutterHtmlKeyboardEvent event) { // 'Dead' is used to represent dead keys, such as a diacritic to the // following base letter (such as Option-e results in ´). @@ -336,10 +321,6 @@ class KeyboardConverter { return physicalKey + _getModifierMask(event) + _kWebKeyIdPlane; } - static int _otherLogicalKey(String key) { - return kWebToLogicalKey[key] ?? (key.hashCode + _kWebKeyIdPlane); - } - // Map from pressed physical key to corresponding pressed logical key. // // Multiple physical keys can be mapped to the same logical key, usually due @@ -399,24 +380,31 @@ class KeyboardConverter { final int physicalKey = _getPhysicalCode(event.code!); final bool logicalKeyIsCharacter = !_eventKeyIsKeyname(eventKey); - final String? character = logicalKeyIsCharacter ? eventKey : null; final int logicalKey = () { + // Dead keys. + if (eventKey == _kLogicalDead) { + return _deadKeyToLogicalKey(physicalKey, event); + } + // Mapped logical keys, such as ArrowLeft, Escape, AudioVolumeDown. + final int? mappedLogicalKey = kWebToLogicalKey[eventKey]; + if (mappedLogicalKey != null) { + return mappedLogicalKey; + } + // Keys with locations, such as modifier keys (Shift) or numpad keys. if (kWebLogicalLocationMap.containsKey(event.key)) { final int? result = kWebLogicalLocationMap[event.key!]?[event.location!]; assert(result != null, 'Invalid modifier location: ${event.key}, ${event.location}'); return result!; } - final int? logicalKeyFromMap = _mapping.getLogicalKey(event.code, event.key, event.keyCode); - if (logicalKeyFromMap != null) { - return logicalKeyFromMap; - } - if (character != null) { - return _characterToLogicalKey(character); - } - if (eventKey == _kLogicalDead) { - return _deadKeyToLogicalKey(physicalKey, event); + // Locale-sensitive keys: letters, digits, and certain symbols. + if (logicalKeyIsCharacter) { + final int? localeLogicalKeys = _mapping.getLogicalKey(event.code, event.key, event.keyCode); + if (localeLogicalKeys != null) { + return localeLogicalKeys; + } } - return _otherLogicalKey(eventKey); + // Minted logical keys. + return eventKey.hashCode + _kWebKeyIdPlane; }(); assert(event.type == 'keydown' || event.type == 'keyup'); @@ -564,6 +552,7 @@ class KeyboardConverter { } } + final String? character = logicalKeyIsCharacter ? eventKey : null; final ui.KeyData keyData = ui.KeyData( timeStamp: timeStamp, type: type, diff --git a/third_party/web_keyboard_layouts/lib/web_keyboard_layouts/key_mappings.g.dart b/third_party/web_keyboard_layouts/lib/web_keyboard_layouts/key_mappings.g.dart index e53c031c15bea..e74dc29228ee5 100644 --- a/third_party/web_keyboard_layouts/lib/web_keyboard_layouts/key_mappings.g.dart +++ b/third_party/web_keyboard_layouts/lib/web_keyboard_layouts/key_mappings.g.dart @@ -93,45 +93,143 @@ final Map> kWinMapping = >{ '^': 0x39, '{': 0x39, }, + 'KeyA': { + 'A': 0x41, + 'Q': 0x51, + 'a': 0x41, + 'q': 0x51, + }, 'KeyB': { + 'B': 0x42, + 'b': 0x42, '{': 0x42, }, 'KeyC': { '&': 0x43, + 'C': 0x43, + 'c': 0x43, + }, + 'KeyD': { + 'D': 0x44, + 'd': 0x44, + }, + 'KeyE': { + 'E': 0x45, + 'e': 0x45, }, 'KeyF': { + 'F': 0x46, '[': 0x46, + 'f': 0x46, }, 'KeyG': { + 'G': 0x47, ']': 0x47, + 'g': 0x47, + }, + 'KeyH': { + 'H': 0x48, + 'h': 0x48, + }, + 'KeyI': { + 'I': 0x49, + 'i': 0x49, + }, + 'KeyJ': { + 'J': 0x4a, + 'j': 0x4a, + }, + 'KeyK': { + 'K': 0x4b, + 'k': 0x4b, + }, + 'KeyL': { + 'L': 0x4c, + 'l': 0x4c, }, 'KeyM': { '<': 0x4d, '?': 0x4d, + 'M': 0x4d, + 'm': 0x4d, }, 'KeyN': { + 'N': 0x4e, + 'n': 0x4e, '}': 0x4e, }, + 'KeyO': { + 'O': 0x4f, + 'o': 0x4f, + }, + 'KeyP': { + 'P': 0x50, + 'p': 0x50, + }, 'KeyQ': { '/': 0x51, '@': 0x51, + 'A': 0x41, + 'Q': 0x51, r'\': 0x51, + 'a': 0x41, + 'q': 0x51, + }, + 'KeyR': { + 'R': 0x52, + 'r': 0x52, + }, + 'KeyS': { + 'S': 0x53, + 's': 0x53, + }, + 'KeyT': { + 'T': 0x54, + 't': 0x54, + }, + 'KeyU': { + 'U': 0x55, + 'u': 0x55, }, 'KeyV': { '@': 0x56, + 'V': 0x56, + 'v': 0x56, }, 'KeyW': { '"': 0x57, '?': 0x57, + 'W': 0x57, + 'Z': 0x5a, + 'w': 0x57, + 'z': 0x5a, '|': 0x57, }, 'KeyX': { '#': 0x58, ')': 0x58, + 'X': 0x58, + 'x': 0x58, + }, + 'KeyY': { + 'Y': 0x59, + 'Z': 0x5a, + 'y': 0x59, + 'z': 0x5a, }, 'KeyZ': { '(': 0x5a, '>': 0x59, + 'W': 0x57, + 'Y': 0x59, + 'Z': 0x5a, + 'w': 0x57, + 'y': 0x59, + 'z': 0x5a, + }, + 'Semicolon': { + 'M': 0x4d, + 'm': 0x4d, }, }; @@ -197,35 +295,139 @@ final Map> kLinuxMapping = >{ }, 'KeyA': { '@': 0x51, + 'A': 0x41, + 'Q': 0x51, + 'a': 0x41, + 'q': 0x51, 'Ω': 0x51, }, + 'KeyB': { + 'B': 0x42, + 'b': 0x42, + }, + 'KeyC': { + 'C': 0x43, + 'c': 0x43, + }, + 'KeyD': { + 'D': 0x44, + 'd': 0x44, + }, + 'KeyE': { + 'E': 0x45, + 'e': 0x45, + }, + 'KeyF': { + 'F': 0x46, + 'f': 0x46, + }, + 'KeyG': { + 'G': 0x47, + 'g': 0x47, + }, + 'KeyH': { + 'H': 0x48, + 'h': 0x48, + }, + 'KeyI': { + 'I': 0x49, + 'i': 0x49, + }, + 'KeyJ': { + 'J': 0x4a, + 'j': 0x4a, + }, 'KeyK': { '&': 0x4b, + 'K': 0x4b, + 'k': 0x4b, + }, + 'KeyL': { + 'L': 0x4c, + 'l': 0x4c, + }, + 'KeyM': { + 'M': 0x4d, + 'm': 0x4d, + }, + 'KeyN': { + 'N': 0x4e, + 'n': 0x4e, + }, + 'KeyO': { + 'O': 0x4f, + 'o': 0x4f, + }, + 'KeyP': { + 'P': 0x50, + 'p': 0x50, }, 'KeyQ': { '@': 0x51, + 'A': 0x41, + 'Q': 0x51, + 'a': 0x41, + 'q': 0x51, 'Æ': 0x41, 'æ': 0x41, }, + 'KeyR': { + 'R': 0x52, + 'r': 0x52, + }, + 'KeyS': { + 'S': 0x53, + 's': 0x53, + }, + 'KeyT': { + 'T': 0x54, + 't': 0x54, + }, + 'KeyU': { + 'U': 0x55, + 'u': 0x55, + }, + 'KeyV': { + 'V': 0x56, + 'v': 0x56, + }, 'KeyW': { '<': 0x5a, + 'W': 0x57, + 'Z': 0x5a, + 'w': 0x57, + 'z': 0x5a, '«': 0x5a, }, 'KeyX': { '>': 0x58, + 'X': 0x58, + 'x': 0x58, }, 'KeyY': { + 'Y': 0x59, + 'Z': 0x5a, + 'y': 0x59, + 'z': 0x5a, '¥': 0x1, '←': 0x1, }, 'KeyZ': { '<': 0x5a, + 'W': 0x57, + 'Y': 0x59, + 'Z': 0x5a, + 'w': 0x57, + 'y': 0x59, + 'z': 0x5a, '»': 0x59, 'Ł': 0x57, 'ł': 0x57, '›': 0x59, }, 'Semicolon': { + 'M': 0x4d, + 'm': 0x4d, 'µ': 0x4d, 'º': 0x4d, }, @@ -233,6 +435,8 @@ final Map> kLinuxMapping = >{ final Map> kDarwinMapping = >{ 'Comma': { + 'W': 0x57, + 'w': 0x57, '„': 0x57, '∑': 0x57, }, @@ -300,45 +504,89 @@ final Map> kDarwinMapping = >{ '}': 0x39, }, 'KeyA': { + 'A': 0x41, + 'Q': 0x51, + 'a': 0x41, + 'q': 0x51, 'Ω': 0x51, '‡': 0x51, }, 'KeyB': { + 'B': 0x42, + 'X': 0x58, + 'b': 0x42, + 'x': 0x58, '˛': 0x58, '≈': 0x58, }, 'KeyC': { ' ': 0x43, + 'C': 0x43, + 'J': 0x4a, + 'c': 0x43, + 'j': 0x4a, 'Ô': 0x4a, '∆': 0x4a, }, 'KeyD': { + 'D': 0x44, 'Dead': 0x45, + 'E': 0x45, + 'd': 0x44, + 'e': 0x45, '´': 0x45, }, + 'KeyE': { + 'E': 0x45, + 'e': 0x45, + }, 'KeyF': { 'Dead': 0x55, + 'F': 0x46, + 'U': 0x55, + 'f': 0x46, + 'u': 0x55, '¨': 0x55, }, 'KeyG': { 'Dead': 0x1, + 'G': 0x47, + 'I': 0x49, + 'g': 0x47, + 'i': 0x49, 'ˆ': 0x49, }, 'KeyH': { ' ': 0x48, + 'D': 0x44, + 'H': 0x48, + 'd': 0x44, + 'h': 0x48, 'Î': 0x1, '∂': 0x44, }, 'KeyI': { ' ': 0x49, + 'C': 0x43, + 'I': 0x49, + 'c': 0x43, + 'i': 0x49, 'Ç': 0x43, 'ç': 0x43, }, 'KeyJ': { + 'H': 0x48, + 'J': 0x4a, + 'h': 0x48, + 'j': 0x4a, 'Ó': 0x48, '˙': 0x48, }, 'KeyK': { + 'K': 0x4b, + 'T': 0x54, + 'k': 0x4b, + 't': 0x54, 'ˇ': 0x1, '†': 0x54, }, @@ -346,62 +594,118 @@ final Map> kDarwinMapping = >{ ' ': 0x4c, '@': 0x4c, 'Dead': 0x1, + 'L': 0x4c, + 'N': 0x4e, + 'l': 0x4c, + 'n': 0x4e, '|': 0x4c, '˜': 0x4e, }, 'KeyM': { + 'M': 0x4d, + 'm': 0x4d, '~': 0x4d, }, 'KeyN': { ' ': 0x4e, + 'B': 0x42, + 'N': 0x4e, + 'b': 0x42, + 'n': 0x4e, 'ı': 0x1, '∫': 0x42, }, 'KeyO': { + 'O': 0x4f, + 'R': 0x52, + 'o': 0x4f, + 'r': 0x52, '®': 0x52, '‰': 0x52, }, 'KeyP': { + 'L': 0x4c, + 'P': 0x50, + 'l': 0x4c, + 'p': 0x50, '¬': 0x4c, 'Ò': 0x4c, }, 'KeyQ': { + 'A': 0x41, + 'Q': 0x51, + 'a': 0x41, + 'q': 0x51, 'Æ': 0x41, 'æ': 0x41, }, 'KeyR': { ' ': 0x52, + 'P': 0x50, + 'R': 0x52, + 'p': 0x50, + 'r': 0x52, 'π': 0x50, '∏': 0x50, }, 'KeyS': { ' ': 0x53, + 'O': 0x4f, + 'S': 0x53, + 'o': 0x4f, + 's': 0x53, 'Ø': 0x4f, 'ø': 0x4f, }, 'KeyT': { + 'T': 0x54, + 'Y': 0x59, + 't': 0x54, + 'y': 0x59, '¥': 0x59, 'Á': 0x59, }, 'KeyU': { ' ': 0x55, + 'G': 0x47, + 'U': 0x55, + 'g': 0x47, + 'u': 0x55, '©': 0x47, '˝': 0x47, }, 'KeyV': { + 'K': 0x4b, + 'V': 0x56, + 'k': 0x4b, + 'v': 0x56, '˚': 0x4b, '': 0x4b, }, 'KeyW': { + 'W': 0x57, + 'Z': 0x5a, + 'w': 0x57, + 'z': 0x5a, 'Â': 0x5a, 'Å': 0x5a, }, 'KeyX': { + 'Q': 0x51, + 'X': 0x58, + 'q': 0x51, + 'x': 0x58, 'Œ': 0x51, 'œ': 0x51, }, 'KeyY': { ' ': 0x59, + 'F': 0x46, + 'Y': 0x59, + 'Z': 0x5a, + 'f': 0x46, + 'y': 0x59, + 'z': 0x5a, 'Ï': 0x46, 'ƒ': 0x46, 'ˇ': 0x5a, @@ -409,22 +713,36 @@ final Map> kDarwinMapping = >{ }, 'KeyZ': { ' ': 0x5a, + 'W': 0x57, + 'Y': 0x59, + 'Z': 0x5a, + 'w': 0x57, + 'y': 0x59, + 'z': 0x5a, '¥': 0x59, '‡': 0x59, '‹': 0x1, '›': 0x57, }, 'Period': { + 'V': 0x56, + 'v': 0x56, '√': 0x56, '◊': 0x56, }, 'Semicolon': { + 'M': 0x4d, + 'S': 0x53, + 'm': 0x4d, + 's': 0x53, 'µ': 0x4d, 'Í': 0x53, 'Ó': 0x4d, 'ß': 0x53, }, 'Slash': { + 'Z': 0x5a, + 'z': 0x5a, '¸': 0x5a, 'Ω': 0x5a, }, diff --git a/third_party/web_keyboard_layouts/lib/web_keyboard_layouts/types.dart b/third_party/web_keyboard_layouts/lib/web_keyboard_layouts/types.dart index 617f1ed700269..3de34965ac7d2 100644 --- a/third_party/web_keyboard_layouts/lib/web_keyboard_layouts/types.dart +++ b/third_party/web_keyboard_layouts/lib/web_keyboard_layouts/types.dart @@ -82,7 +82,7 @@ bool _isAlnum(String char) { int? _heuristicDetector(String code, String key) { if (_isAlnum(key)) { - return key.toUpperCase().codeUnitAt(0); + return key.toLowerCase().codeUnitAt(0); } if (!_isAscii(key)) { return _kFullLayoutGoals[code]!.codeUnitAt(0); @@ -95,6 +95,15 @@ class LayoutMapping { LayoutMapping.linux() : _mapping = kLinuxMapping; LayoutMapping.darwin() : _mapping = kDarwinMapping; + static int? _characterToLogicalKey(String? key) { + // We have yet to find a case where length >= 2 is useful. + if (key == null || key.length >= 2) { + return null; + } + final int result = key.toLowerCase().codeUnitAt(0); + return result; + } + int? getLogicalKey(String? eventCode, String? eventKey, int eventKeyCode) { final int? result = _mapping[eventCode]?[eventKey]; if (result == kUseKeyCode) { @@ -105,6 +114,16 @@ class LayoutMapping { if (heuristicResult != null) { return heuristicResult; } + // Characters: map to unicode zone. + // + // While characters are usually resolved in the last step, this can happen + // in non-latin layouts when a non-latin character is on a symbol key (ru, + // Semicolon-ж) or on an alnum key that has been assigned elsewhere (hu, + // Digit0-Ö). + final int? characterLogicalKey = _characterToLogicalKey(eventKey); + if (characterLogicalKey != null) { + return characterLogicalKey; + } } return result; } diff --git a/tools/gen_web_keyboard_layouts/lib/benchmark_detector.dart b/tools/gen_web_keyboard_layouts/lib/benchmark_detector.dart index 3b557fd4e7520..ef04204797813 100644 --- a/tools/gen_web_keyboard_layouts/lib/benchmark_detector.dart +++ b/tools/gen_web_keyboard_layouts/lib/benchmark_detector.dart @@ -92,7 +92,7 @@ final Map _kMandatoryGoalsByChar = Map.fromEntri int? _heuristicDetector(String code, String key) { if (_isAlnum(key)) { - return key.toUpperCase().codeUnitAt(0); + return key.toLowerCase().codeUnitAt(0); } if (!_isAscii(key)) { return _kFullLayoutGoals[code]!.codeUnitAt(0); From d2636a3e5943a6f6b084e027f50432bd2f8f76ae Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 14 Nov 2022 16:49:26 -0800 Subject: [PATCH 37/74] Move to common --- .../lib/src/engine/keyboard_binding.dart | 25 +++-- .../lib/benchmark_detector.dart | 106 ++---------------- tools/gen_web_keyboard_layouts/lib/data.dart | 53 --------- .../gen_web_keyboard_layouts/lib/github.dart | 8 +- 4 files changed, 30 insertions(+), 162 deletions(-) delete mode 100644 tools/gen_web_keyboard_layouts/lib/data.dart diff --git a/lib/web_ui/lib/src/engine/keyboard_binding.dart b/lib/web_ui/lib/src/engine/keyboard_binding.dart index 5a40d85249b1a..beed7b2a5a5d6 100644 --- a/lib/web_ui/lib/src/engine/keyboard_binding.dart +++ b/lib/web_ui/lib/src/engine/keyboard_binding.dart @@ -99,6 +99,15 @@ Duration _eventTimeStampToDuration(num milliseconds) { return Duration(milliseconds: ms, microseconds: micro); } +// Returns a function that caches the result of `body`, ensuring that `body` is +// only run once. +ValueGetter _cached(ValueGetter body) { + T? cache; + return () { + return cache ??= body(); + }; +} + class KeyboardBinding { KeyboardBinding._() { _addEventListener('keydown', allowInterop((DomEvent domEvent) { @@ -380,7 +389,7 @@ class KeyboardConverter { final int physicalKey = _getPhysicalCode(event.code!); final bool logicalKeyIsCharacter = !_eventKeyIsKeyname(eventKey); - final int logicalKey = () { + final ValueGetter logicalKey = _cached(() { // Dead keys. if (eventKey == _kLogicalDead) { return _deadKeyToLogicalKey(physicalKey, event); @@ -405,7 +414,7 @@ class KeyboardConverter { } // Minted logical keys. return eventKey.hashCode + _kWebKeyIdPlane; - }(); + }); assert(event.type == 'keydown' || event.type == 'keyup'); final bool isPhysicalDown = event.type == 'keydown' || @@ -427,7 +436,7 @@ class KeyboardConverter { timeStamp: timeStamp, type: ui.KeyEventType.up, physical: physicalKey, - logical: logicalKey, + logical: logicalKey(), character: null, synthesized: true, ), @@ -462,7 +471,7 @@ class KeyboardConverter { timeStamp: timeStamp, type: ui.KeyEventType.up, physical: physicalKey, - logical: logicalKey, + logical: logicalKey(), character: null, synthesized: true, )); @@ -495,7 +504,7 @@ class KeyboardConverter { switch (type) { case ui.KeyEventType.down: assert(lastLogicalRecord == null); - nextLogicalRecord = logicalKey; + nextLogicalRecord = logicalKey(); break; case ui.KeyEventType.up: assert(lastLogicalRecord != null); @@ -520,7 +529,7 @@ class KeyboardConverter { _kLogicalKeyToModifierGetter.forEach((int testeeLogicalKey, _ModifierGetter getModifier) { // Do not synthesize for the key of the current event. The event is the // ground truth. - if (logicalKey == testeeLogicalKey) { + if (logicalKey() == testeeLogicalKey) { return; } if (_pressingRecords.containsValue(testeeLogicalKey) && !getModifier(event)) { @@ -546,7 +555,7 @@ class KeyboardConverter { // Update key guards if (logicalKeyIsCharacter) { if (nextLogicalRecord != null) { - _startGuardingKey(physicalKey, logicalKey, timeStamp); + _startGuardingKey(physicalKey, logicalKey(), timeStamp); } else { _stopGuardingKey(physicalKey); } @@ -557,7 +566,7 @@ class KeyboardConverter { timeStamp: timeStamp, type: type, physical: physicalKey, - logical: lastLogicalRecord ?? logicalKey, + logical: lastLogicalRecord ?? logicalKey(), character: type == ui.KeyEventType.up ? null : character, synthesized: false, ); diff --git a/tools/gen_web_keyboard_layouts/lib/benchmark_detector.dart b/tools/gen_web_keyboard_layouts/lib/benchmark_detector.dart index ef04204797813..c528e507700d6 100644 --- a/tools/gen_web_keyboard_layouts/lib/benchmark_detector.dart +++ b/tools/gen_web_keyboard_layouts/lib/benchmark_detector.dart @@ -1,105 +1,17 @@ -import 'data.dart'; +import 'common.dart'; import 'layout_types.dart'; -const int kUseKeyCode = 1; - -const Map _kFullLayoutGoals = { - 'KeyA': 'A', - 'KeyB': 'B', - 'KeyC': 'C', - 'KeyD': 'D', - 'KeyE': 'E', - 'KeyF': 'F', - 'KeyG': 'G', - 'KeyH': 'H', - 'KeyI': 'I', - 'KeyJ': 'J', - 'KeyK': 'K', - 'KeyL': 'L', - 'KeyM': 'M', - 'KeyN': 'N', - 'KeyO': 'O', - 'KeyP': 'P', - 'KeyQ': 'Q', - 'KeyR': 'R', - 'KeyS': 'S', - 'KeyT': 'T', - 'KeyU': 'U', - 'KeyV': 'V', - 'KeyW': 'W', - 'KeyX': 'X', - 'KeyY': 'Y', - 'KeyZ': 'Z', - 'Digit1': '1', - 'Digit2': '2', - 'Digit3': '3', - 'Digit4': '4', - 'Digit5': '5', - 'Digit6': '6', - 'Digit7': '7', - 'Digit8': '8', - 'Digit9': '9', - 'Digit0': '0', - 'Minus': '-', - 'Equal': '=', - 'BracketLeft': '[', - 'BracketRight': ']', - 'Backslash': r'\', - 'Semicolon': ';', - 'Quote': "'", - 'Backquote': '`', - 'Comma': ',', - 'Period': '.', - 'Slash': '/', -}; - -final int _kLowerA = 'a'.codeUnitAt(0); -final int _kUpperA = 'A'.codeUnitAt(0); -final int _kLowerZ = 'z'.codeUnitAt(0); -final int _kUpperZ = 'Z'.codeUnitAt(0); -final int _k0 = '0'.codeUnitAt(0); -final int _k9 = '9'.codeUnitAt(0); - -bool _isAscii(String key) { - if (key.length != 1) { - return false; - } - // 0x20 is the first printable character in ASCII. - return key.codeUnitAt(0) >= 0x20 && key.codeUnitAt(0) <= 0x7F; -} - -bool _isAlnum(String char) { - if (char.length != 1) { - return false; - } - final int charCode = char.codeUnitAt(0); - return (charCode >= _kLowerA && charCode <= _kLowerZ) - || (charCode >= _kUpperA && charCode <= _kUpperZ) - || (charCode >= _k0 && charCode <= _k9); -} - -bool _isLetterChar(int charCode) { - return (charCode >= _kLowerA && charCode <= _kLowerZ) - || (charCode >= _kUpperA && charCode <= _kUpperZ); -} - +// Maps all mandatory goals from the character to eventScanCode. +// +// Mandatory goals are all the alnum keys. These keys must be assigned at the +// end of layout planning. final Map _kMandatoryGoalsByChar = Map.fromEntries( kLayoutGoals .entries - .where((MapEntry entry) => entry.value != null) + .where((MapEntry entry) => isAlnum(entry.value)) .map((MapEntry entry) => MapEntry(entry.value!, entry.key)) ); -int? _heuristicDetector(String code, String key) { - if (_isAlnum(key)) { - return key.toLowerCase().codeUnitAt(0); - } - if (!_isAscii(key)) { - return _kFullLayoutGoals[code]!.codeUnitAt(0); - } - return null; -} - /// Returns a mapping from eventCode to logical key for this layout. /// /// If a eventCode does not exist in this map, then this event's logical key @@ -140,7 +52,7 @@ Map buildLayout(Map entries) { } bool _isLetterOrMappedToKeyCode(int charCode) { - return _isLetterChar(charCode) || charCode == kUseKeyCode; + return isLetterChar(charCode) || charCode == kUseKeyCode; } /// Summarize all layouts into a huge table of EventCode -> EventKey -> @@ -163,7 +75,7 @@ Map> buildMap(Iterable layouts) { // Found conflict. Assert that all such cases can be solved with // keyCode. if (codeMap.containsKey(eventKey) && codeMap[eventKey] != logicalKey) { - assert(_isLetterChar(logicalKey)); + assert(isLetterChar(logicalKey)); assert(_isLetterOrMappedToKeyCode(codeMap[eventKey]!), '$eventCode, $eventKey, ${codeMap[eventKey]!}'); codeMap[eventKey] = kUseKeyCode; } else { @@ -175,7 +87,7 @@ Map> buildMap(Iterable layouts) { // Remove mapping results that can be derived using heuristics. result.removeWhere((String eventCode, Map codeMap) { codeMap.removeWhere((String eventKey, int logicalKey) => - _heuristicDetector(eventCode, eventKey) == logicalKey, + heuristicDetector(eventCode, eventKey) == logicalKey, ); return codeMap.isEmpty; }); diff --git a/tools/gen_web_keyboard_layouts/lib/data.dart b/tools/gen_web_keyboard_layouts/lib/data.dart deleted file mode 100644 index 7461eb55fab8c..0000000000000 --- a/tools/gen_web_keyboard_layouts/lib/data.dart +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2014 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -const Map kLayoutGoals = { - 'KeyA': 'A', - 'KeyB': 'B', - 'KeyC': 'C', - 'KeyD': 'D', - 'KeyE': 'E', - 'KeyF': 'F', - 'KeyG': 'G', - 'KeyH': 'H', - 'KeyI': 'I', - 'KeyJ': 'J', - 'KeyK': 'K', - 'KeyL': 'L', - 'KeyM': 'M', - 'KeyN': 'N', - 'KeyO': 'O', - 'KeyP': 'P', - 'KeyQ': 'Q', - 'KeyR': 'R', - 'KeyS': 'S', - 'KeyT': 'T', - 'KeyU': 'U', - 'KeyV': 'V', - 'KeyW': 'W', - 'KeyX': 'X', - 'KeyY': 'Y', - 'KeyZ': 'Z', - 'Digit1': '1', - 'Digit2': '2', - 'Digit3': '3', - 'Digit4': '4', - 'Digit5': '5', - 'Digit6': '6', - 'Digit7': '7', - 'Digit8': '8', - 'Digit9': '9', - 'Digit0': '0', - 'Minus': null, - 'Equal': null, - 'BracketLeft': null, - 'BracketRight': null, - 'Backslash': null, - 'Semicolon': null, - 'Quote': null, - 'Backquote': null, - 'Comma': null, - 'Period': null, - 'Slash': null, -}; diff --git a/tools/gen_web_keyboard_layouts/lib/github.dart b/tools/gen_web_keyboard_layouts/lib/github.dart index 2df0c8a9c1c8e..223533ceaa211 100644 --- a/tools/gen_web_keyboard_layouts/lib/github.dart +++ b/tools/gen_web_keyboard_layouts/lib/github.dart @@ -9,7 +9,7 @@ import 'package:http/http.dart' as http; import 'package:meta/meta.dart' show immutable; import 'package:path/path.dart' as path; -import 'data.dart'; +import 'common.dart'; import 'json_get.dart'; import 'layout_types.dart'; @@ -51,12 +51,12 @@ const String githubQuery = ''' '''; /// All goals in the form of KeyboardEvent.key. -final List kGoalKeys = kLayoutGoals.keys.toList(); +final List _kGoalKeys = kLayoutGoals.keys.toList(); /// A map from the key of `kLayoutGoals` (KeyboardEvent.key) to an /// auto-incremental index. final Map kGoalToIndex = Map.fromEntries( - kGoalKeys.asMap().entries.map( + _kGoalKeys.asMap().entries.map( (MapEntry entry) => MapEntry(entry.value, entry.key)), ); @@ -217,7 +217,7 @@ Layout _parseLayoutFromGithubFile(_GitHubFile file) { ); }); - for (final String goalKey in kGoalKeys) { + for (final String goalKey in _kGoalKeys) { entries.putIfAbsent(goalKey, () => LayoutEntry.empty); } From 4d78abf344a95a2f4466b2ada7c5d1320d47e575 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 14 Nov 2022 17:56:57 -0800 Subject: [PATCH 38/74] Docs --- .../lib/web_keyboard_layouts.dart | 6 +- .../web_keyboard_layouts/key_mappings.g.dart | 131 +++++++- .../lib/web_keyboard_layouts/types.dart | 101 +----- .../data/key_mappings.dart.tmpl | 37 ++- .../gen_web_keyboard_layouts/lib/common.dart | 110 +++++++ .../gen_web_keyboard_layouts/lib/github.dart | 59 +++- .../lib/json_get.dart | 46 ++- .../lib/layout_types.dart | 304 ------------------ tools/gen_web_keyboard_layouts/lib/main.dart | 21 +- tools/gen_web_keyboard_layouts/lib/utils.dart | 11 - 10 files changed, 365 insertions(+), 461 deletions(-) create mode 100644 tools/gen_web_keyboard_layouts/lib/common.dart delete mode 100644 tools/gen_web_keyboard_layouts/lib/utils.dart diff --git a/third_party/web_keyboard_layouts/lib/web_keyboard_layouts.dart b/third_party/web_keyboard_layouts/lib/web_keyboard_layouts.dart index fa6af19447784..6065d57ba06cb 100644 --- a/third_party/web_keyboard_layouts/lib/web_keyboard_layouts.dart +++ b/third_party/web_keyboard_layouts/lib/web_keyboard_layouts.dart @@ -1,5 +1,7 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. +/*--------------------------------------------------------------------------------------------- + * Copyright (c) 2022 Google LLC + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ library web_keyboard_layouts; diff --git a/third_party/web_keyboard_layouts/lib/web_keyboard_layouts/key_mappings.g.dart b/third_party/web_keyboard_layouts/lib/web_keyboard_layouts/key_mappings.g.dart index e74dc29228ee5..0ae1a29e15c13 100644 --- a/third_party/web_keyboard_layouts/lib/web_keyboard_layouts/key_mappings.g.dart +++ b/third_party/web_keyboard_layouts/lib/web_keyboard_layouts/key_mappings.g.dart @@ -1,10 +1,12 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. +/*--------------------------------------------------------------------------------------------- + * Copyright (c) 2022 Google LLC + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ // DO NOT EDIT -- DO NOT EDIT -- DO NOT EDIT // // This file is auto generated by flutter/engine:flutter/tools/gen_web_keyboard_layouts based on -// https://github.com/microsoft/vscode/tree/@@@COMMIT_ID@@@/src/vs/workbench/services/keybinding/browser/keyboardLayouts +// https://github.com/microsoft/vscode/tree/ae34e8d2df286f8c8882d22db417e6dc4cdb01f5/src/vs/workbench/services/keybinding/browser/keyboardLayouts // // Edit the following files instead: // @@ -13,7 +15,110 @@ // // See flutter/engine:flutter/tools/gen_web_keyboard_layouts/README.md for more information. -final Map> kWinMapping = >{ + +/// A special value in the final mapping that indicates the logical key should +/// be derived from KeyboardEvent.keyCode. +const int kUseKeyCode = 1; + +/// A map of all goals from the scan codes to their mapped value in US layout. +const Map kLayoutGoals = { + 'KeyA': 'A', + 'KeyB': 'B', + 'KeyC': 'C', + 'KeyD': 'D', + 'KeyE': 'E', + 'KeyF': 'F', + 'KeyG': 'G', + 'KeyH': 'H', + 'KeyI': 'I', + 'KeyJ': 'J', + 'KeyK': 'K', + 'KeyL': 'L', + 'KeyM': 'M', + 'KeyN': 'N', + 'KeyO': 'O', + 'KeyP': 'P', + 'KeyQ': 'Q', + 'KeyR': 'R', + 'KeyS': 'S', + 'KeyT': 'T', + 'KeyU': 'U', + 'KeyV': 'V', + 'KeyW': 'W', + 'KeyX': 'X', + 'KeyY': 'Y', + 'KeyZ': 'Z', + 'Digit1': '1', + 'Digit2': '2', + 'Digit3': '3', + 'Digit4': '4', + 'Digit5': '5', + 'Digit6': '6', + 'Digit7': '7', + 'Digit8': '8', + 'Digit9': '9', + 'Digit0': '0', + 'Minus': '-', + 'Equal': '=', + 'BracketLeft': '[', + 'BracketRight': ']', + 'Backslash': r'\', + 'Semicolon': ';', + 'Quote': "'", + 'Backquote': '`', + 'Comma': ',', + 'Period': '.', + 'Slash': '/', +}; + +final int _kLowerA = 'a'.codeUnitAt(0); +final int _kUpperA = 'A'.codeUnitAt(0); +final int _kLowerZ = 'z'.codeUnitAt(0); +final int _kUpperZ = 'Z'.codeUnitAt(0); +final int _k0 = '0'.codeUnitAt(0); +final int _k9 = '9'.codeUnitAt(0); + +bool _isAscii(String key) { + if (key.length != 1) { + return false; + } + // 0x20 is the first printable character in ASCII. + return key.codeUnitAt(0) >= 0x20 && key.codeUnitAt(0) <= 0x7F; +} + +/// Returns whether the `char` is a single character of a letter or a digit. +bool isAlnum(String char) { + if (char.length != 1) { + return false; + } + final int charCode = char.codeUnitAt(0); + return (charCode >= _kLowerA && charCode <= _kLowerZ) + || (charCode >= _kUpperA && charCode <= _kUpperZ) + || (charCode >= _k0 && charCode <= _k9); +} + +/// A set of rules that can derive a large number of logical keys simply from +/// the event's code and key. +/// +/// This greatly reduces the entries needed in the final mapping. +int? heuristicDetector(String code, String key) { + if (isAlnum(key)) { + return key.toLowerCase().codeUnitAt(0); + } + if (!_isAscii(key)) { + return kLayoutGoals[code]!.codeUnitAt(0); + } + return null; +} + +/// Data for [LayoutMapping] on Windows. +/// +/// Do not use this value, but [LayoutMapping.win] instead. +/// +/// The keys are `KeyboardEvent.code` and then `KeyboardEvent.key`. The values +/// are logical keys or [kUseKeyCode]. Entries that can be derived using +/// heuristics have been omitted. +final Map> kMappingDataWin = >{ 'Backquote': { '§': 0x30, }, @@ -233,7 +338,14 @@ final Map> kWinMapping = >{ }, }; -final Map> kLinuxMapping = >{ +/// Data for [LayoutMapping] on Linux. +/// +/// Do not use this value, but [LayoutMapping.linux] instead. +/// +/// The keys are `KeyboardEvent.code` and then `KeyboardEvent.key`. The values +/// are logical keys or [kUseKeyCode]. Entries that can be derived using +/// heuristics have been omitted. +final Map> kMappingDataLinux = >{ 'Digit0': { ')': 0x30, '=': 0x30, @@ -433,7 +545,14 @@ final Map> kLinuxMapping = >{ }, }; -final Map> kDarwinMapping = >{ +/// Data for [LayoutMapping] on Darwin. +/// +/// Do not use this value, but [LayoutMapping.darwin] instead. +/// +/// The keys are `KeyboardEvent.code` and then `KeyboardEvent.key`. The values +/// are logical keys or [kUseKeyCode]. Entries that can be derived using +/// heuristics have been omitted. +final Map> kMappingDataDarwin = >{ 'Comma': { 'W': 0x57, 'w': 0x57, diff --git a/third_party/web_keyboard_layouts/lib/web_keyboard_layouts/types.dart b/third_party/web_keyboard_layouts/lib/web_keyboard_layouts/types.dart index 3de34965ac7d2..3f472814f0e7f 100644 --- a/third_party/web_keyboard_layouts/lib/web_keyboard_layouts/types.dart +++ b/third_party/web_keyboard_layouts/lib/web_keyboard_layouts/types.dart @@ -1,99 +1,14 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. +/*--------------------------------------------------------------------------------------------- + * Copyright (c) 2022 Google LLC + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ import 'key_mappings.g.dart'; -const int kUseKeyCode = 1; - -const Map _kFullLayoutGoals = { - 'KeyA': 'A', - 'KeyB': 'B', - 'KeyC': 'C', - 'KeyD': 'D', - 'KeyE': 'E', - 'KeyF': 'F', - 'KeyG': 'G', - 'KeyH': 'H', - 'KeyI': 'I', - 'KeyJ': 'J', - 'KeyK': 'K', - 'KeyL': 'L', - 'KeyM': 'M', - 'KeyN': 'N', - 'KeyO': 'O', - 'KeyP': 'P', - 'KeyQ': 'Q', - 'KeyR': 'R', - 'KeyS': 'S', - 'KeyT': 'T', - 'KeyU': 'U', - 'KeyV': 'V', - 'KeyW': 'W', - 'KeyX': 'X', - 'KeyY': 'Y', - 'KeyZ': 'Z', - 'Digit1': '1', - 'Digit2': '2', - 'Digit3': '3', - 'Digit4': '4', - 'Digit5': '5', - 'Digit6': '6', - 'Digit7': '7', - 'Digit8': '8', - 'Digit9': '9', - 'Digit0': '0', - 'Minus': '-', - 'Equal': '=', - 'BracketLeft': '[', - 'BracketRight': ']', - 'Backslash': r'\', - 'Semicolon': ';', - 'Quote': "'", - 'Backquote': '`', - 'Comma': ',', - 'Period': '.', - 'Slash': '/', -}; - -final int _kLowerA = 'a'.codeUnitAt(0); -final int _kUpperA = 'A'.codeUnitAt(0); -final int _kLowerZ = 'z'.codeUnitAt(0); -final int _kUpperZ = 'Z'.codeUnitAt(0); -final int _k0 = '0'.codeUnitAt(0); -final int _k9 = '9'.codeUnitAt(0); - -bool _isAscii(String key) { - if (key.length != 1) { - return false; - } - // 0x20 is the first printable character in ASCII. - return key.codeUnitAt(0) >= 0x20 && key.codeUnitAt(0) <= 0x7F; -} - -bool _isAlnum(String char) { - if (char.length != 1) { - return false; - } - final int charCode = char.codeUnitAt(0); - return (charCode >= _kLowerA && charCode <= _kLowerZ) - || (charCode >= _kUpperA && charCode <= _kUpperZ) - || (charCode >= _k0 && charCode <= _k9); -} - -int? _heuristicDetector(String code, String key) { - if (_isAlnum(key)) { - return key.toLowerCase().codeUnitAt(0); - } - if (!_isAscii(key)) { - return _kFullLayoutGoals[code]!.codeUnitAt(0); - } - return null; -} - class LayoutMapping { - LayoutMapping.win() : _mapping = kWinMapping; - LayoutMapping.linux() : _mapping = kLinuxMapping; - LayoutMapping.darwin() : _mapping = kDarwinMapping; + LayoutMapping.win() : _mapping = kMappingDataWin; + LayoutMapping.linux() : _mapping = kMappingDataLinux; + LayoutMapping.darwin() : _mapping = kMappingDataDarwin; static int? _characterToLogicalKey(String? key) { // We have yet to find a case where length >= 2 is useful. @@ -110,7 +25,7 @@ class LayoutMapping { return eventKeyCode; } if (result == null) { - final int? heuristicResult = _heuristicDetector(eventCode ?? '', eventKey ?? ''); + final int? heuristicResult = heuristicDetector(eventCode ?? '', eventKey ?? ''); if (heuristicResult != null) { return heuristicResult; } diff --git a/tools/gen_web_keyboard_layouts/data/key_mappings.dart.tmpl b/tools/gen_web_keyboard_layouts/data/key_mappings.dart.tmpl index 252e10dadcae0..0f5dee47150e3 100644 --- a/tools/gen_web_keyboard_layouts/data/key_mappings.dart.tmpl +++ b/tools/gen_web_keyboard_layouts/data/key_mappings.dart.tmpl @@ -1,10 +1,12 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. +/*--------------------------------------------------------------------------------------------- + * Copyright (c) 2022 Google LLC + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ // DO NOT EDIT -- DO NOT EDIT -- DO NOT EDIT // // This file is auto generated by flutter/engine:flutter/tools/gen_web_keyboard_layouts based on -// https://github.com/microsoft/vscode/tree/@@@COMMIT_ID@@@/src/vs/workbench/services/keybinding/browser/keyboardLayouts +// @@@COMMIT_URL@@@ // // Edit the following files instead: // @@ -13,8 +15,31 @@ // // See flutter/engine:flutter/tools/gen_web_keyboard_layouts/README.md for more information. -final Map> kWinMapping = @@@WIN_MAPPING@@@; +@@@COMMON@@@ -final Map> kLinuxMapping = @@@LINUX_MAPPING@@@; +/// Data for [LayoutMapping] on Windows. +/// +/// Do not use this value, but [LayoutMapping.win] instead. +/// +/// The keys are `KeyboardEvent.code` and then `KeyboardEvent.key`. The values +/// are logical keys or [kUseKeyCode]. Entries that can be derived using +/// heuristics have been omitted. +final Map> kMappingDataWin = @@@WIN_MAPPING@@@; -final Map> kDarwinMapping = @@@DARWIN_MAPPING@@@; +/// Data for [LayoutMapping] on Linux. +/// +/// Do not use this value, but [LayoutMapping.linux] instead. +/// +/// The keys are `KeyboardEvent.code` and then `KeyboardEvent.key`. The values +/// are logical keys or [kUseKeyCode]. Entries that can be derived using +/// heuristics have been omitted. +final Map> kMappingDataLinux = @@@LINUX_MAPPING@@@; + +/// Data for [LayoutMapping] on Darwin. +/// +/// Do not use this value, but [LayoutMapping.darwin] instead. +/// +/// The keys are `KeyboardEvent.code` and then `KeyboardEvent.key`. The values +/// are logical keys or [kUseKeyCode]. Entries that can be derived using +/// heuristics have been omitted. +final Map> kMappingDataDarwin = @@@DARWIN_MAPPING@@@; diff --git a/tools/gen_web_keyboard_layouts/lib/common.dart b/tools/gen_web_keyboard_layouts/lib/common.dart new file mode 100644 index 0000000000000..4869491cdf7d5 --- /dev/null +++ b/tools/gen_web_keyboard_layouts/lib/common.dart @@ -0,0 +1,110 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// The following segment is not only used in the generating script, but also +// copied to the generated package. +/*@@@ SHARED SEGMENT START @@@*/ + +/// A special value in the final mapping that indicates the logical key should +/// be derived from KeyboardEvent.keyCode. +const int kUseKeyCode = 1; + +/// A map of all goals from the scan codes to their mapped value in US layout. +const Map kLayoutGoals = { + 'KeyA': 'A', + 'KeyB': 'B', + 'KeyC': 'C', + 'KeyD': 'D', + 'KeyE': 'E', + 'KeyF': 'F', + 'KeyG': 'G', + 'KeyH': 'H', + 'KeyI': 'I', + 'KeyJ': 'J', + 'KeyK': 'K', + 'KeyL': 'L', + 'KeyM': 'M', + 'KeyN': 'N', + 'KeyO': 'O', + 'KeyP': 'P', + 'KeyQ': 'Q', + 'KeyR': 'R', + 'KeyS': 'S', + 'KeyT': 'T', + 'KeyU': 'U', + 'KeyV': 'V', + 'KeyW': 'W', + 'KeyX': 'X', + 'KeyY': 'Y', + 'KeyZ': 'Z', + 'Digit1': '1', + 'Digit2': '2', + 'Digit3': '3', + 'Digit4': '4', + 'Digit5': '5', + 'Digit6': '6', + 'Digit7': '7', + 'Digit8': '8', + 'Digit9': '9', + 'Digit0': '0', + 'Minus': '-', + 'Equal': '=', + 'BracketLeft': '[', + 'BracketRight': ']', + 'Backslash': r'\', + 'Semicolon': ';', + 'Quote': "'", + 'Backquote': '`', + 'Comma': ',', + 'Period': '.', + 'Slash': '/', +}; + +final int _kLowerA = 'a'.codeUnitAt(0); +final int _kUpperA = 'A'.codeUnitAt(0); +final int _kLowerZ = 'z'.codeUnitAt(0); +final int _kUpperZ = 'Z'.codeUnitAt(0); +final int _k0 = '0'.codeUnitAt(0); +final int _k9 = '9'.codeUnitAt(0); + +bool _isAscii(String key) { + if (key.length != 1) { + return false; + } + // 0x20 is the first printable character in ASCII. + return key.codeUnitAt(0) >= 0x20 && key.codeUnitAt(0) <= 0x7F; +} + +/// Returns whether the `char` is a single character of a letter or a digit. +bool isAlnum(String char) { + if (char.length != 1) { + return false; + } + final int charCode = char.codeUnitAt(0); + return (charCode >= _kLowerA && charCode <= _kLowerZ) + || (charCode >= _kUpperA && charCode <= _kUpperZ) + || (charCode >= _k0 && charCode <= _k9); +} + +/// A set of rules that can derive a large number of logical keys simply from +/// the event's code and key. +/// +/// This greatly reduces the entries needed in the final mapping. +int? heuristicDetector(String code, String key) { + if (isAlnum(key)) { + return key.toLowerCase().codeUnitAt(0); + } + if (!_isAscii(key)) { + return kLayoutGoals[code]!.codeUnitAt(0); + } + return null; +} + +/*@@@ SHARED SEGMENT END @@@*/ + +/// Whether the given charCode is a ASCII letter. +bool isLetterChar(int charCode) { + return (charCode >= _kLowerA && charCode <= _kLowerZ) + || (charCode >= _kUpperA && charCode <= _kUpperZ); +} diff --git a/tools/gen_web_keyboard_layouts/lib/github.dart b/tools/gen_web_keyboard_layouts/lib/github.dart index 223533ceaa211..822f55992ef8c 100644 --- a/tools/gen_web_keyboard_layouts/lib/github.dart +++ b/tools/gen_web_keyboard_layouts/lib/github.dart @@ -16,10 +16,14 @@ import 'layout_types.dart'; /// Signature for function that asynchonously returns a value. typedef AsyncGetter = Future Function(); -const String githubCacheFileName = 'github-response.json'; -const String githubTargetFolder = 'src/vs/workbench/services/keybinding/browser/keyboardLayouts'; +/// The filename of the local cache for the GraphQL response. +const String _githubCacheFileName = 'github-response.json'; -const String githubQuery = ''' +/// The file of the remote repo to query. +const String _githubTargetFolder = 'src/vs/workbench/services/keybinding/browser/keyboardLayouts'; + +/// The full query string for GraphQL. +const String _githubQuery = ''' { repository(owner: "microsoft", name: "vscode") { defaultBranchRef { @@ -28,7 +32,7 @@ const String githubQuery = ''' history(first: 1) { nodes { oid - file(path: "$githubTargetFolder") { + file(path: "$_githubTargetFolder") { extension lineCount object { ... on Tree { entries { @@ -55,7 +59,7 @@ final List _kGoalKeys = kLayoutGoals.keys.toList(); /// A map from the key of `kLayoutGoals` (KeyboardEvent.key) to an /// auto-incremental index. -final Map kGoalToIndex = Map.fromEntries( +final Map _kGoalToIndex = Map.fromEntries( _kGoalKeys.asMap().entries.map( (MapEntry entry) => MapEntry(entry.value, entry.key)), ); @@ -97,9 +101,14 @@ Future _tryCached(String cachePath, bool forceRefresh, AsyncGetter> _fetchGithub(String githubToken, bool forceRefresh, String cachePath) async { final String response = await _tryCached(cachePath, forceRefresh, () async { - final String condensedQuery = githubQuery + final String condensedQuery = _githubQuery .replaceAll(RegExp(r'\{ +'), '{') .replaceAll(RegExp(r' +\}'), '}'); final http.Response response = await http.post( @@ -136,6 +145,8 @@ _GitHubFile _jsonGetGithubFile(JsonContext files, int index) { ); } +/// Parses a literal JavaScript string that represents a character, which might +/// have been escaped or empty. String _parsePrintable(String rawString, int isDeadKey) { // Parse a char represented in unicode hex, such as \u001b. final RegExp hexParser = RegExp(r'^\\u([0-9a-fA-F]+)$'); @@ -173,6 +184,7 @@ LayoutPlatform _platformFromGithubString(String origin) { } } +/// Parses a single layout file. Layout _parseLayoutFromGithubFile(_GitHubFile file) { final Map entries = {}; @@ -192,7 +204,7 @@ Layout _parseLayoutFromGithubFile(_GitHubFile file) { // KeyboardKey.key, such as "KeyZ". final String eventKey = lineMatch.group(1)!; // Only record goals. - if (!kGoalToIndex.containsKey(eventKey)) { + if (!_kGoalToIndex.containsKey(eventKey)) { return; } @@ -235,6 +247,7 @@ Layout _parseLayoutFromGithubFile(_GitHubFile file) { return layout; } +/// Sort layouts by language first, then by platform. int _sortLayout(Layout a, Layout b) { int result = a.language.compareTo(b.language); if (result == 0) { @@ -243,7 +256,28 @@ int _sortLayout(Layout a, Layout b) { return result; } -Future> fetchFromGithub({ +/// The overall results returned from the GitHub request. +class GithubResult { + /// Create a [GithubResult]. + const GithubResult(this.layouts, this.url); + + /// All layouts, sorted. + final List layouts; + + /// The URL that points to the source folder of the VSCode GitHub repo, + /// containing the correct commit hash. + final String url; +} + +/// Fetch necessary information from the VSCode GitHub repo. +/// +/// The GraphQL request is made using the token `githubToken` (which requires +/// no extra access). The response is cached in files under directory +/// `cacheRoot`. +/// +/// If `force` is false, this function tries to read the cache. Regardless of +/// `force`, the response is always recorded in the cache. +Future fetchFromGithub({ required String githubToken, required bool force, required String cacheRoot, @@ -252,7 +286,7 @@ Future> fetchFromGithub({ final Map githubBody = await _fetchGithub( githubToken, force, - path.join(cacheRoot, githubCacheFileName), + path.join(cacheRoot, _githubCacheFileName), ); // Parse the result from GitHub. @@ -260,7 +294,7 @@ Future> fetchFromGithub({ JsonContext.root(githubBody), 'data.repository.defaultBranchRef.target.history.nodes.0', ); - // final String commitId = jsonGetKey(commitJson, 'oid').current; + final String commitId = jsonGetKey(commitJson, 'oid').current; final JsonContext fileListJson = jsonGetPath( commitJson, 'file.object.entries', @@ -279,5 +313,8 @@ Future> fetchFromGithub({ .toList() ..sort(_sortLayout); - return layouts; + final String url = 'https://github.com/microsoft/vscode/tree/$commitId/$_githubTargetFolder'; + return GithubResult(layouts, url); + +// } diff --git a/tools/gen_web_keyboard_layouts/lib/json_get.dart b/tools/gen_web_keyboard_layouts/lib/json_get.dart index fe900be634e0b..18406ad8c7d31 100644 --- a/tools/gen_web_keyboard_layouts/lib/json_get.dart +++ b/tools/gen_web_keyboard_layouts/lib/json_get.dart @@ -4,26 +4,37 @@ import 'package:meta/meta.dart' show immutable; - +/// A subtree of a JSON object as well as its path. @immutable class JsonContext { - JsonContext(this.current, this.path); + /// Create a [JsonContext] that represents a subtree. + const JsonContext(this.current, this.path); + /// The content of the subtree. final T current; + /// The path from the root. final List path; + /// Create a [JsonContext] that represents the root of a tree. static JsonContext> root(Map root) { return JsonContext>(root, const []); } } +/// A JSON object. typedef JsonObject = Map; + +/// A JSON array. typedef JsonArray = List; + String _jsonTypeErrorMessage(List currentPath, String nextKey, Type expectedType, Type actualType) { return 'Unexpected value at path ${currentPath.join('.')}.$nextKey: ' 'Expects $expectedType but got $actualType.'; } +/// Returns a JSON object's specified key. +/// +/// If the result is not of type `T`, throws an `ArgumentError`. JsonContext jsonGetKey(JsonContext context, String key) { final dynamic result = context.current[key]; if (result is! T) { @@ -32,6 +43,9 @@ JsonContext jsonGetKey(JsonContext context, String key) { return JsonContext(result, [...context.path, key]); } +/// Returns a JSON array's specified index. +/// +/// If the subtree is not of type `T`, throws an `ArgumentError`. JsonContext jsonGetIndex(JsonContext context, int index) { final dynamic result = context.current[index]; if (result is! T) { @@ -40,6 +54,23 @@ JsonContext jsonGetIndex(JsonContext context, int index) { return JsonContext(result, [...context.path, '$index']); } +List _jsonPathSplit(String path) { + return path.split('.').map((String key) { + final int? index = int.tryParse(key); + if (index != null) { + return index; + } else { + return key; + } + }).toList(); +} + +/// Returns the value at `path` of a JSON tree. +/// +/// The path is split using `.`. Integral elements are considered as array +/// indexes, while others are considered as map indexes. +/// +/// If the final result is not of type `T`, throws an `ArgumentError`. JsonContext jsonGetPath(JsonContext context, String path) { JsonContext current = context; void jsonGetKeyOrIndex(dynamic key, int depth) { @@ -73,14 +104,3 @@ JsonContext jsonGetPath(JsonContext context, String path) { } return current as JsonContext; } - -List _jsonPathSplit(String path) { - return path.split('.').map((String key) { - final int? index = int.tryParse(key); - if (index != null) { - return index; - } else { - return key; - } - }).toList(); -} diff --git a/tools/gen_web_keyboard_layouts/lib/layout_types.dart b/tools/gen_web_keyboard_layouts/lib/layout_types.dart index 73d73b9c355d2..74c87f5b159bb 100644 --- a/tools/gen_web_keyboard_layouts/lib/layout_types.dart +++ b/tools/gen_web_keyboard_layouts/lib/layout_types.dart @@ -2,21 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'dart:convert' show base64, utf8; -import 'dart:io' hide BytesBuilder; -import 'dart:typed_data'; - -// Changing the structure of layouting classes must change the following places -// as well: -// -// * Marshalling, -// * Unmarshalling, -// * Verification. - -// The following segment is not only used in the generating script, but also -// copied to the generated package. -/*@@@ SHARED SEGMENT START @@@*/ - /// The platform that the browser is running on. enum LayoutPlatform { /// Windows. @@ -75,292 +60,3 @@ class Layout { /// Maps from DOM `KeyboardKey.code`s to the characters they produce. final Map entries; } - -/// Describes all information needed to detect keyboard layout for any languages -/// on any platforms. -class LayoutStore { - /// Create a [LayoutStore]. - const LayoutStore(this.goals, this.layouts); - - /// The list of goals, mapping from DOM `KeyboardKey.code` to their mandatory - /// goal characters, or null if this goal is optional. - /// - /// Mandatory goals are characters that must be fulfilled during keyboard - /// layout detection. If the character of a mandatory goal is not assigned in - /// earlier stages, this character (the value of this map) will be assigned - /// to its corresponding key (the key of this map). - /// - /// Optional goals are keys that will be tested to see if they can be mapped - /// to mandatory goal characters. - final Map goals; - - /// The layout information for different languages on different platforms. - final List layouts; -} - -// // A [ByteBuffer] that records a offset for the convenience of reading -// // sequentially. -// class _ByteStream { -// _ByteStream(this.buffer) -// : _data = buffer.asByteData(), _offset = 0; - -// final ByteBuffer buffer; -// final ByteData _data; - -// // The current offset. -// // -// // The next read will start from this byte (inclusive). -// int get offest => _offset; -// int _offset; - -// // Read the next byte as an 8-bit unsigned integer, and increase [offset] by -// // 1. -// int readUint8() { -// final int result = _data.getUint8(_offset); -// _offset += 1; -// return result; -// } - -// // Read the next few bytes as a UTF-8 string, and increase [offset] -// // accordingly. -// // -// // The first byte will be a uint8, `length`, the number of bytes of the UTF-8 -// // sequence. Following that is the UTF-8 sequence. Therefore, the total -// // increment for [offset] is `length + 1`. -// // -// // If the `length` is 0, then an empty string is returned. -// String readString() { -// final int length = _data.getUint8(_offset); -// if (length == 0) { -// _offset += 1; -// return ''; -// } -// final Uint8List bytes = buffer.asUint8List(_offset + 1, length); -// final String result = utf8.decode(bytes); -// _offset += 1 + length; -// return result; -// } - -// // Read the next few bytes as a nullable UTF-8 string, and increase [offset] -// // accordingly. -// // -// // It is the same as [readString], except that if the `length` is 0, a null is -// // returned. -// String? readNullableString() { -// final int length = _data.getUint8(_offset); -// if (length == 0) { -// _offset += 1; -// return null; -// } -// return readString(); -// } -// } - -// /// Decode a [LayoutStore] out of the compressed binary data. -// LayoutStore unmarshallStoreCompressed(String compressed) { -// final Uint8List bytes = Uint8List.fromList(gzip.decode(base64.decode(compressed))); -// return _unmarshallStore(bytes.buffer); -// } - -// LayoutStore _unmarshallStore(ByteBuffer buffer) { -// final _ByteStream stream = _ByteStream(buffer); -// final Map goals = _unmarshallGoals(stream); -// final List goalKeys = goals.keys.toList(); -// final int layoutNum = stream.readUint8(); -// final List layouts = List.generate(layoutNum, (_) { -// return _unmarshallLayout(stream, goalKeys); -// }); -// return LayoutStore(goals, layouts); -// } - -// Map _unmarshallGoals(_ByteStream stream) { -// final int goalsLength = stream.readUint8(); -// return Map.fromEntries((() sync* { -// for (int goalIndex = 0; goalIndex < goalsLength; goalIndex += 1) { -// yield MapEntry(stream.readString(), stream.readNullableString()); -// } -// })()); -// } - -// Layout _unmarshallLayout(_ByteStream stream, List goalKeys) { -// final String language = stream.readString(); -// final LayoutPlatform platform = LayoutPlatform.values[stream.readUint8()]; -// final Map entries = Map.fromIterables( -// goalKeys, -// goalKeys.map((_) => _unmarshallLayoutEntry(stream)), -// ); -// return Layout(language, platform, entries); -// } - -// LayoutEntry _unmarshallLayoutEntry(_ByteStream stream) { -// final List printables = List.generate(_kPrintableLength, -// (_) => stream.readString()); -// final int deadMasks = stream.readUint8(); -// return LayoutEntry(printables, deadMasks); -// } - -// /*@@@ SHARED SEGMENT END @@@*/ - -// /// Compress a [LayoutStore] into the compressed binary data. -// /// -// /// See [unmarshallStoreCompressed] for decompression. -// /// -// /// The corretness of compression and decompression is checked by -// /// [verifyLayoutStoreEqual], which is run at the end of every generation. -// String marshallStoreCompressed(LayoutStore store) { -// final BytesBuilder bodyBuilder = BytesBuilder(); -// _marshallStore(bodyBuilder, store); -// final Uint8List bytes = bodyBuilder.takeBytes(); -// return base64.encode(gzip.encode(bytes)); -// } - -// void _marshallStore(BytesBuilder builder, LayoutStore store) { -// final List goalKeys = store.goals.keys.toList(); -// // Sanity check: All layouts should have the same list of keys. -// for (final Layout layout in store.layouts) { -// if (layout.entries.length != goalKeys.length) { -// throw Exception('Unmatched key list for ${layout.language}.${layout.platform}: ' -// 'Expect length ${goalKeys.length}, found length ${layout.entries.length}'); -// } -// final Set unfoundKeys = goalKeys.toSet().difference(layout.entries.keys.toSet()); -// if (unfoundKeys.isNotEmpty) { -// throw Exception('Unmatched key list for ${layout.language}.${layout.platform}: ' -// 'The following keys are not found: ${unfoundKeys.join(', ')}.'); -// } -// } - -// _marshallGoals(builder, store.goals); -// _marshallUint8(builder, store.layouts.length); -// for (final Layout layout in store.layouts) { -// _marshallLayout(builder, layout, goalKeys); -// } -// } - -// void _marshallUint8(BytesBuilder builder, int value) { -// if (value < 0 || value >= 256) { -// throw Exception('Out of range uint8: $value'); -// } -// builder.addByte(value); -// } - -// void _marshallString(BytesBuilder builder, String? string) { -// if (string == null) { -// _marshallUint8(builder, 0); -// return; -// } -// final List encoded = utf8.encode(string); -// _marshallUint8(builder, encoded.length); -// builder.add(encoded); -// } - -// void _marshallGoals(BytesBuilder builder, Map goals) { -// _marshallUint8(builder, goals.length); -// goals.forEach((String key, String? value) { -// _marshallString(builder, key); -// _marshallString(builder, value); -// }); -// } - -// void _marshallLayout(BytesBuilder builder, Layout layout, List goalKeys) { -// _marshallString(builder, layout.language); -// _marshallUint8(builder, layout.platform.index); -// for (final String key in goalKeys) { -// _marshallLayoutEntry(builder, layout.entries[key]!); -// } -// } - -// void _marshallLayoutEntry(BytesBuilder builder, LayoutEntry entry) { -// if (entry.printables.length != _kPrintableLength) { -// throw Exception('Malshaped entry printables: ${entry.printables}'); -// } -// for (final String printable in entry.printables) { -// _marshallString(builder, printable); -// } -// builder.addByte(entry.deadMasks); -// } - -// typedef _VerifyCallback = void Function(T value1, T value2, String path); - -// /// Verify that two [LayoutStore]s are equal. -// /// -// /// It verifies all fields of all children objects of the store. For maps, -// /// it also verifies that the two stores have the same order of entries. -// /// -// /// Inconsistencies will lead to throwing [Exception]. -// void verifyLayoutStoreEqual(LayoutStore store1, LayoutStore store2) { -// // Test if two values are equal by `==`, or throw an exception. -// void expectEqual(T a, T b, String path) { -// if (a != b) { -// throw Exception('Error verifying unmarshalled layout on $path: $a != $b'); -// } -// } -// // Test that two iterables are of the same length, and each of their elements -// // are verifies by `body`. -// void verifyEach(Iterable a, Iterable b, String path, _VerifyCallback body) { -// expectEqual(a.length, b.length, '$path.length'); -// final Iterator aIter = a.iterator; -// final Iterator bIter = b.iterator; -// int index = 0; -// while (aIter.moveNext()) { -// assert(bIter.moveNext()); // Guaranteed true since they're of the same length. -// body(aIter.current, bIter.current, '$path[$index]'); -// index += 1; -// } -// } - -// // Verify Store.goals -// verifyEach(store1.goals.entries, store2.goals.entries, 'Store.goals', -// (MapEntry entry1, MapEntry entry2, String path) { -// expectEqual(entry1.key, entry2.key, '$path.key'); -// expectEqual(entry1.value, entry2.value, '$path.value'); -// }); - -// // Verify Layout -// verifyEach(store1.layouts, store2.layouts, 'Store.layouts', -// (Layout layout1, Layout layout2, String path) { -// expectEqual(layout1.language, layout2.language, '$path.language'); -// expectEqual(layout1.platform, layout2.platform, '$path.platform'); -// // Verify LayoutEntry -// verifyEach(layout1.entries.entries, layout2.entries.entries, '$path.entries', -// (MapEntry entry1, MapEntry entry2, String path) { -// expectEqual(entry1.key, entry2.key, '$path.key'); -// verifyEach(entry1.value.printables, entry2.value.printables, '$path.printables', -// (String printable1, String printable2, String path) { -// expectEqual(printable1, printable2, path); -// }); -// expectEqual(entry1.value.deadMasks, entry2.value.deadMasks, '$path.deadMasks'); -// }); -// }); -// } - -// String _layoutPlatformToString(LayoutPlatform platform) { -// switch (platform) { -// case LayoutPlatform.win: -// return 'win'; -// case LayoutPlatform.linux: -// return 'linux'; -// case LayoutPlatform.darwin: -// return 'darwin'; -// } -// } - -// /// Marshall a store into a JSON. -// /// -// /// The JSON is not to be parsed by scripts, but read by human. -// Map jsonifyStore(LayoutStore store) { -// final Map storeJson = {}; -// storeJson['goals'] = Map.from(store.goals); -// storeJson['layouts'] = store.layouts.map((Layout layout) { -// final Map layoutJson = {}; -// layoutJson['language'] = layout.language; -// layoutJson['platform'] = _layoutPlatformToString(layout.platform); -// layoutJson['entries'] = Map.fromIterables( -// layout.entries.keys, -// layout.entries.values.map((LayoutEntry entry) => -// [...entry.printables, entry.deadMasks] -// ), -// ); -// return layoutJson; -// }).toList(); -// return storeJson; -// } diff --git a/tools/gen_web_keyboard_layouts/lib/main.dart b/tools/gen_web_keyboard_layouts/lib/main.dart index 3f8c6cd2e9c51..79c8a29282831 100644 --- a/tools/gen_web_keyboard_layouts/lib/main.dart +++ b/tools/gen_web_keyboard_layouts/lib/main.dart @@ -8,7 +8,6 @@ import 'package:meta/meta.dart' show immutable; import 'package:path/path.dart' as path; import 'benchmark_detector.dart'; -import 'data.dart'; import 'github.dart'; import 'layout_types.dart'; @@ -158,19 +157,17 @@ ${layoutEntries.join('\n')} } Future generate(Options options) async { - final List layouts = await fetchFromGithub( + final GithubResult githubResult = await fetchFromGithub( githubToken: options.githubToken, force: options.force, cacheRoot: options.cacheRoot, ); // Build store. - final LayoutStore store = LayoutStore(kLayoutGoals, layouts); - - final List winLayouts = store.layouts.where((Layout layout) => + final List winLayouts = githubResult.layouts.where((Layout layout) => layout.platform == LayoutPlatform.win).toList(); - final List linuxLayouts = store.layouts.where((Layout layout) => + final List linuxLayouts = githubResult.layouts.where((Layout layout) => layout.platform == LayoutPlatform.linux).toList(); - final List darwinLayouts = store.layouts.where((Layout layout) => + final List darwinLayouts = githubResult.layouts.where((Layout layout) => layout.platform == LayoutPlatform.darwin).toList(); // Generate the definition file. @@ -180,9 +177,11 @@ Future generate(Options options) async { _renderTemplate( File(path.join(options.dataRoot, 'key_mappings.dart.tmpl')).readAsStringSync(), { + 'COMMIT_URL': githubResult.url, 'WIN_MAPPING': _buildMapString(winLayouts), 'LINUX_MAPPING': _buildMapString(linuxLayouts), 'DARWIN_MAPPING': _buildMapString(darwinLayouts), + 'COMMON': _readSharedSegment(path.join(options.libRoot, 'common.dart')), }, ), ); @@ -200,12 +199,4 @@ Future generate(Options options) async { }, ), ); - - - // // Generate the JSON file. - // _writeFileTo( - // options.dataRoot, - // 'definitions_uncompressed.g.json', - // const JsonEncoder.withIndent(' ').convert(jsonifyStore(store)), - // ); } diff --git a/tools/gen_web_keyboard_layouts/lib/utils.dart b/tools/gen_web_keyboard_layouts/lib/utils.dart deleted file mode 100644 index a24e698be7e4a..0000000000000 --- a/tools/gen_web_keyboard_layouts/lib/utils.dart +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2014 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/// Converts an integer into a hex string with the given number of digits. -String toHex(int? value, {int digits = 8}) { - if (value == null) { - return 'null'; - } - return '0x${value.toRadixString(16).padLeft(digits, '0')}'; -} From d089597c9da5f7e36c96e77879d86be2dab578cb Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 14 Nov 2022 18:05:40 -0800 Subject: [PATCH 39/74] Combine into bin --- .../bin/gen_web_keyboard_layouts.dart | 155 +- .../data/definitions_uncompressed.g.json | 14793 ---------------- .../data/types.dart.tmpl | 17 - .../lib/benchmark_detector.dart | 14 +- .../lib/layout_types.dart | 1 + tools/gen_web_keyboard_layouts/lib/main.dart | 202 - 6 files changed, 156 insertions(+), 15026 deletions(-) delete mode 100644 tools/gen_web_keyboard_layouts/data/definitions_uncompressed.g.json delete mode 100644 tools/gen_web_keyboard_layouts/data/types.dart.tmpl delete mode 100644 tools/gen_web_keyboard_layouts/lib/main.dart diff --git a/tools/gen_web_keyboard_layouts/bin/gen_web_keyboard_layouts.dart b/tools/gen_web_keyboard_layouts/bin/gen_web_keyboard_layouts.dart index 1b5a7674463e3..e402772e23f8e 100644 --- a/tools/gen_web_keyboard_layouts/bin/gen_web_keyboard_layouts.dart +++ b/tools/gen_web_keyboard_layouts/bin/gen_web_keyboard_layouts.dart @@ -5,11 +5,112 @@ import 'dart:io'; import 'package:args/args.dart'; -import 'package:gen_web_keyboard_layouts/main.dart'; +import 'package:gen_web_keyboard_layouts/benchmark_detector.dart'; +import 'package:gen_web_keyboard_layouts/github.dart'; +import 'package:gen_web_keyboard_layouts/layout_types.dart'; import 'package:path/path.dart' as path; const String kEnvGithubToken = 'GITHUB_TOKEN'; +String _renderTemplate( + String template, Map dictionary) { + String result = template; + dictionary.forEach((String key, String value) { + final String localResult = result.replaceAll('@@@$key@@@', value); + if (localResult == result) { + print('Template key $key is not used.'); + } + result = localResult; + }); + return result; +} + +void _writeFileTo( + String outputDir, + String outputFileName, + String body) { + final String outputPath = path.join(outputDir, outputFileName); + Directory(outputDir).createSync(recursive: true); + File(outputPath).writeAsStringSync(body); +} + +String _readSharedSegment(String path) { + const String kSegmentStartMark = '/*@@@ SHARED SEGMENT START @@@*/'; + const String kSegmentEndMark = '/*@@@ SHARED SEGMENT END @@@*/'; + final List lines = File(path).readAsStringSync().split('\n'); + // Defining the two variables as `late final` ensures that each mark is found + // once and only once, otherwise assertion errors will be thrown. + late final int startLine; + late final int endLine; + for (int lineNo = 0; lineNo < lines.length; lineNo += 1) { + if (lines[lineNo] == kSegmentStartMark) { + startLine = lineNo; + } else if (lines[lineNo] == kSegmentEndMark) { + endLine = lineNo; + } + } + assert(startLine < endLine); + return lines.sublist(startLine + 1, endLine).join('\n').trimRight(); +} + +typedef _ForEachAction = void Function(String key, V value); +void _sortedForEach(Map map, _ForEachAction action) { + map + .entries + .toList() + ..sort((MapEntry a, MapEntry b) => a.key.compareTo(b.key)) + ..forEach((MapEntry entry) { + action(entry.key, entry.value); + }); +} + +String _escapeEventKey(String original) { + switch (original) { + case "'": + return '"\'"'; + case r'\': + return r"r'\'"; + case r'$': + return r"r'$'"; + default: + return "'$original'"; + } +} + +String _buildMapString(Iterable layouts) { + final List codeStrings = []; + _sortedForEach(combineLayouts(layouts), (String eventCode, Map eventKeyToLogicalKeys) { + final List codeStringBodies = []; + _sortedForEach(eventKeyToLogicalKeys, (String eventKey, int result) { + codeStringBodies.add(' ${_escapeEventKey(eventKey)}: 0x${result.toRadixString(16)},'); + }); + codeStrings.add(''' + '$eventCode': { +${codeStringBodies.join('\n').trimRight()} + },'''); + }); + return '>{\n${codeStrings.join('\n')}\n}'; +} + +String _buildTestCasesString(List layouts) { + final List layoutsString = []; + for (final Layout layout in layouts) { + final List layoutEntries = []; + _sortedForEach(planLayout(layout.entries), (String eventCode, int logicalKey) { + final LayoutEntry entry = layout.entries[eventCode]!; + layoutEntries.add(" verifyEntry(mapping, '$eventCode', [" + '${entry.printables.map(_escapeEventKey).join(', ')}' + "], '${String.fromCharCode(logicalKey)}');"); + }); + layoutsString.add(''' + group('${layout.language}', () { +${layoutEntries.join('\n')} + }); +'''); + } + return layoutsString.join('\n').trimRight(); +} + Future main(List rawArguments) async { final Map env = Platform.environment; final ArgParser argParser = ArgParser(); @@ -58,13 +159,51 @@ Future main(List rawArguments) async { // 'gen_web_keyboard_layouts' and contains 'pubspec.yaml'. final Directory packageRoot = Directory(path.dirname(Platform.script.toFilePath())).parent; - await generate(Options( + // The root of the output package. The folder that is called + // 'web_keyboard_layouts' and contains 'pubspec.yaml'. + final String outputRoot = path.join(packageRoot.parent.parent.path, + 'third_party', 'web_keyboard_layouts'); + + final GithubResult githubResult = await fetchFromGithub( githubToken: envGithubToken, - cacheRoot: path.join(packageRoot.path, '.cache'), - dataRoot: path.join(packageRoot.path, 'data'), - libRoot: path.join(packageRoot.path, 'lib'), force: parsedArguments['force'] as bool, - outputRoot: path.join(packageRoot.parent.parent.path, - 'third_party', 'web_keyboard_layouts'), - )); + cacheRoot: path.join(packageRoot.path, '.cache'), + ); + // Build store. + final List winLayouts = githubResult.layouts.where((Layout layout) => + layout.platform == LayoutPlatform.win).toList(); + final List linuxLayouts = githubResult.layouts.where((Layout layout) => + layout.platform == LayoutPlatform.linux).toList(); + final List darwinLayouts = githubResult.layouts.where((Layout layout) => + layout.platform == LayoutPlatform.darwin).toList(); + + // Generate the definition file. + _writeFileTo( + path.join(outputRoot, 'lib', 'web_keyboard_layouts'), + 'key_mappings.g.dart', + _renderTemplate( + File(path.join(packageRoot.path, 'data', 'key_mappings.dart.tmpl')).readAsStringSync(), + { + 'COMMIT_URL': githubResult.url, + 'WIN_MAPPING': _buildMapString(winLayouts), + 'LINUX_MAPPING': _buildMapString(linuxLayouts), + 'DARWIN_MAPPING': _buildMapString(darwinLayouts), + 'COMMON': _readSharedSegment(path.join(packageRoot.path, 'lib', 'common.dart')), + }, + ), + ); + + // Generate the test cases. + _writeFileTo( + path.join(outputRoot, 'test'), + 'test_cases.g.dart', + _renderTemplate( + File(path.join(packageRoot.path, 'data', 'test_cases.dart.tmpl')).readAsStringSync(), + { + 'WIN_CASES': _buildTestCasesString(winLayouts), + 'LINUX_CASES': _buildTestCasesString(linuxLayouts), + 'DARWIN_CASES': _buildTestCasesString(darwinLayouts), + }, + ), + ); } diff --git a/tools/gen_web_keyboard_layouts/data/definitions_uncompressed.g.json b/tools/gen_web_keyboard_layouts/data/definitions_uncompressed.g.json deleted file mode 100644 index 2888a211c2272..0000000000000 --- a/tools/gen_web_keyboard_layouts/data/definitions_uncompressed.g.json +++ /dev/null @@ -1,14793 +0,0 @@ -{ - "goals": { - "KeyA": "A", - "KeyB": "B", - "KeyC": "C", - "KeyD": "D", - "KeyE": "E", - "KeyF": "F", - "KeyG": "G", - "KeyH": "H", - "KeyI": "I", - "KeyJ": "J", - "KeyK": "K", - "KeyL": "L", - "KeyM": "M", - "KeyN": "N", - "KeyO": "O", - "KeyP": "P", - "KeyQ": "Q", - "KeyR": "R", - "KeyS": "S", - "KeyT": "T", - "KeyU": "U", - "KeyV": "V", - "KeyW": "W", - "KeyX": "X", - "KeyY": "Y", - "KeyZ": "Z", - "Digit1": "1", - "Digit2": "2", - "Digit3": "3", - "Digit4": "4", - "Digit5": "5", - "Digit6": "6", - "Digit7": "7", - "Digit8": "8", - "Digit9": "9", - "Digit0": "0", - "Minus": null, - "Equal": null, - "BracketLeft": null, - "BracketRight": null, - "Backslash": null, - "Semicolon": null, - "Quote": null, - "Backquote": null, - "Comma": null, - "Period": null, - "Slash": null - }, - "layouts": [ - { - "language": "cz", - "platform": "win", - "entries": { - "KeyA": [ - "a", - "A", - "", - "", - 0 - ], - "KeyB": [ - "b", - "B", - "{", - "", - 0 - ], - "KeyC": [ - "c", - "C", - "&", - "", - 0 - ], - "KeyD": [ - "d", - "D", - "Đ", - "", - 0 - ], - "KeyE": [ - "e", - "E", - "€", - "", - 0 - ], - "KeyF": [ - "f", - "F", - "[", - "", - 0 - ], - "KeyG": [ - "g", - "G", - "]", - "", - 0 - ], - "KeyH": [ - "h", - "H", - "", - "", - 0 - ], - "KeyI": [ - "i", - "I", - "", - "", - 0 - ], - "KeyJ": [ - "j", - "J", - "", - "", - 0 - ], - "KeyK": [ - "k", - "K", - "ł", - "", - 0 - ], - "KeyL": [ - "l", - "L", - "Ł", - "", - 0 - ], - "KeyM": [ - "m", - "M", - "", - "", - 0 - ], - "KeyN": [ - "n", - "N", - "}", - "", - 0 - ], - "KeyO": [ - "o", - "O", - "", - "", - 0 - ], - "KeyP": [ - "p", - "P", - "", - "", - 0 - ], - "KeyQ": [ - "q", - "Q", - "\\", - "", - 0 - ], - "KeyR": [ - "r", - "R", - "", - "", - 0 - ], - "KeyS": [ - "s", - "S", - "đ", - "", - 0 - ], - "KeyT": [ - "t", - "T", - "", - "", - 0 - ], - "KeyU": [ - "u", - "U", - "", - "", - 0 - ], - "KeyV": [ - "v", - "V", - "@", - "", - 0 - ], - "KeyW": [ - "w", - "W", - "|", - "", - 0 - ], - "KeyX": [ - "x", - "X", - "#", - "", - 0 - ], - "KeyY": [ - "z", - "Z", - "", - "", - 0 - ], - "KeyZ": [ - "y", - "Y", - "", - "", - 0 - ], - "Digit1": [ - "+", - "1", - "~", - "", - 0 - ], - "Digit2": [ - "ě", - "2", - "ˇ", - "", - 0 - ], - "Digit3": [ - "š", - "3", - "^", - "", - 0 - ], - "Digit4": [ - "č", - "4", - "˘", - "", - 0 - ], - "Digit5": [ - "ř", - "5", - "°", - "", - 0 - ], - "Digit6": [ - "ž", - "6", - "˛", - "", - 0 - ], - "Digit7": [ - "ý", - "7", - "`", - "", - 0 - ], - "Digit8": [ - "á", - "8", - "˙", - "", - 0 - ], - "Digit9": [ - "í", - "9", - "´", - "", - 0 - ], - "Digit0": [ - "é", - "0", - "˝", - "", - 0 - ], - "Minus": [ - "=", - "%", - "¨", - "", - 0 - ], - "Equal": [ - "´", - "ˇ", - "¸", - "", - 0 - ], - "BracketLeft": [ - "ú", - "/", - "÷", - "", - 0 - ], - "BracketRight": [ - ")", - "(", - "×", - "", - 0 - ], - "Backslash": [ - "¨", - "'", - "¤", - "", - 0 - ], - "Semicolon": [ - "ů", - "\"", - "$", - "", - 0 - ], - "Quote": [ - "§", - "!", - "ß", - "", - 0 - ], - "Backquote": [ - ";", - "°", - "", - "", - 0 - ], - "Comma": [ - ",", - "?", - "<", - "", - 0 - ], - "Period": [ - ".", - ":", - ">", - "", - 0 - ], - "Slash": [ - "-", - "_", - "*", - "", - 0 - ] - } - }, - { - "language": "de", - "platform": "win", - "entries": { - "KeyA": [ - "a", - "A", - "", - "", - 0 - ], - "KeyB": [ - "b", - "B", - "", - "", - 0 - ], - "KeyC": [ - "c", - "C", - "", - "", - 0 - ], - "KeyD": [ - "d", - "D", - "", - "", - 0 - ], - "KeyE": [ - "e", - "E", - "€", - "", - 0 - ], - "KeyF": [ - "f", - "F", - "", - "", - 0 - ], - "KeyG": [ - "g", - "G", - "", - "", - 0 - ], - "KeyH": [ - "h", - "H", - "", - "", - 0 - ], - "KeyI": [ - "i", - "I", - "", - "", - 0 - ], - "KeyJ": [ - "j", - "J", - "", - "", - 0 - ], - "KeyK": [ - "k", - "K", - "", - "", - 0 - ], - "KeyL": [ - "l", - "L", - "", - "", - 0 - ], - "KeyM": [ - "m", - "M", - "µ", - "", - 0 - ], - "KeyN": [ - "n", - "N", - "", - "", - 0 - ], - "KeyO": [ - "o", - "O", - "", - "", - 0 - ], - "KeyP": [ - "p", - "P", - "", - "", - 0 - ], - "KeyQ": [ - "q", - "Q", - "@", - "", - 0 - ], - "KeyR": [ - "r", - "R", - "", - "", - 0 - ], - "KeyS": [ - "s", - "S", - "", - "", - 0 - ], - "KeyT": [ - "t", - "T", - "", - "", - 0 - ], - "KeyU": [ - "u", - "U", - "", - "", - 0 - ], - "KeyV": [ - "v", - "V", - "", - "", - 0 - ], - "KeyW": [ - "w", - "W", - "", - "", - 0 - ], - "KeyX": [ - "x", - "X", - "", - "", - 0 - ], - "KeyY": [ - "z", - "Z", - "", - "", - 0 - ], - "KeyZ": [ - "y", - "Y", - "", - "", - 0 - ], - "Digit1": [ - "1", - "!", - "", - "", - 0 - ], - "Digit2": [ - "2", - "\"", - "²", - "", - 0 - ], - "Digit3": [ - "3", - "§", - "³", - "", - 0 - ], - "Digit4": [ - "4", - "$", - "", - "", - 0 - ], - "Digit5": [ - "5", - "%", - "", - "", - 0 - ], - "Digit6": [ - "6", - "&", - "", - "", - 0 - ], - "Digit7": [ - "7", - "/", - "{", - "", - 0 - ], - "Digit8": [ - "8", - "(", - "[", - "", - 0 - ], - "Digit9": [ - "9", - ")", - "]", - "", - 0 - ], - "Digit0": [ - "0", - "=", - "}", - "", - 0 - ], - "Minus": [ - "ß", - "?", - "\\", - "ẞ", - 0 - ], - "Equal": [ - "´", - "`", - "", - "", - 0 - ], - "BracketLeft": [ - "ü", - "Ü", - "", - "", - 0 - ], - "BracketRight": [ - "+", - "*", - "~", - "", - 0 - ], - "Backslash": [ - "#", - "'", - "", - "", - 0 - ], - "Semicolon": [ - "ö", - "Ö", - "", - "", - 0 - ], - "Quote": [ - "ä", - "Ä", - "", - "", - 0 - ], - "Backquote": [ - "^", - "°", - "", - "", - 0 - ], - "Comma": [ - ",", - ";", - "", - "", - 0 - ], - "Period": [ - ".", - ":", - "", - "", - 0 - ], - "Slash": [ - "-", - "_", - "", - "", - 0 - ] - } - }, - { - "language": "de", - "platform": "linux", - "entries": { - "KeyA": [ - "a", - "A", - "æ", - "Æ", - 0 - ], - "KeyB": [ - "b", - "B", - "“", - "‘", - 0 - ], - "KeyC": [ - "c", - "C", - "¢", - "©", - 0 - ], - "KeyD": [ - "d", - "D", - "ð", - "Ð", - 0 - ], - "KeyE": [ - "e", - "E", - "€", - "€", - 0 - ], - "KeyF": [ - "f", - "F", - "đ", - "ª", - 0 - ], - "KeyG": [ - "g", - "G", - "ŋ", - "Ŋ", - 0 - ], - "KeyH": [ - "h", - "H", - "ħ", - "Ħ", - 0 - ], - "KeyI": [ - "i", - "I", - "→", - "ı", - 0 - ], - "KeyJ": [ - "j", - "J", - "̣", - "̇", - 0 - ], - "KeyK": [ - "k", - "K", - "ĸ", - "&", - 0 - ], - "KeyL": [ - "l", - "L", - "ł", - "Ł", - 0 - ], - "KeyM": [ - "m", - "M", - "µ", - "º", - 0 - ], - "KeyN": [ - "n", - "N", - "”", - "’", - 0 - ], - "KeyO": [ - "o", - "O", - "ø", - "Ø", - 0 - ], - "KeyP": [ - "p", - "P", - "þ", - "Þ", - 0 - ], - "KeyQ": [ - "q", - "Q", - "@", - "Ω", - 0 - ], - "KeyR": [ - "r", - "R", - "¶", - "®", - 0 - ], - "KeyS": [ - "s", - "S", - "ſ", - "ẞ", - 0 - ], - "KeyT": [ - "t", - "T", - "ŧ", - "Ŧ", - 0 - ], - "KeyU": [ - "u", - "U", - "↓", - "↑", - 0 - ], - "KeyV": [ - "v", - "V", - "„", - "‚", - 0 - ], - "KeyW": [ - "w", - "W", - "ł", - "Ł", - 0 - ], - "KeyX": [ - "x", - "X", - "«", - "‹", - 0 - ], - "KeyY": [ - "z", - "Z", - "←", - "¥", - 0 - ], - "KeyZ": [ - "y", - "Y", - "»", - "›", - 0 - ], - "Digit1": [ - "1", - "!", - "¹", - "¡", - 0 - ], - "Digit2": [ - "2", - "\"", - "²", - "⅛", - 0 - ], - "Digit3": [ - "3", - "§", - "³", - "£", - 0 - ], - "Digit4": [ - "4", - "$", - "¼", - "¤", - 0 - ], - "Digit5": [ - "5", - "%", - "½", - "⅜", - 0 - ], - "Digit6": [ - "6", - "&", - "¬", - "⅝", - 0 - ], - "Digit7": [ - "7", - "/", - "{", - "⅞", - 0 - ], - "Digit8": [ - "8", - "(", - "[", - "™", - 0 - ], - "Digit9": [ - "9", - ")", - "]", - "±", - 0 - ], - "Digit0": [ - "0", - "=", - "}", - "°", - 0 - ], - "Minus": [ - "ß", - "?", - "\\", - "¿", - 0 - ], - "Equal": [ - "́", - "̀", - "̧", - "̨", - 0 - ], - "BracketLeft": [ - "ü", - "Ü", - "̈", - "̊", - 0 - ], - "BracketRight": [ - "+", - "*", - "~", - "¯", - 0 - ], - "Backslash": [ - "#", - "'", - "’", - "̆", - 0 - ], - "Semicolon": [ - "ö", - "Ö", - "̋", - "̣", - 0 - ], - "Quote": [ - "ä", - "Ä", - "̂", - "̌", - 0 - ], - "Backquote": [ - "̂", - "°", - "′", - "″", - 0 - ], - "Comma": [ - ",", - ";", - "·", - "×", - 0 - ], - "Period": [ - ".", - ":", - "…", - "÷", - 0 - ], - "Slash": [ - "-", - "_", - "–", - "—", - 0 - ] - } - }, - { - "language": "de", - "platform": "darwin", - "entries": { - "KeyA": [ - "a", - "A", - "å", - "Å", - 0 - ], - "KeyB": [ - "b", - "B", - "∫", - "‹", - 0 - ], - "KeyC": [ - "c", - "C", - "ç", - "Ç", - 0 - ], - "KeyD": [ - "d", - "D", - "∂", - "™", - 0 - ], - "KeyE": [ - "e", - "E", - "€", - "‰", - 0 - ], - "KeyF": [ - "f", - "F", - "ƒ", - "Ï", - 0 - ], - "KeyG": [ - "g", - "G", - "©", - "Ì", - 0 - ], - "KeyH": [ - "h", - "H", - "ª", - "Ó", - 0 - ], - "KeyI": [ - "i", - "I", - "⁄", - "Û", - 0 - ], - "KeyJ": [ - "j", - "J", - "º", - "ı", - 0 - ], - "KeyK": [ - "k", - "K", - "∆", - "ˆ", - 0 - ], - "KeyL": [ - "l", - "L", - "@", - "fl", - 0 - ], - "KeyM": [ - "m", - "M", - "µ", - "˘", - 0 - ], - "KeyN": [ - "n", - "N", - "~", - "›", - 4 - ], - "KeyO": [ - "o", - "O", - "ø", - "Ø", - 0 - ], - "KeyP": [ - "p", - "P", - "π", - "∏", - 0 - ], - "KeyQ": [ - "q", - "Q", - "«", - "»", - 0 - ], - "KeyR": [ - "r", - "R", - "®", - "¸", - 0 - ], - "KeyS": [ - "s", - "S", - "‚", - "Í", - 0 - ], - "KeyT": [ - "t", - "T", - "†", - "˝", - 0 - ], - "KeyU": [ - "u", - "U", - "¨", - "Á", - 4 - ], - "KeyV": [ - "v", - "V", - "√", - "◊", - 0 - ], - "KeyW": [ - "w", - "W", - "∑", - "„", - 0 - ], - "KeyX": [ - "x", - "X", - "≈", - "Ù", - 0 - ], - "KeyY": [ - "z", - "Z", - "Ω", - "ˇ", - 0 - ], - "KeyZ": [ - "y", - "Y", - "¥", - "‡", - 0 - ], - "Digit1": [ - "1", - "!", - "¡", - "¬", - 0 - ], - "Digit2": [ - "2", - "\"", - "“", - "”", - 0 - ], - "Digit3": [ - "3", - "§", - "¶", - "#", - 0 - ], - "Digit4": [ - "4", - "$", - "¢", - "£", - 0 - ], - "Digit5": [ - "5", - "%", - "[", - "fi", - 0 - ], - "Digit6": [ - "6", - "&", - "]", - "^", - 8 - ], - "Digit7": [ - "7", - "/", - "|", - "\\", - 0 - ], - "Digit8": [ - "8", - "(", - "{", - "˜", - 0 - ], - "Digit9": [ - "9", - ")", - "}", - "·", - 0 - ], - "Digit0": [ - "0", - "=", - "≠", - "¯", - 0 - ], - "Minus": [ - "ß", - "?", - "¿", - "˙", - 0 - ], - "Equal": [ - "´", - "`", - "'", - "˚", - 3 - ], - "BracketLeft": [ - "ü", - "Ü", - "•", - "°", - 0 - ], - "BracketRight": [ - "+", - "*", - "±", - "", - 0 - ], - "Backslash": [ - "#", - "'", - "‘", - "’", - 0 - ], - "Semicolon": [ - "ö", - "Ö", - "œ", - "Œ", - 0 - ], - "Quote": [ - "ä", - "Ä", - "æ", - "Æ", - 0 - ], - "Backquote": [ - "<", - ">", - "≤", - "≥", - 0 - ], - "Comma": [ - ",", - ";", - "∞", - "˛", - 0 - ], - "Period": [ - ".", - ":", - "…", - "÷", - 0 - ], - "Slash": [ - "-", - "_", - "–", - "—", - 0 - ] - } - }, - { - "language": "de-swiss", - "platform": "win", - "entries": { - "KeyA": [ - "a", - "A", - "", - "", - 0 - ], - "KeyB": [ - "b", - "B", - "", - "", - 0 - ], - "KeyC": [ - "c", - "C", - "", - "", - 0 - ], - "KeyD": [ - "d", - "D", - "", - "", - 0 - ], - "KeyE": [ - "e", - "E", - "€", - "", - 0 - ], - "KeyF": [ - "f", - "F", - "", - "", - 0 - ], - "KeyG": [ - "g", - "G", - "", - "", - 0 - ], - "KeyH": [ - "h", - "H", - "", - "", - 0 - ], - "KeyI": [ - "i", - "I", - "", - "", - 0 - ], - "KeyJ": [ - "j", - "J", - "", - "", - 0 - ], - "KeyK": [ - "k", - "K", - "", - "", - 0 - ], - "KeyL": [ - "l", - "L", - "", - "", - 0 - ], - "KeyM": [ - "m", - "M", - "", - "", - 0 - ], - "KeyN": [ - "n", - "N", - "", - "", - 0 - ], - "KeyO": [ - "o", - "O", - "", - "", - 0 - ], - "KeyP": [ - "p", - "P", - "", - "", - 0 - ], - "KeyQ": [ - "q", - "Q", - "", - "", - 0 - ], - "KeyR": [ - "r", - "R", - "", - "", - 0 - ], - "KeyS": [ - "s", - "S", - "", - "", - 0 - ], - "KeyT": [ - "t", - "T", - "", - "", - 0 - ], - "KeyU": [ - "u", - "U", - "", - "", - 0 - ], - "KeyV": [ - "v", - "V", - "", - "", - 0 - ], - "KeyW": [ - "w", - "W", - "", - "", - 0 - ], - "KeyX": [ - "x", - "X", - "", - "", - 0 - ], - "KeyY": [ - "z", - "Z", - "", - "", - 0 - ], - "KeyZ": [ - "y", - "Y", - "", - "", - 0 - ], - "Digit1": [ - "1", - "+", - "¦", - "", - 0 - ], - "Digit2": [ - "2", - "\"", - "@", - "", - 0 - ], - "Digit3": [ - "3", - "*", - "#", - "", - 0 - ], - "Digit4": [ - "4", - "ç", - "°", - "", - 0 - ], - "Digit5": [ - "5", - "%", - "§", - "", - 0 - ], - "Digit6": [ - "6", - "&", - "¬", - "", - 0 - ], - "Digit7": [ - "7", - "/", - "|", - "", - 0 - ], - "Digit8": [ - "8", - "(", - "¢", - "", - 0 - ], - "Digit9": [ - "9", - ")", - "", - "", - 0 - ], - "Digit0": [ - "0", - "=", - "", - "", - 0 - ], - "Minus": [ - "'", - "?", - "´", - "", - 0 - ], - "Equal": [ - "^", - "`", - "~", - "", - 0 - ], - "BracketLeft": [ - "ü", - "è", - "[", - "", - 0 - ], - "BracketRight": [ - "¨", - "!", - "]", - "", - 0 - ], - "Backslash": [ - "$", - "£", - "}", - "", - 0 - ], - "Semicolon": [ - "ö", - "é", - "", - "", - 0 - ], - "Quote": [ - "ä", - "à", - "{", - "", - 0 - ], - "Backquote": [ - "§", - "°", - "", - "", - 0 - ], - "Comma": [ - ",", - ";", - "", - "", - 0 - ], - "Period": [ - ".", - ":", - "", - "", - 0 - ], - "Slash": [ - "-", - "_", - "", - "", - 0 - ] - } - }, - { - "language": "dk", - "platform": "win", - "entries": { - "KeyA": [ - "a", - "A", - "", - "", - 0 - ], - "KeyB": [ - "b", - "B", - "", - "", - 0 - ], - "KeyC": [ - "c", - "C", - "", - "", - 0 - ], - "KeyD": [ - "d", - "D", - "", - "", - 0 - ], - "KeyE": [ - "e", - "E", - "€", - "", - 0 - ], - "KeyF": [ - "f", - "F", - "", - "", - 0 - ], - "KeyG": [ - "g", - "G", - "", - "", - 0 - ], - "KeyH": [ - "h", - "H", - "", - "", - 0 - ], - "KeyI": [ - "i", - "I", - "", - "", - 0 - ], - "KeyJ": [ - "j", - "J", - "", - "", - 0 - ], - "KeyK": [ - "k", - "K", - "", - "", - 0 - ], - "KeyL": [ - "l", - "L", - "", - "", - 0 - ], - "KeyM": [ - "m", - "M", - "µ", - "", - 0 - ], - "KeyN": [ - "n", - "N", - "", - "", - 0 - ], - "KeyO": [ - "o", - "O", - "", - "", - 0 - ], - "KeyP": [ - "p", - "P", - "", - "", - 0 - ], - "KeyQ": [ - "q", - "Q", - "", - "", - 0 - ], - "KeyR": [ - "r", - "R", - "", - "", - 0 - ], - "KeyS": [ - "s", - "S", - "", - "", - 0 - ], - "KeyT": [ - "t", - "T", - "", - "", - 0 - ], - "KeyU": [ - "u", - "U", - "", - "", - 0 - ], - "KeyV": [ - "v", - "V", - "", - "", - 0 - ], - "KeyW": [ - "w", - "W", - "", - "", - 0 - ], - "KeyX": [ - "x", - "X", - "", - "", - 0 - ], - "KeyY": [ - "y", - "Y", - "", - "", - 0 - ], - "KeyZ": [ - "z", - "Z", - "", - "", - 0 - ], - "Digit1": [ - "1", - "!", - "", - "", - 0 - ], - "Digit2": [ - "2", - "\"", - "@", - "", - 0 - ], - "Digit3": [ - "3", - "#", - "£", - "", - 0 - ], - "Digit4": [ - "4", - "¤", - "$", - "", - 0 - ], - "Digit5": [ - "5", - "%", - "€", - "", - 0 - ], - "Digit6": [ - "6", - "&", - "", - "", - 0 - ], - "Digit7": [ - "7", - "/", - "{", - "", - 0 - ], - "Digit8": [ - "8", - "(", - "[", - "", - 0 - ], - "Digit9": [ - "9", - ")", - "]", - "", - 0 - ], - "Digit0": [ - "0", - "=", - "}", - "", - 0 - ], - "Minus": [ - "+", - "?", - "", - "", - 0 - ], - "Equal": [ - "´", - "`", - "|", - "", - 0 - ], - "BracketLeft": [ - "å", - "Å", - "", - "", - 0 - ], - "BracketRight": [ - "¨", - "^", - "~", - "", - 0 - ], - "Backslash": [ - "'", - "*", - "", - "", - 0 - ], - "Semicolon": [ - "æ", - "Æ", - "", - "", - 0 - ], - "Quote": [ - "ø", - "Ø", - "", - "", - 0 - ], - "Backquote": [ - "½", - "§", - "", - "", - 0 - ], - "Comma": [ - ",", - ";", - "", - "", - 0 - ], - "Period": [ - ".", - ":", - "", - "", - 0 - ], - "Slash": [ - "-", - "_", - "", - "", - 0 - ] - } - }, - { - "language": "dvorak", - "platform": "darwin", - "entries": { - "KeyA": [ - "a", - "A", - "å", - "Å", - 0 - ], - "KeyB": [ - "x", - "X", - "≈", - "˛", - 0 - ], - "KeyC": [ - "j", - "J", - "∆", - "Ô", - 0 - ], - "KeyD": [ - "e", - "E", - "´", - "´", - 4 - ], - "KeyE": [ - ".", - ">", - "≥", - "˘", - 0 - ], - "KeyF": [ - "u", - "U", - "¨", - "¨", - 4 - ], - "KeyG": [ - "i", - "I", - "ˆ", - "ˆ", - 4 - ], - "KeyH": [ - "d", - "D", - "∂", - "Î", - 0 - ], - "KeyI": [ - "c", - "C", - "ç", - "Ç", - 0 - ], - "KeyJ": [ - "h", - "H", - "˙", - "Ó", - 0 - ], - "KeyK": [ - "t", - "T", - "†", - "ˇ", - 0 - ], - "KeyL": [ - "n", - "N", - "˜", - "˜", - 4 - ], - "KeyM": [ - "m", - "M", - "µ", - "Â", - 0 - ], - "KeyN": [ - "b", - "B", - "∫", - "ı", - 0 - ], - "KeyO": [ - "r", - "R", - "®", - "‰", - 0 - ], - "KeyP": [ - "l", - "L", - "¬", - "Ò", - 0 - ], - "KeyQ": [ - "'", - "\"", - "æ", - "Æ", - 0 - ], - "KeyR": [ - "p", - "P", - "π", - "∏", - 0 - ], - "KeyS": [ - "o", - "O", - "ø", - "Ø", - 0 - ], - "KeyT": [ - "y", - "Y", - "¥", - "Á", - 0 - ], - "KeyU": [ - "g", - "G", - "©", - "˝", - 0 - ], - "KeyV": [ - "k", - "K", - "˚", - "", - 0 - ], - "KeyW": [ - ",", - "<", - "≤", - "¯", - 0 - ], - "KeyX": [ - "q", - "Q", - "œ", - "Œ", - 0 - ], - "KeyY": [ - "f", - "F", - "ƒ", - "Ï", - 0 - ], - "KeyZ": [ - ";", - ":", - "…", - "Ú", - 0 - ], - "Digit1": [ - "1", - "!", - "¡", - "⁄", - 0 - ], - "Digit2": [ - "2", - "@", - "™", - "€", - 0 - ], - "Digit3": [ - "3", - "#", - "£", - "‹", - 0 - ], - "Digit4": [ - "4", - "$", - "¢", - "›", - 0 - ], - "Digit5": [ - "5", - "%", - "∞", - "fi", - 0 - ], - "Digit6": [ - "6", - "^", - "§", - "fl", - 0 - ], - "Digit7": [ - "7", - "&", - "¶", - "‡", - 0 - ], - "Digit8": [ - "8", - "*", - "•", - "°", - 0 - ], - "Digit9": [ - "9", - "(", - "ª", - "·", - 0 - ], - "Digit0": [ - "0", - ")", - "º", - "‚", - 0 - ], - "Minus": [ - "[", - "{", - "“", - "”", - 0 - ], - "Equal": [ - "]", - "}", - "‘", - "’", - 0 - ], - "BracketLeft": [ - "/", - "?", - "÷", - "¿", - 0 - ], - "BracketRight": [ - "=", - "+", - "≠", - "±", - 0 - ], - "Backslash": [ - "\\", - "|", - "«", - "»", - 0 - ], - "Semicolon": [ - "s", - "S", - "ß", - "Í", - 0 - ], - "Quote": [ - "-", - "_", - "–", - "—", - 0 - ], - "Backquote": [ - "`", - "~", - "`", - "`", - 4 - ], - "Comma": [ - "w", - "W", - "∑", - "„", - 0 - ], - "Period": [ - "v", - "V", - "√", - "◊", - 0 - ], - "Slash": [ - "z", - "Z", - "Ω", - "¸", - 0 - ] - } - }, - { - "language": "en", - "platform": "win", - "entries": { - "KeyA": [ - "a", - "A", - "", - "", - 0 - ], - "KeyB": [ - "b", - "B", - "", - "", - 0 - ], - "KeyC": [ - "c", - "C", - "", - "", - 0 - ], - "KeyD": [ - "d", - "D", - "", - "", - 0 - ], - "KeyE": [ - "e", - "E", - "", - "", - 0 - ], - "KeyF": [ - "f", - "F", - "", - "", - 0 - ], - "KeyG": [ - "g", - "G", - "", - "", - 0 - ], - "KeyH": [ - "h", - "H", - "", - "", - 0 - ], - "KeyI": [ - "i", - "I", - "", - "", - 0 - ], - "KeyJ": [ - "j", - "J", - "", - "", - 0 - ], - "KeyK": [ - "k", - "K", - "", - "", - 0 - ], - "KeyL": [ - "l", - "L", - "", - "", - 0 - ], - "KeyM": [ - "m", - "M", - "", - "", - 0 - ], - "KeyN": [ - "n", - "N", - "", - "", - 0 - ], - "KeyO": [ - "o", - "O", - "", - "", - 0 - ], - "KeyP": [ - "p", - "P", - "", - "", - 0 - ], - "KeyQ": [ - "q", - "Q", - "", - "", - 0 - ], - "KeyR": [ - "r", - "R", - "", - "", - 0 - ], - "KeyS": [ - "s", - "S", - "", - "", - 0 - ], - "KeyT": [ - "t", - "T", - "", - "", - 0 - ], - "KeyU": [ - "u", - "U", - "", - "", - 0 - ], - "KeyV": [ - "v", - "V", - "", - "", - 0 - ], - "KeyW": [ - "w", - "W", - "", - "", - 0 - ], - "KeyX": [ - "x", - "X", - "", - "", - 0 - ], - "KeyY": [ - "y", - "Y", - "", - "", - 0 - ], - "KeyZ": [ - "z", - "Z", - "", - "", - 0 - ], - "Digit1": [ - "1", - "!", - "", - "", - 0 - ], - "Digit2": [ - "2", - "@", - "", - "", - 0 - ], - "Digit3": [ - "3", - "#", - "", - "", - 0 - ], - "Digit4": [ - "4", - "$", - "", - "", - 0 - ], - "Digit5": [ - "5", - "%", - "", - "", - 0 - ], - "Digit6": [ - "6", - "^", - "", - "", - 0 - ], - "Digit7": [ - "7", - "&", - "", - "", - 0 - ], - "Digit8": [ - "8", - "*", - "", - "", - 0 - ], - "Digit9": [ - "9", - "(", - "", - "", - 0 - ], - "Digit0": [ - "0", - ")", - "", - "", - 0 - ], - "Minus": [ - "-", - "_", - "", - "", - 0 - ], - "Equal": [ - "=", - "+", - "", - "", - 0 - ], - "BracketLeft": [ - "[", - "{", - "", - "", - 0 - ], - "BracketRight": [ - "]", - "}", - "", - "", - 0 - ], - "Backslash": [ - "\\", - "|", - "", - "", - 0 - ], - "Semicolon": [ - ";", - ":", - "", - "", - 0 - ], - "Quote": [ - "'", - "\"", - "", - "", - 0 - ], - "Backquote": [ - "`", - "~", - "", - "", - 0 - ], - "Comma": [ - ",", - "<", - "", - "", - 0 - ], - "Period": [ - ".", - ">", - "", - "", - 0 - ], - "Slash": [ - "/", - "?", - "", - "", - 0 - ] - } - }, - { - "language": "en", - "platform": "linux", - "entries": { - "KeyA": [ - "a", - "A", - "a", - "A", - 0 - ], - "KeyB": [ - "b", - "B", - "b", - "B", - 0 - ], - "KeyC": [ - "c", - "C", - "c", - "C", - 0 - ], - "KeyD": [ - "d", - "D", - "d", - "D", - 0 - ], - "KeyE": [ - "e", - "E", - "e", - "E", - 0 - ], - "KeyF": [ - "f", - "F", - "f", - "F", - 0 - ], - "KeyG": [ - "g", - "G", - "g", - "G", - 0 - ], - "KeyH": [ - "h", - "H", - "h", - "H", - 0 - ], - "KeyI": [ - "i", - "I", - "i", - "I", - 0 - ], - "KeyJ": [ - "j", - "J", - "j", - "J", - 0 - ], - "KeyK": [ - "k", - "K", - "k", - "K", - 0 - ], - "KeyL": [ - "l", - "L", - "l", - "L", - 0 - ], - "KeyM": [ - "m", - "M", - "m", - "M", - 0 - ], - "KeyN": [ - "n", - "N", - "n", - "N", - 0 - ], - "KeyO": [ - "o", - "O", - "o", - "O", - 0 - ], - "KeyP": [ - "p", - "P", - "p", - "P", - 0 - ], - "KeyQ": [ - "q", - "Q", - "q", - "Q", - 0 - ], - "KeyR": [ - "r", - "R", - "r", - "R", - 0 - ], - "KeyS": [ - "s", - "S", - "s", - "S", - 0 - ], - "KeyT": [ - "t", - "T", - "t", - "T", - 0 - ], - "KeyU": [ - "u", - "U", - "u", - "U", - 0 - ], - "KeyV": [ - "v", - "V", - "v", - "V", - 0 - ], - "KeyW": [ - "w", - "W", - "w", - "W", - 0 - ], - "KeyX": [ - "x", - "X", - "x", - "X", - 0 - ], - "KeyY": [ - "y", - "Y", - "y", - "Y", - 0 - ], - "KeyZ": [ - "z", - "Z", - "z", - "Z", - 0 - ], - "Digit1": [ - "1", - "!", - "1", - "!", - 0 - ], - "Digit2": [ - "2", - "@", - "2", - "@", - 0 - ], - "Digit3": [ - "3", - "#", - "3", - "#", - 0 - ], - "Digit4": [ - "4", - "$", - "4", - "$", - 0 - ], - "Digit5": [ - "5", - "%", - "5", - "%", - 0 - ], - "Digit6": [ - "6", - "^", - "6", - "^", - 0 - ], - "Digit7": [ - "7", - "&", - "7", - "&", - 0 - ], - "Digit8": [ - "8", - "*", - "8", - "*", - 0 - ], - "Digit9": [ - "9", - "(", - "9", - "(", - 0 - ], - "Digit0": [ - "0", - ")", - "0", - ")", - 0 - ], - "Minus": [ - "-", - "_", - "-", - "_", - 0 - ], - "Equal": [ - "=", - "+", - "=", - "+", - 0 - ], - "BracketLeft": [ - "[", - "{", - "[", - "{", - 0 - ], - "BracketRight": [ - "]", - "}", - "]", - "}", - 0 - ], - "Backslash": [ - "\\", - "|", - "\\", - "|", - 0 - ], - "Semicolon": [ - ";", - ":", - ";", - ":", - 0 - ], - "Quote": [ - "'", - "\"", - "'", - "\"", - 0 - ], - "Backquote": [ - "`", - "~", - "`", - "~", - 0 - ], - "Comma": [ - ",", - "<", - ",", - "<", - 0 - ], - "Period": [ - ".", - ">", - ".", - ">", - 0 - ], - "Slash": [ - "/", - "?", - "/", - "?", - 0 - ] - } - }, - { - "language": "en", - "platform": "darwin", - "entries": { - "KeyA": [ - "a", - "A", - "å", - "Å", - 0 - ], - "KeyB": [ - "b", - "B", - "∫", - "ı", - 0 - ], - "KeyC": [ - "c", - "C", - "ç", - "Ç", - 0 - ], - "KeyD": [ - "d", - "D", - "∂", - "Î", - 0 - ], - "KeyE": [ - "e", - "E", - "´", - "´", - 4 - ], - "KeyF": [ - "f", - "F", - "ƒ", - "Ï", - 0 - ], - "KeyG": [ - "g", - "G", - "©", - "˝", - 0 - ], - "KeyH": [ - "h", - "H", - "˙", - "Ó", - 0 - ], - "KeyI": [ - "i", - "I", - "ˆ", - "ˆ", - 4 - ], - "KeyJ": [ - "j", - "J", - "∆", - "Ô", - 0 - ], - "KeyK": [ - "k", - "K", - "˚", - "", - 0 - ], - "KeyL": [ - "l", - "L", - "¬", - "Ò", - 0 - ], - "KeyM": [ - "m", - "M", - "µ", - "Â", - 0 - ], - "KeyN": [ - "n", - "N", - "˜", - "˜", - 4 - ], - "KeyO": [ - "o", - "O", - "ø", - "Ø", - 0 - ], - "KeyP": [ - "p", - "P", - "π", - "∏", - 0 - ], - "KeyQ": [ - "q", - "Q", - "œ", - "Œ", - 0 - ], - "KeyR": [ - "r", - "R", - "®", - "‰", - 0 - ], - "KeyS": [ - "s", - "S", - "ß", - "Í", - 0 - ], - "KeyT": [ - "t", - "T", - "†", - "ˇ", - 0 - ], - "KeyU": [ - "u", - "U", - "¨", - "¨", - 4 - ], - "KeyV": [ - "v", - "V", - "√", - "◊", - 0 - ], - "KeyW": [ - "w", - "W", - "∑", - "„", - 0 - ], - "KeyX": [ - "x", - "X", - "≈", - "˛", - 0 - ], - "KeyY": [ - "y", - "Y", - "¥", - "Á", - 0 - ], - "KeyZ": [ - "z", - "Z", - "Ω", - "¸", - 0 - ], - "Digit1": [ - "1", - "!", - "¡", - "⁄", - 0 - ], - "Digit2": [ - "2", - "@", - "™", - "€", - 0 - ], - "Digit3": [ - "3", - "#", - "£", - "‹", - 0 - ], - "Digit4": [ - "4", - "$", - "¢", - "›", - 0 - ], - "Digit5": [ - "5", - "%", - "∞", - "fi", - 0 - ], - "Digit6": [ - "6", - "^", - "§", - "fl", - 0 - ], - "Digit7": [ - "7", - "&", - "¶", - "‡", - 0 - ], - "Digit8": [ - "8", - "*", - "•", - "°", - 0 - ], - "Digit9": [ - "9", - "(", - "ª", - "·", - 0 - ], - "Digit0": [ - "0", - ")", - "º", - "‚", - 0 - ], - "Minus": [ - "-", - "_", - "–", - "—", - 0 - ], - "Equal": [ - "=", - "+", - "≠", - "±", - 0 - ], - "BracketLeft": [ - "[", - "{", - "“", - "”", - 0 - ], - "BracketRight": [ - "]", - "}", - "‘", - "’", - 0 - ], - "Backslash": [ - "\\", - "|", - "«", - "»", - 0 - ], - "Semicolon": [ - ";", - ":", - "…", - "Ú", - 0 - ], - "Quote": [ - "'", - "\"", - "æ", - "Æ", - 0 - ], - "Backquote": [ - "`", - "~", - "`", - "`", - 4 - ], - "Comma": [ - ",", - "<", - "≤", - "¯", - 0 - ], - "Period": [ - ".", - ">", - "≥", - "˘", - 0 - ], - "Slash": [ - "/", - "?", - "÷", - "¿", - 0 - ] - } - }, - { - "language": "en-belgian", - "platform": "win", - "entries": { - "KeyA": [ - "q", - "Q", - "", - "", - 0 - ], - "KeyB": [ - "b", - "B", - "", - "", - 0 - ], - "KeyC": [ - "c", - "C", - "", - "", - 0 - ], - "KeyD": [ - "d", - "D", - "", - "", - 0 - ], - "KeyE": [ - "e", - "E", - "€", - "", - 0 - ], - "KeyF": [ - "f", - "F", - "", - "", - 0 - ], - "KeyG": [ - "g", - "G", - "", - "", - 0 - ], - "KeyH": [ - "h", - "H", - "", - "", - 0 - ], - "KeyI": [ - "i", - "I", - "", - "", - 0 - ], - "KeyJ": [ - "j", - "J", - "", - "", - 0 - ], - "KeyK": [ - "k", - "K", - "", - "", - 0 - ], - "KeyL": [ - "l", - "L", - "", - "", - 0 - ], - "KeyM": [ - ",", - "?", - "", - "", - 0 - ], - "KeyN": [ - "n", - "N", - "", - "", - 0 - ], - "KeyO": [ - "o", - "O", - "", - "", - 0 - ], - "KeyP": [ - "p", - "P", - "", - "", - 0 - ], - "KeyQ": [ - "a", - "A", - "", - "", - 0 - ], - "KeyR": [ - "r", - "R", - "", - "", - 0 - ], - "KeyS": [ - "s", - "S", - "", - "", - 0 - ], - "KeyT": [ - "t", - "T", - "", - "", - 0 - ], - "KeyU": [ - "u", - "U", - "", - "", - 0 - ], - "KeyV": [ - "v", - "V", - "", - "", - 0 - ], - "KeyW": [ - "z", - "Z", - "", - "", - 0 - ], - "KeyX": [ - "x", - "X", - "", - "", - 0 - ], - "KeyY": [ - "y", - "Y", - "", - "", - 0 - ], - "KeyZ": [ - "w", - "W", - "", - "", - 0 - ], - "Digit1": [ - "&", - "1", - "|", - "", - 0 - ], - "Digit2": [ - "é", - "2", - "@", - "", - 0 - ], - "Digit3": [ - "\"", - "3", - "#", - "", - 0 - ], - "Digit4": [ - "'", - "4", - "{", - "", - 0 - ], - "Digit5": [ - "(", - "5", - "[", - "", - 0 - ], - "Digit6": [ - "§", - "6", - "^", - "", - 0 - ], - "Digit7": [ - "è", - "7", - "", - "", - 0 - ], - "Digit8": [ - "!", - "8", - "", - "", - 0 - ], - "Digit9": [ - "ç", - "9", - "{", - "", - 0 - ], - "Digit0": [ - "à", - "0", - "}", - "", - 0 - ], - "Minus": [ - ")", - "°", - "", - "", - 0 - ], - "Equal": [ - "-", - "_", - "", - "", - 0 - ], - "BracketLeft": [ - "^", - "¨", - "[", - "", - 0 - ], - "BracketRight": [ - "$", - "*", - "]", - "", - 0 - ], - "Backslash": [ - "µ", - "£", - "`", - "`", - 0 - ], - "Semicolon": [ - "m", - "M", - "", - "", - 0 - ], - "Quote": [ - "ù", - "%", - "´", - "´", - 0 - ], - "Backquote": [ - "²", - "³", - "", - "", - 0 - ], - "Comma": [ - ";", - ".", - "", - "", - 0 - ], - "Period": [ - ":", - "/", - "", - "", - 0 - ], - "Slash": [ - "=", - "+", - "~", - "~", - 0 - ] - } - }, - { - "language": "en-ext", - "platform": "darwin", - "entries": { - "KeyA": [ - "a", - "A", - "¯", - "̄", - 4 - ], - "KeyB": [ - "b", - "B", - "˘", - "̆", - 4 - ], - "KeyC": [ - "c", - "C", - "¸", - "̧", - 4 - ], - "KeyD": [ - "d", - "D", - "ð", - "Ð", - 0 - ], - "KeyE": [ - "e", - "E", - "´", - "́", - 4 - ], - "KeyF": [ - "f", - "F", - "ƒ", - "", - 0 - ], - "KeyG": [ - "g", - "G", - "©", - "‸", - 8 - ], - "KeyH": [ - "h", - "H", - "ˍ", - "̱", - 4 - ], - "KeyI": [ - "i", - "I", - "ʼ", - "̛", - 4 - ], - "KeyJ": [ - "j", - "J", - "˝", - "̋", - 4 - ], - "KeyK": [ - "k", - "K", - "˚", - "̊", - 4 - ], - "KeyL": [ - "l", - "L", - "-", - "̵", - 4 - ], - "KeyM": [ - "m", - "M", - "˛", - "̨", - 4 - ], - "KeyN": [ - "n", - "N", - "˜", - "̃", - 4 - ], - "KeyO": [ - "o", - "O", - "ø", - "Ø", - 0 - ], - "KeyP": [ - "p", - "P", - ",", - "̦", - 4 - ], - "KeyQ": [ - "q", - "Q", - "œ", - "Œ", - 0 - ], - "KeyR": [ - "r", - "R", - "®", - "‰", - 0 - ], - "KeyS": [ - "s", - "S", - "ß", - "", - 0 - ], - "KeyT": [ - "t", - "T", - "þ", - "Þ", - 0 - ], - "KeyU": [ - "u", - "U", - "¨", - "̈", - 4 - ], - "KeyV": [ - "v", - "V", - "ˇ", - "̌", - 4 - ], - "KeyW": [ - "w", - "W", - "˙", - "̇", - 4 - ], - "KeyX": [ - "x", - "X", - ".", - "̣", - 4 - ], - "KeyY": [ - "y", - "Y", - "¥", - "", - 0 - ], - "KeyZ": [ - "z", - "Z", - "ˀ", - "̉", - 4 - ], - "Digit1": [ - "1", - "!", - "¡", - "⁄", - 0 - ], - "Digit2": [ - "2", - "@", - "™", - "€", - 0 - ], - "Digit3": [ - "3", - "#", - "£", - "‹", - 0 - ], - "Digit4": [ - "4", - "$", - "¢", - "›", - 0 - ], - "Digit5": [ - "5", - "%", - "§", - "†", - 0 - ], - "Digit6": [ - "6", - "^", - "ˆ", - "̂", - 4 - ], - "Digit7": [ - "7", - "&", - "¶", - "‡", - 0 - ], - "Digit8": [ - "8", - "*", - "•", - "°", - 0 - ], - "Digit9": [ - "9", - "(", - "ª", - "·", - 0 - ], - "Digit0": [ - "0", - ")", - "º", - "‚", - 0 - ], - "Minus": [ - "-", - "_", - "–", - "—", - 0 - ], - "Equal": [ - "=", - "+", - "≠", - "±", - 0 - ], - "BracketLeft": [ - "[", - "{", - "“", - "”", - 0 - ], - "BracketRight": [ - "]", - "}", - "‘", - "’", - 0 - ], - "Backslash": [ - "\\", - "|", - "«", - "»", - 0 - ], - "Semicolon": [ - ";", - ":", - "…", - "№", - 8 - ], - "Quote": [ - "'", - "\"", - "æ", - "Æ", - 0 - ], - "Backquote": [ - "`", - "~", - "`", - "̀", - 4 - ], - "Comma": [ - ",", - "<", - "≤", - "„", - 0 - ], - "Period": [ - ".", - ">", - "≥", - "ʔ", - 8 - ], - "Slash": [ - "/", - "?", - "÷", - "¿", - 0 - ] - } - }, - { - "language": "en-in", - "platform": "win", - "entries": { - "KeyA": [ - "a", - "A", - "ā", - "Ā", - 0 - ], - "KeyB": [ - "b", - "B", - "", - "", - 0 - ], - "KeyC": [ - "c", - "C", - "", - "", - 0 - ], - "KeyD": [ - "d", - "D", - "ḍ", - "Ḍ", - 0 - ], - "KeyE": [ - "e", - "E", - "ē", - "Ē", - 0 - ], - "KeyF": [ - "f", - "F", - "", - "", - 0 - ], - "KeyG": [ - "g", - "G", - "ṅ", - "Ṅ", - 0 - ], - "KeyH": [ - "h", - "H", - "ḥ", - "Ḥ", - 0 - ], - "KeyI": [ - "i", - "I", - "ī", - "Ī", - 0 - ], - "KeyJ": [ - "j", - "J", - "", - "", - 0 - ], - "KeyK": [ - "k", - "K", - "", - "", - 0 - ], - "KeyL": [ - "l", - "L", - "l̥", - "L̥", - 0 - ], - "KeyM": [ - "m", - "M", - "ṁ", - "Ṁ", - 0 - ], - "KeyN": [ - "n", - "N", - "ṇ", - "Ṇ", - 0 - ], - "KeyO": [ - "o", - "O", - "ō", - "Ō", - 0 - ], - "KeyP": [ - "p", - "P", - "", - "", - 0 - ], - "KeyQ": [ - "q", - "Q", - "æ", - "Æ", - 0 - ], - "KeyR": [ - "r", - "R", - "r̥", - "R̥", - 0 - ], - "KeyS": [ - "s", - "S", - "ś", - "Ś", - 0 - ], - "KeyT": [ - "t", - "T", - "ṭ", - "Ṭ", - 0 - ], - "KeyU": [ - "u", - "U", - "ū", - "Ū", - 0 - ], - "KeyV": [ - "v", - "V", - "", - "", - 0 - ], - "KeyW": [ - "w", - "W", - "", - "", - 0 - ], - "KeyX": [ - "x", - "X", - "ṣ", - "Ṣ", - 0 - ], - "KeyY": [ - "y", - "Y", - "ñ", - "Ñ", - 0 - ], - "KeyZ": [ - "z", - "Z", - "", - "", - 0 - ], - "Digit1": [ - "1", - "!", - "", - "", - 0 - ], - "Digit2": [ - "2", - "@", - "", - "", - 0 - ], - "Digit3": [ - "3", - "#", - "", - "", - 0 - ], - "Digit4": [ - "4", - "$", - "₹", - "", - 0 - ], - "Digit5": [ - "5", - "%", - "", - "", - 0 - ], - "Digit6": [ - "6", - "^", - "", - "ˆ", - 0 - ], - "Digit7": [ - "7", - "&", - "", - "", - 0 - ], - "Digit8": [ - "8", - "*", - "", - "", - 0 - ], - "Digit9": [ - "9", - "(", - "", - "˘", - 0 - ], - "Digit0": [ - "0", - ")", - "", - "", - 0 - ], - "Minus": [ - "-", - "_", - "-", - "ˍ", - 0 - ], - "Equal": [ - "=", - "+", - "", - "", - 0 - ], - "BracketLeft": [ - "[", - "{", - "", - "", - 0 - ], - "BracketRight": [ - "]", - "}", - "", - "", - 0 - ], - "Backslash": [ - "\\", - "|", - "", - "", - 0 - ], - "Semicolon": [ - ";", - ":", - "", - "", - 0 - ], - "Quote": [ - "'", - "\"", - "", - "", - 0 - ], - "Backquote": [ - "`", - "~", - "", - "~", - 0 - ], - "Comma": [ - ",", - "<", - ",", - "<", - 0 - ], - "Period": [ - ".", - ">", - ".", - "", - 0 - ], - "Slash": [ - "/", - "?", - "", - "", - 0 - ] - } - }, - { - "language": "en-intl", - "platform": "win", - "entries": { - "KeyA": [ - "a", - "A", - "á", - "Á", - 0 - ], - "KeyB": [ - "b", - "B", - "", - "", - 0 - ], - "KeyC": [ - "c", - "C", - "©", - "¢", - 0 - ], - "KeyD": [ - "d", - "D", - "ð", - "Ð", - 0 - ], - "KeyE": [ - "e", - "E", - "é", - "É", - 0 - ], - "KeyF": [ - "f", - "F", - "", - "", - 0 - ], - "KeyG": [ - "g", - "G", - "", - "", - 0 - ], - "KeyH": [ - "h", - "H", - "", - "", - 0 - ], - "KeyI": [ - "i", - "I", - "í", - "Í", - 0 - ], - "KeyJ": [ - "j", - "J", - "", - "", - 0 - ], - "KeyK": [ - "k", - "K", - "", - "", - 0 - ], - "KeyL": [ - "l", - "L", - "ø", - "Ø", - 0 - ], - "KeyM": [ - "m", - "M", - "µ", - "", - 0 - ], - "KeyN": [ - "n", - "N", - "ñ", - "Ñ", - 0 - ], - "KeyO": [ - "o", - "O", - "ó", - "Ó", - 0 - ], - "KeyP": [ - "p", - "P", - "ö", - "Ö", - 0 - ], - "KeyQ": [ - "q", - "Q", - "ä", - "Ä", - 0 - ], - "KeyR": [ - "r", - "R", - "®", - "", - 0 - ], - "KeyS": [ - "s", - "S", - "ß", - "§", - 0 - ], - "KeyT": [ - "t", - "T", - "þ", - "Þ", - 0 - ], - "KeyU": [ - "u", - "U", - "ú", - "Ú", - 0 - ], - "KeyV": [ - "v", - "V", - "", - "", - 0 - ], - "KeyW": [ - "w", - "W", - "å", - "Å", - 0 - ], - "KeyX": [ - "x", - "X", - "", - "", - 0 - ], - "KeyY": [ - "y", - "Y", - "ü", - "Ü", - 0 - ], - "KeyZ": [ - "z", - "Z", - "æ", - "Æ", - 0 - ], - "Digit1": [ - "1", - "!", - "¡", - "¹", - 0 - ], - "Digit2": [ - "2", - "@", - "²", - "", - 0 - ], - "Digit3": [ - "3", - "#", - "³", - "", - 0 - ], - "Digit4": [ - "4", - "$", - "¤", - "£", - 0 - ], - "Digit5": [ - "5", - "%", - "€", - "", - 0 - ], - "Digit6": [ - "6", - "^", - "¼", - "", - 0 - ], - "Digit7": [ - "7", - "&", - "½", - "", - 0 - ], - "Digit8": [ - "8", - "*", - "¾", - "", - 0 - ], - "Digit9": [ - "9", - "(", - "‘", - "", - 0 - ], - "Digit0": [ - "0", - ")", - "’", - "", - 0 - ], - "Minus": [ - "-", - "_", - "¥", - "", - 0 - ], - "Equal": [ - "=", - "+", - "×", - "÷", - 0 - ], - "BracketLeft": [ - "[", - "{", - "«", - "", - 0 - ], - "BracketRight": [ - "]", - "}", - "»", - "", - 0 - ], - "Backslash": [ - "\\", - "|", - "¬", - "¦", - 0 - ], - "Semicolon": [ - ";", - ":", - "¶", - "°", - 0 - ], - "Quote": [ - "'", - "\"", - "´", - "¨", - 0 - ], - "Backquote": [ - "`", - "~", - "", - "", - 0 - ], - "Comma": [ - ",", - "<", - "ç", - "Ç", - 0 - ], - "Period": [ - ".", - ">", - "", - "", - 0 - ], - "Slash": [ - "/", - "?", - "¿", - "", - 0 - ] - } - }, - { - "language": "en-intl", - "platform": "darwin", - "entries": { - "KeyA": [ - "a", - "A", - "å", - "Å", - 0 - ], - "KeyB": [ - "b", - "B", - "∫", - "ı", - 0 - ], - "KeyC": [ - "c", - "C", - "ç", - "Ç", - 0 - ], - "KeyD": [ - "d", - "D", - "∂", - "Î", - 0 - ], - "KeyE": [ - "e", - "E", - "´", - "´", - 4 - ], - "KeyF": [ - "f", - "F", - "ƒ", - "Ï", - 0 - ], - "KeyG": [ - "g", - "G", - "©", - "˝", - 0 - ], - "KeyH": [ - "h", - "H", - "˙", - "Ó", - 0 - ], - "KeyI": [ - "i", - "I", - "ˆ", - "ˆ", - 4 - ], - "KeyJ": [ - "j", - "J", - "∆", - "Ô", - 0 - ], - "KeyK": [ - "k", - "K", - "˚", - "", - 0 - ], - "KeyL": [ - "l", - "L", - "¬", - "Ò", - 0 - ], - "KeyM": [ - "m", - "M", - "µ", - "Â", - 0 - ], - "KeyN": [ - "n", - "N", - "˜", - "˜", - 4 - ], - "KeyO": [ - "o", - "O", - "ø", - "Ø", - 0 - ], - "KeyP": [ - "p", - "P", - "π", - "∏", - 0 - ], - "KeyQ": [ - "q", - "Q", - "œ", - "Œ", - 0 - ], - "KeyR": [ - "r", - "R", - "®", - "‰", - 0 - ], - "KeyS": [ - "s", - "S", - "ß", - "Í", - 0 - ], - "KeyT": [ - "t", - "T", - "†", - "ˇ", - 0 - ], - "KeyU": [ - "u", - "U", - "¨", - "¨", - 4 - ], - "KeyV": [ - "v", - "V", - "√", - "◊", - 0 - ], - "KeyW": [ - "w", - "W", - "∑", - "„", - 0 - ], - "KeyX": [ - "x", - "X", - "≈", - "˛", - 0 - ], - "KeyY": [ - "y", - "Y", - "¥", - "Á", - 0 - ], - "KeyZ": [ - "z", - "Z", - "Ω", - "¸", - 0 - ], - "Digit1": [ - "1", - "!", - "¡", - "⁄", - 0 - ], - "Digit2": [ - "2", - "@", - "™", - "€", - 0 - ], - "Digit3": [ - "3", - "#", - "£", - "‹", - 0 - ], - "Digit4": [ - "4", - "$", - "¢", - "›", - 0 - ], - "Digit5": [ - "5", - "%", - "∞", - "fi", - 0 - ], - "Digit6": [ - "6", - "ˆ", - "§", - "fl", - 2 - ], - "Digit7": [ - "7", - "&", - "¶", - "‡", - 0 - ], - "Digit8": [ - "8", - "*", - "•", - "°", - 0 - ], - "Digit9": [ - "9", - "(", - "ª", - "·", - 0 - ], - "Digit0": [ - "0", - ")", - "º", - "‚", - 0 - ], - "Minus": [ - "-", - "_", - "–", - "—", - 0 - ], - "Equal": [ - "=", - "+", - "≠", - "±", - 0 - ], - "BracketLeft": [ - "[", - "{", - "“", - "”", - 0 - ], - "BracketRight": [ - "]", - "}", - "‘", - "’", - 0 - ], - "Backslash": [ - "\\", - "|", - "«", - "»", - 0 - ], - "Semicolon": [ - ";", - ":", - "…", - "Ú", - 0 - ], - "Quote": [ - "'", - "\"", - "æ", - "Æ", - 3 - ], - "Backquote": [ - "`", - "˜", - "`", - "`", - 7 - ], - "Comma": [ - ",", - "<", - "≤", - "¯", - 0 - ], - "Period": [ - ".", - ">", - "≥", - "˘", - 0 - ], - "Slash": [ - "/", - "?", - "÷", - "¿", - 0 - ] - } - }, - { - "language": "en-uk", - "platform": "win", - "entries": { - "KeyA": [ - "a", - "A", - "á", - "Á", - 0 - ], - "KeyB": [ - "b", - "B", - "", - "", - 0 - ], - "KeyC": [ - "c", - "C", - "", - "", - 0 - ], - "KeyD": [ - "d", - "D", - "", - "", - 0 - ], - "KeyE": [ - "e", - "E", - "é", - "É", - 0 - ], - "KeyF": [ - "f", - "F", - "", - "", - 0 - ], - "KeyG": [ - "g", - "G", - "", - "", - 0 - ], - "KeyH": [ - "h", - "H", - "", - "", - 0 - ], - "KeyI": [ - "i", - "I", - "í", - "Í", - 0 - ], - "KeyJ": [ - "j", - "J", - "", - "", - 0 - ], - "KeyK": [ - "k", - "K", - "", - "", - 0 - ], - "KeyL": [ - "l", - "L", - "", - "", - 0 - ], - "KeyM": [ - "m", - "M", - "", - "", - 0 - ], - "KeyN": [ - "n", - "N", - "", - "", - 0 - ], - "KeyO": [ - "o", - "O", - "ó", - "Ó", - 0 - ], - "KeyP": [ - "p", - "P", - "", - "", - 0 - ], - "KeyQ": [ - "q", - "Q", - "", - "", - 0 - ], - "KeyR": [ - "r", - "R", - "", - "", - 0 - ], - "KeyS": [ - "s", - "S", - "", - "", - 0 - ], - "KeyT": [ - "t", - "T", - "", - "", - 0 - ], - "KeyU": [ - "u", - "U", - "ú", - "Ú", - 0 - ], - "KeyV": [ - "v", - "V", - "", - "", - 0 - ], - "KeyW": [ - "w", - "W", - "", - "", - 0 - ], - "KeyX": [ - "x", - "X", - "", - "", - 0 - ], - "KeyY": [ - "y", - "Y", - "", - "", - 0 - ], - "KeyZ": [ - "z", - "Z", - "", - "", - 0 - ], - "Digit1": [ - "1", - "!", - "", - "", - 0 - ], - "Digit2": [ - "2", - "\"", - "", - "", - 0 - ], - "Digit3": [ - "3", - "£", - "", - "", - 0 - ], - "Digit4": [ - "4", - "$", - "€", - "", - 0 - ], - "Digit5": [ - "5", - "%", - "", - "", - 0 - ], - "Digit6": [ - "6", - "^", - "", - "", - 0 - ], - "Digit7": [ - "7", - "&", - "", - "", - 0 - ], - "Digit8": [ - "8", - "*", - "", - "", - 0 - ], - "Digit9": [ - "9", - "(", - "", - "", - 0 - ], - "Digit0": [ - "0", - ")", - "", - "", - 0 - ], - "Minus": [ - "-", - "_", - "", - "", - 0 - ], - "Equal": [ - "=", - "+", - "", - "", - 0 - ], - "BracketLeft": [ - "[", - "{", - "", - "", - 0 - ], - "BracketRight": [ - "]", - "}", - "", - "", - 0 - ], - "Backslash": [ - "#", - "~", - "\\", - "|", - 0 - ], - "Semicolon": [ - ";", - ":", - "", - "", - 0 - ], - "Quote": [ - "'", - "@", - "", - "", - 0 - ], - "Backquote": [ - "`", - "¬", - "¦", - "", - 0 - ], - "Comma": [ - ",", - "<", - "", - "", - 0 - ], - "Period": [ - ".", - ">", - "", - "", - 0 - ], - "Slash": [ - "/", - "?", - "", - "", - 0 - ] - } - }, - { - "language": "en-uk", - "platform": "darwin", - "entries": { - "KeyA": [ - "a", - "A", - "å", - "Å", - 0 - ], - "KeyB": [ - "b", - "B", - "∫", - "ı", - 0 - ], - "KeyC": [ - "c", - "C", - "ç", - "Ç", - 0 - ], - "KeyD": [ - "d", - "D", - "∂", - "Î", - 0 - ], - "KeyE": [ - "e", - "E", - "´", - "‰", - 4 - ], - "KeyF": [ - "f", - "F", - "ƒ", - "Ï", - 0 - ], - "KeyG": [ - "g", - "G", - "©", - "Ì", - 0 - ], - "KeyH": [ - "h", - "H", - "˙", - "Ó", - 0 - ], - "KeyI": [ - "i", - "I", - "^", - "È", - 4 - ], - "KeyJ": [ - "j", - "J", - "∆", - "Ô", - 0 - ], - "KeyK": [ - "k", - "K", - "˚", - "", - 0 - ], - "KeyL": [ - "l", - "L", - "¬", - "Ò", - 0 - ], - "KeyM": [ - "m", - "M", - "µ", - "˜", - 0 - ], - "KeyN": [ - "n", - "N", - "~", - "ˆ", - 4 - ], - "KeyO": [ - "o", - "O", - "ø", - "Ø", - 0 - ], - "KeyP": [ - "p", - "P", - "π", - "∏", - 0 - ], - "KeyQ": [ - "q", - "Q", - "œ", - "Œ", - 0 - ], - "KeyR": [ - "r", - "R", - "®", - "Â", - 0 - ], - "KeyS": [ - "s", - "S", - "ß", - "Í", - 0 - ], - "KeyT": [ - "t", - "T", - "†", - "Ê", - 0 - ], - "KeyU": [ - "u", - "U", - "¨", - "Ë", - 4 - ], - "KeyV": [ - "v", - "V", - "√", - "◊", - 0 - ], - "KeyW": [ - "w", - "W", - "∑", - "„", - 0 - ], - "KeyX": [ - "x", - "X", - "≈", - "Ù", - 0 - ], - "KeyY": [ - "y", - "Y", - "¥", - "Á", - 0 - ], - "KeyZ": [ - "z", - "Z", - "Ω", - "Û", - 0 - ], - "Digit1": [ - "1", - "!", - "¡", - "⁄", - 0 - ], - "Digit2": [ - "2", - "@", - "€", - "™", - 0 - ], - "Digit3": [ - "3", - "£", - "#", - "‹", - 0 - ], - "Digit4": [ - "4", - "$", - "¢", - "›", - 0 - ], - "Digit5": [ - "5", - "%", - "∞", - "fi", - 0 - ], - "Digit6": [ - "6", - "^", - "§", - "fl", - 0 - ], - "Digit7": [ - "7", - "&", - "¶", - "‡", - 0 - ], - "Digit8": [ - "8", - "*", - "•", - "°", - 0 - ], - "Digit9": [ - "9", - "(", - "ª", - "·", - 0 - ], - "Digit0": [ - "0", - ")", - "º", - "‚", - 0 - ], - "Minus": [ - "-", - "_", - "–", - "—", - 0 - ], - "Equal": [ - "=", - "+", - "≠", - "±", - 0 - ], - "BracketLeft": [ - "[", - "{", - "“", - "”", - 0 - ], - "BracketRight": [ - "]", - "}", - "‘", - "’", - 0 - ], - "Backslash": [ - "\\", - "|", - "«", - "»", - 0 - ], - "Semicolon": [ - ";", - ":", - "…", - "Ú", - 0 - ], - "Quote": [ - "'", - "\"", - "æ", - "Æ", - 0 - ], - "Backquote": [ - "`", - "~", - "`", - "Ÿ", - 4 - ], - "Comma": [ - ",", - "<", - "≤", - "¯", - 0 - ], - "Period": [ - ".", - ">", - "≥", - "˘", - 0 - ], - "Slash": [ - "/", - "?", - "÷", - "¿", - 0 - ] - } - }, - { - "language": "es", - "platform": "win", - "entries": { - "KeyA": [ - "a", - "A", - "", - "", - 0 - ], - "KeyB": [ - "b", - "B", - "", - "", - 0 - ], - "KeyC": [ - "c", - "C", - "", - "", - 0 - ], - "KeyD": [ - "d", - "D", - "", - "", - 0 - ], - "KeyE": [ - "e", - "E", - "€", - "", - 0 - ], - "KeyF": [ - "f", - "F", - "", - "", - 0 - ], - "KeyG": [ - "g", - "G", - "", - "", - 0 - ], - "KeyH": [ - "h", - "H", - "", - "", - 0 - ], - "KeyI": [ - "i", - "I", - "", - "", - 0 - ], - "KeyJ": [ - "j", - "J", - "", - "", - 0 - ], - "KeyK": [ - "k", - "K", - "", - "", - 0 - ], - "KeyL": [ - "l", - "L", - "", - "", - 0 - ], - "KeyM": [ - "m", - "M", - "", - "", - 0 - ], - "KeyN": [ - "n", - "N", - "", - "", - 0 - ], - "KeyO": [ - "o", - "O", - "", - "", - 0 - ], - "KeyP": [ - "p", - "P", - "", - "", - 0 - ], - "KeyQ": [ - "q", - "Q", - "", - "", - 0 - ], - "KeyR": [ - "r", - "R", - "", - "", - 0 - ], - "KeyS": [ - "s", - "S", - "", - "", - 0 - ], - "KeyT": [ - "t", - "T", - "", - "", - 0 - ], - "KeyU": [ - "u", - "U", - "", - "", - 0 - ], - "KeyV": [ - "v", - "V", - "", - "", - 0 - ], - "KeyW": [ - "w", - "W", - "", - "", - 0 - ], - "KeyX": [ - "x", - "X", - "", - "", - 0 - ], - "KeyY": [ - "y", - "Y", - "", - "", - 0 - ], - "KeyZ": [ - "z", - "Z", - "", - "", - 0 - ], - "Digit1": [ - "1", - "!", - "|", - "", - 0 - ], - "Digit2": [ - "2", - "\"", - "@", - "", - 0 - ], - "Digit3": [ - "3", - "·", - "#", - "", - 0 - ], - "Digit4": [ - "4", - "$", - "~", - "", - 0 - ], - "Digit5": [ - "5", - "%", - "€", - "", - 0 - ], - "Digit6": [ - "6", - "&", - "¬", - "", - 0 - ], - "Digit7": [ - "7", - "/", - "", - "", - 0 - ], - "Digit8": [ - "8", - "(", - "", - "", - 0 - ], - "Digit9": [ - "9", - ")", - "", - "", - 0 - ], - "Digit0": [ - "0", - "=", - "", - "", - 0 - ], - "Minus": [ - "'", - "?", - "", - "", - 0 - ], - "Equal": [ - "¡", - "¿", - "", - "", - 0 - ], - "BracketLeft": [ - "`", - "^", - "[", - "", - 0 - ], - "BracketRight": [ - "+", - "*", - "]", - "", - 0 - ], - "Backslash": [ - "ç", - "Ç", - "}", - "", - 0 - ], - "Semicolon": [ - "ñ", - "Ñ", - "", - "", - 0 - ], - "Quote": [ - "´", - "¨", - "{", - "", - 0 - ], - "Backquote": [ - "º", - "ª", - "\\", - "", - 0 - ], - "Comma": [ - ",", - ";", - "", - "", - 0 - ], - "Period": [ - ".", - ":", - "", - "", - 0 - ], - "Slash": [ - "-", - "_", - "", - "", - 0 - ] - } - }, - { - "language": "es", - "platform": "linux", - "entries": { - "KeyA": [ - "a", - "A", - "æ", - "Æ", - 0 - ], - "KeyB": [ - "b", - "B", - "”", - "’", - 0 - ], - "KeyC": [ - "c", - "C", - "¢", - "©", - 0 - ], - "KeyD": [ - "d", - "D", - "ð", - "Ð", - 0 - ], - "KeyE": [ - "e", - "E", - "€", - "¢", - 0 - ], - "KeyF": [ - "f", - "F", - "đ", - "ª", - 0 - ], - "KeyG": [ - "g", - "G", - "ŋ", - "Ŋ", - 0 - ], - "KeyH": [ - "h", - "H", - "ħ", - "Ħ", - 0 - ], - "KeyI": [ - "i", - "I", - "→", - "ı", - 0 - ], - "KeyJ": [ - "j", - "J", - "̉", - "̛", - 0 - ], - "KeyK": [ - "k", - "K", - "ĸ", - "&", - 0 - ], - "KeyL": [ - "l", - "L", - "ł", - "Ł", - 0 - ], - "KeyM": [ - "m", - "M", - "µ", - "º", - 0 - ], - "KeyN": [ - "n", - "N", - "n", - "N", - 0 - ], - "KeyO": [ - "o", - "O", - "ø", - "Ø", - 0 - ], - "KeyP": [ - "p", - "P", - "þ", - "Þ", - 0 - ], - "KeyQ": [ - "q", - "Q", - "@", - "Ω", - 0 - ], - "KeyR": [ - "r", - "R", - "¶", - "®", - 0 - ], - "KeyS": [ - "s", - "S", - "ß", - "§", - 0 - ], - "KeyT": [ - "t", - "T", - "ŧ", - "Ŧ", - 0 - ], - "KeyU": [ - "u", - "U", - "↓", - "↑", - 0 - ], - "KeyV": [ - "v", - "V", - "“", - "‘", - 0 - ], - "KeyW": [ - "w", - "W", - "ł", - "Ł", - 0 - ], - "KeyX": [ - "x", - "X", - "»", - ">", - 0 - ], - "KeyY": [ - "y", - "Y", - "←", - "¥", - 0 - ], - "KeyZ": [ - "z", - "Z", - "«", - "<", - 0 - ], - "Digit1": [ - "1", - "!", - "|", - "¡", - 0 - ], - "Digit2": [ - "2", - "\"", - "@", - "⅛", - 0 - ], - "Digit3": [ - "3", - "·", - "#", - "£", - 0 - ], - "Digit4": [ - "4", - "$", - "~", - "$", - 0 - ], - "Digit5": [ - "5", - "%", - "½", - "⅜", - 0 - ], - "Digit6": [ - "6", - "&", - "¬", - "⅝", - 0 - ], - "Digit7": [ - "7", - "/", - "{", - "⅞", - 0 - ], - "Digit8": [ - "8", - "(", - "[", - "™", - 0 - ], - "Digit9": [ - "9", - ")", - "]", - "±", - 0 - ], - "Digit0": [ - "0", - "=", - "}", - "°", - 0 - ], - "Minus": [ - "'", - "?", - "\\", - "¿", - 0 - ], - "Equal": [ - "¡", - "¿", - "̃", - "~", - 0 - ], - "BracketLeft": [ - "̀", - "̂", - "[", - "̊", - 0 - ], - "BracketRight": [ - "+", - "*", - "]", - "̄", - 0 - ], - "Backslash": [ - "ç", - "Ç", - "}", - "̆", - 0 - ], - "Semicolon": [ - "ñ", - "Ñ", - "~", - "̋", - 0 - ], - "Quote": [ - "́", - "̈", - "{", - "{", - 0 - ], - "Backquote": [ - "º", - "ª", - "\\", - "\\", - 0 - ], - "Comma": [ - ",", - ";", - "─", - "×", - 0 - ], - "Period": [ - ".", - ":", - "·", - "÷", - 0 - ], - "Slash": [ - "-", - "_", - "̣", - "̇", - 0 - ] - } - }, - { - "language": "es", - "platform": "darwin", - "entries": { - "KeyA": [ - "a", - "A", - "å", - "Å", - 0 - ], - "KeyB": [ - "b", - "B", - "ß", - "", - 0 - ], - "KeyC": [ - "c", - "C", - "©", - " ", - 0 - ], - "KeyD": [ - "d", - "D", - "∂", - "∆", - 0 - ], - "KeyE": [ - "e", - "E", - "€", - "€", - 0 - ], - "KeyF": [ - "f", - "F", - "ƒ", - "fi", - 0 - ], - "KeyG": [ - "g", - "G", - "", - "fl", - 0 - ], - "KeyH": [ - "h", - "H", - "™", - " ", - 0 - ], - "KeyI": [ - "i", - "I", - " ", - " ", - 0 - ], - "KeyJ": [ - "j", - "J", - "¶", - "¯", - 0 - ], - "KeyK": [ - "k", - "K", - "§", - "ˇ", - 0 - ], - "KeyL": [ - "l", - "L", - " ", - "˘", - 0 - ], - "KeyM": [ - "m", - "M", - "µ", - "˚", - 0 - ], - "KeyN": [ - "n", - "N", - " ", - "˙", - 0 - ], - "KeyO": [ - "o", - "O", - "ø", - "Ø", - 0 - ], - "KeyP": [ - "p", - "P", - "π", - "∏", - 0 - ], - "KeyQ": [ - "q", - "Q", - "œ", - "Œ", - 0 - ], - "KeyR": [ - "r", - "R", - "®", - " ", - 0 - ], - "KeyS": [ - "s", - "S", - "∫", - " ", - 0 - ], - "KeyT": [ - "t", - "T", - "†", - "‡", - 0 - ], - "KeyU": [ - "u", - "U", - " ", - " ", - 0 - ], - "KeyV": [ - "v", - "V", - "√", - "◊", - 0 - ], - "KeyW": [ - "w", - "W", - "æ", - "Æ", - 0 - ], - "KeyX": [ - "x", - "X", - "∑", - "›", - 0 - ], - "KeyY": [ - "y", - "Y", - "¥", - " ", - 0 - ], - "KeyZ": [ - "z", - "Z", - "Ω", - "‹", - 0 - ], - "Digit1": [ - "1", - "!", - "|", - "ı", - 0 - ], - "Digit2": [ - "2", - "\"", - "@", - "˝", - 0 - ], - "Digit3": [ - "3", - "·", - "#", - "•", - 0 - ], - "Digit4": [ - "4", - "$", - "¢", - "£", - 0 - ], - "Digit5": [ - "5", - "%", - "∞", - "‰", - 0 - ], - "Digit6": [ - "6", - "&", - "¬", - " ", - 0 - ], - "Digit7": [ - "7", - "/", - "÷", - "⁄", - 0 - ], - "Digit8": [ - "8", - "(", - "“", - "‘", - 0 - ], - "Digit9": [ - "9", - ")", - "”", - "’", - 0 - ], - "Digit0": [ - "0", - "=", - "≠", - "≈", - 0 - ], - "Minus": [ - "'", - "?", - "´", - "¸", - 0 - ], - "Equal": [ - "¡", - "¿", - "‚", - "˛", - 0 - ], - "BracketLeft": [ - "`", - "^", - "[", - "ˆ", - 3 - ], - "BracketRight": [ - "+", - "*", - "]", - "±", - 0 - ], - "Backslash": [ - "ç", - "Ç", - "}", - "»", - 0 - ], - "Semicolon": [ - "ñ", - "Ñ", - "~", - "˜", - 4 - ], - "Quote": [ - "´", - "¨", - "{", - "«", - 3 - ], - "Backquote": [ - "<", - ">", - "≤", - "≥", - 0 - ], - "Comma": [ - ",", - ";", - "„", - "", - 0 - ], - "Period": [ - ".", - ":", - "…", - "…", - 0 - ], - "Slash": [ - "-", - "_", - "–", - "—", - 0 - ] - } - }, - { - "language": "es-latin", - "platform": "win", - "entries": { - "KeyA": [ - "a", - "A", - "", - "", - 0 - ], - "KeyB": [ - "b", - "B", - "", - "", - 0 - ], - "KeyC": [ - "c", - "C", - "", - "", - 0 - ], - "KeyD": [ - "d", - "D", - "", - "", - 0 - ], - "KeyE": [ - "e", - "E", - "", - "", - 0 - ], - "KeyF": [ - "f", - "F", - "", - "", - 0 - ], - "KeyG": [ - "g", - "G", - "", - "", - 0 - ], - "KeyH": [ - "h", - "H", - "", - "", - 0 - ], - "KeyI": [ - "i", - "I", - "", - "", - 0 - ], - "KeyJ": [ - "j", - "J", - "", - "", - 0 - ], - "KeyK": [ - "k", - "K", - "", - "", - 0 - ], - "KeyL": [ - "l", - "L", - "", - "", - 0 - ], - "KeyM": [ - "m", - "M", - "", - "", - 0 - ], - "KeyN": [ - "n", - "N", - "", - "", - 0 - ], - "KeyO": [ - "o", - "O", - "", - "", - 0 - ], - "KeyP": [ - "p", - "P", - "", - "", - 0 - ], - "KeyQ": [ - "q", - "Q", - "@", - "", - 0 - ], - "KeyR": [ - "r", - "R", - "", - "", - 0 - ], - "KeyS": [ - "s", - "S", - "", - "", - 0 - ], - "KeyT": [ - "t", - "T", - "", - "", - 0 - ], - "KeyU": [ - "u", - "U", - "", - "", - 0 - ], - "KeyV": [ - "v", - "V", - "", - "", - 0 - ], - "KeyW": [ - "w", - "W", - "", - "", - 0 - ], - "KeyX": [ - "x", - "X", - "", - "", - 0 - ], - "KeyY": [ - "y", - "Y", - "", - "", - 0 - ], - "KeyZ": [ - "z", - "Z", - "", - "", - 0 - ], - "Digit1": [ - "1", - "!", - "", - "", - 0 - ], - "Digit2": [ - "2", - "\"", - "", - "", - 0 - ], - "Digit3": [ - "3", - "#", - "", - "", - 0 - ], - "Digit4": [ - "4", - "$", - "", - "", - 0 - ], - "Digit5": [ - "5", - "%", - "", - "", - 0 - ], - "Digit6": [ - "6", - "&", - "", - "", - 0 - ], - "Digit7": [ - "7", - "/", - "", - "", - 0 - ], - "Digit8": [ - "8", - "(", - "", - "", - 0 - ], - "Digit9": [ - "9", - ")", - "", - "", - 0 - ], - "Digit0": [ - "0", - "=", - "", - "", - 0 - ], - "Minus": [ - "'", - "?", - "\\", - "", - 0 - ], - "Equal": [ - "¿", - "¡", - "", - "", - 0 - ], - "BracketLeft": [ - "´", - "¨", - "", - "", - 0 - ], - "BracketRight": [ - "+", - "*", - "~", - "", - 0 - ], - "Backslash": [ - "}", - "]", - "`", - "", - 0 - ], - "Semicolon": [ - "ñ", - "Ñ", - "", - "", - 0 - ], - "Quote": [ - "{", - "[", - "^", - "", - 0 - ], - "Backquote": [ - "|", - "°", - "¬", - "", - 0 - ], - "Comma": [ - ",", - ";", - "", - "", - 0 - ], - "Period": [ - ".", - ":", - "", - "", - 0 - ], - "Slash": [ - "-", - "_", - "", - "", - 0 - ] - } - }, - { - "language": "fr", - "platform": "win", - "entries": { - "KeyA": [ - "q", - "Q", - "", - "", - 0 - ], - "KeyB": [ - "b", - "B", - "", - "", - 0 - ], - "KeyC": [ - "c", - "C", - "", - "", - 0 - ], - "KeyD": [ - "d", - "D", - "", - "", - 0 - ], - "KeyE": [ - "e", - "E", - "€", - "", - 0 - ], - "KeyF": [ - "f", - "F", - "", - "", - 0 - ], - "KeyG": [ - "g", - "G", - "", - "", - 0 - ], - "KeyH": [ - "h", - "H", - "", - "", - 0 - ], - "KeyI": [ - "i", - "I", - "", - "", - 0 - ], - "KeyJ": [ - "j", - "J", - "", - "", - 0 - ], - "KeyK": [ - "k", - "K", - "", - "", - 0 - ], - "KeyL": [ - "l", - "L", - "", - "", - 0 - ], - "KeyM": [ - ",", - "?", - "", - "", - 0 - ], - "KeyN": [ - "n", - "N", - "", - "", - 0 - ], - "KeyO": [ - "o", - "O", - "", - "", - 0 - ], - "KeyP": [ - "p", - "P", - "", - "", - 0 - ], - "KeyQ": [ - "a", - "A", - "", - "", - 0 - ], - "KeyR": [ - "r", - "R", - "", - "", - 0 - ], - "KeyS": [ - "s", - "S", - "", - "", - 0 - ], - "KeyT": [ - "t", - "T", - "", - "", - 0 - ], - "KeyU": [ - "u", - "U", - "", - "", - 0 - ], - "KeyV": [ - "v", - "V", - "", - "", - 0 - ], - "KeyW": [ - "z", - "Z", - "", - "", - 0 - ], - "KeyX": [ - "x", - "X", - "", - "", - 0 - ], - "KeyY": [ - "y", - "Y", - "", - "", - 0 - ], - "KeyZ": [ - "w", - "W", - "", - "", - 0 - ], - "Digit1": [ - "&", - "1", - "", - "", - 0 - ], - "Digit2": [ - "é", - "2", - "~", - "", - 0 - ], - "Digit3": [ - "\"", - "3", - "#", - "", - 0 - ], - "Digit4": [ - "'", - "4", - "{", - "", - 0 - ], - "Digit5": [ - "(", - "5", - "[", - "", - 0 - ], - "Digit6": [ - "-", - "6", - "|", - "", - 0 - ], - "Digit7": [ - "è", - "7", - "`", - "", - 0 - ], - "Digit8": [ - "_", - "8", - "\\", - "", - 0 - ], - "Digit9": [ - "ç", - "9", - "^", - "", - 0 - ], - "Digit0": [ - "à", - "0", - "@", - "", - 0 - ], - "Minus": [ - ")", - "°", - "]", - "", - 0 - ], - "Equal": [ - "=", - "+", - "}", - "", - 0 - ], - "BracketLeft": [ - "^", - "¨", - "", - "", - 0 - ], - "BracketRight": [ - "$", - "£", - "¤", - "", - 0 - ], - "Backslash": [ - "*", - "µ", - "", - "", - 0 - ], - "Semicolon": [ - "m", - "M", - "", - "", - 0 - ], - "Quote": [ - "ù", - "%", - "", - "", - 0 - ], - "Backquote": [ - "²", - "", - "", - "", - 0 - ], - "Comma": [ - ";", - ".", - "", - "", - 0 - ], - "Period": [ - ":", - "/", - "", - "", - 0 - ], - "Slash": [ - "!", - "§", - "", - "", - 0 - ] - } - }, - { - "language": "fr", - "platform": "linux", - "entries": { - "KeyA": [ - "q", - "Q", - "@", - "Ω", - 0 - ], - "KeyB": [ - "b", - "B", - "”", - "’", - 0 - ], - "KeyC": [ - "c", - "C", - "¢", - "©", - 0 - ], - "KeyD": [ - "d", - "D", - "ð", - "Ð", - 0 - ], - "KeyE": [ - "e", - "E", - "€", - "¢", - 0 - ], - "KeyF": [ - "f", - "F", - "đ", - "ª", - 0 - ], - "KeyG": [ - "g", - "G", - "ŋ", - "Ŋ", - 0 - ], - "KeyH": [ - "h", - "H", - "ħ", - "Ħ", - 0 - ], - "KeyI": [ - "i", - "I", - "→", - "ı", - 0 - ], - "KeyJ": [ - "j", - "J", - "̉", - "̛", - 0 - ], - "KeyK": [ - "k", - "K", - "ĸ", - "&", - 0 - ], - "KeyL": [ - "l", - "L", - "ł", - "Ł", - 0 - ], - "KeyM": [ - ",", - "?", - "́", - "̋", - 0 - ], - "KeyN": [ - "n", - "N", - "n", - "N", - 0 - ], - "KeyO": [ - "o", - "O", - "ø", - "Ø", - 0 - ], - "KeyP": [ - "p", - "P", - "þ", - "Þ", - 0 - ], - "KeyQ": [ - "a", - "A", - "æ", - "Æ", - 0 - ], - "KeyR": [ - "r", - "R", - "¶", - "®", - 0 - ], - "KeyS": [ - "s", - "S", - "ß", - "§", - 0 - ], - "KeyT": [ - "t", - "T", - "ŧ", - "Ŧ", - 0 - ], - "KeyU": [ - "u", - "U", - "↓", - "↑", - 0 - ], - "KeyV": [ - "v", - "V", - "“", - "‘", - 0 - ], - "KeyW": [ - "z", - "Z", - "«", - "<", - 0 - ], - "KeyX": [ - "x", - "X", - "»", - ">", - 0 - ], - "KeyY": [ - "y", - "Y", - "←", - "¥", - 0 - ], - "KeyZ": [ - "w", - "W", - "ł", - "Ł", - 0 - ], - "Digit1": [ - "&", - "1", - "¹", - "¡", - 0 - ], - "Digit2": [ - "é", - "2", - "~", - "⅛", - 0 - ], - "Digit3": [ - "\"", - "3", - "#", - "£", - 0 - ], - "Digit4": [ - "'", - "4", - "{", - "$", - 0 - ], - "Digit5": [ - "(", - "5", - "[", - "⅜", - 0 - ], - "Digit6": [ - "-", - "6", - "|", - "⅝", - 0 - ], - "Digit7": [ - "è", - "7", - "`", - "⅞", - 0 - ], - "Digit8": [ - "_", - "8", - "\\", - "™", - 0 - ], - "Digit9": [ - "ç", - "9", - "^", - "±", - 0 - ], - "Digit0": [ - "à", - "0", - "@", - "°", - 0 - ], - "Minus": [ - ")", - "°", - "]", - "¿", - 0 - ], - "Equal": [ - "=", - "+", - "}", - "̨", - 0 - ], - "BracketLeft": [ - "̂", - "̈", - "̈", - "̊", - 0 - ], - "BracketRight": [ - "$", - "£", - "¤", - "̄", - 0 - ], - "Backslash": [ - "*", - "µ", - "̀", - "̆", - 0 - ], - "Semicolon": [ - "m", - "M", - "µ", - "º", - 0 - ], - "Quote": [ - "ù", - "%", - "̂", - "̌", - 0 - ], - "Backquote": [ - "²", - "~", - "¬", - "¬", - 0 - ], - "Comma": [ - ";", - ".", - "─", - "×", - 0 - ], - "Period": [ - ":", - "/", - "·", - "÷", - 0 - ], - "Slash": [ - "!", - "§", - "̣", - "̇", - 0 - ] - } - }, - { - "language": "fr", - "platform": "darwin", - "entries": { - "KeyA": [ - "q", - "Q", - "‡", - "Ω", - 0 - ], - "KeyB": [ - "b", - "B", - "ß", - "∫", - 0 - ], - "KeyC": [ - "c", - "C", - "©", - "¢", - 0 - ], - "KeyD": [ - "d", - "D", - "∂", - "∆", - 0 - ], - "KeyE": [ - "e", - "E", - "ê", - "Ê", - 0 - ], - "KeyF": [ - "f", - "F", - "ƒ", - "·", - 0 - ], - "KeyG": [ - "g", - "G", - "fi", - "fl", - 0 - ], - "KeyH": [ - "h", - "H", - "Ì", - "Î", - 0 - ], - "KeyI": [ - "i", - "I", - "î", - "ï", - 0 - ], - "KeyJ": [ - "j", - "J", - "Ï", - "Í", - 0 - ], - "KeyK": [ - "k", - "K", - "È", - "Ë", - 0 - ], - "KeyL": [ - "l", - "L", - "¬", - "|", - 0 - ], - "KeyM": [ - ",", - "?", - "∞", - "¿", - 0 - ], - "KeyN": [ - "n", - "N", - "~", - "ı", - 4 - ], - "KeyO": [ - "o", - "O", - "œ", - "Œ", - 0 - ], - "KeyP": [ - "p", - "P", - "π", - "∏", - 0 - ], - "KeyQ": [ - "a", - "A", - "æ", - "Æ", - 0 - ], - "KeyR": [ - "r", - "R", - "®", - "‚", - 0 - ], - "KeyS": [ - "s", - "S", - "Ò", - "∑", - 0 - ], - "KeyT": [ - "t", - "T", - "†", - "™", - 0 - ], - "KeyU": [ - "u", - "U", - "º", - "ª", - 0 - ], - "KeyV": [ - "v", - "V", - "◊", - "√", - 0 - ], - "KeyW": [ - "z", - "Z", - "Â", - "Å", - 0 - ], - "KeyX": [ - "x", - "X", - "≈", - "⁄", - 0 - ], - "KeyY": [ - "y", - "Y", - "Ú", - "Ÿ", - 0 - ], - "KeyZ": [ - "w", - "W", - "‹", - "›", - 0 - ], - "Digit1": [ - "&", - "1", - "", - "´", - 8 - ], - "Digit2": [ - "é", - "2", - "ë", - "„", - 0 - ], - "Digit3": [ - "\"", - "3", - "“", - "”", - 0 - ], - "Digit4": [ - "'", - "4", - "‘", - "’", - 0 - ], - "Digit5": [ - "(", - "5", - "{", - "[", - 0 - ], - "Digit6": [ - "§", - "6", - "¶", - "å", - 0 - ], - "Digit7": [ - "è", - "7", - "«", - "»", - 0 - ], - "Digit8": [ - "!", - "8", - "¡", - "Û", - 0 - ], - "Digit9": [ - "ç", - "9", - "Ç", - "Á", - 0 - ], - "Digit0": [ - "à", - "0", - "ø", - "Ø", - 0 - ], - "Minus": [ - ")", - "°", - "}", - "]", - 0 - ], - "Equal": [ - "-", - "_", - "—", - "–", - 0 - ], - "BracketLeft": [ - "^", - "¨", - "ô", - "Ô", - 3 - ], - "BracketRight": [ - "$", - "*", - "€", - "¥", - 0 - ], - "Backslash": [ - "`", - "£", - "@", - "#", - 1 - ], - "Semicolon": [ - "m", - "M", - "µ", - "Ó", - 0 - ], - "Quote": [ - "ù", - "%", - "Ù", - "‰", - 0 - ], - "Backquote": [ - "<", - ">", - "≤", - "≥", - 0 - ], - "Comma": [ - ";", - ".", - "…", - "•", - 0 - ], - "Period": [ - ":", - "/", - "÷", - "\\", - 0 - ], - "Slash": [ - "=", - "+", - "≠", - "±", - 0 - ] - } - }, - { - "language": "hu", - "platform": "win", - "entries": { - "KeyA": [ - "a", - "A", - "ä", - "", - 0 - ], - "KeyB": [ - "b", - "B", - "{", - "", - 0 - ], - "KeyC": [ - "c", - "C", - "&", - "", - 0 - ], - "KeyD": [ - "d", - "D", - "Đ", - "", - 0 - ], - "KeyE": [ - "e", - "E", - "Ä", - "", - 0 - ], - "KeyF": [ - "f", - "F", - "[", - "", - 0 - ], - "KeyG": [ - "g", - "G", - "]", - "", - 0 - ], - "KeyH": [ - "h", - "H", - "", - "", - 0 - ], - "KeyI": [ - "i", - "I", - "Í", - "", - 0 - ], - "KeyJ": [ - "j", - "J", - "í", - "", - 0 - ], - "KeyK": [ - "k", - "K", - "ł", - "", - 0 - ], - "KeyL": [ - "l", - "L", - "Ł", - "", - 0 - ], - "KeyM": [ - "m", - "M", - "<", - "", - 0 - ], - "KeyN": [ - "n", - "N", - "}", - "", - 0 - ], - "KeyO": [ - "o", - "O", - "", - "", - 0 - ], - "KeyP": [ - "p", - "P", - "", - "", - 0 - ], - "KeyQ": [ - "q", - "Q", - "\\", - "", - 0 - ], - "KeyR": [ - "r", - "R", - "", - "", - 0 - ], - "KeyS": [ - "s", - "S", - "đ", - "", - 0 - ], - "KeyT": [ - "t", - "T", - "", - "", - 0 - ], - "KeyU": [ - "u", - "U", - "€", - "", - 0 - ], - "KeyV": [ - "v", - "V", - "@", - "", - 0 - ], - "KeyW": [ - "w", - "W", - "|", - "", - 0 - ], - "KeyX": [ - "x", - "X", - "#", - "", - 0 - ], - "KeyY": [ - "z", - "Z", - "", - "", - 0 - ], - "KeyZ": [ - "y", - "Y", - ">", - "", - 0 - ], - "Digit1": [ - "1", - "'", - "~", - "", - 0 - ], - "Digit2": [ - "2", - "\"", - "ˇ", - "", - 0 - ], - "Digit3": [ - "3", - "+", - "^", - "", - 0 - ], - "Digit4": [ - "4", - "!", - "˘", - "", - 0 - ], - "Digit5": [ - "5", - "%", - "°", - "", - 0 - ], - "Digit6": [ - "6", - "/", - "˛", - "", - 0 - ], - "Digit7": [ - "7", - "=", - "`", - "", - 0 - ], - "Digit8": [ - "8", - "(", - "˙", - "", - 0 - ], - "Digit9": [ - "9", - ")", - "´", - "", - 0 - ], - "Digit0": [ - "ö", - "Ö", - "˝", - "", - 0 - ], - "Minus": [ - "ü", - "Ü", - "¨", - "", - 0 - ], - "Equal": [ - "ó", - "Ó", - "¸", - "", - 0 - ], - "BracketLeft": [ - "ő", - "Ő", - "÷", - "", - 0 - ], - "BracketRight": [ - "ú", - "Ú", - "×", - "", - 0 - ], - "Backslash": [ - "ű", - "Ű", - "¤", - "", - 0 - ], - "Semicolon": [ - "é", - "É", - "$", - "", - 0 - ], - "Quote": [ - "á", - "Á", - "ß", - "", - 0 - ], - "Backquote": [ - "0", - "§", - "", - "", - 0 - ], - "Comma": [ - ",", - "?", - ";", - "", - 0 - ], - "Period": [ - ".", - ":", - ">", - "", - 0 - ], - "Slash": [ - "-", - "_", - "*", - "", - 0 - ] - } - }, - { - "language": "it", - "platform": "win", - "entries": { - "KeyA": [ - "a", - "A", - "", - "", - 0 - ], - "KeyB": [ - "b", - "B", - "", - "", - 0 - ], - "KeyC": [ - "c", - "C", - "", - "", - 0 - ], - "KeyD": [ - "d", - "D", - "", - "", - 0 - ], - "KeyE": [ - "e", - "E", - "€", - "", - 0 - ], - "KeyF": [ - "f", - "F", - "", - "", - 0 - ], - "KeyG": [ - "g", - "G", - "", - "", - 0 - ], - "KeyH": [ - "h", - "H", - "", - "", - 0 - ], - "KeyI": [ - "i", - "I", - "", - "", - 0 - ], - "KeyJ": [ - "j", - "J", - "", - "", - 0 - ], - "KeyK": [ - "k", - "K", - "", - "", - 0 - ], - "KeyL": [ - "l", - "L", - "", - "", - 0 - ], - "KeyM": [ - "m", - "M", - "", - "", - 0 - ], - "KeyN": [ - "n", - "N", - "", - "", - 0 - ], - "KeyO": [ - "o", - "O", - "", - "", - 0 - ], - "KeyP": [ - "p", - "P", - "", - "", - 0 - ], - "KeyQ": [ - "q", - "Q", - "", - "", - 0 - ], - "KeyR": [ - "r", - "R", - "", - "", - 0 - ], - "KeyS": [ - "s", - "S", - "", - "", - 0 - ], - "KeyT": [ - "t", - "T", - "", - "", - 0 - ], - "KeyU": [ - "u", - "U", - "", - "", - 0 - ], - "KeyV": [ - "v", - "V", - "", - "", - 0 - ], - "KeyW": [ - "w", - "W", - "", - "", - 0 - ], - "KeyX": [ - "x", - "X", - "", - "", - 0 - ], - "KeyY": [ - "y", - "Y", - "", - "", - 0 - ], - "KeyZ": [ - "z", - "Z", - "", - "", - 0 - ], - "Digit1": [ - "1", - "!", - "", - "", - 0 - ], - "Digit2": [ - "2", - "\"", - "", - "", - 0 - ], - "Digit3": [ - "3", - "£", - "", - "", - 0 - ], - "Digit4": [ - "4", - "$", - "", - "", - 0 - ], - "Digit5": [ - "5", - "%", - "€", - "", - 0 - ], - "Digit6": [ - "6", - "&", - "", - "", - 0 - ], - "Digit7": [ - "7", - "/", - "", - "", - 0 - ], - "Digit8": [ - "8", - "(", - "", - "", - 0 - ], - "Digit9": [ - "9", - ")", - "", - "", - 0 - ], - "Digit0": [ - "0", - "=", - "", - "", - 0 - ], - "Minus": [ - "'", - "?", - "", - "", - 0 - ], - "Equal": [ - "ì", - "^", - "", - "", - 0 - ], - "BracketLeft": [ - "è", - "é", - "[", - "{", - 0 - ], - "BracketRight": [ - "+", - "*", - "]", - "}", - 0 - ], - "Backslash": [ - "ù", - "§", - "", - "", - 0 - ], - "Semicolon": [ - "ò", - "ç", - "@", - "", - 0 - ], - "Quote": [ - "à", - "°", - "#", - "", - 0 - ], - "Backquote": [ - "\\", - "|", - "", - "", - 0 - ], - "Comma": [ - ",", - ";", - "", - "", - 0 - ], - "Period": [ - ".", - ":", - "", - "", - 0 - ], - "Slash": [ - "-", - "_", - "", - "", - 0 - ] - } - }, - { - "language": "it", - "platform": "darwin", - "entries": { - "KeyA": [ - "a", - "A", - "å", - "Å", - 0 - ], - "KeyB": [ - "b", - "B", - "∫", - "Í", - 0 - ], - "KeyC": [ - "c", - "C", - "©", - "Á", - 0 - ], - "KeyD": [ - "d", - "D", - "∂", - "˘", - 0 - ], - "KeyE": [ - "e", - "E", - "€", - "È", - 0 - ], - "KeyF": [ - "f", - "F", - "ƒ", - "˙", - 0 - ], - "KeyG": [ - "g", - "G", - "∞", - "˚", - 0 - ], - "KeyH": [ - "h", - "H", - "∆", - "¸", - 0 - ], - "KeyI": [ - "i", - "I", - "œ", - "Œ", - 0 - ], - "KeyJ": [ - "j", - "J", - "ª", - "˝", - 0 - ], - "KeyK": [ - "k", - "K", - "º", - "˛", - 0 - ], - "KeyL": [ - "l", - "L", - "¬", - "ˇ", - 0 - ], - "KeyM": [ - "m", - "M", - "µ", - "Ú", - 0 - ], - "KeyN": [ - "n", - "N", - "˜", - "Ó", - 4 - ], - "KeyO": [ - "o", - "O", - "ø", - "Ø", - 0 - ], - "KeyP": [ - "p", - "P", - "π", - "∏", - 0 - ], - "KeyQ": [ - "q", - "Q", - "„", - "‚", - 0 - ], - "KeyR": [ - "r", - "R", - "®", - "Ì", - 0 - ], - "KeyS": [ - "s", - "S", - "ß", - "¯", - 0 - ], - "KeyT": [ - "t", - "T", - "™", - "Ò", - 0 - ], - "KeyU": [ - "u", - "U", - "¨", - "Ù", - 4 - ], - "KeyV": [ - "v", - "V", - "√", - "É", - 0 - ], - "KeyW": [ - "w", - "W", - "Ω", - "À", - 0 - ], - "KeyX": [ - "x", - "X", - "†", - "‡", - 0 - ], - "KeyY": [ - "y", - "Y", - "æ", - "Æ", - 0 - ], - "KeyZ": [ - "z", - "Z", - "∑", - " ", - 0 - ], - "Digit1": [ - "1", - "!", - "«", - "»", - 0 - ], - "Digit2": [ - "2", - "\"", - "“", - "”", - 0 - ], - "Digit3": [ - "3", - "£", - "‘", - "’", - 0 - ], - "Digit4": [ - "4", - "$", - "¥", - "¢", - 0 - ], - "Digit5": [ - "5", - "%", - "~", - "‰", - 0 - ], - "Digit6": [ - "6", - "&", - "‹", - "›", - 0 - ], - "Digit7": [ - "7", - "/", - "÷", - "⁄", - 0 - ], - "Digit8": [ - "8", - "(", - "´", - "", - 4 - ], - "Digit9": [ - "9", - ")", - "`", - " ", - 4 - ], - "Digit0": [ - "0", - "=", - "≠", - "≈", - 0 - ], - "Minus": [ - "'", - "?", - "¡", - "¿", - 0 - ], - "Equal": [ - "ì", - "^", - "ˆ", - "±", - 4 - ], - "BracketLeft": [ - "è", - "é", - "[", - "{", - 0 - ], - "BracketRight": [ - "+", - "*", - "]", - "}", - 0 - ], - "Backslash": [ - "ù", - "§", - "¶", - "◊", - 0 - ], - "Semicolon": [ - "ò", - "ç", - "@", - "Ç", - 0 - ], - "Quote": [ - "à", - "°", - "#", - "∞", - 0 - ], - "Backquote": [ - "<", - ">", - "≤", - "≥", - 0 - ], - "Comma": [ - ",", - ";", - "…", - " ", - 0 - ], - "Period": [ - ".", - ":", - "•", - "·", - 0 - ], - "Slash": [ - "-", - "_", - "–", - "—", - 0 - ] - } - }, - { - "language": "jp", - "platform": "darwin", - "entries": { - "KeyA": [ - "a", - "A", - "å", - "Å", - 0 - ], - "KeyB": [ - "b", - "B", - "∫", - "ı", - 0 - ], - "KeyC": [ - "c", - "C", - "ç", - "Ç", - 0 - ], - "KeyD": [ - "d", - "D", - "∂", - "Î", - 0 - ], - "KeyE": [ - "e", - "E", - "´", - "´", - 4 - ], - "KeyF": [ - "f", - "F", - "ƒ", - "Ï", - 0 - ], - "KeyG": [ - "g", - "G", - "©", - "˝", - 0 - ], - "KeyH": [ - "h", - "H", - "˙", - "Ó", - 0 - ], - "KeyI": [ - "i", - "I", - "ˆ", - "ˆ", - 4 - ], - "KeyJ": [ - "j", - "J", - "∆", - "Ô", - 0 - ], - "KeyK": [ - "k", - "K", - "˚", - "", - 0 - ], - "KeyL": [ - "l", - "L", - "¬", - "Ò", - 0 - ], - "KeyM": [ - "m", - "M", - "µ", - "Â", - 0 - ], - "KeyN": [ - "n", - "N", - "˜", - "˜", - 4 - ], - "KeyO": [ - "o", - "O", - "ø", - "Ø", - 0 - ], - "KeyP": [ - "p", - "P", - "π", - "∏", - 0 - ], - "KeyQ": [ - "q", - "Q", - "œ", - "Œ", - 0 - ], - "KeyR": [ - "r", - "R", - "®", - "‰", - 0 - ], - "KeyS": [ - "s", - "S", - "ß", - "Í", - 0 - ], - "KeyT": [ - "t", - "T", - "†", - "ˇ", - 0 - ], - "KeyU": [ - "u", - "U", - "¨", - "¨", - 4 - ], - "KeyV": [ - "v", - "V", - "√", - "◊", - 0 - ], - "KeyW": [ - "w", - "W", - "∑", - "„", - 0 - ], - "KeyX": [ - "x", - "X", - "≈", - "˛", - 0 - ], - "KeyY": [ - "y", - "Y", - "¥", - "Á", - 0 - ], - "KeyZ": [ - "z", - "Z", - "Ω", - "¸", - 0 - ], - "Digit1": [ - "1", - "!", - "¡", - "⁄", - 0 - ], - "Digit2": [ - "2", - "@", - "™", - "€", - 0 - ], - "Digit3": [ - "3", - "#", - "£", - "‹", - 0 - ], - "Digit4": [ - "4", - "$", - "¢", - "›", - 0 - ], - "Digit5": [ - "5", - "%", - "∞", - "fi", - 0 - ], - "Digit6": [ - "6", - "^", - "§", - "fl", - 0 - ], - "Digit7": [ - "7", - "&", - "¶", - "‡", - 0 - ], - "Digit8": [ - "8", - "*", - "•", - "°", - 0 - ], - "Digit9": [ - "9", - "(", - "ª", - "·", - 0 - ], - "Digit0": [ - "0", - ")", - "º", - "‚", - 0 - ], - "Minus": [ - "-", - "_", - "–", - "—", - 0 - ], - "Equal": [ - "=", - "+", - "≠", - "±", - 0 - ], - "BracketLeft": [ - "[", - "{", - "“", - "”", - 0 - ], - "BracketRight": [ - "]", - "}", - "‘", - "’", - 0 - ], - "Backslash": [ - "\\", - "|", - "«", - "»", - 0 - ], - "Semicolon": [ - ";", - ":", - "…", - "Ú", - 0 - ], - "Quote": [ - "'", - "\"", - "æ", - "Æ", - 0 - ], - "Backquote": [ - "`", - "~", - "`", - "`", - 4 - ], - "Comma": [ - ",", - "<", - "≤", - "¯", - 0 - ], - "Period": [ - ".", - ">", - "≥", - "˘", - 0 - ], - "Slash": [ - "/", - "?", - "÷", - "¿", - 0 - ] - } - }, - { - "language": "jp-roman", - "platform": "darwin", - "entries": { - "KeyA": [ - "a", - "A", - "¯", - "̄", - 4 - ], - "KeyB": [ - "b", - "B", - "˘", - "̆", - 4 - ], - "KeyC": [ - "c", - "C", - "¸", - "̧", - 4 - ], - "KeyD": [ - "d", - "D", - "ð", - "Ð", - 0 - ], - "KeyE": [ - "e", - "E", - "´", - "́", - 4 - ], - "KeyF": [ - "f", - "F", - "ƒ", - "", - 0 - ], - "KeyG": [ - "g", - "G", - "©", - "‸", - 8 - ], - "KeyH": [ - "h", - "H", - "ˍ", - "̱", - 4 - ], - "KeyI": [ - "i", - "I", - "ʼ", - "̛", - 4 - ], - "KeyJ": [ - "j", - "J", - "˝", - "̋", - 4 - ], - "KeyK": [ - "k", - "K", - "˚", - "̊", - 4 - ], - "KeyL": [ - "l", - "L", - "-", - "̵", - 4 - ], - "KeyM": [ - "m", - "M", - "˛", - "̨", - 4 - ], - "KeyN": [ - "n", - "N", - "˜", - "̃", - 4 - ], - "KeyO": [ - "o", - "O", - "ø", - "Ø", - 0 - ], - "KeyP": [ - "p", - "P", - ",", - "̦", - 4 - ], - "KeyQ": [ - "q", - "Q", - "œ", - "Œ", - 0 - ], - "KeyR": [ - "r", - "R", - "®", - "‰", - 0 - ], - "KeyS": [ - "s", - "S", - "ß", - "", - 0 - ], - "KeyT": [ - "t", - "T", - "þ", - "Þ", - 0 - ], - "KeyU": [ - "u", - "U", - "¨", - "̈", - 4 - ], - "KeyV": [ - "v", - "V", - "ˇ", - "̌", - 4 - ], - "KeyW": [ - "w", - "W", - "˙", - "̇", - 4 - ], - "KeyX": [ - "x", - "X", - ".", - "̣", - 4 - ], - "KeyY": [ - "y", - "Y", - "¥", - "", - 0 - ], - "KeyZ": [ - "z", - "Z", - "ˀ", - "̉", - 4 - ], - "Digit1": [ - "1", - "!", - "¡", - "⁄", - 0 - ], - "Digit2": [ - "2", - "@", - "™", - "€", - 0 - ], - "Digit3": [ - "3", - "#", - "£", - "‹", - 0 - ], - "Digit4": [ - "4", - "$", - "¢", - "›", - 0 - ], - "Digit5": [ - "5", - "%", - "§", - "†", - 0 - ], - "Digit6": [ - "6", - "^", - "ˆ", - "̂", - 4 - ], - "Digit7": [ - "7", - "&", - "¶", - "‡", - 0 - ], - "Digit8": [ - "8", - "*", - "•", - "°", - 0 - ], - "Digit9": [ - "9", - "(", - "ª", - "·", - 0 - ], - "Digit0": [ - "0", - ")", - "º", - "‚", - 0 - ], - "Minus": [ - "-", - "_", - "–", - "—", - 0 - ], - "Equal": [ - "=", - "+", - "≠", - "±", - 0 - ], - "BracketLeft": [ - "[", - "{", - "“", - "”", - 0 - ], - "BracketRight": [ - "]", - "}", - "‘", - "’", - 0 - ], - "Backslash": [ - "\\", - "|", - "«", - "»", - 0 - ], - "Semicolon": [ - ";", - ":", - "…", - "№", - 8 - ], - "Quote": [ - "'", - "\"", - "æ", - "Æ", - 0 - ], - "Backquote": [ - "`", - "~", - "`", - "̀", - 4 - ], - "Comma": [ - ",", - "<", - "≤", - "„", - 0 - ], - "Period": [ - ".", - ">", - "≥", - "ʔ", - 8 - ], - "Slash": [ - "/", - "?", - "÷", - "¿", - 0 - ] - } - }, - { - "language": "ko", - "platform": "darwin", - "entries": { - "KeyA": [ - "ㅁ", - "ㅁ", - "a", - "A", - 0 - ], - "KeyB": [ - "ㅠ", - "ㅠ", - "b", - "B", - 0 - ], - "KeyC": [ - "ㅊ", - "ㅊ", - "c", - "C", - 0 - ], - "KeyD": [ - "ㅇ", - "ㅇ", - "d", - "D", - 0 - ], - "KeyE": [ - "ㄷ", - "ㄸ", - "e", - "E", - 0 - ], - "KeyF": [ - "ㄹ", - "ㄹ", - "f", - "F", - 0 - ], - "KeyG": [ - "ㅎ", - "ㅎ", - "g", - "G", - 0 - ], - "KeyH": [ - "ㅗ", - "ㅗ", - "h", - "H", - 0 - ], - "KeyI": [ - "ㅑ", - "ㅑ", - "i", - "I", - 0 - ], - "KeyJ": [ - "ㅓ", - "ㅓ", - "j", - "J", - 0 - ], - "KeyK": [ - "ㅏ", - "ㅏ", - "k", - "K", - 0 - ], - "KeyL": [ - "ㅣ", - "ㅣ", - "l", - "L", - 0 - ], - "KeyM": [ - "ㅡ", - "ㅡ", - "m", - "M", - 0 - ], - "KeyN": [ - "ㅜ", - "ㅜ", - "n", - "N", - 0 - ], - "KeyO": [ - "ㅐ", - "ㅒ", - "o", - "O", - 0 - ], - "KeyP": [ - "ㅔ", - "ㅖ", - "p", - "P", - 0 - ], - "KeyQ": [ - "ㅂ", - "ㅃ", - "q", - "Q", - 0 - ], - "KeyR": [ - "ㄱ", - "ㄲ", - "r", - "R", - 0 - ], - "KeyS": [ - "ㄴ", - "ㄴ", - "s", - "S", - 0 - ], - "KeyT": [ - "ㅅ", - "ㅆ", - "t", - "T", - 0 - ], - "KeyU": [ - "ㅕ", - "ㅕ", - "u", - "U", - 0 - ], - "KeyV": [ - "ㅍ", - "ㅍ", - "v", - "V", - 0 - ], - "KeyW": [ - "ㅈ", - "ㅉ", - "w", - "W", - 0 - ], - "KeyX": [ - "ㅌ", - "ㅌ", - "x", - "X", - 0 - ], - "KeyY": [ - "ㅛ", - "ㅛ", - "y", - "Y", - 0 - ], - "KeyZ": [ - "ㅋ", - "ㅋ", - "z", - "Z", - 0 - ], - "Digit1": [ - "1", - "!", - "1", - "!", - 0 - ], - "Digit2": [ - "2", - "@", - "2", - "@", - 0 - ], - "Digit3": [ - "3", - "#", - "3", - "#", - 0 - ], - "Digit4": [ - "4", - "$", - "4", - "$", - 0 - ], - "Digit5": [ - "5", - "%", - "5", - "%", - 0 - ], - "Digit6": [ - "6", - "^", - "6", - "^", - 0 - ], - "Digit7": [ - "7", - "&", - "7", - "&", - 0 - ], - "Digit8": [ - "8", - "*", - "8", - "*", - 0 - ], - "Digit9": [ - "9", - "(", - "9", - "(", - 0 - ], - "Digit0": [ - "0", - ")", - "0", - ")", - 0 - ], - "Minus": [ - "-", - "_", - "-", - "_", - 0 - ], - "Equal": [ - "=", - "+", - "=", - "+", - 0 - ], - "BracketLeft": [ - "[", - "{", - "[", - "{", - 0 - ], - "BracketRight": [ - "]", - "}", - "]", - "}", - 0 - ], - "Backslash": [ - "\\", - "|", - "\\", - "|", - 0 - ], - "Semicolon": [ - ";", - ":", - ";", - ":", - 0 - ], - "Quote": [ - "'", - "\"", - "'", - "\"", - 0 - ], - "Backquote": [ - "₩", - "~", - "`", - "~", - 0 - ], - "Comma": [ - ",", - "<", - ",", - "<", - 0 - ], - "Period": [ - ".", - ">", - ".", - ">", - 0 - ], - "Slash": [ - "/", - "?", - "/", - "?", - 0 - ] - } - }, - { - "language": "no", - "platform": "win", - "entries": { - "KeyA": [ - "a", - "A", - "", - "", - 0 - ], - "KeyB": [ - "b", - "B", - "", - "", - 0 - ], - "KeyC": [ - "c", - "C", - "", - "", - 0 - ], - "KeyD": [ - "d", - "D", - "", - "", - 0 - ], - "KeyE": [ - "e", - "E", - "€", - "", - 0 - ], - "KeyF": [ - "f", - "F", - "", - "", - 0 - ], - "KeyG": [ - "g", - "G", - "", - "", - 0 - ], - "KeyH": [ - "h", - "H", - "", - "", - 0 - ], - "KeyI": [ - "i", - "I", - "", - "", - 0 - ], - "KeyJ": [ - "j", - "J", - "", - "", - 0 - ], - "KeyK": [ - "k", - "K", - "", - "", - 0 - ], - "KeyL": [ - "l", - "L", - "", - "", - 0 - ], - "KeyM": [ - "m", - "M", - "µ", - "", - 0 - ], - "KeyN": [ - "n", - "N", - "", - "", - 0 - ], - "KeyO": [ - "o", - "O", - "", - "", - 0 - ], - "KeyP": [ - "p", - "P", - "", - "", - 0 - ], - "KeyQ": [ - "q", - "Q", - "", - "", - 0 - ], - "KeyR": [ - "r", - "R", - "", - "", - 0 - ], - "KeyS": [ - "s", - "S", - "", - "", - 0 - ], - "KeyT": [ - "t", - "T", - "", - "", - 0 - ], - "KeyU": [ - "u", - "U", - "", - "", - 0 - ], - "KeyV": [ - "v", - "V", - "", - "", - 0 - ], - "KeyW": [ - "w", - "W", - "", - "", - 0 - ], - "KeyX": [ - "x", - "X", - "", - "", - 0 - ], - "KeyY": [ - "y", - "Y", - "", - "", - 0 - ], - "KeyZ": [ - "z", - "Z", - "", - "", - 0 - ], - "Digit1": [ - "1", - "!", - "", - "", - 0 - ], - "Digit2": [ - "2", - "\"", - "@", - "", - 0 - ], - "Digit3": [ - "3", - "#", - "£", - "", - 0 - ], - "Digit4": [ - "4", - "¤", - "$", - "", - 0 - ], - "Digit5": [ - "5", - "%", - "€", - "", - 0 - ], - "Digit6": [ - "6", - "&", - "", - "", - 0 - ], - "Digit7": [ - "7", - "/", - "{", - "", - 0 - ], - "Digit8": [ - "8", - "(", - "[", - "", - 0 - ], - "Digit9": [ - "9", - ")", - "]", - "", - 0 - ], - "Digit0": [ - "0", - "=", - "}", - "", - 0 - ], - "Minus": [ - "+", - "?", - "", - "", - 0 - ], - "Equal": [ - "\\", - "`", - "´", - "", - 0 - ], - "BracketLeft": [ - "å", - "Å", - "", - "", - 0 - ], - "BracketRight": [ - "¨", - "^", - "~", - "", - 0 - ], - "Backslash": [ - "'", - "*", - "", - "", - 0 - ], - "Semicolon": [ - "ø", - "Ø", - "", - "", - 0 - ], - "Quote": [ - "æ", - "Æ", - "", - "", - 0 - ], - "Backquote": [ - "|", - "§", - "", - "", - 0 - ], - "Comma": [ - ",", - ";", - "", - "", - 0 - ], - "Period": [ - ".", - ":", - "", - "", - 0 - ], - "Slash": [ - "-", - "_", - "", - "", - 0 - ] - } - }, - { - "language": "pl", - "platform": "win", - "entries": { - "KeyA": [ - "a", - "A", - "ą", - "Ą", - 0 - ], - "KeyB": [ - "b", - "B", - "", - "", - 0 - ], - "KeyC": [ - "c", - "C", - "ć", - "Ć", - 0 - ], - "KeyD": [ - "d", - "D", - "", - "", - 0 - ], - "KeyE": [ - "e", - "E", - "ę", - "Ę", - 0 - ], - "KeyF": [ - "f", - "F", - "", - "", - 0 - ], - "KeyG": [ - "g", - "G", - "", - "", - 0 - ], - "KeyH": [ - "h", - "H", - "", - "", - 0 - ], - "KeyI": [ - "i", - "I", - "", - "", - 0 - ], - "KeyJ": [ - "j", - "J", - "", - "", - 0 - ], - "KeyK": [ - "k", - "K", - "", - "", - 0 - ], - "KeyL": [ - "l", - "L", - "ł", - "Ł", - 0 - ], - "KeyM": [ - "m", - "M", - "", - "", - 0 - ], - "KeyN": [ - "n", - "N", - "ń", - "Ń", - 0 - ], - "KeyO": [ - "o", - "O", - "ó", - "Ó", - 0 - ], - "KeyP": [ - "p", - "P", - "", - "", - 0 - ], - "KeyQ": [ - "q", - "Q", - "", - "", - 0 - ], - "KeyR": [ - "r", - "R", - "", - "", - 0 - ], - "KeyS": [ - "s", - "S", - "ś", - "Ś", - 0 - ], - "KeyT": [ - "t", - "T", - "", - "", - 0 - ], - "KeyU": [ - "u", - "U", - "€", - "", - 0 - ], - "KeyV": [ - "v", - "V", - "", - "", - 0 - ], - "KeyW": [ - "w", - "W", - "", - "", - 0 - ], - "KeyX": [ - "x", - "X", - "ź", - "Ź", - 0 - ], - "KeyY": [ - "y", - "Y", - "", - "", - 0 - ], - "KeyZ": [ - "z", - "Z", - "ż", - "Ż", - 0 - ], - "Digit1": [ - "1", - "!", - "", - "", - 0 - ], - "Digit2": [ - "2", - "@", - "", - "", - 0 - ], - "Digit3": [ - "3", - "#", - "", - "", - 0 - ], - "Digit4": [ - "4", - "$", - "", - "", - 0 - ], - "Digit5": [ - "5", - "%", - "", - "", - 0 - ], - "Digit6": [ - "6", - "^", - "", - "", - 0 - ], - "Digit7": [ - "7", - "&", - "", - "", - 0 - ], - "Digit8": [ - "8", - "*", - "", - "", - 0 - ], - "Digit9": [ - "9", - "(", - "", - "", - 0 - ], - "Digit0": [ - "0", - ")", - "", - "", - 0 - ], - "Minus": [ - "-", - "_", - "", - "", - 0 - ], - "Equal": [ - "=", - "+", - "", - "", - 0 - ], - "BracketLeft": [ - "[", - "{", - "", - "", - 0 - ], - "BracketRight": [ - "]", - "}", - "", - "", - 0 - ], - "Backslash": [ - "\\", - "|", - "", - "", - 0 - ], - "Semicolon": [ - ";", - ":", - "", - "", - 0 - ], - "Quote": [ - "'", - "\"", - "", - "", - 0 - ], - "Backquote": [ - "`", - "~", - "", - "", - 0 - ], - "Comma": [ - ",", - "<", - "", - "", - 0 - ], - "Period": [ - ".", - ">", - "", - "", - 0 - ], - "Slash": [ - "/", - "?", - "", - "", - 0 - ] - } - }, - { - "language": "pl", - "platform": "darwin", - "entries": { - "KeyA": [ - "a", - "A", - "ą", - "Ą", - 0 - ], - "KeyB": [ - "b", - "B", - "ļ", - "ű", - 0 - ], - "KeyC": [ - "c", - "C", - "ć", - "Ć", - 0 - ], - "KeyD": [ - "d", - "D", - "∂", - "Ž", - 0 - ], - "KeyE": [ - "e", - "E", - "ę", - "Ę", - 0 - ], - "KeyF": [ - "f", - "F", - "ń", - "ž", - 0 - ], - "KeyG": [ - "g", - "G", - "©", - "Ū", - 0 - ], - "KeyH": [ - "h", - "H", - "ķ", - "Ó", - 0 - ], - "KeyI": [ - "i", - "I", - "^", - "ť", - 4 - ], - "KeyJ": [ - "j", - "J", - "∆", - "Ô", - 0 - ], - "KeyK": [ - "k", - "K", - "Ż", - "ū", - 0 - ], - "KeyL": [ - "l", - "L", - "ł", - "Ł", - 0 - ], - "KeyM": [ - "m", - "M", - "Ķ", - "ų", - 0 - ], - "KeyN": [ - "n", - "N", - "ń", - "Ń", - 0 - ], - "KeyO": [ - "o", - "O", - "ó", - "Ó", - 0 - ], - "KeyP": [ - "p", - "P", - "Ļ", - "ł", - 0 - ], - "KeyQ": [ - "q", - "Q", - "Ō", - "ő", - 0 - ], - "KeyR": [ - "r", - "R", - "®", - "£", - 0 - ], - "KeyS": [ - "s", - "S", - "ś", - "Ś", - 0 - ], - "KeyT": [ - "t", - "T", - "†", - "ś", - 0 - ], - "KeyU": [ - "u", - "U", - "¨", - "Ť", - 4 - ], - "KeyV": [ - "v", - "V", - "√", - "◊", - 0 - ], - "KeyW": [ - "w", - "W", - "∑", - "„", - 0 - ], - "KeyX": [ - "x", - "X", - "ź", - "Ź", - 0 - ], - "KeyY": [ - "y", - "Y", - "ī", - "Á", - 0 - ], - "KeyZ": [ - "z", - "Z", - "ż", - "Ż", - 0 - ], - "Digit1": [ - "1", - "!", - "Ń", - "ŕ", - 0 - ], - "Digit2": [ - "2", - "@", - "™", - "Ř", - 0 - ], - "Digit3": [ - "3", - "#", - "€", - "‹", - 0 - ], - "Digit4": [ - "4", - "$", - "ß", - "›", - 0 - ], - "Digit5": [ - "5", - "%", - "į", - "ř", - 0 - ], - "Digit6": [ - "6", - "^", - "§", - "Ŗ", - 0 - ], - "Digit7": [ - "7", - "&", - "¶", - "ŗ", - 0 - ], - "Digit8": [ - "8", - "*", - "•", - "°", - 0 - ], - "Digit9": [ - "9", - "(", - "Ľ", - "Š", - 0 - ], - "Digit0": [ - "0", - ")", - "ľ", - "‚", - 0 - ], - "Minus": [ - "-", - "_", - "–", - "—", - 0 - ], - "Equal": [ - "=", - "+", - "≠", - "Ī", - 0 - ], - "BracketLeft": [ - "[", - "{", - "„", - "”", - 0 - ], - "BracketRight": [ - "]", - "}", - "‚", - "’", - 0 - ], - "Backslash": [ - "\\", - "|", - "«", - "»", - 0 - ], - "Semicolon": [ - ";", - ":", - "…", - "Ú", - 0 - ], - "Quote": [ - "'", - "\"", - "ĺ", - "ģ", - 0 - ], - "Backquote": [ - "`", - "~", - "`", - "Ŕ", - 4 - ], - "Comma": [ - ",", - "<", - "≤", - "Ý", - 0 - ], - "Period": [ - ".", - ">", - "≥", - "ý", - 0 - ], - "Slash": [ - "/", - "?", - "÷", - "ņ", - 0 - ] - } - }, - { - "language": "pt", - "platform": "win", - "entries": { - "KeyA": [ - "a", - "A", - "", - "", - 0 - ], - "KeyB": [ - "b", - "B", - "", - "", - 0 - ], - "KeyC": [ - "c", - "C", - "", - "", - 0 - ], - "KeyD": [ - "d", - "D", - "", - "", - 0 - ], - "KeyE": [ - "e", - "E", - "€", - "", - 0 - ], - "KeyF": [ - "f", - "F", - "", - "", - 0 - ], - "KeyG": [ - "g", - "G", - "", - "", - 0 - ], - "KeyH": [ - "h", - "H", - "", - "", - 0 - ], - "KeyI": [ - "i", - "I", - "", - "", - 0 - ], - "KeyJ": [ - "j", - "J", - "", - "", - 0 - ], - "KeyK": [ - "k", - "K", - "", - "", - 0 - ], - "KeyL": [ - "l", - "L", - "", - "", - 0 - ], - "KeyM": [ - "m", - "M", - "", - "", - 0 - ], - "KeyN": [ - "n", - "N", - "", - "", - 0 - ], - "KeyO": [ - "o", - "O", - "", - "", - 0 - ], - "KeyP": [ - "p", - "P", - "", - "", - 0 - ], - "KeyQ": [ - "q", - "Q", - "", - "", - 0 - ], - "KeyR": [ - "r", - "R", - "", - "", - 0 - ], - "KeyS": [ - "s", - "S", - "", - "", - 0 - ], - "KeyT": [ - "t", - "T", - "", - "", - 0 - ], - "KeyU": [ - "u", - "U", - "", - "", - 0 - ], - "KeyV": [ - "v", - "V", - "", - "", - 0 - ], - "KeyW": [ - "w", - "W", - "", - "", - 0 - ], - "KeyX": [ - "x", - "X", - "", - "", - 0 - ], - "KeyY": [ - "y", - "Y", - "", - "", - 0 - ], - "KeyZ": [ - "z", - "Z", - "", - "", - 0 - ], - "Digit1": [ - "1", - "!", - "", - "", - 0 - ], - "Digit2": [ - "2", - "\"", - "@", - "", - 0 - ], - "Digit3": [ - "3", - "#", - "£", - "", - 0 - ], - "Digit4": [ - "4", - "$", - "§", - "", - 0 - ], - "Digit5": [ - "5", - "%", - "€", - "", - 0 - ], - "Digit6": [ - "6", - "&", - "", - "", - 0 - ], - "Digit7": [ - "7", - "/", - "{", - "", - 0 - ], - "Digit8": [ - "8", - "(", - "[", - "", - 0 - ], - "Digit9": [ - "9", - ")", - "]", - "", - 0 - ], - "Digit0": [ - "0", - "=", - "}", - "", - 0 - ], - "Minus": [ - "'", - "?", - "", - "", - 0 - ], - "Equal": [ - "«", - "»", - "", - "", - 0 - ], - "BracketLeft": [ - "+", - "*", - "¨", - "", - 0 - ], - "BracketRight": [ - "´", - "`", - "]", - "", - 0 - ], - "Backslash": [ - "~", - "^", - "", - "", - 0 - ], - "Semicolon": [ - "ç", - "Ç", - "", - "", - 0 - ], - "Quote": [ - "º", - "ª", - "", - "", - 0 - ], - "Backquote": [ - "\\", - "|", - "", - "", - 0 - ], - "Comma": [ - ",", - ";", - "", - "", - 0 - ], - "Period": [ - ".", - ":", - "", - "", - 0 - ], - "Slash": [ - "-", - "_", - "", - "", - 0 - ] - } - }, - { - "language": "pt", - "platform": "darwin", - "entries": { - "KeyA": [ - "a", - "A", - "å", - "Å", - 0 - ], - "KeyB": [ - "b", - "B", - "∫", - "ı", - 0 - ], - "KeyC": [ - "c", - "C", - "ç", - "Ç", - 0 - ], - "KeyD": [ - "d", - "D", - "∂", - "Î", - 0 - ], - "KeyE": [ - "e", - "E", - "´", - "´", - 4 - ], - "KeyF": [ - "f", - "F", - "ƒ", - "Ï", - 0 - ], - "KeyG": [ - "g", - "G", - "©", - "˝", - 0 - ], - "KeyH": [ - "h", - "H", - "˙", - "Ó", - 0 - ], - "KeyI": [ - "i", - "I", - "ˆ", - "ˆ", - 4 - ], - "KeyJ": [ - "j", - "J", - "∆", - "Ô", - 0 - ], - "KeyK": [ - "k", - "K", - "˚", - "", - 0 - ], - "KeyL": [ - "l", - "L", - "¬", - "Ò", - 0 - ], - "KeyM": [ - "m", - "M", - "µ", - "Â", - 0 - ], - "KeyN": [ - "n", - "N", - "˜", - "˜", - 4 - ], - "KeyO": [ - "o", - "O", - "ø", - "Ø", - 0 - ], - "KeyP": [ - "p", - "P", - "π", - "∏", - 0 - ], - "KeyQ": [ - "q", - "Q", - "œ", - "Œ", - 0 - ], - "KeyR": [ - "r", - "R", - "®", - "‰", - 0 - ], - "KeyS": [ - "s", - "S", - "ß", - "Í", - 0 - ], - "KeyT": [ - "t", - "T", - "†", - "ˇ", - 0 - ], - "KeyU": [ - "u", - "U", - "¨", - "¨", - 4 - ], - "KeyV": [ - "v", - "V", - "√", - "◊", - 0 - ], - "KeyW": [ - "w", - "W", - "∑", - "„", - 0 - ], - "KeyX": [ - "x", - "X", - "≈", - "˛", - 0 - ], - "KeyY": [ - "y", - "Y", - "¥", - "Á", - 0 - ], - "KeyZ": [ - "z", - "Z", - "Ω", - "¸", - 0 - ], - "Digit1": [ - "1", - "!", - "¡", - "⁄", - 0 - ], - "Digit2": [ - "2", - "@", - "™", - "€", - 0 - ], - "Digit3": [ - "3", - "#", - "£", - "‹", - 0 - ], - "Digit4": [ - "4", - "$", - "¢", - "›", - 0 - ], - "Digit5": [ - "5", - "%", - "∞", - "fi", - 0 - ], - "Digit6": [ - "6", - "ˆ", - "§", - "fl", - 2 - ], - "Digit7": [ - "7", - "&", - "¶", - "‡", - 0 - ], - "Digit8": [ - "8", - "*", - "•", - "°", - 0 - ], - "Digit9": [ - "9", - "(", - "ª", - "·", - 0 - ], - "Digit0": [ - "0", - ")", - "º", - "‚", - 0 - ], - "Minus": [ - "-", - "_", - "–", - "—", - 0 - ], - "Equal": [ - "=", - "+", - "≠", - "±", - 0 - ], - "BracketLeft": [ - "[", - "{", - "“", - "”", - 0 - ], - "BracketRight": [ - "]", - "}", - "‘", - "’", - 0 - ], - "Backslash": [ - "\\", - "|", - "«", - "»", - 0 - ], - "Semicolon": [ - ";", - ":", - "…", - "Ú", - 0 - ], - "Quote": [ - "'", - "\"", - "æ", - "Æ", - 3 - ], - "Backquote": [ - "`", - "˜", - "`", - "`", - 7 - ], - "Comma": [ - ",", - "<", - "≤", - "¯", - 0 - ], - "Period": [ - ".", - ">", - "≥", - "˘", - 0 - ], - "Slash": [ - "/", - "?", - "÷", - "¿", - 0 - ] - } - }, - { - "language": "pt-br", - "platform": "win", - "entries": { - "KeyA": [ - "a", - "A", - "", - "", - 0 - ], - "KeyB": [ - "b", - "B", - "", - "", - 0 - ], - "KeyC": [ - "c", - "C", - "₢", - "", - 0 - ], - "KeyD": [ - "d", - "D", - "", - "", - 0 - ], - "KeyE": [ - "e", - "E", - "°", - "", - 0 - ], - "KeyF": [ - "f", - "F", - "", - "", - 0 - ], - "KeyG": [ - "g", - "G", - "", - "", - 0 - ], - "KeyH": [ - "h", - "H", - "", - "", - 0 - ], - "KeyI": [ - "i", - "I", - "", - "", - 0 - ], - "KeyJ": [ - "j", - "J", - "", - "", - 0 - ], - "KeyK": [ - "k", - "K", - "", - "", - 0 - ], - "KeyL": [ - "l", - "L", - "", - "", - 0 - ], - "KeyM": [ - "m", - "M", - "", - "", - 0 - ], - "KeyN": [ - "n", - "N", - "", - "", - 0 - ], - "KeyO": [ - "o", - "O", - "", - "", - 0 - ], - "KeyP": [ - "p", - "P", - "", - "", - 0 - ], - "KeyQ": [ - "q", - "Q", - "/", - "", - 0 - ], - "KeyR": [ - "r", - "R", - "", - "", - 0 - ], - "KeyS": [ - "s", - "S", - "", - "", - 0 - ], - "KeyT": [ - "t", - "T", - "", - "", - 0 - ], - "KeyU": [ - "u", - "U", - "", - "", - 0 - ], - "KeyV": [ - "v", - "V", - "", - "", - 0 - ], - "KeyW": [ - "w", - "W", - "?", - "", - 0 - ], - "KeyX": [ - "x", - "X", - "", - "", - 0 - ], - "KeyY": [ - "y", - "Y", - "", - "", - 0 - ], - "KeyZ": [ - "z", - "Z", - "", - "", - 0 - ], - "Digit1": [ - "1", - "!", - "¹", - "", - 0 - ], - "Digit2": [ - "2", - "@", - "²", - "", - 0 - ], - "Digit3": [ - "3", - "#", - "³", - "", - 0 - ], - "Digit4": [ - "4", - "$", - "£", - "", - 0 - ], - "Digit5": [ - "5", - "%", - "¢", - "", - 0 - ], - "Digit6": [ - "6", - "¨", - "¬", - "", - 0 - ], - "Digit7": [ - "7", - "&", - "", - "", - 0 - ], - "Digit8": [ - "8", - "*", - "", - "", - 0 - ], - "Digit9": [ - "9", - "(", - "", - "", - 0 - ], - "Digit0": [ - "0", - ")", - "", - "", - 0 - ], - "Minus": [ - "-", - "_", - "", - "", - 0 - ], - "Equal": [ - "=", - "+", - "§", - "", - 0 - ], - "BracketLeft": [ - "´", - "`", - "", - "", - 0 - ], - "BracketRight": [ - "[", - "{", - "ª", - "", - 0 - ], - "Backslash": [ - "]", - "}", - "º", - "", - 0 - ], - "Semicolon": [ - "ç", - "Ç", - "", - "", - 0 - ], - "Quote": [ - "~", - "^", - "", - "", - 0 - ], - "Backquote": [ - "'", - "\"", - "", - "", - 0 - ], - "Comma": [ - ",", - "<", - "", - "", - 0 - ], - "Period": [ - ".", - ">", - "", - "", - 0 - ], - "Slash": [ - ";", - ":", - "", - "", - 0 - ] - } - }, - { - "language": "ru", - "platform": "win", - "entries": { - "KeyA": [ - "ф", - "Ф", - "", - "", - 0 - ], - "KeyB": [ - "и", - "И", - "", - "", - 0 - ], - "KeyC": [ - "с", - "С", - "", - "", - 0 - ], - "KeyD": [ - "в", - "В", - "", - "", - 0 - ], - "KeyE": [ - "у", - "У", - "", - "", - 0 - ], - "KeyF": [ - "а", - "А", - "", - "", - 0 - ], - "KeyG": [ - "п", - "П", - "", - "", - 0 - ], - "KeyH": [ - "р", - "Р", - "", - "", - 0 - ], - "KeyI": [ - "ш", - "Ш", - "", - "", - 0 - ], - "KeyJ": [ - "о", - "О", - "", - "", - 0 - ], - "KeyK": [ - "л", - "Л", - "", - "", - 0 - ], - "KeyL": [ - "д", - "Д", - "", - "", - 0 - ], - "KeyM": [ - "ь", - "Ь", - "", - "", - 0 - ], - "KeyN": [ - "т", - "Т", - "", - "", - 0 - ], - "KeyO": [ - "щ", - "Щ", - "", - "", - 0 - ], - "KeyP": [ - "з", - "З", - "", - "", - 0 - ], - "KeyQ": [ - "й", - "Й", - "", - "", - 0 - ], - "KeyR": [ - "к", - "К", - "", - "", - 0 - ], - "KeyS": [ - "ы", - "Ы", - "", - "", - 0 - ], - "KeyT": [ - "е", - "Е", - "", - "", - 0 - ], - "KeyU": [ - "г", - "Г", - "", - "", - 0 - ], - "KeyV": [ - "м", - "М", - "", - "", - 0 - ], - "KeyW": [ - "ц", - "Ц", - "", - "", - 0 - ], - "KeyX": [ - "ч", - "Ч", - "", - "", - 0 - ], - "KeyY": [ - "н", - "Н", - "", - "", - 0 - ], - "KeyZ": [ - "я", - "Я", - "", - "", - 0 - ], - "Digit1": [ - "1", - "!", - "", - "", - 0 - ], - "Digit2": [ - "2", - "\"", - "", - "", - 0 - ], - "Digit3": [ - "3", - "№", - "", - "", - 0 - ], - "Digit4": [ - "4", - ";", - "", - "", - 0 - ], - "Digit5": [ - "5", - "%", - "", - "", - 0 - ], - "Digit6": [ - "6", - ":", - "", - "", - 0 - ], - "Digit7": [ - "7", - "?", - "", - "", - 0 - ], - "Digit8": [ - "8", - "*", - "₽", - "", - 0 - ], - "Digit9": [ - "9", - "(", - "", - "", - 0 - ], - "Digit0": [ - "0", - ")", - "", - "", - 0 - ], - "Minus": [ - "-", - "_", - "", - "", - 0 - ], - "Equal": [ - "=", - "+", - "", - "", - 0 - ], - "BracketLeft": [ - "х", - "Х", - "", - "", - 0 - ], - "BracketRight": [ - "ъ", - "Ъ", - "", - "", - 0 - ], - "Backslash": [ - "\\", - "/", - "", - "", - 0 - ], - "Semicolon": [ - "ж", - "Ж", - "", - "", - 0 - ], - "Quote": [ - "э", - "Э", - "", - "", - 0 - ], - "Backquote": [ - "ё", - "Ё", - "", - "", - 0 - ], - "Comma": [ - "б", - "Б", - "", - "", - 0 - ], - "Period": [ - "ю", - "Ю", - "", - "", - 0 - ], - "Slash": [ - ".", - ",", - "", - "", - 0 - ] - } - }, - { - "language": "ru", - "platform": "linux", - "entries": { - "KeyA": [ - "ф", - "Ф", - "ф", - "Ф", - 0 - ], - "KeyB": [ - "и", - "И", - "и", - "И", - 0 - ], - "KeyC": [ - "с", - "С", - "с", - "С", - 0 - ], - "KeyD": [ - "в", - "В", - "в", - "В", - 0 - ], - "KeyE": [ - "у", - "У", - "у", - "У", - 0 - ], - "KeyF": [ - "а", - "А", - "а", - "А", - 0 - ], - "KeyG": [ - "п", - "П", - "п", - "П", - 0 - ], - "KeyH": [ - "р", - "Р", - "р", - "Р", - 0 - ], - "KeyI": [ - "ш", - "Ш", - "ш", - "Ш", - 0 - ], - "KeyJ": [ - "о", - "О", - "о", - "О", - 0 - ], - "KeyK": [ - "л", - "Л", - "л", - "Л", - 0 - ], - "KeyL": [ - "д", - "Д", - "д", - "Д", - 0 - ], - "KeyM": [ - "ь", - "Ь", - "ь", - "Ь", - 0 - ], - "KeyN": [ - "т", - "Т", - "т", - "Т", - 0 - ], - "KeyO": [ - "щ", - "Щ", - "щ", - "Щ", - 0 - ], - "KeyP": [ - "з", - "З", - "з", - "З", - 0 - ], - "KeyQ": [ - "й", - "Й", - "й", - "Й", - 0 - ], - "KeyR": [ - "к", - "К", - "к", - "К", - 0 - ], - "KeyS": [ - "ы", - "Ы", - "ы", - "Ы", - 0 - ], - "KeyT": [ - "е", - "Е", - "е", - "Е", - 0 - ], - "KeyU": [ - "г", - "Г", - "г", - "Г", - 0 - ], - "KeyV": [ - "м", - "М", - "м", - "М", - 0 - ], - "KeyW": [ - "ц", - "Ц", - "ц", - "Ц", - 0 - ], - "KeyX": [ - "ч", - "Ч", - "ч", - "Ч", - 0 - ], - "KeyY": [ - "н", - "Н", - "н", - "Н", - 0 - ], - "KeyZ": [ - "я", - "Я", - "я", - "Я", - 0 - ], - "Digit1": [ - "1", - "!", - "1", - "!", - 0 - ], - "Digit2": [ - "2", - "\"", - "2", - "\"", - 0 - ], - "Digit3": [ - "3", - "№", - "3", - "№", - 0 - ], - "Digit4": [ - "4", - ";", - "4", - ";", - 0 - ], - "Digit5": [ - "5", - "%", - "5", - "%", - 0 - ], - "Digit6": [ - "6", - ":", - "6", - ":", - 0 - ], - "Digit7": [ - "7", - "?", - "7", - "?", - 0 - ], - "Digit8": [ - "8", - "*", - "₽", - "", - 0 - ], - "Digit9": [ - "9", - "(", - "9", - "(", - 0 - ], - "Digit0": [ - "0", - ")", - "0", - ")", - 0 - ], - "Minus": [ - "-", - "_", - "-", - "_", - 0 - ], - "Equal": [ - "=", - "+", - "=", - "+", - 0 - ], - "BracketLeft": [ - "х", - "Х", - "х", - "Х", - 0 - ], - "BracketRight": [ - "ъ", - "Ъ", - "ъ", - "Ъ", - 0 - ], - "Backslash": [ - "\\", - "/", - "\\", - "/", - 0 - ], - "Semicolon": [ - "ж", - "Ж", - "ж", - "Ж", - 0 - ], - "Quote": [ - "э", - "Э", - "э", - "Э", - 0 - ], - "Backquote": [ - "ё", - "Ё", - "ё", - "Ё", - 0 - ], - "Comma": [ - "б", - "Б", - "б", - "Б", - 0 - ], - "Period": [ - "ю", - "Ю", - "ю", - "Ю", - 0 - ], - "Slash": [ - ".", - ",", - ".", - ",", - 0 - ] - } - }, - { - "language": "ru", - "platform": "darwin", - "entries": { - "KeyA": [ - "ф", - "Ф", - "ƒ", - "ƒ", - 0 - ], - "KeyB": [ - "и", - "И", - "и", - "И", - 0 - ], - "KeyC": [ - "с", - "С", - "≠", - "≠", - 0 - ], - "KeyD": [ - "в", - "В", - "ћ", - "Ћ", - 0 - ], - "KeyE": [ - "у", - "У", - "ќ", - "Ќ", - 0 - ], - "KeyF": [ - "а", - "А", - "÷", - "÷", - 0 - ], - "KeyG": [ - "п", - "П", - "©", - "©", - 0 - ], - "KeyH": [ - "р", - "Р", - "₽", - "₽", - 0 - ], - "KeyI": [ - "ш", - "Ш", - "ѕ", - "Ѕ", - 0 - ], - "KeyJ": [ - "о", - "О", - "°", - "•", - 0 - ], - "KeyK": [ - "л", - "Л", - "љ", - "Љ", - 0 - ], - "KeyL": [ - "д", - "Д", - "∆", - "∆", - 0 - ], - "KeyM": [ - "ь", - "Ь", - "~", - "~", - 0 - ], - "KeyN": [ - "т", - "Т", - "™", - "™", - 0 - ], - "KeyO": [ - "щ", - "Щ", - "ў", - "Ў", - 0 - ], - "KeyP": [ - "з", - "З", - "‘", - "’", - 0 - ], - "KeyQ": [ - "й", - "Й", - "ј", - "Ј", - 0 - ], - "KeyR": [ - "к", - "К", - "®", - "®", - 0 - ], - "KeyS": [ - "ы", - "Ы", - "ы", - "Ы", - 0 - ], - "KeyT": [ - "е", - "Е", - "†", - "†", - 0 - ], - "KeyU": [ - "г", - "Г", - "ѓ", - "Ѓ", - 0 - ], - "KeyV": [ - "м", - "М", - "µ", - "µ", - 0 - ], - "KeyW": [ - "ц", - "Ц", - "џ", - "Џ", - 0 - ], - "KeyX": [ - "ч", - "Ч", - "≈", - "≈", - 0 - ], - "KeyY": [ - "н", - "Н", - "њ", - "Њ", - 0 - ], - "KeyZ": [ - "я", - "Я", - "ђ", - "Ђ", - 0 - ], - "Digit1": [ - "1", - "!", - "!", - "|", - 0 - ], - "Digit2": [ - "2", - "\"", - "@", - "\"", - 0 - ], - "Digit3": [ - "3", - "№", - "#", - "£", - 0 - ], - "Digit4": [ - "4", - "%", - "$", - "€", - 0 - ], - "Digit5": [ - "5", - ":", - "%", - "∞", - 0 - ], - "Digit6": [ - "6", - ",", - "^", - "¬", - 0 - ], - "Digit7": [ - "7", - ".", - "&", - "¶", - 0 - ], - "Digit8": [ - "8", - ";", - "*", - "√", - 0 - ], - "Digit9": [ - "9", - "(", - "{", - "'", - 0 - ], - "Digit0": [ - "0", - ")", - "}", - "`", - 0 - ], - "Minus": [ - "-", - "_", - "–", - "—", - 0 - ], - "Equal": [ - "=", - "+", - "»", - "«", - 0 - ], - "BracketLeft": [ - "х", - "Х", - "“", - "”", - 0 - ], - "BracketRight": [ - "ъ", - "Ъ", - "ъ", - "Ъ", - 0 - ], - "Backslash": [ - "ё", - "Ё", - "ё", - "Ё", - 0 - ], - "Semicolon": [ - "ж", - "Ж", - "…", - "…", - 0 - ], - "Quote": [ - "э", - "Э", - "э", - "Э", - 0 - ], - "Backquote": [ - "]", - "[", - "]", - "[", - 0 - ], - "Comma": [ - "б", - "Б", - "≤", - "<", - 0 - ], - "Period": [ - "ю", - "Ю", - "≥", - ">", - 0 - ], - "Slash": [ - "/", - "?", - "“", - "„", - 0 - ] - } - }, - { - "language": "sv", - "platform": "win", - "entries": { - "KeyA": [ - "a", - "A", - "", - "", - 0 - ], - "KeyB": [ - "b", - "B", - "", - "", - 0 - ], - "KeyC": [ - "c", - "C", - "", - "", - 0 - ], - "KeyD": [ - "d", - "D", - "", - "", - 0 - ], - "KeyE": [ - "e", - "E", - "€", - "", - 0 - ], - "KeyF": [ - "f", - "F", - "", - "", - 0 - ], - "KeyG": [ - "g", - "G", - "", - "", - 0 - ], - "KeyH": [ - "h", - "H", - "", - "", - 0 - ], - "KeyI": [ - "i", - "I", - "", - "", - 0 - ], - "KeyJ": [ - "j", - "J", - "", - "", - 0 - ], - "KeyK": [ - "k", - "K", - "", - "", - 0 - ], - "KeyL": [ - "l", - "L", - "", - "", - 0 - ], - "KeyM": [ - "m", - "M", - "µ", - "", - 0 - ], - "KeyN": [ - "n", - "N", - "", - "", - 0 - ], - "KeyO": [ - "o", - "O", - "", - "", - 0 - ], - "KeyP": [ - "p", - "P", - "", - "", - 0 - ], - "KeyQ": [ - "q", - "Q", - "", - "", - 0 - ], - "KeyR": [ - "r", - "R", - "", - "", - 0 - ], - "KeyS": [ - "s", - "S", - "", - "", - 0 - ], - "KeyT": [ - "t", - "T", - "", - "", - 0 - ], - "KeyU": [ - "u", - "U", - "", - "", - 0 - ], - "KeyV": [ - "v", - "V", - "", - "", - 0 - ], - "KeyW": [ - "w", - "W", - "", - "", - 0 - ], - "KeyX": [ - "x", - "X", - "", - "", - 0 - ], - "KeyY": [ - "y", - "Y", - "", - "", - 0 - ], - "KeyZ": [ - "z", - "Z", - "", - "", - 0 - ], - "Digit1": [ - "1", - "!", - "", - "", - 0 - ], - "Digit2": [ - "2", - "\"", - "@", - "", - 0 - ], - "Digit3": [ - "3", - "#", - "£", - "", - 0 - ], - "Digit4": [ - "4", - "¤", - "$", - "", - 0 - ], - "Digit5": [ - "5", - "%", - "€", - "", - 0 - ], - "Digit6": [ - "6", - "&", - "", - "", - 0 - ], - "Digit7": [ - "7", - "/", - "{", - "", - 0 - ], - "Digit8": [ - "8", - "(", - "[", - "", - 0 - ], - "Digit9": [ - "9", - ")", - "]", - "", - 0 - ], - "Digit0": [ - "0", - "=", - "}", - "", - 0 - ], - "Minus": [ - "+", - "?", - "\\", - "", - 0 - ], - "Equal": [ - "´", - "`", - "", - "", - 0 - ], - "BracketLeft": [ - "å", - "Å", - "", - "", - 0 - ], - "BracketRight": [ - "¨", - "^", - "~", - "", - 0 - ], - "Backslash": [ - "'", - "*", - "", - "", - 0 - ], - "Semicolon": [ - "ö", - "Ö", - "", - "", - 0 - ], - "Quote": [ - "ä", - "Ä", - "", - "", - 0 - ], - "Backquote": [ - "§", - "½", - "", - "", - 0 - ], - "Comma": [ - ",", - ";", - "", - "", - 0 - ], - "Period": [ - ".", - ":", - "", - "", - 0 - ], - "Slash": [ - "-", - "_", - "", - "", - 0 - ] - } - }, - { - "language": "sv", - "platform": "darwin", - "entries": { - "KeyA": [ - "a", - "A", - "", - "◊", - 0 - ], - "KeyB": [ - "b", - "B", - "›", - "»", - 0 - ], - "KeyC": [ - "c", - "C", - "ç", - "Ç", - 0 - ], - "KeyD": [ - "d", - "D", - "∂", - "∆", - 0 - ], - "KeyE": [ - "e", - "E", - "é", - "É", - 0 - ], - "KeyF": [ - "f", - "F", - "ƒ", - "∫", - 0 - ], - "KeyG": [ - "g", - "G", - "¸", - "¯", - 0 - ], - "KeyH": [ - "h", - "H", - "˛", - "˘", - 0 - ], - "KeyI": [ - "i", - "I", - "ı", - "ˆ", - 0 - ], - "KeyJ": [ - "j", - "J", - "√", - "¬", - 0 - ], - "KeyK": [ - "k", - "K", - "ª", - "º", - 0 - ], - "KeyL": [ - "l", - "L", - "fi", - "fl", - 0 - ], - "KeyM": [ - "m", - "M", - "’", - "”", - 0 - ], - "KeyN": [ - "n", - "N", - "‘", - "“", - 0 - ], - "KeyO": [ - "o", - "O", - "œ", - "Œ", - 0 - ], - "KeyP": [ - "p", - "P", - "π", - "∏", - 0 - ], - "KeyQ": [ - "q", - "Q", - "•", - "°", - 0 - ], - "KeyR": [ - "r", - "R", - "®", - "√", - 0 - ], - "KeyS": [ - "s", - "S", - "ß", - "∑", - 0 - ], - "KeyT": [ - "t", - "T", - "†", - "‡", - 0 - ], - "KeyU": [ - "u", - "U", - "ü", - "Ü", - 0 - ], - "KeyV": [ - "v", - "V", - "‹", - "«", - 0 - ], - "KeyW": [ - "w", - "W", - "Ω", - "˝", - 0 - ], - "KeyX": [ - "x", - "X", - "≈", - "ˇ", - 0 - ], - "KeyY": [ - "y", - "Y", - "µ", - "˜", - 0 - ], - "KeyZ": [ - "z", - "Z", - "÷", - "⁄", - 0 - ], - "Digit1": [ - "1", - "!", - "©", - "¡", - 0 - ], - "Digit2": [ - "2", - "\"", - "@", - "”", - 0 - ], - "Digit3": [ - "3", - "#", - "£", - "¥", - 0 - ], - "Digit4": [ - "4", - "€", - "$", - "¢", - 0 - ], - "Digit5": [ - "5", - "%", - "∞", - "‰", - 0 - ], - "Digit6": [ - "6", - "&", - "§", - "¶", - 0 - ], - "Digit7": [ - "7", - "/", - "|", - "\\", - 0 - ], - "Digit8": [ - "8", - "(", - "[", - "{", - 0 - ], - "Digit9": [ - "9", - ")", - "]", - "}", - 0 - ], - "Digit0": [ - "0", - "=", - "≈", - "≠", - 0 - ], - "Minus": [ - "+", - "?", - "±", - "¿", - 0 - ], - "Equal": [ - "´", - "`", - "´", - "`", - 3 - ], - "BracketLeft": [ - "å", - "Å", - "˙", - "˚", - 0 - ], - "BracketRight": [ - "¨", - "^", - "~", - "^", - 7 - ], - "Backslash": [ - "'", - "*", - "™", - "’", - 0 - ], - "Semicolon": [ - "ö", - "Ö", - "ø", - "Ø", - 0 - ], - "Quote": [ - "ä", - "Ä", - "æ", - "Æ", - 0 - ], - "Backquote": [ - "<", - ">", - "≤", - "≥", - 0 - ], - "Comma": [ - ",", - ";", - "‚", - "„", - 0 - ], - "Period": [ - ".", - ":", - "…", - "·", - 0 - ], - "Slash": [ - "-", - "_", - "–", - "—", - 0 - ] - } - }, - { - "language": "thai", - "platform": "win", - "entries": { - "KeyA": [ - "ฟ", - "ฤ", - "", - "", - 0 - ], - "KeyB": [ - "ิ", - "ฺ", - "", - "", - 0 - ], - "KeyC": [ - "แ", - "ฉ", - "", - "", - 0 - ], - "KeyD": [ - "ก", - "ฏ", - "", - "", - 0 - ], - "KeyE": [ - "ำ", - "ฎ", - "", - "", - 0 - ], - "KeyF": [ - "ด", - "โ", - "", - "", - 0 - ], - "KeyG": [ - "เ", - "ฌ", - "", - "", - 0 - ], - "KeyH": [ - "้", - "็", - "", - "", - 0 - ], - "KeyI": [ - "ร", - "ณ", - "", - "", - 0 - ], - "KeyJ": [ - "่", - "๋", - "", - "", - 0 - ], - "KeyK": [ - "า", - "ษ", - "", - "", - 0 - ], - "KeyL": [ - "ส", - "ศ", - "", - "", - 0 - ], - "KeyM": [ - "ท", - "?", - "", - "", - 0 - ], - "KeyN": [ - "ื", - "์", - "", - "", - 0 - ], - "KeyO": [ - "น", - "ฯ", - "", - "", - 0 - ], - "KeyP": [ - "ย", - "ญ", - "", - "", - 0 - ], - "KeyQ": [ - "ๆ", - "๐", - "", - "", - 0 - ], - "KeyR": [ - "พ", - "ฑ", - "", - "", - 0 - ], - "KeyS": [ - "ห", - "ฆ", - "", - "", - 0 - ], - "KeyT": [ - "ะ", - "ธ", - "", - "", - 0 - ], - "KeyU": [ - "ี", - "๊", - "", - "", - 0 - ], - "KeyV": [ - "อ", - "ฮ", - "", - "", - 0 - ], - "KeyW": [ - "ไ", - "\"", - "", - "", - 0 - ], - "KeyX": [ - "ป", - ")", - "", - "", - 0 - ], - "KeyY": [ - "ั", - "ํ", - "", - "", - 0 - ], - "KeyZ": [ - "ผ", - "(", - "", - "", - 0 - ], - "Digit1": [ - "ๅ", - "+", - "", - "", - 0 - ], - "Digit2": [ - "/", - "๑", - "", - "", - 0 - ], - "Digit3": [ - "-", - "๒", - "", - "", - 0 - ], - "Digit4": [ - "ภ", - "๓", - "", - "", - 0 - ], - "Digit5": [ - "ถ", - "๔", - "", - "", - 0 - ], - "Digit6": [ - "ุ", - "ู", - "", - "", - 0 - ], - "Digit7": [ - "ึ", - "฿", - "", - "", - 0 - ], - "Digit8": [ - "ค", - "๕", - "", - "", - 0 - ], - "Digit9": [ - "ต", - "๖", - "", - "", - 0 - ], - "Digit0": [ - "จ", - "๗", - "", - "", - 0 - ], - "Minus": [ - "ข", - "๘", - "", - "", - 0 - ], - "Equal": [ - "ช", - "๙", - "", - "", - 0 - ], - "BracketLeft": [ - "บ", - "ฐ", - "", - "", - 0 - ], - "BracketRight": [ - "ล", - ",", - "", - "", - 0 - ], - "Backslash": [ - "ฃ", - "ฅ", - "", - "", - 0 - ], - "Semicolon": [ - "ว", - "ซ", - "", - "", - 0 - ], - "Quote": [ - "ง", - ".", - "", - "", - 0 - ], - "Backquote": [ - "_", - "%", - "", - "", - 0 - ], - "Comma": [ - "ม", - "ฒ", - "", - "", - 0 - ], - "Period": [ - "ใ", - "ฬ", - "", - "", - 0 - ], - "Slash": [ - "ฝ", - "ฦ", - "", - "", - 0 - ] - } - }, - { - "language": "tr", - "platform": "win", - "entries": { - "KeyA": [ - "a", - "A", - "æ", - "Æ", - 0 - ], - "KeyB": [ - "b", - "B", - "", - "", - 0 - ], - "KeyC": [ - "c", - "C", - "", - "", - 0 - ], - "KeyD": [ - "d", - "D", - "", - "", - 0 - ], - "KeyE": [ - "e", - "E", - "€", - "", - 0 - ], - "KeyF": [ - "f", - "F", - "", - "", - 0 - ], - "KeyG": [ - "g", - "G", - "", - "", - 0 - ], - "KeyH": [ - "h", - "H", - "", - "", - 0 - ], - "KeyI": [ - "ı", - "I", - "i", - "İ", - 0 - ], - "KeyJ": [ - "j", - "J", - "", - "", - 0 - ], - "KeyK": [ - "k", - "K", - "", - "", - 0 - ], - "KeyL": [ - "l", - "L", - "", - "", - 0 - ], - "KeyM": [ - "m", - "M", - "", - "", - 0 - ], - "KeyN": [ - "n", - "N", - "", - "", - 0 - ], - "KeyO": [ - "o", - "O", - "", - "", - 0 - ], - "KeyP": [ - "p", - "P", - "", - "", - 0 - ], - "KeyQ": [ - "q", - "Q", - "@", - "", - 0 - ], - "KeyR": [ - "r", - "R", - "", - "", - 0 - ], - "KeyS": [ - "s", - "S", - "ß", - "", - 0 - ], - "KeyT": [ - "t", - "T", - "₺", - "", - 0 - ], - "KeyU": [ - "u", - "U", - "", - "", - 0 - ], - "KeyV": [ - "v", - "V", - "", - "", - 0 - ], - "KeyW": [ - "w", - "W", - "", - "", - 0 - ], - "KeyX": [ - "x", - "X", - "", - "", - 0 - ], - "KeyY": [ - "y", - "Y", - "", - "", - 0 - ], - "KeyZ": [ - "z", - "Z", - "", - "", - 0 - ], - "Digit1": [ - "1", - "!", - ">", - "", - 0 - ], - "Digit2": [ - "2", - "'", - "£", - "", - 0 - ], - "Digit3": [ - "3", - "^", - "#", - "", - 0 - ], - "Digit4": [ - "4", - "+", - "$", - "", - 0 - ], - "Digit5": [ - "5", - "%", - "½", - "", - 0 - ], - "Digit6": [ - "6", - "&", - "", - "", - 0 - ], - "Digit7": [ - "7", - "/", - "{", - "", - 0 - ], - "Digit8": [ - "8", - "(", - "[", - "", - 0 - ], - "Digit9": [ - "9", - ")", - "]", - "", - 0 - ], - "Digit0": [ - "0", - "=", - "}", - "", - 0 - ], - "Minus": [ - "*", - "?", - "\\", - "", - 0 - ], - "Equal": [ - "-", - "_", - "|", - "", - 0 - ], - "BracketLeft": [ - "ğ", - "Ğ", - "¨", - "", - 0 - ], - "BracketRight": [ - "ü", - "Ü", - "~", - "", - 0 - ], - "Backslash": [ - ",", - ";", - "`", - "", - 0 - ], - "Semicolon": [ - "ş", - "Ş", - "´", - "", - 0 - ], - "Quote": [ - "i", - "İ", - "", - "", - 0 - ], - "Backquote": [ - "\"", - "é", - "<", - "", - 0 - ], - "Comma": [ - "ö", - "Ö", - "", - "", - 0 - ], - "Period": [ - "ç", - "Ç", - "", - "", - 0 - ], - "Slash": [ - ".", - ":", - "", - "", - 0 - ] - } - }, - { - "language": "zh-hans", - "platform": "darwin", - "entries": { - "KeyA": [ - "a", - "A", - "å", - "Å", - 0 - ], - "KeyB": [ - "b", - "B", - "∫", - "ı", - 0 - ], - "KeyC": [ - "c", - "C", - "ç", - "Ç", - 0 - ], - "KeyD": [ - "d", - "D", - "∂", - "Î", - 0 - ], - "KeyE": [ - "e", - "E", - "´", - "´", - 4 - ], - "KeyF": [ - "f", - "F", - "ƒ", - "Ï", - 0 - ], - "KeyG": [ - "g", - "G", - "©", - "˝", - 0 - ], - "KeyH": [ - "h", - "H", - "˙", - "Ó", - 0 - ], - "KeyI": [ - "i", - "I", - "ˆ", - "ˆ", - 4 - ], - "KeyJ": [ - "j", - "J", - "∆", - "Ô", - 0 - ], - "KeyK": [ - "k", - "K", - "˚", - "", - 0 - ], - "KeyL": [ - "l", - "L", - "¬", - "Ò", - 0 - ], - "KeyM": [ - "m", - "M", - "µ", - "Â", - 0 - ], - "KeyN": [ - "n", - "N", - "˜", - "˜", - 4 - ], - "KeyO": [ - "o", - "O", - "ø", - "Ø", - 0 - ], - "KeyP": [ - "p", - "P", - "π", - "∏", - 0 - ], - "KeyQ": [ - "q", - "Q", - "œ", - "Œ", - 0 - ], - "KeyR": [ - "r", - "R", - "®", - "‰", - 0 - ], - "KeyS": [ - "s", - "S", - "ß", - "Í", - 0 - ], - "KeyT": [ - "t", - "T", - "†", - "ˇ", - 0 - ], - "KeyU": [ - "u", - "U", - "¨", - "¨", - 4 - ], - "KeyV": [ - "v", - "V", - "√", - "◊", - 0 - ], - "KeyW": [ - "w", - "W", - "∑", - "„", - 0 - ], - "KeyX": [ - "x", - "X", - "≈", - "˛", - 0 - ], - "KeyY": [ - "y", - "Y", - "¥", - "Á", - 0 - ], - "KeyZ": [ - "z", - "Z", - "Ω", - "¸", - 0 - ], - "Digit1": [ - "1", - "!", - "¡", - "⁄", - 0 - ], - "Digit2": [ - "2", - "@", - "™", - "€", - 0 - ], - "Digit3": [ - "3", - "#", - "£", - "‹", - 0 - ], - "Digit4": [ - "4", - "¥", - "¢", - "›", - 0 - ], - "Digit5": [ - "5", - "%", - "∞", - "fi", - 0 - ], - "Digit6": [ - "6", - "", - "§", - "fl", - 0 - ], - "Digit7": [ - "7", - "&", - "¶", - "‡", - 0 - ], - "Digit8": [ - "8", - "*", - "•", - "°", - 0 - ], - "Digit9": [ - "9", - "(", - "ª", - "·", - 0 - ], - "Digit0": [ - "0", - ")", - "º", - "‚", - 0 - ], - "Minus": [ - "-", - "", - "–", - "—", - 0 - ], - "Equal": [ - "=", - "+", - "≠", - "±", - 0 - ], - "BracketLeft": [ - "【", - "「", - "“", - "”", - 0 - ], - "BracketRight": [ - "】", - "」", - "‘", - "’", - 0 - ], - "Backslash": [ - "、", - "|", - "«", - "»", - 0 - ], - "Semicolon": [ - ";", - ":", - "…", - "Ú", - 0 - ], - "Quote": [ - "'", - "\"", - "æ", - "Æ", - 0 - ], - "Backquote": [ - "·", - "~", - "`", - "`", - 4 - ], - "Comma": [ - ",", - "《", - "≤", - "¯", - 0 - ], - "Period": [ - "。", - "》", - "≥", - "˘", - 0 - ], - "Slash": [ - "/", - "?", - "÷", - "¿", - 0 - ] - } - } - ] -} \ No newline at end of file diff --git a/tools/gen_web_keyboard_layouts/data/types.dart.tmpl b/tools/gen_web_keyboard_layouts/data/types.dart.tmpl deleted file mode 100644 index 9a2723e2118e6..0000000000000 --- a/tools/gen_web_keyboard_layouts/data/types.dart.tmpl +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -// DO NOT EDIT -- DO NOT EDIT -- DO NOT EDIT -// -// This file is auto generated by flutter/engine:flutter/tools/gen_web_keyboard_layouts based on -// layout_types.dart in the same pacakge. -// -// Edit the following files instead: -// -// - Script: lib/main.dart -// - Templates: data/*.tmpl -// -// See flutter/engine:flutter/tools/gen_web_keyboard_layouts/README.md for more information. - -part of web_keyboard_layouts; -@@@BODY@@@ diff --git a/tools/gen_web_keyboard_layouts/lib/benchmark_detector.dart b/tools/gen_web_keyboard_layouts/lib/benchmark_detector.dart index c528e507700d6..efe4c966afc16 100644 --- a/tools/gen_web_keyboard_layouts/lib/benchmark_detector.dart +++ b/tools/gen_web_keyboard_layouts/lib/benchmark_detector.dart @@ -12,11 +12,11 @@ final Map _kMandatoryGoalsByChar = Map.fromEntri .map((MapEntry entry) => MapEntry(entry.value!, entry.key)) ); -/// Returns a mapping from eventCode to logical key for this layout. +/// Plan a layout into a map from eventCode to logical key. /// /// If a eventCode does not exist in this map, then this event's logical key /// should be derived on the fly. -Map buildLayout(Map entries) { +Map planLayout(Map entries) { // The logical key is derived in the following rules: // // 1. If any clue (the four possible printables) of the key is a mandatory @@ -55,17 +55,19 @@ bool _isLetterOrMappedToKeyCode(int charCode) { return isLetterChar(charCode) || charCode == kUseKeyCode; } -/// Summarize all layouts into a huge table of EventCode -> EventKey -> -/// logicalKey. +/// Plan all layouts, and summarize them into a huge table of EventCode -> +/// EventKey -> logicalKey. /// /// The resulting logicalKey can also be kUseKeyCode. /// /// If a eventCode does not exist in this map, then this event's logical key /// should be derived on the fly. -Map> buildMap(Iterable layouts) { +/// +/// Entries that can be derived using heuristics are omitted. +Map> combineLayouts(Iterable layouts) { final Map> result = >{}; for (final Layout layout in layouts) { - buildLayout(layout.entries).forEach((String eventCode, int logicalKey) { + planLayout(layout.entries).forEach((String eventCode, int logicalKey) { final Map codeMap = result.putIfAbsent(eventCode, () => {}); final LayoutEntry entry = layout.entries[eventCode]!; for (final String eventKey in entry.printables) { diff --git a/tools/gen_web_keyboard_layouts/lib/layout_types.dart b/tools/gen_web_keyboard_layouts/lib/layout_types.dart index 74c87f5b159bb..d7e48ffa5932f 100644 --- a/tools/gen_web_keyboard_layouts/lib/layout_types.dart +++ b/tools/gen_web_keyboard_layouts/lib/layout_types.dart @@ -42,6 +42,7 @@ class LayoutEntry { static final LayoutEntry empty = LayoutEntry( const ['', '', '', '']); + /// The value of KeyboardEvent.key for dead keys. static const String kDeadKey = 'Dead'; } diff --git a/tools/gen_web_keyboard_layouts/lib/main.dart b/tools/gen_web_keyboard_layouts/lib/main.dart deleted file mode 100644 index 79c8a29282831..0000000000000 --- a/tools/gen_web_keyboard_layouts/lib/main.dart +++ /dev/null @@ -1,202 +0,0 @@ -// Copyright 2014 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - - -import 'dart:io'; -import 'package:meta/meta.dart' show immutable; -import 'package:path/path.dart' as path; - -import 'benchmark_detector.dart'; -import 'github.dart'; -import 'layout_types.dart'; - -@immutable -class Options { - /// Build an option. - const Options({ - required this.force, - required this.githubToken, - required this.cacheRoot, - required this.dataRoot, - required this.libRoot, - required this.outputRoot, - }); - - final bool force; - - /// The GitHub personal access token used to make the GitHub request. - final String githubToken; - - /// The path of the folder that store cache. - final String cacheRoot; - - /// The path of the folder that store data files, such as templates. - final String dataRoot; - - /// The path of the folder that store input lib files, typically the folder - /// that contains this file. - final String libRoot; - - /// The folder to store the output Dart files. - final String outputRoot; -} - -String _renderTemplate( - String template, Map dictionary) { - String result = template; - dictionary.forEach((String key, String value) { - final String localResult = result.replaceAll('@@@$key@@@', value); - if (localResult == result) { - print('Template key $key is not used.'); - } - result = localResult; - }); - return result; -} - -void _writeFileTo( - String outputDir, - String outputFileName, - String body) { - final String outputPath = path.join(outputDir, outputFileName); - Directory(outputDir).createSync(recursive: true); - File(outputPath).writeAsStringSync(body); -} - - -String _prettyPrintBody(String body, int width) { - int min(int a, int b) { - return a < b ? a : b; - } - final List result = []; - int start = 0; - while (start < body.length) { - final String row = body.substring(start, min(body.length, start + width)); - result.add(" '$row'"); - start += width; - } - return result.join('\n'); -} - -String _readSharedSegment(String path) { - const String kSegmentStartMark = '/*@@@ SHARED SEGMENT START @@@*/'; - const String kSegmentEndMark = '/*@@@ SHARED SEGMENT END @@@*/'; - final List lines = File(path).readAsStringSync().split('\n'); - // Defining the two variables as `late final` ensures that each mark is found - // once and only once, otherwise assertion errors will be thrown. - late final int startLine; - late final int endLine; - for (int lineNo = 0; lineNo < lines.length; lineNo += 1) { - if (lines[lineNo] == kSegmentStartMark) { - startLine = lineNo; - } else if (lines[lineNo] == kSegmentEndMark) { - endLine = lineNo; - } - } - assert(startLine < endLine); - return lines.sublist(startLine + 1, endLine).join('\n').trimRight(); -} - -typedef _ForEachAction = void Function(String key, V value); -void _sortedForEach(Map map, _ForEachAction action) { - map - .entries - .toList() - ..sort((MapEntry a, MapEntry b) => a.key.compareTo(b.key)) - ..forEach((MapEntry entry) { - action(entry.key, entry.value); - }); -} - -String _escapeEventKey(String original) { - switch (original) { - case "'": - return '"\'"'; - case r'\': - return r"r'\'"; - case r'$': - return r"r'$'"; - default: - return "'$original'"; - } -} - -String _buildMapString(Iterable layouts) { - final List codeStrings = []; - _sortedForEach(buildMap(layouts), (String eventCode, Map eventKeyToLogicalKeys) { - final List codeStringBodies = []; - _sortedForEach(eventKeyToLogicalKeys, (String eventKey, int result) { - codeStringBodies.add(' ${_escapeEventKey(eventKey)}: 0x${result.toRadixString(16)},'); - }); - codeStrings.add(''' - '$eventCode': { -${codeStringBodies.join('\n').trimRight()} - },'''); - }); - return '>{\n${codeStrings.join('\n')}\n}'; -} - -String _buildTestCasesString(List layouts) { - final List layoutsString = []; - for (final Layout layout in layouts) { - final List layoutEntries = []; - _sortedForEach(buildLayout(layout.entries), (String eventCode, int logicalKey) { - final LayoutEntry entry = layout.entries[eventCode]!; - layoutEntries.add(" verifyEntry(mapping, '$eventCode', [" - '${entry.printables.map(_escapeEventKey).join(', ')}' - "], '${String.fromCharCode(logicalKey)}');"); - }); - layoutsString.add(''' - group('${layout.language}', () { -${layoutEntries.join('\n')} - }); -'''); - } - return layoutsString.join('\n').trimRight(); -} - -Future generate(Options options) async { - final GithubResult githubResult = await fetchFromGithub( - githubToken: options.githubToken, - force: options.force, - cacheRoot: options.cacheRoot, - ); - // Build store. - final List winLayouts = githubResult.layouts.where((Layout layout) => - layout.platform == LayoutPlatform.win).toList(); - final List linuxLayouts = githubResult.layouts.where((Layout layout) => - layout.platform == LayoutPlatform.linux).toList(); - final List darwinLayouts = githubResult.layouts.where((Layout layout) => - layout.platform == LayoutPlatform.darwin).toList(); - - // Generate the definition file. - _writeFileTo( - path.join(options.outputRoot, 'lib', 'web_keyboard_layouts'), - 'key_mappings.g.dart', - _renderTemplate( - File(path.join(options.dataRoot, 'key_mappings.dart.tmpl')).readAsStringSync(), - { - 'COMMIT_URL': githubResult.url, - 'WIN_MAPPING': _buildMapString(winLayouts), - 'LINUX_MAPPING': _buildMapString(linuxLayouts), - 'DARWIN_MAPPING': _buildMapString(darwinLayouts), - 'COMMON': _readSharedSegment(path.join(options.libRoot, 'common.dart')), - }, - ), - ); - - // Generate the test cases. - _writeFileTo( - path.join(options.outputRoot, 'test'), - 'test_cases.g.dart', - _renderTemplate( - File(path.join(options.dataRoot, 'test_cases.dart.tmpl')).readAsStringSync(), - { - 'WIN_CASES': _buildTestCasesString(winLayouts), - 'LINUX_CASES': _buildTestCasesString(linuxLayouts), - 'DARWIN_CASES': _buildTestCasesString(darwinLayouts), - }, - ), - ); -} From 1343f01e12c2b325a25eb9759f77587e21013c09 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 14 Nov 2022 18:07:35 -0800 Subject: [PATCH 40/74] Remove layout_types --- .../bin/gen_web_keyboard_layouts.dart | 3 +- .../gen_web_keyboard_layouts/lib/github.dart | 61 +++++++++++++++++- .../lib/layout_types.dart | 63 ------------------- 3 files changed, 61 insertions(+), 66 deletions(-) delete mode 100644 tools/gen_web_keyboard_layouts/lib/layout_types.dart diff --git a/tools/gen_web_keyboard_layouts/bin/gen_web_keyboard_layouts.dart b/tools/gen_web_keyboard_layouts/bin/gen_web_keyboard_layouts.dart index e402772e23f8e..41462c2fb1a27 100644 --- a/tools/gen_web_keyboard_layouts/bin/gen_web_keyboard_layouts.dart +++ b/tools/gen_web_keyboard_layouts/bin/gen_web_keyboard_layouts.dart @@ -7,7 +7,6 @@ import 'dart:io'; import 'package:args/args.dart'; import 'package:gen_web_keyboard_layouts/benchmark_detector.dart'; import 'package:gen_web_keyboard_layouts/github.dart'; -import 'package:gen_web_keyboard_layouts/layout_types.dart'; import 'package:path/path.dart' as path; const String kEnvGithubToken = 'GITHUB_TOKEN'; @@ -169,7 +168,7 @@ Future main(List rawArguments) async { force: parsedArguments['force'] as bool, cacheRoot: path.join(packageRoot.path, '.cache'), ); - // Build store. + final List winLayouts = githubResult.layouts.where((Layout layout) => layout.platform == LayoutPlatform.win).toList(); final List linuxLayouts = githubResult.layouts.where((Layout layout) => diff --git a/tools/gen_web_keyboard_layouts/lib/github.dart b/tools/gen_web_keyboard_layouts/lib/github.dart index 822f55992ef8c..d7619ce502ed1 100644 --- a/tools/gen_web_keyboard_layouts/lib/github.dart +++ b/tools/gen_web_keyboard_layouts/lib/github.dart @@ -11,7 +11,6 @@ import 'package:path/path.dart' as path; import 'common.dart'; import 'json_get.dart'; -import 'layout_types.dart'; /// Signature for function that asynchonously returns a value. typedef AsyncGetter = Future Function(); @@ -54,6 +53,66 @@ const String _githubQuery = ''' } '''; +/// The platform that the browser is running on. +enum LayoutPlatform { + /// Windows. + win, + /// Linux. + linux, + /// MacOS or iOS. + darwin, +} + +// The length of [LayoutEntry.printable]. +const int _kPrintableLength = 4; + +/// Describes the characters that a physical keyboard key will be mapped to +/// under different modifier states, for a given language on a given +/// platform. +class LayoutEntry { + /// Create a layout entry. + LayoutEntry(this.printables) + : assert(printables.length == _kPrintableLength); + + /// The printable characters that a key should be mapped to under different + /// modifier states. + /// + /// The [printables] always have a length of 4, corresponding to "without any + /// modifiers", "with Shift", "with AltGr", and "with Shift and AltGr" + /// respectively. + /// + /// Some values might be empty. It doesn't mean that these combinations will + /// have an empty KeyboardKey.key, but usually these values are trivial, + /// i.e. same as their non-modified counterparts. + /// + /// Some other values can be [kDeadKey]s. Dead keys are non-printable accents + /// that will be combined into the following letter character. + final List printables; + + /// An empty [LayoutEntry] that produces dead keys under all conditions. + static final LayoutEntry empty = LayoutEntry( + const ['', '', '', '']); + + /// The value of KeyboardEvent.key for dead keys. + static const String kDeadKey = 'Dead'; +} + +/// Describes the characters that all goal keys will be mapped to for a given +/// language on a given platform. +class Layout { + /// Create a [Layout]. + const Layout(this.language, this.platform, this.entries); + + /// The language being used. + final String language; + + /// The platform that the browser is running on. + final LayoutPlatform platform; + + /// Maps from DOM `KeyboardKey.code`s to the characters they produce. + final Map entries; +} + /// All goals in the form of KeyboardEvent.key. final List _kGoalKeys = kLayoutGoals.keys.toList(); diff --git a/tools/gen_web_keyboard_layouts/lib/layout_types.dart b/tools/gen_web_keyboard_layouts/lib/layout_types.dart deleted file mode 100644 index d7e48ffa5932f..0000000000000 --- a/tools/gen_web_keyboard_layouts/lib/layout_types.dart +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2014 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/// The platform that the browser is running on. -enum LayoutPlatform { - /// Windows. - win, - /// Linux. - linux, - /// MacOS or iOS. - darwin, -} - -// The length of [LayoutEntry.printable]. -const int _kPrintableLength = 4; - -/// Describes the characters that a physical keyboard key will be mapped to -/// under different modifier states, for a given language on a given -/// platform. -class LayoutEntry { - /// Create a layout entry. - LayoutEntry(this.printables) - : assert(printables.length == _kPrintableLength); - - /// The printable characters that a key should be mapped to under different - /// modifier states. - /// - /// The [printables] always have a length of 4, corresponding to "without any - /// modifiers", "with Shift", "with AltGr", and "with Shift and AltGr" - /// respectively. - /// - /// Some values might be empty. It doesn't mean that these combinations will - /// have an empty KeyboardKey.key, but usually these values are trivial, - /// i.e. same as their non-modified counterparts. - /// - /// Some other values can be [kDeadKey]s. Dead keys are non-printable accents - /// that will be combined into the following letter character. - final List printables; - - /// An empty [LayoutEntry] that produces dead keys under all conditions. - static final LayoutEntry empty = LayoutEntry( - const ['', '', '', '']); - - /// The value of KeyboardEvent.key for dead keys. - static const String kDeadKey = 'Dead'; -} - -/// Describes the characters that all goal keys will be mapped to for a given -/// language on a given platform. -class Layout { - /// Create a [Layout]. - const Layout(this.language, this.platform, this.entries); - - /// The language being used. - final String language; - - /// The platform that the browser is running on. - final LayoutPlatform platform; - - /// Maps from DOM `KeyboardKey.code`s to the characters they produce. - final Map entries; -} From d0cd62ce22c49578800d97aecb82fd4569d807d0 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 14 Nov 2022 18:36:11 -0800 Subject: [PATCH 41/74] Rename to locale_keymap --- .../lib/src/engine/keyboard_binding.dart | 2 +- lib/web_ui/pubspec.yaml | 4 +- third_party/web_keyboard_layouts/README.md | 20 ------ .../lib/web_keyboard_layouts.dart | 9 --- .../.gitignore | 0 .../CHANGELOG.md | 0 .../License.txt | 0 third_party/web_locale_keymap/README.md | 20 ++++++ .../lib/web_locale_keymap.dart | 9 +++ .../web_locale_keymap}/key_mappings.g.dart | 8 +-- .../lib/web_locale_keymap}/types.dart | 8 +-- .../pubspec.yaml | 6 +- .../test/layout_mapping_tests.dart | 2 +- .../test/test_cases.g.dart | 2 +- .../test/testing.dart | 2 +- .../.gitignore | 0 .../README.md | 0 .../bin/gen_web_locale_keymap.dart} | 13 ++-- .../data/key_mappings.dart.tmpl | 8 +-- .../data/test_cases.dart.tmpl | 2 +- .../lib/benchmark_detector.dart | 4 ++ .../lib/common.dart | 0 .../lib/github.dart | 62 +----------------- .../lib/json_get.dart | 0 .../lib/layout_types.dart | 63 +++++++++++++++++++ .../pubspec.yaml | 0 .../test/gen_defaults_test.dart | 0 web_sdk/BUILD.gn | 34 +++++----- web_sdk/libraries.json | 12 ++-- web_sdk/libraries.yaml | 8 +-- web_sdk/sdk_rewriter.dart | 6 +- 31 files changed, 156 insertions(+), 148 deletions(-) delete mode 100644 third_party/web_keyboard_layouts/README.md delete mode 100644 third_party/web_keyboard_layouts/lib/web_keyboard_layouts.dart rename third_party/{web_keyboard_layouts => web_locale_keymap}/.gitignore (100%) rename third_party/{web_keyboard_layouts => web_locale_keymap}/CHANGELOG.md (100%) rename third_party/{web_keyboard_layouts => web_locale_keymap}/License.txt (100%) create mode 100644 third_party/web_locale_keymap/README.md create mode 100644 third_party/web_locale_keymap/lib/web_locale_keymap.dart rename third_party/{web_keyboard_layouts/lib/web_keyboard_layouts => web_locale_keymap/lib/web_locale_keymap}/key_mappings.g.dart (98%) rename third_party/{web_keyboard_layouts/lib/web_keyboard_layouts => web_locale_keymap/lib/web_locale_keymap}/types.dart (87%) rename third_party/{web_keyboard_layouts => web_locale_keymap}/pubspec.yaml (70%) rename third_party/{web_keyboard_layouts => web_locale_keymap}/test/layout_mapping_tests.dart (80%) rename third_party/{web_keyboard_layouts => web_locale_keymap}/test/test_cases.g.dart (99%) rename third_party/{web_keyboard_layouts => web_locale_keymap}/test/testing.dart (95%) rename tools/{gen_web_keyboard_layouts => gen_web_locale_keymap}/.gitignore (100%) rename tools/{gen_web_keyboard_layouts => gen_web_locale_keymap}/README.md (100%) rename tools/{gen_web_keyboard_layouts/bin/gen_web_keyboard_layouts.dart => gen_web_locale_keymap/bin/gen_web_locale_keymap.dart} (94%) rename tools/{gen_web_keyboard_layouts => gen_web_locale_keymap}/data/key_mappings.dart.tmpl (87%) rename tools/{gen_web_keyboard_layouts => gen_web_locale_keymap}/data/test_cases.dart.tmpl (92%) rename tools/{gen_web_keyboard_layouts => gen_web_locale_keymap}/lib/benchmark_detector.dart (95%) rename tools/{gen_web_keyboard_layouts => gen_web_locale_keymap}/lib/common.dart (100%) rename tools/{gen_web_keyboard_layouts => gen_web_locale_keymap}/lib/github.dart (84%) rename tools/{gen_web_keyboard_layouts => gen_web_locale_keymap}/lib/json_get.dart (100%) create mode 100644 tools/gen_web_locale_keymap/lib/layout_types.dart rename tools/{gen_web_keyboard_layouts => gen_web_locale_keymap}/pubspec.yaml (100%) rename tools/{gen_web_keyboard_layouts => gen_web_locale_keymap}/test/gen_defaults_test.dart (100%) diff --git a/lib/web_ui/lib/src/engine/keyboard_binding.dart b/lib/web_ui/lib/src/engine/keyboard_binding.dart index beed7b2a5a5d6..efea8e9ba0b28 100644 --- a/lib/web_ui/lib/src/engine/keyboard_binding.dart +++ b/lib/web_ui/lib/src/engine/keyboard_binding.dart @@ -4,7 +4,7 @@ import 'package:meta/meta.dart'; import 'package:ui/ui.dart' as ui; -import 'package:web_keyboard_layouts/web_keyboard_layouts.dart' as keyboard_layouts; +import 'package:web_locale_keymap/web_locale_keymap.dart' as keyboard_layouts; import '../engine.dart' show registerHotRestartListener; import 'browser_detection.dart'; diff --git a/lib/web_ui/pubspec.yaml b/lib/web_ui/pubspec.yaml index fd6ad8ceb2bc9..d176bece60fb9 100644 --- a/lib/web_ui/pubspec.yaml +++ b/lib/web_ui/pubspec.yaml @@ -8,8 +8,8 @@ environment: dependencies: js: 0.6.4 meta: ^1.7.0 - web_keyboard_layouts: - path: ../../third_party/web_keyboard_layouts + web_locale_keymap: + path: ../../third_party/web_locale_keymap dev_dependencies: archive: 3.1.2 diff --git a/third_party/web_keyboard_layouts/README.md b/third_party/web_keyboard_layouts/README.md deleted file mode 100644 index 2b6a974f01363..0000000000000 --- a/third_party/web_keyboard_layouts/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# Web Keyboard Layouts - -# Usage - -https://pub.dev/packages/web_keyboard_layouts - -[![pub package](https://img.shields.io/pub/v/web_keyboard_layouts.svg)](https://pub.dev/packages/web_keyboard_layouts) - -```yaml -dependencies: - web_keyboard_layouts: ^ -``` - -# Issues - -For issues, file directly in the [main Flutter repo](https://github.com/flutter/flutter). - -# Layouts - -TODO diff --git a/third_party/web_keyboard_layouts/lib/web_keyboard_layouts.dart b/third_party/web_keyboard_layouts/lib/web_keyboard_layouts.dart deleted file mode 100644 index 6065d57ba06cb..0000000000000 --- a/third_party/web_keyboard_layouts/lib/web_keyboard_layouts.dart +++ /dev/null @@ -1,9 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) 2022 Google LLC - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -library web_keyboard_layouts; - -export 'web_keyboard_layouts/key_mappings.g.dart'; -export 'web_keyboard_layouts/types.dart'; diff --git a/third_party/web_keyboard_layouts/.gitignore b/third_party/web_locale_keymap/.gitignore similarity index 100% rename from third_party/web_keyboard_layouts/.gitignore rename to third_party/web_locale_keymap/.gitignore diff --git a/third_party/web_keyboard_layouts/CHANGELOG.md b/third_party/web_locale_keymap/CHANGELOG.md similarity index 100% rename from third_party/web_keyboard_layouts/CHANGELOG.md rename to third_party/web_locale_keymap/CHANGELOG.md diff --git a/third_party/web_keyboard_layouts/License.txt b/third_party/web_locale_keymap/License.txt similarity index 100% rename from third_party/web_keyboard_layouts/License.txt rename to third_party/web_locale_keymap/License.txt diff --git a/third_party/web_locale_keymap/README.md b/third_party/web_locale_keymap/README.md new file mode 100644 index 0000000000000..b37ce0bafa6d9 --- /dev/null +++ b/third_party/web_locale_keymap/README.md @@ -0,0 +1,20 @@ +# Web Keyboard Layouts + +# Usage + +https://pub.dev/packages/web_locale_keymap + +[![pub package](https://img.shields.io/pub/v/web_locale_keymap.svg)](https://pub.dev/packages/web_locale_keymap) + +```yaml +dependencies: + web_locale_keymap: ^ +``` + +# Issues + +For issues, file directly in the [main Flutter repo](https://github.com/flutter/flutter). + +# Layouts + +TODO diff --git a/third_party/web_locale_keymap/lib/web_locale_keymap.dart b/third_party/web_locale_keymap/lib/web_locale_keymap.dart new file mode 100644 index 0000000000000..450856672ea57 --- /dev/null +++ b/third_party/web_locale_keymap/lib/web_locale_keymap.dart @@ -0,0 +1,9 @@ +//--------------------------------------------------------------------------------------------- +// Copyright (c) 2022 Google LLC +// Licensed under the MIT License. See License.txt in the project root for license information. +//--------------------------------------------------------------------------------------------*/ + +library web_locale_keymap; + +export 'web_locale_keymap/key_mappings.g.dart'; +export 'web_locale_keymap/types.dart'; diff --git a/third_party/web_keyboard_layouts/lib/web_keyboard_layouts/key_mappings.g.dart b/third_party/web_locale_keymap/lib/web_locale_keymap/key_mappings.g.dart similarity index 98% rename from third_party/web_keyboard_layouts/lib/web_keyboard_layouts/key_mappings.g.dart rename to third_party/web_locale_keymap/lib/web_locale_keymap/key_mappings.g.dart index 0ae1a29e15c13..1838ba865ecdd 100644 --- a/third_party/web_keyboard_layouts/lib/web_keyboard_layouts/key_mappings.g.dart +++ b/third_party/web_locale_keymap/lib/web_locale_keymap/key_mappings.g.dart @@ -1,7 +1,7 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) 2022 Google LLC - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ +//--------------------------------------------------------------------------------------------- +// Copyright (c) 2022 Google LLC +// Licensed under the MIT License. See License.txt in the project root for license information. +//--------------------------------------------------------------------------------------------*/ // DO NOT EDIT -- DO NOT EDIT -- DO NOT EDIT // diff --git a/third_party/web_keyboard_layouts/lib/web_keyboard_layouts/types.dart b/third_party/web_locale_keymap/lib/web_locale_keymap/types.dart similarity index 87% rename from third_party/web_keyboard_layouts/lib/web_keyboard_layouts/types.dart rename to third_party/web_locale_keymap/lib/web_locale_keymap/types.dart index 3f472814f0e7f..a90e9fb4f0b87 100644 --- a/third_party/web_keyboard_layouts/lib/web_keyboard_layouts/types.dart +++ b/third_party/web_locale_keymap/lib/web_locale_keymap/types.dart @@ -1,7 +1,7 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) 2022 Google LLC - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ +//--------------------------------------------------------------------------------------------- +// Copyright (c) 2022 Google LLC +// Licensed under the MIT License. See License.txt in the project root for license information. +//--------------------------------------------------------------------------------------------*/ import 'key_mappings.g.dart'; diff --git a/third_party/web_keyboard_layouts/pubspec.yaml b/third_party/web_locale_keymap/pubspec.yaml similarity index 70% rename from third_party/web_keyboard_layouts/pubspec.yaml rename to third_party/web_locale_keymap/pubspec.yaml index 79587f449f860..cea686625ef82 100644 --- a/third_party/web_keyboard_layouts/pubspec.yaml +++ b/third_party/web_locale_keymap/pubspec.yaml @@ -1,8 +1,8 @@ -name: web_keyboard_layouts +name: web_locale_keymap description: A list of keyboard layouts on Web and their mapping table. -repository: https://github.com/flutter/packages/tree/main/third_party/packages/web_keyboard_layouts -issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+web_keyboard_layouts%22 +repository: https://github.com/flutter/packages/tree/main/third_party/packages/web_locale_keymap +issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+web_locale_keymap%22 version: 0.1.1 environment: diff --git a/third_party/web_keyboard_layouts/test/layout_mapping_tests.dart b/third_party/web_locale_keymap/test/layout_mapping_tests.dart similarity index 80% rename from third_party/web_keyboard_layouts/test/layout_mapping_tests.dart rename to third_party/web_locale_keymap/test/layout_mapping_tests.dart index a7e45028a1d15..6025740e3a1a8 100644 --- a/third_party/web_keyboard_layouts/test/layout_mapping_tests.dart +++ b/third_party/web_locale_keymap/test/layout_mapping_tests.dart @@ -1,5 +1,5 @@ import 'package:test/test.dart'; -import 'package:web_keyboard_layouts/web_keyboard_layouts.dart'; +import 'package:web_locale_keymap/web_locale_keymap.dart'; import 'test_cases.g.dart'; diff --git a/third_party/web_keyboard_layouts/test/test_cases.g.dart b/third_party/web_locale_keymap/test/test_cases.g.dart similarity index 99% rename from third_party/web_keyboard_layouts/test/test_cases.g.dart rename to third_party/web_locale_keymap/test/test_cases.g.dart index 7bb5516c2cd35..e6d5d5b6c0159 100644 --- a/third_party/web_keyboard_layouts/test/test_cases.g.dart +++ b/third_party/web_locale_keymap/test/test_cases.g.dart @@ -14,7 +14,7 @@ // See flutter/engine:flutter/tools/gen_web_keyboard_layouts/README.md for more information. import 'package:test/test.dart'; -import 'package:web_keyboard_layouts/web_keyboard_layouts.dart'; +import 'package:web_locale_keymap/web_locale_keymap.dart'; import 'testing.dart'; void testWin(LayoutMapping mapping) { diff --git a/third_party/web_keyboard_layouts/test/testing.dart b/third_party/web_locale_keymap/test/testing.dart similarity index 95% rename from third_party/web_keyboard_layouts/test/testing.dart rename to third_party/web_locale_keymap/test/testing.dart index 8c0460681a9a3..425a4f1b2cfa9 100644 --- a/third_party/web_keyboard_layouts/test/testing.dart +++ b/third_party/web_locale_keymap/test/testing.dart @@ -1,6 +1,6 @@ // import 'package:litetest/litetest.dart'; import 'package:test/test.dart'; -import 'package:web_keyboard_layouts/web_keyboard_layouts.dart'; +import 'package:web_locale_keymap/web_locale_keymap.dart'; final int _kLowerA = 'a'.codeUnitAt(0); final int _kUpperA = 'A'.codeUnitAt(0); diff --git a/tools/gen_web_keyboard_layouts/.gitignore b/tools/gen_web_locale_keymap/.gitignore similarity index 100% rename from tools/gen_web_keyboard_layouts/.gitignore rename to tools/gen_web_locale_keymap/.gitignore diff --git a/tools/gen_web_keyboard_layouts/README.md b/tools/gen_web_locale_keymap/README.md similarity index 100% rename from tools/gen_web_keyboard_layouts/README.md rename to tools/gen_web_locale_keymap/README.md diff --git a/tools/gen_web_keyboard_layouts/bin/gen_web_keyboard_layouts.dart b/tools/gen_web_locale_keymap/bin/gen_web_locale_keymap.dart similarity index 94% rename from tools/gen_web_keyboard_layouts/bin/gen_web_keyboard_layouts.dart rename to tools/gen_web_locale_keymap/bin/gen_web_locale_keymap.dart index 41462c2fb1a27..46dfc81b81997 100644 --- a/tools/gen_web_keyboard_layouts/bin/gen_web_keyboard_layouts.dart +++ b/tools/gen_web_locale_keymap/bin/gen_web_locale_keymap.dart @@ -7,6 +7,7 @@ import 'dart:io'; import 'package:args/args.dart'; import 'package:gen_web_keyboard_layouts/benchmark_detector.dart'; import 'package:gen_web_keyboard_layouts/github.dart'; +import 'package:gen_web_keyboard_layouts/layout_types.dart'; import 'package:path/path.dart' as path; const String kEnvGithubToken = 'GITHUB_TOKEN'; @@ -145,8 +146,8 @@ Future main(List rawArguments) async { final String? envGithubToken = env[kEnvGithubToken]; if (envGithubToken == null) { - print('Error: Environment variable GITHUB_TOKEN not found.\n\n' - 'Set the environment variable GITHUB_TOKEN as a GitHub personal access\n' + print('Error: Environment variable $kEnvGithubToken not found.\n\n' + 'Set the environment variable $kEnvGithubToken as a GitHub personal access\n' 'token for authentication. This token is only used for quota controlling\n' 'and does not need any scopes. Create one at\n' 'https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token.', @@ -155,13 +156,13 @@ Future main(List rawArguments) async { } // The root of this package. The folder that is called - // 'gen_web_keyboard_layouts' and contains 'pubspec.yaml'. + // 'gen_web_locale_keymap' and contains 'pubspec.yaml'. final Directory packageRoot = Directory(path.dirname(Platform.script.toFilePath())).parent; // The root of the output package. The folder that is called - // 'web_keyboard_layouts' and contains 'pubspec.yaml'. + // 'web_locale_keymap' and contains 'pubspec.yaml'. final String outputRoot = path.join(packageRoot.parent.parent.path, - 'third_party', 'web_keyboard_layouts'); + 'third_party', 'web_locale_keymap'); final GithubResult githubResult = await fetchFromGithub( githubToken: envGithubToken, @@ -178,7 +179,7 @@ Future main(List rawArguments) async { // Generate the definition file. _writeFileTo( - path.join(outputRoot, 'lib', 'web_keyboard_layouts'), + path.join(outputRoot, 'lib', 'web_locale_keymap'), 'key_mappings.g.dart', _renderTemplate( File(path.join(packageRoot.path, 'data', 'key_mappings.dart.tmpl')).readAsStringSync(), diff --git a/tools/gen_web_keyboard_layouts/data/key_mappings.dart.tmpl b/tools/gen_web_locale_keymap/data/key_mappings.dart.tmpl similarity index 87% rename from tools/gen_web_keyboard_layouts/data/key_mappings.dart.tmpl rename to tools/gen_web_locale_keymap/data/key_mappings.dart.tmpl index 0f5dee47150e3..0cad6b8834709 100644 --- a/tools/gen_web_keyboard_layouts/data/key_mappings.dart.tmpl +++ b/tools/gen_web_locale_keymap/data/key_mappings.dart.tmpl @@ -1,7 +1,7 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) 2022 Google LLC - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ +//--------------------------------------------------------------------------------------------- +// Copyright (c) 2022 Google LLC +// Licensed under the MIT License. See License.txt in the project root for license information. +//--------------------------------------------------------------------------------------------*/ // DO NOT EDIT -- DO NOT EDIT -- DO NOT EDIT // diff --git a/tools/gen_web_keyboard_layouts/data/test_cases.dart.tmpl b/tools/gen_web_locale_keymap/data/test_cases.dart.tmpl similarity index 92% rename from tools/gen_web_keyboard_layouts/data/test_cases.dart.tmpl rename to tools/gen_web_locale_keymap/data/test_cases.dart.tmpl index a3ba5d8f1c772..20b26c15c1d1b 100644 --- a/tools/gen_web_keyboard_layouts/data/test_cases.dart.tmpl +++ b/tools/gen_web_locale_keymap/data/test_cases.dart.tmpl @@ -14,7 +14,7 @@ // See flutter/engine:flutter/tools/gen_web_keyboard_layouts/README.md for more information. import 'package:test/test.dart'; -import 'package:web_keyboard_layouts/web_keyboard_layouts.dart'; +import 'package:web_locale_keymap/web_locale_keymap.dart'; import 'testing.dart'; void testWin(LayoutMapping mapping) { diff --git a/tools/gen_web_keyboard_layouts/lib/benchmark_detector.dart b/tools/gen_web_locale_keymap/lib/benchmark_detector.dart similarity index 95% rename from tools/gen_web_keyboard_layouts/lib/benchmark_detector.dart rename to tools/gen_web_locale_keymap/lib/benchmark_detector.dart index efe4c966afc16..824e65a7900c7 100644 --- a/tools/gen_web_keyboard_layouts/lib/benchmark_detector.dart +++ b/tools/gen_web_locale_keymap/lib/benchmark_detector.dart @@ -1,3 +1,7 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + import 'common.dart'; import 'layout_types.dart'; diff --git a/tools/gen_web_keyboard_layouts/lib/common.dart b/tools/gen_web_locale_keymap/lib/common.dart similarity index 100% rename from tools/gen_web_keyboard_layouts/lib/common.dart rename to tools/gen_web_locale_keymap/lib/common.dart diff --git a/tools/gen_web_keyboard_layouts/lib/github.dart b/tools/gen_web_locale_keymap/lib/github.dart similarity index 84% rename from tools/gen_web_keyboard_layouts/lib/github.dart rename to tools/gen_web_locale_keymap/lib/github.dart index d7619ce502ed1..6cbcff8eb891d 100644 --- a/tools/gen_web_keyboard_layouts/lib/github.dart +++ b/tools/gen_web_locale_keymap/lib/github.dart @@ -2,7 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - import 'dart:convert'; import 'dart:io'; import 'package:http/http.dart' as http; @@ -11,6 +10,7 @@ import 'package:path/path.dart' as path; import 'common.dart'; import 'json_get.dart'; +import 'layout_types.dart'; /// Signature for function that asynchonously returns a value. typedef AsyncGetter = Future Function(); @@ -53,66 +53,6 @@ const String _githubQuery = ''' } '''; -/// The platform that the browser is running on. -enum LayoutPlatform { - /// Windows. - win, - /// Linux. - linux, - /// MacOS or iOS. - darwin, -} - -// The length of [LayoutEntry.printable]. -const int _kPrintableLength = 4; - -/// Describes the characters that a physical keyboard key will be mapped to -/// under different modifier states, for a given language on a given -/// platform. -class LayoutEntry { - /// Create a layout entry. - LayoutEntry(this.printables) - : assert(printables.length == _kPrintableLength); - - /// The printable characters that a key should be mapped to under different - /// modifier states. - /// - /// The [printables] always have a length of 4, corresponding to "without any - /// modifiers", "with Shift", "with AltGr", and "with Shift and AltGr" - /// respectively. - /// - /// Some values might be empty. It doesn't mean that these combinations will - /// have an empty KeyboardKey.key, but usually these values are trivial, - /// i.e. same as their non-modified counterparts. - /// - /// Some other values can be [kDeadKey]s. Dead keys are non-printable accents - /// that will be combined into the following letter character. - final List printables; - - /// An empty [LayoutEntry] that produces dead keys under all conditions. - static final LayoutEntry empty = LayoutEntry( - const ['', '', '', '']); - - /// The value of KeyboardEvent.key for dead keys. - static const String kDeadKey = 'Dead'; -} - -/// Describes the characters that all goal keys will be mapped to for a given -/// language on a given platform. -class Layout { - /// Create a [Layout]. - const Layout(this.language, this.platform, this.entries); - - /// The language being used. - final String language; - - /// The platform that the browser is running on. - final LayoutPlatform platform; - - /// Maps from DOM `KeyboardKey.code`s to the characters they produce. - final Map entries; -} - /// All goals in the form of KeyboardEvent.key. final List _kGoalKeys = kLayoutGoals.keys.toList(); diff --git a/tools/gen_web_keyboard_layouts/lib/json_get.dart b/tools/gen_web_locale_keymap/lib/json_get.dart similarity index 100% rename from tools/gen_web_keyboard_layouts/lib/json_get.dart rename to tools/gen_web_locale_keymap/lib/json_get.dart diff --git a/tools/gen_web_locale_keymap/lib/layout_types.dart b/tools/gen_web_locale_keymap/lib/layout_types.dart new file mode 100644 index 0000000000000..d7e48ffa5932f --- /dev/null +++ b/tools/gen_web_locale_keymap/lib/layout_types.dart @@ -0,0 +1,63 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/// The platform that the browser is running on. +enum LayoutPlatform { + /// Windows. + win, + /// Linux. + linux, + /// MacOS or iOS. + darwin, +} + +// The length of [LayoutEntry.printable]. +const int _kPrintableLength = 4; + +/// Describes the characters that a physical keyboard key will be mapped to +/// under different modifier states, for a given language on a given +/// platform. +class LayoutEntry { + /// Create a layout entry. + LayoutEntry(this.printables) + : assert(printables.length == _kPrintableLength); + + /// The printable characters that a key should be mapped to under different + /// modifier states. + /// + /// The [printables] always have a length of 4, corresponding to "without any + /// modifiers", "with Shift", "with AltGr", and "with Shift and AltGr" + /// respectively. + /// + /// Some values might be empty. It doesn't mean that these combinations will + /// have an empty KeyboardKey.key, but usually these values are trivial, + /// i.e. same as their non-modified counterparts. + /// + /// Some other values can be [kDeadKey]s. Dead keys are non-printable accents + /// that will be combined into the following letter character. + final List printables; + + /// An empty [LayoutEntry] that produces dead keys under all conditions. + static final LayoutEntry empty = LayoutEntry( + const ['', '', '', '']); + + /// The value of KeyboardEvent.key for dead keys. + static const String kDeadKey = 'Dead'; +} + +/// Describes the characters that all goal keys will be mapped to for a given +/// language on a given platform. +class Layout { + /// Create a [Layout]. + const Layout(this.language, this.platform, this.entries); + + /// The language being used. + final String language; + + /// The platform that the browser is running on. + final LayoutPlatform platform; + + /// Maps from DOM `KeyboardKey.code`s to the characters they produce. + final Map entries; +} diff --git a/tools/gen_web_keyboard_layouts/pubspec.yaml b/tools/gen_web_locale_keymap/pubspec.yaml similarity index 100% rename from tools/gen_web_keyboard_layouts/pubspec.yaml rename to tools/gen_web_locale_keymap/pubspec.yaml diff --git a/tools/gen_web_keyboard_layouts/test/gen_defaults_test.dart b/tools/gen_web_locale_keymap/test/gen_defaults_test.dart similarity index 100% rename from tools/gen_web_keyboard_layouts/test/gen_defaults_test.dart rename to tools/gen_web_locale_keymap/test/gen_defaults_test.dart diff --git a/web_sdk/BUILD.gn b/web_sdk/BUILD.gn index 21fd424e2131c..8807653e8e057 100644 --- a/web_sdk/BUILD.gn +++ b/web_sdk/BUILD.gn @@ -20,11 +20,11 @@ web_ui_sources = exec_script("//third_party/dart/tools/list_dart_files.py", ], "list lines") -web_keyboard_layouts_sources = +web_locale_keymap_sources = exec_script("//third_party/dart/tools/list_dart_files.py", [ "absolute", - rebase_path("//flutter/third_party/web_keyboard_layouts/lib"), + rebase_path("//flutter/third_party/web_locale_keymap/lib"), ], "list lines") @@ -111,11 +111,11 @@ sdk_rewriter("web_ui_library_sources") { exclude_patterns = [ rebase_path("//flutter/lib/web_ui/lib/src/*") ] } -sdk_rewriter("web_keyboard_layouts_library") { - library_name = "web_keyboard_layouts" - api_file = "//flutter/third_party/web_keyboard_layouts/lib/web_keyboard_layouts.dart" - input_dir = "//flutter/third_party/web_keyboard_layouts/lib/web_keyboard_layouts/" - output_dir = "$root_out_dir/flutter_web_sdk/lib/web_keyboard_layouts/" +sdk_rewriter("web_locale_keymap_library") { + library_name = "web_locale_keymap" + api_file = "//flutter/third_party/web_locale_keymap/lib/web_locale_keymap.dart" + input_dir = "//flutter/third_party/web_locale_keymap/lib/web_locale_keymap/" + output_dir = "$root_out_dir/flutter_web_sdk/lib/web_locale_keymap/" } sdk_rewriter("web_engine_library") { @@ -166,7 +166,7 @@ template("_dartdevc") { ":skwasm_impl_library", ":skwasm_stub_library", ":web_engine_library", - ":web_keyboard_layouts_library", + ":web_locale_keymap_library", ":web_ui_library", ":web_ui_library_sources", ] @@ -197,7 +197,7 @@ template("_dartdevc") { ":skwasm_impl_library", ":skwasm_stub_library", ":web_engine_library", - ":web_keyboard_layouts_library", + ":web_locale_keymap_library", ":web_ui_library", ":web_ui_library_sources", "//third_party/dart:create_sdk", @@ -229,7 +229,7 @@ template("_kernel_worker") { ":skwasm_impl_library", ":skwasm_stub_library", ":web_engine_library", - ":web_keyboard_layouts_library", + ":web_locale_keymap_library", ":web_ui_library", ":web_ui_library_sources", ] @@ -261,7 +261,7 @@ template("_kernel_worker") { ":skwasm_impl_library", ":skwasm_stub_library", ":web_engine_library", - ":web_keyboard_layouts_library", + ":web_locale_keymap_library", ":web_ui_library", ":web_ui_library_sources", "//third_party/dart:create_sdk", @@ -287,7 +287,7 @@ template("_compile_platform") { assert(defined(invoker.output_dill), "output_dill must be defined for $target_name") _kernel_worker(target_name) { - inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_keyboard_layouts_sources + inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_locale_keymap_sources outputs = [ invoker.output_dill ] @@ -326,7 +326,7 @@ template("_compile_platform") { "--source", "dart:_skwasm_stub", "--source", - "dart:web_keyboard_layouts", + "dart:web_locale_keymap", ] if (flutter_prebuilt_dart_sdk) { args += [ @@ -457,7 +457,7 @@ template("_compile_ddc_modules") { "auto_detect must be defined for $target_name") _dartdevc(target_name) { - inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_keyboard_layouts_sources + inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_locale_keymap_sources packages = dart_sdk_package_config @@ -498,7 +498,7 @@ template("_compile_ddc_modules") { "dart:ui", "dart:_engine", "dart:_skwasm_stub", - "dart:web_keyboard_layouts", + "dart:web_locale_keymap", "--no-summarize", "--packages", "file:///" + rebase_path(dart_sdk_package_config), @@ -607,7 +607,7 @@ if (!is_fuchsia) { ":skwasm_impl_library", ":skwasm_stub_library", ":web_engine_library", - ":web_keyboard_layouts_library", + ":web_locale_keymap_library", ":web_ui_library", ":web_ui_library_sources", ] @@ -646,7 +646,7 @@ if (!is_fuchsia) { sources += get_target_outputs(":flutter_canvaskit_platform_dart2js_sound") sources += get_target_outputs(":flutter_canvaskit_platform_dart2js_unsound") - sources += get_target_outputs(":web_keyboard_layouts_library") + sources += get_target_outputs(":web_locale_keymap_library") sources += get_target_outputs(":web_ui_library") sources += get_target_outputs(":web_ui_library_sources") sources += get_target_outputs(":skwasm_stub_library") diff --git a/web_sdk/libraries.json b/web_sdk/libraries.json index d875c4dc71b6d..1cb3377e18330 100644 --- a/web_sdk/libraries.json +++ b/web_sdk/libraries.json @@ -15,8 +15,8 @@ "_engine": { "uri": "lib/_engine/engine.dart" }, - "web_keyboard_layouts": { - "uri": "lib/web_keyboard_layouts/web_keyboard_layouts.dart" + "web_locale_keymap": { + "uri": "lib/web_locale_keymap/web_locale_keymap.dart" }, "_skwasm_stub": { "uri": "lib/_skwasm_stub/skwasm_stub.dart" @@ -40,8 +40,8 @@ "_skwasm_stub": { "uri": "lib/_skwasm_stub/skwasm_stub.dart" }, - "web_keyboard_layouts": { - "uri": "lib/web_keyboard_layouts/web_keyboard_layouts.dart" + "web_locale_keymap": { + "uri": "lib/web_locale_keymap/web_locale_keymap.dart" } } }, @@ -62,8 +62,8 @@ "_skwasm_impl": { "uri": "lib/_skwasm_impl/skwasm_impl.dart" }, - "web_keyboard_layouts": { - "uri": "lib/web_keyboard_layouts/web_keyboard_layouts.dart" + "web_locale_keymap": { + "uri": "lib/web_locale_keymap/web_locale_keymap.dart" } } } diff --git a/web_sdk/libraries.yaml b/web_sdk/libraries.yaml index 06205d0bbbf29..d2b9ed1c48732 100644 --- a/web_sdk/libraries.yaml +++ b/web_sdk/libraries.yaml @@ -27,8 +27,8 @@ dartdevc: _skwasm_stub: uri: "lib/_skwasm_stub/skwasm_stub.dart" - web_keyboard_layouts: - uri: "lib/web_keyboard_layouts/web_keyboard_layouts.dart" + web_locale_keymap: + uri: "lib/web_locale_keymap/web_locale_keymap.dart" dart2js: include: @@ -44,8 +44,8 @@ dart2js: _skwasm_stub: uri: "lib/_skwasm_stub/skwasm_stub.dart" - web_keyboard_layouts: - uri: "lib/web_keyboard_layouts/web_keyboard_layouts.dart" + web_locale_keymap: + uri: "lib/web_locale_keymap/web_locale_keymap.dart" wasm: include: diff --git a/web_sdk/sdk_rewriter.dart b/web_sdk/sdk_rewriter.dart index e69ae0e3e9399..c71677ce9066c 100644 --- a/web_sdk/sdk_rewriter.dart +++ b/web_sdk/sdk_rewriter.dart @@ -36,8 +36,8 @@ export 'dart:_engine' ]; final List keyboardLayoutsPatterns = [ - AllReplacer(RegExp(r'library\s+web_keyboard_layouts;'), 'library dart.web_keyboard_layouts;'), - AllReplacer(RegExp(r'part\s+of\s+web_keyboard_layouts;'), 'part of dart.web_keyboard_layouts;'), + AllReplacer(RegExp(r'library\s+web_locale_keymap;'), 'library dart.web_locale_keymap;'), + AllReplacer(RegExp(r'part\s+of\s+web_locale_keymap;'), 'part of dart.web_locale_keymap;'), AllReplacer(RegExp( r''' export\s*'src/engine.dart' @@ -63,7 +63,7 @@ import 'dart:_js_annotations'; import 'dart:math' as math; import 'dart:typed_data'; import 'dart:ui' as ui; -import 'dart:web_keyboard_layouts' as keyboard_layouts; +import 'dart:web_locale_keymap' as keyboard_layouts; $extraImports ''' ), From d4fbac18c1f91da88b0a0d1eb29860c3f72cbc1f Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 14 Nov 2022 18:54:16 -0800 Subject: [PATCH 42/74] Rename class --- .../lib/src/engine/keyboard_binding.dart | 10 ++--- .../lib/web_locale_keymap.dart | 2 +- .../{types.dart => locale_keymap.dart} | 40 +++++++++++++------ 3 files changed, 34 insertions(+), 18 deletions(-) rename third_party/web_locale_keymap/lib/web_locale_keymap/{types.dart => locale_keymap.dart} (54%) diff --git a/lib/web_ui/lib/src/engine/keyboard_binding.dart b/lib/web_ui/lib/src/engine/keyboard_binding.dart index efea8e9ba0b28..0ca778ea42831 100644 --- a/lib/web_ui/lib/src/engine/keyboard_binding.dart +++ b/lib/web_ui/lib/src/engine/keyboard_binding.dart @@ -240,17 +240,17 @@ class KeyboardConverter { // are comprehended. final bool onMacOs; // Maps logical keys from key event properties. - final keyboard_layouts.LayoutMapping _mapping; + final keyboard_layouts.LocaleKeymap _mapping; - static keyboard_layouts.LayoutMapping _mappingFromPlatform(OperatingSystem platform) { + static keyboard_layouts.LocaleKeymap _mappingFromPlatform(OperatingSystem platform) { switch (platform) { case OperatingSystem.iOs: case OperatingSystem.macOs: - return keyboard_layouts.LayoutMapping.darwin(); + return keyboard_layouts.LocaleKeymap.darwin(); case OperatingSystem.windows: - return keyboard_layouts.LayoutMapping.win(); + return keyboard_layouts.LocaleKeymap.win(); default: - return keyboard_layouts.LayoutMapping.linux(); + return keyboard_layouts.LocaleKeymap.linux(); } } diff --git a/third_party/web_locale_keymap/lib/web_locale_keymap.dart b/third_party/web_locale_keymap/lib/web_locale_keymap.dart index 450856672ea57..eb120ee7ed405 100644 --- a/third_party/web_locale_keymap/lib/web_locale_keymap.dart +++ b/third_party/web_locale_keymap/lib/web_locale_keymap.dart @@ -6,4 +6,4 @@ library web_locale_keymap; export 'web_locale_keymap/key_mappings.g.dart'; -export 'web_locale_keymap/types.dart'; +export 'web_locale_keymap/locale_keymap.dart'; diff --git a/third_party/web_locale_keymap/lib/web_locale_keymap/types.dart b/third_party/web_locale_keymap/lib/web_locale_keymap/locale_keymap.dart similarity index 54% rename from third_party/web_locale_keymap/lib/web_locale_keymap/types.dart rename to third_party/web_locale_keymap/lib/web_locale_keymap/locale_keymap.dart index a90e9fb4f0b87..ddb4d9e4e3585 100644 --- a/third_party/web_locale_keymap/lib/web_locale_keymap/types.dart +++ b/third_party/web_locale_keymap/lib/web_locale_keymap/locale_keymap.dart @@ -5,20 +5,36 @@ import 'key_mappings.g.dart'; -class LayoutMapping { - LayoutMapping.win() : _mapping = kMappingDataWin; - LayoutMapping.linux() : _mapping = kMappingDataLinux; - LayoutMapping.darwin() : _mapping = kMappingDataDarwin; - - static int? _characterToLogicalKey(String? key) { - // We have yet to find a case where length >= 2 is useful. - if (key == null || key.length >= 2) { - return null; - } - final int result = key.toLowerCase().codeUnitAt(0); - return result; +int? _characterToLogicalKey(String? key) { + // We have yet to find a case where length >= 2 is useful. + if (key == null || key.length >= 2) { + return null; } + final int result = key.toLowerCase().codeUnitAt(0); + return result; +} + +/// Maps locale-sensitive keys from KeyboardEvent properties to a logical key. +class LocaleKeymap { + /// Create a [LocaleKeymap] for Windows. + LocaleKeymap.win() : _mapping = kMappingDataWin; + + /// Create a [LocaleKeymap] for Linux. + LocaleKeymap.linux() : _mapping = kMappingDataLinux; + + /// Create a [LocaleKeymap] for Darwin. + LocaleKeymap.darwin() : _mapping = kMappingDataDarwin; + /// Return a logical key mapped from KeyboardEvent properties. + /// + /// This method handles all printable characters, including letters, digits, + /// and symbols. + /// + /// Before calling this method, the caller should have eliminated cases where + /// the event key is a "key name", such as "Shift" or "AudioVolumnDown". + /// + /// If the return value is null, there's no way to derive a meaningful value + /// from the printable information of the event. int? getLogicalKey(String? eventCode, String? eventKey, int eventKeyCode) { final int? result = _mapping[eventCode]?[eventKey]; if (result == kUseKeyCode) { From cf2df77899aacc9d68b486b6abca11f54af20b0c Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 14 Nov 2022 19:02:10 -0800 Subject: [PATCH 43/74] Rename to heuristicMapper --- third_party/web_locale_keymap/README.md | 2 +- .../lib/web_locale_keymap/key_mappings.g.dart | 2 +- .../lib/web_locale_keymap/locale_keymap.dart | 2 +- third_party/web_locale_keymap/pubspec.yaml | 5 +- .../bin/gen_web_locale_keymap.dart | 2 +- ...k_detector.dart => benchmark_planner.dart} | 5 +- tools/gen_web_locale_keymap/lib/common.dart | 2 +- .../test/gen_defaults_test.dart | 130 ------------------ 8 files changed, 10 insertions(+), 140 deletions(-) rename tools/gen_web_locale_keymap/lib/{benchmark_detector.dart => benchmark_planner.dart} (95%) delete mode 100644 tools/gen_web_locale_keymap/test/gen_defaults_test.dart diff --git a/third_party/web_locale_keymap/README.md b/third_party/web_locale_keymap/README.md index b37ce0bafa6d9..dc1cea25026e2 100644 --- a/third_party/web_locale_keymap/README.md +++ b/third_party/web_locale_keymap/README.md @@ -1,4 +1,4 @@ -# Web Keyboard Layouts +# Web Locale Keymap # Usage diff --git a/third_party/web_locale_keymap/lib/web_locale_keymap/key_mappings.g.dart b/third_party/web_locale_keymap/lib/web_locale_keymap/key_mappings.g.dart index 1838ba865ecdd..b70dc734e7b33 100644 --- a/third_party/web_locale_keymap/lib/web_locale_keymap/key_mappings.g.dart +++ b/third_party/web_locale_keymap/lib/web_locale_keymap/key_mappings.g.dart @@ -101,7 +101,7 @@ bool isAlnum(String char) { /// the event's code and key. /// /// This greatly reduces the entries needed in the final mapping. -int? heuristicDetector(String code, String key) { +int? heuristicMapper(String code, String key) { if (isAlnum(key)) { return key.toLowerCase().codeUnitAt(0); } diff --git a/third_party/web_locale_keymap/lib/web_locale_keymap/locale_keymap.dart b/third_party/web_locale_keymap/lib/web_locale_keymap/locale_keymap.dart index ddb4d9e4e3585..a21ec027e180e 100644 --- a/third_party/web_locale_keymap/lib/web_locale_keymap/locale_keymap.dart +++ b/third_party/web_locale_keymap/lib/web_locale_keymap/locale_keymap.dart @@ -41,7 +41,7 @@ class LocaleKeymap { return eventKeyCode; } if (result == null) { - final int? heuristicResult = heuristicDetector(eventCode ?? '', eventKey ?? ''); + final int? heuristicResult = heuristicMapper(eventCode ?? '', eventKey ?? ''); if (heuristicResult != null) { return heuristicResult; } diff --git a/third_party/web_locale_keymap/pubspec.yaml b/third_party/web_locale_keymap/pubspec.yaml index cea686625ef82..c9c7518d01ed1 100644 --- a/third_party/web_locale_keymap/pubspec.yaml +++ b/third_party/web_locale_keymap/pubspec.yaml @@ -1,9 +1,6 @@ name: web_locale_keymap -description: A list of keyboard layouts on Web and their mapping table. -repository: https://github.com/flutter/packages/tree/main/third_party/packages/web_locale_keymap -issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+web_locale_keymap%22 -version: 0.1.1 +publish_to: none environment: sdk: ">=2.12.0 <3.0.0" diff --git a/tools/gen_web_locale_keymap/bin/gen_web_locale_keymap.dart b/tools/gen_web_locale_keymap/bin/gen_web_locale_keymap.dart index 46dfc81b81997..3d5e89a4ff264 100644 --- a/tools/gen_web_locale_keymap/bin/gen_web_locale_keymap.dart +++ b/tools/gen_web_locale_keymap/bin/gen_web_locale_keymap.dart @@ -5,7 +5,7 @@ import 'dart:io'; import 'package:args/args.dart'; -import 'package:gen_web_keyboard_layouts/benchmark_detector.dart'; +import 'package:gen_web_keyboard_layouts/benchmark_planner.dart'; import 'package:gen_web_keyboard_layouts/github.dart'; import 'package:gen_web_keyboard_layouts/layout_types.dart'; import 'package:path/path.dart' as path; diff --git a/tools/gen_web_locale_keymap/lib/benchmark_detector.dart b/tools/gen_web_locale_keymap/lib/benchmark_planner.dart similarity index 95% rename from tools/gen_web_locale_keymap/lib/benchmark_detector.dart rename to tools/gen_web_locale_keymap/lib/benchmark_planner.dart index 824e65a7900c7..b2d3b23234ee2 100644 --- a/tools/gen_web_locale_keymap/lib/benchmark_detector.dart +++ b/tools/gen_web_locale_keymap/lib/benchmark_planner.dart @@ -20,6 +20,9 @@ final Map _kMandatoryGoalsByChar = Map.fromEntri /// /// If a eventCode does not exist in this map, then this event's logical key /// should be derived on the fly. +/// +/// This function defines the benchmark planning algorithm if there were a way +/// to know the current keyboard layout. Map planLayout(Map entries) { // The logical key is derived in the following rules: // @@ -93,7 +96,7 @@ Map> combineLayouts(Iterable layouts) { // Remove mapping results that can be derived using heuristics. result.removeWhere((String eventCode, Map codeMap) { codeMap.removeWhere((String eventKey, int logicalKey) => - heuristicDetector(eventCode, eventKey) == logicalKey, + heuristicMapper(eventCode, eventKey) == logicalKey, ); return codeMap.isEmpty; }); diff --git a/tools/gen_web_locale_keymap/lib/common.dart b/tools/gen_web_locale_keymap/lib/common.dart index 4869491cdf7d5..7e03f1f3ded60 100644 --- a/tools/gen_web_locale_keymap/lib/common.dart +++ b/tools/gen_web_locale_keymap/lib/common.dart @@ -91,7 +91,7 @@ bool isAlnum(String char) { /// the event's code and key. /// /// This greatly reduces the entries needed in the final mapping. -int? heuristicDetector(String code, String key) { +int? heuristicMapper(String code, String key) { if (isAlnum(key)) { return key.toLowerCase().codeUnitAt(0); } diff --git a/tools/gen_web_locale_keymap/test/gen_defaults_test.dart b/tools/gen_web_locale_keymap/test/gen_defaults_test.dart deleted file mode 100644 index bde3334ea7716..0000000000000 --- a/tools/gen_web_locale_keymap/test/gen_defaults_test.dart +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright 2014 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:io'; - -import 'package:gen_web_keyboard_layouts/main.dart'; -import 'package:path/path.dart' as path; -import 'package:test/test.dart'; - -void main() { - test('Templates will append to the end of a file', () { - final Directory tempDir = Directory.systemTemp.createTempSync('gen_defaults'); - try { - // Create a temporary file with some content. - final File tempFile = File(path.join(tempDir.path, 'test_template.txt')); - tempFile.createSync(); - tempFile.writeAsStringSync(''' -// This is a file with stuff in it. -// This part shouldn't be changed by -// the template. -'''); - - // Have a test template append new parameterized content to the end of - // the file. - final Map tokens = {'foo': 'Foobar', 'bar': 'Barfoo'}; - TestTemplate(tempFile.path, tokens).updateFile(); - - expect(tempFile.readAsStringSync(), ''' -// This is a file with stuff in it. -// This part shouldn't be changed by -// the template. - -// BEGIN GENERATED TOKEN PROPERTIES - -// Generated code to the end of this file. Do not edit by hand. -// These defaults are generated from the Material Design Token -// database by the script dev/tools/gen_defaults/bin/gen_defaults.dart. - -static final String tokenFoo = 'Foobar'; -static final String tokenBar = 'Barfoo'; - -// END GENERATED TOKEN PROPERTIES -'''); - - } finally { - tempDir.deleteSync(recursive: true); - } - }); - - test('Templates will update over previously generated code at the end of a file', () { - final Directory tempDir = Directory.systemTemp.createTempSync('gen_defaults'); - try { - // Create a temporary file with some content. - final File tempFile = File(path.join(tempDir.path, 'test_template.txt')); - tempFile.createSync(); - tempFile.writeAsStringSync(''' -// This is a file with stuff in it. -// This part shouldn't be changed by -// the template. - -// BEGIN GENERATED TOKEN PROPERTIES - -// Generated code to the end of this file. Do not edit by hand. -// These defaults are generated from the Material Design Token -// database by the script dev/tools/gen_defaults/bin/gen_defaults.dart. - -static final String tokenFoo = 'Foobar'; -static final String tokenBar = 'Barfoo'; - -// END GENERATED TOKEN PROPERTIES -'''); - - // Have a test template append new parameterized content to the end of - // the file. - final Map tokens = {'foo': 'foo', 'bar': 'bar'}; - TestTemplate(tempFile.path, tokens).updateFile(); - - expect(tempFile.readAsStringSync(), ''' -// This is a file with stuff in it. -// This part shouldn't be changed by -// the template. - -// BEGIN GENERATED TOKEN PROPERTIES - -// Generated code to the end of this file. Do not edit by hand. -// These defaults are generated from the Material Design Token -// database by the script dev/tools/gen_defaults/bin/gen_defaults.dart. - -static final String tokenFoo = 'foo'; -static final String tokenBar = 'bar'; - -// END GENERATED TOKEN PROPERTIES -'''); - - } finally { - tempDir.deleteSync(recursive: true); - } - }); - - test('Templates can get proper shapes from given data', () { - const Map tokens = { - 'foo.shape': 'shape.large', - 'bar.shape': 'shape.full', - 'shape.large': { - 'family': 'SHAPE_FAMILY_ROUNDED_CORNERS', - 'topLeft': 1.0, - 'topRight': 2.0, - 'bottomLeft': 3.0, - 'bottomRight': 4.0, - }, - 'shape.full': { - 'family': 'SHAPE_FAMILY_CIRCULAR', - }, - }; - final TestTemplate template = TestTemplate('foobar.dart', tokens); - expect(template.shape('foo'), 'const RoundedRectangleBorder(borderRadius: BorderRadius.only(topLeft: Radius.circular(1.0), topRight: Radius.circular(2.0), bottomLeft: Radius.circular(3.0), bottomRight: Radius.circular(4.0)))'); - expect(template.shape('bar'), 'const StadiumBorder()'); - }); -} - -class TestTemplate extends TokenTemplate { - TestTemplate(super.fileName, super.tokens); - - @override - String generate() => ''' -static final String tokenFoo = '${tokens['foo']}'; -static final String tokenBar = '${tokens['bar']}'; -'''; -} From af178f6e1ef138df4d7cef62ed7de042661283ad Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 14 Nov 2022 19:02:20 -0800 Subject: [PATCH 44/74] Format --- web_sdk/BUILD.gn | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/web_sdk/BUILD.gn b/web_sdk/BUILD.gn index 8807653e8e057..168404bed4821 100644 --- a/web_sdk/BUILD.gn +++ b/web_sdk/BUILD.gn @@ -113,7 +113,8 @@ sdk_rewriter("web_ui_library_sources") { sdk_rewriter("web_locale_keymap_library") { library_name = "web_locale_keymap" - api_file = "//flutter/third_party/web_locale_keymap/lib/web_locale_keymap.dart" + api_file = + "//flutter/third_party/web_locale_keymap/lib/web_locale_keymap.dart" input_dir = "//flutter/third_party/web_locale_keymap/lib/web_locale_keymap/" output_dir = "$root_out_dir/flutter_web_sdk/lib/web_locale_keymap/" } @@ -287,7 +288,8 @@ template("_compile_platform") { assert(defined(invoker.output_dill), "output_dill must be defined for $target_name") _kernel_worker(target_name) { - inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_locale_keymap_sources + inputs = + [ "sdk_rewriter.dart" ] + web_ui_sources + web_locale_keymap_sources outputs = [ invoker.output_dill ] @@ -457,7 +459,8 @@ template("_compile_ddc_modules") { "auto_detect must be defined for $target_name") _dartdevc(target_name) { - inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_locale_keymap_sources + inputs = + [ "sdk_rewriter.dart" ] + web_ui_sources + web_locale_keymap_sources packages = dart_sdk_package_config From b2a63bf921a6c1ddb4c8e84b8e0ab28471259789 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 14 Nov 2022 19:04:15 -0800 Subject: [PATCH 45/74] Fix license --- ci/licenses_golden/licenses_flutter | 1 - 1 file changed, 1 deletion(-) diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index 473c2b7483f5d..83d3b324cae10 100644 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -1901,7 +1901,6 @@ FILE: ../../../flutter/lib/web_ui/lib/src/engine/js_interop/js_loader.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/js_interop/js_promise.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/key_map.g.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/keyboard_binding.dart -FILE: ../../../flutter/lib/web_ui/lib/src/engine/keyboard_layout_detector.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/mouse_cursor.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/navigation.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/navigation/history.dart From 0c51f44461f1c09e4486f80651717ec4e4235512 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Tue, 15 Nov 2022 14:30:28 -0800 Subject: [PATCH 46/74] Fix test --- .../test/engine/pointer_binding_test.dart | 2 +- lib/web_ui/test/keyboard_converter_test.dart | 36 +++++++++---------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/lib/web_ui/test/engine/pointer_binding_test.dart b/lib/web_ui/test/engine/pointer_binding_test.dart index fd4cca8cab730..88c02a05a3ac9 100644 --- a/lib/web_ui/test/engine/pointer_binding_test.dart +++ b/lib/web_ui/test/engine/pointer_binding_test.dart @@ -52,7 +52,7 @@ void testMain() { return KeyboardConverter((ui.KeyData key) { keyDataList.add(key); return true; - }); + }, OperatingSystem.linux); } test('ios workaround', () { diff --git a/lib/web_ui/test/keyboard_converter_test.dart b/lib/web_ui/test/keyboard_converter_test.dart index 53dba7f2e8d7a..bd8f800c0cd4a 100644 --- a/lib/web_ui/test/keyboard_converter_test.dart +++ b/lib/web_ui/test/keyboard_converter_test.dart @@ -85,7 +85,7 @@ void testMain() { keyDataList.add(key); // Only handle down events return key.type == ui.KeyEventType.down; - }); + }, OperatingSystem.linux); converter.handleEvent(keyDownEvent('KeyA', 'a')..timeStamp = 1); expectKeyData(keyDataList.last, @@ -134,7 +134,7 @@ void testMain() { keyDataList.add(key); // Only handle down events return key.type == ui.KeyEventType.down; - }); + }, OperatingSystem.linux); converter.handleEvent(keyDownEvent('ShiftLeft', 'Shift', kShift, kLocationLeft)); expectKeyData(keyDataList.last, @@ -205,7 +205,7 @@ void testMain() { final KeyboardConverter converter = KeyboardConverter((ui.KeyData key) { keyDataList.add(key); return true; - }); + }, OperatingSystem.linux); converter.handleEvent(keyDownEvent('ShiftLeft', 'Shift', kShift, kLocationLeft)); expectKeyData(keyDataList.last, @@ -245,7 +245,7 @@ void testMain() { final KeyboardConverter converter = KeyboardConverter((ui.KeyData key) { keyDataList.add(key); return true; - }); + }, OperatingSystem.linux); converter.handleEvent(keyDownEvent('', 'Shift', kShift)); expectKeyData(keyDataList.last, @@ -317,7 +317,7 @@ void testMain() { final KeyboardConverter converter = KeyboardConverter((ui.KeyData key) { keyDataList.add(key); return true; - }); + }, OperatingSystem.linux); converter.handleEvent(keyDownEvent('Digit1', '1')); expectKeyData(keyDataList.last, @@ -357,7 +357,7 @@ void testMain() { final KeyboardConverter converter = KeyboardConverter((ui.KeyData key) { keyDataList.add(key); return true; - }); + }, OperatingSystem.linux); // The absolute values of the following logical keys are not guaranteed. const int kLogicalAltE = 0x1740070008; @@ -431,7 +431,7 @@ void testMain() { final KeyboardConverter converter = KeyboardConverter((ui.KeyData key) { keyDataList.add(key); return true; - }); + }, OperatingSystem.linux); converter.handleEvent(keyDownEvent('ShiftLeft', 'Shift', kShift, kLocationLeft)); expect(MockKeyboardEvent.lastDefaultPrevented, isTrue); @@ -472,7 +472,7 @@ void testMain() { final KeyboardConverter converter = KeyboardConverter((ui.KeyData key) { keyDataList.add(key); return true; - }); + }, OperatingSystem.linux); // A KeyDown of ShiftRight is missed due to loss of focus. converter.handleEvent(keyUpEvent('ShiftRight', 'Shift', 0, kLocationRight)); @@ -487,7 +487,7 @@ void testMain() { final KeyboardConverter converter = KeyboardConverter((ui.KeyData key) { keyDataList.add(key); return true; - }); + }, OperatingSystem.linux); // Same layout converter.handleEvent(keyDownEvent('KeyA', 'a')); @@ -525,7 +525,7 @@ void testMain() { final KeyboardConverter converter = KeyboardConverter((ui.KeyData key) { keyDataList.add(key); return true; - }, onMacOs: true); + }, OperatingSystem.macOs); // A KeyDown of ShiftRight is missed due to loss of focus. converter.handleEvent(keyDownEvent('CapsLock', 'CapsLock')); @@ -597,7 +597,7 @@ void testMain() { final KeyboardConverter converter = KeyboardConverter((ui.KeyData key) { keyDataList.add(key); return true; - }); // onMacOs: false + }, OperatingSystem.linux); // onMacOs: false converter.handleEvent(keyDownEvent('CapsLock', 'CapsLock')); expect(keyDataList, hasLength(1)); @@ -647,7 +647,7 @@ void testMain() { final KeyboardConverter converter = KeyboardConverter((ui.KeyData key) { keyDataList.add(key); return true; - }, onMacOs: true); + }, OperatingSystem.macOs); converter.handleEvent(keyDownEvent('MetaLeft', 'Meta', kMeta, kLocationLeft)..timeStamp = 100); async.elapse(const Duration(milliseconds: 100)); @@ -711,7 +711,7 @@ void testMain() { final KeyboardConverter converter = KeyboardConverter((ui.KeyData key) { keyDataList.add(key); return true; - }, onMacOs: true); + }, OperatingSystem.macOs); converter.handleEvent(keyDownEvent('MetaLeft', 'Meta', kMeta, kLocationLeft)..timeStamp = 100); async.elapse(const Duration(milliseconds: 100)); @@ -774,7 +774,7 @@ void testMain() { final KeyboardConverter converter = KeyboardConverter((ui.KeyData key) { keyDataList.add(key); return true; - }); + }, OperatingSystem.linux); converter.handleEvent(keyDownEvent('MetaLeft', 'Meta', kMeta, kLocationLeft)..timeStamp = 100); async.elapse(const Duration(milliseconds: 100)); @@ -831,7 +831,7 @@ void testMain() { final KeyboardConverter converter = KeyboardConverter((ui.KeyData key) { keyDataList.add(key); return true; - }); // onMacOs: false + }, OperatingSystem.linux); converter.handleEvent(keyDownEvent('MetaLeft', 'Meta', kMeta, kLocationLeft)..timeStamp = 100); async.elapse(const Duration(milliseconds: 100)); @@ -855,7 +855,7 @@ void testMain() { final KeyboardConverter converter = KeyboardConverter((ui.KeyData key) { keyDataList.add(key); return true; - }); // onMacOs: false + }, OperatingSystem.linux); converter.handleEvent(keyDownEvent('ScrollLock', 'ScrollLock')); expect(keyDataList, hasLength(1)); @@ -902,7 +902,7 @@ void testMain() { final KeyboardConverter converter = KeyboardConverter((ui.KeyData key) { keyDataList.add(key); return true; - }); // onMacOs: false + }, OperatingSystem.linux); converter.handleEvent(keyDownEvent('ShiftRight', 'Shift', kShift, kLocationRight)); expectKeyData(keyDataList.last, @@ -958,7 +958,7 @@ void testMain() { final KeyboardConverter converter = KeyboardConverter((ui.KeyData key) { keyDataList.add(key); return true; - }); // onMacOs: false + }, OperatingSystem.linux); converter.handleEvent(keyDownEvent('ShiftLeft', 'Shift', kShift, kLocationLeft)); expectKeyData(keyDataList.last, From 7675615b7efd101460a7175ffb76d4008a65880a Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Tue, 15 Nov 2022 15:08:55 -0800 Subject: [PATCH 47/74] Test license --- .../web_locale_keymap/test/layout_mapping_tests.dart | 6 ++++++ third_party/web_locale_keymap/test/test_cases.g.dart | 6 ++++-- third_party/web_locale_keymap/test/testing.dart | 6 +++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/third_party/web_locale_keymap/test/layout_mapping_tests.dart b/third_party/web_locale_keymap/test/layout_mapping_tests.dart index 6025740e3a1a8..454eb83444e9b 100644 --- a/third_party/web_locale_keymap/test/layout_mapping_tests.dart +++ b/third_party/web_locale_keymap/test/layout_mapping_tests.dart @@ -1,3 +1,9 @@ +//--------------------------------------------------------------------------------------------- +// Copyright (c) 2022 Google LLC +// Licensed under the MIT License. See License.txt in the project root for license information. +//--------------------------------------------------------------------------------------------*/ + + import 'package:test/test.dart'; import 'package:web_locale_keymap/web_locale_keymap.dart'; diff --git a/third_party/web_locale_keymap/test/test_cases.g.dart b/third_party/web_locale_keymap/test/test_cases.g.dart index e6d5d5b6c0159..c5e2a0f056f09 100644 --- a/third_party/web_locale_keymap/test/test_cases.g.dart +++ b/third_party/web_locale_keymap/test/test_cases.g.dart @@ -1,5 +1,7 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. +//--------------------------------------------------------------------------------------------- +// Copyright (c) 2022 Google LLC +// Licensed under the MIT License. See License.txt in the project root for license information. +//--------------------------------------------------------------------------------------------*/ // DO NOT EDIT -- DO NOT EDIT -- DO NOT EDIT // diff --git a/third_party/web_locale_keymap/test/testing.dart b/third_party/web_locale_keymap/test/testing.dart index 425a4f1b2cfa9..1f250a9806cb3 100644 --- a/third_party/web_locale_keymap/test/testing.dart +++ b/third_party/web_locale_keymap/test/testing.dart @@ -1,4 +1,8 @@ -// import 'package:litetest/litetest.dart'; +//--------------------------------------------------------------------------------------------- +// Copyright (c) 2022 Google LLC +// Licensed under the MIT License. See License.txt in the project root for license information. +//--------------------------------------------------------------------------------------------*/ + import 'package:test/test.dart'; import 'package:web_locale_keymap/web_locale_keymap.dart'; From f594a0d7f12cc633aa569829b5ce1369f1070c39 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Tue, 15 Nov 2022 15:10:29 -0800 Subject: [PATCH 48/74] Fix tests --- .../web_locale_keymap/test/layout_mapping_tests.dart | 6 +++--- third_party/web_locale_keymap/test/test_cases.g.dart | 6 +++--- third_party/web_locale_keymap/test/testing.dart | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/third_party/web_locale_keymap/test/layout_mapping_tests.dart b/third_party/web_locale_keymap/test/layout_mapping_tests.dart index 454eb83444e9b..2197bf2e46b0c 100644 --- a/third_party/web_locale_keymap/test/layout_mapping_tests.dart +++ b/third_party/web_locale_keymap/test/layout_mapping_tests.dart @@ -11,14 +11,14 @@ import 'test_cases.g.dart'; void main() { group('Win', () { - testWin(LayoutMapping.win()); + testWin(LocaleKeymap.win()); }); group('Linux', () { - testLinux(LayoutMapping.linux()); + testLinux(LocaleKeymap.linux()); }); group('Darwin', () { - testDarwin(LayoutMapping.darwin()); + testDarwin(LocaleKeymap.darwin()); }); } diff --git a/third_party/web_locale_keymap/test/test_cases.g.dart b/third_party/web_locale_keymap/test/test_cases.g.dart index c5e2a0f056f09..f83c09bb4bbc6 100644 --- a/third_party/web_locale_keymap/test/test_cases.g.dart +++ b/third_party/web_locale_keymap/test/test_cases.g.dart @@ -19,7 +19,7 @@ import 'package:test/test.dart'; import 'package:web_locale_keymap/web_locale_keymap.dart'; import 'testing.dart'; -void testWin(LayoutMapping mapping) { +void testWin(LocaleKeymap mapping) { group('cz', () { verifyEntry(mapping, 'Digit0', ['é', '0', '˝', ''], '0'); verifyEntry(mapping, 'Digit1', ['+', '1', '~', ''], '1'); @@ -879,7 +879,7 @@ void testWin(LayoutMapping mapping) { }); } -void testLinux(LayoutMapping mapping) { +void testLinux(LocaleKeymap mapping) { group('de', () { verifyEntry(mapping, 'Digit0', ['0', '=', '}', '°'], '0'); verifyEntry(mapping, 'Digit1', ['1', '!', '¹', '¡'], '1'); @@ -1076,7 +1076,7 @@ void testLinux(LayoutMapping mapping) { }); } -void testDarwin(LayoutMapping mapping) { +void testDarwin(LocaleKeymap mapping) { group('de', () { verifyEntry(mapping, 'Digit0', ['0', '=', '≠', '¯'], '0'); verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '¬'], '1'); diff --git a/third_party/web_locale_keymap/test/testing.dart b/third_party/web_locale_keymap/test/testing.dart index 1f250a9806cb3..8204a5f3222d8 100644 --- a/third_party/web_locale_keymap/test/testing.dart +++ b/third_party/web_locale_keymap/test/testing.dart @@ -27,7 +27,7 @@ String _fromCharCode(int? logicalKey) { return String.fromCharCode(logicalKey); } -void verifyEntry(LayoutMapping mapping, String eventCode, List eventKeys, String mappedResult) { +void verifyEntry(LocaleKeymap mapping, String eventCode, List eventKeys, String mappedResult) { // If the first two entry of KeyboardEvent.key are letter keys such as "a" and // "A", then KeyboardEvent.keyCode is the upper letter such as "A". Otherwise, // this field must not be used (in reality this field may or may not be From c4d0aab21d60841e840775b87e0120766216e648 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Tue, 15 Nov 2022 17:30:00 -0800 Subject: [PATCH 49/74] Fix import as --- lib/web_ui/lib/src/engine/keyboard_binding.dart | 12 ++++++------ .../gen_web_locale_keymap/data/test_cases.dart.tmpl | 6 ++++-- web_sdk/sdk_rewriter.dart | 2 +- web_sdk/test/sdk_rewriter_test.dart | 1 + 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/lib/web_ui/lib/src/engine/keyboard_binding.dart b/lib/web_ui/lib/src/engine/keyboard_binding.dart index 0ca778ea42831..16a0b36732cbf 100644 --- a/lib/web_ui/lib/src/engine/keyboard_binding.dart +++ b/lib/web_ui/lib/src/engine/keyboard_binding.dart @@ -4,7 +4,7 @@ import 'package:meta/meta.dart'; import 'package:ui/ui.dart' as ui; -import 'package:web_locale_keymap/web_locale_keymap.dart' as keyboard_layouts; +import 'package:web_locale_keymap/web_locale_keymap.dart' as locale_keymap; import '../engine.dart' show registerHotRestartListener; import 'browser_detection.dart'; @@ -240,17 +240,17 @@ class KeyboardConverter { // are comprehended. final bool onMacOs; // Maps logical keys from key event properties. - final keyboard_layouts.LocaleKeymap _mapping; + final locale_keymap.LocaleKeymap _mapping; - static keyboard_layouts.LocaleKeymap _mappingFromPlatform(OperatingSystem platform) { + static locale_keymap.LocaleKeymap _mappingFromPlatform(OperatingSystem platform) { switch (platform) { case OperatingSystem.iOs: case OperatingSystem.macOs: - return keyboard_layouts.LocaleKeymap.darwin(); + return locale_keymap.LocaleKeymap.darwin(); case OperatingSystem.windows: - return keyboard_layouts.LocaleKeymap.win(); + return locale_keymap.LocaleKeymap.win(); default: - return keyboard_layouts.LocaleKeymap.linux(); + return locale_keymap.LocaleKeymap.linux(); } } diff --git a/tools/gen_web_locale_keymap/data/test_cases.dart.tmpl b/tools/gen_web_locale_keymap/data/test_cases.dart.tmpl index 20b26c15c1d1b..0aba83fc6733e 100644 --- a/tools/gen_web_locale_keymap/data/test_cases.dart.tmpl +++ b/tools/gen_web_locale_keymap/data/test_cases.dart.tmpl @@ -1,5 +1,7 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. +//--------------------------------------------------------------------------------------------- +// Copyright (c) 2022 Google LLC +// Licensed under the MIT License. See License.txt in the project root for license information. +//--------------------------------------------------------------------------------------------*/ // DO NOT EDIT -- DO NOT EDIT -- DO NOT EDIT // diff --git a/web_sdk/sdk_rewriter.dart b/web_sdk/sdk_rewriter.dart index c71677ce9066c..afacb1ddc8870 100644 --- a/web_sdk/sdk_rewriter.dart +++ b/web_sdk/sdk_rewriter.dart @@ -63,7 +63,7 @@ import 'dart:_js_annotations'; import 'dart:math' as math; import 'dart:typed_data'; import 'dart:ui' as ui; -import 'dart:web_locale_keymap' as keyboard_layouts; +import 'dart:web_locale_keymap' as locale_keymap; $extraImports ''' ), diff --git a/web_sdk/test/sdk_rewriter_test.dart b/web_sdk/test/sdk_rewriter_test.dart index 52cacc9e5306b..19210db543780 100644 --- a/web_sdk/test/sdk_rewriter_test.dart +++ b/web_sdk/test/sdk_rewriter_test.dart @@ -35,6 +35,7 @@ import 'dart:_js_annotations'; import 'dart:math' as math; import 'dart:typed_data'; import 'dart:ui' as ui; +import 'dart:web_locale_keymap as locale_keymap'; import 'dart:extra'; From 5dc792a5a5176c03b39431b55de229ed92818cad Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Tue, 15 Nov 2022 17:46:33 -0800 Subject: [PATCH 50/74] Fix analyze problem --- ci/analyze.sh | 1 + tools/gen_web_locale_keymap/pubspec.yaml | 4 ---- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/ci/analyze.sh b/ci/analyze.sh index 6b84ec312ca6f..907544bdc3b2a 100755 --- a/ci/analyze.sh +++ b/ci/analyze.sh @@ -52,6 +52,7 @@ echo "" "$DART" analyze --fatal-infos --fatal-warnings "$FLUTTER_DIR/flutter_frontend_server" +(cd "$FLUTTER_DIR/tools/gen_web_locale_keymap"; "$DART" pub get) "$DART" analyze --fatal-infos --fatal-warnings "$FLUTTER_DIR/tools" (cd "$FLUTTER_DIR/testing/skia_gold_client"; "$DART" pub get) diff --git a/tools/gen_web_locale_keymap/pubspec.yaml b/tools/gen_web_locale_keymap/pubspec.yaml index 709cd7e428be5..363b3b533e33c 100644 --- a/tools/gen_web_locale_keymap/pubspec.yaml +++ b/tools/gen_web_locale_keymap/pubspec.yaml @@ -16,9 +16,5 @@ dev_dependencies: dependency_overrides: args: path: ../../../third_party/dart/third_party/pkg/args - # convert: - # path: ../../../third_party/dart/third_party/pkg/convert meta: path: ../../../third_party/dart/pkg/meta - # typed_data: - # path: ../../../third_party/dart/third_party/pkg/typed_data From 0c5dffe6baee5d8d64ea7f71bcc804be2a74b51c Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Wed, 16 Nov 2022 14:04:23 -0800 Subject: [PATCH 51/74] Fix license --- web_sdk/test/sdk_rewriter_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web_sdk/test/sdk_rewriter_test.dart b/web_sdk/test/sdk_rewriter_test.dart index 19210db543780..0c92d0168e08e 100644 --- a/web_sdk/test/sdk_rewriter_test.dart +++ b/web_sdk/test/sdk_rewriter_test.dart @@ -35,7 +35,7 @@ import 'dart:_js_annotations'; import 'dart:math' as math; import 'dart:typed_data'; import 'dart:ui' as ui; -import 'dart:web_locale_keymap as locale_keymap'; +import 'dart:web_locale_keymap' as locale_keymap; import 'dart:extra'; From 6450c92b19a0d1f7bf4aa55734ca2db3b069669f Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Wed, 16 Nov 2022 14:08:58 -0800 Subject: [PATCH 52/74] Update license pattern --- tools/licenses/lib/patterns.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/licenses/lib/patterns.dart b/tools/licenses/lib/patterns.dart index b6a6f6d742a95..133a31ed479fe 100644 --- a/tools/licenses/lib/patterns.dart +++ b/tools/licenses/lib/patterns.dart @@ -57,6 +57,7 @@ final List copyrightStatementLeadingPatterns = [ RegExp(r'^ *(?:Portions(?: are)? )?Copyright .+$', caseSensitive: false), RegExp(r'^.*All rights? reserved\.$', caseSensitive: false), RegExp(r'^ *\(C\) .+$', caseSensitive: false), + RegExp(r'^Copyright \(C\) .+$', caseSensitive: false), RegExp(r'^:copyright: .+$', caseSensitive: false), RegExp(r'[-_a-zA-Z0-9()]+ function provided freely by .+'), RegExp(r'^.+ optimized code \(C\) COPYRIGHT .+$', caseSensitive: false), @@ -78,6 +79,7 @@ final List copyrightStatementPatterns = [ RegExp(r'^\(Version [-0-9.:, ]+ Copyright .+\)$', caseSensitive: false), RegExp(r'^.*(?:All )?rights? reserved\.$', caseSensitive: false), RegExp(r'^ *\(C\) .+$', caseSensitive: false), + RegExp(r'^Copyright \(C\) .+$', caseSensitive: false), RegExp(r'^:copyright: .+$', caseSensitive: false), RegExp(r'^ *[0-9][0-9][0-9][0-9].+ [<(].+@.+[)>]$'), RegExp(r'^ [^ ].* [<(].+@.+[)>]$'), // that's exactly the number of spaces to line up with the X if "Copyright (c) 2011 X" is on the previous line From 0ab2d9ca16905273d5fd2475e170994a06f49b20 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Wed, 16 Nov 2022 14:36:51 -0800 Subject: [PATCH 53/74] The MIT license --- tools/licenses/lib/patterns.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/licenses/lib/patterns.dart b/tools/licenses/lib/patterns.dart index 133a31ed479fe..32a0de5b3290a 100644 --- a/tools/licenses/lib/patterns.dart +++ b/tools/licenses/lib/patterns.dart @@ -152,7 +152,7 @@ final List copyrightStatementPatterns = [ RegExp(r'^California, Lawrence Berkeley Laboratory\.$'), RegExp(r'^ *Condition of use and distribution are the same than zlib :$'), - RegExp(r'^The MIT License:$'), + RegExp(r'^(The )?MIT License:?$'), RegExp(r'^$'), // TODO(ianh): file an issue on what happens if you omit the close quote From ec0a719b4fcf1e7468e9efa9d6e682dac4cf4404 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Wed, 16 Nov 2022 15:45:55 -0800 Subject: [PATCH 54/74] License diff --- ci/licenses_golden/licenses_flutter | 56 ++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index 83d3b324cae10..0dbc39a49b53d 100644 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -1,6 +1,31 @@ UNUSED LICENSES: - +==================================================================================================== +ORIGIN: ../../../flutter/third_party/web_locale_keymap/License.txt +TYPE: LicenseType.mit +---------------------------------------------------------------------------------------------------- +MIT License + +Copyright (c) 2015 - present Microsoft Corporation + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +==================================================================================================== ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ USED LICENSES: @@ -306,6 +331,35 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================================================== +==================================================================================================== +LIBRARY: web_locale_keymap +ORIGIN: ../../../flutter/third_party/web_locale_keymap/lib/web_locale_keymap/key_mappings.g.dart + ../../../flutter/third_party/web_locale_keymap/License.txt +TYPE: LicenseType.mit +FILE: ../../../flutter/third_party/web_locale_keymap/lib/web_locale_keymap.dart +FILE: ../../../flutter/third_party/web_locale_keymap/lib/web_locale_keymap/key_mappings.g.dart +FILE: ../../../flutter/third_party/web_locale_keymap/lib/web_locale_keymap/locale_keymap.dart +---------------------------------------------------------------------------------------------------- +Copyright (c) 2022 Google LLC + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +==================================================================================================== + ==================================================================================================== LIBRARY: accessibility ORIGIN: ../../../flutter/third_party/accessibility/gfx/geometry/insets.cc + ../../../LICENSE From f1334ced08688e5749c838b352949f49695b2ae2 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Wed, 16 Nov 2022 16:39:43 -0800 Subject: [PATCH 55/74] Fix license --- ci/licenses_golden/licenses_flutter | 60 ++++++++++++++--------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index 0dbc39a49b53d..ba5987c658a3d 100644 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -331,35 +331,6 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================================================== -==================================================================================================== -LIBRARY: web_locale_keymap -ORIGIN: ../../../flutter/third_party/web_locale_keymap/lib/web_locale_keymap/key_mappings.g.dart + ../../../flutter/third_party/web_locale_keymap/License.txt -TYPE: LicenseType.mit -FILE: ../../../flutter/third_party/web_locale_keymap/lib/web_locale_keymap.dart -FILE: ../../../flutter/third_party/web_locale_keymap/lib/web_locale_keymap/key_mappings.g.dart -FILE: ../../../flutter/third_party/web_locale_keymap/lib/web_locale_keymap/locale_keymap.dart ----------------------------------------------------------------------------------------------------- -Copyright (c) 2022 Google LLC - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -==================================================================================================== - ==================================================================================================== LIBRARY: accessibility ORIGIN: ../../../flutter/third_party/accessibility/gfx/geometry/insets.cc + ../../../LICENSE @@ -619,6 +590,35 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ==================================================================================================== +==================================================================================================== +LIBRARY: web_locale_keymap +ORIGIN: ../../../flutter/third_party/web_locale_keymap/lib/web_locale_keymap/key_mappings.g.dart + ../../../flutter/third_party/web_locale_keymap/License.txt +TYPE: LicenseType.mit +FILE: ../../../flutter/third_party/web_locale_keymap/lib/web_locale_keymap.dart +FILE: ../../../flutter/third_party/web_locale_keymap/lib/web_locale_keymap/key_mappings.g.dart +FILE: ../../../flutter/third_party/web_locale_keymap/lib/web_locale_keymap/locale_keymap.dart +---------------------------------------------------------------------------------------------------- +Copyright (c) 2022 Google LLC + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +==================================================================================================== + ==================================================================================================== LIBRARY: accessibility ORIGIN: ../../../flutter/third_party/accessibility/ax/ax_export.h + ../../../LICENSE @@ -3736,4 +3736,4 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ==================================================================================================== -Total license count: 16 +Total license count: 18 From c0ba71e20464cf4ed15d44c95385cae45f65c228 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Wed, 16 Nov 2022 17:39:02 -0800 Subject: [PATCH 56/74] Update signature --- ci/licenses_golden/tool_signature | 3 +-- third_party/web_locale_keymap/README.md | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/ci/licenses_golden/tool_signature b/ci/licenses_golden/tool_signature index e7884ad2cb98d..d36fb038d1edf 100644 --- a/ci/licenses_golden/tool_signature +++ b/ci/licenses_golden/tool_signature @@ -1,2 +1 @@ -Signature: ae1981a94872d143d802356ab0f1a35e - +Signature: 2f8d576a4dc52defd0d24ac93fd33e71 diff --git a/third_party/web_locale_keymap/README.md b/third_party/web_locale_keymap/README.md index dc1cea25026e2..b0cf74e307fd1 100644 --- a/third_party/web_locale_keymap/README.md +++ b/third_party/web_locale_keymap/README.md @@ -18,3 +18,25 @@ For issues, file directly in the [main Flutter repo](https://github.com/flutter/ # Layouts TODO + + +# Web Locale Keymap +============== + +This accessibility library is a fork of the [chromium](https://www.chromium.org) accessibility code at commit +[4579d5538f06c5ef615a15bc67ebb9ac0523a973](https://chromium.googlesource.com/chromium/src/+/4579d5538f06c5ef615a15bc67ebb9ac0523a973). + +For the main ax code, the following parts were not imported: +`fuzz_corpus`, `extensions` and `DEPS` files. + +`ax/`: https://source.chromium.org/chromium/chromium/src/+/master:ui/accessibility/ +`ax_build/`: https://source.chromium.org/chromium/chromium/src/+/master:build/ +`base/`: https://source.chromium.org/chromium/chromium/src/+/master:base/ +`gfx/`: https://source.chromium.org/chromium/chromium/src/+/master:ui/gfx/ + +Update to this Library +============== +Bug fixes to the forked files in the four directories should proceed as usual. +New features or changes that change the behaviors of these classes are discouraged. + +If you do need to make such change, please log the change at the end of this file. From 2809d2615dc3705194dedb9a2d596f39417e1a44 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Wed, 16 Nov 2022 18:54:35 -0800 Subject: [PATCH 57/74] readme --- ci/licenses_golden/tool_signature | 2 +- third_party/web_locale_keymap/README.md | 68 ++++++++++++------------- tools/gen_web_locale_keymap/README.md | 63 ++++++++++++++++++++++- 3 files changed, 95 insertions(+), 38 deletions(-) diff --git a/ci/licenses_golden/tool_signature b/ci/licenses_golden/tool_signature index d36fb038d1edf..6587462429f08 100644 --- a/ci/licenses_golden/tool_signature +++ b/ci/licenses_golden/tool_signature @@ -1 +1 @@ -Signature: 2f8d576a4dc52defd0d24ac93fd33e71 +Signature: 2f8d576a4dc52defd0d24ac93fd33e71 \ No newline at end of file diff --git a/third_party/web_locale_keymap/README.md b/third_party/web_locale_keymap/README.md index b0cf74e307fd1..b327606d73b51 100644 --- a/third_party/web_locale_keymap/README.md +++ b/third_party/web_locale_keymap/README.md @@ -1,42 +1,38 @@ # Web Locale Keymap -# Usage +This package maps Web's KeyboardEvent to Flutter's logical keys. It only +includes "locale sensitive" keys, which are all the letters, regular digits, and +symbols. It works for all layouts shown in [Microsoft/VSCode](https://github.com/microsoft/vscode) repo. -https://pub.dev/packages/web_locale_keymap +The mapping data and test cases are generated by `gen_web_locale_keymap` package. +Do not edit them manually. -[![pub package](https://img.shields.io/pub/v/web_locale_keymap.svg)](https://pub.dev/packages/web_locale_keymap) +# Usage -```yaml -dependencies: - web_locale_keymap: ^ +1. Ensure that the key is a locale key. +2. Get the logical key from `getLogicalKey()`. +3. If the return value is null, then the key can not be mapped as a character +either. Mint the logical key value. + +```dart +import 'package:web_locale_keymap/web_locale_keymap.dart' as locale_keymap; + +final locale_keymap.LocaleKeymap mapping = + locale_keymap.LocaleKeymap.win(); // Or .darwin() or .linux() + +/* ... */ + +int getLogicalKey(html.KeyboardEvent event) { + int? result = _convertToDeadKey(event) + ?? _convertToUnprintableKey(event) + ?? _convertToNumpadKey(event); + if (result != null) { + return result; + } + result = mapping.getLogicalKey(event.code, event.key, event.keyCode); + if (result != null) { + return result; + } + return _mintLogicalKey(event); +} ``` - -# Issues - -For issues, file directly in the [main Flutter repo](https://github.com/flutter/flutter). - -# Layouts - -TODO - - -# Web Locale Keymap -============== - -This accessibility library is a fork of the [chromium](https://www.chromium.org) accessibility code at commit -[4579d5538f06c5ef615a15bc67ebb9ac0523a973](https://chromium.googlesource.com/chromium/src/+/4579d5538f06c5ef615a15bc67ebb9ac0523a973). - -For the main ax code, the following parts were not imported: -`fuzz_corpus`, `extensions` and `DEPS` files. - -`ax/`: https://source.chromium.org/chromium/chromium/src/+/master:ui/accessibility/ -`ax_build/`: https://source.chromium.org/chromium/chromium/src/+/master:build/ -`base/`: https://source.chromium.org/chromium/chromium/src/+/master:base/ -`gfx/`: https://source.chromium.org/chromium/chromium/src/+/master:ui/gfx/ - -Update to this Library -============== -Bug fixes to the forked files in the four directories should proceed as usual. -New features or changes that change the behaviors of these classes are discouraged. - -If you do need to make such change, please log the change at the end of this file. diff --git a/tools/gen_web_locale_keymap/README.md b/tools/gen_web_locale_keymap/README.md index d58e2eef3ec01..7f48bc3282fea 100644 --- a/tools/gen_web_locale_keymap/README.md +++ b/tools/gen_web_locale_keymap/README.md @@ -1 +1,62 @@ -## Web Keyboard Layouts Generator +# Web Locale Keymap Generator + +This script generates mapping data for `web_locale_keymap`. + +## Usage + +1. `cd` to this folder, run `dart pub get`. +2. [Create a Github access token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token), then store it to environment variable `$GITHUB_TOKEN`. This token is only for quota controlling and does not need any scopes. +``` +# ~/.zshrc +export GITHUB_TOKEN= +``` +3. Run +``` +dart --enable-asserts bin/gen_web_locale_keymap.dart +``` + +### Help +For help on CLI, +``` +dart --enable-asserts bin/gen_web_locale_keymap.dart -h +``` + +## Explanation + +To derive a key map that allows international layout to properly trigger +shortcuts, we can't [simply map logical keys from the current +event](https://github.com/flutter/flutter/issues/100456). Instead, we need to +analyze the entire current layout and plan ahead. This algorithm, +which we call the benchmark planner, goes as follows: + +> Analyze every key of the current layout, +> 1. If a key can produce an alnum under some modifier, then this key is mapped to this alnum. +> 2. After the previous step, if some alnum is not mapped, they're mapped to their corresponding key on the US keyboard. +> 3. The remaining keys are mapped to the unicode plane according to their produced character. + +However, we can't simply apply this algorithm to Web: unlike other desktop +platforms, Web DOM API does not tell which keyboard layout the user is on, or +how the current layout maps keys (there is a KeyboardLayout API that is +supported only by Chrome, and explicitly refused by all other browsers). So we +have to invent a "blind" algorithm that applies to any layout, while keeping the +same result. + +Luckily, we're able to fetch a list of "all keyboard layouts" from +`Microsoft/VSCode` repo, and we analyzed all layouts beforehand, and managed to +combine the result into a huge `code -> key -> result` map. You would imagine it +being impossible, since different layouts might use the same `(code, key)` pair +for different characters, but in fact such conflicts are surprisingly few, and +all the conflicts are mapped to letters. For example, `es-linux` maps +`('KeyY', '←')` to `y`, while `de-linux` maps `('KeyY', '←')` to `z`. + +We can't distinguished these conflicts only by the `(code, key)` pair, but we +can use other information: `keyCode`. Now, keyCode is a deprecated property, but +we really don't see it being removed any time foreseeable. Also, although +keyCode is infamous for being platform-dependent, for letter keys it is always +equal to the letter character. Therefore such conflicting cases are all mapped +to a special value, 0x01, indicating "use keyCode". + +Moreover, to reduce the size of the map, we noticed there are certain patterns +that can be easily represented by some if statements. These patterns are +extracted as the so-called "heuristic mapper". This reduces the map from over +1600 entries to ~450 entries. From 8b36170508f3dc5514b48e6385df238cebfc6461 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Wed, 16 Nov 2022 19:15:49 -0800 Subject: [PATCH 58/74] fix signature? --- ci/licenses_golden/tool_signature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/licenses_golden/tool_signature b/ci/licenses_golden/tool_signature index 6587462429f08..d36fb038d1edf 100644 --- a/ci/licenses_golden/tool_signature +++ b/ci/licenses_golden/tool_signature @@ -1 +1 @@ -Signature: 2f8d576a4dc52defd0d24ac93fd33e71 \ No newline at end of file +Signature: 2f8d576a4dc52defd0d24ac93fd33e71 From 3754b08527062d220f31730ef5b5b5969494e52b Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Wed, 16 Nov 2022 19:16:31 -0800 Subject: [PATCH 59/74] fix signature? --- ci/licenses_golden/tool_signature | 1 + 1 file changed, 1 insertion(+) diff --git a/ci/licenses_golden/tool_signature b/ci/licenses_golden/tool_signature index d36fb038d1edf..39ce5dfced43e 100644 --- a/ci/licenses_golden/tool_signature +++ b/ci/licenses_golden/tool_signature @@ -1 +1,2 @@ Signature: 2f8d576a4dc52defd0d24ac93fd33e71 + From f7de833dba6683803fc6408224bd427cab7440a0 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Wed, 16 Nov 2022 19:46:01 -0800 Subject: [PATCH 60/74] Fix license count --- ci/licenses.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/licenses.sh b/ci/licenses.sh index d661acc12a554..495cbf9afbbbf 100755 --- a/ci/licenses.sh +++ b/ci/licenses.sh @@ -121,7 +121,7 @@ function verify_licenses() ( local actualLicenseCount actualLicenseCount="$(tail -n 1 flutter/ci/licenses_golden/licenses_flutter | tr -dc '0-9')" - local expectedLicenseCount=16 # When changing this number: Update the error message below as well describing all expected license types. + local expectedLicenseCount=18 # When changing this number: Update the error message below as well describing all expected license types. if [[ $actualLicenseCount -ne $expectedLicenseCount ]]; then echo "=============================== ERROR ===============================" From edfdd0f014c950dd65ebe121028ccd0c9e2225b1 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Sun, 27 Nov 2022 20:07:30 -0800 Subject: [PATCH 61/74] Fix build --- web_sdk/BUILD.gn | 1 + 1 file changed, 1 insertion(+) diff --git a/web_sdk/BUILD.gn b/web_sdk/BUILD.gn index af2e97065ac20..220c3ba77d4ee 100644 --- a/web_sdk/BUILD.gn +++ b/web_sdk/BUILD.gn @@ -35,6 +35,7 @@ web_engine_libraries = [ ":web_ui_library", ":web_ui_library_sources", ":web_unicode_library", + ":web_locale_keymap_library", ] group("web_sdk") { From 13e6fb4cb5adbc7d675c18349996062743339ef5 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 28 Nov 2022 11:51:42 -0800 Subject: [PATCH 62/74] Compression --- .../lib/web_locale_keymap/key_mappings.g.dart | 851 +---- .../lib/web_locale_keymap/locale_keymap.dart | 6 +- ...ng_tests.dart => layout_mapping_test.dart} | 0 .../web_locale_keymap/test/test_cases.g.dart | 3168 ++++++++--------- tools/gen_web_locale_keymap/README.md | 8 +- .../bin/gen_web_locale_keymap.dart | 79 +- .../data/key_mappings.dart.tmpl | 13 +- .../data/test_cases.dart.tmpl | 6 +- tools/gen_web_locale_keymap/lib/common.dart | 160 +- web_sdk/sdk_rewriter.dart | 14 - 10 files changed, 1934 insertions(+), 2371 deletions(-) rename third_party/web_locale_keymap/test/{layout_mapping_tests.dart => layout_mapping_test.dart} (100%) diff --git a/third_party/web_locale_keymap/lib/web_locale_keymap/key_mappings.g.dart b/third_party/web_locale_keymap/lib/web_locale_keymap/key_mappings.g.dart index b70dc734e7b33..6f9b8a3ace619 100644 --- a/third_party/web_locale_keymap/lib/web_locale_keymap/key_mappings.g.dart +++ b/third_party/web_locale_keymap/lib/web_locale_keymap/key_mappings.g.dart @@ -15,10 +15,18 @@ // // See flutter/engine:flutter/tools/gen_web_keyboard_layouts/README.md for more information. +/// Used in the final mapping indicating the logical key should be derived from +/// KeyboardEvent.keyCode. +/// +/// This value is chosen because it's a printable character within EASCII that +/// will never be mapped to (checked in the marshalling algorithm). +const int kUseKeyCode = 0xFF; + +/// Used in the final mapping indicating the event key is 'Dead', the dead key. +final String _kUseDead = String.fromCharCode(0xFE); -/// A special value in the final mapping that indicates the logical key should -/// be derived from KeyboardEvent.keyCode. -const int kUseKeyCode = 1; +/// The KeyboardEvent.key for a dead key. +const String _kEventKeyDead = 'Dead'; /// A map of all goals from the scan codes to their mapped value in US layout. const Map kLayoutGoals = { @@ -111,6 +119,73 @@ int? heuristicMapper(String code, String key) { return null; } +// Maps an integer to a printable EASCII character by adding it to this value. +// +// We could've chosen 0x20, the first printable character, for a slightly bigger +// range, but it's prettier this way and sufficient. +final int _kMarshallIntBase = '0'.codeUnitAt(0); + +class _StringStream { + _StringStream(this._data) : _offset = 0; + + final String _data; + + int get offest => _offset; + int _offset; + + int readIntAsVerbatim() { + final int result = _data.codeUnitAt(_offset); + _offset += 1; + assert(result >= _kMarshallIntBase); + return result - _kMarshallIntBase; + } + + int readIntAsChar() { + final int result = _data.codeUnitAt(_offset); + _offset += 1; + return result; + } + + String readEventKey() { + final String char = String.fromCharCode(readIntAsChar()); + if (char == _kUseDead) { + return _kEventKeyDead; + } else { + return char; + } + } + + String readString() { + final int length = readIntAsVerbatim(); + if (length == 0) { + return ''; + } + final String result = _data.substring(_offset, _offset + length); + _offset += length; + return result; + } +} + +Map _unmarshallCodeMap(_StringStream stream) { + final int entryNum = stream.readIntAsVerbatim(); + return Map.fromEntries((() sync* { + for (int entryIndex = 0; entryIndex < entryNum; entryIndex += 1) { + yield MapEntry(stream.readEventKey(), stream.readIntAsChar()); + } + })()); +} + +/// Decode a key mapping data out of the string. +Map> unmarshallMappingData(String compressed) { + final _StringStream stream = _StringStream(compressed); + final int eventCodeNum = stream.readIntAsVerbatim(); + return Map>.fromEntries((() sync* { + for (int eventCodeIndex = 0; eventCodeIndex < eventCodeNum; eventCodeIndex += 1) { + yield MapEntry>(stream.readString(), _unmarshallCodeMap(stream)); + } + })()); +} + /// Data for [LayoutMapping] on Windows. /// /// Do not use this value, but [LayoutMapping.win] instead. @@ -118,225 +193,18 @@ int? heuristicMapper(String code, String key) { /// The keys are `KeyboardEvent.code` and then `KeyboardEvent.key`. The values /// are logical keys or [kUseKeyCode]. Entries that can be derived using /// heuristics have been omitted. -final Map> kMappingDataWin = >{ - 'Backquote': { - '§': 0x30, - }, - 'Digit0': { - ')': 0x30, - '=': 0x30, - '@': 0x30, - '}': 0x30, - }, - 'Digit1': { - '!': 0x31, - '&': 0x31, - "'": 0x31, - '+': 0x31, - '>': 0x31, - '|': 0x31, - '~': 0x31, - }, - 'Digit2': { - '"': 0x32, - "'": 0x32, - '/': 0x32, - '@': 0x32, - '~': 0x32, - }, - 'Digit3': { - '"': 0x33, - '#': 0x33, - '*': 0x33, - '+': 0x33, - '-': 0x33, - '^': 0x33, - }, - 'Digit4': { - '!': 0x34, - r'$': 0x34, - "'": 0x34, - '+': 0x34, - ';': 0x34, - '{': 0x34, - '~': 0x34, - }, - 'Digit5': { - '%': 0x35, - '(': 0x35, - '[': 0x35, - }, - 'Digit6': { - '&': 0x36, - '-': 0x36, - '/': 0x36, - ':': 0x36, - '^': 0x36, - '|': 0x36, - }, - 'Digit7': { - '&': 0x37, - '/': 0x37, - '=': 0x37, - '?': 0x37, - '`': 0x37, - '{': 0x37, - '|': 0x37, - }, - 'Digit8': { - '!': 0x38, - '(': 0x38, - '*': 0x38, - '[': 0x38, - r'\': 0x38, - '_': 0x38, - }, - 'Digit9': { - '(': 0x39, - ')': 0x39, - ']': 0x39, - '^': 0x39, - '{': 0x39, - }, - 'KeyA': { - 'A': 0x41, - 'Q': 0x51, - 'a': 0x41, - 'q': 0x51, - }, - 'KeyB': { - 'B': 0x42, - 'b': 0x42, - '{': 0x42, - }, - 'KeyC': { - '&': 0x43, - 'C': 0x43, - 'c': 0x43, - }, - 'KeyD': { - 'D': 0x44, - 'd': 0x44, - }, - 'KeyE': { - 'E': 0x45, - 'e': 0x45, - }, - 'KeyF': { - 'F': 0x46, - '[': 0x46, - 'f': 0x46, - }, - 'KeyG': { - 'G': 0x47, - ']': 0x47, - 'g': 0x47, - }, - 'KeyH': { - 'H': 0x48, - 'h': 0x48, - }, - 'KeyI': { - 'I': 0x49, - 'i': 0x49, - }, - 'KeyJ': { - 'J': 0x4a, - 'j': 0x4a, - }, - 'KeyK': { - 'K': 0x4b, - 'k': 0x4b, - }, - 'KeyL': { - 'L': 0x4c, - 'l': 0x4c, - }, - 'KeyM': { - '<': 0x4d, - '?': 0x4d, - 'M': 0x4d, - 'm': 0x4d, - }, - 'KeyN': { - 'N': 0x4e, - 'n': 0x4e, - '}': 0x4e, - }, - 'KeyO': { - 'O': 0x4f, - 'o': 0x4f, - }, - 'KeyP': { - 'P': 0x50, - 'p': 0x50, - }, - 'KeyQ': { - '/': 0x51, - '@': 0x51, - 'A': 0x41, - 'Q': 0x51, - r'\': 0x51, - 'a': 0x41, - 'q': 0x51, - }, - 'KeyR': { - 'R': 0x52, - 'r': 0x52, - }, - 'KeyS': { - 'S': 0x53, - 's': 0x53, - }, - 'KeyT': { - 'T': 0x54, - 't': 0x54, - }, - 'KeyU': { - 'U': 0x55, - 'u': 0x55, - }, - 'KeyV': { - '@': 0x56, - 'V': 0x56, - 'v': 0x56, - }, - 'KeyW': { - '"': 0x57, - '?': 0x57, - 'W': 0x57, - 'Z': 0x5a, - 'w': 0x57, - 'z': 0x5a, - '|': 0x57, - }, - 'KeyX': { - '#': 0x58, - ')': 0x58, - 'X': 0x58, - 'x': 0x58, - }, - 'KeyY': { - 'Y': 0x59, - 'Z': 0x5a, - 'y': 0x59, - 'z': 0x5a, - }, - 'KeyZ': { - '(': 0x5a, - '>': 0x59, - 'W': 0x57, - 'Y': 0x59, - 'Z': 0x5a, - 'w': 0x57, - 'y': 0x59, - 'z': 0x5a, - }, - 'Semicolon': { - 'M': 0x4d, - 'm': 0x4d, - }, -}; +Map> getMappingDataWin() { + return unmarshallMappingData( + 'V9Backquote1§06Digit04)0=0@0}06Digit17!1&1\'1+1>1|1~16Digit25"2\'2' + '/2@2~26Digit36"3#3*3+3-3^36Digit47!4\$4\'4+4;4{4~46Digit53%5(5[56D' + r'igit66&6-6/6:6^6|66Digit77&7/7=7?7`7{7|76Digit86!8(8*8[8\8_86Dig' + r'it95(9)9]9^9{94KeyA4AAQQaAqQ4KeyB3BBbB{B4KeyC3&CCCcC4KeyD2DDdD4K' + r'eyE2EEeE4KeyF3FF[FfF4KeyG3GG]GgG4KeyH2HHhH4KeyI2IIiI4KeyJ2JJjJ4K' + r'eyK2KKkK4KeyL2LLlL4KeyM4YWWYYZZwWyYzZ9Semicolon2MMmM'); // 541 characters +} /// Data for [LayoutMapping] on Linux. /// @@ -345,205 +213,17 @@ final Map> kMappingDataWin = > /// The keys are `KeyboardEvent.code` and then `KeyboardEvent.key`. The values /// are logical keys or [kUseKeyCode]. Entries that can be derived using /// heuristics have been omitted. -final Map> kMappingDataLinux = >{ - 'Digit0': { - ')': 0x30, - '=': 0x30, - '@': 0x30, - '}': 0x30, - }, - 'Digit1': { - '!': 0x31, - '&': 0x31, - '|': 0x31, - }, - 'Digit2': { - '"': 0x32, - '@': 0x32, - '~': 0x32, - }, - 'Digit3': { - '"': 0x33, - '#': 0x33, - }, - 'Digit4': { - r'$': 0x34, - "'": 0x34, - ';': 0x34, - '{': 0x34, - '~': 0x34, - }, - 'Digit5': { - '%': 0x35, - '(': 0x35, - '[': 0x35, - }, - 'Digit6': { - '&': 0x36, - '-': 0x36, - ':': 0x36, - '^': 0x36, - '|': 0x36, - }, - 'Digit7': { - '&': 0x37, - '/': 0x37, - '?': 0x37, - '`': 0x37, - '{': 0x37, - }, - 'Digit8': { - '(': 0x38, - '*': 0x38, - '[': 0x38, - r'\': 0x38, - '_': 0x38, - }, - 'Digit9': { - '(': 0x39, - ')': 0x39, - ']': 0x39, - '^': 0x39, - }, - 'KeyA': { - '@': 0x51, - 'A': 0x41, - 'Q': 0x51, - 'a': 0x41, - 'q': 0x51, - 'Ω': 0x51, - }, - 'KeyB': { - 'B': 0x42, - 'b': 0x42, - }, - 'KeyC': { - 'C': 0x43, - 'c': 0x43, - }, - 'KeyD': { - 'D': 0x44, - 'd': 0x44, - }, - 'KeyE': { - 'E': 0x45, - 'e': 0x45, - }, - 'KeyF': { - 'F': 0x46, - 'f': 0x46, - }, - 'KeyG': { - 'G': 0x47, - 'g': 0x47, - }, - 'KeyH': { - 'H': 0x48, - 'h': 0x48, - }, - 'KeyI': { - 'I': 0x49, - 'i': 0x49, - }, - 'KeyJ': { - 'J': 0x4a, - 'j': 0x4a, - }, - 'KeyK': { - '&': 0x4b, - 'K': 0x4b, - 'k': 0x4b, - }, - 'KeyL': { - 'L': 0x4c, - 'l': 0x4c, - }, - 'KeyM': { - 'M': 0x4d, - 'm': 0x4d, - }, - 'KeyN': { - 'N': 0x4e, - 'n': 0x4e, - }, - 'KeyO': { - 'O': 0x4f, - 'o': 0x4f, - }, - 'KeyP': { - 'P': 0x50, - 'p': 0x50, - }, - 'KeyQ': { - '@': 0x51, - 'A': 0x41, - 'Q': 0x51, - 'a': 0x41, - 'q': 0x51, - 'Æ': 0x41, - 'æ': 0x41, - }, - 'KeyR': { - 'R': 0x52, - 'r': 0x52, - }, - 'KeyS': { - 'S': 0x53, - 's': 0x53, - }, - 'KeyT': { - 'T': 0x54, - 't': 0x54, - }, - 'KeyU': { - 'U': 0x55, - 'u': 0x55, - }, - 'KeyV': { - 'V': 0x56, - 'v': 0x56, - }, - 'KeyW': { - '<': 0x5a, - 'W': 0x57, - 'Z': 0x5a, - 'w': 0x57, - 'z': 0x5a, - '«': 0x5a, - }, - 'KeyX': { - '>': 0x58, - 'X': 0x58, - 'x': 0x58, - }, - 'KeyY': { - 'Y': 0x59, - 'Z': 0x5a, - 'y': 0x59, - 'z': 0x5a, - '¥': 0x1, - '←': 0x1, - }, - 'KeyZ': { - '<': 0x5a, - 'W': 0x57, - 'Y': 0x59, - 'Z': 0x5a, - 'w': 0x57, - 'y': 0x59, - 'z': 0x5a, - '»': 0x59, - 'Ł': 0x57, - 'ł': 0x57, - '›': 0x59, - }, - 'Semicolon': { - 'M': 0x4d, - 'm': 0x4d, - 'µ': 0x4d, - 'º': 0x4d, - }, -}; +Map> getMappingDataLinux() { + return unmarshallMappingData( + r'U6Digit04)0=0@0}06Digit13!1&1|16Digit23"2@2~26Digit32"3#36Digit4' + r"5$4'4;4{4~46Digit53%5(5[56Digit65&6-6:6^6|66Digit75&7/7?7`7{76Di" + r'git85(8*8[8\8_86Digit94(9)9]9^94KeyA6@QAAQQaAqQΩQ4KeyB2BBbB4KeyC' + r'2CCcC4KeyD2DDdD4KeyE2EEeE4KeyF2FFfF4KeyG2GGgG4KeyH2HHhH4KeyI2IIi' + r'I4KeyJ2JJjJ4KeyK3&KKKkK4KeyL2LLlL4KeyM2MMmM4KeyN2NNnN4KeyO2OOoO4' + r'KeyP2PPpP4KeyQ7@QAAQQaAqQÆAæA4KeyR2RRrR4KeyS2SSsS4KeyT2TTtT4KeyU' + r'2UUuU4KeyV2VVvV4KeyW6XXXxX4KeyY6YYZZyYzZ¥ÿ←ÿ4' + r'KeyZ;> kMappingDataLinux = > kMappingDataDarwin = >{ - 'Comma': { - 'W': 0x57, - 'w': 0x57, - '„': 0x57, - '∑': 0x57, - }, - 'Digit0': { - ')': 0x30, - '=': 0x30, - '`': 0x30, - '}': 0x30, - }, - 'Digit1': { - '!': 0x31, - '&': 0x31, - '|': 0x31, - }, - 'Digit2': { - '"': 0x32, - '@': 0x32, - }, - 'Digit3': { - '"': 0x33, - '#': 0x33, - }, - 'Digit4': { - r'$': 0x34, - '%': 0x34, - "'": 0x34, - }, - 'Digit5': { - '%': 0x35, - '(': 0x35, - ':': 0x35, - '[': 0x35, - '{': 0x35, - '~': 0x35, - }, - 'Digit6': { - ' ': 0x36, - '&': 0x36, - ',': 0x36, - ']': 0x36, - '^': 0x36, - }, - 'Digit7': { - '&': 0x37, - '.': 0x37, - '/': 0x37, - r'\': 0x37, - '|': 0x37, - }, - 'Digit8': { - '!': 0x38, - '(': 0x38, - '*': 0x38, - ';': 0x38, - '[': 0x38, - '{': 0x38, - }, - 'Digit9': { - ' ': 0x39, - "'": 0x39, - '(': 0x39, - ')': 0x39, - ']': 0x39, - '{': 0x39, - '}': 0x39, - }, - 'KeyA': { - 'A': 0x41, - 'Q': 0x51, - 'a': 0x41, - 'q': 0x51, - 'Ω': 0x51, - '‡': 0x51, - }, - 'KeyB': { - 'B': 0x42, - 'X': 0x58, - 'b': 0x42, - 'x': 0x58, - '˛': 0x58, - '≈': 0x58, - }, - 'KeyC': { - ' ': 0x43, - 'C': 0x43, - 'J': 0x4a, - 'c': 0x43, - 'j': 0x4a, - 'Ô': 0x4a, - '∆': 0x4a, - }, - 'KeyD': { - 'D': 0x44, - 'Dead': 0x45, - 'E': 0x45, - 'd': 0x44, - 'e': 0x45, - '´': 0x45, - }, - 'KeyE': { - 'E': 0x45, - 'e': 0x45, - }, - 'KeyF': { - 'Dead': 0x55, - 'F': 0x46, - 'U': 0x55, - 'f': 0x46, - 'u': 0x55, - '¨': 0x55, - }, - 'KeyG': { - 'Dead': 0x1, - 'G': 0x47, - 'I': 0x49, - 'g': 0x47, - 'i': 0x49, - 'ˆ': 0x49, - }, - 'KeyH': { - ' ': 0x48, - 'D': 0x44, - 'H': 0x48, - 'd': 0x44, - 'h': 0x48, - 'Î': 0x1, - '∂': 0x44, - }, - 'KeyI': { - ' ': 0x49, - 'C': 0x43, - 'I': 0x49, - 'c': 0x43, - 'i': 0x49, - 'Ç': 0x43, - 'ç': 0x43, - }, - 'KeyJ': { - 'H': 0x48, - 'J': 0x4a, - 'h': 0x48, - 'j': 0x4a, - 'Ó': 0x48, - '˙': 0x48, - }, - 'KeyK': { - 'K': 0x4b, - 'T': 0x54, - 'k': 0x4b, - 't': 0x54, - 'ˇ': 0x1, - '†': 0x54, - }, - 'KeyL': { - ' ': 0x4c, - '@': 0x4c, - 'Dead': 0x1, - 'L': 0x4c, - 'N': 0x4e, - 'l': 0x4c, - 'n': 0x4e, - '|': 0x4c, - '˜': 0x4e, - }, - 'KeyM': { - 'M': 0x4d, - 'm': 0x4d, - '~': 0x4d, - }, - 'KeyN': { - ' ': 0x4e, - 'B': 0x42, - 'N': 0x4e, - 'b': 0x42, - 'n': 0x4e, - 'ı': 0x1, - '∫': 0x42, - }, - 'KeyO': { - 'O': 0x4f, - 'R': 0x52, - 'o': 0x4f, - 'r': 0x52, - '®': 0x52, - '‰': 0x52, - }, - 'KeyP': { - 'L': 0x4c, - 'P': 0x50, - 'l': 0x4c, - 'p': 0x50, - '¬': 0x4c, - 'Ò': 0x4c, - }, - 'KeyQ': { - 'A': 0x41, - 'Q': 0x51, - 'a': 0x41, - 'q': 0x51, - 'Æ': 0x41, - 'æ': 0x41, - }, - 'KeyR': { - ' ': 0x52, - 'P': 0x50, - 'R': 0x52, - 'p': 0x50, - 'r': 0x52, - 'π': 0x50, - '∏': 0x50, - }, - 'KeyS': { - ' ': 0x53, - 'O': 0x4f, - 'S': 0x53, - 'o': 0x4f, - 's': 0x53, - 'Ø': 0x4f, - 'ø': 0x4f, - }, - 'KeyT': { - 'T': 0x54, - 'Y': 0x59, - 't': 0x54, - 'y': 0x59, - '¥': 0x59, - 'Á': 0x59, - }, - 'KeyU': { - ' ': 0x55, - 'G': 0x47, - 'U': 0x55, - 'g': 0x47, - 'u': 0x55, - '©': 0x47, - '˝': 0x47, - }, - 'KeyV': { - 'K': 0x4b, - 'V': 0x56, - 'k': 0x4b, - 'v': 0x56, - '˚': 0x4b, - '': 0x4b, - }, - 'KeyW': { - 'W': 0x57, - 'Z': 0x5a, - 'w': 0x57, - 'z': 0x5a, - 'Â': 0x5a, - 'Å': 0x5a, - }, - 'KeyX': { - 'Q': 0x51, - 'X': 0x58, - 'q': 0x51, - 'x': 0x58, - 'Œ': 0x51, - 'œ': 0x51, - }, - 'KeyY': { - ' ': 0x59, - 'F': 0x46, - 'Y': 0x59, - 'Z': 0x5a, - 'f': 0x46, - 'y': 0x59, - 'z': 0x5a, - 'Ï': 0x46, - 'ƒ': 0x46, - 'ˇ': 0x5a, - 'Ω': 0x5a, - }, - 'KeyZ': { - ' ': 0x5a, - 'W': 0x57, - 'Y': 0x59, - 'Z': 0x5a, - 'w': 0x57, - 'y': 0x59, - 'z': 0x5a, - '¥': 0x59, - '‡': 0x59, - '‹': 0x1, - '›': 0x57, - }, - 'Period': { - 'V': 0x56, - 'v': 0x56, - '√': 0x56, - '◊': 0x56, - }, - 'Semicolon': { - 'M': 0x4d, - 'S': 0x53, - 'm': 0x4d, - 's': 0x53, - 'µ': 0x4d, - 'Í': 0x53, - 'Ó': 0x4d, - 'ß': 0x53, - }, - 'Slash': { - 'Z': 0x5a, - 'z': 0x5a, - '¸': 0x5a, - 'Ω': 0x5a, - }, -}; +Map> getMappingDataDarwin() { + return unmarshallMappingData( + r'X5Comma4WWwW„W∑W6Digit04)0=0`0}06Digit13!1&1|16Digit22"2@26Digit' + '32"3#36Digit43\$4%4\'46Digit56%5(5:5[5{5~56Digit65 6&6,6]6^66Digit' + r"75&7.7/7\7|76Digit86!8(8*8;8[8{86Digit97 9'9(9)9]9{9}94KeyA6AAQQ" + r'aAqQΩQ‡Q4KeyB6BBXXbBxX˛X≈X4KeyC7 CCCJJcCjJÔJ∆J4KeyD6DDþEEEdDeE´E' + r'4KeyE2EEeE4KeyF6þUFFUUfFuU¨U4KeyG6þÿGGIIgGiIˆI4KeyH7 HDDHHdDhHÎÿ' + r'∂D4KeyI7 ICCIIcCiIÇCçC4KeyJ6HHJJhHjJÓH˙H4KeyK6KKTTkKtTˇÿ†T4KeyL9' + r' L@LþÿLLNNlLnN|L˜N4KeyM3MMmM~M4KeyN7 NBBNNbBnNıÿ∫B4KeyO6OORRoOrR' + r'®R‰R4KeyP6LLPPlLpP¬LÒL4KeyQ6AAQQaAqQÆAæA4KeyR7 RPPRRpPrRπP∏P4Key' + r'S7 SOOSSoOsSØOøO4KeyT6TTYYtTyY¥YÁY4KeyU7 UGGUUgGuU©G˝G4KeyV6KKVV' + r'kKvV˚KK4KeyW6WWZZwWzZÂZÅZ4KeyX6QQXXqQxXŒQœQ4KeyY; YFFYYZZfFyYzZ' + r'ÏFƒFˇZΩZ4KeyZ; ZWWYYZZwWyYzZ¥Y‡Y‹ÿ›W6Period4VVvV√V◊V9Semicolon8M' + r'MSSmMsSµMÍSÓMßS5Slash4ZZzZ¸ZΩZ'); // 734 characters +} diff --git a/third_party/web_locale_keymap/lib/web_locale_keymap/locale_keymap.dart b/third_party/web_locale_keymap/lib/web_locale_keymap/locale_keymap.dart index a21ec027e180e..dd2faa527fc2a 100644 --- a/third_party/web_locale_keymap/lib/web_locale_keymap/locale_keymap.dart +++ b/third_party/web_locale_keymap/lib/web_locale_keymap/locale_keymap.dart @@ -17,13 +17,13 @@ int? _characterToLogicalKey(String? key) { /// Maps locale-sensitive keys from KeyboardEvent properties to a logical key. class LocaleKeymap { /// Create a [LocaleKeymap] for Windows. - LocaleKeymap.win() : _mapping = kMappingDataWin; + LocaleKeymap.win() : _mapping = getMappingDataWin(); /// Create a [LocaleKeymap] for Linux. - LocaleKeymap.linux() : _mapping = kMappingDataLinux; + LocaleKeymap.linux() : _mapping = getMappingDataLinux(); /// Create a [LocaleKeymap] for Darwin. - LocaleKeymap.darwin() : _mapping = kMappingDataDarwin; + LocaleKeymap.darwin() : _mapping = getMappingDataDarwin(); /// Return a logical key mapped from KeyboardEvent properties. /// diff --git a/third_party/web_locale_keymap/test/layout_mapping_tests.dart b/third_party/web_locale_keymap/test/layout_mapping_test.dart similarity index 100% rename from third_party/web_locale_keymap/test/layout_mapping_tests.dart rename to third_party/web_locale_keymap/test/layout_mapping_test.dart diff --git a/third_party/web_locale_keymap/test/test_cases.g.dart b/third_party/web_locale_keymap/test/test_cases.g.dart index f83c09bb4bbc6..6b51d706ef0d2 100644 --- a/third_party/web_locale_keymap/test/test_cases.g.dart +++ b/third_party/web_locale_keymap/test/test_cases.g.dart @@ -21,1722 +21,1722 @@ import 'testing.dart'; void testWin(LocaleKeymap mapping) { group('cz', () { - verifyEntry(mapping, 'Digit0', ['é', '0', '˝', ''], '0'); - verifyEntry(mapping, 'Digit1', ['+', '1', '~', ''], '1'); - verifyEntry(mapping, 'Digit2', ['ě', '2', 'ˇ', ''], '2'); - verifyEntry(mapping, 'Digit3', ['š', '3', '^', ''], '3'); - verifyEntry(mapping, 'Digit4', ['č', '4', '˘', ''], '4'); - verifyEntry(mapping, 'Digit5', ['ř', '5', '°', ''], '5'); - verifyEntry(mapping, 'Digit6', ['ž', '6', '˛', ''], '6'); - verifyEntry(mapping, 'Digit7', ['ý', '7', '`', ''], '7'); - verifyEntry(mapping, 'Digit8', ['á', '8', '˙', ''], '8'); - verifyEntry(mapping, 'Digit9', ['í', '9', '´', ''], '9'); - verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 'A'); - verifyEntry(mapping, 'KeyB', ['b', 'B', '{', ''], 'B'); - verifyEntry(mapping, 'KeyC', ['c', 'C', '&', ''], 'C'); - verifyEntry(mapping, 'KeyD', ['d', 'D', 'Đ', ''], 'D'); - verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 'E'); - verifyEntry(mapping, 'KeyF', ['f', 'F', '[', ''], 'F'); - verifyEntry(mapping, 'KeyG', ['g', 'G', ']', ''], 'G'); - verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 'H'); - verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 'I'); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 'J'); - verifyEntry(mapping, 'KeyK', ['k', 'K', 'ł', ''], 'K'); - verifyEntry(mapping, 'KeyL', ['l', 'L', 'Ł', ''], 'L'); - verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 'M'); - verifyEntry(mapping, 'KeyN', ['n', 'N', '}', ''], 'N'); - verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 'O'); - verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 'P'); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', r'\', ''], 'Q'); - verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 'R'); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'đ', ''], 'S'); - verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 'T'); - verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 'U'); - verifyEntry(mapping, 'KeyV', ['v', 'V', '@', ''], 'V'); - verifyEntry(mapping, 'KeyW', ['w', 'W', '|', ''], 'W'); - verifyEntry(mapping, 'KeyX', ['x', 'X', '#', ''], 'X'); - verifyEntry(mapping, 'KeyY', ['z', 'Z', '', ''], 'Z'); - verifyEntry(mapping, 'KeyZ', ['y', 'Y', '', ''], 'Y'); + verifyEntry(mapping, 'Digit0', [r'é', r'0', r'˝', r''], '0'); + verifyEntry(mapping, 'Digit1', [r'+', r'1', r'~', r''], '1'); + verifyEntry(mapping, 'Digit2', [r'ě', r'2', r'ˇ', r''], '2'); + verifyEntry(mapping, 'Digit3', [r'š', r'3', r'^', r''], '3'); + verifyEntry(mapping, 'Digit4', [r'č', r'4', r'˘', r''], '4'); + verifyEntry(mapping, 'Digit5', [r'ř', r'5', r'°', r''], '5'); + verifyEntry(mapping, 'Digit6', [r'ž', r'6', r'˛', r''], '6'); + verifyEntry(mapping, 'Digit7', [r'ý', r'7', r'`', r''], '7'); + verifyEntry(mapping, 'Digit8', [r'á', r'8', r'˙', r''], '8'); + verifyEntry(mapping, 'Digit9', [r'í', r'9', r'´', r''], '9'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'A'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'{', r''], 'B'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'&', r''], 'C'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'Đ', r''], 'D'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r''], 'E'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'[', r''], 'F'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r']', r''], 'G'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'H'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'I'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'J'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'ł', r''], 'K'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'Ł', r''], 'L'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'', r''], 'M'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'}', r''], 'N'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'O'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'P'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'\', r''], 'Q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'R'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'đ', r''], 'S'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 'T'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'U'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'@', r''], 'V'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'|', r''], 'W'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'#', r''], 'X'); + verifyEntry(mapping, 'KeyY', [r'z', r'Z', r'', r''], 'Z'); + verifyEntry(mapping, 'KeyZ', [r'y', r'Y', r'', r''], 'Y'); }); group('de', () { - verifyEntry(mapping, 'Digit0', ['0', '=', '}', ''], '0'); - verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], '1'); - verifyEntry(mapping, 'Digit2', ['2', '"', '²', ''], '2'); - verifyEntry(mapping, 'Digit3', ['3', '§', '³', ''], '3'); - verifyEntry(mapping, 'Digit4', ['4', r'$', '', ''], '4'); - verifyEntry(mapping, 'Digit5', ['5', '%', '', ''], '5'); - verifyEntry(mapping, 'Digit6', ['6', '&', '', ''], '6'); - verifyEntry(mapping, 'Digit7', ['7', '/', '{', ''], '7'); - verifyEntry(mapping, 'Digit8', ['8', '(', '[', ''], '8'); - verifyEntry(mapping, 'Digit9', ['9', ')', ']', ''], '9'); - verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 'A'); - verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 'B'); - verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 'C'); - verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 'D'); - verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 'E'); - verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 'F'); - verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 'G'); - verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 'H'); - verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 'I'); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 'J'); - verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 'K'); - verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 'L'); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', ''], 'M'); - verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 'N'); - verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 'O'); - verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 'P'); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', '@', ''], 'Q'); - verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 'R'); - verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 'S'); - verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 'T'); - verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 'U'); - verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 'V'); - verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 'W'); - verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 'X'); - verifyEntry(mapping, 'KeyY', ['z', 'Z', '', ''], 'Z'); - verifyEntry(mapping, 'KeyZ', ['y', 'Y', '', ''], 'Y'); + verifyEntry(mapping, 'Digit0', [r'0', r'=', r'}', r''], '0'); + verifyEntry(mapping, 'Digit1', [r'1', r'!', r'', r''], '1'); + verifyEntry(mapping, 'Digit2', [r'2', r'"', r'²', r''], '2'); + verifyEntry(mapping, 'Digit3', [r'3', r'§', r'³', r''], '3'); + verifyEntry(mapping, 'Digit4', [r'4', r'$', r'', r''], '4'); + verifyEntry(mapping, 'Digit5', [r'5', r'%', r'', r''], '5'); + verifyEntry(mapping, 'Digit6', [r'6', r'&', r'', r''], '6'); + verifyEntry(mapping, 'Digit7', [r'7', r'/', r'{', r''], '7'); + verifyEntry(mapping, 'Digit8', [r'8', r'(', r'[', r''], '8'); + verifyEntry(mapping, 'Digit9', [r'9', r')', r']', r''], '9'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'A'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'B'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'C'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'D'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r''], 'E'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'F'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'G'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'H'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'I'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'J'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'K'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'L'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r''], 'M'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'N'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'O'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'P'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'@', r''], 'Q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'R'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 'S'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 'T'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'U'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'V'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'W'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'X'); + verifyEntry(mapping, 'KeyY', [r'z', r'Z', r'', r''], 'Z'); + verifyEntry(mapping, 'KeyZ', [r'y', r'Y', r'', r''], 'Y'); }); group('de-swiss', () { - verifyEntry(mapping, 'Digit0', ['0', '=', '', ''], '0'); - verifyEntry(mapping, 'Digit1', ['1', '+', '¦', ''], '1'); - verifyEntry(mapping, 'Digit2', ['2', '"', '@', ''], '2'); - verifyEntry(mapping, 'Digit3', ['3', '*', '#', ''], '3'); - verifyEntry(mapping, 'Digit4', ['4', 'ç', '°', ''], '4'); - verifyEntry(mapping, 'Digit5', ['5', '%', '§', ''], '5'); - verifyEntry(mapping, 'Digit6', ['6', '&', '¬', ''], '6'); - verifyEntry(mapping, 'Digit7', ['7', '/', '|', ''], '7'); - verifyEntry(mapping, 'Digit8', ['8', '(', '¢', ''], '8'); - verifyEntry(mapping, 'Digit9', ['9', ')', '', ''], '9'); - verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 'A'); - verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 'B'); - verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 'C'); - verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 'D'); - verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 'E'); - verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 'F'); - verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 'G'); - verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 'H'); - verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 'I'); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 'J'); - verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 'K'); - verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 'L'); - verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 'M'); - verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 'N'); - verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 'O'); - verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 'P'); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 'Q'); - verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 'R'); - verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 'S'); - verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 'T'); - verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 'U'); - verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 'V'); - verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 'W'); - verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 'X'); - verifyEntry(mapping, 'KeyY', ['z', 'Z', '', ''], 'Z'); - verifyEntry(mapping, 'KeyZ', ['y', 'Y', '', ''], 'Y'); + verifyEntry(mapping, 'Digit0', [r'0', r'=', r'', r''], '0'); + verifyEntry(mapping, 'Digit1', [r'1', r'+', r'¦', r''], '1'); + verifyEntry(mapping, 'Digit2', [r'2', r'"', r'@', r''], '2'); + verifyEntry(mapping, 'Digit3', [r'3', r'*', r'#', r''], '3'); + verifyEntry(mapping, 'Digit4', [r'4', r'ç', r'°', r''], '4'); + verifyEntry(mapping, 'Digit5', [r'5', r'%', r'§', r''], '5'); + verifyEntry(mapping, 'Digit6', [r'6', r'&', r'¬', r''], '6'); + verifyEntry(mapping, 'Digit7', [r'7', r'/', r'|', r''], '7'); + verifyEntry(mapping, 'Digit8', [r'8', r'(', r'¢', r''], '8'); + verifyEntry(mapping, 'Digit9', [r'9', r')', r'', r''], '9'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'A'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'B'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'C'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'D'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r''], 'E'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'F'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'G'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'H'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'I'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'J'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'K'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'L'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'', r''], 'M'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'N'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'O'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'P'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'', r''], 'Q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'R'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 'S'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 'T'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'U'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'V'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'W'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'X'); + verifyEntry(mapping, 'KeyY', [r'z', r'Z', r'', r''], 'Z'); + verifyEntry(mapping, 'KeyZ', [r'y', r'Y', r'', r''], 'Y'); }); group('dk', () { - verifyEntry(mapping, 'Digit0', ['0', '=', '}', ''], '0'); - verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], '1'); - verifyEntry(mapping, 'Digit2', ['2', '"', '@', ''], '2'); - verifyEntry(mapping, 'Digit3', ['3', '#', '£', ''], '3'); - verifyEntry(mapping, 'Digit4', ['4', '¤', r'$', ''], '4'); - verifyEntry(mapping, 'Digit5', ['5', '%', '€', ''], '5'); - verifyEntry(mapping, 'Digit6', ['6', '&', '', ''], '6'); - verifyEntry(mapping, 'Digit7', ['7', '/', '{', ''], '7'); - verifyEntry(mapping, 'Digit8', ['8', '(', '[', ''], '8'); - verifyEntry(mapping, 'Digit9', ['9', ')', ']', ''], '9'); - verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 'A'); - verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 'B'); - verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 'C'); - verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 'D'); - verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 'E'); - verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 'F'); - verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 'G'); - verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 'H'); - verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 'I'); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 'J'); - verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 'K'); - verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 'L'); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', ''], 'M'); - verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 'N'); - verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 'O'); - verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 'P'); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 'Q'); - verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 'R'); - verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 'S'); - verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 'T'); - verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 'U'); - verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 'V'); - verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 'W'); - verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 'X'); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 'Y'); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 'Z'); + verifyEntry(mapping, 'Digit0', [r'0', r'=', r'}', r''], '0'); + verifyEntry(mapping, 'Digit1', [r'1', r'!', r'', r''], '1'); + verifyEntry(mapping, 'Digit2', [r'2', r'"', r'@', r''], '2'); + verifyEntry(mapping, 'Digit3', [r'3', r'#', r'£', r''], '3'); + verifyEntry(mapping, 'Digit4', [r'4', r'¤', r'$', r''], '4'); + verifyEntry(mapping, 'Digit5', [r'5', r'%', r'€', r''], '5'); + verifyEntry(mapping, 'Digit6', [r'6', r'&', r'', r''], '6'); + verifyEntry(mapping, 'Digit7', [r'7', r'/', r'{', r''], '7'); + verifyEntry(mapping, 'Digit8', [r'8', r'(', r'[', r''], '8'); + verifyEntry(mapping, 'Digit9', [r'9', r')', r']', r''], '9'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'A'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'B'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'C'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'D'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r''], 'E'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'F'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'G'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'H'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'I'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'J'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'K'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'L'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r''], 'M'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'N'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'O'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'P'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'', r''], 'Q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'R'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 'S'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 'T'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'U'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'V'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'W'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'X'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'Y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'', r''], 'Z'); }); group('en', () { - verifyEntry(mapping, 'Digit0', ['0', ')', '', ''], '0'); - verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], '1'); - verifyEntry(mapping, 'Digit2', ['2', '@', '', ''], '2'); - verifyEntry(mapping, 'Digit3', ['3', '#', '', ''], '3'); - verifyEntry(mapping, 'Digit4', ['4', r'$', '', ''], '4'); - verifyEntry(mapping, 'Digit5', ['5', '%', '', ''], '5'); - verifyEntry(mapping, 'Digit6', ['6', '^', '', ''], '6'); - verifyEntry(mapping, 'Digit7', ['7', '&', '', ''], '7'); - verifyEntry(mapping, 'Digit8', ['8', '*', '', ''], '8'); - verifyEntry(mapping, 'Digit9', ['9', '(', '', ''], '9'); - verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 'A'); - verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 'B'); - verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 'C'); - verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 'D'); - verifyEntry(mapping, 'KeyE', ['e', 'E', '', ''], 'E'); - verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 'F'); - verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 'G'); - verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 'H'); - verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 'I'); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 'J'); - verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 'K'); - verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 'L'); - verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 'M'); - verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 'N'); - verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 'O'); - verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 'P'); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 'Q'); - verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 'R'); - verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 'S'); - verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 'T'); - verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 'U'); - verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 'V'); - verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 'W'); - verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 'X'); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 'Y'); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 'Z'); + verifyEntry(mapping, 'Digit0', [r'0', r')', r'', r''], '0'); + verifyEntry(mapping, 'Digit1', [r'1', r'!', r'', r''], '1'); + verifyEntry(mapping, 'Digit2', [r'2', r'@', r'', r''], '2'); + verifyEntry(mapping, 'Digit3', [r'3', r'#', r'', r''], '3'); + verifyEntry(mapping, 'Digit4', [r'4', r'$', r'', r''], '4'); + verifyEntry(mapping, 'Digit5', [r'5', r'%', r'', r''], '5'); + verifyEntry(mapping, 'Digit6', [r'6', r'^', r'', r''], '6'); + verifyEntry(mapping, 'Digit7', [r'7', r'&', r'', r''], '7'); + verifyEntry(mapping, 'Digit8', [r'8', r'*', r'', r''], '8'); + verifyEntry(mapping, 'Digit9', [r'9', r'(', r'', r''], '9'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'A'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'B'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'C'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'D'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'', r''], 'E'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'F'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'G'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'H'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'I'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'J'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'K'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'L'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'', r''], 'M'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'N'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'O'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'P'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'', r''], 'Q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'R'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 'S'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 'T'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'U'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'V'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'W'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'X'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'Y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'', r''], 'Z'); }); group('en-belgian', () { - verifyEntry(mapping, 'Digit0', ['à', '0', '}', ''], '0'); - verifyEntry(mapping, 'Digit1', ['&', '1', '|', ''], '1'); - verifyEntry(mapping, 'Digit2', ['é', '2', '@', ''], '2'); - verifyEntry(mapping, 'Digit3', ['"', '3', '#', ''], '3'); - verifyEntry(mapping, 'Digit4', ["'", '4', '{', ''], '4'); - verifyEntry(mapping, 'Digit5', ['(', '5', '[', ''], '5'); - verifyEntry(mapping, 'Digit6', ['§', '6', '^', ''], '6'); - verifyEntry(mapping, 'Digit7', ['è', '7', '', ''], '7'); - verifyEntry(mapping, 'Digit8', ['!', '8', '', ''], '8'); - verifyEntry(mapping, 'Digit9', ['ç', '9', '{', ''], '9'); - verifyEntry(mapping, 'KeyA', ['q', 'Q', '', ''], 'Q'); - verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 'B'); - verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 'C'); - verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 'D'); - verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 'E'); - verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 'F'); - verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 'G'); - verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 'H'); - verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 'I'); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 'J'); - verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 'K'); - verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 'L'); - verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 'N'); - verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 'O'); - verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 'P'); - verifyEntry(mapping, 'KeyQ', ['a', 'A', '', ''], 'A'); - verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 'R'); - verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 'S'); - verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 'T'); - verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 'U'); - verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 'V'); - verifyEntry(mapping, 'KeyW', ['z', 'Z', '', ''], 'Z'); - verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 'X'); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 'Y'); - verifyEntry(mapping, 'KeyZ', ['w', 'W', '', ''], 'W'); - verifyEntry(mapping, 'Semicolon', ['m', 'M', '', ''], 'M'); + verifyEntry(mapping, 'Digit0', [r'à', r'0', r'}', r''], '0'); + verifyEntry(mapping, 'Digit1', [r'&', r'1', r'|', r''], '1'); + verifyEntry(mapping, 'Digit2', [r'é', r'2', r'@', r''], '2'); + verifyEntry(mapping, 'Digit3', [r'"', r'3', r'#', r''], '3'); + verifyEntry(mapping, 'Digit4', [r"'", r'4', r'{', r''], '4'); + verifyEntry(mapping, 'Digit5', [r'(', r'5', r'[', r''], '5'); + verifyEntry(mapping, 'Digit6', [r'§', r'6', r'^', r''], '6'); + verifyEntry(mapping, 'Digit7', [r'è', r'7', r'', r''], '7'); + verifyEntry(mapping, 'Digit8', [r'!', r'8', r'', r''], '8'); + verifyEntry(mapping, 'Digit9', [r'ç', r'9', r'{', r''], '9'); + verifyEntry(mapping, 'KeyA', [r'q', r'Q', r'', r''], 'Q'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'B'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'C'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'D'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r''], 'E'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'F'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'G'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'H'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'I'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'J'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'K'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'L'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'N'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'O'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'P'); + verifyEntry(mapping, 'KeyQ', [r'a', r'A', r'', r''], 'A'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'R'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 'S'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 'T'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'U'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'V'); + verifyEntry(mapping, 'KeyW', [r'z', r'Z', r'', r''], 'Z'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'X'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'Y'); + verifyEntry(mapping, 'KeyZ', [r'w', r'W', r'', r''], 'W'); + verifyEntry(mapping, 'Semicolon', [r'm', r'M', r'', r''], 'M'); }); group('en-in', () { - verifyEntry(mapping, 'Digit0', ['0', ')', '', ''], '0'); - verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], '1'); - verifyEntry(mapping, 'Digit2', ['2', '@', '', ''], '2'); - verifyEntry(mapping, 'Digit3', ['3', '#', '', ''], '3'); - verifyEntry(mapping, 'Digit4', ['4', r'$', '₹', ''], '4'); - verifyEntry(mapping, 'Digit5', ['5', '%', '', ''], '5'); - verifyEntry(mapping, 'Digit6', ['6', '^', '', 'ˆ'], '6'); - verifyEntry(mapping, 'Digit7', ['7', '&', '', ''], '7'); - verifyEntry(mapping, 'Digit8', ['8', '*', '', ''], '8'); - verifyEntry(mapping, 'Digit9', ['9', '(', '', '˘'], '9'); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'ā', 'Ā'], 'A'); - verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 'B'); - verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 'C'); - verifyEntry(mapping, 'KeyD', ['d', 'D', 'ḍ', 'Ḍ'], 'D'); - verifyEntry(mapping, 'KeyE', ['e', 'E', 'ē', 'Ē'], 'E'); - verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 'F'); - verifyEntry(mapping, 'KeyG', ['g', 'G', 'ṅ', 'Ṅ'], 'G'); - verifyEntry(mapping, 'KeyH', ['h', 'H', 'ḥ', 'Ḥ'], 'H'); - verifyEntry(mapping, 'KeyI', ['i', 'I', 'ī', 'Ī'], 'I'); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 'J'); - verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 'K'); - verifyEntry(mapping, 'KeyL', ['l', 'L', 'l̥', 'L̥'], 'L'); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'ṁ', 'Ṁ'], 'M'); - verifyEntry(mapping, 'KeyN', ['n', 'N', 'ṇ', 'Ṇ'], 'N'); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'ō', 'Ō'], 'O'); - verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 'P'); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'æ', 'Æ'], 'Q'); - verifyEntry(mapping, 'KeyR', ['r', 'R', 'r̥', 'R̥'], 'R'); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'ś', 'Ś'], 'S'); - verifyEntry(mapping, 'KeyT', ['t', 'T', 'ṭ', 'Ṭ'], 'T'); - verifyEntry(mapping, 'KeyU', ['u', 'U', 'ū', 'Ū'], 'U'); - verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 'V'); - verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 'W'); - verifyEntry(mapping, 'KeyX', ['x', 'X', 'ṣ', 'Ṣ'], 'X'); - verifyEntry(mapping, 'KeyY', ['y', 'Y', 'ñ', 'Ñ'], 'Y'); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 'Z'); + verifyEntry(mapping, 'Digit0', [r'0', r')', r'', r''], '0'); + verifyEntry(mapping, 'Digit1', [r'1', r'!', r'', r''], '1'); + verifyEntry(mapping, 'Digit2', [r'2', r'@', r'', r''], '2'); + verifyEntry(mapping, 'Digit3', [r'3', r'#', r'', r''], '3'); + verifyEntry(mapping, 'Digit4', [r'4', r'$', r'₹', r''], '4'); + verifyEntry(mapping, 'Digit5', [r'5', r'%', r'', r''], '5'); + verifyEntry(mapping, 'Digit6', [r'6', r'^', r'', r'ˆ'], '6'); + verifyEntry(mapping, 'Digit7', [r'7', r'&', r'', r''], '7'); + verifyEntry(mapping, 'Digit8', [r'8', r'*', r'', r''], '8'); + verifyEntry(mapping, 'Digit9', [r'9', r'(', r'', r'˘'], '9'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'ā', r'Ā'], 'A'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'B'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'C'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'ḍ', r'Ḍ'], 'D'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'ē', r'Ē'], 'E'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'F'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'ṅ', r'Ṅ'], 'G'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'ḥ', r'Ḥ'], 'H'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'ī', r'Ī'], 'I'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'J'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'K'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'l̥', r'L̥'], 'L'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'ṁ', r'Ṁ'], 'M'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'ṇ', r'Ṇ'], 'N'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ō', r'Ō'], 'O'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'P'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'æ', r'Æ'], 'Q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'r̥', r'R̥'], 'R'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'ś', r'Ś'], 'S'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'ṭ', r'Ṭ'], 'T'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'ū', r'Ū'], 'U'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'V'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'W'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'ṣ', r'Ṣ'], 'X'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'ñ', r'Ñ'], 'Y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'', r''], 'Z'); }); group('en-intl', () { - verifyEntry(mapping, 'Digit0', ['0', ')', '’', ''], '0'); - verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '¹'], '1'); - verifyEntry(mapping, 'Digit2', ['2', '@', '²', ''], '2'); - verifyEntry(mapping, 'Digit3', ['3', '#', '³', ''], '3'); - verifyEntry(mapping, 'Digit4', ['4', r'$', '¤', '£'], '4'); - verifyEntry(mapping, 'Digit5', ['5', '%', '€', ''], '5'); - verifyEntry(mapping, 'Digit6', ['6', '^', '¼', ''], '6'); - verifyEntry(mapping, 'Digit7', ['7', '&', '½', ''], '7'); - verifyEntry(mapping, 'Digit8', ['8', '*', '¾', ''], '8'); - verifyEntry(mapping, 'Digit9', ['9', '(', '‘', ''], '9'); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'á', 'Á'], 'A'); - verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 'B'); - verifyEntry(mapping, 'KeyC', ['c', 'C', '©', '¢'], 'C'); - verifyEntry(mapping, 'KeyD', ['d', 'D', 'ð', 'Ð'], 'D'); - verifyEntry(mapping, 'KeyE', ['e', 'E', 'é', 'É'], 'E'); - verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 'F'); - verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 'G'); - verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 'H'); - verifyEntry(mapping, 'KeyI', ['i', 'I', 'í', 'Í'], 'I'); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 'J'); - verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 'K'); - verifyEntry(mapping, 'KeyL', ['l', 'L', 'ø', 'Ø'], 'L'); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', ''], 'M'); - verifyEntry(mapping, 'KeyN', ['n', 'N', 'ñ', 'Ñ'], 'N'); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'ó', 'Ó'], 'O'); - verifyEntry(mapping, 'KeyP', ['p', 'P', 'ö', 'Ö'], 'P'); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'ä', 'Ä'], 'Q'); - verifyEntry(mapping, 'KeyR', ['r', 'R', '®', ''], 'R'); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', '§'], 'S'); - verifyEntry(mapping, 'KeyT', ['t', 'T', 'þ', 'Þ'], 'T'); - verifyEntry(mapping, 'KeyU', ['u', 'U', 'ú', 'Ú'], 'U'); - verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 'V'); - verifyEntry(mapping, 'KeyW', ['w', 'W', 'å', 'Å'], 'W'); - verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 'X'); - verifyEntry(mapping, 'KeyY', ['y', 'Y', 'ü', 'Ü'], 'Y'); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'æ', 'Æ'], 'Z'); + verifyEntry(mapping, 'Digit0', [r'0', r')', r'’', r''], '0'); + verifyEntry(mapping, 'Digit1', [r'1', r'!', r'¡', r'¹'], '1'); + verifyEntry(mapping, 'Digit2', [r'2', r'@', r'²', r''], '2'); + verifyEntry(mapping, 'Digit3', [r'3', r'#', r'³', r''], '3'); + verifyEntry(mapping, 'Digit4', [r'4', r'$', r'¤', r'£'], '4'); + verifyEntry(mapping, 'Digit5', [r'5', r'%', r'€', r''], '5'); + verifyEntry(mapping, 'Digit6', [r'6', r'^', r'¼', r''], '6'); + verifyEntry(mapping, 'Digit7', [r'7', r'&', r'½', r''], '7'); + verifyEntry(mapping, 'Digit8', [r'8', r'*', r'¾', r''], '8'); + verifyEntry(mapping, 'Digit9', [r'9', r'(', r'‘', r''], '9'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'á', r'Á'], 'A'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'B'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'©', r'¢'], 'C'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'ð', r'Ð'], 'D'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'é', r'É'], 'E'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'F'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'G'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'H'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'í', r'Í'], 'I'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'J'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'K'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'ø', r'Ø'], 'L'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r''], 'M'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'ñ', r'Ñ'], 'N'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ó', r'Ó'], 'O'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'ö', r'Ö'], 'P'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'ä', r'Ä'], 'Q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r''], 'R'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r'§'], 'S'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'þ', r'Þ'], 'T'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'ú', r'Ú'], 'U'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'V'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'å', r'Å'], 'W'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'X'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'ü', r'Ü'], 'Y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'æ', r'Æ'], 'Z'); }); group('en-uk', () { - verifyEntry(mapping, 'Digit0', ['0', ')', '', ''], '0'); - verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], '1'); - verifyEntry(mapping, 'Digit2', ['2', '"', '', ''], '2'); - verifyEntry(mapping, 'Digit3', ['3', '£', '', ''], '3'); - verifyEntry(mapping, 'Digit4', ['4', r'$', '€', ''], '4'); - verifyEntry(mapping, 'Digit5', ['5', '%', '', ''], '5'); - verifyEntry(mapping, 'Digit6', ['6', '^', '', ''], '6'); - verifyEntry(mapping, 'Digit7', ['7', '&', '', ''], '7'); - verifyEntry(mapping, 'Digit8', ['8', '*', '', ''], '8'); - verifyEntry(mapping, 'Digit9', ['9', '(', '', ''], '9'); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'á', 'Á'], 'A'); - verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 'B'); - verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 'C'); - verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 'D'); - verifyEntry(mapping, 'KeyE', ['e', 'E', 'é', 'É'], 'E'); - verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 'F'); - verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 'G'); - verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 'H'); - verifyEntry(mapping, 'KeyI', ['i', 'I', 'í', 'Í'], 'I'); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 'J'); - verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 'K'); - verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 'L'); - verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 'M'); - verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 'N'); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'ó', 'Ó'], 'O'); - verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 'P'); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 'Q'); - verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 'R'); - verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 'S'); - verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 'T'); - verifyEntry(mapping, 'KeyU', ['u', 'U', 'ú', 'Ú'], 'U'); - verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 'V'); - verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 'W'); - verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 'X'); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 'Y'); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 'Z'); + verifyEntry(mapping, 'Digit0', [r'0', r')', r'', r''], '0'); + verifyEntry(mapping, 'Digit1', [r'1', r'!', r'', r''], '1'); + verifyEntry(mapping, 'Digit2', [r'2', r'"', r'', r''], '2'); + verifyEntry(mapping, 'Digit3', [r'3', r'£', r'', r''], '3'); + verifyEntry(mapping, 'Digit4', [r'4', r'$', r'€', r''], '4'); + verifyEntry(mapping, 'Digit5', [r'5', r'%', r'', r''], '5'); + verifyEntry(mapping, 'Digit6', [r'6', r'^', r'', r''], '6'); + verifyEntry(mapping, 'Digit7', [r'7', r'&', r'', r''], '7'); + verifyEntry(mapping, 'Digit8', [r'8', r'*', r'', r''], '8'); + verifyEntry(mapping, 'Digit9', [r'9', r'(', r'', r''], '9'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'á', r'Á'], 'A'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'B'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'C'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'D'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'é', r'É'], 'E'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'F'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'G'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'H'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'í', r'Í'], 'I'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'J'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'K'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'L'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'', r''], 'M'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'N'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ó', r'Ó'], 'O'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'P'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'', r''], 'Q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'R'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 'S'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 'T'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'ú', r'Ú'], 'U'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'V'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'W'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'X'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'Y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'', r''], 'Z'); }); group('es', () { - verifyEntry(mapping, 'Digit0', ['0', '=', '', ''], '0'); - verifyEntry(mapping, 'Digit1', ['1', '!', '|', ''], '1'); - verifyEntry(mapping, 'Digit2', ['2', '"', '@', ''], '2'); - verifyEntry(mapping, 'Digit3', ['3', '·', '#', ''], '3'); - verifyEntry(mapping, 'Digit4', ['4', r'$', '~', ''], '4'); - verifyEntry(mapping, 'Digit5', ['5', '%', '€', ''], '5'); - verifyEntry(mapping, 'Digit6', ['6', '&', '¬', ''], '6'); - verifyEntry(mapping, 'Digit7', ['7', '/', '', ''], '7'); - verifyEntry(mapping, 'Digit8', ['8', '(', '', ''], '8'); - verifyEntry(mapping, 'Digit9', ['9', ')', '', ''], '9'); - verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 'A'); - verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 'B'); - verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 'C'); - verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 'D'); - verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 'E'); - verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 'F'); - verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 'G'); - verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 'H'); - verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 'I'); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 'J'); - verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 'K'); - verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 'L'); - verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 'M'); - verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 'N'); - verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 'O'); - verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 'P'); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 'Q'); - verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 'R'); - verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 'S'); - verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 'T'); - verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 'U'); - verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 'V'); - verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 'W'); - verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 'X'); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 'Y'); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 'Z'); + verifyEntry(mapping, 'Digit0', [r'0', r'=', r'', r''], '0'); + verifyEntry(mapping, 'Digit1', [r'1', r'!', r'|', r''], '1'); + verifyEntry(mapping, 'Digit2', [r'2', r'"', r'@', r''], '2'); + verifyEntry(mapping, 'Digit3', [r'3', r'·', r'#', r''], '3'); + verifyEntry(mapping, 'Digit4', [r'4', r'$', r'~', r''], '4'); + verifyEntry(mapping, 'Digit5', [r'5', r'%', r'€', r''], '5'); + verifyEntry(mapping, 'Digit6', [r'6', r'&', r'¬', r''], '6'); + verifyEntry(mapping, 'Digit7', [r'7', r'/', r'', r''], '7'); + verifyEntry(mapping, 'Digit8', [r'8', r'(', r'', r''], '8'); + verifyEntry(mapping, 'Digit9', [r'9', r')', r'', r''], '9'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'A'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'B'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'C'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'D'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r''], 'E'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'F'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'G'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'H'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'I'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'J'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'K'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'L'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'', r''], 'M'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'N'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'O'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'P'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'', r''], 'Q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'R'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 'S'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 'T'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'U'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'V'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'W'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'X'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'Y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'', r''], 'Z'); }); group('es-latin', () { - verifyEntry(mapping, 'Digit0', ['0', '=', '', ''], '0'); - verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], '1'); - verifyEntry(mapping, 'Digit2', ['2', '"', '', ''], '2'); - verifyEntry(mapping, 'Digit3', ['3', '#', '', ''], '3'); - verifyEntry(mapping, 'Digit4', ['4', r'$', '', ''], '4'); - verifyEntry(mapping, 'Digit5', ['5', '%', '', ''], '5'); - verifyEntry(mapping, 'Digit6', ['6', '&', '', ''], '6'); - verifyEntry(mapping, 'Digit7', ['7', '/', '', ''], '7'); - verifyEntry(mapping, 'Digit8', ['8', '(', '', ''], '8'); - verifyEntry(mapping, 'Digit9', ['9', ')', '', ''], '9'); - verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 'A'); - verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 'B'); - verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 'C'); - verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 'D'); - verifyEntry(mapping, 'KeyE', ['e', 'E', '', ''], 'E'); - verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 'F'); - verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 'G'); - verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 'H'); - verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 'I'); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 'J'); - verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 'K'); - verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 'L'); - verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 'M'); - verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 'N'); - verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 'O'); - verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 'P'); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', '@', ''], 'Q'); - verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 'R'); - verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 'S'); - verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 'T'); - verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 'U'); - verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 'V'); - verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 'W'); - verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 'X'); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 'Y'); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 'Z'); + verifyEntry(mapping, 'Digit0', [r'0', r'=', r'', r''], '0'); + verifyEntry(mapping, 'Digit1', [r'1', r'!', r'', r''], '1'); + verifyEntry(mapping, 'Digit2', [r'2', r'"', r'', r''], '2'); + verifyEntry(mapping, 'Digit3', [r'3', r'#', r'', r''], '3'); + verifyEntry(mapping, 'Digit4', [r'4', r'$', r'', r''], '4'); + verifyEntry(mapping, 'Digit5', [r'5', r'%', r'', r''], '5'); + verifyEntry(mapping, 'Digit6', [r'6', r'&', r'', r''], '6'); + verifyEntry(mapping, 'Digit7', [r'7', r'/', r'', r''], '7'); + verifyEntry(mapping, 'Digit8', [r'8', r'(', r'', r''], '8'); + verifyEntry(mapping, 'Digit9', [r'9', r')', r'', r''], '9'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'A'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'B'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'C'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'D'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'', r''], 'E'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'F'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'G'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'H'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'I'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'J'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'K'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'L'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'', r''], 'M'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'N'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'O'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'P'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'@', r''], 'Q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'R'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 'S'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 'T'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'U'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'V'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'W'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'X'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'Y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'', r''], 'Z'); }); group('fr', () { - verifyEntry(mapping, 'Digit0', ['à', '0', '@', ''], '0'); - verifyEntry(mapping, 'Digit1', ['&', '1', '', ''], '1'); - verifyEntry(mapping, 'Digit2', ['é', '2', '~', ''], '2'); - verifyEntry(mapping, 'Digit3', ['"', '3', '#', ''], '3'); - verifyEntry(mapping, 'Digit4', ["'", '4', '{', ''], '4'); - verifyEntry(mapping, 'Digit5', ['(', '5', '[', ''], '5'); - verifyEntry(mapping, 'Digit6', ['-', '6', '|', ''], '6'); - verifyEntry(mapping, 'Digit7', ['è', '7', '`', ''], '7'); - verifyEntry(mapping, 'Digit8', ['_', '8', r'\', ''], '8'); - verifyEntry(mapping, 'Digit9', ['ç', '9', '^', ''], '9'); - verifyEntry(mapping, 'KeyA', ['q', 'Q', '', ''], 'Q'); - verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 'B'); - verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 'C'); - verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 'D'); - verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 'E'); - verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 'F'); - verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 'G'); - verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 'H'); - verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 'I'); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 'J'); - verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 'K'); - verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 'L'); - verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 'N'); - verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 'O'); - verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 'P'); - verifyEntry(mapping, 'KeyQ', ['a', 'A', '', ''], 'A'); - verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 'R'); - verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 'S'); - verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 'T'); - verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 'U'); - verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 'V'); - verifyEntry(mapping, 'KeyW', ['z', 'Z', '', ''], 'Z'); - verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 'X'); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 'Y'); - verifyEntry(mapping, 'KeyZ', ['w', 'W', '', ''], 'W'); - verifyEntry(mapping, 'Semicolon', ['m', 'M', '', ''], 'M'); + verifyEntry(mapping, 'Digit0', [r'à', r'0', r'@', r''], '0'); + verifyEntry(mapping, 'Digit1', [r'&', r'1', r'', r''], '1'); + verifyEntry(mapping, 'Digit2', [r'é', r'2', r'~', r''], '2'); + verifyEntry(mapping, 'Digit3', [r'"', r'3', r'#', r''], '3'); + verifyEntry(mapping, 'Digit4', [r"'", r'4', r'{', r''], '4'); + verifyEntry(mapping, 'Digit5', [r'(', r'5', r'[', r''], '5'); + verifyEntry(mapping, 'Digit6', [r'-', r'6', r'|', r''], '6'); + verifyEntry(mapping, 'Digit7', [r'è', r'7', r'`', r''], '7'); + verifyEntry(mapping, 'Digit8', [r'_', r'8', r'\', r''], '8'); + verifyEntry(mapping, 'Digit9', [r'ç', r'9', r'^', r''], '9'); + verifyEntry(mapping, 'KeyA', [r'q', r'Q', r'', r''], 'Q'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'B'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'C'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'D'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r''], 'E'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'F'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'G'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'H'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'I'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'J'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'K'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'L'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'N'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'O'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'P'); + verifyEntry(mapping, 'KeyQ', [r'a', r'A', r'', r''], 'A'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'R'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 'S'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 'T'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'U'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'V'); + verifyEntry(mapping, 'KeyW', [r'z', r'Z', r'', r''], 'Z'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'X'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'Y'); + verifyEntry(mapping, 'KeyZ', [r'w', r'W', r'', r''], 'W'); + verifyEntry(mapping, 'Semicolon', [r'm', r'M', r'', r''], 'M'); }); group('hu', () { - verifyEntry(mapping, 'Backquote', ['0', '§', '', ''], '0'); - verifyEntry(mapping, 'Digit1', ['1', "'", '~', ''], '1'); - verifyEntry(mapping, 'Digit2', ['2', '"', 'ˇ', ''], '2'); - verifyEntry(mapping, 'Digit3', ['3', '+', '^', ''], '3'); - verifyEntry(mapping, 'Digit4', ['4', '!', '˘', ''], '4'); - verifyEntry(mapping, 'Digit5', ['5', '%', '°', ''], '5'); - verifyEntry(mapping, 'Digit6', ['6', '/', '˛', ''], '6'); - verifyEntry(mapping, 'Digit7', ['7', '=', '`', ''], '7'); - verifyEntry(mapping, 'Digit8', ['8', '(', '˙', ''], '8'); - verifyEntry(mapping, 'Digit9', ['9', ')', '´', ''], '9'); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'ä', ''], 'A'); - verifyEntry(mapping, 'KeyB', ['b', 'B', '{', ''], 'B'); - verifyEntry(mapping, 'KeyC', ['c', 'C', '&', ''], 'C'); - verifyEntry(mapping, 'KeyD', ['d', 'D', 'Đ', ''], 'D'); - verifyEntry(mapping, 'KeyE', ['e', 'E', 'Ä', ''], 'E'); - verifyEntry(mapping, 'KeyF', ['f', 'F', '[', ''], 'F'); - verifyEntry(mapping, 'KeyG', ['g', 'G', ']', ''], 'G'); - verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 'H'); - verifyEntry(mapping, 'KeyI', ['i', 'I', 'Í', ''], 'I'); - verifyEntry(mapping, 'KeyJ', ['j', 'J', 'í', ''], 'J'); - verifyEntry(mapping, 'KeyK', ['k', 'K', 'ł', ''], 'K'); - verifyEntry(mapping, 'KeyL', ['l', 'L', 'Ł', ''], 'L'); - verifyEntry(mapping, 'KeyM', ['m', 'M', '<', ''], 'M'); - verifyEntry(mapping, 'KeyN', ['n', 'N', '}', ''], 'N'); - verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 'O'); - verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 'P'); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', r'\', ''], 'Q'); - verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 'R'); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'đ', ''], 'S'); - verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 'T'); - verifyEntry(mapping, 'KeyU', ['u', 'U', '€', ''], 'U'); - verifyEntry(mapping, 'KeyV', ['v', 'V', '@', ''], 'V'); - verifyEntry(mapping, 'KeyW', ['w', 'W', '|', ''], 'W'); - verifyEntry(mapping, 'KeyX', ['x', 'X', '#', ''], 'X'); - verifyEntry(mapping, 'KeyY', ['z', 'Z', '', ''], 'Z'); - verifyEntry(mapping, 'KeyZ', ['y', 'Y', '>', ''], 'Y'); + verifyEntry(mapping, 'Backquote', [r'0', r'§', r'', r''], '0'); + verifyEntry(mapping, 'Digit1', [r'1', r"'", r'~', r''], '1'); + verifyEntry(mapping, 'Digit2', [r'2', r'"', r'ˇ', r''], '2'); + verifyEntry(mapping, 'Digit3', [r'3', r'+', r'^', r''], '3'); + verifyEntry(mapping, 'Digit4', [r'4', r'!', r'˘', r''], '4'); + verifyEntry(mapping, 'Digit5', [r'5', r'%', r'°', r''], '5'); + verifyEntry(mapping, 'Digit6', [r'6', r'/', r'˛', r''], '6'); + verifyEntry(mapping, 'Digit7', [r'7', r'=', r'`', r''], '7'); + verifyEntry(mapping, 'Digit8', [r'8', r'(', r'˙', r''], '8'); + verifyEntry(mapping, 'Digit9', [r'9', r')', r'´', r''], '9'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'ä', r''], 'A'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'{', r''], 'B'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'&', r''], 'C'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'Đ', r''], 'D'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'Ä', r''], 'E'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'[', r''], 'F'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r']', r''], 'G'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'H'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'Í', r''], 'I'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'í', r''], 'J'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'ł', r''], 'K'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'Ł', r''], 'L'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'<', r''], 'M'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'}', r''], 'N'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'O'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'P'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'\', r''], 'Q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'R'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'đ', r''], 'S'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 'T'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'€', r''], 'U'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'@', r''], 'V'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'|', r''], 'W'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'#', r''], 'X'); + verifyEntry(mapping, 'KeyY', [r'z', r'Z', r'', r''], 'Z'); + verifyEntry(mapping, 'KeyZ', [r'y', r'Y', r'>', r''], 'Y'); }); group('it', () { - verifyEntry(mapping, 'Digit0', ['0', '=', '', ''], '0'); - verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], '1'); - verifyEntry(mapping, 'Digit2', ['2', '"', '', ''], '2'); - verifyEntry(mapping, 'Digit3', ['3', '£', '', ''], '3'); - verifyEntry(mapping, 'Digit4', ['4', r'$', '', ''], '4'); - verifyEntry(mapping, 'Digit5', ['5', '%', '€', ''], '5'); - verifyEntry(mapping, 'Digit6', ['6', '&', '', ''], '6'); - verifyEntry(mapping, 'Digit7', ['7', '/', '', ''], '7'); - verifyEntry(mapping, 'Digit8', ['8', '(', '', ''], '8'); - verifyEntry(mapping, 'Digit9', ['9', ')', '', ''], '9'); - verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 'A'); - verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 'B'); - verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 'C'); - verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 'D'); - verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 'E'); - verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 'F'); - verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 'G'); - verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 'H'); - verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 'I'); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 'J'); - verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 'K'); - verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 'L'); - verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 'M'); - verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 'N'); - verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 'O'); - verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 'P'); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 'Q'); - verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 'R'); - verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 'S'); - verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 'T'); - verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 'U'); - verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 'V'); - verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 'W'); - verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 'X'); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 'Y'); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 'Z'); + verifyEntry(mapping, 'Digit0', [r'0', r'=', r'', r''], '0'); + verifyEntry(mapping, 'Digit1', [r'1', r'!', r'', r''], '1'); + verifyEntry(mapping, 'Digit2', [r'2', r'"', r'', r''], '2'); + verifyEntry(mapping, 'Digit3', [r'3', r'£', r'', r''], '3'); + verifyEntry(mapping, 'Digit4', [r'4', r'$', r'', r''], '4'); + verifyEntry(mapping, 'Digit5', [r'5', r'%', r'€', r''], '5'); + verifyEntry(mapping, 'Digit6', [r'6', r'&', r'', r''], '6'); + verifyEntry(mapping, 'Digit7', [r'7', r'/', r'', r''], '7'); + verifyEntry(mapping, 'Digit8', [r'8', r'(', r'', r''], '8'); + verifyEntry(mapping, 'Digit9', [r'9', r')', r'', r''], '9'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'A'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'B'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'C'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'D'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r''], 'E'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'F'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'G'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'H'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'I'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'J'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'K'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'L'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'', r''], 'M'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'N'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'O'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'P'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'', r''], 'Q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'R'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 'S'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 'T'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'U'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'V'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'W'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'X'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'Y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'', r''], 'Z'); }); group('no', () { - verifyEntry(mapping, 'Digit0', ['0', '=', '}', ''], '0'); - verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], '1'); - verifyEntry(mapping, 'Digit2', ['2', '"', '@', ''], '2'); - verifyEntry(mapping, 'Digit3', ['3', '#', '£', ''], '3'); - verifyEntry(mapping, 'Digit4', ['4', '¤', r'$', ''], '4'); - verifyEntry(mapping, 'Digit5', ['5', '%', '€', ''], '5'); - verifyEntry(mapping, 'Digit6', ['6', '&', '', ''], '6'); - verifyEntry(mapping, 'Digit7', ['7', '/', '{', ''], '7'); - verifyEntry(mapping, 'Digit8', ['8', '(', '[', ''], '8'); - verifyEntry(mapping, 'Digit9', ['9', ')', ']', ''], '9'); - verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 'A'); - verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 'B'); - verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 'C'); - verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 'D'); - verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 'E'); - verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 'F'); - verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 'G'); - verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 'H'); - verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 'I'); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 'J'); - verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 'K'); - verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 'L'); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', ''], 'M'); - verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 'N'); - verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 'O'); - verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 'P'); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 'Q'); - verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 'R'); - verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 'S'); - verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 'T'); - verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 'U'); - verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 'V'); - verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 'W'); - verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 'X'); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 'Y'); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 'Z'); + verifyEntry(mapping, 'Digit0', [r'0', r'=', r'}', r''], '0'); + verifyEntry(mapping, 'Digit1', [r'1', r'!', r'', r''], '1'); + verifyEntry(mapping, 'Digit2', [r'2', r'"', r'@', r''], '2'); + verifyEntry(mapping, 'Digit3', [r'3', r'#', r'£', r''], '3'); + verifyEntry(mapping, 'Digit4', [r'4', r'¤', r'$', r''], '4'); + verifyEntry(mapping, 'Digit5', [r'5', r'%', r'€', r''], '5'); + verifyEntry(mapping, 'Digit6', [r'6', r'&', r'', r''], '6'); + verifyEntry(mapping, 'Digit7', [r'7', r'/', r'{', r''], '7'); + verifyEntry(mapping, 'Digit8', [r'8', r'(', r'[', r''], '8'); + verifyEntry(mapping, 'Digit9', [r'9', r')', r']', r''], '9'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'A'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'B'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'C'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'D'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r''], 'E'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'F'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'G'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'H'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'I'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'J'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'K'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'L'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r''], 'M'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'N'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'O'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'P'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'', r''], 'Q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'R'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 'S'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 'T'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'U'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'V'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'W'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'X'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'Y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'', r''], 'Z'); }); group('pl', () { - verifyEntry(mapping, 'Digit0', ['0', ')', '', ''], '0'); - verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], '1'); - verifyEntry(mapping, 'Digit2', ['2', '@', '', ''], '2'); - verifyEntry(mapping, 'Digit3', ['3', '#', '', ''], '3'); - verifyEntry(mapping, 'Digit4', ['4', r'$', '', ''], '4'); - verifyEntry(mapping, 'Digit5', ['5', '%', '', ''], '5'); - verifyEntry(mapping, 'Digit6', ['6', '^', '', ''], '6'); - verifyEntry(mapping, 'Digit7', ['7', '&', '', ''], '7'); - verifyEntry(mapping, 'Digit8', ['8', '*', '', ''], '8'); - verifyEntry(mapping, 'Digit9', ['9', '(', '', ''], '9'); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'ą', 'Ą'], 'A'); - verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 'B'); - verifyEntry(mapping, 'KeyC', ['c', 'C', 'ć', 'Ć'], 'C'); - verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 'D'); - verifyEntry(mapping, 'KeyE', ['e', 'E', 'ę', 'Ę'], 'E'); - verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 'F'); - verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 'G'); - verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 'H'); - verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 'I'); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 'J'); - verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 'K'); - verifyEntry(mapping, 'KeyL', ['l', 'L', 'ł', 'Ł'], 'L'); - verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 'M'); - verifyEntry(mapping, 'KeyN', ['n', 'N', 'ń', 'Ń'], 'N'); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'ó', 'Ó'], 'O'); - verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 'P'); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 'Q'); - verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 'R'); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'ś', 'Ś'], 'S'); - verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 'T'); - verifyEntry(mapping, 'KeyU', ['u', 'U', '€', ''], 'U'); - verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 'V'); - verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 'W'); - verifyEntry(mapping, 'KeyX', ['x', 'X', 'ź', 'Ź'], 'X'); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 'Y'); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'ż', 'Ż'], 'Z'); + verifyEntry(mapping, 'Digit0', [r'0', r')', r'', r''], '0'); + verifyEntry(mapping, 'Digit1', [r'1', r'!', r'', r''], '1'); + verifyEntry(mapping, 'Digit2', [r'2', r'@', r'', r''], '2'); + verifyEntry(mapping, 'Digit3', [r'3', r'#', r'', r''], '3'); + verifyEntry(mapping, 'Digit4', [r'4', r'$', r'', r''], '4'); + verifyEntry(mapping, 'Digit5', [r'5', r'%', r'', r''], '5'); + verifyEntry(mapping, 'Digit6', [r'6', r'^', r'', r''], '6'); + verifyEntry(mapping, 'Digit7', [r'7', r'&', r'', r''], '7'); + verifyEntry(mapping, 'Digit8', [r'8', r'*', r'', r''], '8'); + verifyEntry(mapping, 'Digit9', [r'9', r'(', r'', r''], '9'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'ą', r'Ą'], 'A'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'B'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ć', r'Ć'], 'C'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'D'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'ę', r'Ę'], 'E'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'F'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'G'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'H'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'I'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'J'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'K'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'ł', r'Ł'], 'L'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'', r''], 'M'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'ń', r'Ń'], 'N'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ó', r'Ó'], 'O'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'P'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'', r''], 'Q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'R'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'ś', r'Ś'], 'S'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 'T'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'€', r''], 'U'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'V'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'W'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'ź', r'Ź'], 'X'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'Y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'ż', r'Ż'], 'Z'); }); group('pt', () { - verifyEntry(mapping, 'Digit0', ['0', '=', '}', ''], '0'); - verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], '1'); - verifyEntry(mapping, 'Digit2', ['2', '"', '@', ''], '2'); - verifyEntry(mapping, 'Digit3', ['3', '#', '£', ''], '3'); - verifyEntry(mapping, 'Digit4', ['4', r'$', '§', ''], '4'); - verifyEntry(mapping, 'Digit5', ['5', '%', '€', ''], '5'); - verifyEntry(mapping, 'Digit6', ['6', '&', '', ''], '6'); - verifyEntry(mapping, 'Digit7', ['7', '/', '{', ''], '7'); - verifyEntry(mapping, 'Digit8', ['8', '(', '[', ''], '8'); - verifyEntry(mapping, 'Digit9', ['9', ')', ']', ''], '9'); - verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 'A'); - verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 'B'); - verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 'C'); - verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 'D'); - verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 'E'); - verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 'F'); - verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 'G'); - verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 'H'); - verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 'I'); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 'J'); - verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 'K'); - verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 'L'); - verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 'M'); - verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 'N'); - verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 'O'); - verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 'P'); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 'Q'); - verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 'R'); - verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 'S'); - verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 'T'); - verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 'U'); - verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 'V'); - verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 'W'); - verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 'X'); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 'Y'); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 'Z'); + verifyEntry(mapping, 'Digit0', [r'0', r'=', r'}', r''], '0'); + verifyEntry(mapping, 'Digit1', [r'1', r'!', r'', r''], '1'); + verifyEntry(mapping, 'Digit2', [r'2', r'"', r'@', r''], '2'); + verifyEntry(mapping, 'Digit3', [r'3', r'#', r'£', r''], '3'); + verifyEntry(mapping, 'Digit4', [r'4', r'$', r'§', r''], '4'); + verifyEntry(mapping, 'Digit5', [r'5', r'%', r'€', r''], '5'); + verifyEntry(mapping, 'Digit6', [r'6', r'&', r'', r''], '6'); + verifyEntry(mapping, 'Digit7', [r'7', r'/', r'{', r''], '7'); + verifyEntry(mapping, 'Digit8', [r'8', r'(', r'[', r''], '8'); + verifyEntry(mapping, 'Digit9', [r'9', r')', r']', r''], '9'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'A'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'B'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'C'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'D'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r''], 'E'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'F'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'G'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'H'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'I'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'J'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'K'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'L'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'', r''], 'M'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'N'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'O'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'P'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'', r''], 'Q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'R'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 'S'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 'T'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'U'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'V'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'W'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'X'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'Y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'', r''], 'Z'); }); group('pt-br', () { - verifyEntry(mapping, 'Digit0', ['0', ')', '', ''], '0'); - verifyEntry(mapping, 'Digit1', ['1', '!', '¹', ''], '1'); - verifyEntry(mapping, 'Digit2', ['2', '@', '²', ''], '2'); - verifyEntry(mapping, 'Digit3', ['3', '#', '³', ''], '3'); - verifyEntry(mapping, 'Digit4', ['4', r'$', '£', ''], '4'); - verifyEntry(mapping, 'Digit5', ['5', '%', '¢', ''], '5'); - verifyEntry(mapping, 'Digit6', ['6', '¨', '¬', ''], '6'); - verifyEntry(mapping, 'Digit7', ['7', '&', '', ''], '7'); - verifyEntry(mapping, 'Digit8', ['8', '*', '', ''], '8'); - verifyEntry(mapping, 'Digit9', ['9', '(', '', ''], '9'); - verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 'A'); - verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 'B'); - verifyEntry(mapping, 'KeyC', ['c', 'C', '₢', ''], 'C'); - verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 'D'); - verifyEntry(mapping, 'KeyE', ['e', 'E', '°', ''], 'E'); - verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 'F'); - verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 'G'); - verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 'H'); - verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 'I'); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 'J'); - verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 'K'); - verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 'L'); - verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 'M'); - verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 'N'); - verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 'O'); - verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 'P'); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', '/', ''], 'Q'); - verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 'R'); - verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 'S'); - verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 'T'); - verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 'U'); - verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 'V'); - verifyEntry(mapping, 'KeyW', ['w', 'W', '?', ''], 'W'); - verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 'X'); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 'Y'); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 'Z'); + verifyEntry(mapping, 'Digit0', [r'0', r')', r'', r''], '0'); + verifyEntry(mapping, 'Digit1', [r'1', r'!', r'¹', r''], '1'); + verifyEntry(mapping, 'Digit2', [r'2', r'@', r'²', r''], '2'); + verifyEntry(mapping, 'Digit3', [r'3', r'#', r'³', r''], '3'); + verifyEntry(mapping, 'Digit4', [r'4', r'$', r'£', r''], '4'); + verifyEntry(mapping, 'Digit5', [r'5', r'%', r'¢', r''], '5'); + verifyEntry(mapping, 'Digit6', [r'6', r'¨', r'¬', r''], '6'); + verifyEntry(mapping, 'Digit7', [r'7', r'&', r'', r''], '7'); + verifyEntry(mapping, 'Digit8', [r'8', r'*', r'', r''], '8'); + verifyEntry(mapping, 'Digit9', [r'9', r'(', r'', r''], '9'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'A'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'B'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'₢', r''], 'C'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'D'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'°', r''], 'E'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'F'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'G'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'H'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'I'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'J'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'K'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'L'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'', r''], 'M'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'N'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'O'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'P'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'/', r''], 'Q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'R'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 'S'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 'T'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'U'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'V'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'?', r''], 'W'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'X'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'Y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'', r''], 'Z'); }); group('ru', () { - verifyEntry(mapping, 'Digit0', ['0', ')', '', ''], '0'); - verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], '1'); - verifyEntry(mapping, 'Digit2', ['2', '"', '', ''], '2'); - verifyEntry(mapping, 'Digit3', ['3', '№', '', ''], '3'); - verifyEntry(mapping, 'Digit4', ['4', ';', '', ''], '4'); - verifyEntry(mapping, 'Digit5', ['5', '%', '', ''], '5'); - verifyEntry(mapping, 'Digit6', ['6', ':', '', ''], '6'); - verifyEntry(mapping, 'Digit7', ['7', '?', '', ''], '7'); - verifyEntry(mapping, 'Digit8', ['8', '*', '₽', ''], '8'); - verifyEntry(mapping, 'Digit9', ['9', '(', '', ''], '9'); - verifyEntry(mapping, 'KeyA', ['ф', 'Ф', '', ''], 'A'); - verifyEntry(mapping, 'KeyB', ['и', 'И', '', ''], 'B'); - verifyEntry(mapping, 'KeyC', ['с', 'С', '', ''], 'C'); - verifyEntry(mapping, 'KeyD', ['в', 'В', '', ''], 'D'); - verifyEntry(mapping, 'KeyE', ['у', 'У', '', ''], 'E'); - verifyEntry(mapping, 'KeyF', ['а', 'А', '', ''], 'F'); - verifyEntry(mapping, 'KeyG', ['п', 'П', '', ''], 'G'); - verifyEntry(mapping, 'KeyH', ['р', 'Р', '', ''], 'H'); - verifyEntry(mapping, 'KeyI', ['ш', 'Ш', '', ''], 'I'); - verifyEntry(mapping, 'KeyJ', ['о', 'О', '', ''], 'J'); - verifyEntry(mapping, 'KeyK', ['л', 'Л', '', ''], 'K'); - verifyEntry(mapping, 'KeyL', ['д', 'Д', '', ''], 'L'); - verifyEntry(mapping, 'KeyM', ['ь', 'Ь', '', ''], 'M'); - verifyEntry(mapping, 'KeyN', ['т', 'Т', '', ''], 'N'); - verifyEntry(mapping, 'KeyO', ['щ', 'Щ', '', ''], 'O'); - verifyEntry(mapping, 'KeyP', ['з', 'З', '', ''], 'P'); - verifyEntry(mapping, 'KeyQ', ['й', 'Й', '', ''], 'Q'); - verifyEntry(mapping, 'KeyR', ['к', 'К', '', ''], 'R'); - verifyEntry(mapping, 'KeyS', ['ы', 'Ы', '', ''], 'S'); - verifyEntry(mapping, 'KeyT', ['е', 'Е', '', ''], 'T'); - verifyEntry(mapping, 'KeyU', ['г', 'Г', '', ''], 'U'); - verifyEntry(mapping, 'KeyV', ['м', 'М', '', ''], 'V'); - verifyEntry(mapping, 'KeyW', ['ц', 'Ц', '', ''], 'W'); - verifyEntry(mapping, 'KeyX', ['ч', 'Ч', '', ''], 'X'); - verifyEntry(mapping, 'KeyY', ['н', 'Н', '', ''], 'Y'); - verifyEntry(mapping, 'KeyZ', ['я', 'Я', '', ''], 'Z'); + verifyEntry(mapping, 'Digit0', [r'0', r')', r'', r''], '0'); + verifyEntry(mapping, 'Digit1', [r'1', r'!', r'', r''], '1'); + verifyEntry(mapping, 'Digit2', [r'2', r'"', r'', r''], '2'); + verifyEntry(mapping, 'Digit3', [r'3', r'№', r'', r''], '3'); + verifyEntry(mapping, 'Digit4', [r'4', r';', r'', r''], '4'); + verifyEntry(mapping, 'Digit5', [r'5', r'%', r'', r''], '5'); + verifyEntry(mapping, 'Digit6', [r'6', r':', r'', r''], '6'); + verifyEntry(mapping, 'Digit7', [r'7', r'?', r'', r''], '7'); + verifyEntry(mapping, 'Digit8', [r'8', r'*', r'₽', r''], '8'); + verifyEntry(mapping, 'Digit9', [r'9', r'(', r'', r''], '9'); + verifyEntry(mapping, 'KeyA', [r'ф', r'Ф', r'', r''], 'A'); + verifyEntry(mapping, 'KeyB', [r'и', r'И', r'', r''], 'B'); + verifyEntry(mapping, 'KeyC', [r'с', r'С', r'', r''], 'C'); + verifyEntry(mapping, 'KeyD', [r'в', r'В', r'', r''], 'D'); + verifyEntry(mapping, 'KeyE', [r'у', r'У', r'', r''], 'E'); + verifyEntry(mapping, 'KeyF', [r'а', r'А', r'', r''], 'F'); + verifyEntry(mapping, 'KeyG', [r'п', r'П', r'', r''], 'G'); + verifyEntry(mapping, 'KeyH', [r'р', r'Р', r'', r''], 'H'); + verifyEntry(mapping, 'KeyI', [r'ш', r'Ш', r'', r''], 'I'); + verifyEntry(mapping, 'KeyJ', [r'о', r'О', r'', r''], 'J'); + verifyEntry(mapping, 'KeyK', [r'л', r'Л', r'', r''], 'K'); + verifyEntry(mapping, 'KeyL', [r'д', r'Д', r'', r''], 'L'); + verifyEntry(mapping, 'KeyM', [r'ь', r'Ь', r'', r''], 'M'); + verifyEntry(mapping, 'KeyN', [r'т', r'Т', r'', r''], 'N'); + verifyEntry(mapping, 'KeyO', [r'щ', r'Щ', r'', r''], 'O'); + verifyEntry(mapping, 'KeyP', [r'з', r'З', r'', r''], 'P'); + verifyEntry(mapping, 'KeyQ', [r'й', r'Й', r'', r''], 'Q'); + verifyEntry(mapping, 'KeyR', [r'к', r'К', r'', r''], 'R'); + verifyEntry(mapping, 'KeyS', [r'ы', r'Ы', r'', r''], 'S'); + verifyEntry(mapping, 'KeyT', [r'е', r'Е', r'', r''], 'T'); + verifyEntry(mapping, 'KeyU', [r'г', r'Г', r'', r''], 'U'); + verifyEntry(mapping, 'KeyV', [r'м', r'М', r'', r''], 'V'); + verifyEntry(mapping, 'KeyW', [r'ц', r'Ц', r'', r''], 'W'); + verifyEntry(mapping, 'KeyX', [r'ч', r'Ч', r'', r''], 'X'); + verifyEntry(mapping, 'KeyY', [r'н', r'Н', r'', r''], 'Y'); + verifyEntry(mapping, 'KeyZ', [r'я', r'Я', r'', r''], 'Z'); }); group('sv', () { - verifyEntry(mapping, 'Digit0', ['0', '=', '}', ''], '0'); - verifyEntry(mapping, 'Digit1', ['1', '!', '', ''], '1'); - verifyEntry(mapping, 'Digit2', ['2', '"', '@', ''], '2'); - verifyEntry(mapping, 'Digit3', ['3', '#', '£', ''], '3'); - verifyEntry(mapping, 'Digit4', ['4', '¤', r'$', ''], '4'); - verifyEntry(mapping, 'Digit5', ['5', '%', '€', ''], '5'); - verifyEntry(mapping, 'Digit6', ['6', '&', '', ''], '6'); - verifyEntry(mapping, 'Digit7', ['7', '/', '{', ''], '7'); - verifyEntry(mapping, 'Digit8', ['8', '(', '[', ''], '8'); - verifyEntry(mapping, 'Digit9', ['9', ')', ']', ''], '9'); - verifyEntry(mapping, 'KeyA', ['a', 'A', '', ''], 'A'); - verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 'B'); - verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 'C'); - verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 'D'); - verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 'E'); - verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 'F'); - verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 'G'); - verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 'H'); - verifyEntry(mapping, 'KeyI', ['i', 'I', '', ''], 'I'); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 'J'); - verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 'K'); - verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 'L'); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', ''], 'M'); - verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 'N'); - verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 'O'); - verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 'P'); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', '', ''], 'Q'); - verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 'R'); - verifyEntry(mapping, 'KeyS', ['s', 'S', '', ''], 'S'); - verifyEntry(mapping, 'KeyT', ['t', 'T', '', ''], 'T'); - verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 'U'); - verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 'V'); - verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 'W'); - verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 'X'); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 'Y'); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 'Z'); + verifyEntry(mapping, 'Digit0', [r'0', r'=', r'}', r''], '0'); + verifyEntry(mapping, 'Digit1', [r'1', r'!', r'', r''], '1'); + verifyEntry(mapping, 'Digit2', [r'2', r'"', r'@', r''], '2'); + verifyEntry(mapping, 'Digit3', [r'3', r'#', r'£', r''], '3'); + verifyEntry(mapping, 'Digit4', [r'4', r'¤', r'$', r''], '4'); + verifyEntry(mapping, 'Digit5', [r'5', r'%', r'€', r''], '5'); + verifyEntry(mapping, 'Digit6', [r'6', r'&', r'', r''], '6'); + verifyEntry(mapping, 'Digit7', [r'7', r'/', r'{', r''], '7'); + verifyEntry(mapping, 'Digit8', [r'8', r'(', r'[', r''], '8'); + verifyEntry(mapping, 'Digit9', [r'9', r')', r']', r''], '9'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'A'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'B'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'C'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'D'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r''], 'E'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'F'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'G'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'H'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'I'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'J'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'K'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'L'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r''], 'M'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'N'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'O'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'P'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'', r''], 'Q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'R'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 'S'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 'T'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'U'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'V'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'W'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'X'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'Y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'', r''], 'Z'); }); group('thai', () { - verifyEntry(mapping, 'Digit0', ['จ', '๗', '', ''], '0'); - verifyEntry(mapping, 'Digit1', ['ๅ', '+', '', ''], '1'); - verifyEntry(mapping, 'Digit2', ['/', '๑', '', ''], '2'); - verifyEntry(mapping, 'Digit3', ['-', '๒', '', ''], '3'); - verifyEntry(mapping, 'Digit4', ['ภ', '๓', '', ''], '4'); - verifyEntry(mapping, 'Digit5', ['ถ', '๔', '', ''], '5'); - verifyEntry(mapping, 'Digit6', ['ุ', 'ู', '', ''], '6'); - verifyEntry(mapping, 'Digit7', ['ึ', '฿', '', ''], '7'); - verifyEntry(mapping, 'Digit8', ['ค', '๕', '', ''], '8'); - verifyEntry(mapping, 'Digit9', ['ต', '๖', '', ''], '9'); - verifyEntry(mapping, 'KeyA', ['ฟ', 'ฤ', '', ''], 'A'); - verifyEntry(mapping, 'KeyB', ['ิ', 'ฺ', '', ''], 'B'); - verifyEntry(mapping, 'KeyC', ['แ', 'ฉ', '', ''], 'C'); - verifyEntry(mapping, 'KeyD', ['ก', 'ฏ', '', ''], 'D'); - verifyEntry(mapping, 'KeyE', ['ำ', 'ฎ', '', ''], 'E'); - verifyEntry(mapping, 'KeyF', ['ด', 'โ', '', ''], 'F'); - verifyEntry(mapping, 'KeyG', ['เ', 'ฌ', '', ''], 'G'); - verifyEntry(mapping, 'KeyH', ['้', '็', '', ''], 'H'); - verifyEntry(mapping, 'KeyI', ['ร', 'ณ', '', ''], 'I'); - verifyEntry(mapping, 'KeyJ', ['่', '๋', '', ''], 'J'); - verifyEntry(mapping, 'KeyK', ['า', 'ษ', '', ''], 'K'); - verifyEntry(mapping, 'KeyL', ['ส', 'ศ', '', ''], 'L'); - verifyEntry(mapping, 'KeyM', ['ท', '?', '', ''], 'M'); - verifyEntry(mapping, 'KeyN', ['ื', '์', '', ''], 'N'); - verifyEntry(mapping, 'KeyO', ['น', 'ฯ', '', ''], 'O'); - verifyEntry(mapping, 'KeyP', ['ย', 'ญ', '', ''], 'P'); - verifyEntry(mapping, 'KeyQ', ['ๆ', '๐', '', ''], 'Q'); - verifyEntry(mapping, 'KeyR', ['พ', 'ฑ', '', ''], 'R'); - verifyEntry(mapping, 'KeyS', ['ห', 'ฆ', '', ''], 'S'); - verifyEntry(mapping, 'KeyT', ['ะ', 'ธ', '', ''], 'T'); - verifyEntry(mapping, 'KeyU', ['ี', '๊', '', ''], 'U'); - verifyEntry(mapping, 'KeyV', ['อ', 'ฮ', '', ''], 'V'); - verifyEntry(mapping, 'KeyW', ['ไ', '"', '', ''], 'W'); - verifyEntry(mapping, 'KeyX', ['ป', ')', '', ''], 'X'); - verifyEntry(mapping, 'KeyY', ['ั', 'ํ', '', ''], 'Y'); - verifyEntry(mapping, 'KeyZ', ['ผ', '(', '', ''], 'Z'); + verifyEntry(mapping, 'Digit0', [r'จ', r'๗', r'', r''], '0'); + verifyEntry(mapping, 'Digit1', [r'ๅ', r'+', r'', r''], '1'); + verifyEntry(mapping, 'Digit2', [r'/', r'๑', r'', r''], '2'); + verifyEntry(mapping, 'Digit3', [r'-', r'๒', r'', r''], '3'); + verifyEntry(mapping, 'Digit4', [r'ภ', r'๓', r'', r''], '4'); + verifyEntry(mapping, 'Digit5', [r'ถ', r'๔', r'', r''], '5'); + verifyEntry(mapping, 'Digit6', [r'ุ', r'ู', r'', r''], '6'); + verifyEntry(mapping, 'Digit7', [r'ึ', r'฿', r'', r''], '7'); + verifyEntry(mapping, 'Digit8', [r'ค', r'๕', r'', r''], '8'); + verifyEntry(mapping, 'Digit9', [r'ต', r'๖', r'', r''], '9'); + verifyEntry(mapping, 'KeyA', [r'ฟ', r'ฤ', r'', r''], 'A'); + verifyEntry(mapping, 'KeyB', [r'ิ', r'ฺ', r'', r''], 'B'); + verifyEntry(mapping, 'KeyC', [r'แ', r'ฉ', r'', r''], 'C'); + verifyEntry(mapping, 'KeyD', [r'ก', r'ฏ', r'', r''], 'D'); + verifyEntry(mapping, 'KeyE', [r'ำ', r'ฎ', r'', r''], 'E'); + verifyEntry(mapping, 'KeyF', [r'ด', r'โ', r'', r''], 'F'); + verifyEntry(mapping, 'KeyG', [r'เ', r'ฌ', r'', r''], 'G'); + verifyEntry(mapping, 'KeyH', [r'้', r'็', r'', r''], 'H'); + verifyEntry(mapping, 'KeyI', [r'ร', r'ณ', r'', r''], 'I'); + verifyEntry(mapping, 'KeyJ', [r'่', r'๋', r'', r''], 'J'); + verifyEntry(mapping, 'KeyK', [r'า', r'ษ', r'', r''], 'K'); + verifyEntry(mapping, 'KeyL', [r'ส', r'ศ', r'', r''], 'L'); + verifyEntry(mapping, 'KeyM', [r'ท', r'?', r'', r''], 'M'); + verifyEntry(mapping, 'KeyN', [r'ื', r'์', r'', r''], 'N'); + verifyEntry(mapping, 'KeyO', [r'น', r'ฯ', r'', r''], 'O'); + verifyEntry(mapping, 'KeyP', [r'ย', r'ญ', r'', r''], 'P'); + verifyEntry(mapping, 'KeyQ', [r'ๆ', r'๐', r'', r''], 'Q'); + verifyEntry(mapping, 'KeyR', [r'พ', r'ฑ', r'', r''], 'R'); + verifyEntry(mapping, 'KeyS', [r'ห', r'ฆ', r'', r''], 'S'); + verifyEntry(mapping, 'KeyT', [r'ะ', r'ธ', r'', r''], 'T'); + verifyEntry(mapping, 'KeyU', [r'ี', r'๊', r'', r''], 'U'); + verifyEntry(mapping, 'KeyV', [r'อ', r'ฮ', r'', r''], 'V'); + verifyEntry(mapping, 'KeyW', [r'ไ', r'"', r'', r''], 'W'); + verifyEntry(mapping, 'KeyX', [r'ป', r')', r'', r''], 'X'); + verifyEntry(mapping, 'KeyY', [r'ั', r'ํ', r'', r''], 'Y'); + verifyEntry(mapping, 'KeyZ', [r'ผ', r'(', r'', r''], 'Z'); }); group('tr', () { - verifyEntry(mapping, 'Digit0', ['0', '=', '}', ''], '0'); - verifyEntry(mapping, 'Digit1', ['1', '!', '>', ''], '1'); - verifyEntry(mapping, 'Digit2', ['2', "'", '£', ''], '2'); - verifyEntry(mapping, 'Digit3', ['3', '^', '#', ''], '3'); - verifyEntry(mapping, 'Digit4', ['4', '+', r'$', ''], '4'); - verifyEntry(mapping, 'Digit5', ['5', '%', '½', ''], '5'); - verifyEntry(mapping, 'Digit6', ['6', '&', '', ''], '6'); - verifyEntry(mapping, 'Digit7', ['7', '/', '{', ''], '7'); - verifyEntry(mapping, 'Digit8', ['8', '(', '[', ''], '8'); - verifyEntry(mapping, 'Digit9', ['9', ')', ']', ''], '9'); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'æ', 'Æ'], 'A'); - verifyEntry(mapping, 'KeyB', ['b', 'B', '', ''], 'B'); - verifyEntry(mapping, 'KeyC', ['c', 'C', '', ''], 'C'); - verifyEntry(mapping, 'KeyD', ['d', 'D', '', ''], 'D'); - verifyEntry(mapping, 'KeyE', ['e', 'E', '€', ''], 'E'); - verifyEntry(mapping, 'KeyF', ['f', 'F', '', ''], 'F'); - verifyEntry(mapping, 'KeyG', ['g', 'G', '', ''], 'G'); - verifyEntry(mapping, 'KeyH', ['h', 'H', '', ''], 'H'); - verifyEntry(mapping, 'KeyI', ['ı', 'I', 'i', 'İ'], 'I'); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '', ''], 'J'); - verifyEntry(mapping, 'KeyK', ['k', 'K', '', ''], 'K'); - verifyEntry(mapping, 'KeyL', ['l', 'L', '', ''], 'L'); - verifyEntry(mapping, 'KeyM', ['m', 'M', '', ''], 'M'); - verifyEntry(mapping, 'KeyN', ['n', 'N', '', ''], 'N'); - verifyEntry(mapping, 'KeyO', ['o', 'O', '', ''], 'O'); - verifyEntry(mapping, 'KeyP', ['p', 'P', '', ''], 'P'); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', '@', ''], 'Q'); - verifyEntry(mapping, 'KeyR', ['r', 'R', '', ''], 'R'); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', ''], 'S'); - verifyEntry(mapping, 'KeyT', ['t', 'T', '₺', ''], 'T'); - verifyEntry(mapping, 'KeyU', ['u', 'U', '', ''], 'U'); - verifyEntry(mapping, 'KeyV', ['v', 'V', '', ''], 'V'); - verifyEntry(mapping, 'KeyW', ['w', 'W', '', ''], 'W'); - verifyEntry(mapping, 'KeyX', ['x', 'X', '', ''], 'X'); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '', ''], 'Y'); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', '', ''], 'Z'); + verifyEntry(mapping, 'Digit0', [r'0', r'=', r'}', r''], '0'); + verifyEntry(mapping, 'Digit1', [r'1', r'!', r'>', r''], '1'); + verifyEntry(mapping, 'Digit2', [r'2', r"'", r'£', r''], '2'); + verifyEntry(mapping, 'Digit3', [r'3', r'^', r'#', r''], '3'); + verifyEntry(mapping, 'Digit4', [r'4', r'+', r'$', r''], '4'); + verifyEntry(mapping, 'Digit5', [r'5', r'%', r'½', r''], '5'); + verifyEntry(mapping, 'Digit6', [r'6', r'&', r'', r''], '6'); + verifyEntry(mapping, 'Digit7', [r'7', r'/', r'{', r''], '7'); + verifyEntry(mapping, 'Digit8', [r'8', r'(', r'[', r''], '8'); + verifyEntry(mapping, 'Digit9', [r'9', r')', r']', r''], '9'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'æ', r'Æ'], 'A'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'B'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'C'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'D'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r''], 'E'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'F'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'G'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'H'); + verifyEntry(mapping, 'KeyI', [r'ı', r'I', r'i', r'İ'], 'I'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'J'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'K'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'L'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'', r''], 'M'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'N'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'O'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'P'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'@', r''], 'Q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'R'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r''], 'S'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'₺', r''], 'T'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'U'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'V'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'W'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'X'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'Y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'', r''], 'Z'); }); } void testLinux(LocaleKeymap mapping) { group('de', () { - verifyEntry(mapping, 'Digit0', ['0', '=', '}', '°'], '0'); - verifyEntry(mapping, 'Digit1', ['1', '!', '¹', '¡'], '1'); - verifyEntry(mapping, 'Digit2', ['2', '"', '²', '⅛'], '2'); - verifyEntry(mapping, 'Digit3', ['3', '§', '³', '£'], '3'); - verifyEntry(mapping, 'Digit4', ['4', r'$', '¼', '¤'], '4'); - verifyEntry(mapping, 'Digit5', ['5', '%', '½', '⅜'], '5'); - verifyEntry(mapping, 'Digit6', ['6', '&', '¬', '⅝'], '6'); - verifyEntry(mapping, 'Digit7', ['7', '/', '{', '⅞'], '7'); - verifyEntry(mapping, 'Digit8', ['8', '(', '[', '™'], '8'); - verifyEntry(mapping, 'Digit9', ['9', ')', ']', '±'], '9'); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'æ', 'Æ'], 'A'); - verifyEntry(mapping, 'KeyB', ['b', 'B', '“', '‘'], 'B'); - verifyEntry(mapping, 'KeyC', ['c', 'C', '¢', '©'], 'C'); - verifyEntry(mapping, 'KeyD', ['d', 'D', 'ð', 'Ð'], 'D'); - verifyEntry(mapping, 'KeyE', ['e', 'E', '€', '€'], 'E'); - verifyEntry(mapping, 'KeyF', ['f', 'F', 'đ', 'ª'], 'F'); - verifyEntry(mapping, 'KeyG', ['g', 'G', 'ŋ', 'Ŋ'], 'G'); - verifyEntry(mapping, 'KeyH', ['h', 'H', 'ħ', 'Ħ'], 'H'); - verifyEntry(mapping, 'KeyI', ['i', 'I', '→', 'ı'], 'I'); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '̣', '̇'], 'J'); - verifyEntry(mapping, 'KeyK', ['k', 'K', 'ĸ', '&'], 'K'); - verifyEntry(mapping, 'KeyL', ['l', 'L', 'ł', 'Ł'], 'L'); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', 'º'], 'M'); - verifyEntry(mapping, 'KeyN', ['n', 'N', '”', '’'], 'N'); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 'O'); - verifyEntry(mapping, 'KeyP', ['p', 'P', 'þ', 'Þ'], 'P'); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', '@', 'Ω'], 'Q'); - verifyEntry(mapping, 'KeyR', ['r', 'R', '¶', '®'], 'R'); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'ſ', 'ẞ'], 'S'); - verifyEntry(mapping, 'KeyT', ['t', 'T', 'ŧ', 'Ŧ'], 'T'); - verifyEntry(mapping, 'KeyU', ['u', 'U', '↓', '↑'], 'U'); - verifyEntry(mapping, 'KeyV', ['v', 'V', '„', '‚'], 'V'); - verifyEntry(mapping, 'KeyW', ['w', 'W', 'ł', 'Ł'], 'W'); - verifyEntry(mapping, 'KeyX', ['x', 'X', '«', '‹'], 'X'); - verifyEntry(mapping, 'KeyY', ['z', 'Z', '←', '¥'], 'Z'); - verifyEntry(mapping, 'KeyZ', ['y', 'Y', '»', '›'], 'Y'); + verifyEntry(mapping, 'Digit0', [r'0', r'=', r'}', r'°'], '0'); + verifyEntry(mapping, 'Digit1', [r'1', r'!', r'¹', r'¡'], '1'); + verifyEntry(mapping, 'Digit2', [r'2', r'"', r'²', r'⅛'], '2'); + verifyEntry(mapping, 'Digit3', [r'3', r'§', r'³', r'£'], '3'); + verifyEntry(mapping, 'Digit4', [r'4', r'$', r'¼', r'¤'], '4'); + verifyEntry(mapping, 'Digit5', [r'5', r'%', r'½', r'⅜'], '5'); + verifyEntry(mapping, 'Digit6', [r'6', r'&', r'¬', r'⅝'], '6'); + verifyEntry(mapping, 'Digit7', [r'7', r'/', r'{', r'⅞'], '7'); + verifyEntry(mapping, 'Digit8', [r'8', r'(', r'[', r'™'], '8'); + verifyEntry(mapping, 'Digit9', [r'9', r')', r']', r'±'], '9'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'æ', r'Æ'], 'A'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'“', r'‘'], 'B'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'¢', r'©'], 'C'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'ð', r'Ð'], 'D'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r'€'], 'E'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'đ', r'ª'], 'F'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'ŋ', r'Ŋ'], 'G'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'ħ', r'Ħ'], 'H'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'→', r'ı'], 'I'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'̣', r'̇'], 'J'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'ĸ', r'&'], 'K'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'ł', r'Ł'], 'L'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r'º'], 'M'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'”', r'’'], 'N'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'O'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'þ', r'Þ'], 'P'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'@', r'Ω'], 'Q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'¶', r'®'], 'R'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'ſ', r'ẞ'], 'S'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'ŧ', r'Ŧ'], 'T'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'↓', r'↑'], 'U'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'„', r'‚'], 'V'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'ł', r'Ł'], 'W'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'«', r'‹'], 'X'); + verifyEntry(mapping, 'KeyY', [r'z', r'Z', r'←', r'¥'], 'Z'); + verifyEntry(mapping, 'KeyZ', [r'y', r'Y', r'»', r'›'], 'Y'); }); group('en', () { - verifyEntry(mapping, 'Digit0', ['0', ')', '0', ')'], '0'); - verifyEntry(mapping, 'Digit1', ['1', '!', '1', '!'], '1'); - verifyEntry(mapping, 'Digit2', ['2', '@', '2', '@'], '2'); - verifyEntry(mapping, 'Digit3', ['3', '#', '3', '#'], '3'); - verifyEntry(mapping, 'Digit4', ['4', r'$', '4', r'$'], '4'); - verifyEntry(mapping, 'Digit5', ['5', '%', '5', '%'], '5'); - verifyEntry(mapping, 'Digit6', ['6', '^', '6', '^'], '6'); - verifyEntry(mapping, 'Digit7', ['7', '&', '7', '&'], '7'); - verifyEntry(mapping, 'Digit8', ['8', '*', '8', '*'], '8'); - verifyEntry(mapping, 'Digit9', ['9', '(', '9', '('], '9'); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'a', 'A'], 'A'); - verifyEntry(mapping, 'KeyB', ['b', 'B', 'b', 'B'], 'B'); - verifyEntry(mapping, 'KeyC', ['c', 'C', 'c', 'C'], 'C'); - verifyEntry(mapping, 'KeyD', ['d', 'D', 'd', 'D'], 'D'); - verifyEntry(mapping, 'KeyE', ['e', 'E', 'e', 'E'], 'E'); - verifyEntry(mapping, 'KeyF', ['f', 'F', 'f', 'F'], 'F'); - verifyEntry(mapping, 'KeyG', ['g', 'G', 'g', 'G'], 'G'); - verifyEntry(mapping, 'KeyH', ['h', 'H', 'h', 'H'], 'H'); - verifyEntry(mapping, 'KeyI', ['i', 'I', 'i', 'I'], 'I'); - verifyEntry(mapping, 'KeyJ', ['j', 'J', 'j', 'J'], 'J'); - verifyEntry(mapping, 'KeyK', ['k', 'K', 'k', 'K'], 'K'); - verifyEntry(mapping, 'KeyL', ['l', 'L', 'l', 'L'], 'L'); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'm', 'M'], 'M'); - verifyEntry(mapping, 'KeyN', ['n', 'N', 'n', 'N'], 'N'); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'o', 'O'], 'O'); - verifyEntry(mapping, 'KeyP', ['p', 'P', 'p', 'P'], 'P'); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'q', 'Q'], 'Q'); - verifyEntry(mapping, 'KeyR', ['r', 'R', 'r', 'R'], 'R'); - verifyEntry(mapping, 'KeyS', ['s', 'S', 's', 'S'], 'S'); - verifyEntry(mapping, 'KeyT', ['t', 'T', 't', 'T'], 'T'); - verifyEntry(mapping, 'KeyU', ['u', 'U', 'u', 'U'], 'U'); - verifyEntry(mapping, 'KeyV', ['v', 'V', 'v', 'V'], 'V'); - verifyEntry(mapping, 'KeyW', ['w', 'W', 'w', 'W'], 'W'); - verifyEntry(mapping, 'KeyX', ['x', 'X', 'x', 'X'], 'X'); - verifyEntry(mapping, 'KeyY', ['y', 'Y', 'y', 'Y'], 'Y'); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'z', 'Z'], 'Z'); + verifyEntry(mapping, 'Digit0', [r'0', r')', r'0', r')'], '0'); + verifyEntry(mapping, 'Digit1', [r'1', r'!', r'1', r'!'], '1'); + verifyEntry(mapping, 'Digit2', [r'2', r'@', r'2', r'@'], '2'); + verifyEntry(mapping, 'Digit3', [r'3', r'#', r'3', r'#'], '3'); + verifyEntry(mapping, 'Digit4', [r'4', r'$', r'4', r'$'], '4'); + verifyEntry(mapping, 'Digit5', [r'5', r'%', r'5', r'%'], '5'); + verifyEntry(mapping, 'Digit6', [r'6', r'^', r'6', r'^'], '6'); + verifyEntry(mapping, 'Digit7', [r'7', r'&', r'7', r'&'], '7'); + verifyEntry(mapping, 'Digit8', [r'8', r'*', r'8', r'*'], '8'); + verifyEntry(mapping, 'Digit9', [r'9', r'(', r'9', r'('], '9'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'a', r'A'], 'A'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'b', r'B'], 'B'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'c', r'C'], 'C'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'd', r'D'], 'D'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'e', r'E'], 'E'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'f', r'F'], 'F'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'g', r'G'], 'G'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'h', r'H'], 'H'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'i', r'I'], 'I'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'j', r'J'], 'J'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'k', r'K'], 'K'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'l', r'L'], 'L'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'm', r'M'], 'M'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'n', r'N'], 'N'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'o', r'O'], 'O'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'p', r'P'], 'P'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'q', r'Q'], 'Q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'r', r'R'], 'R'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r's', r'S'], 'S'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r't', r'T'], 'T'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'u', r'U'], 'U'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'v', r'V'], 'V'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'w', r'W'], 'W'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'x', r'X'], 'X'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'y', r'Y'], 'Y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'z', r'Z'], 'Z'); }); group('es', () { - verifyEntry(mapping, 'Digit0', ['0', '=', '}', '°'], '0'); - verifyEntry(mapping, 'Digit1', ['1', '!', '|', '¡'], '1'); - verifyEntry(mapping, 'Digit2', ['2', '"', '@', '⅛'], '2'); - verifyEntry(mapping, 'Digit3', ['3', '·', '#', '£'], '3'); - verifyEntry(mapping, 'Digit4', ['4', r'$', '~', r'$'], '4'); - verifyEntry(mapping, 'Digit5', ['5', '%', '½', '⅜'], '5'); - verifyEntry(mapping, 'Digit6', ['6', '&', '¬', '⅝'], '6'); - verifyEntry(mapping, 'Digit7', ['7', '/', '{', '⅞'], '7'); - verifyEntry(mapping, 'Digit8', ['8', '(', '[', '™'], '8'); - verifyEntry(mapping, 'Digit9', ['9', ')', ']', '±'], '9'); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'æ', 'Æ'], 'A'); - verifyEntry(mapping, 'KeyB', ['b', 'B', '”', '’'], 'B'); - verifyEntry(mapping, 'KeyC', ['c', 'C', '¢', '©'], 'C'); - verifyEntry(mapping, 'KeyD', ['d', 'D', 'ð', 'Ð'], 'D'); - verifyEntry(mapping, 'KeyE', ['e', 'E', '€', '¢'], 'E'); - verifyEntry(mapping, 'KeyF', ['f', 'F', 'đ', 'ª'], 'F'); - verifyEntry(mapping, 'KeyG', ['g', 'G', 'ŋ', 'Ŋ'], 'G'); - verifyEntry(mapping, 'KeyH', ['h', 'H', 'ħ', 'Ħ'], 'H'); - verifyEntry(mapping, 'KeyI', ['i', 'I', '→', 'ı'], 'I'); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '̉', '̛'], 'J'); - verifyEntry(mapping, 'KeyK', ['k', 'K', 'ĸ', '&'], 'K'); - verifyEntry(mapping, 'KeyL', ['l', 'L', 'ł', 'Ł'], 'L'); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', 'º'], 'M'); - verifyEntry(mapping, 'KeyN', ['n', 'N', 'n', 'N'], 'N'); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 'O'); - verifyEntry(mapping, 'KeyP', ['p', 'P', 'þ', 'Þ'], 'P'); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', '@', 'Ω'], 'Q'); - verifyEntry(mapping, 'KeyR', ['r', 'R', '¶', '®'], 'R'); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', '§'], 'S'); - verifyEntry(mapping, 'KeyT', ['t', 'T', 'ŧ', 'Ŧ'], 'T'); - verifyEntry(mapping, 'KeyU', ['u', 'U', '↓', '↑'], 'U'); - verifyEntry(mapping, 'KeyV', ['v', 'V', '“', '‘'], 'V'); - verifyEntry(mapping, 'KeyW', ['w', 'W', 'ł', 'Ł'], 'W'); - verifyEntry(mapping, 'KeyX', ['x', 'X', '»', '>'], 'X'); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '←', '¥'], 'Y'); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', '«', '<'], 'Z'); + verifyEntry(mapping, 'Digit0', [r'0', r'=', r'}', r'°'], '0'); + verifyEntry(mapping, 'Digit1', [r'1', r'!', r'|', r'¡'], '1'); + verifyEntry(mapping, 'Digit2', [r'2', r'"', r'@', r'⅛'], '2'); + verifyEntry(mapping, 'Digit3', [r'3', r'·', r'#', r'£'], '3'); + verifyEntry(mapping, 'Digit4', [r'4', r'$', r'~', r'$'], '4'); + verifyEntry(mapping, 'Digit5', [r'5', r'%', r'½', r'⅜'], '5'); + verifyEntry(mapping, 'Digit6', [r'6', r'&', r'¬', r'⅝'], '6'); + verifyEntry(mapping, 'Digit7', [r'7', r'/', r'{', r'⅞'], '7'); + verifyEntry(mapping, 'Digit8', [r'8', r'(', r'[', r'™'], '8'); + verifyEntry(mapping, 'Digit9', [r'9', r')', r']', r'±'], '9'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'æ', r'Æ'], 'A'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'”', r'’'], 'B'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'¢', r'©'], 'C'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'ð', r'Ð'], 'D'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r'¢'], 'E'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'đ', r'ª'], 'F'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'ŋ', r'Ŋ'], 'G'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'ħ', r'Ħ'], 'H'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'→', r'ı'], 'I'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'̉', r'̛'], 'J'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'ĸ', r'&'], 'K'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'ł', r'Ł'], 'L'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r'º'], 'M'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'n', r'N'], 'N'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'O'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'þ', r'Þ'], 'P'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'@', r'Ω'], 'Q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'¶', r'®'], 'R'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r'§'], 'S'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'ŧ', r'Ŧ'], 'T'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'↓', r'↑'], 'U'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'“', r'‘'], 'V'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'ł', r'Ł'], 'W'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'»', r'>'], 'X'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'←', r'¥'], 'Y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'«', r'<'], 'Z'); }); group('fr', () { - verifyEntry(mapping, 'Digit0', ['à', '0', '@', '°'], '0'); - verifyEntry(mapping, 'Digit1', ['&', '1', '¹', '¡'], '1'); - verifyEntry(mapping, 'Digit2', ['é', '2', '~', '⅛'], '2'); - verifyEntry(mapping, 'Digit3', ['"', '3', '#', '£'], '3'); - verifyEntry(mapping, 'Digit4', ["'", '4', '{', r'$'], '4'); - verifyEntry(mapping, 'Digit5', ['(', '5', '[', '⅜'], '5'); - verifyEntry(mapping, 'Digit6', ['-', '6', '|', '⅝'], '6'); - verifyEntry(mapping, 'Digit7', ['è', '7', '`', '⅞'], '7'); - verifyEntry(mapping, 'Digit8', ['_', '8', r'\', '™'], '8'); - verifyEntry(mapping, 'Digit9', ['ç', '9', '^', '±'], '9'); - verifyEntry(mapping, 'KeyA', ['q', 'Q', '@', 'Ω'], 'Q'); - verifyEntry(mapping, 'KeyB', ['b', 'B', '”', '’'], 'B'); - verifyEntry(mapping, 'KeyC', ['c', 'C', '¢', '©'], 'C'); - verifyEntry(mapping, 'KeyD', ['d', 'D', 'ð', 'Ð'], 'D'); - verifyEntry(mapping, 'KeyE', ['e', 'E', '€', '¢'], 'E'); - verifyEntry(mapping, 'KeyF', ['f', 'F', 'đ', 'ª'], 'F'); - verifyEntry(mapping, 'KeyG', ['g', 'G', 'ŋ', 'Ŋ'], 'G'); - verifyEntry(mapping, 'KeyH', ['h', 'H', 'ħ', 'Ħ'], 'H'); - verifyEntry(mapping, 'KeyI', ['i', 'I', '→', 'ı'], 'I'); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '̉', '̛'], 'J'); - verifyEntry(mapping, 'KeyK', ['k', 'K', 'ĸ', '&'], 'K'); - verifyEntry(mapping, 'KeyL', ['l', 'L', 'ł', 'Ł'], 'L'); - verifyEntry(mapping, 'KeyN', ['n', 'N', 'n', 'N'], 'N'); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 'O'); - verifyEntry(mapping, 'KeyP', ['p', 'P', 'þ', 'Þ'], 'P'); - verifyEntry(mapping, 'KeyQ', ['a', 'A', 'æ', 'Æ'], 'A'); - verifyEntry(mapping, 'KeyR', ['r', 'R', '¶', '®'], 'R'); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', '§'], 'S'); - verifyEntry(mapping, 'KeyT', ['t', 'T', 'ŧ', 'Ŧ'], 'T'); - verifyEntry(mapping, 'KeyU', ['u', 'U', '↓', '↑'], 'U'); - verifyEntry(mapping, 'KeyV', ['v', 'V', '“', '‘'], 'V'); - verifyEntry(mapping, 'KeyW', ['z', 'Z', '«', '<'], 'Z'); - verifyEntry(mapping, 'KeyX', ['x', 'X', '»', '>'], 'X'); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '←', '¥'], 'Y'); - verifyEntry(mapping, 'KeyZ', ['w', 'W', 'ł', 'Ł'], 'W'); - verifyEntry(mapping, 'Semicolon', ['m', 'M', 'µ', 'º'], 'M'); + verifyEntry(mapping, 'Digit0', [r'à', r'0', r'@', r'°'], '0'); + verifyEntry(mapping, 'Digit1', [r'&', r'1', r'¹', r'¡'], '1'); + verifyEntry(mapping, 'Digit2', [r'é', r'2', r'~', r'⅛'], '2'); + verifyEntry(mapping, 'Digit3', [r'"', r'3', r'#', r'£'], '3'); + verifyEntry(mapping, 'Digit4', [r"'", r'4', r'{', r'$'], '4'); + verifyEntry(mapping, 'Digit5', [r'(', r'5', r'[', r'⅜'], '5'); + verifyEntry(mapping, 'Digit6', [r'-', r'6', r'|', r'⅝'], '6'); + verifyEntry(mapping, 'Digit7', [r'è', r'7', r'`', r'⅞'], '7'); + verifyEntry(mapping, 'Digit8', [r'_', r'8', r'\', r'™'], '8'); + verifyEntry(mapping, 'Digit9', [r'ç', r'9', r'^', r'±'], '9'); + verifyEntry(mapping, 'KeyA', [r'q', r'Q', r'@', r'Ω'], 'Q'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'”', r'’'], 'B'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'¢', r'©'], 'C'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'ð', r'Ð'], 'D'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r'¢'], 'E'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'đ', r'ª'], 'F'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'ŋ', r'Ŋ'], 'G'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'ħ', r'Ħ'], 'H'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'→', r'ı'], 'I'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'̉', r'̛'], 'J'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'ĸ', r'&'], 'K'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'ł', r'Ł'], 'L'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'n', r'N'], 'N'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'O'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'þ', r'Þ'], 'P'); + verifyEntry(mapping, 'KeyQ', [r'a', r'A', r'æ', r'Æ'], 'A'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'¶', r'®'], 'R'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r'§'], 'S'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'ŧ', r'Ŧ'], 'T'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'↓', r'↑'], 'U'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'“', r'‘'], 'V'); + verifyEntry(mapping, 'KeyW', [r'z', r'Z', r'«', r'<'], 'Z'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'»', r'>'], 'X'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'←', r'¥'], 'Y'); + verifyEntry(mapping, 'KeyZ', [r'w', r'W', r'ł', r'Ł'], 'W'); + verifyEntry(mapping, 'Semicolon', [r'm', r'M', r'µ', r'º'], 'M'); }); group('ru', () { - verifyEntry(mapping, 'Digit0', ['0', ')', '0', ')'], '0'); - verifyEntry(mapping, 'Digit1', ['1', '!', '1', '!'], '1'); - verifyEntry(mapping, 'Digit2', ['2', '"', '2', '"'], '2'); - verifyEntry(mapping, 'Digit3', ['3', '№', '3', '№'], '3'); - verifyEntry(mapping, 'Digit4', ['4', ';', '4', ';'], '4'); - verifyEntry(mapping, 'Digit5', ['5', '%', '5', '%'], '5'); - verifyEntry(mapping, 'Digit6', ['6', ':', '6', ':'], '6'); - verifyEntry(mapping, 'Digit7', ['7', '?', '7', '?'], '7'); - verifyEntry(mapping, 'Digit8', ['8', '*', '₽', ''], '8'); - verifyEntry(mapping, 'Digit9', ['9', '(', '9', '('], '9'); - verifyEntry(mapping, 'KeyA', ['ф', 'Ф', 'ф', 'Ф'], 'A'); - verifyEntry(mapping, 'KeyB', ['и', 'И', 'и', 'И'], 'B'); - verifyEntry(mapping, 'KeyC', ['с', 'С', 'с', 'С'], 'C'); - verifyEntry(mapping, 'KeyD', ['в', 'В', 'в', 'В'], 'D'); - verifyEntry(mapping, 'KeyE', ['у', 'У', 'у', 'У'], 'E'); - verifyEntry(mapping, 'KeyF', ['а', 'А', 'а', 'А'], 'F'); - verifyEntry(mapping, 'KeyG', ['п', 'П', 'п', 'П'], 'G'); - verifyEntry(mapping, 'KeyH', ['р', 'Р', 'р', 'Р'], 'H'); - verifyEntry(mapping, 'KeyI', ['ш', 'Ш', 'ш', 'Ш'], 'I'); - verifyEntry(mapping, 'KeyJ', ['о', 'О', 'о', 'О'], 'J'); - verifyEntry(mapping, 'KeyK', ['л', 'Л', 'л', 'Л'], 'K'); - verifyEntry(mapping, 'KeyL', ['д', 'Д', 'д', 'Д'], 'L'); - verifyEntry(mapping, 'KeyM', ['ь', 'Ь', 'ь', 'Ь'], 'M'); - verifyEntry(mapping, 'KeyN', ['т', 'Т', 'т', 'Т'], 'N'); - verifyEntry(mapping, 'KeyO', ['щ', 'Щ', 'щ', 'Щ'], 'O'); - verifyEntry(mapping, 'KeyP', ['з', 'З', 'з', 'З'], 'P'); - verifyEntry(mapping, 'KeyQ', ['й', 'Й', 'й', 'Й'], 'Q'); - verifyEntry(mapping, 'KeyR', ['к', 'К', 'к', 'К'], 'R'); - verifyEntry(mapping, 'KeyS', ['ы', 'Ы', 'ы', 'Ы'], 'S'); - verifyEntry(mapping, 'KeyT', ['е', 'Е', 'е', 'Е'], 'T'); - verifyEntry(mapping, 'KeyU', ['г', 'Г', 'г', 'Г'], 'U'); - verifyEntry(mapping, 'KeyV', ['м', 'М', 'м', 'М'], 'V'); - verifyEntry(mapping, 'KeyW', ['ц', 'Ц', 'ц', 'Ц'], 'W'); - verifyEntry(mapping, 'KeyX', ['ч', 'Ч', 'ч', 'Ч'], 'X'); - verifyEntry(mapping, 'KeyY', ['н', 'Н', 'н', 'Н'], 'Y'); - verifyEntry(mapping, 'KeyZ', ['я', 'Я', 'я', 'Я'], 'Z'); + verifyEntry(mapping, 'Digit0', [r'0', r')', r'0', r')'], '0'); + verifyEntry(mapping, 'Digit1', [r'1', r'!', r'1', r'!'], '1'); + verifyEntry(mapping, 'Digit2', [r'2', r'"', r'2', r'"'], '2'); + verifyEntry(mapping, 'Digit3', [r'3', r'№', r'3', r'№'], '3'); + verifyEntry(mapping, 'Digit4', [r'4', r';', r'4', r';'], '4'); + verifyEntry(mapping, 'Digit5', [r'5', r'%', r'5', r'%'], '5'); + verifyEntry(mapping, 'Digit6', [r'6', r':', r'6', r':'], '6'); + verifyEntry(mapping, 'Digit7', [r'7', r'?', r'7', r'?'], '7'); + verifyEntry(mapping, 'Digit8', [r'8', r'*', r'₽', r''], '8'); + verifyEntry(mapping, 'Digit9', [r'9', r'(', r'9', r'('], '9'); + verifyEntry(mapping, 'KeyA', [r'ф', r'Ф', r'ф', r'Ф'], 'A'); + verifyEntry(mapping, 'KeyB', [r'и', r'И', r'и', r'И'], 'B'); + verifyEntry(mapping, 'KeyC', [r'с', r'С', r'с', r'С'], 'C'); + verifyEntry(mapping, 'KeyD', [r'в', r'В', r'в', r'В'], 'D'); + verifyEntry(mapping, 'KeyE', [r'у', r'У', r'у', r'У'], 'E'); + verifyEntry(mapping, 'KeyF', [r'а', r'А', r'а', r'А'], 'F'); + verifyEntry(mapping, 'KeyG', [r'п', r'П', r'п', r'П'], 'G'); + verifyEntry(mapping, 'KeyH', [r'р', r'Р', r'р', r'Р'], 'H'); + verifyEntry(mapping, 'KeyI', [r'ш', r'Ш', r'ш', r'Ш'], 'I'); + verifyEntry(mapping, 'KeyJ', [r'о', r'О', r'о', r'О'], 'J'); + verifyEntry(mapping, 'KeyK', [r'л', r'Л', r'л', r'Л'], 'K'); + verifyEntry(mapping, 'KeyL', [r'д', r'Д', r'д', r'Д'], 'L'); + verifyEntry(mapping, 'KeyM', [r'ь', r'Ь', r'ь', r'Ь'], 'M'); + verifyEntry(mapping, 'KeyN', [r'т', r'Т', r'т', r'Т'], 'N'); + verifyEntry(mapping, 'KeyO', [r'щ', r'Щ', r'щ', r'Щ'], 'O'); + verifyEntry(mapping, 'KeyP', [r'з', r'З', r'з', r'З'], 'P'); + verifyEntry(mapping, 'KeyQ', [r'й', r'Й', r'й', r'Й'], 'Q'); + verifyEntry(mapping, 'KeyR', [r'к', r'К', r'к', r'К'], 'R'); + verifyEntry(mapping, 'KeyS', [r'ы', r'Ы', r'ы', r'Ы'], 'S'); + verifyEntry(mapping, 'KeyT', [r'е', r'Е', r'е', r'Е'], 'T'); + verifyEntry(mapping, 'KeyU', [r'г', r'Г', r'г', r'Г'], 'U'); + verifyEntry(mapping, 'KeyV', [r'м', r'М', r'м', r'М'], 'V'); + verifyEntry(mapping, 'KeyW', [r'ц', r'Ц', r'ц', r'Ц'], 'W'); + verifyEntry(mapping, 'KeyX', [r'ч', r'Ч', r'ч', r'Ч'], 'X'); + verifyEntry(mapping, 'KeyY', [r'н', r'Н', r'н', r'Н'], 'Y'); + verifyEntry(mapping, 'KeyZ', [r'я', r'Я', r'я', r'Я'], 'Z'); }); } void testDarwin(LocaleKeymap mapping) { group('de', () { - verifyEntry(mapping, 'Digit0', ['0', '=', '≠', '¯'], '0'); - verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '¬'], '1'); - verifyEntry(mapping, 'Digit2', ['2', '"', '“', '”'], '2'); - verifyEntry(mapping, 'Digit3', ['3', '§', '¶', '#'], '3'); - verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '£'], '4'); - verifyEntry(mapping, 'Digit5', ['5', '%', '[', 'fi'], '5'); - verifyEntry(mapping, 'Digit6', ['6', '&', ']', 'Dead'], '6'); - verifyEntry(mapping, 'Digit7', ['7', '/', '|', r'\'], '7'); - verifyEntry(mapping, 'Digit8', ['8', '(', '{', '˜'], '8'); - verifyEntry(mapping, 'Digit9', ['9', ')', '}', '·'], '9'); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 'A'); - verifyEntry(mapping, 'KeyB', ['b', 'B', '∫', '‹'], 'B'); - verifyEntry(mapping, 'KeyC', ['c', 'C', 'ç', 'Ç'], 'C'); - verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', '™'], 'D'); - verifyEntry(mapping, 'KeyE', ['e', 'E', '€', '‰'], 'E'); - verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', 'Ï'], 'F'); - verifyEntry(mapping, 'KeyG', ['g', 'G', '©', 'Ì'], 'G'); - verifyEntry(mapping, 'KeyH', ['h', 'H', 'ª', 'Ó'], 'H'); - verifyEntry(mapping, 'KeyI', ['i', 'I', '⁄', 'Û'], 'I'); - verifyEntry(mapping, 'KeyJ', ['j', 'J', 'º', 'ı'], 'J'); - verifyEntry(mapping, 'KeyK', ['k', 'K', '∆', 'ˆ'], 'K'); - verifyEntry(mapping, 'KeyL', ['l', 'L', '@', 'fl'], 'L'); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', '˘'], 'M'); - verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', '›'], 'N'); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 'O'); - verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 'P'); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', '«', '»'], 'Q'); - verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '¸'], 'R'); - verifyEntry(mapping, 'KeyS', ['s', 'S', '‚', 'Í'], 'S'); - verifyEntry(mapping, 'KeyT', ['t', 'T', '†', '˝'], 'T'); - verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', 'Á'], 'U'); - verifyEntry(mapping, 'KeyV', ['v', 'V', '√', '◊'], 'V'); - verifyEntry(mapping, 'KeyW', ['w', 'W', '∑', '„'], 'W'); - verifyEntry(mapping, 'KeyX', ['x', 'X', '≈', 'Ù'], 'X'); - verifyEntry(mapping, 'KeyY', ['z', 'Z', 'Ω', 'ˇ'], 'Z'); - verifyEntry(mapping, 'KeyZ', ['y', 'Y', '¥', '‡'], 'Y'); + verifyEntry(mapping, 'Digit0', [r'0', r'=', r'≠', r'¯'], '0'); + verifyEntry(mapping, 'Digit1', [r'1', r'!', r'¡', r'¬'], '1'); + verifyEntry(mapping, 'Digit2', [r'2', r'"', r'“', r'”'], '2'); + verifyEntry(mapping, 'Digit3', [r'3', r'§', r'¶', r'#'], '3'); + verifyEntry(mapping, 'Digit4', [r'4', r'$', r'¢', r'£'], '4'); + verifyEntry(mapping, 'Digit5', [r'5', r'%', r'[', r'fi'], '5'); + verifyEntry(mapping, 'Digit6', [r'6', r'&', r']', r'Dead'], '6'); + verifyEntry(mapping, 'Digit7', [r'7', r'/', r'|', r'\'], '7'); + verifyEntry(mapping, 'Digit8', [r'8', r'(', r'{', r'˜'], '8'); + verifyEntry(mapping, 'Digit9', [r'9', r')', r'}', r'·'], '9'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'A'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'∫', r'‹'], 'B'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ç', r'Ç'], 'C'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'∂', r'™'], 'D'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r'‰'], 'E'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ƒ', r'Ï'], 'F'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'©', r'Ì'], 'G'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'ª', r'Ó'], 'H'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'⁄', r'Û'], 'I'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'º', r'ı'], 'J'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'∆', r'ˆ'], 'K'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'@', r'fl'], 'L'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r'˘'], 'M'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'Dead', r'›'], 'N'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'O'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'π', r'∏'], 'P'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'«', r'»'], 'Q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r'¸'], 'R'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'‚', r'Í'], 'S'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'†', r'˝'], 'T'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'Dead', r'Á'], 'U'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'√', r'◊'], 'V'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'∑', r'„'], 'W'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'≈', r'Ù'], 'X'); + verifyEntry(mapping, 'KeyY', [r'z', r'Z', r'Ω', r'ˇ'], 'Z'); + verifyEntry(mapping, 'KeyZ', [r'y', r'Y', r'¥', r'‡'], 'Y'); }); group('dvorak', () { - verifyEntry(mapping, 'Comma', ['w', 'W', '∑', '„'], 'W'); - verifyEntry(mapping, 'Digit0', ['0', ')', 'º', '‚'], '0'); - verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '⁄'], '1'); - verifyEntry(mapping, 'Digit2', ['2', '@', '™', '€'], '2'); - verifyEntry(mapping, 'Digit3', ['3', '#', '£', '‹'], '3'); - verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '›'], '4'); - verifyEntry(mapping, 'Digit5', ['5', '%', '∞', 'fi'], '5'); - verifyEntry(mapping, 'Digit6', ['6', '^', '§', 'fl'], '6'); - verifyEntry(mapping, 'Digit7', ['7', '&', '¶', '‡'], '7'); - verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], '8'); - verifyEntry(mapping, 'Digit9', ['9', '(', 'ª', '·'], '9'); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 'A'); - verifyEntry(mapping, 'KeyB', ['x', 'X', '≈', '˛'], 'X'); - verifyEntry(mapping, 'KeyC', ['j', 'J', '∆', 'Ô'], 'J'); - verifyEntry(mapping, 'KeyD', ['e', 'E', 'Dead', '´'], 'E'); - verifyEntry(mapping, 'KeyF', ['u', 'U', 'Dead', '¨'], 'U'); - verifyEntry(mapping, 'KeyG', ['i', 'I', 'Dead', 'ˆ'], 'I'); - verifyEntry(mapping, 'KeyH', ['d', 'D', '∂', 'Î'], 'D'); - verifyEntry(mapping, 'KeyI', ['c', 'C', 'ç', 'Ç'], 'C'); - verifyEntry(mapping, 'KeyJ', ['h', 'H', '˙', 'Ó'], 'H'); - verifyEntry(mapping, 'KeyK', ['t', 'T', '†', 'ˇ'], 'T'); - verifyEntry(mapping, 'KeyL', ['n', 'N', 'Dead', '˜'], 'N'); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', 'Â'], 'M'); - verifyEntry(mapping, 'KeyN', ['b', 'B', '∫', 'ı'], 'B'); - verifyEntry(mapping, 'KeyO', ['r', 'R', '®', '‰'], 'R'); - verifyEntry(mapping, 'KeyP', ['l', 'L', '¬', 'Ò'], 'L'); - verifyEntry(mapping, 'KeyR', ['p', 'P', 'π', '∏'], 'P'); - verifyEntry(mapping, 'KeyS', ['o', 'O', 'ø', 'Ø'], 'O'); - verifyEntry(mapping, 'KeyT', ['y', 'Y', '¥', 'Á'], 'Y'); - verifyEntry(mapping, 'KeyU', ['g', 'G', '©', '˝'], 'G'); - verifyEntry(mapping, 'KeyV', ['k', 'K', '˚', ''], 'K'); - verifyEntry(mapping, 'KeyX', ['q', 'Q', 'œ', 'Œ'], 'Q'); - verifyEntry(mapping, 'KeyY', ['f', 'F', 'ƒ', 'Ï'], 'F'); - verifyEntry(mapping, 'Period', ['v', 'V', '√', '◊'], 'V'); - verifyEntry(mapping, 'Semicolon', ['s', 'S', 'ß', 'Í'], 'S'); - verifyEntry(mapping, 'Slash', ['z', 'Z', 'Ω', '¸'], 'Z'); + verifyEntry(mapping, 'Comma', [r'w', r'W', r'∑', r'„'], 'W'); + verifyEntry(mapping, 'Digit0', [r'0', r')', r'º', r'‚'], '0'); + verifyEntry(mapping, 'Digit1', [r'1', r'!', r'¡', r'⁄'], '1'); + verifyEntry(mapping, 'Digit2', [r'2', r'@', r'™', r'€'], '2'); + verifyEntry(mapping, 'Digit3', [r'3', r'#', r'£', r'‹'], '3'); + verifyEntry(mapping, 'Digit4', [r'4', r'$', r'¢', r'›'], '4'); + verifyEntry(mapping, 'Digit5', [r'5', r'%', r'∞', r'fi'], '5'); + verifyEntry(mapping, 'Digit6', [r'6', r'^', r'§', r'fl'], '6'); + verifyEntry(mapping, 'Digit7', [r'7', r'&', r'¶', r'‡'], '7'); + verifyEntry(mapping, 'Digit8', [r'8', r'*', r'•', r'°'], '8'); + verifyEntry(mapping, 'Digit9', [r'9', r'(', r'ª', r'·'], '9'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'A'); + verifyEntry(mapping, 'KeyB', [r'x', r'X', r'≈', r'˛'], 'X'); + verifyEntry(mapping, 'KeyC', [r'j', r'J', r'∆', r'Ô'], 'J'); + verifyEntry(mapping, 'KeyD', [r'e', r'E', r'Dead', r'´'], 'E'); + verifyEntry(mapping, 'KeyF', [r'u', r'U', r'Dead', r'¨'], 'U'); + verifyEntry(mapping, 'KeyG', [r'i', r'I', r'Dead', r'ˆ'], 'I'); + verifyEntry(mapping, 'KeyH', [r'd', r'D', r'∂', r'Î'], 'D'); + verifyEntry(mapping, 'KeyI', [r'c', r'C', r'ç', r'Ç'], 'C'); + verifyEntry(mapping, 'KeyJ', [r'h', r'H', r'˙', r'Ó'], 'H'); + verifyEntry(mapping, 'KeyK', [r't', r'T', r'†', r'ˇ'], 'T'); + verifyEntry(mapping, 'KeyL', [r'n', r'N', r'Dead', r'˜'], 'N'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r'Â'], 'M'); + verifyEntry(mapping, 'KeyN', [r'b', r'B', r'∫', r'ı'], 'B'); + verifyEntry(mapping, 'KeyO', [r'r', r'R', r'®', r'‰'], 'R'); + verifyEntry(mapping, 'KeyP', [r'l', r'L', r'¬', r'Ò'], 'L'); + verifyEntry(mapping, 'KeyR', [r'p', r'P', r'π', r'∏'], 'P'); + verifyEntry(mapping, 'KeyS', [r'o', r'O', r'ø', r'Ø'], 'O'); + verifyEntry(mapping, 'KeyT', [r'y', r'Y', r'¥', r'Á'], 'Y'); + verifyEntry(mapping, 'KeyU', [r'g', r'G', r'©', r'˝'], 'G'); + verifyEntry(mapping, 'KeyV', [r'k', r'K', r'˚', r''], 'K'); + verifyEntry(mapping, 'KeyX', [r'q', r'Q', r'œ', r'Œ'], 'Q'); + verifyEntry(mapping, 'KeyY', [r'f', r'F', r'ƒ', r'Ï'], 'F'); + verifyEntry(mapping, 'Period', [r'v', r'V', r'√', r'◊'], 'V'); + verifyEntry(mapping, 'Semicolon', [r's', r'S', r'ß', r'Í'], 'S'); + verifyEntry(mapping, 'Slash', [r'z', r'Z', r'Ω', r'¸'], 'Z'); }); group('en', () { - verifyEntry(mapping, 'Digit0', ['0', ')', 'º', '‚'], '0'); - verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '⁄'], '1'); - verifyEntry(mapping, 'Digit2', ['2', '@', '™', '€'], '2'); - verifyEntry(mapping, 'Digit3', ['3', '#', '£', '‹'], '3'); - verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '›'], '4'); - verifyEntry(mapping, 'Digit5', ['5', '%', '∞', 'fi'], '5'); - verifyEntry(mapping, 'Digit6', ['6', '^', '§', 'fl'], '6'); - verifyEntry(mapping, 'Digit7', ['7', '&', '¶', '‡'], '7'); - verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], '8'); - verifyEntry(mapping, 'Digit9', ['9', '(', 'ª', '·'], '9'); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 'A'); - verifyEntry(mapping, 'KeyB', ['b', 'B', '∫', 'ı'], 'B'); - verifyEntry(mapping, 'KeyC', ['c', 'C', 'ç', 'Ç'], 'C'); - verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', 'Î'], 'D'); - verifyEntry(mapping, 'KeyE', ['e', 'E', 'Dead', '´'], 'E'); - verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', 'Ï'], 'F'); - verifyEntry(mapping, 'KeyG', ['g', 'G', '©', '˝'], 'G'); - verifyEntry(mapping, 'KeyH', ['h', 'H', '˙', 'Ó'], 'H'); - verifyEntry(mapping, 'KeyI', ['i', 'I', 'Dead', 'ˆ'], 'I'); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '∆', 'Ô'], 'J'); - verifyEntry(mapping, 'KeyK', ['k', 'K', '˚', ''], 'K'); - verifyEntry(mapping, 'KeyL', ['l', 'L', '¬', 'Ò'], 'L'); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', 'Â'], 'M'); - verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', '˜'], 'N'); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 'O'); - verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 'P'); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'œ', 'Œ'], 'Q'); - verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '‰'], 'R'); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', 'Í'], 'S'); - verifyEntry(mapping, 'KeyT', ['t', 'T', '†', 'ˇ'], 'T'); - verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', '¨'], 'U'); - verifyEntry(mapping, 'KeyV', ['v', 'V', '√', '◊'], 'V'); - verifyEntry(mapping, 'KeyW', ['w', 'W', '∑', '„'], 'W'); - verifyEntry(mapping, 'KeyX', ['x', 'X', '≈', '˛'], 'X'); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '¥', 'Á'], 'Y'); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'Ω', '¸'], 'Z'); + verifyEntry(mapping, 'Digit0', [r'0', r')', r'º', r'‚'], '0'); + verifyEntry(mapping, 'Digit1', [r'1', r'!', r'¡', r'⁄'], '1'); + verifyEntry(mapping, 'Digit2', [r'2', r'@', r'™', r'€'], '2'); + verifyEntry(mapping, 'Digit3', [r'3', r'#', r'£', r'‹'], '3'); + verifyEntry(mapping, 'Digit4', [r'4', r'$', r'¢', r'›'], '4'); + verifyEntry(mapping, 'Digit5', [r'5', r'%', r'∞', r'fi'], '5'); + verifyEntry(mapping, 'Digit6', [r'6', r'^', r'§', r'fl'], '6'); + verifyEntry(mapping, 'Digit7', [r'7', r'&', r'¶', r'‡'], '7'); + verifyEntry(mapping, 'Digit8', [r'8', r'*', r'•', r'°'], '8'); + verifyEntry(mapping, 'Digit9', [r'9', r'(', r'ª', r'·'], '9'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'A'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'∫', r'ı'], 'B'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ç', r'Ç'], 'C'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'∂', r'Î'], 'D'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'Dead', r'´'], 'E'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ƒ', r'Ï'], 'F'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'©', r'˝'], 'G'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'˙', r'Ó'], 'H'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'Dead', r'ˆ'], 'I'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'∆', r'Ô'], 'J'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'˚', r''], 'K'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'¬', r'Ò'], 'L'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r'Â'], 'M'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'Dead', r'˜'], 'N'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'O'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'π', r'∏'], 'P'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'œ', r'Œ'], 'Q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r'‰'], 'R'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r'Í'], 'S'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'†', r'ˇ'], 'T'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'Dead', r'¨'], 'U'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'√', r'◊'], 'V'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'∑', r'„'], 'W'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'≈', r'˛'], 'X'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'¥', r'Á'], 'Y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'Ω', r'¸'], 'Z'); }); group('en-ext', () { - verifyEntry(mapping, 'Digit0', ['0', ')', 'º', '‚'], '0'); - verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '⁄'], '1'); - verifyEntry(mapping, 'Digit2', ['2', '@', '™', '€'], '2'); - verifyEntry(mapping, 'Digit3', ['3', '#', '£', '‹'], '3'); - verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '›'], '4'); - verifyEntry(mapping, 'Digit5', ['5', '%', '§', '†'], '5'); - verifyEntry(mapping, 'Digit6', ['6', '^', 'Dead', '̂'], '6'); - verifyEntry(mapping, 'Digit7', ['7', '&', '¶', '‡'], '7'); - verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], '8'); - verifyEntry(mapping, 'Digit9', ['9', '(', 'ª', '·'], '9'); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'Dead', '̄'], 'A'); - verifyEntry(mapping, 'KeyB', ['b', 'B', 'Dead', '̆'], 'B'); - verifyEntry(mapping, 'KeyC', ['c', 'C', 'Dead', '̧'], 'C'); - verifyEntry(mapping, 'KeyD', ['d', 'D', 'ð', 'Ð'], 'D'); - verifyEntry(mapping, 'KeyE', ['e', 'E', 'Dead', '́'], 'E'); - verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', ''], 'F'); - verifyEntry(mapping, 'KeyG', ['g', 'G', '©', 'Dead'], 'G'); - verifyEntry(mapping, 'KeyH', ['h', 'H', 'Dead', '̱'], 'H'); - verifyEntry(mapping, 'KeyI', ['i', 'I', 'Dead', '̛'], 'I'); - verifyEntry(mapping, 'KeyJ', ['j', 'J', 'Dead', '̋'], 'J'); - verifyEntry(mapping, 'KeyK', ['k', 'K', 'Dead', '̊'], 'K'); - verifyEntry(mapping, 'KeyL', ['l', 'L', 'Dead', '̵'], 'L'); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'Dead', '̨'], 'M'); - verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', '̃'], 'N'); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 'O'); - verifyEntry(mapping, 'KeyP', ['p', 'P', 'Dead', '̦'], 'P'); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'œ', 'Œ'], 'Q'); - verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '‰'], 'R'); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', ''], 'S'); - verifyEntry(mapping, 'KeyT', ['t', 'T', 'þ', 'Þ'], 'T'); - verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', '̈'], 'U'); - verifyEntry(mapping, 'KeyV', ['v', 'V', 'Dead', '̌'], 'V'); - verifyEntry(mapping, 'KeyW', ['w', 'W', 'Dead', '̇'], 'W'); - verifyEntry(mapping, 'KeyX', ['x', 'X', 'Dead', '̣'], 'X'); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '¥', ''], 'Y'); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'Dead', '̉'], 'Z'); + verifyEntry(mapping, 'Digit0', [r'0', r')', r'º', r'‚'], '0'); + verifyEntry(mapping, 'Digit1', [r'1', r'!', r'¡', r'⁄'], '1'); + verifyEntry(mapping, 'Digit2', [r'2', r'@', r'™', r'€'], '2'); + verifyEntry(mapping, 'Digit3', [r'3', r'#', r'£', r'‹'], '3'); + verifyEntry(mapping, 'Digit4', [r'4', r'$', r'¢', r'›'], '4'); + verifyEntry(mapping, 'Digit5', [r'5', r'%', r'§', r'†'], '5'); + verifyEntry(mapping, 'Digit6', [r'6', r'^', r'Dead', r'̂'], '6'); + verifyEntry(mapping, 'Digit7', [r'7', r'&', r'¶', r'‡'], '7'); + verifyEntry(mapping, 'Digit8', [r'8', r'*', r'•', r'°'], '8'); + verifyEntry(mapping, 'Digit9', [r'9', r'(', r'ª', r'·'], '9'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'Dead', r'̄'], 'A'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'Dead', r'̆'], 'B'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'Dead', r'̧'], 'C'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'ð', r'Ð'], 'D'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'Dead', r'́'], 'E'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ƒ', r''], 'F'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'©', r'Dead'], 'G'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'Dead', r'̱'], 'H'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'Dead', r'̛'], 'I'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'Dead', r'̋'], 'J'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'Dead', r'̊'], 'K'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'Dead', r'̵'], 'L'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'Dead', r'̨'], 'M'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'Dead', r'̃'], 'N'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'O'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'Dead', r'̦'], 'P'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'œ', r'Œ'], 'Q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r'‰'], 'R'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r''], 'S'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'þ', r'Þ'], 'T'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'Dead', r'̈'], 'U'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'Dead', r'̌'], 'V'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'Dead', r'̇'], 'W'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'Dead', r'̣'], 'X'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'¥', r''], 'Y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'Dead', r'̉'], 'Z'); }); group('en-intl', () { - verifyEntry(mapping, 'Digit0', ['0', ')', 'º', '‚'], '0'); - verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '⁄'], '1'); - verifyEntry(mapping, 'Digit2', ['2', '@', '™', '€'], '2'); - verifyEntry(mapping, 'Digit3', ['3', '#', '£', '‹'], '3'); - verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '›'], '4'); - verifyEntry(mapping, 'Digit5', ['5', '%', '∞', 'fi'], '5'); - verifyEntry(mapping, 'Digit6', ['6', 'Dead', '§', 'fl'], '6'); - verifyEntry(mapping, 'Digit7', ['7', '&', '¶', '‡'], '7'); - verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], '8'); - verifyEntry(mapping, 'Digit9', ['9', '(', 'ª', '·'], '9'); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 'A'); - verifyEntry(mapping, 'KeyB', ['b', 'B', '∫', 'ı'], 'B'); - verifyEntry(mapping, 'KeyC', ['c', 'C', 'ç', 'Ç'], 'C'); - verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', 'Î'], 'D'); - verifyEntry(mapping, 'KeyE', ['e', 'E', 'Dead', '´'], 'E'); - verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', 'Ï'], 'F'); - verifyEntry(mapping, 'KeyG', ['g', 'G', '©', '˝'], 'G'); - verifyEntry(mapping, 'KeyH', ['h', 'H', '˙', 'Ó'], 'H'); - verifyEntry(mapping, 'KeyI', ['i', 'I', 'Dead', 'ˆ'], 'I'); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '∆', 'Ô'], 'J'); - verifyEntry(mapping, 'KeyK', ['k', 'K', '˚', ''], 'K'); - verifyEntry(mapping, 'KeyL', ['l', 'L', '¬', 'Ò'], 'L'); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', 'Â'], 'M'); - verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', '˜'], 'N'); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 'O'); - verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 'P'); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'œ', 'Œ'], 'Q'); - verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '‰'], 'R'); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', 'Í'], 'S'); - verifyEntry(mapping, 'KeyT', ['t', 'T', '†', 'ˇ'], 'T'); - verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', '¨'], 'U'); - verifyEntry(mapping, 'KeyV', ['v', 'V', '√', '◊'], 'V'); - verifyEntry(mapping, 'KeyW', ['w', 'W', '∑', '„'], 'W'); - verifyEntry(mapping, 'KeyX', ['x', 'X', '≈', '˛'], 'X'); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '¥', 'Á'], 'Y'); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'Ω', '¸'], 'Z'); + verifyEntry(mapping, 'Digit0', [r'0', r')', r'º', r'‚'], '0'); + verifyEntry(mapping, 'Digit1', [r'1', r'!', r'¡', r'⁄'], '1'); + verifyEntry(mapping, 'Digit2', [r'2', r'@', r'™', r'€'], '2'); + verifyEntry(mapping, 'Digit3', [r'3', r'#', r'£', r'‹'], '3'); + verifyEntry(mapping, 'Digit4', [r'4', r'$', r'¢', r'›'], '4'); + verifyEntry(mapping, 'Digit5', [r'5', r'%', r'∞', r'fi'], '5'); + verifyEntry(mapping, 'Digit6', [r'6', r'Dead', r'§', r'fl'], '6'); + verifyEntry(mapping, 'Digit7', [r'7', r'&', r'¶', r'‡'], '7'); + verifyEntry(mapping, 'Digit8', [r'8', r'*', r'•', r'°'], '8'); + verifyEntry(mapping, 'Digit9', [r'9', r'(', r'ª', r'·'], '9'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'A'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'∫', r'ı'], 'B'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ç', r'Ç'], 'C'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'∂', r'Î'], 'D'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'Dead', r'´'], 'E'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ƒ', r'Ï'], 'F'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'©', r'˝'], 'G'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'˙', r'Ó'], 'H'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'Dead', r'ˆ'], 'I'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'∆', r'Ô'], 'J'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'˚', r''], 'K'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'¬', r'Ò'], 'L'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r'Â'], 'M'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'Dead', r'˜'], 'N'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'O'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'π', r'∏'], 'P'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'œ', r'Œ'], 'Q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r'‰'], 'R'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r'Í'], 'S'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'†', r'ˇ'], 'T'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'Dead', r'¨'], 'U'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'√', r'◊'], 'V'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'∑', r'„'], 'W'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'≈', r'˛'], 'X'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'¥', r'Á'], 'Y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'Ω', r'¸'], 'Z'); }); group('en-uk', () { - verifyEntry(mapping, 'Digit0', ['0', ')', 'º', '‚'], '0'); - verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '⁄'], '1'); - verifyEntry(mapping, 'Digit2', ['2', '@', '€', '™'], '2'); - verifyEntry(mapping, 'Digit3', ['3', '£', '#', '‹'], '3'); - verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '›'], '4'); - verifyEntry(mapping, 'Digit5', ['5', '%', '∞', 'fi'], '5'); - verifyEntry(mapping, 'Digit6', ['6', '^', '§', 'fl'], '6'); - verifyEntry(mapping, 'Digit7', ['7', '&', '¶', '‡'], '7'); - verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], '8'); - verifyEntry(mapping, 'Digit9', ['9', '(', 'ª', '·'], '9'); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 'A'); - verifyEntry(mapping, 'KeyB', ['b', 'B', '∫', 'ı'], 'B'); - verifyEntry(mapping, 'KeyC', ['c', 'C', 'ç', 'Ç'], 'C'); - verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', 'Î'], 'D'); - verifyEntry(mapping, 'KeyE', ['e', 'E', 'Dead', '‰'], 'E'); - verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', 'Ï'], 'F'); - verifyEntry(mapping, 'KeyG', ['g', 'G', '©', 'Ì'], 'G'); - verifyEntry(mapping, 'KeyH', ['h', 'H', '˙', 'Ó'], 'H'); - verifyEntry(mapping, 'KeyI', ['i', 'I', 'Dead', 'È'], 'I'); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '∆', 'Ô'], 'J'); - verifyEntry(mapping, 'KeyK', ['k', 'K', '˚', ''], 'K'); - verifyEntry(mapping, 'KeyL', ['l', 'L', '¬', 'Ò'], 'L'); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', '˜'], 'M'); - verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', 'ˆ'], 'N'); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 'O'); - verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 'P'); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'œ', 'Œ'], 'Q'); - verifyEntry(mapping, 'KeyR', ['r', 'R', '®', 'Â'], 'R'); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', 'Í'], 'S'); - verifyEntry(mapping, 'KeyT', ['t', 'T', '†', 'Ê'], 'T'); - verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', 'Ë'], 'U'); - verifyEntry(mapping, 'KeyV', ['v', 'V', '√', '◊'], 'V'); - verifyEntry(mapping, 'KeyW', ['w', 'W', '∑', '„'], 'W'); - verifyEntry(mapping, 'KeyX', ['x', 'X', '≈', 'Ù'], 'X'); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '¥', 'Á'], 'Y'); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'Ω', 'Û'], 'Z'); + verifyEntry(mapping, 'Digit0', [r'0', r')', r'º', r'‚'], '0'); + verifyEntry(mapping, 'Digit1', [r'1', r'!', r'¡', r'⁄'], '1'); + verifyEntry(mapping, 'Digit2', [r'2', r'@', r'€', r'™'], '2'); + verifyEntry(mapping, 'Digit3', [r'3', r'£', r'#', r'‹'], '3'); + verifyEntry(mapping, 'Digit4', [r'4', r'$', r'¢', r'›'], '4'); + verifyEntry(mapping, 'Digit5', [r'5', r'%', r'∞', r'fi'], '5'); + verifyEntry(mapping, 'Digit6', [r'6', r'^', r'§', r'fl'], '6'); + verifyEntry(mapping, 'Digit7', [r'7', r'&', r'¶', r'‡'], '7'); + verifyEntry(mapping, 'Digit8', [r'8', r'*', r'•', r'°'], '8'); + verifyEntry(mapping, 'Digit9', [r'9', r'(', r'ª', r'·'], '9'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'A'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'∫', r'ı'], 'B'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ç', r'Ç'], 'C'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'∂', r'Î'], 'D'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'Dead', r'‰'], 'E'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ƒ', r'Ï'], 'F'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'©', r'Ì'], 'G'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'˙', r'Ó'], 'H'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'Dead', r'È'], 'I'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'∆', r'Ô'], 'J'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'˚', r''], 'K'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'¬', r'Ò'], 'L'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r'˜'], 'M'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'Dead', r'ˆ'], 'N'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'O'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'π', r'∏'], 'P'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'œ', r'Œ'], 'Q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r'Â'], 'R'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r'Í'], 'S'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'†', r'Ê'], 'T'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'Dead', r'Ë'], 'U'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'√', r'◊'], 'V'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'∑', r'„'], 'W'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'≈', r'Ù'], 'X'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'¥', r'Á'], 'Y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'Ω', r'Û'], 'Z'); }); group('es', () { - verifyEntry(mapping, 'Digit0', ['0', '=', '≠', '≈'], '0'); - verifyEntry(mapping, 'Digit1', ['1', '!', '|', 'ı'], '1'); - verifyEntry(mapping, 'Digit2', ['2', '"', '@', '˝'], '2'); - verifyEntry(mapping, 'Digit3', ['3', '·', '#', '•'], '3'); - verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '£'], '4'); - verifyEntry(mapping, 'Digit5', ['5', '%', '∞', '‰'], '5'); - verifyEntry(mapping, 'Digit6', ['6', '&', '¬', ' '], '6'); - verifyEntry(mapping, 'Digit7', ['7', '/', '÷', '⁄'], '7'); - verifyEntry(mapping, 'Digit8', ['8', '(', '“', '‘'], '8'); - verifyEntry(mapping, 'Digit9', ['9', ')', '”', '’'], '9'); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 'A'); - verifyEntry(mapping, 'KeyB', ['b', 'B', 'ß', ''], 'B'); - verifyEntry(mapping, 'KeyC', ['c', 'C', '©', ' '], 'C'); - verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', '∆'], 'D'); - verifyEntry(mapping, 'KeyE', ['e', 'E', '€', '€'], 'E'); - verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', 'fi'], 'F'); - verifyEntry(mapping, 'KeyG', ['g', 'G', '', 'fl'], 'G'); - verifyEntry(mapping, 'KeyH', ['h', 'H', '™', ' '], 'H'); - verifyEntry(mapping, 'KeyI', ['i', 'I', ' ', ' '], 'I'); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '¶', '¯'], 'J'); - verifyEntry(mapping, 'KeyK', ['k', 'K', '§', 'ˇ'], 'K'); - verifyEntry(mapping, 'KeyL', ['l', 'L', ' ', '˘'], 'L'); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', '˚'], 'M'); - verifyEntry(mapping, 'KeyN', ['n', 'N', ' ', '˙'], 'N'); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 'O'); - verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 'P'); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'œ', 'Œ'], 'Q'); - verifyEntry(mapping, 'KeyR', ['r', 'R', '®', ' '], 'R'); - verifyEntry(mapping, 'KeyS', ['s', 'S', '∫', ' '], 'S'); - verifyEntry(mapping, 'KeyT', ['t', 'T', '†', '‡'], 'T'); - verifyEntry(mapping, 'KeyU', ['u', 'U', ' ', ' '], 'U'); - verifyEntry(mapping, 'KeyV', ['v', 'V', '√', '◊'], 'V'); - verifyEntry(mapping, 'KeyW', ['w', 'W', 'æ', 'Æ'], 'W'); - verifyEntry(mapping, 'KeyX', ['x', 'X', '∑', '›'], 'X'); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '¥', ' '], 'Y'); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'Ω', '‹'], 'Z'); + verifyEntry(mapping, 'Digit0', [r'0', r'=', r'≠', r'≈'], '0'); + verifyEntry(mapping, 'Digit1', [r'1', r'!', r'|', r'ı'], '1'); + verifyEntry(mapping, 'Digit2', [r'2', r'"', r'@', r'˝'], '2'); + verifyEntry(mapping, 'Digit3', [r'3', r'·', r'#', r'•'], '3'); + verifyEntry(mapping, 'Digit4', [r'4', r'$', r'¢', r'£'], '4'); + verifyEntry(mapping, 'Digit5', [r'5', r'%', r'∞', r'‰'], '5'); + verifyEntry(mapping, 'Digit6', [r'6', r'&', r'¬', r' '], '6'); + verifyEntry(mapping, 'Digit7', [r'7', r'/', r'÷', r'⁄'], '7'); + verifyEntry(mapping, 'Digit8', [r'8', r'(', r'“', r'‘'], '8'); + verifyEntry(mapping, 'Digit9', [r'9', r')', r'”', r'’'], '9'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'A'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'ß', r''], 'B'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'©', r' '], 'C'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'∂', r'∆'], 'D'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r'€'], 'E'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ƒ', r'fi'], 'F'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r'fl'], 'G'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'™', r' '], 'H'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r' ', r' '], 'I'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'¶', r'¯'], 'J'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'§', r'ˇ'], 'K'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r' ', r'˘'], 'L'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r'˚'], 'M'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r' ', r'˙'], 'N'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'O'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'π', r'∏'], 'P'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'œ', r'Œ'], 'Q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r' '], 'R'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'∫', r' '], 'S'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'†', r'‡'], 'T'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r' ', r' '], 'U'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'√', r'◊'], 'V'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'æ', r'Æ'], 'W'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'∑', r'›'], 'X'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'¥', r' '], 'Y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'Ω', r'‹'], 'Z'); }); group('fr', () { - verifyEntry(mapping, 'Digit0', ['à', '0', 'ø', 'Ø'], '0'); - verifyEntry(mapping, 'Digit1', ['&', '1', '', 'Dead'], '1'); - verifyEntry(mapping, 'Digit2', ['é', '2', 'ë', '„'], '2'); - verifyEntry(mapping, 'Digit3', ['"', '3', '“', '”'], '3'); - verifyEntry(mapping, 'Digit4', ["'", '4', '‘', '’'], '4'); - verifyEntry(mapping, 'Digit5', ['(', '5', '{', '['], '5'); - verifyEntry(mapping, 'Digit6', ['§', '6', '¶', 'å'], '6'); - verifyEntry(mapping, 'Digit7', ['è', '7', '«', '»'], '7'); - verifyEntry(mapping, 'Digit8', ['!', '8', '¡', 'Û'], '8'); - verifyEntry(mapping, 'Digit9', ['ç', '9', 'Ç', 'Á'], '9'); - verifyEntry(mapping, 'KeyA', ['q', 'Q', '‡', 'Ω'], 'Q'); - verifyEntry(mapping, 'KeyB', ['b', 'B', 'ß', '∫'], 'B'); - verifyEntry(mapping, 'KeyC', ['c', 'C', '©', '¢'], 'C'); - verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', '∆'], 'D'); - verifyEntry(mapping, 'KeyE', ['e', 'E', 'ê', 'Ê'], 'E'); - verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', '·'], 'F'); - verifyEntry(mapping, 'KeyG', ['g', 'G', 'fi', 'fl'], 'G'); - verifyEntry(mapping, 'KeyH', ['h', 'H', 'Ì', 'Î'], 'H'); - verifyEntry(mapping, 'KeyI', ['i', 'I', 'î', 'ï'], 'I'); - verifyEntry(mapping, 'KeyJ', ['j', 'J', 'Ï', 'Í'], 'J'); - verifyEntry(mapping, 'KeyK', ['k', 'K', 'È', 'Ë'], 'K'); - verifyEntry(mapping, 'KeyL', ['l', 'L', '¬', '|'], 'L'); - verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', 'ı'], 'N'); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'œ', 'Œ'], 'O'); - verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 'P'); - verifyEntry(mapping, 'KeyQ', ['a', 'A', 'æ', 'Æ'], 'A'); - verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '‚'], 'R'); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'Ò', '∑'], 'S'); - verifyEntry(mapping, 'KeyT', ['t', 'T', '†', '™'], 'T'); - verifyEntry(mapping, 'KeyU', ['u', 'U', 'º', 'ª'], 'U'); - verifyEntry(mapping, 'KeyV', ['v', 'V', '◊', '√'], 'V'); - verifyEntry(mapping, 'KeyW', ['z', 'Z', 'Â', 'Å'], 'Z'); - verifyEntry(mapping, 'KeyX', ['x', 'X', '≈', '⁄'], 'X'); - verifyEntry(mapping, 'KeyY', ['y', 'Y', 'Ú', 'Ÿ'], 'Y'); - verifyEntry(mapping, 'KeyZ', ['w', 'W', '‹', '›'], 'W'); - verifyEntry(mapping, 'Semicolon', ['m', 'M', 'µ', 'Ó'], 'M'); + verifyEntry(mapping, 'Digit0', [r'à', r'0', r'ø', r'Ø'], '0'); + verifyEntry(mapping, 'Digit1', [r'&', r'1', r'', r'Dead'], '1'); + verifyEntry(mapping, 'Digit2', [r'é', r'2', r'ë', r'„'], '2'); + verifyEntry(mapping, 'Digit3', [r'"', r'3', r'“', r'”'], '3'); + verifyEntry(mapping, 'Digit4', [r"'", r'4', r'‘', r'’'], '4'); + verifyEntry(mapping, 'Digit5', [r'(', r'5', r'{', r'['], '5'); + verifyEntry(mapping, 'Digit6', [r'§', r'6', r'¶', r'å'], '6'); + verifyEntry(mapping, 'Digit7', [r'è', r'7', r'«', r'»'], '7'); + verifyEntry(mapping, 'Digit8', [r'!', r'8', r'¡', r'Û'], '8'); + verifyEntry(mapping, 'Digit9', [r'ç', r'9', r'Ç', r'Á'], '9'); + verifyEntry(mapping, 'KeyA', [r'q', r'Q', r'‡', r'Ω'], 'Q'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'ß', r'∫'], 'B'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'©', r'¢'], 'C'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'∂', r'∆'], 'D'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'ê', r'Ê'], 'E'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ƒ', r'·'], 'F'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'fi', r'fl'], 'G'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'Ì', r'Î'], 'H'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'î', r'ï'], 'I'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'Ï', r'Í'], 'J'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'È', r'Ë'], 'K'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'¬', r'|'], 'L'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'Dead', r'ı'], 'N'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'œ', r'Œ'], 'O'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'π', r'∏'], 'P'); + verifyEntry(mapping, 'KeyQ', [r'a', r'A', r'æ', r'Æ'], 'A'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r'‚'], 'R'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'Ò', r'∑'], 'S'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'†', r'™'], 'T'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'º', r'ª'], 'U'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'◊', r'√'], 'V'); + verifyEntry(mapping, 'KeyW', [r'z', r'Z', r'Â', r'Å'], 'Z'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'≈', r'⁄'], 'X'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'Ú', r'Ÿ'], 'Y'); + verifyEntry(mapping, 'KeyZ', [r'w', r'W', r'‹', r'›'], 'W'); + verifyEntry(mapping, 'Semicolon', [r'm', r'M', r'µ', r'Ó'], 'M'); }); group('it', () { - verifyEntry(mapping, 'Digit0', ['0', '=', '≠', '≈'], '0'); - verifyEntry(mapping, 'Digit1', ['1', '!', '«', '»'], '1'); - verifyEntry(mapping, 'Digit2', ['2', '"', '“', '”'], '2'); - verifyEntry(mapping, 'Digit3', ['3', '£', '‘', '’'], '3'); - verifyEntry(mapping, 'Digit4', ['4', r'$', '¥', '¢'], '4'); - verifyEntry(mapping, 'Digit5', ['5', '%', '~', '‰'], '5'); - verifyEntry(mapping, 'Digit6', ['6', '&', '‹', '›'], '6'); - verifyEntry(mapping, 'Digit7', ['7', '/', '÷', '⁄'], '7'); - verifyEntry(mapping, 'Digit8', ['8', '(', 'Dead', ''], '8'); - verifyEntry(mapping, 'Digit9', ['9', ')', 'Dead', ' '], '9'); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 'A'); - verifyEntry(mapping, 'KeyB', ['b', 'B', '∫', 'Í'], 'B'); - verifyEntry(mapping, 'KeyC', ['c', 'C', '©', 'Á'], 'C'); - verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', '˘'], 'D'); - verifyEntry(mapping, 'KeyE', ['e', 'E', '€', 'È'], 'E'); - verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', '˙'], 'F'); - verifyEntry(mapping, 'KeyG', ['g', 'G', '∞', '˚'], 'G'); - verifyEntry(mapping, 'KeyH', ['h', 'H', '∆', '¸'], 'H'); - verifyEntry(mapping, 'KeyI', ['i', 'I', 'œ', 'Œ'], 'I'); - verifyEntry(mapping, 'KeyJ', ['j', 'J', 'ª', '˝'], 'J'); - verifyEntry(mapping, 'KeyK', ['k', 'K', 'º', '˛'], 'K'); - verifyEntry(mapping, 'KeyL', ['l', 'L', '¬', 'ˇ'], 'L'); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', 'Ú'], 'M'); - verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', 'Ó'], 'N'); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 'O'); - verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 'P'); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', '„', '‚'], 'Q'); - verifyEntry(mapping, 'KeyR', ['r', 'R', '®', 'Ì'], 'R'); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', '¯'], 'S'); - verifyEntry(mapping, 'KeyT', ['t', 'T', '™', 'Ò'], 'T'); - verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', 'Ù'], 'U'); - verifyEntry(mapping, 'KeyV', ['v', 'V', '√', 'É'], 'V'); - verifyEntry(mapping, 'KeyW', ['w', 'W', 'Ω', 'À'], 'W'); - verifyEntry(mapping, 'KeyX', ['x', 'X', '†', '‡'], 'X'); - verifyEntry(mapping, 'KeyY', ['y', 'Y', 'æ', 'Æ'], 'Y'); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', '∑', ' '], 'Z'); + verifyEntry(mapping, 'Digit0', [r'0', r'=', r'≠', r'≈'], '0'); + verifyEntry(mapping, 'Digit1', [r'1', r'!', r'«', r'»'], '1'); + verifyEntry(mapping, 'Digit2', [r'2', r'"', r'“', r'”'], '2'); + verifyEntry(mapping, 'Digit3', [r'3', r'£', r'‘', r'’'], '3'); + verifyEntry(mapping, 'Digit4', [r'4', r'$', r'¥', r'¢'], '4'); + verifyEntry(mapping, 'Digit5', [r'5', r'%', r'~', r'‰'], '5'); + verifyEntry(mapping, 'Digit6', [r'6', r'&', r'‹', r'›'], '6'); + verifyEntry(mapping, 'Digit7', [r'7', r'/', r'÷', r'⁄'], '7'); + verifyEntry(mapping, 'Digit8', [r'8', r'(', r'Dead', r''], '8'); + verifyEntry(mapping, 'Digit9', [r'9', r')', r'Dead', r' '], '9'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'A'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'∫', r'Í'], 'B'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'©', r'Á'], 'C'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'∂', r'˘'], 'D'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r'È'], 'E'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ƒ', r'˙'], 'F'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'∞', r'˚'], 'G'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'∆', r'¸'], 'H'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'œ', r'Œ'], 'I'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'ª', r'˝'], 'J'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'º', r'˛'], 'K'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'¬', r'ˇ'], 'L'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r'Ú'], 'M'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'Dead', r'Ó'], 'N'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'O'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'π', r'∏'], 'P'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'„', r'‚'], 'Q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r'Ì'], 'R'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r'¯'], 'S'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'™', r'Ò'], 'T'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'Dead', r'Ù'], 'U'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'√', r'É'], 'V'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'Ω', r'À'], 'W'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'†', r'‡'], 'X'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'æ', r'Æ'], 'Y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'∑', r' '], 'Z'); }); group('jp', () { - verifyEntry(mapping, 'Digit0', ['0', ')', 'º', '‚'], '0'); - verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '⁄'], '1'); - verifyEntry(mapping, 'Digit2', ['2', '@', '™', '€'], '2'); - verifyEntry(mapping, 'Digit3', ['3', '#', '£', '‹'], '3'); - verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '›'], '4'); - verifyEntry(mapping, 'Digit5', ['5', '%', '∞', 'fi'], '5'); - verifyEntry(mapping, 'Digit6', ['6', '^', '§', 'fl'], '6'); - verifyEntry(mapping, 'Digit7', ['7', '&', '¶', '‡'], '7'); - verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], '8'); - verifyEntry(mapping, 'Digit9', ['9', '(', 'ª', '·'], '9'); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 'A'); - verifyEntry(mapping, 'KeyB', ['b', 'B', '∫', 'ı'], 'B'); - verifyEntry(mapping, 'KeyC', ['c', 'C', 'ç', 'Ç'], 'C'); - verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', 'Î'], 'D'); - verifyEntry(mapping, 'KeyE', ['e', 'E', 'Dead', '´'], 'E'); - verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', 'Ï'], 'F'); - verifyEntry(mapping, 'KeyG', ['g', 'G', '©', '˝'], 'G'); - verifyEntry(mapping, 'KeyH', ['h', 'H', '˙', 'Ó'], 'H'); - verifyEntry(mapping, 'KeyI', ['i', 'I', 'Dead', 'ˆ'], 'I'); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '∆', 'Ô'], 'J'); - verifyEntry(mapping, 'KeyK', ['k', 'K', '˚', ''], 'K'); - verifyEntry(mapping, 'KeyL', ['l', 'L', '¬', 'Ò'], 'L'); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', 'Â'], 'M'); - verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', '˜'], 'N'); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 'O'); - verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 'P'); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'œ', 'Œ'], 'Q'); - verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '‰'], 'R'); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', 'Í'], 'S'); - verifyEntry(mapping, 'KeyT', ['t', 'T', '†', 'ˇ'], 'T'); - verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', '¨'], 'U'); - verifyEntry(mapping, 'KeyV', ['v', 'V', '√', '◊'], 'V'); - verifyEntry(mapping, 'KeyW', ['w', 'W', '∑', '„'], 'W'); - verifyEntry(mapping, 'KeyX', ['x', 'X', '≈', '˛'], 'X'); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '¥', 'Á'], 'Y'); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'Ω', '¸'], 'Z'); + verifyEntry(mapping, 'Digit0', [r'0', r')', r'º', r'‚'], '0'); + verifyEntry(mapping, 'Digit1', [r'1', r'!', r'¡', r'⁄'], '1'); + verifyEntry(mapping, 'Digit2', [r'2', r'@', r'™', r'€'], '2'); + verifyEntry(mapping, 'Digit3', [r'3', r'#', r'£', r'‹'], '3'); + verifyEntry(mapping, 'Digit4', [r'4', r'$', r'¢', r'›'], '4'); + verifyEntry(mapping, 'Digit5', [r'5', r'%', r'∞', r'fi'], '5'); + verifyEntry(mapping, 'Digit6', [r'6', r'^', r'§', r'fl'], '6'); + verifyEntry(mapping, 'Digit7', [r'7', r'&', r'¶', r'‡'], '7'); + verifyEntry(mapping, 'Digit8', [r'8', r'*', r'•', r'°'], '8'); + verifyEntry(mapping, 'Digit9', [r'9', r'(', r'ª', r'·'], '9'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'A'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'∫', r'ı'], 'B'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ç', r'Ç'], 'C'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'∂', r'Î'], 'D'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'Dead', r'´'], 'E'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ƒ', r'Ï'], 'F'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'©', r'˝'], 'G'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'˙', r'Ó'], 'H'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'Dead', r'ˆ'], 'I'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'∆', r'Ô'], 'J'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'˚', r''], 'K'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'¬', r'Ò'], 'L'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r'Â'], 'M'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'Dead', r'˜'], 'N'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'O'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'π', r'∏'], 'P'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'œ', r'Œ'], 'Q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r'‰'], 'R'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r'Í'], 'S'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'†', r'ˇ'], 'T'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'Dead', r'¨'], 'U'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'√', r'◊'], 'V'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'∑', r'„'], 'W'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'≈', r'˛'], 'X'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'¥', r'Á'], 'Y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'Ω', r'¸'], 'Z'); }); group('jp-roman', () { - verifyEntry(mapping, 'Digit0', ['0', ')', 'º', '‚'], '0'); - verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '⁄'], '1'); - verifyEntry(mapping, 'Digit2', ['2', '@', '™', '€'], '2'); - verifyEntry(mapping, 'Digit3', ['3', '#', '£', '‹'], '3'); - verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '›'], '4'); - verifyEntry(mapping, 'Digit5', ['5', '%', '§', '†'], '5'); - verifyEntry(mapping, 'Digit6', ['6', '^', 'Dead', '̂'], '6'); - verifyEntry(mapping, 'Digit7', ['7', '&', '¶', '‡'], '7'); - verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], '8'); - verifyEntry(mapping, 'Digit9', ['9', '(', 'ª', '·'], '9'); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'Dead', '̄'], 'A'); - verifyEntry(mapping, 'KeyB', ['b', 'B', 'Dead', '̆'], 'B'); - verifyEntry(mapping, 'KeyC', ['c', 'C', 'Dead', '̧'], 'C'); - verifyEntry(mapping, 'KeyD', ['d', 'D', 'ð', 'Ð'], 'D'); - verifyEntry(mapping, 'KeyE', ['e', 'E', 'Dead', '́'], 'E'); - verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', ''], 'F'); - verifyEntry(mapping, 'KeyG', ['g', 'G', '©', 'Dead'], 'G'); - verifyEntry(mapping, 'KeyH', ['h', 'H', 'Dead', '̱'], 'H'); - verifyEntry(mapping, 'KeyI', ['i', 'I', 'Dead', '̛'], 'I'); - verifyEntry(mapping, 'KeyJ', ['j', 'J', 'Dead', '̋'], 'J'); - verifyEntry(mapping, 'KeyK', ['k', 'K', 'Dead', '̊'], 'K'); - verifyEntry(mapping, 'KeyL', ['l', 'L', 'Dead', '̵'], 'L'); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'Dead', '̨'], 'M'); - verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', '̃'], 'N'); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 'O'); - verifyEntry(mapping, 'KeyP', ['p', 'P', 'Dead', '̦'], 'P'); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'œ', 'Œ'], 'Q'); - verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '‰'], 'R'); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', ''], 'S'); - verifyEntry(mapping, 'KeyT', ['t', 'T', 'þ', 'Þ'], 'T'); - verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', '̈'], 'U'); - verifyEntry(mapping, 'KeyV', ['v', 'V', 'Dead', '̌'], 'V'); - verifyEntry(mapping, 'KeyW', ['w', 'W', 'Dead', '̇'], 'W'); - verifyEntry(mapping, 'KeyX', ['x', 'X', 'Dead', '̣'], 'X'); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '¥', ''], 'Y'); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'Dead', '̉'], 'Z'); + verifyEntry(mapping, 'Digit0', [r'0', r')', r'º', r'‚'], '0'); + verifyEntry(mapping, 'Digit1', [r'1', r'!', r'¡', r'⁄'], '1'); + verifyEntry(mapping, 'Digit2', [r'2', r'@', r'™', r'€'], '2'); + verifyEntry(mapping, 'Digit3', [r'3', r'#', r'£', r'‹'], '3'); + verifyEntry(mapping, 'Digit4', [r'4', r'$', r'¢', r'›'], '4'); + verifyEntry(mapping, 'Digit5', [r'5', r'%', r'§', r'†'], '5'); + verifyEntry(mapping, 'Digit6', [r'6', r'^', r'Dead', r'̂'], '6'); + verifyEntry(mapping, 'Digit7', [r'7', r'&', r'¶', r'‡'], '7'); + verifyEntry(mapping, 'Digit8', [r'8', r'*', r'•', r'°'], '8'); + verifyEntry(mapping, 'Digit9', [r'9', r'(', r'ª', r'·'], '9'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'Dead', r'̄'], 'A'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'Dead', r'̆'], 'B'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'Dead', r'̧'], 'C'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'ð', r'Ð'], 'D'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'Dead', r'́'], 'E'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ƒ', r''], 'F'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'©', r'Dead'], 'G'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'Dead', r'̱'], 'H'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'Dead', r'̛'], 'I'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'Dead', r'̋'], 'J'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'Dead', r'̊'], 'K'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'Dead', r'̵'], 'L'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'Dead', r'̨'], 'M'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'Dead', r'̃'], 'N'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'O'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'Dead', r'̦'], 'P'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'œ', r'Œ'], 'Q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r'‰'], 'R'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r''], 'S'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'þ', r'Þ'], 'T'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'Dead', r'̈'], 'U'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'Dead', r'̌'], 'V'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'Dead', r'̇'], 'W'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'Dead', r'̣'], 'X'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'¥', r''], 'Y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'Dead', r'̉'], 'Z'); }); group('ko', () { - verifyEntry(mapping, 'Digit0', ['0', ')', '0', ')'], '0'); - verifyEntry(mapping, 'Digit1', ['1', '!', '1', '!'], '1'); - verifyEntry(mapping, 'Digit2', ['2', '@', '2', '@'], '2'); - verifyEntry(mapping, 'Digit3', ['3', '#', '3', '#'], '3'); - verifyEntry(mapping, 'Digit4', ['4', r'$', '4', r'$'], '4'); - verifyEntry(mapping, 'Digit5', ['5', '%', '5', '%'], '5'); - verifyEntry(mapping, 'Digit6', ['6', '^', '6', '^'], '6'); - verifyEntry(mapping, 'Digit7', ['7', '&', '7', '&'], '7'); - verifyEntry(mapping, 'Digit8', ['8', '*', '8', '*'], '8'); - verifyEntry(mapping, 'Digit9', ['9', '(', '9', '('], '9'); - verifyEntry(mapping, 'KeyA', ['ㅁ', 'ㅁ', 'a', 'A'], 'A'); - verifyEntry(mapping, 'KeyB', ['ㅠ', 'ㅠ', 'b', 'B'], 'B'); - verifyEntry(mapping, 'KeyC', ['ㅊ', 'ㅊ', 'c', 'C'], 'C'); - verifyEntry(mapping, 'KeyD', ['ㅇ', 'ㅇ', 'd', 'D'], 'D'); - verifyEntry(mapping, 'KeyE', ['ㄷ', 'ㄸ', 'e', 'E'], 'E'); - verifyEntry(mapping, 'KeyF', ['ㄹ', 'ㄹ', 'f', 'F'], 'F'); - verifyEntry(mapping, 'KeyG', ['ㅎ', 'ㅎ', 'g', 'G'], 'G'); - verifyEntry(mapping, 'KeyH', ['ㅗ', 'ㅗ', 'h', 'H'], 'H'); - verifyEntry(mapping, 'KeyI', ['ㅑ', 'ㅑ', 'i', 'I'], 'I'); - verifyEntry(mapping, 'KeyJ', ['ㅓ', 'ㅓ', 'j', 'J'], 'J'); - verifyEntry(mapping, 'KeyK', ['ㅏ', 'ㅏ', 'k', 'K'], 'K'); - verifyEntry(mapping, 'KeyL', ['ㅣ', 'ㅣ', 'l', 'L'], 'L'); - verifyEntry(mapping, 'KeyM', ['ㅡ', 'ㅡ', 'm', 'M'], 'M'); - verifyEntry(mapping, 'KeyN', ['ㅜ', 'ㅜ', 'n', 'N'], 'N'); - verifyEntry(mapping, 'KeyO', ['ㅐ', 'ㅒ', 'o', 'O'], 'O'); - verifyEntry(mapping, 'KeyP', ['ㅔ', 'ㅖ', 'p', 'P'], 'P'); - verifyEntry(mapping, 'KeyQ', ['ㅂ', 'ㅃ', 'q', 'Q'], 'Q'); - verifyEntry(mapping, 'KeyR', ['ㄱ', 'ㄲ', 'r', 'R'], 'R'); - verifyEntry(mapping, 'KeyS', ['ㄴ', 'ㄴ', 's', 'S'], 'S'); - verifyEntry(mapping, 'KeyT', ['ㅅ', 'ㅆ', 't', 'T'], 'T'); - verifyEntry(mapping, 'KeyU', ['ㅕ', 'ㅕ', 'u', 'U'], 'U'); - verifyEntry(mapping, 'KeyV', ['ㅍ', 'ㅍ', 'v', 'V'], 'V'); - verifyEntry(mapping, 'KeyW', ['ㅈ', 'ㅉ', 'w', 'W'], 'W'); - verifyEntry(mapping, 'KeyX', ['ㅌ', 'ㅌ', 'x', 'X'], 'X'); - verifyEntry(mapping, 'KeyY', ['ㅛ', 'ㅛ', 'y', 'Y'], 'Y'); - verifyEntry(mapping, 'KeyZ', ['ㅋ', 'ㅋ', 'z', 'Z'], 'Z'); + verifyEntry(mapping, 'Digit0', [r'0', r')', r'0', r')'], '0'); + verifyEntry(mapping, 'Digit1', [r'1', r'!', r'1', r'!'], '1'); + verifyEntry(mapping, 'Digit2', [r'2', r'@', r'2', r'@'], '2'); + verifyEntry(mapping, 'Digit3', [r'3', r'#', r'3', r'#'], '3'); + verifyEntry(mapping, 'Digit4', [r'4', r'$', r'4', r'$'], '4'); + verifyEntry(mapping, 'Digit5', [r'5', r'%', r'5', r'%'], '5'); + verifyEntry(mapping, 'Digit6', [r'6', r'^', r'6', r'^'], '6'); + verifyEntry(mapping, 'Digit7', [r'7', r'&', r'7', r'&'], '7'); + verifyEntry(mapping, 'Digit8', [r'8', r'*', r'8', r'*'], '8'); + verifyEntry(mapping, 'Digit9', [r'9', r'(', r'9', r'('], '9'); + verifyEntry(mapping, 'KeyA', [r'ㅁ', r'ㅁ', r'a', r'A'], 'A'); + verifyEntry(mapping, 'KeyB', [r'ㅠ', r'ㅠ', r'b', r'B'], 'B'); + verifyEntry(mapping, 'KeyC', [r'ㅊ', r'ㅊ', r'c', r'C'], 'C'); + verifyEntry(mapping, 'KeyD', [r'ㅇ', r'ㅇ', r'd', r'D'], 'D'); + verifyEntry(mapping, 'KeyE', [r'ㄷ', r'ㄸ', r'e', r'E'], 'E'); + verifyEntry(mapping, 'KeyF', [r'ㄹ', r'ㄹ', r'f', r'F'], 'F'); + verifyEntry(mapping, 'KeyG', [r'ㅎ', r'ㅎ', r'g', r'G'], 'G'); + verifyEntry(mapping, 'KeyH', [r'ㅗ', r'ㅗ', r'h', r'H'], 'H'); + verifyEntry(mapping, 'KeyI', [r'ㅑ', r'ㅑ', r'i', r'I'], 'I'); + verifyEntry(mapping, 'KeyJ', [r'ㅓ', r'ㅓ', r'j', r'J'], 'J'); + verifyEntry(mapping, 'KeyK', [r'ㅏ', r'ㅏ', r'k', r'K'], 'K'); + verifyEntry(mapping, 'KeyL', [r'ㅣ', r'ㅣ', r'l', r'L'], 'L'); + verifyEntry(mapping, 'KeyM', [r'ㅡ', r'ㅡ', r'm', r'M'], 'M'); + verifyEntry(mapping, 'KeyN', [r'ㅜ', r'ㅜ', r'n', r'N'], 'N'); + verifyEntry(mapping, 'KeyO', [r'ㅐ', r'ㅒ', r'o', r'O'], 'O'); + verifyEntry(mapping, 'KeyP', [r'ㅔ', r'ㅖ', r'p', r'P'], 'P'); + verifyEntry(mapping, 'KeyQ', [r'ㅂ', r'ㅃ', r'q', r'Q'], 'Q'); + verifyEntry(mapping, 'KeyR', [r'ㄱ', r'ㄲ', r'r', r'R'], 'R'); + verifyEntry(mapping, 'KeyS', [r'ㄴ', r'ㄴ', r's', r'S'], 'S'); + verifyEntry(mapping, 'KeyT', [r'ㅅ', r'ㅆ', r't', r'T'], 'T'); + verifyEntry(mapping, 'KeyU', [r'ㅕ', r'ㅕ', r'u', r'U'], 'U'); + verifyEntry(mapping, 'KeyV', [r'ㅍ', r'ㅍ', r'v', r'V'], 'V'); + verifyEntry(mapping, 'KeyW', [r'ㅈ', r'ㅉ', r'w', r'W'], 'W'); + verifyEntry(mapping, 'KeyX', [r'ㅌ', r'ㅌ', r'x', r'X'], 'X'); + verifyEntry(mapping, 'KeyY', [r'ㅛ', r'ㅛ', r'y', r'Y'], 'Y'); + verifyEntry(mapping, 'KeyZ', [r'ㅋ', r'ㅋ', r'z', r'Z'], 'Z'); }); group('pl', () { - verifyEntry(mapping, 'Digit0', ['0', ')', 'ľ', '‚'], '0'); - verifyEntry(mapping, 'Digit1', ['1', '!', 'Ń', 'ŕ'], '1'); - verifyEntry(mapping, 'Digit2', ['2', '@', '™', 'Ř'], '2'); - verifyEntry(mapping, 'Digit3', ['3', '#', '€', '‹'], '3'); - verifyEntry(mapping, 'Digit4', ['4', r'$', 'ß', '›'], '4'); - verifyEntry(mapping, 'Digit5', ['5', '%', 'į', 'ř'], '5'); - verifyEntry(mapping, 'Digit6', ['6', '^', '§', 'Ŗ'], '6'); - verifyEntry(mapping, 'Digit7', ['7', '&', '¶', 'ŗ'], '7'); - verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], '8'); - verifyEntry(mapping, 'Digit9', ['9', '(', 'Ľ', 'Š'], '9'); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'ą', 'Ą'], 'A'); - verifyEntry(mapping, 'KeyB', ['b', 'B', 'ļ', 'ű'], 'B'); - verifyEntry(mapping, 'KeyC', ['c', 'C', 'ć', 'Ć'], 'C'); - verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', 'Ž'], 'D'); - verifyEntry(mapping, 'KeyE', ['e', 'E', 'ę', 'Ę'], 'E'); - verifyEntry(mapping, 'KeyF', ['f', 'F', 'ń', 'ž'], 'F'); - verifyEntry(mapping, 'KeyG', ['g', 'G', '©', 'Ū'], 'G'); - verifyEntry(mapping, 'KeyH', ['h', 'H', 'ķ', 'Ó'], 'H'); - verifyEntry(mapping, 'KeyI', ['i', 'I', 'Dead', 'ť'], 'I'); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '∆', 'Ô'], 'J'); - verifyEntry(mapping, 'KeyK', ['k', 'K', 'Ż', 'ū'], 'K'); - verifyEntry(mapping, 'KeyL', ['l', 'L', 'ł', 'Ł'], 'L'); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'Ķ', 'ų'], 'M'); - verifyEntry(mapping, 'KeyN', ['n', 'N', 'ń', 'Ń'], 'N'); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'ó', 'Ó'], 'O'); - verifyEntry(mapping, 'KeyP', ['p', 'P', 'Ļ', 'ł'], 'P'); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'Ō', 'ő'], 'Q'); - verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '£'], 'R'); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'ś', 'Ś'], 'S'); - verifyEntry(mapping, 'KeyT', ['t', 'T', '†', 'ś'], 'T'); - verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', 'Ť'], 'U'); - verifyEntry(mapping, 'KeyV', ['v', 'V', '√', '◊'], 'V'); - verifyEntry(mapping, 'KeyW', ['w', 'W', '∑', '„'], 'W'); - verifyEntry(mapping, 'KeyX', ['x', 'X', 'ź', 'Ź'], 'X'); - verifyEntry(mapping, 'KeyY', ['y', 'Y', 'ī', 'Á'], 'Y'); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'ż', 'Ż'], 'Z'); + verifyEntry(mapping, 'Digit0', [r'0', r')', r'ľ', r'‚'], '0'); + verifyEntry(mapping, 'Digit1', [r'1', r'!', r'Ń', r'ŕ'], '1'); + verifyEntry(mapping, 'Digit2', [r'2', r'@', r'™', r'Ř'], '2'); + verifyEntry(mapping, 'Digit3', [r'3', r'#', r'€', r'‹'], '3'); + verifyEntry(mapping, 'Digit4', [r'4', r'$', r'ß', r'›'], '4'); + verifyEntry(mapping, 'Digit5', [r'5', r'%', r'į', r'ř'], '5'); + verifyEntry(mapping, 'Digit6', [r'6', r'^', r'§', r'Ŗ'], '6'); + verifyEntry(mapping, 'Digit7', [r'7', r'&', r'¶', r'ŗ'], '7'); + verifyEntry(mapping, 'Digit8', [r'8', r'*', r'•', r'°'], '8'); + verifyEntry(mapping, 'Digit9', [r'9', r'(', r'Ľ', r'Š'], '9'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'ą', r'Ą'], 'A'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'ļ', r'ű'], 'B'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ć', r'Ć'], 'C'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'∂', r'Ž'], 'D'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'ę', r'Ę'], 'E'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ń', r'ž'], 'F'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'©', r'Ū'], 'G'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'ķ', r'Ó'], 'H'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'Dead', r'ť'], 'I'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'∆', r'Ô'], 'J'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'Ż', r'ū'], 'K'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'ł', r'Ł'], 'L'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'Ķ', r'ų'], 'M'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'ń', r'Ń'], 'N'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ó', r'Ó'], 'O'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'Ļ', r'ł'], 'P'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'Ō', r'ő'], 'Q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r'£'], 'R'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'ś', r'Ś'], 'S'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'†', r'ś'], 'T'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'Dead', r'Ť'], 'U'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'√', r'◊'], 'V'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'∑', r'„'], 'W'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'ź', r'Ź'], 'X'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'ī', r'Á'], 'Y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'ż', r'Ż'], 'Z'); }); group('pt', () { - verifyEntry(mapping, 'Digit0', ['0', ')', 'º', '‚'], '0'); - verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '⁄'], '1'); - verifyEntry(mapping, 'Digit2', ['2', '@', '™', '€'], '2'); - verifyEntry(mapping, 'Digit3', ['3', '#', '£', '‹'], '3'); - verifyEntry(mapping, 'Digit4', ['4', r'$', '¢', '›'], '4'); - verifyEntry(mapping, 'Digit5', ['5', '%', '∞', 'fi'], '5'); - verifyEntry(mapping, 'Digit6', ['6', 'Dead', '§', 'fl'], '6'); - verifyEntry(mapping, 'Digit7', ['7', '&', '¶', '‡'], '7'); - verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], '8'); - verifyEntry(mapping, 'Digit9', ['9', '(', 'ª', '·'], '9'); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 'A'); - verifyEntry(mapping, 'KeyB', ['b', 'B', '∫', 'ı'], 'B'); - verifyEntry(mapping, 'KeyC', ['c', 'C', 'ç', 'Ç'], 'C'); - verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', 'Î'], 'D'); - verifyEntry(mapping, 'KeyE', ['e', 'E', 'Dead', '´'], 'E'); - verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', 'Ï'], 'F'); - verifyEntry(mapping, 'KeyG', ['g', 'G', '©', '˝'], 'G'); - verifyEntry(mapping, 'KeyH', ['h', 'H', '˙', 'Ó'], 'H'); - verifyEntry(mapping, 'KeyI', ['i', 'I', 'Dead', 'ˆ'], 'I'); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '∆', 'Ô'], 'J'); - verifyEntry(mapping, 'KeyK', ['k', 'K', '˚', ''], 'K'); - verifyEntry(mapping, 'KeyL', ['l', 'L', '¬', 'Ò'], 'L'); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', 'Â'], 'M'); - verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', '˜'], 'N'); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 'O'); - verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 'P'); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'œ', 'Œ'], 'Q'); - verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '‰'], 'R'); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', 'Í'], 'S'); - verifyEntry(mapping, 'KeyT', ['t', 'T', '†', 'ˇ'], 'T'); - verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', '¨'], 'U'); - verifyEntry(mapping, 'KeyV', ['v', 'V', '√', '◊'], 'V'); - verifyEntry(mapping, 'KeyW', ['w', 'W', '∑', '„'], 'W'); - verifyEntry(mapping, 'KeyX', ['x', 'X', '≈', '˛'], 'X'); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '¥', 'Á'], 'Y'); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'Ω', '¸'], 'Z'); + verifyEntry(mapping, 'Digit0', [r'0', r')', r'º', r'‚'], '0'); + verifyEntry(mapping, 'Digit1', [r'1', r'!', r'¡', r'⁄'], '1'); + verifyEntry(mapping, 'Digit2', [r'2', r'@', r'™', r'€'], '2'); + verifyEntry(mapping, 'Digit3', [r'3', r'#', r'£', r'‹'], '3'); + verifyEntry(mapping, 'Digit4', [r'4', r'$', r'¢', r'›'], '4'); + verifyEntry(mapping, 'Digit5', [r'5', r'%', r'∞', r'fi'], '5'); + verifyEntry(mapping, 'Digit6', [r'6', r'Dead', r'§', r'fl'], '6'); + verifyEntry(mapping, 'Digit7', [r'7', r'&', r'¶', r'‡'], '7'); + verifyEntry(mapping, 'Digit8', [r'8', r'*', r'•', r'°'], '8'); + verifyEntry(mapping, 'Digit9', [r'9', r'(', r'ª', r'·'], '9'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'A'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'∫', r'ı'], 'B'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ç', r'Ç'], 'C'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'∂', r'Î'], 'D'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'Dead', r'´'], 'E'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ƒ', r'Ï'], 'F'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'©', r'˝'], 'G'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'˙', r'Ó'], 'H'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'Dead', r'ˆ'], 'I'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'∆', r'Ô'], 'J'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'˚', r''], 'K'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'¬', r'Ò'], 'L'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r'Â'], 'M'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'Dead', r'˜'], 'N'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'O'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'π', r'∏'], 'P'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'œ', r'Œ'], 'Q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r'‰'], 'R'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r'Í'], 'S'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'†', r'ˇ'], 'T'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'Dead', r'¨'], 'U'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'√', r'◊'], 'V'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'∑', r'„'], 'W'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'≈', r'˛'], 'X'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'¥', r'Á'], 'Y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'Ω', r'¸'], 'Z'); }); group('ru', () { - verifyEntry(mapping, 'Digit0', ['0', ')', '}', '`'], '0'); - verifyEntry(mapping, 'Digit1', ['1', '!', '!', '|'], '1'); - verifyEntry(mapping, 'Digit2', ['2', '"', '@', '"'], '2'); - verifyEntry(mapping, 'Digit3', ['3', '№', '#', '£'], '3'); - verifyEntry(mapping, 'Digit4', ['4', '%', r'$', '€'], '4'); - verifyEntry(mapping, 'Digit5', ['5', ':', '%', '∞'], '5'); - verifyEntry(mapping, 'Digit6', ['6', ',', '^', '¬'], '6'); - verifyEntry(mapping, 'Digit7', ['7', '.', '&', '¶'], '7'); - verifyEntry(mapping, 'Digit8', ['8', ';', '*', '√'], '8'); - verifyEntry(mapping, 'Digit9', ['9', '(', '{', "'"], '9'); - verifyEntry(mapping, 'KeyA', ['ф', 'Ф', 'ƒ', 'ƒ'], 'A'); - verifyEntry(mapping, 'KeyB', ['и', 'И', 'и', 'И'], 'B'); - verifyEntry(mapping, 'KeyC', ['с', 'С', '≠', '≠'], 'C'); - verifyEntry(mapping, 'KeyD', ['в', 'В', 'ћ', 'Ћ'], 'D'); - verifyEntry(mapping, 'KeyE', ['у', 'У', 'ќ', 'Ќ'], 'E'); - verifyEntry(mapping, 'KeyF', ['а', 'А', '÷', '÷'], 'F'); - verifyEntry(mapping, 'KeyG', ['п', 'П', '©', '©'], 'G'); - verifyEntry(mapping, 'KeyH', ['р', 'Р', '₽', '₽'], 'H'); - verifyEntry(mapping, 'KeyI', ['ш', 'Ш', 'ѕ', 'Ѕ'], 'I'); - verifyEntry(mapping, 'KeyJ', ['о', 'О', '°', '•'], 'J'); - verifyEntry(mapping, 'KeyK', ['л', 'Л', 'љ', 'Љ'], 'K'); - verifyEntry(mapping, 'KeyL', ['д', 'Д', '∆', '∆'], 'L'); - verifyEntry(mapping, 'KeyM', ['ь', 'Ь', '~', '~'], 'M'); - verifyEntry(mapping, 'KeyN', ['т', 'Т', '™', '™'], 'N'); - verifyEntry(mapping, 'KeyO', ['щ', 'Щ', 'ў', 'Ў'], 'O'); - verifyEntry(mapping, 'KeyP', ['з', 'З', '‘', '’'], 'P'); - verifyEntry(mapping, 'KeyQ', ['й', 'Й', 'ј', 'Ј'], 'Q'); - verifyEntry(mapping, 'KeyR', ['к', 'К', '®', '®'], 'R'); - verifyEntry(mapping, 'KeyS', ['ы', 'Ы', 'ы', 'Ы'], 'S'); - verifyEntry(mapping, 'KeyT', ['е', 'Е', '†', '†'], 'T'); - verifyEntry(mapping, 'KeyU', ['г', 'Г', 'ѓ', 'Ѓ'], 'U'); - verifyEntry(mapping, 'KeyV', ['м', 'М', 'µ', 'µ'], 'V'); - verifyEntry(mapping, 'KeyW', ['ц', 'Ц', 'џ', 'Џ'], 'W'); - verifyEntry(mapping, 'KeyX', ['ч', 'Ч', '≈', '≈'], 'X'); - verifyEntry(mapping, 'KeyY', ['н', 'Н', 'њ', 'Њ'], 'Y'); - verifyEntry(mapping, 'KeyZ', ['я', 'Я', 'ђ', 'Ђ'], 'Z'); + verifyEntry(mapping, 'Digit0', [r'0', r')', r'}', r'`'], '0'); + verifyEntry(mapping, 'Digit1', [r'1', r'!', r'!', r'|'], '1'); + verifyEntry(mapping, 'Digit2', [r'2', r'"', r'@', r'"'], '2'); + verifyEntry(mapping, 'Digit3', [r'3', r'№', r'#', r'£'], '3'); + verifyEntry(mapping, 'Digit4', [r'4', r'%', r'$', r'€'], '4'); + verifyEntry(mapping, 'Digit5', [r'5', r':', r'%', r'∞'], '5'); + verifyEntry(mapping, 'Digit6', [r'6', r',', r'^', r'¬'], '6'); + verifyEntry(mapping, 'Digit7', [r'7', r'.', r'&', r'¶'], '7'); + verifyEntry(mapping, 'Digit8', [r'8', r';', r'*', r'√'], '8'); + verifyEntry(mapping, 'Digit9', [r'9', r'(', r'{', r"'"], '9'); + verifyEntry(mapping, 'KeyA', [r'ф', r'Ф', r'ƒ', r'ƒ'], 'A'); + verifyEntry(mapping, 'KeyB', [r'и', r'И', r'и', r'И'], 'B'); + verifyEntry(mapping, 'KeyC', [r'с', r'С', r'≠', r'≠'], 'C'); + verifyEntry(mapping, 'KeyD', [r'в', r'В', r'ћ', r'Ћ'], 'D'); + verifyEntry(mapping, 'KeyE', [r'у', r'У', r'ќ', r'Ќ'], 'E'); + verifyEntry(mapping, 'KeyF', [r'а', r'А', r'÷', r'÷'], 'F'); + verifyEntry(mapping, 'KeyG', [r'п', r'П', r'©', r'©'], 'G'); + verifyEntry(mapping, 'KeyH', [r'р', r'Р', r'₽', r'₽'], 'H'); + verifyEntry(mapping, 'KeyI', [r'ш', r'Ш', r'ѕ', r'Ѕ'], 'I'); + verifyEntry(mapping, 'KeyJ', [r'о', r'О', r'°', r'•'], 'J'); + verifyEntry(mapping, 'KeyK', [r'л', r'Л', r'љ', r'Љ'], 'K'); + verifyEntry(mapping, 'KeyL', [r'д', r'Д', r'∆', r'∆'], 'L'); + verifyEntry(mapping, 'KeyM', [r'ь', r'Ь', r'~', r'~'], 'M'); + verifyEntry(mapping, 'KeyN', [r'т', r'Т', r'™', r'™'], 'N'); + verifyEntry(mapping, 'KeyO', [r'щ', r'Щ', r'ў', r'Ў'], 'O'); + verifyEntry(mapping, 'KeyP', [r'з', r'З', r'‘', r'’'], 'P'); + verifyEntry(mapping, 'KeyQ', [r'й', r'Й', r'ј', r'Ј'], 'Q'); + verifyEntry(mapping, 'KeyR', [r'к', r'К', r'®', r'®'], 'R'); + verifyEntry(mapping, 'KeyS', [r'ы', r'Ы', r'ы', r'Ы'], 'S'); + verifyEntry(mapping, 'KeyT', [r'е', r'Е', r'†', r'†'], 'T'); + verifyEntry(mapping, 'KeyU', [r'г', r'Г', r'ѓ', r'Ѓ'], 'U'); + verifyEntry(mapping, 'KeyV', [r'м', r'М', r'µ', r'µ'], 'V'); + verifyEntry(mapping, 'KeyW', [r'ц', r'Ц', r'џ', r'Џ'], 'W'); + verifyEntry(mapping, 'KeyX', [r'ч', r'Ч', r'≈', r'≈'], 'X'); + verifyEntry(mapping, 'KeyY', [r'н', r'Н', r'њ', r'Њ'], 'Y'); + verifyEntry(mapping, 'KeyZ', [r'я', r'Я', r'ђ', r'Ђ'], 'Z'); }); group('sv', () { - verifyEntry(mapping, 'Digit0', ['0', '=', '≈', '≠'], '0'); - verifyEntry(mapping, 'Digit1', ['1', '!', '©', '¡'], '1'); - verifyEntry(mapping, 'Digit2', ['2', '"', '@', '”'], '2'); - verifyEntry(mapping, 'Digit3', ['3', '#', '£', '¥'], '3'); - verifyEntry(mapping, 'Digit4', ['4', '€', r'$', '¢'], '4'); - verifyEntry(mapping, 'Digit5', ['5', '%', '∞', '‰'], '5'); - verifyEntry(mapping, 'Digit6', ['6', '&', '§', '¶'], '6'); - verifyEntry(mapping, 'Digit7', ['7', '/', '|', r'\'], '7'); - verifyEntry(mapping, 'Digit8', ['8', '(', '[', '{'], '8'); - verifyEntry(mapping, 'Digit9', ['9', ')', ']', '}'], '9'); - verifyEntry(mapping, 'KeyA', ['a', 'A', '', '◊'], 'A'); - verifyEntry(mapping, 'KeyB', ['b', 'B', '›', '»'], 'B'); - verifyEntry(mapping, 'KeyC', ['c', 'C', 'ç', 'Ç'], 'C'); - verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', '∆'], 'D'); - verifyEntry(mapping, 'KeyE', ['e', 'E', 'é', 'É'], 'E'); - verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', '∫'], 'F'); - verifyEntry(mapping, 'KeyG', ['g', 'G', '¸', '¯'], 'G'); - verifyEntry(mapping, 'KeyH', ['h', 'H', '˛', '˘'], 'H'); - verifyEntry(mapping, 'KeyI', ['i', 'I', 'ı', 'ˆ'], 'I'); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '√', '¬'], 'J'); - verifyEntry(mapping, 'KeyK', ['k', 'K', 'ª', 'º'], 'K'); - verifyEntry(mapping, 'KeyL', ['l', 'L', 'fi', 'fl'], 'L'); - verifyEntry(mapping, 'KeyM', ['m', 'M', '’', '”'], 'M'); - verifyEntry(mapping, 'KeyN', ['n', 'N', '‘', '“'], 'N'); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'œ', 'Œ'], 'O'); - verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 'P'); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', '•', '°'], 'Q'); - verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '√'], 'R'); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', '∑'], 'S'); - verifyEntry(mapping, 'KeyT', ['t', 'T', '†', '‡'], 'T'); - verifyEntry(mapping, 'KeyU', ['u', 'U', 'ü', 'Ü'], 'U'); - verifyEntry(mapping, 'KeyV', ['v', 'V', '‹', '«'], 'V'); - verifyEntry(mapping, 'KeyW', ['w', 'W', 'Ω', '˝'], 'W'); - verifyEntry(mapping, 'KeyX', ['x', 'X', '≈', 'ˇ'], 'X'); - verifyEntry(mapping, 'KeyY', ['y', 'Y', 'µ', '˜'], 'Y'); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', '÷', '⁄'], 'Z'); + verifyEntry(mapping, 'Digit0', [r'0', r'=', r'≈', r'≠'], '0'); + verifyEntry(mapping, 'Digit1', [r'1', r'!', r'©', r'¡'], '1'); + verifyEntry(mapping, 'Digit2', [r'2', r'"', r'@', r'”'], '2'); + verifyEntry(mapping, 'Digit3', [r'3', r'#', r'£', r'¥'], '3'); + verifyEntry(mapping, 'Digit4', [r'4', r'€', r'$', r'¢'], '4'); + verifyEntry(mapping, 'Digit5', [r'5', r'%', r'∞', r'‰'], '5'); + verifyEntry(mapping, 'Digit6', [r'6', r'&', r'§', r'¶'], '6'); + verifyEntry(mapping, 'Digit7', [r'7', r'/', r'|', r'\'], '7'); + verifyEntry(mapping, 'Digit8', [r'8', r'(', r'[', r'{'], '8'); + verifyEntry(mapping, 'Digit9', [r'9', r')', r']', r'}'], '9'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r'◊'], 'A'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'›', r'»'], 'B'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ç', r'Ç'], 'C'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'∂', r'∆'], 'D'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'é', r'É'], 'E'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ƒ', r'∫'], 'F'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'¸', r'¯'], 'G'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'˛', r'˘'], 'H'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'ı', r'ˆ'], 'I'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'√', r'¬'], 'J'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'ª', r'º'], 'K'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'fi', r'fl'], 'L'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'’', r'”'], 'M'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'‘', r'“'], 'N'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'œ', r'Œ'], 'O'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'π', r'∏'], 'P'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'•', r'°'], 'Q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r'√'], 'R'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r'∑'], 'S'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'†', r'‡'], 'T'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'ü', r'Ü'], 'U'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'‹', r'«'], 'V'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'Ω', r'˝'], 'W'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'≈', r'ˇ'], 'X'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'µ', r'˜'], 'Y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'÷', r'⁄'], 'Z'); }); group('zh-hans', () { - verifyEntry(mapping, 'Digit0', ['0', ')', 'º', '‚'], '0'); - verifyEntry(mapping, 'Digit1', ['1', '!', '¡', '⁄'], '1'); - verifyEntry(mapping, 'Digit2', ['2', '@', '™', '€'], '2'); - verifyEntry(mapping, 'Digit3', ['3', '#', '£', '‹'], '3'); - verifyEntry(mapping, 'Digit4', ['4', '¥', '¢', '›'], '4'); - verifyEntry(mapping, 'Digit5', ['5', '%', '∞', 'fi'], '5'); - verifyEntry(mapping, 'Digit6', ['6', '', '§', 'fl'], '6'); - verifyEntry(mapping, 'Digit7', ['7', '&', '¶', '‡'], '7'); - verifyEntry(mapping, 'Digit8', ['8', '*', '•', '°'], '8'); - verifyEntry(mapping, 'Digit9', ['9', '(', 'ª', '·'], '9'); - verifyEntry(mapping, 'KeyA', ['a', 'A', 'å', 'Å'], 'A'); - verifyEntry(mapping, 'KeyB', ['b', 'B', '∫', 'ı'], 'B'); - verifyEntry(mapping, 'KeyC', ['c', 'C', 'ç', 'Ç'], 'C'); - verifyEntry(mapping, 'KeyD', ['d', 'D', '∂', 'Î'], 'D'); - verifyEntry(mapping, 'KeyE', ['e', 'E', 'Dead', '´'], 'E'); - verifyEntry(mapping, 'KeyF', ['f', 'F', 'ƒ', 'Ï'], 'F'); - verifyEntry(mapping, 'KeyG', ['g', 'G', '©', '˝'], 'G'); - verifyEntry(mapping, 'KeyH', ['h', 'H', '˙', 'Ó'], 'H'); - verifyEntry(mapping, 'KeyI', ['i', 'I', 'Dead', 'ˆ'], 'I'); - verifyEntry(mapping, 'KeyJ', ['j', 'J', '∆', 'Ô'], 'J'); - verifyEntry(mapping, 'KeyK', ['k', 'K', '˚', ''], 'K'); - verifyEntry(mapping, 'KeyL', ['l', 'L', '¬', 'Ò'], 'L'); - verifyEntry(mapping, 'KeyM', ['m', 'M', 'µ', 'Â'], 'M'); - verifyEntry(mapping, 'KeyN', ['n', 'N', 'Dead', '˜'], 'N'); - verifyEntry(mapping, 'KeyO', ['o', 'O', 'ø', 'Ø'], 'O'); - verifyEntry(mapping, 'KeyP', ['p', 'P', 'π', '∏'], 'P'); - verifyEntry(mapping, 'KeyQ', ['q', 'Q', 'œ', 'Œ'], 'Q'); - verifyEntry(mapping, 'KeyR', ['r', 'R', '®', '‰'], 'R'); - verifyEntry(mapping, 'KeyS', ['s', 'S', 'ß', 'Í'], 'S'); - verifyEntry(mapping, 'KeyT', ['t', 'T', '†', 'ˇ'], 'T'); - verifyEntry(mapping, 'KeyU', ['u', 'U', 'Dead', '¨'], 'U'); - verifyEntry(mapping, 'KeyV', ['v', 'V', '√', '◊'], 'V'); - verifyEntry(mapping, 'KeyW', ['w', 'W', '∑', '„'], 'W'); - verifyEntry(mapping, 'KeyX', ['x', 'X', '≈', '˛'], 'X'); - verifyEntry(mapping, 'KeyY', ['y', 'Y', '¥', 'Á'], 'Y'); - verifyEntry(mapping, 'KeyZ', ['z', 'Z', 'Ω', '¸'], 'Z'); + verifyEntry(mapping, 'Digit0', [r'0', r')', r'º', r'‚'], '0'); + verifyEntry(mapping, 'Digit1', [r'1', r'!', r'¡', r'⁄'], '1'); + verifyEntry(mapping, 'Digit2', [r'2', r'@', r'™', r'€'], '2'); + verifyEntry(mapping, 'Digit3', [r'3', r'#', r'£', r'‹'], '3'); + verifyEntry(mapping, 'Digit4', [r'4', r'¥', r'¢', r'›'], '4'); + verifyEntry(mapping, 'Digit5', [r'5', r'%', r'∞', r'fi'], '5'); + verifyEntry(mapping, 'Digit6', [r'6', r'', r'§', r'fl'], '6'); + verifyEntry(mapping, 'Digit7', [r'7', r'&', r'¶', r'‡'], '7'); + verifyEntry(mapping, 'Digit8', [r'8', r'*', r'•', r'°'], '8'); + verifyEntry(mapping, 'Digit9', [r'9', r'(', r'ª', r'·'], '9'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'A'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'∫', r'ı'], 'B'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ç', r'Ç'], 'C'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'∂', r'Î'], 'D'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'Dead', r'´'], 'E'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ƒ', r'Ï'], 'F'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'©', r'˝'], 'G'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'˙', r'Ó'], 'H'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'Dead', r'ˆ'], 'I'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'∆', r'Ô'], 'J'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'˚', r''], 'K'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'¬', r'Ò'], 'L'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r'Â'], 'M'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'Dead', r'˜'], 'N'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'O'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'π', r'∏'], 'P'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'œ', r'Œ'], 'Q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r'‰'], 'R'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r'Í'], 'S'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'†', r'ˇ'], 'T'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'Dead', r'¨'], 'U'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'√', r'◊'], 'V'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'∑', r'„'], 'W'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'≈', r'˛'], 'X'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'¥', r'Á'], 'Y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'Ω', r'¸'], 'Z'); }); } diff --git a/tools/gen_web_locale_keymap/README.md b/tools/gen_web_locale_keymap/README.md index 7f48bc3282fea..4c22c4deab023 100644 --- a/tools/gen_web_locale_keymap/README.md +++ b/tools/gen_web_locale_keymap/README.md @@ -4,7 +4,7 @@ This script generates mapping data for `web_locale_keymap`. ## Usage -1. `cd` to this folder, run `dart pub get`. +1. `cd` to this folder, and run `dart pub get`. 2. [Create a Github access token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token), then store it to environment variable `$GITHUB_TOKEN`. This token is only for quota controlling and does not need any scopes. ``` # ~/.zshrc @@ -54,9 +54,13 @@ can use other information: `keyCode`. Now, keyCode is a deprecated property, but we really don't see it being removed any time foreseeable. Also, although keyCode is infamous for being platform-dependent, for letter keys it is always equal to the letter character. Therefore such conflicting cases are all mapped -to a special value, 0x01, indicating "use keyCode". +to a special value, `kUseKeyCode`, indicating "use keyCode". Moreover, to reduce the size of the map, we noticed there are certain patterns that can be easily represented by some if statements. These patterns are extracted as the so-called "heuristic mapper". This reduces the map from over 1600 entries to ~450 entries. + +To further reduce the package size overhead, the map is encoded into a string +that is decoded at run time. This reduces the package size over by 33% at the +cost of code complexity. diff --git a/tools/gen_web_locale_keymap/bin/gen_web_locale_keymap.dart b/tools/gen_web_locale_keymap/bin/gen_web_locale_keymap.dart index 3d5e89a4ff264..7f48f46e8a775 100644 --- a/tools/gen_web_locale_keymap/bin/gen_web_locale_keymap.dart +++ b/tools/gen_web_locale_keymap/bin/gen_web_locale_keymap.dart @@ -6,6 +6,7 @@ import 'dart:io'; import 'package:args/args.dart'; import 'package:gen_web_keyboard_layouts/benchmark_planner.dart'; +import 'package:gen_web_keyboard_layouts/common.dart'; import 'package:gen_web_keyboard_layouts/github.dart'; import 'package:gen_web_keyboard_layouts/layout_types.dart'; import 'package:path/path.dart' as path; @@ -64,32 +65,64 @@ void _sortedForEach(Map map, _ForEachAction action) { }); } -String _escapeEventKey(String original) { - switch (original) { - case "'": - return '"\'"'; - case r'\': - return r"r'\'"; - case r'$': - return r"r'$'"; - default: - return "'$original'"; +String _escapeStringToDart(String origin) { + // If there is no `'`, we can use the raw string surrounded by `'`. + if (!origin.contains("'")) { + return "r'$origin'"; + } else { + // If there is no `"`, we can use the raw string surrounded by `"`. + if (!origin.contains('"')) { + return 'r"$origin"'; + } else { + // If there are both kinds of quotes, we have to use non-raw string + // and escape necessary characters. + final String beforeQuote = origin + .replaceAll(r'\', r'\\') + .replaceAll(r'$', r'\$') + .replaceAll("'", r"\'"); + return "'$beforeQuote'"; + } + } +} + +typedef _ValueCompare = void Function(T?, T?, String path); +void _mapForEachEqual(Map a, Map b, _ValueCompare body, String path) { + assert(a.length == b.length, '$path.length: ${a.length} vs ${b.length}'); + for (final String key in a.keys) { + body(a[key], b[key], key); + } +} + +bool _verifyMap(Map> a, Map> b) { + _mapForEachEqual(a, b, (Map? aMap, Map? bMap, String path) { + _mapForEachEqual(aMap!, bMap!, (int? aValue, int? bValue, String path) { + assert(aValue == bValue && aValue != null, '$path: $aValue vs $bValue'); + }, path); + }, ''); + return true; +} + +String _prettyPrintBody(String body, int width) { + int min(int a, int b) { + return a < b ? a : b; } + final List result = []; + int start = 0; + while (start < body.length) { + final String row = body.substring(start, min(body.length, start + width)); + result.add(' ${_escapeStringToDart(row)}'); + start += width; + } + return result.join('\n'); } String _buildMapString(Iterable layouts) { - final List codeStrings = []; - _sortedForEach(combineLayouts(layouts), (String eventCode, Map eventKeyToLogicalKeys) { - final List codeStringBodies = []; - _sortedForEach(eventKeyToLogicalKeys, (String eventKey, int result) { - codeStringBodies.add(' ${_escapeEventKey(eventKey)}: 0x${result.toRadixString(16)},'); - }); - codeStrings.add(''' - '$eventCode': { -${codeStringBodies.join('\n').trimRight()} - },'''); - }); - return '>{\n${codeStrings.join('\n')}\n}'; + final Map> originalMap = combineLayouts(layouts); + final String compressed = marshallMappingData(originalMap); + final Map> uncompressed = unmarshallMappingData(compressed); + assert(_verifyMap(originalMap, uncompressed)); + return ' return unmarshallMappingData(\n${_prettyPrintBody(compressed, 64)});' + ' // ${compressed.length} characters'; } String _buildTestCasesString(List layouts) { @@ -99,7 +132,7 @@ String _buildTestCasesString(List layouts) { _sortedForEach(planLayout(layout.entries), (String eventCode, int logicalKey) { final LayoutEntry entry = layout.entries[eventCode]!; layoutEntries.add(" verifyEntry(mapping, '$eventCode', [" - '${entry.printables.map(_escapeEventKey).join(', ')}' + '${entry.printables.map(_escapeStringToDart).join(', ')}' "], '${String.fromCharCode(logicalKey)}');"); }); layoutsString.add(''' diff --git a/tools/gen_web_locale_keymap/data/key_mappings.dart.tmpl b/tools/gen_web_locale_keymap/data/key_mappings.dart.tmpl index 0cad6b8834709..daf910df22609 100644 --- a/tools/gen_web_locale_keymap/data/key_mappings.dart.tmpl +++ b/tools/gen_web_locale_keymap/data/key_mappings.dart.tmpl @@ -14,7 +14,6 @@ // - Templates: data/*.tmpl // // See flutter/engine:flutter/tools/gen_web_keyboard_layouts/README.md for more information. - @@@COMMON@@@ /// Data for [LayoutMapping] on Windows. @@ -24,7 +23,9 @@ /// The keys are `KeyboardEvent.code` and then `KeyboardEvent.key`. The values /// are logical keys or [kUseKeyCode]. Entries that can be derived using /// heuristics have been omitted. -final Map> kMappingDataWin = @@@WIN_MAPPING@@@; +Map> getMappingDataWin() { +@@@WIN_MAPPING@@@ +} /// Data for [LayoutMapping] on Linux. /// @@ -33,7 +34,9 @@ final Map> kMappingDataWin = @@@WIN_MAPPING@@@; /// The keys are `KeyboardEvent.code` and then `KeyboardEvent.key`. The values /// are logical keys or [kUseKeyCode]. Entries that can be derived using /// heuristics have been omitted. -final Map> kMappingDataLinux = @@@LINUX_MAPPING@@@; +Map> getMappingDataLinux() { +@@@LINUX_MAPPING@@@ +} /// Data for [LayoutMapping] on Darwin. /// @@ -42,4 +45,6 @@ final Map> kMappingDataLinux = @@@LINUX_MAPPING@@@; /// The keys are `KeyboardEvent.code` and then `KeyboardEvent.key`. The values /// are logical keys or [kUseKeyCode]. Entries that can be derived using /// heuristics have been omitted. -final Map> kMappingDataDarwin = @@@DARWIN_MAPPING@@@; +Map> getMappingDataDarwin() { +@@@DARWIN_MAPPING@@@ +} diff --git a/tools/gen_web_locale_keymap/data/test_cases.dart.tmpl b/tools/gen_web_locale_keymap/data/test_cases.dart.tmpl index 0aba83fc6733e..41a94b0a68173 100644 --- a/tools/gen_web_locale_keymap/data/test_cases.dart.tmpl +++ b/tools/gen_web_locale_keymap/data/test_cases.dart.tmpl @@ -19,14 +19,14 @@ import 'package:test/test.dart'; import 'package:web_locale_keymap/web_locale_keymap.dart'; import 'testing.dart'; -void testWin(LayoutMapping mapping) { +void testWin(LocaleKeymap mapping) { @@@WIN_CASES@@@ } -void testLinux(LayoutMapping mapping) { +void testLinux(LocaleKeymap mapping) { @@@LINUX_CASES@@@ } -void testDarwin(LayoutMapping mapping) { +void testDarwin(LocaleKeymap mapping) { @@@DARWIN_CASES@@@ } diff --git a/tools/gen_web_locale_keymap/lib/common.dart b/tools/gen_web_locale_keymap/lib/common.dart index 7e03f1f3ded60..1f92fc62f83be 100644 --- a/tools/gen_web_locale_keymap/lib/common.dart +++ b/tools/gen_web_locale_keymap/lib/common.dart @@ -2,13 +2,24 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:convert' show utf8; + // The following segment is not only used in the generating script, but also // copied to the generated package. /*@@@ SHARED SEGMENT START @@@*/ -/// A special value in the final mapping that indicates the logical key should -/// be derived from KeyboardEvent.keyCode. -const int kUseKeyCode = 1; +/// Used in the final mapping indicating the logical key should be derived from +/// KeyboardEvent.keyCode. +/// +/// This value is chosen because it's a printable character within EASCII that +/// will never be mapped to (checked in the marshalling algorithm). +const int kUseKeyCode = 0xFF; + +/// Used in the final mapping indicating the event key is 'Dead', the dead key. +final String _kUseDead = String.fromCharCode(0xFE); + +/// The KeyboardEvent.key for a dead key. +const String _kEventKeyDead = 'Dead'; /// A map of all goals from the scan codes to their mapped value in US layout. const Map kLayoutGoals = { @@ -101,6 +112,73 @@ int? heuristicMapper(String code, String key) { return null; } +// Maps an integer to a printable EASCII character by adding it to this value. +// +// We could've chosen 0x20, the first printable character, for a slightly bigger +// range, but it's prettier this way and sufficient. +final int _kMarshallIntBase = '0'.codeUnitAt(0); + +class _StringStream { + _StringStream(this._data) : _offset = 0; + + final String _data; + + int get offest => _offset; + int _offset; + + int readIntAsVerbatim() { + final int result = _data.codeUnitAt(_offset); + _offset += 1; + assert(result >= _kMarshallIntBase); + return result - _kMarshallIntBase; + } + + int readIntAsChar() { + final int result = _data.codeUnitAt(_offset); + _offset += 1; + return result; + } + + String readEventKey() { + final String char = String.fromCharCode(readIntAsChar()); + if (char == _kUseDead) { + return _kEventKeyDead; + } else { + return char; + } + } + + String readString() { + final int length = readIntAsVerbatim(); + if (length == 0) { + return ''; + } + final String result = _data.substring(_offset, _offset + length); + _offset += length; + return result; + } +} + +Map _unmarshallCodeMap(_StringStream stream) { + final int entryNum = stream.readIntAsVerbatim(); + return Map.fromEntries((() sync* { + for (int entryIndex = 0; entryIndex < entryNum; entryIndex += 1) { + yield MapEntry(stream.readEventKey(), stream.readIntAsChar()); + } + })()); +} + +/// Decode a key mapping data out of the string. +Map> unmarshallMappingData(String compressed) { + final _StringStream stream = _StringStream(compressed); + final int eventCodeNum = stream.readIntAsVerbatim(); + return Map>.fromEntries((() sync* { + for (int eventCodeIndex = 0; eventCodeIndex < eventCodeNum; eventCodeIndex += 1) { + yield MapEntry>(stream.readString(), _unmarshallCodeMap(stream)); + } + })()); +} + /*@@@ SHARED SEGMENT END @@@*/ /// Whether the given charCode is a ASCII letter. @@ -108,3 +186,79 @@ bool isLetterChar(int charCode) { return (charCode >= _kLowerA && charCode <= _kLowerZ) || (charCode >= _kUpperA && charCode <= _kUpperZ); } + +bool _isPrintableEascii(int charCode) { + return charCode >= 0x20 && charCode <= 0xFF; +} + +typedef _ForEachAction = void Function(String key, V value); +void _sortedForEach(Map map, _ForEachAction action) { + map + .entries + .toList() + ..sort((MapEntry a, MapEntry b) => a.key.compareTo(b.key)) + ..forEach((MapEntry entry) { + action(entry.key, entry.value); + }); +} + +// Encode a small integer as a character by its value. +// +// For example, 0x48 is encoded as '0'. This means that values within 0x0 - 0x19 +// or greater than 0xFF are forbidden. +void _marshallIntAsChar(StringBuffer builder, int value) { + assert(_isPrintableEascii(value), '$value'); + builder.writeCharCode(value); +} + +const int _kMarshallIntEnd = 0xFF; // The last printable EASCII. +// Encode a small integer as a character based on a certain printable codepoint. +// +// For example, 0x0 is encoded as '0', and 0x1 is encoded as '1'. This function +// allows smaller values than _marshallIntAsChar. +void _marshallIntAsVerbatim(StringBuffer builder, int value) { + final int result = value + _kMarshallIntBase; + assert(result <= _kMarshallIntEnd); + builder.writeCharCode(result); +} + +// Encode a string, length first, then contents. +// +// The length of string is the amount of characters, not its byte length. +void _marshallString(StringBuffer builder, String value) { + _marshallIntAsVerbatim(builder, value.length); + for (final int char in utf8.encode(value)) { + assert(_isPrintableEascii(char), '0x${char.toRadixString(16)}}'); + } + builder.write(value); +} + +void _marshallEventKey(StringBuffer builder, String value) { + if (value == _kEventKeyDead) { + builder.write(_kUseDead); + } else { + assert(value.length == 1); + assert(value != _kUseDead); + builder.write(value); + } +} + +/// Encode a key mapping data into a string. +/// +/// The algorithm aims at encoding the map directly into a printable string +/// (instead of a binary stream converted by base64). Some characters in the +/// string can be multi-byte, which means the decoder should parse the string +/// using substr instead of as a binary stream. +String marshallMappingData(Map> mappingData) { + final StringBuffer builder = StringBuffer(); + _marshallIntAsVerbatim(builder, mappingData.length); + _sortedForEach(mappingData, (String eventCode, Map codeMap) { + _marshallString(builder, eventCode); + _marshallIntAsVerbatim(builder, codeMap.length); + _sortedForEach(codeMap, (String eventKey, int logicalKey) { + _marshallEventKey(builder, eventKey); + _marshallIntAsChar(builder, logicalKey); + }); + }); + return builder.toString(); +} diff --git a/web_sdk/sdk_rewriter.dart b/web_sdk/sdk_rewriter.dart index 11b8ffb2054b2..e1fce30dc33f3 100644 --- a/web_sdk/sdk_rewriter.dart +++ b/web_sdk/sdk_rewriter.dart @@ -11,7 +11,6 @@ final ArgParser argParser = ArgParser() ..addOption('output-dir') ..addOption('input-dir') ..addFlag('ui') - ..addFlag('keyboard-layouts') ..addOption('library-name') ..addOption('api-file') ..addMultiOption('source-file') @@ -35,19 +34,6 @@ export 'dart:_engine' ), ]; -// final List keyboardLayoutsPatterns = [ -// AllReplacer(RegExp(r'library\s+web_locale_keymap;'), 'library dart.web_locale_keymap;'), -// AllReplacer(RegExp(r'part\s+of\s+web_locale_keymap;'), 'part of dart.web_locale_keymap;'), -// AllReplacer(RegExp( -// r''' -// export\s*'src/engine.dart' -// '''), -// r''' -// export 'dart:_engine' -// ''', -// ), -// ]; - List generateApiFilePatterns(String libraryName, List extraImports) { return [ AllReplacer(RegExp('library\\s+$libraryName;'), ''' From f970ce1c7977d5e6edbdec5c88364fa6d3db9219 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 28 Nov 2022 11:53:02 -0800 Subject: [PATCH 63/74] Fix _eventKeyIsKeyname --- lib/web_ui/lib/src/engine/keyboard_binding.dart | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/lib/web_ui/lib/src/engine/keyboard_binding.dart b/lib/web_ui/lib/src/engine/keyboard_binding.dart index 31350ab6a4e75..db1d04e0dccb2 100644 --- a/lib/web_ui/lib/src/engine/keyboard_binding.dart +++ b/lib/web_ui/lib/src/engine/keyboard_binding.dart @@ -55,14 +55,10 @@ final Map _kLogicalKeyToModifierGetter = event.metaKey, }; -// ASCII for a, z, A, and Z -const int _kCharLowerA = 0x61; -const int _kCharLowerZ = 0x7a; const int _kCharUpperA = 0x41; const int _kCharUpperZ = 0x5a; -bool isAlphabet(int charCode) { - return (charCode >= _kCharLowerA && charCode <= _kCharLowerZ) - || (charCode >= _kCharUpperA && charCode <= _kCharUpperZ); +bool isUpperLetter(int charCode) { + return charCode >= _kCharUpperA && charCode <= _kCharUpperZ; } const String _kPhysicalCapsLock = 'CapsLock'; @@ -318,7 +314,7 @@ class KeyboardConverter { // 1 letter. static bool _eventKeyIsKeyname(String key) { assert(key.isNotEmpty); - return isAlphabet(key.codeUnitAt(0)) && key.length > 1; + return isUpperLetter(key.codeUnitAt(0)) && key.length > 1; } static int _deadKeyToLogicalKey(int physicalKey, FlutterHtmlKeyboardEvent event) { From de986884a6585b261ca493f478e43fb8404e7e87 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 28 Nov 2022 11:53:47 -0800 Subject: [PATCH 64/74] remove gitignore --- third_party/web_locale_keymap/.gitignore | 14 -------------- tools/gen_web_locale_keymap/.gitignore | 1 - 2 files changed, 15 deletions(-) delete mode 100644 third_party/web_locale_keymap/.gitignore delete mode 100644 tools/gen_web_locale_keymap/.gitignore diff --git a/third_party/web_locale_keymap/.gitignore b/third_party/web_locale_keymap/.gitignore deleted file mode 100644 index 2f9337cb4968f..0000000000000 --- a/third_party/web_locale_keymap/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -# See https://dart.dev/guides/libraries/private-files - -# Files and directories created by pub -.dart_tool/ -.packages -build/ -# If you're building an application, you may want to check-in your pubspec.lock -pubspec.lock - -# Directory created by dartdoc -# If you don't generate documentation locally you can remove this line. -doc/api/ - -.vscode diff --git a/tools/gen_web_locale_keymap/.gitignore b/tools/gen_web_locale_keymap/.gitignore deleted file mode 100644 index ceddaa37f12a8..0000000000000 --- a/tools/gen_web_locale_keymap/.gitignore +++ /dev/null @@ -1 +0,0 @@ -.cache/ From fdd32251d9b488292ebf4f2d307129bda003bfef Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 28 Nov 2022 12:20:01 -0800 Subject: [PATCH 65/74] Fix nullable --- lib/web_ui/lib/src/engine/embedder.dart | 2 +- lib/web_ui/lib/src/engine/keyboard_binding.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/web_ui/lib/src/engine/embedder.dart b/lib/web_ui/lib/src/engine/embedder.dart index fd36aaee4ea75..0c98a3d259d86 100644 --- a/lib/web_ui/lib/src/engine/embedder.dart +++ b/lib/web_ui/lib/src/engine/embedder.dart @@ -324,7 +324,7 @@ class FlutterViewEmbedder { } KeyboardBinding.initInstance(); - PointerBinding.initInstance(glassPaneElement, KeyboardBinding.instance.converter); + PointerBinding.initInstance(glassPaneElement, KeyboardBinding.instance!.converter); if (domWindow.visualViewport == null && isWebKit) { // Older Safari versions sometimes give us bogus innerWidth/innerHeight diff --git a/lib/web_ui/lib/src/engine/keyboard_binding.dart b/lib/web_ui/lib/src/engine/keyboard_binding.dart index db1d04e0dccb2..7304091ac7f1b 100644 --- a/lib/web_ui/lib/src/engine/keyboard_binding.dart +++ b/lib/web_ui/lib/src/engine/keyboard_binding.dart @@ -116,7 +116,7 @@ class KeyboardBinding { } /// The singleton instance of this object. - static KeyboardBinding get instance => _instance!; + static KeyboardBinding? get instance => _instance; static KeyboardBinding? _instance; static void initInstance() { From 0e32e71bda56cb1a0a61b31471e09353a7bee0c4 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 28 Nov 2022 12:31:50 -0800 Subject: [PATCH 66/74] Fix doc --- .../lib/web_locale_keymap/key_mappings.g.dart | 12 ++++++------ .../data/key_mappings.dart.tmpl | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/third_party/web_locale_keymap/lib/web_locale_keymap/key_mappings.g.dart b/third_party/web_locale_keymap/lib/web_locale_keymap/key_mappings.g.dart index 6f9b8a3ace619..f0d510ff1fc5d 100644 --- a/third_party/web_locale_keymap/lib/web_locale_keymap/key_mappings.g.dart +++ b/third_party/web_locale_keymap/lib/web_locale_keymap/key_mappings.g.dart @@ -186,9 +186,9 @@ Map> unmarshallMappingData(String compressed) { })()); } -/// Data for [LayoutMapping] on Windows. +/// Data for [LocaleKeymap] on Windows. /// -/// Do not use this value, but [LayoutMapping.win] instead. +/// Do not use this value, but [LocaleKeymap.win] instead. /// /// The keys are `KeyboardEvent.code` and then `KeyboardEvent.key`. The values /// are logical keys or [kUseKeyCode]. Entries that can be derived using @@ -206,9 +206,9 @@ Map> getMappingDataWin() { r'>YWWYYZZwWyYzZ9Semicolon2MMmM'); // 541 characters } -/// Data for [LayoutMapping] on Linux. +/// Data for [LocaleKeymap] on Linux. /// -/// Do not use this value, but [LayoutMapping.linux] instead. +/// Do not use this value, but [LocaleKeymap.linux] instead. /// /// The keys are `KeyboardEvent.code` and then `KeyboardEvent.key`. The values /// are logical keys or [kUseKeyCode]. Entries that can be derived using @@ -225,9 +225,9 @@ Map> getMappingDataLinux() { r'KeyZ;> getMappingDataWin() { @@@WIN_MAPPING@@@ } -/// Data for [LayoutMapping] on Linux. +/// Data for [LocaleKeymap] on Linux. /// -/// Do not use this value, but [LayoutMapping.linux] instead. +/// Do not use this value, but [LocaleKeymap.linux] instead. /// /// The keys are `KeyboardEvent.code` and then `KeyboardEvent.key`. The values /// are logical keys or [kUseKeyCode]. Entries that can be derived using @@ -38,9 +38,9 @@ Map> getMappingDataLinux() { @@@LINUX_MAPPING@@@ } -/// Data for [LayoutMapping] on Darwin. +/// Data for [LocaleKeymap] on Darwin. /// -/// Do not use this value, but [LayoutMapping.darwin] instead. +/// Do not use this value, but [LocaleKeymap.darwin] instead. /// /// The keys are `KeyboardEvent.code` and then `KeyboardEvent.key`. The values /// are logical keys or [kUseKeyCode]. Entries that can be derived using From a507c334da8a799ce28c1edf1fcc82e352d950d2 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 28 Nov 2022 14:13:47 -0800 Subject: [PATCH 67/74] Add underscore lead. Make everything lower case. Print by line. --- ci/licenses_golden/licenses_flutter | 2 +- .../lib/web_locale_keymap/key_mappings.g.dart | 166 +- .../web_locale_keymap/test/test_cases.g.dart | 2288 ++++++++--------- .../web_locale_keymap/test/testing.dart | 2 +- tools/gen_web_locale_keymap/README.md | 2 +- .../bin/gen_web_locale_keymap.dart | 23 +- tools/gen_web_locale_keymap/lib/common.dart | 62 +- web_sdk/BUILD.gn | 6 +- web_sdk/libraries.json | 14 +- web_sdk/libraries.yaml | 11 +- web_sdk/sdk_rewriter.dart | 2 +- web_sdk/test/sdk_rewriter_test.dart | 4 +- 12 files changed, 1317 insertions(+), 1265 deletions(-) diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index e671c3fb4fc58..df0c39582d599 100644 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -3817,4 +3817,4 @@ shall not be used in advertising or otherwise to promote the sale, use or other dealings in these Data Files or Software without prior written authorization of the copyright holder. ==================================================================================================== -Total license count: 17 +Total license count: 19 diff --git a/third_party/web_locale_keymap/lib/web_locale_keymap/key_mappings.g.dart b/third_party/web_locale_keymap/lib/web_locale_keymap/key_mappings.g.dart index f0d510ff1fc5d..43273c2cdefdf 100644 --- a/third_party/web_locale_keymap/lib/web_locale_keymap/key_mappings.g.dart +++ b/third_party/web_locale_keymap/lib/web_locale_keymap/key_mappings.g.dart @@ -30,32 +30,32 @@ const String _kEventKeyDead = 'Dead'; /// A map of all goals from the scan codes to their mapped value in US layout. const Map kLayoutGoals = { - 'KeyA': 'A', - 'KeyB': 'B', - 'KeyC': 'C', - 'KeyD': 'D', - 'KeyE': 'E', - 'KeyF': 'F', - 'KeyG': 'G', - 'KeyH': 'H', - 'KeyI': 'I', - 'KeyJ': 'J', - 'KeyK': 'K', - 'KeyL': 'L', - 'KeyM': 'M', - 'KeyN': 'N', - 'KeyO': 'O', - 'KeyP': 'P', - 'KeyQ': 'Q', - 'KeyR': 'R', - 'KeyS': 'S', - 'KeyT': 'T', - 'KeyU': 'U', - 'KeyV': 'V', - 'KeyW': 'W', - 'KeyX': 'X', - 'KeyY': 'Y', - 'KeyZ': 'Z', + 'KeyA': 'a', + 'KeyB': 'b', + 'KeyC': 'c', + 'KeyD': 'd', + 'KeyE': 'e', + 'KeyF': 'f', + 'KeyG': 'g', + 'KeyH': 'h', + 'KeyI': 'i', + 'KeyJ': 'j', + 'KeyK': 'k', + 'KeyL': 'l', + 'KeyM': 'm', + 'KeyN': 'n', + 'KeyO': 'o', + 'KeyP': 'p', + 'KeyQ': 'q', + 'KeyR': 'r', + 'KeyS': 's', + 'KeyT': 't', + 'KeyU': 'u', + 'KeyV': 'v', + 'KeyW': 'w', + 'KeyX': 'x', + 'KeyY': 'y', + 'KeyZ': 'z', 'Digit1': '1', 'Digit2': '2', 'Digit3': '3', @@ -195,15 +195,30 @@ Map> unmarshallMappingData(String compressed) { /// heuristics have been omitted. Map> getMappingDataWin() { return unmarshallMappingData( - 'V9Backquote1§06Digit04)0=0@0}06Digit17!1&1\'1+1>1|1~16Digit25"2\'2' - '/2@2~26Digit36"3#3*3+3-3^36Digit47!4\$4\'4+4;4{4~46Digit53%5(5[56D' - r'igit66&6-6/6:6^6|66Digit77&7/7=7?7`7{7|76Digit86!8(8*8[8\8_86Dig' - r'it95(9)9]9^9{94KeyA4AAQQaAqQ4KeyB3BBbB{B4KeyC3&CCCcC4KeyD2DDdD4K' - r'eyE2EEeE4KeyF3FF[FfF4KeyG3GG]GgG4KeyH2HHhH4KeyI2IIiI4KeyJ2JJjJ4K' - r'eyK2KKkK4KeyL2LLlL4KeyM4YWWYYZZwWyYzZ9Semicolon2MMmM'); // 541 characters + r'F' + r'9Backquote1§0' + r'6Digit04)0=0@0}0' + r"6Digit17!1&1'1+1>1|1~1" + '6Digit25"2\'2/2@2~2' + r'6Digit36"3#3*3+3-3^3' + r"6Digit47!4$4'4+4;4{4~4" + r'6Digit53%5(5[5' + r'6Digit66&6-6/6:6^6|6' + r'6Digit77&7/7=7?7`7{7|7' + r'6Digit86!8(8*8[8\8_8' + r'6Digit95(9)9]9^9{9' + r'4KeyB1{b' + r'4KeyC1&c' + r'4KeyF1[f' + r'4KeyG1]g' + r'4KeyM2y' + ); // 308 characters } /// Data for [LocaleKeymap] on Linux. @@ -215,14 +230,26 @@ Map> getMappingDataWin() { /// heuristics have been omitted. Map> getMappingDataLinux() { return unmarshallMappingData( - r'U6Digit04)0=0@0}06Digit13!1&1|16Digit23"2@2~26Digit32"3#36Digit4' - r"5$4'4;4{4~46Digit53%5(5[56Digit65&6-6:6^6|66Digit75&7/7?7`7{76Di" - r'git85(8*8[8\8_86Digit94(9)9]9^94KeyA6@QAAQQaAqQΩQ4KeyB2BBbB4KeyC' - r'2CCcC4KeyD2DDdD4KeyE2EEeE4KeyF2FFfF4KeyG2GGgG4KeyH2HHhH4KeyI2IIi' - r'I4KeyJ2JJjJ4KeyK3&KKKkK4KeyL2LLlL4KeyM2MMmM4KeyN2NNnN4KeyO2OOoO4' - r'KeyP2PPpP4KeyQ7@QAAQQaAqQÆAæA4KeyR2RRrR4KeyS2SSsS4KeyT2TTtT4KeyU' - r'2UUuU4KeyV2VVvV4KeyW6XXXxX4KeyY6YYZZyYzZ¥ÿ←ÿ4' - r'KeyZ;x' + r'4KeyY2¥ÿ←ÿ' + r'4KeyZ5> getMappingDataLinux() { /// heuristics have been omitted. Map> getMappingDataDarwin() { return unmarshallMappingData( - r'X5Comma4WWwW„W∑W6Digit04)0=0`0}06Digit13!1&1|16Digit22"2@26Digit' - '32"3#36Digit43\$4%4\'46Digit56%5(5:5[5{5~56Digit65 6&6,6]6^66Digit' - r"75&7.7/7\7|76Digit86!8(8*8;8[8{86Digit97 9'9(9)9]9{9}94KeyA6AAQQ" - r'aAqQΩQ‡Q4KeyB6BBXXbBxX˛X≈X4KeyC7 CCCJJcCjJÔJ∆J4KeyD6DDþEEEdDeE´E' - r'4KeyE2EEeE4KeyF6þUFFUUfFuU¨U4KeyG6þÿGGIIgGiIˆI4KeyH7 HDDHHdDhHÎÿ' - r'∂D4KeyI7 ICCIIcCiIÇCçC4KeyJ6HHJJhHjJÓH˙H4KeyK6KKTTkKtTˇÿ†T4KeyL9' - r' L@LþÿLLNNlLnN|L˜N4KeyM3MMmM~M4KeyN7 NBBNNbBnNıÿ∫B4KeyO6OORRoOrR' - r'®R‰R4KeyP6LLPPlLpP¬LÒL4KeyQ6AAQQaAqQÆAæA4KeyR7 RPPRRpPrRπP∏P4Key' - r'S7 SOOSSoOsSØOøO4KeyT6TTYYtTyY¥YÁY4KeyU7 UGGUUgGuU©G˝G4KeyV6KKVV' - r'kKvV˚KK4KeyW6WWZZwWzZÂZÅZ4KeyX6QQXXqQxXŒQœQ4KeyY; YFFYYZZfFyYzZ' - r'ÏFƒFˇZΩZ4KeyZ; ZWWYYZZwWyYzZ¥Y‡Y‹ÿ›W6Period4VVvV√V◊V9Semicolon8M' - r'MSSmMsSµMÍSÓMßS5Slash4ZZzZ¸ZΩZ'); // 734 characters + r'W' + r'5Comma2„w∑w' + r'6Digit04)0=0`0}0' + r'6Digit13!1&1|1' + r'6Digit22"2@2' + r'6Digit32"3#3' + r"6Digit43$4%4'4" + r'6Digit56%5(5:5[5{5~5' + r'6Digit65 6&6,6]6^6' + r'6Digit75&7.7/7\7|7' + r'6Digit86!8(8*8;8[8{8' + r"6Digit97 9'9(9)9]9{9}9" + r'4KeyA2Ωq‡q' + r'4KeyB2˛x≈x' + r'4KeyC3 cÔj∆j' + r'4KeyD2þe´e' + r'4KeyF2þu¨u' + r'4KeyG2þÿˆi' + r'4KeyH3 hÎÿ∂d' + r'4KeyI3 iÇcçc' + r'4KeyJ2Óh˙h' + r'4KeyK2ˇÿ†t' + r'4KeyL5 l@lþÿ|l˜n' + r'4KeyM1~m' + r'4KeyN3 nıÿ∫b' + r'4KeyO2®r‰r' + r'4KeyP2¬lÒl' + r'4KeyQ2Æaæa' + r'4KeyR3 rπp∏p' + r'4KeyS3 sØoøo' + r'4KeyT2¥yÁy' + r'4KeyU3 u©g˝g' + r'4KeyV2˚kk' + r'4KeyW2ÂzÅz' + r'4KeyX2Œqœq' + r'4KeyY5 yÏfƒfˇzΩz' + r'4KeyZ5 z¥y‡y‹ÿ›w' + r'6Period2√v◊v' + r'9Semicolon4µmÍsÓmßs' + r'5Slash2¸zΩz' + ); // 500 characters } diff --git a/third_party/web_locale_keymap/test/test_cases.g.dart b/third_party/web_locale_keymap/test/test_cases.g.dart index 6b51d706ef0d2..60c946a2ba943 100644 --- a/third_party/web_locale_keymap/test/test_cases.g.dart +++ b/third_party/web_locale_keymap/test/test_cases.g.dart @@ -31,32 +31,32 @@ void testWin(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'ý', r'7', r'`', r''], '7'); verifyEntry(mapping, 'Digit8', [r'á', r'8', r'˙', r''], '8'); verifyEntry(mapping, 'Digit9', [r'í', r'9', r'´', r''], '9'); - verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'A'); - verifyEntry(mapping, 'KeyB', [r'b', r'B', r'{', r''], 'B'); - verifyEntry(mapping, 'KeyC', [r'c', r'C', r'&', r''], 'C'); - verifyEntry(mapping, 'KeyD', [r'd', r'D', r'Đ', r''], 'D'); - verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r''], 'E'); - verifyEntry(mapping, 'KeyF', [r'f', r'F', r'[', r''], 'F'); - verifyEntry(mapping, 'KeyG', [r'g', r'G', r']', r''], 'G'); - verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'H'); - verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'I'); - verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'J'); - verifyEntry(mapping, 'KeyK', [r'k', r'K', r'ł', r''], 'K'); - verifyEntry(mapping, 'KeyL', [r'l', r'L', r'Ł', r''], 'L'); - verifyEntry(mapping, 'KeyM', [r'm', r'M', r'', r''], 'M'); - verifyEntry(mapping, 'KeyN', [r'n', r'N', r'}', r''], 'N'); - verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'O'); - verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'P'); - verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'\', r''], 'Q'); - verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'R'); - verifyEntry(mapping, 'KeyS', [r's', r'S', r'đ', r''], 'S'); - verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 'T'); - verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'U'); - verifyEntry(mapping, 'KeyV', [r'v', r'V', r'@', r''], 'V'); - verifyEntry(mapping, 'KeyW', [r'w', r'W', r'|', r''], 'W'); - verifyEntry(mapping, 'KeyX', [r'x', r'X', r'#', r''], 'X'); - verifyEntry(mapping, 'KeyY', [r'z', r'Z', r'', r''], 'Z'); - verifyEntry(mapping, 'KeyZ', [r'y', r'Y', r'', r''], 'Y'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'a'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'{', r''], 'b'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'&', r''], 'c'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'Đ', r''], 'd'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r''], 'e'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'[', r''], 'f'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r']', r''], 'g'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'h'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'i'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'j'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'ł', r''], 'k'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'Ł', r''], 'l'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'', r''], 'm'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'}', r''], 'n'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'o'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'p'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'\', r''], 'q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'r'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'đ', r''], 's'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 't'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'u'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'@', r''], 'v'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'|', r''], 'w'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'#', r''], 'x'); + verifyEntry(mapping, 'KeyY', [r'z', r'Z', r'', r''], 'z'); + verifyEntry(mapping, 'KeyZ', [r'y', r'Y', r'', r''], 'y'); }); group('de', () { @@ -70,32 +70,32 @@ void testWin(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'7', r'/', r'{', r''], '7'); verifyEntry(mapping, 'Digit8', [r'8', r'(', r'[', r''], '8'); verifyEntry(mapping, 'Digit9', [r'9', r')', r']', r''], '9'); - verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'A'); - verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'B'); - verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'C'); - verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'D'); - verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r''], 'E'); - verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'F'); - verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'G'); - verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'H'); - verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'I'); - verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'J'); - verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'K'); - verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'L'); - verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r''], 'M'); - verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'N'); - verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'O'); - verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'P'); - verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'@', r''], 'Q'); - verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'R'); - verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 'S'); - verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 'T'); - verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'U'); - verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'V'); - verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'W'); - verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'X'); - verifyEntry(mapping, 'KeyY', [r'z', r'Z', r'', r''], 'Z'); - verifyEntry(mapping, 'KeyZ', [r'y', r'Y', r'', r''], 'Y'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'a'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'b'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'c'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'd'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r''], 'e'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'f'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'g'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'h'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'i'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'j'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'k'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'l'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r''], 'm'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'n'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'o'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'p'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'@', r''], 'q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'r'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 's'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 't'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'u'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'v'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'w'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'x'); + verifyEntry(mapping, 'KeyY', [r'z', r'Z', r'', r''], 'z'); + verifyEntry(mapping, 'KeyZ', [r'y', r'Y', r'', r''], 'y'); }); group('de-swiss', () { @@ -109,32 +109,32 @@ void testWin(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'7', r'/', r'|', r''], '7'); verifyEntry(mapping, 'Digit8', [r'8', r'(', r'¢', r''], '8'); verifyEntry(mapping, 'Digit9', [r'9', r')', r'', r''], '9'); - verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'A'); - verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'B'); - verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'C'); - verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'D'); - verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r''], 'E'); - verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'F'); - verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'G'); - verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'H'); - verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'I'); - verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'J'); - verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'K'); - verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'L'); - verifyEntry(mapping, 'KeyM', [r'm', r'M', r'', r''], 'M'); - verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'N'); - verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'O'); - verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'P'); - verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'', r''], 'Q'); - verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'R'); - verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 'S'); - verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 'T'); - verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'U'); - verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'V'); - verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'W'); - verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'X'); - verifyEntry(mapping, 'KeyY', [r'z', r'Z', r'', r''], 'Z'); - verifyEntry(mapping, 'KeyZ', [r'y', r'Y', r'', r''], 'Y'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'a'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'b'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'c'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'd'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r''], 'e'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'f'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'g'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'h'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'i'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'j'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'k'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'l'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'', r''], 'm'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'n'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'o'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'p'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'', r''], 'q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'r'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 's'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 't'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'u'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'v'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'w'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'x'); + verifyEntry(mapping, 'KeyY', [r'z', r'Z', r'', r''], 'z'); + verifyEntry(mapping, 'KeyZ', [r'y', r'Y', r'', r''], 'y'); }); group('dk', () { @@ -148,32 +148,32 @@ void testWin(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'7', r'/', r'{', r''], '7'); verifyEntry(mapping, 'Digit8', [r'8', r'(', r'[', r''], '8'); verifyEntry(mapping, 'Digit9', [r'9', r')', r']', r''], '9'); - verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'A'); - verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'B'); - verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'C'); - verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'D'); - verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r''], 'E'); - verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'F'); - verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'G'); - verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'H'); - verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'I'); - verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'J'); - verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'K'); - verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'L'); - verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r''], 'M'); - verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'N'); - verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'O'); - verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'P'); - verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'', r''], 'Q'); - verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'R'); - verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 'S'); - verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 'T'); - verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'U'); - verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'V'); - verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'W'); - verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'X'); - verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'Y'); - verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'', r''], 'Z'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'a'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'b'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'c'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'd'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r''], 'e'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'f'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'g'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'h'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'i'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'j'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'k'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'l'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r''], 'm'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'n'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'o'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'p'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'', r''], 'q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'r'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 's'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 't'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'u'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'v'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'w'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'x'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'', r''], 'z'); }); group('en', () { @@ -187,32 +187,32 @@ void testWin(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'7', r'&', r'', r''], '7'); verifyEntry(mapping, 'Digit8', [r'8', r'*', r'', r''], '8'); verifyEntry(mapping, 'Digit9', [r'9', r'(', r'', r''], '9'); - verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'A'); - verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'B'); - verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'C'); - verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'D'); - verifyEntry(mapping, 'KeyE', [r'e', r'E', r'', r''], 'E'); - verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'F'); - verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'G'); - verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'H'); - verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'I'); - verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'J'); - verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'K'); - verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'L'); - verifyEntry(mapping, 'KeyM', [r'm', r'M', r'', r''], 'M'); - verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'N'); - verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'O'); - verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'P'); - verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'', r''], 'Q'); - verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'R'); - verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 'S'); - verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 'T'); - verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'U'); - verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'V'); - verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'W'); - verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'X'); - verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'Y'); - verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'', r''], 'Z'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'a'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'b'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'c'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'd'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'', r''], 'e'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'f'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'g'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'h'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'i'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'j'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'k'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'l'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'', r''], 'm'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'n'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'o'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'p'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'', r''], 'q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'r'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 's'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 't'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'u'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'v'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'w'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'x'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'', r''], 'z'); }); group('en-belgian', () { @@ -226,32 +226,32 @@ void testWin(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'è', r'7', r'', r''], '7'); verifyEntry(mapping, 'Digit8', [r'!', r'8', r'', r''], '8'); verifyEntry(mapping, 'Digit9', [r'ç', r'9', r'{', r''], '9'); - verifyEntry(mapping, 'KeyA', [r'q', r'Q', r'', r''], 'Q'); - verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'B'); - verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'C'); - verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'D'); - verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r''], 'E'); - verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'F'); - verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'G'); - verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'H'); - verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'I'); - verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'J'); - verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'K'); - verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'L'); - verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'N'); - verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'O'); - verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'P'); - verifyEntry(mapping, 'KeyQ', [r'a', r'A', r'', r''], 'A'); - verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'R'); - verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 'S'); - verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 'T'); - verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'U'); - verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'V'); - verifyEntry(mapping, 'KeyW', [r'z', r'Z', r'', r''], 'Z'); - verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'X'); - verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'Y'); - verifyEntry(mapping, 'KeyZ', [r'w', r'W', r'', r''], 'W'); - verifyEntry(mapping, 'Semicolon', [r'm', r'M', r'', r''], 'M'); + verifyEntry(mapping, 'KeyA', [r'q', r'Q', r'', r''], 'q'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'b'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'c'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'd'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r''], 'e'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'f'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'g'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'h'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'i'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'j'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'k'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'l'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'n'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'o'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'p'); + verifyEntry(mapping, 'KeyQ', [r'a', r'A', r'', r''], 'a'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'r'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 's'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 't'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'u'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'v'); + verifyEntry(mapping, 'KeyW', [r'z', r'Z', r'', r''], 'z'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'x'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'y'); + verifyEntry(mapping, 'KeyZ', [r'w', r'W', r'', r''], 'w'); + verifyEntry(mapping, 'Semicolon', [r'm', r'M', r'', r''], 'm'); }); group('en-in', () { @@ -265,32 +265,32 @@ void testWin(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'7', r'&', r'', r''], '7'); verifyEntry(mapping, 'Digit8', [r'8', r'*', r'', r''], '8'); verifyEntry(mapping, 'Digit9', [r'9', r'(', r'', r'˘'], '9'); - verifyEntry(mapping, 'KeyA', [r'a', r'A', r'ā', r'Ā'], 'A'); - verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'B'); - verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'C'); - verifyEntry(mapping, 'KeyD', [r'd', r'D', r'ḍ', r'Ḍ'], 'D'); - verifyEntry(mapping, 'KeyE', [r'e', r'E', r'ē', r'Ē'], 'E'); - verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'F'); - verifyEntry(mapping, 'KeyG', [r'g', r'G', r'ṅ', r'Ṅ'], 'G'); - verifyEntry(mapping, 'KeyH', [r'h', r'H', r'ḥ', r'Ḥ'], 'H'); - verifyEntry(mapping, 'KeyI', [r'i', r'I', r'ī', r'Ī'], 'I'); - verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'J'); - verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'K'); - verifyEntry(mapping, 'KeyL', [r'l', r'L', r'l̥', r'L̥'], 'L'); - verifyEntry(mapping, 'KeyM', [r'm', r'M', r'ṁ', r'Ṁ'], 'M'); - verifyEntry(mapping, 'KeyN', [r'n', r'N', r'ṇ', r'Ṇ'], 'N'); - verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ō', r'Ō'], 'O'); - verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'P'); - verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'æ', r'Æ'], 'Q'); - verifyEntry(mapping, 'KeyR', [r'r', r'R', r'r̥', r'R̥'], 'R'); - verifyEntry(mapping, 'KeyS', [r's', r'S', r'ś', r'Ś'], 'S'); - verifyEntry(mapping, 'KeyT', [r't', r'T', r'ṭ', r'Ṭ'], 'T'); - verifyEntry(mapping, 'KeyU', [r'u', r'U', r'ū', r'Ū'], 'U'); - verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'V'); - verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'W'); - verifyEntry(mapping, 'KeyX', [r'x', r'X', r'ṣ', r'Ṣ'], 'X'); - verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'ñ', r'Ñ'], 'Y'); - verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'', r''], 'Z'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'ā', r'Ā'], 'a'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'b'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'c'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'ḍ', r'Ḍ'], 'd'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'ē', r'Ē'], 'e'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'f'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'ṅ', r'Ṅ'], 'g'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'ḥ', r'Ḥ'], 'h'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'ī', r'Ī'], 'i'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'j'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'k'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'l̥', r'L̥'], 'l'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'ṁ', r'Ṁ'], 'm'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'ṇ', r'Ṇ'], 'n'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ō', r'Ō'], 'o'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'p'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'æ', r'Æ'], 'q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'r̥', r'R̥'], 'r'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'ś', r'Ś'], 's'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'ṭ', r'Ṭ'], 't'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'ū', r'Ū'], 'u'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'v'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'w'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'ṣ', r'Ṣ'], 'x'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'ñ', r'Ñ'], 'y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'', r''], 'z'); }); group('en-intl', () { @@ -304,32 +304,32 @@ void testWin(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'7', r'&', r'½', r''], '7'); verifyEntry(mapping, 'Digit8', [r'8', r'*', r'¾', r''], '8'); verifyEntry(mapping, 'Digit9', [r'9', r'(', r'‘', r''], '9'); - verifyEntry(mapping, 'KeyA', [r'a', r'A', r'á', r'Á'], 'A'); - verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'B'); - verifyEntry(mapping, 'KeyC', [r'c', r'C', r'©', r'¢'], 'C'); - verifyEntry(mapping, 'KeyD', [r'd', r'D', r'ð', r'Ð'], 'D'); - verifyEntry(mapping, 'KeyE', [r'e', r'E', r'é', r'É'], 'E'); - verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'F'); - verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'G'); - verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'H'); - verifyEntry(mapping, 'KeyI', [r'i', r'I', r'í', r'Í'], 'I'); - verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'J'); - verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'K'); - verifyEntry(mapping, 'KeyL', [r'l', r'L', r'ø', r'Ø'], 'L'); - verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r''], 'M'); - verifyEntry(mapping, 'KeyN', [r'n', r'N', r'ñ', r'Ñ'], 'N'); - verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ó', r'Ó'], 'O'); - verifyEntry(mapping, 'KeyP', [r'p', r'P', r'ö', r'Ö'], 'P'); - verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'ä', r'Ä'], 'Q'); - verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r''], 'R'); - verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r'§'], 'S'); - verifyEntry(mapping, 'KeyT', [r't', r'T', r'þ', r'Þ'], 'T'); - verifyEntry(mapping, 'KeyU', [r'u', r'U', r'ú', r'Ú'], 'U'); - verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'V'); - verifyEntry(mapping, 'KeyW', [r'w', r'W', r'å', r'Å'], 'W'); - verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'X'); - verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'ü', r'Ü'], 'Y'); - verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'æ', r'Æ'], 'Z'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'á', r'Á'], 'a'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'b'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'©', r'¢'], 'c'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'ð', r'Ð'], 'd'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'é', r'É'], 'e'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'f'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'g'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'h'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'í', r'Í'], 'i'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'j'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'k'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'ø', r'Ø'], 'l'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r''], 'm'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'ñ', r'Ñ'], 'n'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ó', r'Ó'], 'o'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'ö', r'Ö'], 'p'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'ä', r'Ä'], 'q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r''], 'r'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r'§'], 's'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'þ', r'Þ'], 't'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'ú', r'Ú'], 'u'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'v'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'å', r'Å'], 'w'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'x'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'ü', r'Ü'], 'y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'æ', r'Æ'], 'z'); }); group('en-uk', () { @@ -343,32 +343,32 @@ void testWin(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'7', r'&', r'', r''], '7'); verifyEntry(mapping, 'Digit8', [r'8', r'*', r'', r''], '8'); verifyEntry(mapping, 'Digit9', [r'9', r'(', r'', r''], '9'); - verifyEntry(mapping, 'KeyA', [r'a', r'A', r'á', r'Á'], 'A'); - verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'B'); - verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'C'); - verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'D'); - verifyEntry(mapping, 'KeyE', [r'e', r'E', r'é', r'É'], 'E'); - verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'F'); - verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'G'); - verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'H'); - verifyEntry(mapping, 'KeyI', [r'i', r'I', r'í', r'Í'], 'I'); - verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'J'); - verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'K'); - verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'L'); - verifyEntry(mapping, 'KeyM', [r'm', r'M', r'', r''], 'M'); - verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'N'); - verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ó', r'Ó'], 'O'); - verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'P'); - verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'', r''], 'Q'); - verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'R'); - verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 'S'); - verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 'T'); - verifyEntry(mapping, 'KeyU', [r'u', r'U', r'ú', r'Ú'], 'U'); - verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'V'); - verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'W'); - verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'X'); - verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'Y'); - verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'', r''], 'Z'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'á', r'Á'], 'a'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'b'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'c'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'd'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'é', r'É'], 'e'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'f'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'g'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'h'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'í', r'Í'], 'i'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'j'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'k'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'l'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'', r''], 'm'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'n'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ó', r'Ó'], 'o'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'p'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'', r''], 'q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'r'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 's'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 't'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'ú', r'Ú'], 'u'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'v'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'w'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'x'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'', r''], 'z'); }); group('es', () { @@ -382,32 +382,32 @@ void testWin(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'7', r'/', r'', r''], '7'); verifyEntry(mapping, 'Digit8', [r'8', r'(', r'', r''], '8'); verifyEntry(mapping, 'Digit9', [r'9', r')', r'', r''], '9'); - verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'A'); - verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'B'); - verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'C'); - verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'D'); - verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r''], 'E'); - verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'F'); - verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'G'); - verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'H'); - verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'I'); - verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'J'); - verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'K'); - verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'L'); - verifyEntry(mapping, 'KeyM', [r'm', r'M', r'', r''], 'M'); - verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'N'); - verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'O'); - verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'P'); - verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'', r''], 'Q'); - verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'R'); - verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 'S'); - verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 'T'); - verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'U'); - verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'V'); - verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'W'); - verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'X'); - verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'Y'); - verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'', r''], 'Z'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'a'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'b'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'c'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'd'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r''], 'e'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'f'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'g'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'h'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'i'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'j'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'k'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'l'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'', r''], 'm'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'n'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'o'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'p'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'', r''], 'q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'r'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 's'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 't'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'u'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'v'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'w'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'x'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'', r''], 'z'); }); group('es-latin', () { @@ -421,32 +421,32 @@ void testWin(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'7', r'/', r'', r''], '7'); verifyEntry(mapping, 'Digit8', [r'8', r'(', r'', r''], '8'); verifyEntry(mapping, 'Digit9', [r'9', r')', r'', r''], '9'); - verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'A'); - verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'B'); - verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'C'); - verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'D'); - verifyEntry(mapping, 'KeyE', [r'e', r'E', r'', r''], 'E'); - verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'F'); - verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'G'); - verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'H'); - verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'I'); - verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'J'); - verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'K'); - verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'L'); - verifyEntry(mapping, 'KeyM', [r'm', r'M', r'', r''], 'M'); - verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'N'); - verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'O'); - verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'P'); - verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'@', r''], 'Q'); - verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'R'); - verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 'S'); - verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 'T'); - verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'U'); - verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'V'); - verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'W'); - verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'X'); - verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'Y'); - verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'', r''], 'Z'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'a'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'b'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'c'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'd'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'', r''], 'e'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'f'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'g'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'h'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'i'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'j'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'k'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'l'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'', r''], 'm'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'n'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'o'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'p'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'@', r''], 'q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'r'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 's'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 't'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'u'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'v'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'w'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'x'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'', r''], 'z'); }); group('fr', () { @@ -460,32 +460,32 @@ void testWin(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'è', r'7', r'`', r''], '7'); verifyEntry(mapping, 'Digit8', [r'_', r'8', r'\', r''], '8'); verifyEntry(mapping, 'Digit9', [r'ç', r'9', r'^', r''], '9'); - verifyEntry(mapping, 'KeyA', [r'q', r'Q', r'', r''], 'Q'); - verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'B'); - verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'C'); - verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'D'); - verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r''], 'E'); - verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'F'); - verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'G'); - verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'H'); - verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'I'); - verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'J'); - verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'K'); - verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'L'); - verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'N'); - verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'O'); - verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'P'); - verifyEntry(mapping, 'KeyQ', [r'a', r'A', r'', r''], 'A'); - verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'R'); - verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 'S'); - verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 'T'); - verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'U'); - verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'V'); - verifyEntry(mapping, 'KeyW', [r'z', r'Z', r'', r''], 'Z'); - verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'X'); - verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'Y'); - verifyEntry(mapping, 'KeyZ', [r'w', r'W', r'', r''], 'W'); - verifyEntry(mapping, 'Semicolon', [r'm', r'M', r'', r''], 'M'); + verifyEntry(mapping, 'KeyA', [r'q', r'Q', r'', r''], 'q'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'b'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'c'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'd'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r''], 'e'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'f'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'g'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'h'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'i'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'j'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'k'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'l'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'n'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'o'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'p'); + verifyEntry(mapping, 'KeyQ', [r'a', r'A', r'', r''], 'a'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'r'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 's'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 't'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'u'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'v'); + verifyEntry(mapping, 'KeyW', [r'z', r'Z', r'', r''], 'z'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'x'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'y'); + verifyEntry(mapping, 'KeyZ', [r'w', r'W', r'', r''], 'w'); + verifyEntry(mapping, 'Semicolon', [r'm', r'M', r'', r''], 'm'); }); group('hu', () { @@ -499,32 +499,32 @@ void testWin(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'7', r'=', r'`', r''], '7'); verifyEntry(mapping, 'Digit8', [r'8', r'(', r'˙', r''], '8'); verifyEntry(mapping, 'Digit9', [r'9', r')', r'´', r''], '9'); - verifyEntry(mapping, 'KeyA', [r'a', r'A', r'ä', r''], 'A'); - verifyEntry(mapping, 'KeyB', [r'b', r'B', r'{', r''], 'B'); - verifyEntry(mapping, 'KeyC', [r'c', r'C', r'&', r''], 'C'); - verifyEntry(mapping, 'KeyD', [r'd', r'D', r'Đ', r''], 'D'); - verifyEntry(mapping, 'KeyE', [r'e', r'E', r'Ä', r''], 'E'); - verifyEntry(mapping, 'KeyF', [r'f', r'F', r'[', r''], 'F'); - verifyEntry(mapping, 'KeyG', [r'g', r'G', r']', r''], 'G'); - verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'H'); - verifyEntry(mapping, 'KeyI', [r'i', r'I', r'Í', r''], 'I'); - verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'í', r''], 'J'); - verifyEntry(mapping, 'KeyK', [r'k', r'K', r'ł', r''], 'K'); - verifyEntry(mapping, 'KeyL', [r'l', r'L', r'Ł', r''], 'L'); - verifyEntry(mapping, 'KeyM', [r'm', r'M', r'<', r''], 'M'); - verifyEntry(mapping, 'KeyN', [r'n', r'N', r'}', r''], 'N'); - verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'O'); - verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'P'); - verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'\', r''], 'Q'); - verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'R'); - verifyEntry(mapping, 'KeyS', [r's', r'S', r'đ', r''], 'S'); - verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 'T'); - verifyEntry(mapping, 'KeyU', [r'u', r'U', r'€', r''], 'U'); - verifyEntry(mapping, 'KeyV', [r'v', r'V', r'@', r''], 'V'); - verifyEntry(mapping, 'KeyW', [r'w', r'W', r'|', r''], 'W'); - verifyEntry(mapping, 'KeyX', [r'x', r'X', r'#', r''], 'X'); - verifyEntry(mapping, 'KeyY', [r'z', r'Z', r'', r''], 'Z'); - verifyEntry(mapping, 'KeyZ', [r'y', r'Y', r'>', r''], 'Y'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'ä', r''], 'a'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'{', r''], 'b'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'&', r''], 'c'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'Đ', r''], 'd'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'Ä', r''], 'e'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'[', r''], 'f'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r']', r''], 'g'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'h'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'Í', r''], 'i'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'í', r''], 'j'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'ł', r''], 'k'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'Ł', r''], 'l'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'<', r''], 'm'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'}', r''], 'n'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'o'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'p'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'\', r''], 'q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'r'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'đ', r''], 's'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 't'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'€', r''], 'u'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'@', r''], 'v'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'|', r''], 'w'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'#', r''], 'x'); + verifyEntry(mapping, 'KeyY', [r'z', r'Z', r'', r''], 'z'); + verifyEntry(mapping, 'KeyZ', [r'y', r'Y', r'>', r''], 'y'); }); group('it', () { @@ -538,32 +538,32 @@ void testWin(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'7', r'/', r'', r''], '7'); verifyEntry(mapping, 'Digit8', [r'8', r'(', r'', r''], '8'); verifyEntry(mapping, 'Digit9', [r'9', r')', r'', r''], '9'); - verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'A'); - verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'B'); - verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'C'); - verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'D'); - verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r''], 'E'); - verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'F'); - verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'G'); - verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'H'); - verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'I'); - verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'J'); - verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'K'); - verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'L'); - verifyEntry(mapping, 'KeyM', [r'm', r'M', r'', r''], 'M'); - verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'N'); - verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'O'); - verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'P'); - verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'', r''], 'Q'); - verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'R'); - verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 'S'); - verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 'T'); - verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'U'); - verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'V'); - verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'W'); - verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'X'); - verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'Y'); - verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'', r''], 'Z'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'a'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'b'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'c'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'd'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r''], 'e'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'f'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'g'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'h'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'i'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'j'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'k'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'l'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'', r''], 'm'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'n'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'o'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'p'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'', r''], 'q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'r'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 's'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 't'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'u'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'v'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'w'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'x'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'', r''], 'z'); }); group('no', () { @@ -577,32 +577,32 @@ void testWin(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'7', r'/', r'{', r''], '7'); verifyEntry(mapping, 'Digit8', [r'8', r'(', r'[', r''], '8'); verifyEntry(mapping, 'Digit9', [r'9', r')', r']', r''], '9'); - verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'A'); - verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'B'); - verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'C'); - verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'D'); - verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r''], 'E'); - verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'F'); - verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'G'); - verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'H'); - verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'I'); - verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'J'); - verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'K'); - verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'L'); - verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r''], 'M'); - verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'N'); - verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'O'); - verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'P'); - verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'', r''], 'Q'); - verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'R'); - verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 'S'); - verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 'T'); - verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'U'); - verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'V'); - verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'W'); - verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'X'); - verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'Y'); - verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'', r''], 'Z'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'a'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'b'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'c'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'd'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r''], 'e'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'f'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'g'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'h'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'i'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'j'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'k'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'l'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r''], 'm'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'n'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'o'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'p'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'', r''], 'q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'r'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 's'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 't'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'u'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'v'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'w'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'x'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'', r''], 'z'); }); group('pl', () { @@ -616,32 +616,32 @@ void testWin(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'7', r'&', r'', r''], '7'); verifyEntry(mapping, 'Digit8', [r'8', r'*', r'', r''], '8'); verifyEntry(mapping, 'Digit9', [r'9', r'(', r'', r''], '9'); - verifyEntry(mapping, 'KeyA', [r'a', r'A', r'ą', r'Ą'], 'A'); - verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'B'); - verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ć', r'Ć'], 'C'); - verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'D'); - verifyEntry(mapping, 'KeyE', [r'e', r'E', r'ę', r'Ę'], 'E'); - verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'F'); - verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'G'); - verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'H'); - verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'I'); - verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'J'); - verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'K'); - verifyEntry(mapping, 'KeyL', [r'l', r'L', r'ł', r'Ł'], 'L'); - verifyEntry(mapping, 'KeyM', [r'm', r'M', r'', r''], 'M'); - verifyEntry(mapping, 'KeyN', [r'n', r'N', r'ń', r'Ń'], 'N'); - verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ó', r'Ó'], 'O'); - verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'P'); - verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'', r''], 'Q'); - verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'R'); - verifyEntry(mapping, 'KeyS', [r's', r'S', r'ś', r'Ś'], 'S'); - verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 'T'); - verifyEntry(mapping, 'KeyU', [r'u', r'U', r'€', r''], 'U'); - verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'V'); - verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'W'); - verifyEntry(mapping, 'KeyX', [r'x', r'X', r'ź', r'Ź'], 'X'); - verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'Y'); - verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'ż', r'Ż'], 'Z'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'ą', r'Ą'], 'a'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'b'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ć', r'Ć'], 'c'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'd'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'ę', r'Ę'], 'e'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'f'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'g'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'h'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'i'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'j'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'k'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'ł', r'Ł'], 'l'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'', r''], 'm'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'ń', r'Ń'], 'n'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ó', r'Ó'], 'o'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'p'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'', r''], 'q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'r'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'ś', r'Ś'], 's'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 't'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'€', r''], 'u'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'v'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'w'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'ź', r'Ź'], 'x'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'ż', r'Ż'], 'z'); }); group('pt', () { @@ -655,32 +655,32 @@ void testWin(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'7', r'/', r'{', r''], '7'); verifyEntry(mapping, 'Digit8', [r'8', r'(', r'[', r''], '8'); verifyEntry(mapping, 'Digit9', [r'9', r')', r']', r''], '9'); - verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'A'); - verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'B'); - verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'C'); - verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'D'); - verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r''], 'E'); - verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'F'); - verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'G'); - verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'H'); - verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'I'); - verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'J'); - verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'K'); - verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'L'); - verifyEntry(mapping, 'KeyM', [r'm', r'M', r'', r''], 'M'); - verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'N'); - verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'O'); - verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'P'); - verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'', r''], 'Q'); - verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'R'); - verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 'S'); - verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 'T'); - verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'U'); - verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'V'); - verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'W'); - verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'X'); - verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'Y'); - verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'', r''], 'Z'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'a'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'b'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'c'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'd'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r''], 'e'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'f'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'g'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'h'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'i'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'j'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'k'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'l'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'', r''], 'm'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'n'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'o'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'p'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'', r''], 'q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'r'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 's'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 't'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'u'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'v'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'w'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'x'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'', r''], 'z'); }); group('pt-br', () { @@ -694,32 +694,32 @@ void testWin(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'7', r'&', r'', r''], '7'); verifyEntry(mapping, 'Digit8', [r'8', r'*', r'', r''], '8'); verifyEntry(mapping, 'Digit9', [r'9', r'(', r'', r''], '9'); - verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'A'); - verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'B'); - verifyEntry(mapping, 'KeyC', [r'c', r'C', r'₢', r''], 'C'); - verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'D'); - verifyEntry(mapping, 'KeyE', [r'e', r'E', r'°', r''], 'E'); - verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'F'); - verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'G'); - verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'H'); - verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'I'); - verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'J'); - verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'K'); - verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'L'); - verifyEntry(mapping, 'KeyM', [r'm', r'M', r'', r''], 'M'); - verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'N'); - verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'O'); - verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'P'); - verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'/', r''], 'Q'); - verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'R'); - verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 'S'); - verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 'T'); - verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'U'); - verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'V'); - verifyEntry(mapping, 'KeyW', [r'w', r'W', r'?', r''], 'W'); - verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'X'); - verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'Y'); - verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'', r''], 'Z'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'a'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'b'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'₢', r''], 'c'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'd'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'°', r''], 'e'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'f'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'g'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'h'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'i'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'j'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'k'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'l'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'', r''], 'm'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'n'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'o'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'p'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'/', r''], 'q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'r'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 's'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 't'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'u'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'v'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'?', r''], 'w'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'x'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'', r''], 'z'); }); group('ru', () { @@ -733,32 +733,32 @@ void testWin(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'7', r'?', r'', r''], '7'); verifyEntry(mapping, 'Digit8', [r'8', r'*', r'₽', r''], '8'); verifyEntry(mapping, 'Digit9', [r'9', r'(', r'', r''], '9'); - verifyEntry(mapping, 'KeyA', [r'ф', r'Ф', r'', r''], 'A'); - verifyEntry(mapping, 'KeyB', [r'и', r'И', r'', r''], 'B'); - verifyEntry(mapping, 'KeyC', [r'с', r'С', r'', r''], 'C'); - verifyEntry(mapping, 'KeyD', [r'в', r'В', r'', r''], 'D'); - verifyEntry(mapping, 'KeyE', [r'у', r'У', r'', r''], 'E'); - verifyEntry(mapping, 'KeyF', [r'а', r'А', r'', r''], 'F'); - verifyEntry(mapping, 'KeyG', [r'п', r'П', r'', r''], 'G'); - verifyEntry(mapping, 'KeyH', [r'р', r'Р', r'', r''], 'H'); - verifyEntry(mapping, 'KeyI', [r'ш', r'Ш', r'', r''], 'I'); - verifyEntry(mapping, 'KeyJ', [r'о', r'О', r'', r''], 'J'); - verifyEntry(mapping, 'KeyK', [r'л', r'Л', r'', r''], 'K'); - verifyEntry(mapping, 'KeyL', [r'д', r'Д', r'', r''], 'L'); - verifyEntry(mapping, 'KeyM', [r'ь', r'Ь', r'', r''], 'M'); - verifyEntry(mapping, 'KeyN', [r'т', r'Т', r'', r''], 'N'); - verifyEntry(mapping, 'KeyO', [r'щ', r'Щ', r'', r''], 'O'); - verifyEntry(mapping, 'KeyP', [r'з', r'З', r'', r''], 'P'); - verifyEntry(mapping, 'KeyQ', [r'й', r'Й', r'', r''], 'Q'); - verifyEntry(mapping, 'KeyR', [r'к', r'К', r'', r''], 'R'); - verifyEntry(mapping, 'KeyS', [r'ы', r'Ы', r'', r''], 'S'); - verifyEntry(mapping, 'KeyT', [r'е', r'Е', r'', r''], 'T'); - verifyEntry(mapping, 'KeyU', [r'г', r'Г', r'', r''], 'U'); - verifyEntry(mapping, 'KeyV', [r'м', r'М', r'', r''], 'V'); - verifyEntry(mapping, 'KeyW', [r'ц', r'Ц', r'', r''], 'W'); - verifyEntry(mapping, 'KeyX', [r'ч', r'Ч', r'', r''], 'X'); - verifyEntry(mapping, 'KeyY', [r'н', r'Н', r'', r''], 'Y'); - verifyEntry(mapping, 'KeyZ', [r'я', r'Я', r'', r''], 'Z'); + verifyEntry(mapping, 'KeyA', [r'ф', r'Ф', r'', r''], 'a'); + verifyEntry(mapping, 'KeyB', [r'и', r'И', r'', r''], 'b'); + verifyEntry(mapping, 'KeyC', [r'с', r'С', r'', r''], 'c'); + verifyEntry(mapping, 'KeyD', [r'в', r'В', r'', r''], 'd'); + verifyEntry(mapping, 'KeyE', [r'у', r'У', r'', r''], 'e'); + verifyEntry(mapping, 'KeyF', [r'а', r'А', r'', r''], 'f'); + verifyEntry(mapping, 'KeyG', [r'п', r'П', r'', r''], 'g'); + verifyEntry(mapping, 'KeyH', [r'р', r'Р', r'', r''], 'h'); + verifyEntry(mapping, 'KeyI', [r'ш', r'Ш', r'', r''], 'i'); + verifyEntry(mapping, 'KeyJ', [r'о', r'О', r'', r''], 'j'); + verifyEntry(mapping, 'KeyK', [r'л', r'Л', r'', r''], 'k'); + verifyEntry(mapping, 'KeyL', [r'д', r'Д', r'', r''], 'l'); + verifyEntry(mapping, 'KeyM', [r'ь', r'Ь', r'', r''], 'm'); + verifyEntry(mapping, 'KeyN', [r'т', r'Т', r'', r''], 'n'); + verifyEntry(mapping, 'KeyO', [r'щ', r'Щ', r'', r''], 'o'); + verifyEntry(mapping, 'KeyP', [r'з', r'З', r'', r''], 'p'); + verifyEntry(mapping, 'KeyQ', [r'й', r'Й', r'', r''], 'q'); + verifyEntry(mapping, 'KeyR', [r'к', r'К', r'', r''], 'r'); + verifyEntry(mapping, 'KeyS', [r'ы', r'Ы', r'', r''], 's'); + verifyEntry(mapping, 'KeyT', [r'е', r'Е', r'', r''], 't'); + verifyEntry(mapping, 'KeyU', [r'г', r'Г', r'', r''], 'u'); + verifyEntry(mapping, 'KeyV', [r'м', r'М', r'', r''], 'v'); + verifyEntry(mapping, 'KeyW', [r'ц', r'Ц', r'', r''], 'w'); + verifyEntry(mapping, 'KeyX', [r'ч', r'Ч', r'', r''], 'x'); + verifyEntry(mapping, 'KeyY', [r'н', r'Н', r'', r''], 'y'); + verifyEntry(mapping, 'KeyZ', [r'я', r'Я', r'', r''], 'z'); }); group('sv', () { @@ -772,32 +772,32 @@ void testWin(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'7', r'/', r'{', r''], '7'); verifyEntry(mapping, 'Digit8', [r'8', r'(', r'[', r''], '8'); verifyEntry(mapping, 'Digit9', [r'9', r')', r']', r''], '9'); - verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'A'); - verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'B'); - verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'C'); - verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'D'); - verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r''], 'E'); - verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'F'); - verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'G'); - verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'H'); - verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'I'); - verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'J'); - verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'K'); - verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'L'); - verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r''], 'M'); - verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'N'); - verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'O'); - verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'P'); - verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'', r''], 'Q'); - verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'R'); - verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 'S'); - verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 'T'); - verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'U'); - verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'V'); - verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'W'); - verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'X'); - verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'Y'); - verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'', r''], 'Z'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'a'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'b'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'c'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'd'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r''], 'e'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'f'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'g'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'h'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'', r''], 'i'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'j'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'k'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'l'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r''], 'm'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'n'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'o'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'p'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'', r''], 'q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'r'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'', r''], 's'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'', r''], 't'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'u'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'v'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'w'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'x'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'', r''], 'z'); }); group('thai', () { @@ -811,32 +811,32 @@ void testWin(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'ึ', r'฿', r'', r''], '7'); verifyEntry(mapping, 'Digit8', [r'ค', r'๕', r'', r''], '8'); verifyEntry(mapping, 'Digit9', [r'ต', r'๖', r'', r''], '9'); - verifyEntry(mapping, 'KeyA', [r'ฟ', r'ฤ', r'', r''], 'A'); - verifyEntry(mapping, 'KeyB', [r'ิ', r'ฺ', r'', r''], 'B'); - verifyEntry(mapping, 'KeyC', [r'แ', r'ฉ', r'', r''], 'C'); - verifyEntry(mapping, 'KeyD', [r'ก', r'ฏ', r'', r''], 'D'); - verifyEntry(mapping, 'KeyE', [r'ำ', r'ฎ', r'', r''], 'E'); - verifyEntry(mapping, 'KeyF', [r'ด', r'โ', r'', r''], 'F'); - verifyEntry(mapping, 'KeyG', [r'เ', r'ฌ', r'', r''], 'G'); - verifyEntry(mapping, 'KeyH', [r'้', r'็', r'', r''], 'H'); - verifyEntry(mapping, 'KeyI', [r'ร', r'ณ', r'', r''], 'I'); - verifyEntry(mapping, 'KeyJ', [r'่', r'๋', r'', r''], 'J'); - verifyEntry(mapping, 'KeyK', [r'า', r'ษ', r'', r''], 'K'); - verifyEntry(mapping, 'KeyL', [r'ส', r'ศ', r'', r''], 'L'); - verifyEntry(mapping, 'KeyM', [r'ท', r'?', r'', r''], 'M'); - verifyEntry(mapping, 'KeyN', [r'ื', r'์', r'', r''], 'N'); - verifyEntry(mapping, 'KeyO', [r'น', r'ฯ', r'', r''], 'O'); - verifyEntry(mapping, 'KeyP', [r'ย', r'ญ', r'', r''], 'P'); - verifyEntry(mapping, 'KeyQ', [r'ๆ', r'๐', r'', r''], 'Q'); - verifyEntry(mapping, 'KeyR', [r'พ', r'ฑ', r'', r''], 'R'); - verifyEntry(mapping, 'KeyS', [r'ห', r'ฆ', r'', r''], 'S'); - verifyEntry(mapping, 'KeyT', [r'ะ', r'ธ', r'', r''], 'T'); - verifyEntry(mapping, 'KeyU', [r'ี', r'๊', r'', r''], 'U'); - verifyEntry(mapping, 'KeyV', [r'อ', r'ฮ', r'', r''], 'V'); - verifyEntry(mapping, 'KeyW', [r'ไ', r'"', r'', r''], 'W'); - verifyEntry(mapping, 'KeyX', [r'ป', r')', r'', r''], 'X'); - verifyEntry(mapping, 'KeyY', [r'ั', r'ํ', r'', r''], 'Y'); - verifyEntry(mapping, 'KeyZ', [r'ผ', r'(', r'', r''], 'Z'); + verifyEntry(mapping, 'KeyA', [r'ฟ', r'ฤ', r'', r''], 'a'); + verifyEntry(mapping, 'KeyB', [r'ิ', r'ฺ', r'', r''], 'b'); + verifyEntry(mapping, 'KeyC', [r'แ', r'ฉ', r'', r''], 'c'); + verifyEntry(mapping, 'KeyD', [r'ก', r'ฏ', r'', r''], 'd'); + verifyEntry(mapping, 'KeyE', [r'ำ', r'ฎ', r'', r''], 'e'); + verifyEntry(mapping, 'KeyF', [r'ด', r'โ', r'', r''], 'f'); + verifyEntry(mapping, 'KeyG', [r'เ', r'ฌ', r'', r''], 'g'); + verifyEntry(mapping, 'KeyH', [r'้', r'็', r'', r''], 'h'); + verifyEntry(mapping, 'KeyI', [r'ร', r'ณ', r'', r''], 'i'); + verifyEntry(mapping, 'KeyJ', [r'่', r'๋', r'', r''], 'j'); + verifyEntry(mapping, 'KeyK', [r'า', r'ษ', r'', r''], 'k'); + verifyEntry(mapping, 'KeyL', [r'ส', r'ศ', r'', r''], 'l'); + verifyEntry(mapping, 'KeyM', [r'ท', r'?', r'', r''], 'm'); + verifyEntry(mapping, 'KeyN', [r'ื', r'์', r'', r''], 'n'); + verifyEntry(mapping, 'KeyO', [r'น', r'ฯ', r'', r''], 'o'); + verifyEntry(mapping, 'KeyP', [r'ย', r'ญ', r'', r''], 'p'); + verifyEntry(mapping, 'KeyQ', [r'ๆ', r'๐', r'', r''], 'q'); + verifyEntry(mapping, 'KeyR', [r'พ', r'ฑ', r'', r''], 'r'); + verifyEntry(mapping, 'KeyS', [r'ห', r'ฆ', r'', r''], 's'); + verifyEntry(mapping, 'KeyT', [r'ะ', r'ธ', r'', r''], 't'); + verifyEntry(mapping, 'KeyU', [r'ี', r'๊', r'', r''], 'u'); + verifyEntry(mapping, 'KeyV', [r'อ', r'ฮ', r'', r''], 'v'); + verifyEntry(mapping, 'KeyW', [r'ไ', r'"', r'', r''], 'w'); + verifyEntry(mapping, 'KeyX', [r'ป', r')', r'', r''], 'x'); + verifyEntry(mapping, 'KeyY', [r'ั', r'ํ', r'', r''], 'y'); + verifyEntry(mapping, 'KeyZ', [r'ผ', r'(', r'', r''], 'z'); }); group('tr', () { @@ -850,32 +850,32 @@ void testWin(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'7', r'/', r'{', r''], '7'); verifyEntry(mapping, 'Digit8', [r'8', r'(', r'[', r''], '8'); verifyEntry(mapping, 'Digit9', [r'9', r')', r']', r''], '9'); - verifyEntry(mapping, 'KeyA', [r'a', r'A', r'æ', r'Æ'], 'A'); - verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'B'); - verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'C'); - verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'D'); - verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r''], 'E'); - verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'F'); - verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'G'); - verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'H'); - verifyEntry(mapping, 'KeyI', [r'ı', r'I', r'i', r'İ'], 'I'); - verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'J'); - verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'K'); - verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'L'); - verifyEntry(mapping, 'KeyM', [r'm', r'M', r'', r''], 'M'); - verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'N'); - verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'O'); - verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'P'); - verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'@', r''], 'Q'); - verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'R'); - verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r''], 'S'); - verifyEntry(mapping, 'KeyT', [r't', r'T', r'₺', r''], 'T'); - verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'U'); - verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'V'); - verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'W'); - verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'X'); - verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'Y'); - verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'', r''], 'Z'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'æ', r'Æ'], 'a'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'b'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'c'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'', r''], 'd'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r''], 'e'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'', r''], 'f'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r''], 'g'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'', r''], 'h'); + verifyEntry(mapping, 'KeyI', [r'ı', r'I', r'i', r'İ'], 'i'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'', r''], 'j'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'', r''], 'k'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'', r''], 'l'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'', r''], 'm'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'', r''], 'n'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'', r''], 'o'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'', r''], 'p'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'@', r''], 'q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'', r''], 'r'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r''], 's'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'₺', r''], 't'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'', r''], 'u'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'', r''], 'v'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'', r''], 'w'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'', r''], 'x'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'', r''], 'y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'', r''], 'z'); }); } @@ -891,32 +891,32 @@ void testLinux(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'7', r'/', r'{', r'⅞'], '7'); verifyEntry(mapping, 'Digit8', [r'8', r'(', r'[', r'™'], '8'); verifyEntry(mapping, 'Digit9', [r'9', r')', r']', r'±'], '9'); - verifyEntry(mapping, 'KeyA', [r'a', r'A', r'æ', r'Æ'], 'A'); - verifyEntry(mapping, 'KeyB', [r'b', r'B', r'“', r'‘'], 'B'); - verifyEntry(mapping, 'KeyC', [r'c', r'C', r'¢', r'©'], 'C'); - verifyEntry(mapping, 'KeyD', [r'd', r'D', r'ð', r'Ð'], 'D'); - verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r'€'], 'E'); - verifyEntry(mapping, 'KeyF', [r'f', r'F', r'đ', r'ª'], 'F'); - verifyEntry(mapping, 'KeyG', [r'g', r'G', r'ŋ', r'Ŋ'], 'G'); - verifyEntry(mapping, 'KeyH', [r'h', r'H', r'ħ', r'Ħ'], 'H'); - verifyEntry(mapping, 'KeyI', [r'i', r'I', r'→', r'ı'], 'I'); - verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'̣', r'̇'], 'J'); - verifyEntry(mapping, 'KeyK', [r'k', r'K', r'ĸ', r'&'], 'K'); - verifyEntry(mapping, 'KeyL', [r'l', r'L', r'ł', r'Ł'], 'L'); - verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r'º'], 'M'); - verifyEntry(mapping, 'KeyN', [r'n', r'N', r'”', r'’'], 'N'); - verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'O'); - verifyEntry(mapping, 'KeyP', [r'p', r'P', r'þ', r'Þ'], 'P'); - verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'@', r'Ω'], 'Q'); - verifyEntry(mapping, 'KeyR', [r'r', r'R', r'¶', r'®'], 'R'); - verifyEntry(mapping, 'KeyS', [r's', r'S', r'ſ', r'ẞ'], 'S'); - verifyEntry(mapping, 'KeyT', [r't', r'T', r'ŧ', r'Ŧ'], 'T'); - verifyEntry(mapping, 'KeyU', [r'u', r'U', r'↓', r'↑'], 'U'); - verifyEntry(mapping, 'KeyV', [r'v', r'V', r'„', r'‚'], 'V'); - verifyEntry(mapping, 'KeyW', [r'w', r'W', r'ł', r'Ł'], 'W'); - verifyEntry(mapping, 'KeyX', [r'x', r'X', r'«', r'‹'], 'X'); - verifyEntry(mapping, 'KeyY', [r'z', r'Z', r'←', r'¥'], 'Z'); - verifyEntry(mapping, 'KeyZ', [r'y', r'Y', r'»', r'›'], 'Y'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'æ', r'Æ'], 'a'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'“', r'‘'], 'b'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'¢', r'©'], 'c'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'ð', r'Ð'], 'd'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r'€'], 'e'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'đ', r'ª'], 'f'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'ŋ', r'Ŋ'], 'g'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'ħ', r'Ħ'], 'h'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'→', r'ı'], 'i'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'̣', r'̇'], 'j'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'ĸ', r'&'], 'k'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'ł', r'Ł'], 'l'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r'º'], 'm'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'”', r'’'], 'n'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'o'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'þ', r'Þ'], 'p'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'@', r'Ω'], 'q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'¶', r'®'], 'r'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'ſ', r'ẞ'], 's'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'ŧ', r'Ŧ'], 't'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'↓', r'↑'], 'u'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'„', r'‚'], 'v'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'ł', r'Ł'], 'w'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'«', r'‹'], 'x'); + verifyEntry(mapping, 'KeyY', [r'z', r'Z', r'←', r'¥'], 'z'); + verifyEntry(mapping, 'KeyZ', [r'y', r'Y', r'»', r'›'], 'y'); }); group('en', () { @@ -930,32 +930,32 @@ void testLinux(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'7', r'&', r'7', r'&'], '7'); verifyEntry(mapping, 'Digit8', [r'8', r'*', r'8', r'*'], '8'); verifyEntry(mapping, 'Digit9', [r'9', r'(', r'9', r'('], '9'); - verifyEntry(mapping, 'KeyA', [r'a', r'A', r'a', r'A'], 'A'); - verifyEntry(mapping, 'KeyB', [r'b', r'B', r'b', r'B'], 'B'); - verifyEntry(mapping, 'KeyC', [r'c', r'C', r'c', r'C'], 'C'); - verifyEntry(mapping, 'KeyD', [r'd', r'D', r'd', r'D'], 'D'); - verifyEntry(mapping, 'KeyE', [r'e', r'E', r'e', r'E'], 'E'); - verifyEntry(mapping, 'KeyF', [r'f', r'F', r'f', r'F'], 'F'); - verifyEntry(mapping, 'KeyG', [r'g', r'G', r'g', r'G'], 'G'); - verifyEntry(mapping, 'KeyH', [r'h', r'H', r'h', r'H'], 'H'); - verifyEntry(mapping, 'KeyI', [r'i', r'I', r'i', r'I'], 'I'); - verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'j', r'J'], 'J'); - verifyEntry(mapping, 'KeyK', [r'k', r'K', r'k', r'K'], 'K'); - verifyEntry(mapping, 'KeyL', [r'l', r'L', r'l', r'L'], 'L'); - verifyEntry(mapping, 'KeyM', [r'm', r'M', r'm', r'M'], 'M'); - verifyEntry(mapping, 'KeyN', [r'n', r'N', r'n', r'N'], 'N'); - verifyEntry(mapping, 'KeyO', [r'o', r'O', r'o', r'O'], 'O'); - verifyEntry(mapping, 'KeyP', [r'p', r'P', r'p', r'P'], 'P'); - verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'q', r'Q'], 'Q'); - verifyEntry(mapping, 'KeyR', [r'r', r'R', r'r', r'R'], 'R'); - verifyEntry(mapping, 'KeyS', [r's', r'S', r's', r'S'], 'S'); - verifyEntry(mapping, 'KeyT', [r't', r'T', r't', r'T'], 'T'); - verifyEntry(mapping, 'KeyU', [r'u', r'U', r'u', r'U'], 'U'); - verifyEntry(mapping, 'KeyV', [r'v', r'V', r'v', r'V'], 'V'); - verifyEntry(mapping, 'KeyW', [r'w', r'W', r'w', r'W'], 'W'); - verifyEntry(mapping, 'KeyX', [r'x', r'X', r'x', r'X'], 'X'); - verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'y', r'Y'], 'Y'); - verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'z', r'Z'], 'Z'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'a', r'A'], 'a'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'b', r'B'], 'b'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'c', r'C'], 'c'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'd', r'D'], 'd'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'e', r'E'], 'e'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'f', r'F'], 'f'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'g', r'G'], 'g'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'h', r'H'], 'h'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'i', r'I'], 'i'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'j', r'J'], 'j'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'k', r'K'], 'k'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'l', r'L'], 'l'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'm', r'M'], 'm'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'n', r'N'], 'n'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'o', r'O'], 'o'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'p', r'P'], 'p'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'q', r'Q'], 'q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'r', r'R'], 'r'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r's', r'S'], 's'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r't', r'T'], 't'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'u', r'U'], 'u'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'v', r'V'], 'v'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'w', r'W'], 'w'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'x', r'X'], 'x'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'y', r'Y'], 'y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'z', r'Z'], 'z'); }); group('es', () { @@ -969,32 +969,32 @@ void testLinux(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'7', r'/', r'{', r'⅞'], '7'); verifyEntry(mapping, 'Digit8', [r'8', r'(', r'[', r'™'], '8'); verifyEntry(mapping, 'Digit9', [r'9', r')', r']', r'±'], '9'); - verifyEntry(mapping, 'KeyA', [r'a', r'A', r'æ', r'Æ'], 'A'); - verifyEntry(mapping, 'KeyB', [r'b', r'B', r'”', r'’'], 'B'); - verifyEntry(mapping, 'KeyC', [r'c', r'C', r'¢', r'©'], 'C'); - verifyEntry(mapping, 'KeyD', [r'd', r'D', r'ð', r'Ð'], 'D'); - verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r'¢'], 'E'); - verifyEntry(mapping, 'KeyF', [r'f', r'F', r'đ', r'ª'], 'F'); - verifyEntry(mapping, 'KeyG', [r'g', r'G', r'ŋ', r'Ŋ'], 'G'); - verifyEntry(mapping, 'KeyH', [r'h', r'H', r'ħ', r'Ħ'], 'H'); - verifyEntry(mapping, 'KeyI', [r'i', r'I', r'→', r'ı'], 'I'); - verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'̉', r'̛'], 'J'); - verifyEntry(mapping, 'KeyK', [r'k', r'K', r'ĸ', r'&'], 'K'); - verifyEntry(mapping, 'KeyL', [r'l', r'L', r'ł', r'Ł'], 'L'); - verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r'º'], 'M'); - verifyEntry(mapping, 'KeyN', [r'n', r'N', r'n', r'N'], 'N'); - verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'O'); - verifyEntry(mapping, 'KeyP', [r'p', r'P', r'þ', r'Þ'], 'P'); - verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'@', r'Ω'], 'Q'); - verifyEntry(mapping, 'KeyR', [r'r', r'R', r'¶', r'®'], 'R'); - verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r'§'], 'S'); - verifyEntry(mapping, 'KeyT', [r't', r'T', r'ŧ', r'Ŧ'], 'T'); - verifyEntry(mapping, 'KeyU', [r'u', r'U', r'↓', r'↑'], 'U'); - verifyEntry(mapping, 'KeyV', [r'v', r'V', r'“', r'‘'], 'V'); - verifyEntry(mapping, 'KeyW', [r'w', r'W', r'ł', r'Ł'], 'W'); - verifyEntry(mapping, 'KeyX', [r'x', r'X', r'»', r'>'], 'X'); - verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'←', r'¥'], 'Y'); - verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'«', r'<'], 'Z'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'æ', r'Æ'], 'a'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'”', r'’'], 'b'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'¢', r'©'], 'c'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'ð', r'Ð'], 'd'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r'¢'], 'e'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'đ', r'ª'], 'f'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'ŋ', r'Ŋ'], 'g'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'ħ', r'Ħ'], 'h'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'→', r'ı'], 'i'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'̉', r'̛'], 'j'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'ĸ', r'&'], 'k'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'ł', r'Ł'], 'l'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r'º'], 'm'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'n', r'N'], 'n'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'o'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'þ', r'Þ'], 'p'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'@', r'Ω'], 'q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'¶', r'®'], 'r'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r'§'], 's'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'ŧ', r'Ŧ'], 't'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'↓', r'↑'], 'u'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'“', r'‘'], 'v'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'ł', r'Ł'], 'w'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'»', r'>'], 'x'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'←', r'¥'], 'y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'«', r'<'], 'z'); }); group('fr', () { @@ -1008,32 +1008,32 @@ void testLinux(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'è', r'7', r'`', r'⅞'], '7'); verifyEntry(mapping, 'Digit8', [r'_', r'8', r'\', r'™'], '8'); verifyEntry(mapping, 'Digit9', [r'ç', r'9', r'^', r'±'], '9'); - verifyEntry(mapping, 'KeyA', [r'q', r'Q', r'@', r'Ω'], 'Q'); - verifyEntry(mapping, 'KeyB', [r'b', r'B', r'”', r'’'], 'B'); - verifyEntry(mapping, 'KeyC', [r'c', r'C', r'¢', r'©'], 'C'); - verifyEntry(mapping, 'KeyD', [r'd', r'D', r'ð', r'Ð'], 'D'); - verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r'¢'], 'E'); - verifyEntry(mapping, 'KeyF', [r'f', r'F', r'đ', r'ª'], 'F'); - verifyEntry(mapping, 'KeyG', [r'g', r'G', r'ŋ', r'Ŋ'], 'G'); - verifyEntry(mapping, 'KeyH', [r'h', r'H', r'ħ', r'Ħ'], 'H'); - verifyEntry(mapping, 'KeyI', [r'i', r'I', r'→', r'ı'], 'I'); - verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'̉', r'̛'], 'J'); - verifyEntry(mapping, 'KeyK', [r'k', r'K', r'ĸ', r'&'], 'K'); - verifyEntry(mapping, 'KeyL', [r'l', r'L', r'ł', r'Ł'], 'L'); - verifyEntry(mapping, 'KeyN', [r'n', r'N', r'n', r'N'], 'N'); - verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'O'); - verifyEntry(mapping, 'KeyP', [r'p', r'P', r'þ', r'Þ'], 'P'); - verifyEntry(mapping, 'KeyQ', [r'a', r'A', r'æ', r'Æ'], 'A'); - verifyEntry(mapping, 'KeyR', [r'r', r'R', r'¶', r'®'], 'R'); - verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r'§'], 'S'); - verifyEntry(mapping, 'KeyT', [r't', r'T', r'ŧ', r'Ŧ'], 'T'); - verifyEntry(mapping, 'KeyU', [r'u', r'U', r'↓', r'↑'], 'U'); - verifyEntry(mapping, 'KeyV', [r'v', r'V', r'“', r'‘'], 'V'); - verifyEntry(mapping, 'KeyW', [r'z', r'Z', r'«', r'<'], 'Z'); - verifyEntry(mapping, 'KeyX', [r'x', r'X', r'»', r'>'], 'X'); - verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'←', r'¥'], 'Y'); - verifyEntry(mapping, 'KeyZ', [r'w', r'W', r'ł', r'Ł'], 'W'); - verifyEntry(mapping, 'Semicolon', [r'm', r'M', r'µ', r'º'], 'M'); + verifyEntry(mapping, 'KeyA', [r'q', r'Q', r'@', r'Ω'], 'q'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'”', r'’'], 'b'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'¢', r'©'], 'c'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'ð', r'Ð'], 'd'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r'¢'], 'e'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'đ', r'ª'], 'f'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'ŋ', r'Ŋ'], 'g'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'ħ', r'Ħ'], 'h'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'→', r'ı'], 'i'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'̉', r'̛'], 'j'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'ĸ', r'&'], 'k'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'ł', r'Ł'], 'l'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'n', r'N'], 'n'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'o'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'þ', r'Þ'], 'p'); + verifyEntry(mapping, 'KeyQ', [r'a', r'A', r'æ', r'Æ'], 'a'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'¶', r'®'], 'r'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r'§'], 's'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'ŧ', r'Ŧ'], 't'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'↓', r'↑'], 'u'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'“', r'‘'], 'v'); + verifyEntry(mapping, 'KeyW', [r'z', r'Z', r'«', r'<'], 'z'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'»', r'>'], 'x'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'←', r'¥'], 'y'); + verifyEntry(mapping, 'KeyZ', [r'w', r'W', r'ł', r'Ł'], 'w'); + verifyEntry(mapping, 'Semicolon', [r'm', r'M', r'µ', r'º'], 'm'); }); group('ru', () { @@ -1047,32 +1047,32 @@ void testLinux(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'7', r'?', r'7', r'?'], '7'); verifyEntry(mapping, 'Digit8', [r'8', r'*', r'₽', r''], '8'); verifyEntry(mapping, 'Digit9', [r'9', r'(', r'9', r'('], '9'); - verifyEntry(mapping, 'KeyA', [r'ф', r'Ф', r'ф', r'Ф'], 'A'); - verifyEntry(mapping, 'KeyB', [r'и', r'И', r'и', r'И'], 'B'); - verifyEntry(mapping, 'KeyC', [r'с', r'С', r'с', r'С'], 'C'); - verifyEntry(mapping, 'KeyD', [r'в', r'В', r'в', r'В'], 'D'); - verifyEntry(mapping, 'KeyE', [r'у', r'У', r'у', r'У'], 'E'); - verifyEntry(mapping, 'KeyF', [r'а', r'А', r'а', r'А'], 'F'); - verifyEntry(mapping, 'KeyG', [r'п', r'П', r'п', r'П'], 'G'); - verifyEntry(mapping, 'KeyH', [r'р', r'Р', r'р', r'Р'], 'H'); - verifyEntry(mapping, 'KeyI', [r'ш', r'Ш', r'ш', r'Ш'], 'I'); - verifyEntry(mapping, 'KeyJ', [r'о', r'О', r'о', r'О'], 'J'); - verifyEntry(mapping, 'KeyK', [r'л', r'Л', r'л', r'Л'], 'K'); - verifyEntry(mapping, 'KeyL', [r'д', r'Д', r'д', r'Д'], 'L'); - verifyEntry(mapping, 'KeyM', [r'ь', r'Ь', r'ь', r'Ь'], 'M'); - verifyEntry(mapping, 'KeyN', [r'т', r'Т', r'т', r'Т'], 'N'); - verifyEntry(mapping, 'KeyO', [r'щ', r'Щ', r'щ', r'Щ'], 'O'); - verifyEntry(mapping, 'KeyP', [r'з', r'З', r'з', r'З'], 'P'); - verifyEntry(mapping, 'KeyQ', [r'й', r'Й', r'й', r'Й'], 'Q'); - verifyEntry(mapping, 'KeyR', [r'к', r'К', r'к', r'К'], 'R'); - verifyEntry(mapping, 'KeyS', [r'ы', r'Ы', r'ы', r'Ы'], 'S'); - verifyEntry(mapping, 'KeyT', [r'е', r'Е', r'е', r'Е'], 'T'); - verifyEntry(mapping, 'KeyU', [r'г', r'Г', r'г', r'Г'], 'U'); - verifyEntry(mapping, 'KeyV', [r'м', r'М', r'м', r'М'], 'V'); - verifyEntry(mapping, 'KeyW', [r'ц', r'Ц', r'ц', r'Ц'], 'W'); - verifyEntry(mapping, 'KeyX', [r'ч', r'Ч', r'ч', r'Ч'], 'X'); - verifyEntry(mapping, 'KeyY', [r'н', r'Н', r'н', r'Н'], 'Y'); - verifyEntry(mapping, 'KeyZ', [r'я', r'Я', r'я', r'Я'], 'Z'); + verifyEntry(mapping, 'KeyA', [r'ф', r'Ф', r'ф', r'Ф'], 'a'); + verifyEntry(mapping, 'KeyB', [r'и', r'И', r'и', r'И'], 'b'); + verifyEntry(mapping, 'KeyC', [r'с', r'С', r'с', r'С'], 'c'); + verifyEntry(mapping, 'KeyD', [r'в', r'В', r'в', r'В'], 'd'); + verifyEntry(mapping, 'KeyE', [r'у', r'У', r'у', r'У'], 'e'); + verifyEntry(mapping, 'KeyF', [r'а', r'А', r'а', r'А'], 'f'); + verifyEntry(mapping, 'KeyG', [r'п', r'П', r'п', r'П'], 'g'); + verifyEntry(mapping, 'KeyH', [r'р', r'Р', r'р', r'Р'], 'h'); + verifyEntry(mapping, 'KeyI', [r'ш', r'Ш', r'ш', r'Ш'], 'i'); + verifyEntry(mapping, 'KeyJ', [r'о', r'О', r'о', r'О'], 'j'); + verifyEntry(mapping, 'KeyK', [r'л', r'Л', r'л', r'Л'], 'k'); + verifyEntry(mapping, 'KeyL', [r'д', r'Д', r'д', r'Д'], 'l'); + verifyEntry(mapping, 'KeyM', [r'ь', r'Ь', r'ь', r'Ь'], 'm'); + verifyEntry(mapping, 'KeyN', [r'т', r'Т', r'т', r'Т'], 'n'); + verifyEntry(mapping, 'KeyO', [r'щ', r'Щ', r'щ', r'Щ'], 'o'); + verifyEntry(mapping, 'KeyP', [r'з', r'З', r'з', r'З'], 'p'); + verifyEntry(mapping, 'KeyQ', [r'й', r'Й', r'й', r'Й'], 'q'); + verifyEntry(mapping, 'KeyR', [r'к', r'К', r'к', r'К'], 'r'); + verifyEntry(mapping, 'KeyS', [r'ы', r'Ы', r'ы', r'Ы'], 's'); + verifyEntry(mapping, 'KeyT', [r'е', r'Е', r'е', r'Е'], 't'); + verifyEntry(mapping, 'KeyU', [r'г', r'Г', r'г', r'Г'], 'u'); + verifyEntry(mapping, 'KeyV', [r'м', r'М', r'м', r'М'], 'v'); + verifyEntry(mapping, 'KeyW', [r'ц', r'Ц', r'ц', r'Ц'], 'w'); + verifyEntry(mapping, 'KeyX', [r'ч', r'Ч', r'ч', r'Ч'], 'x'); + verifyEntry(mapping, 'KeyY', [r'н', r'Н', r'н', r'Н'], 'y'); + verifyEntry(mapping, 'KeyZ', [r'я', r'Я', r'я', r'Я'], 'z'); }); } @@ -1088,36 +1088,36 @@ void testDarwin(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'7', r'/', r'|', r'\'], '7'); verifyEntry(mapping, 'Digit8', [r'8', r'(', r'{', r'˜'], '8'); verifyEntry(mapping, 'Digit9', [r'9', r')', r'}', r'·'], '9'); - verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'A'); - verifyEntry(mapping, 'KeyB', [r'b', r'B', r'∫', r'‹'], 'B'); - verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ç', r'Ç'], 'C'); - verifyEntry(mapping, 'KeyD', [r'd', r'D', r'∂', r'™'], 'D'); - verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r'‰'], 'E'); - verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ƒ', r'Ï'], 'F'); - verifyEntry(mapping, 'KeyG', [r'g', r'G', r'©', r'Ì'], 'G'); - verifyEntry(mapping, 'KeyH', [r'h', r'H', r'ª', r'Ó'], 'H'); - verifyEntry(mapping, 'KeyI', [r'i', r'I', r'⁄', r'Û'], 'I'); - verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'º', r'ı'], 'J'); - verifyEntry(mapping, 'KeyK', [r'k', r'K', r'∆', r'ˆ'], 'K'); - verifyEntry(mapping, 'KeyL', [r'l', r'L', r'@', r'fl'], 'L'); - verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r'˘'], 'M'); - verifyEntry(mapping, 'KeyN', [r'n', r'N', r'Dead', r'›'], 'N'); - verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'O'); - verifyEntry(mapping, 'KeyP', [r'p', r'P', r'π', r'∏'], 'P'); - verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'«', r'»'], 'Q'); - verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r'¸'], 'R'); - verifyEntry(mapping, 'KeyS', [r's', r'S', r'‚', r'Í'], 'S'); - verifyEntry(mapping, 'KeyT', [r't', r'T', r'†', r'˝'], 'T'); - verifyEntry(mapping, 'KeyU', [r'u', r'U', r'Dead', r'Á'], 'U'); - verifyEntry(mapping, 'KeyV', [r'v', r'V', r'√', r'◊'], 'V'); - verifyEntry(mapping, 'KeyW', [r'w', r'W', r'∑', r'„'], 'W'); - verifyEntry(mapping, 'KeyX', [r'x', r'X', r'≈', r'Ù'], 'X'); - verifyEntry(mapping, 'KeyY', [r'z', r'Z', r'Ω', r'ˇ'], 'Z'); - verifyEntry(mapping, 'KeyZ', [r'y', r'Y', r'¥', r'‡'], 'Y'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'a'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'∫', r'‹'], 'b'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ç', r'Ç'], 'c'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'∂', r'™'], 'd'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r'‰'], 'e'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ƒ', r'Ï'], 'f'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'©', r'Ì'], 'g'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'ª', r'Ó'], 'h'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'⁄', r'Û'], 'i'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'º', r'ı'], 'j'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'∆', r'ˆ'], 'k'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'@', r'fl'], 'l'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r'˘'], 'm'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'Dead', r'›'], 'n'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'o'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'π', r'∏'], 'p'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'«', r'»'], 'q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r'¸'], 'r'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'‚', r'Í'], 's'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'†', r'˝'], 't'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'Dead', r'Á'], 'u'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'√', r'◊'], 'v'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'∑', r'„'], 'w'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'≈', r'Ù'], 'x'); + verifyEntry(mapping, 'KeyY', [r'z', r'Z', r'Ω', r'ˇ'], 'z'); + verifyEntry(mapping, 'KeyZ', [r'y', r'Y', r'¥', r'‡'], 'y'); }); group('dvorak', () { - verifyEntry(mapping, 'Comma', [r'w', r'W', r'∑', r'„'], 'W'); + verifyEntry(mapping, 'Comma', [r'w', r'W', r'∑', r'„'], 'w'); verifyEntry(mapping, 'Digit0', [r'0', r')', r'º', r'‚'], '0'); verifyEntry(mapping, 'Digit1', [r'1', r'!', r'¡', r'⁄'], '1'); verifyEntry(mapping, 'Digit2', [r'2', r'@', r'™', r'€'], '2'); @@ -1128,31 +1128,31 @@ void testDarwin(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'7', r'&', r'¶', r'‡'], '7'); verifyEntry(mapping, 'Digit8', [r'8', r'*', r'•', r'°'], '8'); verifyEntry(mapping, 'Digit9', [r'9', r'(', r'ª', r'·'], '9'); - verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'A'); - verifyEntry(mapping, 'KeyB', [r'x', r'X', r'≈', r'˛'], 'X'); - verifyEntry(mapping, 'KeyC', [r'j', r'J', r'∆', r'Ô'], 'J'); - verifyEntry(mapping, 'KeyD', [r'e', r'E', r'Dead', r'´'], 'E'); - verifyEntry(mapping, 'KeyF', [r'u', r'U', r'Dead', r'¨'], 'U'); - verifyEntry(mapping, 'KeyG', [r'i', r'I', r'Dead', r'ˆ'], 'I'); - verifyEntry(mapping, 'KeyH', [r'd', r'D', r'∂', r'Î'], 'D'); - verifyEntry(mapping, 'KeyI', [r'c', r'C', r'ç', r'Ç'], 'C'); - verifyEntry(mapping, 'KeyJ', [r'h', r'H', r'˙', r'Ó'], 'H'); - verifyEntry(mapping, 'KeyK', [r't', r'T', r'†', r'ˇ'], 'T'); - verifyEntry(mapping, 'KeyL', [r'n', r'N', r'Dead', r'˜'], 'N'); - verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r'Â'], 'M'); - verifyEntry(mapping, 'KeyN', [r'b', r'B', r'∫', r'ı'], 'B'); - verifyEntry(mapping, 'KeyO', [r'r', r'R', r'®', r'‰'], 'R'); - verifyEntry(mapping, 'KeyP', [r'l', r'L', r'¬', r'Ò'], 'L'); - verifyEntry(mapping, 'KeyR', [r'p', r'P', r'π', r'∏'], 'P'); - verifyEntry(mapping, 'KeyS', [r'o', r'O', r'ø', r'Ø'], 'O'); - verifyEntry(mapping, 'KeyT', [r'y', r'Y', r'¥', r'Á'], 'Y'); - verifyEntry(mapping, 'KeyU', [r'g', r'G', r'©', r'˝'], 'G'); - verifyEntry(mapping, 'KeyV', [r'k', r'K', r'˚', r''], 'K'); - verifyEntry(mapping, 'KeyX', [r'q', r'Q', r'œ', r'Œ'], 'Q'); - verifyEntry(mapping, 'KeyY', [r'f', r'F', r'ƒ', r'Ï'], 'F'); - verifyEntry(mapping, 'Period', [r'v', r'V', r'√', r'◊'], 'V'); - verifyEntry(mapping, 'Semicolon', [r's', r'S', r'ß', r'Í'], 'S'); - verifyEntry(mapping, 'Slash', [r'z', r'Z', r'Ω', r'¸'], 'Z'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'a'); + verifyEntry(mapping, 'KeyB', [r'x', r'X', r'≈', r'˛'], 'x'); + verifyEntry(mapping, 'KeyC', [r'j', r'J', r'∆', r'Ô'], 'j'); + verifyEntry(mapping, 'KeyD', [r'e', r'E', r'Dead', r'´'], 'e'); + verifyEntry(mapping, 'KeyF', [r'u', r'U', r'Dead', r'¨'], 'u'); + verifyEntry(mapping, 'KeyG', [r'i', r'I', r'Dead', r'ˆ'], 'i'); + verifyEntry(mapping, 'KeyH', [r'd', r'D', r'∂', r'Î'], 'd'); + verifyEntry(mapping, 'KeyI', [r'c', r'C', r'ç', r'Ç'], 'c'); + verifyEntry(mapping, 'KeyJ', [r'h', r'H', r'˙', r'Ó'], 'h'); + verifyEntry(mapping, 'KeyK', [r't', r'T', r'†', r'ˇ'], 't'); + verifyEntry(mapping, 'KeyL', [r'n', r'N', r'Dead', r'˜'], 'n'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r'Â'], 'm'); + verifyEntry(mapping, 'KeyN', [r'b', r'B', r'∫', r'ı'], 'b'); + verifyEntry(mapping, 'KeyO', [r'r', r'R', r'®', r'‰'], 'r'); + verifyEntry(mapping, 'KeyP', [r'l', r'L', r'¬', r'Ò'], 'l'); + verifyEntry(mapping, 'KeyR', [r'p', r'P', r'π', r'∏'], 'p'); + verifyEntry(mapping, 'KeyS', [r'o', r'O', r'ø', r'Ø'], 'o'); + verifyEntry(mapping, 'KeyT', [r'y', r'Y', r'¥', r'Á'], 'y'); + verifyEntry(mapping, 'KeyU', [r'g', r'G', r'©', r'˝'], 'g'); + verifyEntry(mapping, 'KeyV', [r'k', r'K', r'˚', r''], 'k'); + verifyEntry(mapping, 'KeyX', [r'q', r'Q', r'œ', r'Œ'], 'q'); + verifyEntry(mapping, 'KeyY', [r'f', r'F', r'ƒ', r'Ï'], 'f'); + verifyEntry(mapping, 'Period', [r'v', r'V', r'√', r'◊'], 'v'); + verifyEntry(mapping, 'Semicolon', [r's', r'S', r'ß', r'Í'], 's'); + verifyEntry(mapping, 'Slash', [r'z', r'Z', r'Ω', r'¸'], 'z'); }); group('en', () { @@ -1166,32 +1166,32 @@ void testDarwin(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'7', r'&', r'¶', r'‡'], '7'); verifyEntry(mapping, 'Digit8', [r'8', r'*', r'•', r'°'], '8'); verifyEntry(mapping, 'Digit9', [r'9', r'(', r'ª', r'·'], '9'); - verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'A'); - verifyEntry(mapping, 'KeyB', [r'b', r'B', r'∫', r'ı'], 'B'); - verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ç', r'Ç'], 'C'); - verifyEntry(mapping, 'KeyD', [r'd', r'D', r'∂', r'Î'], 'D'); - verifyEntry(mapping, 'KeyE', [r'e', r'E', r'Dead', r'´'], 'E'); - verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ƒ', r'Ï'], 'F'); - verifyEntry(mapping, 'KeyG', [r'g', r'G', r'©', r'˝'], 'G'); - verifyEntry(mapping, 'KeyH', [r'h', r'H', r'˙', r'Ó'], 'H'); - verifyEntry(mapping, 'KeyI', [r'i', r'I', r'Dead', r'ˆ'], 'I'); - verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'∆', r'Ô'], 'J'); - verifyEntry(mapping, 'KeyK', [r'k', r'K', r'˚', r''], 'K'); - verifyEntry(mapping, 'KeyL', [r'l', r'L', r'¬', r'Ò'], 'L'); - verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r'Â'], 'M'); - verifyEntry(mapping, 'KeyN', [r'n', r'N', r'Dead', r'˜'], 'N'); - verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'O'); - verifyEntry(mapping, 'KeyP', [r'p', r'P', r'π', r'∏'], 'P'); - verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'œ', r'Œ'], 'Q'); - verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r'‰'], 'R'); - verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r'Í'], 'S'); - verifyEntry(mapping, 'KeyT', [r't', r'T', r'†', r'ˇ'], 'T'); - verifyEntry(mapping, 'KeyU', [r'u', r'U', r'Dead', r'¨'], 'U'); - verifyEntry(mapping, 'KeyV', [r'v', r'V', r'√', r'◊'], 'V'); - verifyEntry(mapping, 'KeyW', [r'w', r'W', r'∑', r'„'], 'W'); - verifyEntry(mapping, 'KeyX', [r'x', r'X', r'≈', r'˛'], 'X'); - verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'¥', r'Á'], 'Y'); - verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'Ω', r'¸'], 'Z'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'a'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'∫', r'ı'], 'b'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ç', r'Ç'], 'c'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'∂', r'Î'], 'd'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'Dead', r'´'], 'e'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ƒ', r'Ï'], 'f'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'©', r'˝'], 'g'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'˙', r'Ó'], 'h'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'Dead', r'ˆ'], 'i'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'∆', r'Ô'], 'j'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'˚', r''], 'k'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'¬', r'Ò'], 'l'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r'Â'], 'm'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'Dead', r'˜'], 'n'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'o'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'π', r'∏'], 'p'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'œ', r'Œ'], 'q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r'‰'], 'r'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r'Í'], 's'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'†', r'ˇ'], 't'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'Dead', r'¨'], 'u'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'√', r'◊'], 'v'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'∑', r'„'], 'w'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'≈', r'˛'], 'x'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'¥', r'Á'], 'y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'Ω', r'¸'], 'z'); }); group('en-ext', () { @@ -1205,32 +1205,32 @@ void testDarwin(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'7', r'&', r'¶', r'‡'], '7'); verifyEntry(mapping, 'Digit8', [r'8', r'*', r'•', r'°'], '8'); verifyEntry(mapping, 'Digit9', [r'9', r'(', r'ª', r'·'], '9'); - verifyEntry(mapping, 'KeyA', [r'a', r'A', r'Dead', r'̄'], 'A'); - verifyEntry(mapping, 'KeyB', [r'b', r'B', r'Dead', r'̆'], 'B'); - verifyEntry(mapping, 'KeyC', [r'c', r'C', r'Dead', r'̧'], 'C'); - verifyEntry(mapping, 'KeyD', [r'd', r'D', r'ð', r'Ð'], 'D'); - verifyEntry(mapping, 'KeyE', [r'e', r'E', r'Dead', r'́'], 'E'); - verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ƒ', r''], 'F'); - verifyEntry(mapping, 'KeyG', [r'g', r'G', r'©', r'Dead'], 'G'); - verifyEntry(mapping, 'KeyH', [r'h', r'H', r'Dead', r'̱'], 'H'); - verifyEntry(mapping, 'KeyI', [r'i', r'I', r'Dead', r'̛'], 'I'); - verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'Dead', r'̋'], 'J'); - verifyEntry(mapping, 'KeyK', [r'k', r'K', r'Dead', r'̊'], 'K'); - verifyEntry(mapping, 'KeyL', [r'l', r'L', r'Dead', r'̵'], 'L'); - verifyEntry(mapping, 'KeyM', [r'm', r'M', r'Dead', r'̨'], 'M'); - verifyEntry(mapping, 'KeyN', [r'n', r'N', r'Dead', r'̃'], 'N'); - verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'O'); - verifyEntry(mapping, 'KeyP', [r'p', r'P', r'Dead', r'̦'], 'P'); - verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'œ', r'Œ'], 'Q'); - verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r'‰'], 'R'); - verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r''], 'S'); - verifyEntry(mapping, 'KeyT', [r't', r'T', r'þ', r'Þ'], 'T'); - verifyEntry(mapping, 'KeyU', [r'u', r'U', r'Dead', r'̈'], 'U'); - verifyEntry(mapping, 'KeyV', [r'v', r'V', r'Dead', r'̌'], 'V'); - verifyEntry(mapping, 'KeyW', [r'w', r'W', r'Dead', r'̇'], 'W'); - verifyEntry(mapping, 'KeyX', [r'x', r'X', r'Dead', r'̣'], 'X'); - verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'¥', r''], 'Y'); - verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'Dead', r'̉'], 'Z'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'Dead', r'̄'], 'a'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'Dead', r'̆'], 'b'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'Dead', r'̧'], 'c'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'ð', r'Ð'], 'd'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'Dead', r'́'], 'e'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ƒ', r''], 'f'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'©', r'Dead'], 'g'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'Dead', r'̱'], 'h'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'Dead', r'̛'], 'i'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'Dead', r'̋'], 'j'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'Dead', r'̊'], 'k'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'Dead', r'̵'], 'l'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'Dead', r'̨'], 'm'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'Dead', r'̃'], 'n'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'o'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'Dead', r'̦'], 'p'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'œ', r'Œ'], 'q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r'‰'], 'r'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r''], 's'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'þ', r'Þ'], 't'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'Dead', r'̈'], 'u'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'Dead', r'̌'], 'v'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'Dead', r'̇'], 'w'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'Dead', r'̣'], 'x'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'¥', r''], 'y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'Dead', r'̉'], 'z'); }); group('en-intl', () { @@ -1244,32 +1244,32 @@ void testDarwin(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'7', r'&', r'¶', r'‡'], '7'); verifyEntry(mapping, 'Digit8', [r'8', r'*', r'•', r'°'], '8'); verifyEntry(mapping, 'Digit9', [r'9', r'(', r'ª', r'·'], '9'); - verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'A'); - verifyEntry(mapping, 'KeyB', [r'b', r'B', r'∫', r'ı'], 'B'); - verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ç', r'Ç'], 'C'); - verifyEntry(mapping, 'KeyD', [r'd', r'D', r'∂', r'Î'], 'D'); - verifyEntry(mapping, 'KeyE', [r'e', r'E', r'Dead', r'´'], 'E'); - verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ƒ', r'Ï'], 'F'); - verifyEntry(mapping, 'KeyG', [r'g', r'G', r'©', r'˝'], 'G'); - verifyEntry(mapping, 'KeyH', [r'h', r'H', r'˙', r'Ó'], 'H'); - verifyEntry(mapping, 'KeyI', [r'i', r'I', r'Dead', r'ˆ'], 'I'); - verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'∆', r'Ô'], 'J'); - verifyEntry(mapping, 'KeyK', [r'k', r'K', r'˚', r''], 'K'); - verifyEntry(mapping, 'KeyL', [r'l', r'L', r'¬', r'Ò'], 'L'); - verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r'Â'], 'M'); - verifyEntry(mapping, 'KeyN', [r'n', r'N', r'Dead', r'˜'], 'N'); - verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'O'); - verifyEntry(mapping, 'KeyP', [r'p', r'P', r'π', r'∏'], 'P'); - verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'œ', r'Œ'], 'Q'); - verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r'‰'], 'R'); - verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r'Í'], 'S'); - verifyEntry(mapping, 'KeyT', [r't', r'T', r'†', r'ˇ'], 'T'); - verifyEntry(mapping, 'KeyU', [r'u', r'U', r'Dead', r'¨'], 'U'); - verifyEntry(mapping, 'KeyV', [r'v', r'V', r'√', r'◊'], 'V'); - verifyEntry(mapping, 'KeyW', [r'w', r'W', r'∑', r'„'], 'W'); - verifyEntry(mapping, 'KeyX', [r'x', r'X', r'≈', r'˛'], 'X'); - verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'¥', r'Á'], 'Y'); - verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'Ω', r'¸'], 'Z'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'a'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'∫', r'ı'], 'b'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ç', r'Ç'], 'c'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'∂', r'Î'], 'd'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'Dead', r'´'], 'e'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ƒ', r'Ï'], 'f'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'©', r'˝'], 'g'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'˙', r'Ó'], 'h'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'Dead', r'ˆ'], 'i'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'∆', r'Ô'], 'j'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'˚', r''], 'k'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'¬', r'Ò'], 'l'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r'Â'], 'm'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'Dead', r'˜'], 'n'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'o'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'π', r'∏'], 'p'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'œ', r'Œ'], 'q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r'‰'], 'r'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r'Í'], 's'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'†', r'ˇ'], 't'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'Dead', r'¨'], 'u'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'√', r'◊'], 'v'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'∑', r'„'], 'w'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'≈', r'˛'], 'x'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'¥', r'Á'], 'y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'Ω', r'¸'], 'z'); }); group('en-uk', () { @@ -1283,32 +1283,32 @@ void testDarwin(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'7', r'&', r'¶', r'‡'], '7'); verifyEntry(mapping, 'Digit8', [r'8', r'*', r'•', r'°'], '8'); verifyEntry(mapping, 'Digit9', [r'9', r'(', r'ª', r'·'], '9'); - verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'A'); - verifyEntry(mapping, 'KeyB', [r'b', r'B', r'∫', r'ı'], 'B'); - verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ç', r'Ç'], 'C'); - verifyEntry(mapping, 'KeyD', [r'd', r'D', r'∂', r'Î'], 'D'); - verifyEntry(mapping, 'KeyE', [r'e', r'E', r'Dead', r'‰'], 'E'); - verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ƒ', r'Ï'], 'F'); - verifyEntry(mapping, 'KeyG', [r'g', r'G', r'©', r'Ì'], 'G'); - verifyEntry(mapping, 'KeyH', [r'h', r'H', r'˙', r'Ó'], 'H'); - verifyEntry(mapping, 'KeyI', [r'i', r'I', r'Dead', r'È'], 'I'); - verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'∆', r'Ô'], 'J'); - verifyEntry(mapping, 'KeyK', [r'k', r'K', r'˚', r''], 'K'); - verifyEntry(mapping, 'KeyL', [r'l', r'L', r'¬', r'Ò'], 'L'); - verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r'˜'], 'M'); - verifyEntry(mapping, 'KeyN', [r'n', r'N', r'Dead', r'ˆ'], 'N'); - verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'O'); - verifyEntry(mapping, 'KeyP', [r'p', r'P', r'π', r'∏'], 'P'); - verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'œ', r'Œ'], 'Q'); - verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r'Â'], 'R'); - verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r'Í'], 'S'); - verifyEntry(mapping, 'KeyT', [r't', r'T', r'†', r'Ê'], 'T'); - verifyEntry(mapping, 'KeyU', [r'u', r'U', r'Dead', r'Ë'], 'U'); - verifyEntry(mapping, 'KeyV', [r'v', r'V', r'√', r'◊'], 'V'); - verifyEntry(mapping, 'KeyW', [r'w', r'W', r'∑', r'„'], 'W'); - verifyEntry(mapping, 'KeyX', [r'x', r'X', r'≈', r'Ù'], 'X'); - verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'¥', r'Á'], 'Y'); - verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'Ω', r'Û'], 'Z'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'a'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'∫', r'ı'], 'b'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ç', r'Ç'], 'c'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'∂', r'Î'], 'd'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'Dead', r'‰'], 'e'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ƒ', r'Ï'], 'f'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'©', r'Ì'], 'g'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'˙', r'Ó'], 'h'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'Dead', r'È'], 'i'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'∆', r'Ô'], 'j'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'˚', r''], 'k'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'¬', r'Ò'], 'l'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r'˜'], 'm'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'Dead', r'ˆ'], 'n'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'o'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'π', r'∏'], 'p'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'œ', r'Œ'], 'q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r'Â'], 'r'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r'Í'], 's'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'†', r'Ê'], 't'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'Dead', r'Ë'], 'u'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'√', r'◊'], 'v'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'∑', r'„'], 'w'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'≈', r'Ù'], 'x'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'¥', r'Á'], 'y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'Ω', r'Û'], 'z'); }); group('es', () { @@ -1322,32 +1322,32 @@ void testDarwin(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'7', r'/', r'÷', r'⁄'], '7'); verifyEntry(mapping, 'Digit8', [r'8', r'(', r'“', r'‘'], '8'); verifyEntry(mapping, 'Digit9', [r'9', r')', r'”', r'’'], '9'); - verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'A'); - verifyEntry(mapping, 'KeyB', [r'b', r'B', r'ß', r''], 'B'); - verifyEntry(mapping, 'KeyC', [r'c', r'C', r'©', r' '], 'C'); - verifyEntry(mapping, 'KeyD', [r'd', r'D', r'∂', r'∆'], 'D'); - verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r'€'], 'E'); - verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ƒ', r'fi'], 'F'); - verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r'fl'], 'G'); - verifyEntry(mapping, 'KeyH', [r'h', r'H', r'™', r' '], 'H'); - verifyEntry(mapping, 'KeyI', [r'i', r'I', r' ', r' '], 'I'); - verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'¶', r'¯'], 'J'); - verifyEntry(mapping, 'KeyK', [r'k', r'K', r'§', r'ˇ'], 'K'); - verifyEntry(mapping, 'KeyL', [r'l', r'L', r' ', r'˘'], 'L'); - verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r'˚'], 'M'); - verifyEntry(mapping, 'KeyN', [r'n', r'N', r' ', r'˙'], 'N'); - verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'O'); - verifyEntry(mapping, 'KeyP', [r'p', r'P', r'π', r'∏'], 'P'); - verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'œ', r'Œ'], 'Q'); - verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r' '], 'R'); - verifyEntry(mapping, 'KeyS', [r's', r'S', r'∫', r' '], 'S'); - verifyEntry(mapping, 'KeyT', [r't', r'T', r'†', r'‡'], 'T'); - verifyEntry(mapping, 'KeyU', [r'u', r'U', r' ', r' '], 'U'); - verifyEntry(mapping, 'KeyV', [r'v', r'V', r'√', r'◊'], 'V'); - verifyEntry(mapping, 'KeyW', [r'w', r'W', r'æ', r'Æ'], 'W'); - verifyEntry(mapping, 'KeyX', [r'x', r'X', r'∑', r'›'], 'X'); - verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'¥', r' '], 'Y'); - verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'Ω', r'‹'], 'Z'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'a'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'ß', r''], 'b'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'©', r' '], 'c'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'∂', r'∆'], 'd'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r'€'], 'e'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ƒ', r'fi'], 'f'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'', r'fl'], 'g'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'™', r' '], 'h'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r' ', r' '], 'i'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'¶', r'¯'], 'j'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'§', r'ˇ'], 'k'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r' ', r'˘'], 'l'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r'˚'], 'm'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r' ', r'˙'], 'n'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'o'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'π', r'∏'], 'p'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'œ', r'Œ'], 'q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r' '], 'r'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'∫', r' '], 's'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'†', r'‡'], 't'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r' ', r' '], 'u'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'√', r'◊'], 'v'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'æ', r'Æ'], 'w'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'∑', r'›'], 'x'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'¥', r' '], 'y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'Ω', r'‹'], 'z'); }); group('fr', () { @@ -1361,32 +1361,32 @@ void testDarwin(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'è', r'7', r'«', r'»'], '7'); verifyEntry(mapping, 'Digit8', [r'!', r'8', r'¡', r'Û'], '8'); verifyEntry(mapping, 'Digit9', [r'ç', r'9', r'Ç', r'Á'], '9'); - verifyEntry(mapping, 'KeyA', [r'q', r'Q', r'‡', r'Ω'], 'Q'); - verifyEntry(mapping, 'KeyB', [r'b', r'B', r'ß', r'∫'], 'B'); - verifyEntry(mapping, 'KeyC', [r'c', r'C', r'©', r'¢'], 'C'); - verifyEntry(mapping, 'KeyD', [r'd', r'D', r'∂', r'∆'], 'D'); - verifyEntry(mapping, 'KeyE', [r'e', r'E', r'ê', r'Ê'], 'E'); - verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ƒ', r'·'], 'F'); - verifyEntry(mapping, 'KeyG', [r'g', r'G', r'fi', r'fl'], 'G'); - verifyEntry(mapping, 'KeyH', [r'h', r'H', r'Ì', r'Î'], 'H'); - verifyEntry(mapping, 'KeyI', [r'i', r'I', r'î', r'ï'], 'I'); - verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'Ï', r'Í'], 'J'); - verifyEntry(mapping, 'KeyK', [r'k', r'K', r'È', r'Ë'], 'K'); - verifyEntry(mapping, 'KeyL', [r'l', r'L', r'¬', r'|'], 'L'); - verifyEntry(mapping, 'KeyN', [r'n', r'N', r'Dead', r'ı'], 'N'); - verifyEntry(mapping, 'KeyO', [r'o', r'O', r'œ', r'Œ'], 'O'); - verifyEntry(mapping, 'KeyP', [r'p', r'P', r'π', r'∏'], 'P'); - verifyEntry(mapping, 'KeyQ', [r'a', r'A', r'æ', r'Æ'], 'A'); - verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r'‚'], 'R'); - verifyEntry(mapping, 'KeyS', [r's', r'S', r'Ò', r'∑'], 'S'); - verifyEntry(mapping, 'KeyT', [r't', r'T', r'†', r'™'], 'T'); - verifyEntry(mapping, 'KeyU', [r'u', r'U', r'º', r'ª'], 'U'); - verifyEntry(mapping, 'KeyV', [r'v', r'V', r'◊', r'√'], 'V'); - verifyEntry(mapping, 'KeyW', [r'z', r'Z', r'Â', r'Å'], 'Z'); - verifyEntry(mapping, 'KeyX', [r'x', r'X', r'≈', r'⁄'], 'X'); - verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'Ú', r'Ÿ'], 'Y'); - verifyEntry(mapping, 'KeyZ', [r'w', r'W', r'‹', r'›'], 'W'); - verifyEntry(mapping, 'Semicolon', [r'm', r'M', r'µ', r'Ó'], 'M'); + verifyEntry(mapping, 'KeyA', [r'q', r'Q', r'‡', r'Ω'], 'q'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'ß', r'∫'], 'b'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'©', r'¢'], 'c'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'∂', r'∆'], 'd'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'ê', r'Ê'], 'e'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ƒ', r'·'], 'f'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'fi', r'fl'], 'g'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'Ì', r'Î'], 'h'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'î', r'ï'], 'i'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'Ï', r'Í'], 'j'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'È', r'Ë'], 'k'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'¬', r'|'], 'l'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'Dead', r'ı'], 'n'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'œ', r'Œ'], 'o'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'π', r'∏'], 'p'); + verifyEntry(mapping, 'KeyQ', [r'a', r'A', r'æ', r'Æ'], 'a'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r'‚'], 'r'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'Ò', r'∑'], 's'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'†', r'™'], 't'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'º', r'ª'], 'u'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'◊', r'√'], 'v'); + verifyEntry(mapping, 'KeyW', [r'z', r'Z', r'Â', r'Å'], 'z'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'≈', r'⁄'], 'x'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'Ú', r'Ÿ'], 'y'); + verifyEntry(mapping, 'KeyZ', [r'w', r'W', r'‹', r'›'], 'w'); + verifyEntry(mapping, 'Semicolon', [r'm', r'M', r'µ', r'Ó'], 'm'); }); group('it', () { @@ -1400,32 +1400,32 @@ void testDarwin(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'7', r'/', r'÷', r'⁄'], '7'); verifyEntry(mapping, 'Digit8', [r'8', r'(', r'Dead', r''], '8'); verifyEntry(mapping, 'Digit9', [r'9', r')', r'Dead', r' '], '9'); - verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'A'); - verifyEntry(mapping, 'KeyB', [r'b', r'B', r'∫', r'Í'], 'B'); - verifyEntry(mapping, 'KeyC', [r'c', r'C', r'©', r'Á'], 'C'); - verifyEntry(mapping, 'KeyD', [r'd', r'D', r'∂', r'˘'], 'D'); - verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r'È'], 'E'); - verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ƒ', r'˙'], 'F'); - verifyEntry(mapping, 'KeyG', [r'g', r'G', r'∞', r'˚'], 'G'); - verifyEntry(mapping, 'KeyH', [r'h', r'H', r'∆', r'¸'], 'H'); - verifyEntry(mapping, 'KeyI', [r'i', r'I', r'œ', r'Œ'], 'I'); - verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'ª', r'˝'], 'J'); - verifyEntry(mapping, 'KeyK', [r'k', r'K', r'º', r'˛'], 'K'); - verifyEntry(mapping, 'KeyL', [r'l', r'L', r'¬', r'ˇ'], 'L'); - verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r'Ú'], 'M'); - verifyEntry(mapping, 'KeyN', [r'n', r'N', r'Dead', r'Ó'], 'N'); - verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'O'); - verifyEntry(mapping, 'KeyP', [r'p', r'P', r'π', r'∏'], 'P'); - verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'„', r'‚'], 'Q'); - verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r'Ì'], 'R'); - verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r'¯'], 'S'); - verifyEntry(mapping, 'KeyT', [r't', r'T', r'™', r'Ò'], 'T'); - verifyEntry(mapping, 'KeyU', [r'u', r'U', r'Dead', r'Ù'], 'U'); - verifyEntry(mapping, 'KeyV', [r'v', r'V', r'√', r'É'], 'V'); - verifyEntry(mapping, 'KeyW', [r'w', r'W', r'Ω', r'À'], 'W'); - verifyEntry(mapping, 'KeyX', [r'x', r'X', r'†', r'‡'], 'X'); - verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'æ', r'Æ'], 'Y'); - verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'∑', r' '], 'Z'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'a'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'∫', r'Í'], 'b'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'©', r'Á'], 'c'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'∂', r'˘'], 'd'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'€', r'È'], 'e'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ƒ', r'˙'], 'f'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'∞', r'˚'], 'g'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'∆', r'¸'], 'h'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'œ', r'Œ'], 'i'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'ª', r'˝'], 'j'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'º', r'˛'], 'k'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'¬', r'ˇ'], 'l'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r'Ú'], 'm'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'Dead', r'Ó'], 'n'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'o'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'π', r'∏'], 'p'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'„', r'‚'], 'q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r'Ì'], 'r'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r'¯'], 's'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'™', r'Ò'], 't'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'Dead', r'Ù'], 'u'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'√', r'É'], 'v'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'Ω', r'À'], 'w'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'†', r'‡'], 'x'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'æ', r'Æ'], 'y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'∑', r' '], 'z'); }); group('jp', () { @@ -1439,32 +1439,32 @@ void testDarwin(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'7', r'&', r'¶', r'‡'], '7'); verifyEntry(mapping, 'Digit8', [r'8', r'*', r'•', r'°'], '8'); verifyEntry(mapping, 'Digit9', [r'9', r'(', r'ª', r'·'], '9'); - verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'A'); - verifyEntry(mapping, 'KeyB', [r'b', r'B', r'∫', r'ı'], 'B'); - verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ç', r'Ç'], 'C'); - verifyEntry(mapping, 'KeyD', [r'd', r'D', r'∂', r'Î'], 'D'); - verifyEntry(mapping, 'KeyE', [r'e', r'E', r'Dead', r'´'], 'E'); - verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ƒ', r'Ï'], 'F'); - verifyEntry(mapping, 'KeyG', [r'g', r'G', r'©', r'˝'], 'G'); - verifyEntry(mapping, 'KeyH', [r'h', r'H', r'˙', r'Ó'], 'H'); - verifyEntry(mapping, 'KeyI', [r'i', r'I', r'Dead', r'ˆ'], 'I'); - verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'∆', r'Ô'], 'J'); - verifyEntry(mapping, 'KeyK', [r'k', r'K', r'˚', r''], 'K'); - verifyEntry(mapping, 'KeyL', [r'l', r'L', r'¬', r'Ò'], 'L'); - verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r'Â'], 'M'); - verifyEntry(mapping, 'KeyN', [r'n', r'N', r'Dead', r'˜'], 'N'); - verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'O'); - verifyEntry(mapping, 'KeyP', [r'p', r'P', r'π', r'∏'], 'P'); - verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'œ', r'Œ'], 'Q'); - verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r'‰'], 'R'); - verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r'Í'], 'S'); - verifyEntry(mapping, 'KeyT', [r't', r'T', r'†', r'ˇ'], 'T'); - verifyEntry(mapping, 'KeyU', [r'u', r'U', r'Dead', r'¨'], 'U'); - verifyEntry(mapping, 'KeyV', [r'v', r'V', r'√', r'◊'], 'V'); - verifyEntry(mapping, 'KeyW', [r'w', r'W', r'∑', r'„'], 'W'); - verifyEntry(mapping, 'KeyX', [r'x', r'X', r'≈', r'˛'], 'X'); - verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'¥', r'Á'], 'Y'); - verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'Ω', r'¸'], 'Z'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'a'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'∫', r'ı'], 'b'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ç', r'Ç'], 'c'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'∂', r'Î'], 'd'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'Dead', r'´'], 'e'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ƒ', r'Ï'], 'f'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'©', r'˝'], 'g'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'˙', r'Ó'], 'h'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'Dead', r'ˆ'], 'i'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'∆', r'Ô'], 'j'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'˚', r''], 'k'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'¬', r'Ò'], 'l'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r'Â'], 'm'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'Dead', r'˜'], 'n'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'o'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'π', r'∏'], 'p'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'œ', r'Œ'], 'q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r'‰'], 'r'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r'Í'], 's'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'†', r'ˇ'], 't'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'Dead', r'¨'], 'u'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'√', r'◊'], 'v'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'∑', r'„'], 'w'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'≈', r'˛'], 'x'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'¥', r'Á'], 'y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'Ω', r'¸'], 'z'); }); group('jp-roman', () { @@ -1478,32 +1478,32 @@ void testDarwin(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'7', r'&', r'¶', r'‡'], '7'); verifyEntry(mapping, 'Digit8', [r'8', r'*', r'•', r'°'], '8'); verifyEntry(mapping, 'Digit9', [r'9', r'(', r'ª', r'·'], '9'); - verifyEntry(mapping, 'KeyA', [r'a', r'A', r'Dead', r'̄'], 'A'); - verifyEntry(mapping, 'KeyB', [r'b', r'B', r'Dead', r'̆'], 'B'); - verifyEntry(mapping, 'KeyC', [r'c', r'C', r'Dead', r'̧'], 'C'); - verifyEntry(mapping, 'KeyD', [r'd', r'D', r'ð', r'Ð'], 'D'); - verifyEntry(mapping, 'KeyE', [r'e', r'E', r'Dead', r'́'], 'E'); - verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ƒ', r''], 'F'); - verifyEntry(mapping, 'KeyG', [r'g', r'G', r'©', r'Dead'], 'G'); - verifyEntry(mapping, 'KeyH', [r'h', r'H', r'Dead', r'̱'], 'H'); - verifyEntry(mapping, 'KeyI', [r'i', r'I', r'Dead', r'̛'], 'I'); - verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'Dead', r'̋'], 'J'); - verifyEntry(mapping, 'KeyK', [r'k', r'K', r'Dead', r'̊'], 'K'); - verifyEntry(mapping, 'KeyL', [r'l', r'L', r'Dead', r'̵'], 'L'); - verifyEntry(mapping, 'KeyM', [r'm', r'M', r'Dead', r'̨'], 'M'); - verifyEntry(mapping, 'KeyN', [r'n', r'N', r'Dead', r'̃'], 'N'); - verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'O'); - verifyEntry(mapping, 'KeyP', [r'p', r'P', r'Dead', r'̦'], 'P'); - verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'œ', r'Œ'], 'Q'); - verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r'‰'], 'R'); - verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r''], 'S'); - verifyEntry(mapping, 'KeyT', [r't', r'T', r'þ', r'Þ'], 'T'); - verifyEntry(mapping, 'KeyU', [r'u', r'U', r'Dead', r'̈'], 'U'); - verifyEntry(mapping, 'KeyV', [r'v', r'V', r'Dead', r'̌'], 'V'); - verifyEntry(mapping, 'KeyW', [r'w', r'W', r'Dead', r'̇'], 'W'); - verifyEntry(mapping, 'KeyX', [r'x', r'X', r'Dead', r'̣'], 'X'); - verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'¥', r''], 'Y'); - verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'Dead', r'̉'], 'Z'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'Dead', r'̄'], 'a'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'Dead', r'̆'], 'b'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'Dead', r'̧'], 'c'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'ð', r'Ð'], 'd'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'Dead', r'́'], 'e'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ƒ', r''], 'f'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'©', r'Dead'], 'g'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'Dead', r'̱'], 'h'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'Dead', r'̛'], 'i'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'Dead', r'̋'], 'j'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'Dead', r'̊'], 'k'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'Dead', r'̵'], 'l'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'Dead', r'̨'], 'm'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'Dead', r'̃'], 'n'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'o'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'Dead', r'̦'], 'p'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'œ', r'Œ'], 'q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r'‰'], 'r'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r''], 's'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'þ', r'Þ'], 't'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'Dead', r'̈'], 'u'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'Dead', r'̌'], 'v'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'Dead', r'̇'], 'w'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'Dead', r'̣'], 'x'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'¥', r''], 'y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'Dead', r'̉'], 'z'); }); group('ko', () { @@ -1517,32 +1517,32 @@ void testDarwin(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'7', r'&', r'7', r'&'], '7'); verifyEntry(mapping, 'Digit8', [r'8', r'*', r'8', r'*'], '8'); verifyEntry(mapping, 'Digit9', [r'9', r'(', r'9', r'('], '9'); - verifyEntry(mapping, 'KeyA', [r'ㅁ', r'ㅁ', r'a', r'A'], 'A'); - verifyEntry(mapping, 'KeyB', [r'ㅠ', r'ㅠ', r'b', r'B'], 'B'); - verifyEntry(mapping, 'KeyC', [r'ㅊ', r'ㅊ', r'c', r'C'], 'C'); - verifyEntry(mapping, 'KeyD', [r'ㅇ', r'ㅇ', r'd', r'D'], 'D'); - verifyEntry(mapping, 'KeyE', [r'ㄷ', r'ㄸ', r'e', r'E'], 'E'); - verifyEntry(mapping, 'KeyF', [r'ㄹ', r'ㄹ', r'f', r'F'], 'F'); - verifyEntry(mapping, 'KeyG', [r'ㅎ', r'ㅎ', r'g', r'G'], 'G'); - verifyEntry(mapping, 'KeyH', [r'ㅗ', r'ㅗ', r'h', r'H'], 'H'); - verifyEntry(mapping, 'KeyI', [r'ㅑ', r'ㅑ', r'i', r'I'], 'I'); - verifyEntry(mapping, 'KeyJ', [r'ㅓ', r'ㅓ', r'j', r'J'], 'J'); - verifyEntry(mapping, 'KeyK', [r'ㅏ', r'ㅏ', r'k', r'K'], 'K'); - verifyEntry(mapping, 'KeyL', [r'ㅣ', r'ㅣ', r'l', r'L'], 'L'); - verifyEntry(mapping, 'KeyM', [r'ㅡ', r'ㅡ', r'm', r'M'], 'M'); - verifyEntry(mapping, 'KeyN', [r'ㅜ', r'ㅜ', r'n', r'N'], 'N'); - verifyEntry(mapping, 'KeyO', [r'ㅐ', r'ㅒ', r'o', r'O'], 'O'); - verifyEntry(mapping, 'KeyP', [r'ㅔ', r'ㅖ', r'p', r'P'], 'P'); - verifyEntry(mapping, 'KeyQ', [r'ㅂ', r'ㅃ', r'q', r'Q'], 'Q'); - verifyEntry(mapping, 'KeyR', [r'ㄱ', r'ㄲ', r'r', r'R'], 'R'); - verifyEntry(mapping, 'KeyS', [r'ㄴ', r'ㄴ', r's', r'S'], 'S'); - verifyEntry(mapping, 'KeyT', [r'ㅅ', r'ㅆ', r't', r'T'], 'T'); - verifyEntry(mapping, 'KeyU', [r'ㅕ', r'ㅕ', r'u', r'U'], 'U'); - verifyEntry(mapping, 'KeyV', [r'ㅍ', r'ㅍ', r'v', r'V'], 'V'); - verifyEntry(mapping, 'KeyW', [r'ㅈ', r'ㅉ', r'w', r'W'], 'W'); - verifyEntry(mapping, 'KeyX', [r'ㅌ', r'ㅌ', r'x', r'X'], 'X'); - verifyEntry(mapping, 'KeyY', [r'ㅛ', r'ㅛ', r'y', r'Y'], 'Y'); - verifyEntry(mapping, 'KeyZ', [r'ㅋ', r'ㅋ', r'z', r'Z'], 'Z'); + verifyEntry(mapping, 'KeyA', [r'ㅁ', r'ㅁ', r'a', r'A'], 'a'); + verifyEntry(mapping, 'KeyB', [r'ㅠ', r'ㅠ', r'b', r'B'], 'b'); + verifyEntry(mapping, 'KeyC', [r'ㅊ', r'ㅊ', r'c', r'C'], 'c'); + verifyEntry(mapping, 'KeyD', [r'ㅇ', r'ㅇ', r'd', r'D'], 'd'); + verifyEntry(mapping, 'KeyE', [r'ㄷ', r'ㄸ', r'e', r'E'], 'e'); + verifyEntry(mapping, 'KeyF', [r'ㄹ', r'ㄹ', r'f', r'F'], 'f'); + verifyEntry(mapping, 'KeyG', [r'ㅎ', r'ㅎ', r'g', r'G'], 'g'); + verifyEntry(mapping, 'KeyH', [r'ㅗ', r'ㅗ', r'h', r'H'], 'h'); + verifyEntry(mapping, 'KeyI', [r'ㅑ', r'ㅑ', r'i', r'I'], 'i'); + verifyEntry(mapping, 'KeyJ', [r'ㅓ', r'ㅓ', r'j', r'J'], 'j'); + verifyEntry(mapping, 'KeyK', [r'ㅏ', r'ㅏ', r'k', r'K'], 'k'); + verifyEntry(mapping, 'KeyL', [r'ㅣ', r'ㅣ', r'l', r'L'], 'l'); + verifyEntry(mapping, 'KeyM', [r'ㅡ', r'ㅡ', r'm', r'M'], 'm'); + verifyEntry(mapping, 'KeyN', [r'ㅜ', r'ㅜ', r'n', r'N'], 'n'); + verifyEntry(mapping, 'KeyO', [r'ㅐ', r'ㅒ', r'o', r'O'], 'o'); + verifyEntry(mapping, 'KeyP', [r'ㅔ', r'ㅖ', r'p', r'P'], 'p'); + verifyEntry(mapping, 'KeyQ', [r'ㅂ', r'ㅃ', r'q', r'Q'], 'q'); + verifyEntry(mapping, 'KeyR', [r'ㄱ', r'ㄲ', r'r', r'R'], 'r'); + verifyEntry(mapping, 'KeyS', [r'ㄴ', r'ㄴ', r's', r'S'], 's'); + verifyEntry(mapping, 'KeyT', [r'ㅅ', r'ㅆ', r't', r'T'], 't'); + verifyEntry(mapping, 'KeyU', [r'ㅕ', r'ㅕ', r'u', r'U'], 'u'); + verifyEntry(mapping, 'KeyV', [r'ㅍ', r'ㅍ', r'v', r'V'], 'v'); + verifyEntry(mapping, 'KeyW', [r'ㅈ', r'ㅉ', r'w', r'W'], 'w'); + verifyEntry(mapping, 'KeyX', [r'ㅌ', r'ㅌ', r'x', r'X'], 'x'); + verifyEntry(mapping, 'KeyY', [r'ㅛ', r'ㅛ', r'y', r'Y'], 'y'); + verifyEntry(mapping, 'KeyZ', [r'ㅋ', r'ㅋ', r'z', r'Z'], 'z'); }); group('pl', () { @@ -1556,32 +1556,32 @@ void testDarwin(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'7', r'&', r'¶', r'ŗ'], '7'); verifyEntry(mapping, 'Digit8', [r'8', r'*', r'•', r'°'], '8'); verifyEntry(mapping, 'Digit9', [r'9', r'(', r'Ľ', r'Š'], '9'); - verifyEntry(mapping, 'KeyA', [r'a', r'A', r'ą', r'Ą'], 'A'); - verifyEntry(mapping, 'KeyB', [r'b', r'B', r'ļ', r'ű'], 'B'); - verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ć', r'Ć'], 'C'); - verifyEntry(mapping, 'KeyD', [r'd', r'D', r'∂', r'Ž'], 'D'); - verifyEntry(mapping, 'KeyE', [r'e', r'E', r'ę', r'Ę'], 'E'); - verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ń', r'ž'], 'F'); - verifyEntry(mapping, 'KeyG', [r'g', r'G', r'©', r'Ū'], 'G'); - verifyEntry(mapping, 'KeyH', [r'h', r'H', r'ķ', r'Ó'], 'H'); - verifyEntry(mapping, 'KeyI', [r'i', r'I', r'Dead', r'ť'], 'I'); - verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'∆', r'Ô'], 'J'); - verifyEntry(mapping, 'KeyK', [r'k', r'K', r'Ż', r'ū'], 'K'); - verifyEntry(mapping, 'KeyL', [r'l', r'L', r'ł', r'Ł'], 'L'); - verifyEntry(mapping, 'KeyM', [r'm', r'M', r'Ķ', r'ų'], 'M'); - verifyEntry(mapping, 'KeyN', [r'n', r'N', r'ń', r'Ń'], 'N'); - verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ó', r'Ó'], 'O'); - verifyEntry(mapping, 'KeyP', [r'p', r'P', r'Ļ', r'ł'], 'P'); - verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'Ō', r'ő'], 'Q'); - verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r'£'], 'R'); - verifyEntry(mapping, 'KeyS', [r's', r'S', r'ś', r'Ś'], 'S'); - verifyEntry(mapping, 'KeyT', [r't', r'T', r'†', r'ś'], 'T'); - verifyEntry(mapping, 'KeyU', [r'u', r'U', r'Dead', r'Ť'], 'U'); - verifyEntry(mapping, 'KeyV', [r'v', r'V', r'√', r'◊'], 'V'); - verifyEntry(mapping, 'KeyW', [r'w', r'W', r'∑', r'„'], 'W'); - verifyEntry(mapping, 'KeyX', [r'x', r'X', r'ź', r'Ź'], 'X'); - verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'ī', r'Á'], 'Y'); - verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'ż', r'Ż'], 'Z'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'ą', r'Ą'], 'a'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'ļ', r'ű'], 'b'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ć', r'Ć'], 'c'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'∂', r'Ž'], 'd'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'ę', r'Ę'], 'e'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ń', r'ž'], 'f'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'©', r'Ū'], 'g'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'ķ', r'Ó'], 'h'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'Dead', r'ť'], 'i'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'∆', r'Ô'], 'j'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'Ż', r'ū'], 'k'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'ł', r'Ł'], 'l'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'Ķ', r'ų'], 'm'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'ń', r'Ń'], 'n'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ó', r'Ó'], 'o'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'Ļ', r'ł'], 'p'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'Ō', r'ő'], 'q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r'£'], 'r'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'ś', r'Ś'], 's'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'†', r'ś'], 't'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'Dead', r'Ť'], 'u'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'√', r'◊'], 'v'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'∑', r'„'], 'w'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'ź', r'Ź'], 'x'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'ī', r'Á'], 'y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'ż', r'Ż'], 'z'); }); group('pt', () { @@ -1595,32 +1595,32 @@ void testDarwin(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'7', r'&', r'¶', r'‡'], '7'); verifyEntry(mapping, 'Digit8', [r'8', r'*', r'•', r'°'], '8'); verifyEntry(mapping, 'Digit9', [r'9', r'(', r'ª', r'·'], '9'); - verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'A'); - verifyEntry(mapping, 'KeyB', [r'b', r'B', r'∫', r'ı'], 'B'); - verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ç', r'Ç'], 'C'); - verifyEntry(mapping, 'KeyD', [r'd', r'D', r'∂', r'Î'], 'D'); - verifyEntry(mapping, 'KeyE', [r'e', r'E', r'Dead', r'´'], 'E'); - verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ƒ', r'Ï'], 'F'); - verifyEntry(mapping, 'KeyG', [r'g', r'G', r'©', r'˝'], 'G'); - verifyEntry(mapping, 'KeyH', [r'h', r'H', r'˙', r'Ó'], 'H'); - verifyEntry(mapping, 'KeyI', [r'i', r'I', r'Dead', r'ˆ'], 'I'); - verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'∆', r'Ô'], 'J'); - verifyEntry(mapping, 'KeyK', [r'k', r'K', r'˚', r''], 'K'); - verifyEntry(mapping, 'KeyL', [r'l', r'L', r'¬', r'Ò'], 'L'); - verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r'Â'], 'M'); - verifyEntry(mapping, 'KeyN', [r'n', r'N', r'Dead', r'˜'], 'N'); - verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'O'); - verifyEntry(mapping, 'KeyP', [r'p', r'P', r'π', r'∏'], 'P'); - verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'œ', r'Œ'], 'Q'); - verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r'‰'], 'R'); - verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r'Í'], 'S'); - verifyEntry(mapping, 'KeyT', [r't', r'T', r'†', r'ˇ'], 'T'); - verifyEntry(mapping, 'KeyU', [r'u', r'U', r'Dead', r'¨'], 'U'); - verifyEntry(mapping, 'KeyV', [r'v', r'V', r'√', r'◊'], 'V'); - verifyEntry(mapping, 'KeyW', [r'w', r'W', r'∑', r'„'], 'W'); - verifyEntry(mapping, 'KeyX', [r'x', r'X', r'≈', r'˛'], 'X'); - verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'¥', r'Á'], 'Y'); - verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'Ω', r'¸'], 'Z'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'a'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'∫', r'ı'], 'b'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ç', r'Ç'], 'c'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'∂', r'Î'], 'd'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'Dead', r'´'], 'e'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ƒ', r'Ï'], 'f'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'©', r'˝'], 'g'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'˙', r'Ó'], 'h'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'Dead', r'ˆ'], 'i'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'∆', r'Ô'], 'j'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'˚', r''], 'k'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'¬', r'Ò'], 'l'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r'Â'], 'm'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'Dead', r'˜'], 'n'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'o'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'π', r'∏'], 'p'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'œ', r'Œ'], 'q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r'‰'], 'r'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r'Í'], 's'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'†', r'ˇ'], 't'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'Dead', r'¨'], 'u'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'√', r'◊'], 'v'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'∑', r'„'], 'w'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'≈', r'˛'], 'x'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'¥', r'Á'], 'y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'Ω', r'¸'], 'z'); }); group('ru', () { @@ -1634,32 +1634,32 @@ void testDarwin(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'7', r'.', r'&', r'¶'], '7'); verifyEntry(mapping, 'Digit8', [r'8', r';', r'*', r'√'], '8'); verifyEntry(mapping, 'Digit9', [r'9', r'(', r'{', r"'"], '9'); - verifyEntry(mapping, 'KeyA', [r'ф', r'Ф', r'ƒ', r'ƒ'], 'A'); - verifyEntry(mapping, 'KeyB', [r'и', r'И', r'и', r'И'], 'B'); - verifyEntry(mapping, 'KeyC', [r'с', r'С', r'≠', r'≠'], 'C'); - verifyEntry(mapping, 'KeyD', [r'в', r'В', r'ћ', r'Ћ'], 'D'); - verifyEntry(mapping, 'KeyE', [r'у', r'У', r'ќ', r'Ќ'], 'E'); - verifyEntry(mapping, 'KeyF', [r'а', r'А', r'÷', r'÷'], 'F'); - verifyEntry(mapping, 'KeyG', [r'п', r'П', r'©', r'©'], 'G'); - verifyEntry(mapping, 'KeyH', [r'р', r'Р', r'₽', r'₽'], 'H'); - verifyEntry(mapping, 'KeyI', [r'ш', r'Ш', r'ѕ', r'Ѕ'], 'I'); - verifyEntry(mapping, 'KeyJ', [r'о', r'О', r'°', r'•'], 'J'); - verifyEntry(mapping, 'KeyK', [r'л', r'Л', r'љ', r'Љ'], 'K'); - verifyEntry(mapping, 'KeyL', [r'д', r'Д', r'∆', r'∆'], 'L'); - verifyEntry(mapping, 'KeyM', [r'ь', r'Ь', r'~', r'~'], 'M'); - verifyEntry(mapping, 'KeyN', [r'т', r'Т', r'™', r'™'], 'N'); - verifyEntry(mapping, 'KeyO', [r'щ', r'Щ', r'ў', r'Ў'], 'O'); - verifyEntry(mapping, 'KeyP', [r'з', r'З', r'‘', r'’'], 'P'); - verifyEntry(mapping, 'KeyQ', [r'й', r'Й', r'ј', r'Ј'], 'Q'); - verifyEntry(mapping, 'KeyR', [r'к', r'К', r'®', r'®'], 'R'); - verifyEntry(mapping, 'KeyS', [r'ы', r'Ы', r'ы', r'Ы'], 'S'); - verifyEntry(mapping, 'KeyT', [r'е', r'Е', r'†', r'†'], 'T'); - verifyEntry(mapping, 'KeyU', [r'г', r'Г', r'ѓ', r'Ѓ'], 'U'); - verifyEntry(mapping, 'KeyV', [r'м', r'М', r'µ', r'µ'], 'V'); - verifyEntry(mapping, 'KeyW', [r'ц', r'Ц', r'џ', r'Џ'], 'W'); - verifyEntry(mapping, 'KeyX', [r'ч', r'Ч', r'≈', r'≈'], 'X'); - verifyEntry(mapping, 'KeyY', [r'н', r'Н', r'њ', r'Њ'], 'Y'); - verifyEntry(mapping, 'KeyZ', [r'я', r'Я', r'ђ', r'Ђ'], 'Z'); + verifyEntry(mapping, 'KeyA', [r'ф', r'Ф', r'ƒ', r'ƒ'], 'a'); + verifyEntry(mapping, 'KeyB', [r'и', r'И', r'и', r'И'], 'b'); + verifyEntry(mapping, 'KeyC', [r'с', r'С', r'≠', r'≠'], 'c'); + verifyEntry(mapping, 'KeyD', [r'в', r'В', r'ћ', r'Ћ'], 'd'); + verifyEntry(mapping, 'KeyE', [r'у', r'У', r'ќ', r'Ќ'], 'e'); + verifyEntry(mapping, 'KeyF', [r'а', r'А', r'÷', r'÷'], 'f'); + verifyEntry(mapping, 'KeyG', [r'п', r'П', r'©', r'©'], 'g'); + verifyEntry(mapping, 'KeyH', [r'р', r'Р', r'₽', r'₽'], 'h'); + verifyEntry(mapping, 'KeyI', [r'ш', r'Ш', r'ѕ', r'Ѕ'], 'i'); + verifyEntry(mapping, 'KeyJ', [r'о', r'О', r'°', r'•'], 'j'); + verifyEntry(mapping, 'KeyK', [r'л', r'Л', r'љ', r'Љ'], 'k'); + verifyEntry(mapping, 'KeyL', [r'д', r'Д', r'∆', r'∆'], 'l'); + verifyEntry(mapping, 'KeyM', [r'ь', r'Ь', r'~', r'~'], 'm'); + verifyEntry(mapping, 'KeyN', [r'т', r'Т', r'™', r'™'], 'n'); + verifyEntry(mapping, 'KeyO', [r'щ', r'Щ', r'ў', r'Ў'], 'o'); + verifyEntry(mapping, 'KeyP', [r'з', r'З', r'‘', r'’'], 'p'); + verifyEntry(mapping, 'KeyQ', [r'й', r'Й', r'ј', r'Ј'], 'q'); + verifyEntry(mapping, 'KeyR', [r'к', r'К', r'®', r'®'], 'r'); + verifyEntry(mapping, 'KeyS', [r'ы', r'Ы', r'ы', r'Ы'], 's'); + verifyEntry(mapping, 'KeyT', [r'е', r'Е', r'†', r'†'], 't'); + verifyEntry(mapping, 'KeyU', [r'г', r'Г', r'ѓ', r'Ѓ'], 'u'); + verifyEntry(mapping, 'KeyV', [r'м', r'М', r'µ', r'µ'], 'v'); + verifyEntry(mapping, 'KeyW', [r'ц', r'Ц', r'џ', r'Џ'], 'w'); + verifyEntry(mapping, 'KeyX', [r'ч', r'Ч', r'≈', r'≈'], 'x'); + verifyEntry(mapping, 'KeyY', [r'н', r'Н', r'њ', r'Њ'], 'y'); + verifyEntry(mapping, 'KeyZ', [r'я', r'Я', r'ђ', r'Ђ'], 'z'); }); group('sv', () { @@ -1673,32 +1673,32 @@ void testDarwin(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'7', r'/', r'|', r'\'], '7'); verifyEntry(mapping, 'Digit8', [r'8', r'(', r'[', r'{'], '8'); verifyEntry(mapping, 'Digit9', [r'9', r')', r']', r'}'], '9'); - verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r'◊'], 'A'); - verifyEntry(mapping, 'KeyB', [r'b', r'B', r'›', r'»'], 'B'); - verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ç', r'Ç'], 'C'); - verifyEntry(mapping, 'KeyD', [r'd', r'D', r'∂', r'∆'], 'D'); - verifyEntry(mapping, 'KeyE', [r'e', r'E', r'é', r'É'], 'E'); - verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ƒ', r'∫'], 'F'); - verifyEntry(mapping, 'KeyG', [r'g', r'G', r'¸', r'¯'], 'G'); - verifyEntry(mapping, 'KeyH', [r'h', r'H', r'˛', r'˘'], 'H'); - verifyEntry(mapping, 'KeyI', [r'i', r'I', r'ı', r'ˆ'], 'I'); - verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'√', r'¬'], 'J'); - verifyEntry(mapping, 'KeyK', [r'k', r'K', r'ª', r'º'], 'K'); - verifyEntry(mapping, 'KeyL', [r'l', r'L', r'fi', r'fl'], 'L'); - verifyEntry(mapping, 'KeyM', [r'm', r'M', r'’', r'”'], 'M'); - verifyEntry(mapping, 'KeyN', [r'n', r'N', r'‘', r'“'], 'N'); - verifyEntry(mapping, 'KeyO', [r'o', r'O', r'œ', r'Œ'], 'O'); - verifyEntry(mapping, 'KeyP', [r'p', r'P', r'π', r'∏'], 'P'); - verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'•', r'°'], 'Q'); - verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r'√'], 'R'); - verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r'∑'], 'S'); - verifyEntry(mapping, 'KeyT', [r't', r'T', r'†', r'‡'], 'T'); - verifyEntry(mapping, 'KeyU', [r'u', r'U', r'ü', r'Ü'], 'U'); - verifyEntry(mapping, 'KeyV', [r'v', r'V', r'‹', r'«'], 'V'); - verifyEntry(mapping, 'KeyW', [r'w', r'W', r'Ω', r'˝'], 'W'); - verifyEntry(mapping, 'KeyX', [r'x', r'X', r'≈', r'ˇ'], 'X'); - verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'µ', r'˜'], 'Y'); - verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'÷', r'⁄'], 'Z'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r'◊'], 'a'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'›', r'»'], 'b'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ç', r'Ç'], 'c'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'∂', r'∆'], 'd'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'é', r'É'], 'e'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ƒ', r'∫'], 'f'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'¸', r'¯'], 'g'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'˛', r'˘'], 'h'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'ı', r'ˆ'], 'i'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'√', r'¬'], 'j'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'ª', r'º'], 'k'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'fi', r'fl'], 'l'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'’', r'”'], 'm'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'‘', r'“'], 'n'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'œ', r'Œ'], 'o'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'π', r'∏'], 'p'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'•', r'°'], 'q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r'√'], 'r'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r'∑'], 's'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'†', r'‡'], 't'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'ü', r'Ü'], 'u'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'‹', r'«'], 'v'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'Ω', r'˝'], 'w'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'≈', r'ˇ'], 'x'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'µ', r'˜'], 'y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'÷', r'⁄'], 'z'); }); group('zh-hans', () { @@ -1712,31 +1712,31 @@ void testDarwin(LocaleKeymap mapping) { verifyEntry(mapping, 'Digit7', [r'7', r'&', r'¶', r'‡'], '7'); verifyEntry(mapping, 'Digit8', [r'8', r'*', r'•', r'°'], '8'); verifyEntry(mapping, 'Digit9', [r'9', r'(', r'ª', r'·'], '9'); - verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'A'); - verifyEntry(mapping, 'KeyB', [r'b', r'B', r'∫', r'ı'], 'B'); - verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ç', r'Ç'], 'C'); - verifyEntry(mapping, 'KeyD', [r'd', r'D', r'∂', r'Î'], 'D'); - verifyEntry(mapping, 'KeyE', [r'e', r'E', r'Dead', r'´'], 'E'); - verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ƒ', r'Ï'], 'F'); - verifyEntry(mapping, 'KeyG', [r'g', r'G', r'©', r'˝'], 'G'); - verifyEntry(mapping, 'KeyH', [r'h', r'H', r'˙', r'Ó'], 'H'); - verifyEntry(mapping, 'KeyI', [r'i', r'I', r'Dead', r'ˆ'], 'I'); - verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'∆', r'Ô'], 'J'); - verifyEntry(mapping, 'KeyK', [r'k', r'K', r'˚', r''], 'K'); - verifyEntry(mapping, 'KeyL', [r'l', r'L', r'¬', r'Ò'], 'L'); - verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r'Â'], 'M'); - verifyEntry(mapping, 'KeyN', [r'n', r'N', r'Dead', r'˜'], 'N'); - verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'O'); - verifyEntry(mapping, 'KeyP', [r'p', r'P', r'π', r'∏'], 'P'); - verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'œ', r'Œ'], 'Q'); - verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r'‰'], 'R'); - verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r'Í'], 'S'); - verifyEntry(mapping, 'KeyT', [r't', r'T', r'†', r'ˇ'], 'T'); - verifyEntry(mapping, 'KeyU', [r'u', r'U', r'Dead', r'¨'], 'U'); - verifyEntry(mapping, 'KeyV', [r'v', r'V', r'√', r'◊'], 'V'); - verifyEntry(mapping, 'KeyW', [r'w', r'W', r'∑', r'„'], 'W'); - verifyEntry(mapping, 'KeyX', [r'x', r'X', r'≈', r'˛'], 'X'); - verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'¥', r'Á'], 'Y'); - verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'Ω', r'¸'], 'Z'); + verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'a'); + verifyEntry(mapping, 'KeyB', [r'b', r'B', r'∫', r'ı'], 'b'); + verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ç', r'Ç'], 'c'); + verifyEntry(mapping, 'KeyD', [r'd', r'D', r'∂', r'Î'], 'd'); + verifyEntry(mapping, 'KeyE', [r'e', r'E', r'Dead', r'´'], 'e'); + verifyEntry(mapping, 'KeyF', [r'f', r'F', r'ƒ', r'Ï'], 'f'); + verifyEntry(mapping, 'KeyG', [r'g', r'G', r'©', r'˝'], 'g'); + verifyEntry(mapping, 'KeyH', [r'h', r'H', r'˙', r'Ó'], 'h'); + verifyEntry(mapping, 'KeyI', [r'i', r'I', r'Dead', r'ˆ'], 'i'); + verifyEntry(mapping, 'KeyJ', [r'j', r'J', r'∆', r'Ô'], 'j'); + verifyEntry(mapping, 'KeyK', [r'k', r'K', r'˚', r''], 'k'); + verifyEntry(mapping, 'KeyL', [r'l', r'L', r'¬', r'Ò'], 'l'); + verifyEntry(mapping, 'KeyM', [r'm', r'M', r'µ', r'Â'], 'm'); + verifyEntry(mapping, 'KeyN', [r'n', r'N', r'Dead', r'˜'], 'n'); + verifyEntry(mapping, 'KeyO', [r'o', r'O', r'ø', r'Ø'], 'o'); + verifyEntry(mapping, 'KeyP', [r'p', r'P', r'π', r'∏'], 'p'); + verifyEntry(mapping, 'KeyQ', [r'q', r'Q', r'œ', r'Œ'], 'q'); + verifyEntry(mapping, 'KeyR', [r'r', r'R', r'®', r'‰'], 'r'); + verifyEntry(mapping, 'KeyS', [r's', r'S', r'ß', r'Í'], 's'); + verifyEntry(mapping, 'KeyT', [r't', r'T', r'†', r'ˇ'], 't'); + verifyEntry(mapping, 'KeyU', [r'u', r'U', r'Dead', r'¨'], 'u'); + verifyEntry(mapping, 'KeyV', [r'v', r'V', r'√', r'◊'], 'v'); + verifyEntry(mapping, 'KeyW', [r'w', r'W', r'∑', r'„'], 'w'); + verifyEntry(mapping, 'KeyX', [r'x', r'X', r'≈', r'˛'], 'x'); + verifyEntry(mapping, 'KeyY', [r'y', r'Y', r'¥', r'Á'], 'y'); + verifyEntry(mapping, 'KeyZ', [r'z', r'Z', r'Ω', r'¸'], 'z'); }); } diff --git a/third_party/web_locale_keymap/test/testing.dart b/third_party/web_locale_keymap/test/testing.dart index 8204a5f3222d8..a8e340f86b2f4 100644 --- a/third_party/web_locale_keymap/test/testing.dart +++ b/third_party/web_locale_keymap/test/testing.dart @@ -35,7 +35,7 @@ void verifyEntry(LocaleKeymap mapping, String eventCode, List eventKeys, int? eventKeyCode; { if (_isLetter(eventKeys[0]) && _isLetter(eventKeys[1])) { - eventKeyCode = eventKeys[0].toUpperCase().codeUnitAt(0); + eventKeyCode = eventKeys[0].toLowerCase().codeUnitAt(0); } } diff --git a/tools/gen_web_locale_keymap/README.md b/tools/gen_web_locale_keymap/README.md index 4c22c4deab023..d9ecaa17ee39c 100644 --- a/tools/gen_web_locale_keymap/README.md +++ b/tools/gen_web_locale_keymap/README.md @@ -62,5 +62,5 @@ extracted as the so-called "heuristic mapper". This reduces the map from over 1600 entries to ~450 entries. To further reduce the package size overhead, the map is encoded into a string -that is decoded at run time. This reduces the package size over by 33% at the +that is decoded at run time. This reduces the package size over by 27% at the cost of code complexity. diff --git a/tools/gen_web_locale_keymap/bin/gen_web_locale_keymap.dart b/tools/gen_web_locale_keymap/bin/gen_web_locale_keymap.dart index 7f48f46e8a775..503f15a197cef 100644 --- a/tools/gen_web_locale_keymap/bin/gen_web_locale_keymap.dart +++ b/tools/gen_web_locale_keymap/bin/gen_web_locale_keymap.dart @@ -102,27 +102,14 @@ bool _verifyMap(Map> a, Map> b return true; } -String _prettyPrintBody(String body, int width) { - int min(int a, int b) { - return a < b ? a : b; - } - final List result = []; - int start = 0; - while (start < body.length) { - final String row = body.substring(start, min(body.length, start + width)); - result.add(' ${_escapeStringToDart(row)}'); - start += width; - } - return result.join('\n'); -} - String _buildMapString(Iterable layouts) { final Map> originalMap = combineLayouts(layouts); - final String compressed = marshallMappingData(originalMap); - final Map> uncompressed = unmarshallMappingData(compressed); + final List compressed = marshallMappingData(originalMap); + final Map> uncompressed = unmarshallMappingData(compressed.join()); assert(_verifyMap(originalMap, uncompressed)); - return ' return unmarshallMappingData(\n${_prettyPrintBody(compressed, 64)});' - ' // ${compressed.length} characters'; + return ' return unmarshallMappingData(\n' + '${compressed.map((String line) => ' ${_escapeStringToDart(line)}\n').join()}' + ' ); // ${compressed.join().length} characters'; } String _buildTestCasesString(List layouts) { diff --git a/tools/gen_web_locale_keymap/lib/common.dart b/tools/gen_web_locale_keymap/lib/common.dart index 1f92fc62f83be..5c9a037c48b20 100644 --- a/tools/gen_web_locale_keymap/lib/common.dart +++ b/tools/gen_web_locale_keymap/lib/common.dart @@ -23,32 +23,32 @@ const String _kEventKeyDead = 'Dead'; /// A map of all goals from the scan codes to their mapped value in US layout. const Map kLayoutGoals = { - 'KeyA': 'A', - 'KeyB': 'B', - 'KeyC': 'C', - 'KeyD': 'D', - 'KeyE': 'E', - 'KeyF': 'F', - 'KeyG': 'G', - 'KeyH': 'H', - 'KeyI': 'I', - 'KeyJ': 'J', - 'KeyK': 'K', - 'KeyL': 'L', - 'KeyM': 'M', - 'KeyN': 'N', - 'KeyO': 'O', - 'KeyP': 'P', - 'KeyQ': 'Q', - 'KeyR': 'R', - 'KeyS': 'S', - 'KeyT': 'T', - 'KeyU': 'U', - 'KeyV': 'V', - 'KeyW': 'W', - 'KeyX': 'X', - 'KeyY': 'Y', - 'KeyZ': 'Z', + 'KeyA': 'a', + 'KeyB': 'b', + 'KeyC': 'c', + 'KeyD': 'd', + 'KeyE': 'e', + 'KeyF': 'f', + 'KeyG': 'g', + 'KeyH': 'h', + 'KeyI': 'i', + 'KeyJ': 'j', + 'KeyK': 'k', + 'KeyL': 'l', + 'KeyM': 'm', + 'KeyN': 'n', + 'KeyO': 'o', + 'KeyP': 'p', + 'KeyQ': 'q', + 'KeyR': 'r', + 'KeyS': 's', + 'KeyT': 't', + 'KeyU': 'u', + 'KeyV': 'v', + 'KeyW': 'w', + 'KeyX': 'x', + 'KeyY': 'y', + 'KeyZ': 'z', 'Digit1': '1', 'Digit2': '2', 'Digit3': '3', @@ -243,16 +243,20 @@ void _marshallEventKey(StringBuffer builder, String value) { } } -/// Encode a key mapping data into a string. +/// Encode a key mapping data into a list of strings. +/// +/// The list of strings should be used concatenated, but is returned this way +/// for aesthetic purposes (one entry per line). /// /// The algorithm aims at encoding the map directly into a printable string /// (instead of a binary stream converted by base64). Some characters in the /// string can be multi-byte, which means the decoder should parse the string /// using substr instead of as a binary stream. -String marshallMappingData(Map> mappingData) { +List marshallMappingData(Map> mappingData) { final StringBuffer builder = StringBuffer(); _marshallIntAsVerbatim(builder, mappingData.length); _sortedForEach(mappingData, (String eventCode, Map codeMap) { + builder.write('\n'); _marshallString(builder, eventCode); _marshallIntAsVerbatim(builder, codeMap.length); _sortedForEach(codeMap, (String eventKey, int logicalKey) { @@ -260,5 +264,5 @@ String marshallMappingData(Map> mappingData) { _marshallIntAsChar(builder, logicalKey); }); }); - return builder.toString(); + return builder.toString().split('\n'); } diff --git a/web_sdk/BUILD.gn b/web_sdk/BUILD.gn index 220c3ba77d4ee..792e005a5779d 100644 --- a/web_sdk/BUILD.gn +++ b/web_sdk/BUILD.gn @@ -126,7 +126,7 @@ sdk_rewriter("web_locale_keymap_library") { api_file = "//flutter/third_party/web_locale_keymap/lib/web_locale_keymap.dart" input_dir = "//flutter/third_party/web_locale_keymap/lib/web_locale_keymap/" - output_dir = "$root_out_dir/flutter_web_sdk/lib/web_locale_keymap/" + output_dir = "$root_out_dir/flutter_web_sdk/lib/_web_locale_keymap/" } sdk_rewriter("web_engine_library") { @@ -321,7 +321,7 @@ template("_compile_platform") { "--source", "dart:_web_unicode", "--source", - "dart:web_locale_keymap", + "dart:_web_locale_keymap", ] if (flutter_prebuilt_dart_sdk) { args += [ @@ -495,7 +495,7 @@ template("_compile_ddc_modules") { "dart:_engine", "dart:_skwasm_stub", "dart:_web_unicode", - "dart:web_locale_keymap", + "dart:_web_locale_keymap", "--no-summarize", "--packages", "file:///" + rebase_path(dart_sdk_package_config), diff --git a/web_sdk/libraries.json b/web_sdk/libraries.json index ff0b96c7630a5..c4dd531171eee 100644 --- a/web_sdk/libraries.json +++ b/web_sdk/libraries.json @@ -15,14 +15,14 @@ "_engine": { "uri": "lib/_engine/engine.dart" }, - "web_locale_keymap": { - "uri": "lib/web_locale_keymap/web_locale_keymap.dart" - }, "_skwasm_stub": { "uri": "lib/_skwasm_stub/skwasm_stub.dart" }, "_web_unicode": { "uri": "lib/_web_unicode/web_unicode.dart" + }, + "_web_locale_keymap": { + "uri": "lib/_web_locale_keymap/web_locale_keymap.dart" } } }, @@ -46,8 +46,8 @@ "_web_unicode": { "uri": "lib/_web_unicode/web_unicode.dart" }, - "web_locale_keymap": { - "uri": "lib/web_locale_keymap/web_locale_keymap.dart" + "_web_locale_keymap": { + "uri": "lib/_web_locale_keymap/web_locale_keymap.dart" } } }, @@ -71,8 +71,8 @@ "_web_unicode": { "uri": "lib/_web_unicode/web_unicode.dart" }, - "web_locale_keymap": { - "uri": "lib/web_locale_keymap/web_locale_keymap.dart" + "_web_locale_keymap": { + "uri": "lib/_web_locale_keymap/web_locale_keymap.dart" } } } diff --git a/web_sdk/libraries.yaml b/web_sdk/libraries.yaml index 320cbc8745717..c55ddfbafc84d 100644 --- a/web_sdk/libraries.yaml +++ b/web_sdk/libraries.yaml @@ -30,8 +30,8 @@ dartdevc: _web_unicode: uri: "lib/_web_unicode/web_unicode.dart" - web_locale_keymap: - uri: "lib/web_locale_keymap/web_locale_keymap.dart" + _web_locale_keymap: + uri: "lib/_web_locale_keymap/web_locale_keymap.dart" dart2js: include: @@ -50,8 +50,8 @@ dart2js: _web_unicode: uri: "lib/_web_unicode/web_unicode.dart" - web_locale_keymap: - uri: "lib/web_locale_keymap/web_locale_keymap.dart" + _web_locale_keymap: + uri: "lib/_web_locale_keymap/web_locale_keymap.dart" wasm: include: @@ -69,3 +69,6 @@ wasm: _web_unicode: uri: "lib/_web_unicode/web_unicode.dart" + + _web_locale_keymap: + uri: "lib/_web_locale_keymap/web_locale_keymap.dart" diff --git a/web_sdk/sdk_rewriter.dart b/web_sdk/sdk_rewriter.dart index e1fce30dc33f3..e1b1e04024827 100644 --- a/web_sdk/sdk_rewriter.dart +++ b/web_sdk/sdk_rewriter.dart @@ -94,7 +94,7 @@ final Map extraImportsMap = { RegExp('skwasm_(stub|impl)'): "import 'dart:_skwasm_stub' if (dart.library.ffi) 'dart:_skwasm_impl';", 'engine': "import 'dart:_engine';", 'web_unicode': "import 'dart:_web_unicode';", - 'web_locale_keymap': "import 'dart:web_locale_keymap' as locale_keymap;", + 'web_locale_keymap': "import 'dart:_web_locale_keymap' as locale_keymap;", }; // Rewrites the "package"-style web ui library into a dart:ui implementation. diff --git a/web_sdk/test/sdk_rewriter_test.dart b/web_sdk/test/sdk_rewriter_test.dart index b1da2ad6c7113..364e0a2e49231 100644 --- a/web_sdk/test/sdk_rewriter_test.dart +++ b/web_sdk/test/sdk_rewriter_test.dart @@ -35,7 +35,6 @@ import 'dart:_js_annotations'; import 'dart:math' as math; import 'dart:typed_data'; import 'dart:ui' as ui; -import 'dart:web_locale_keymap' as locale_keymap; import 'dart:extra'; @@ -131,14 +130,17 @@ void printSomething() { expect(getExtraImportsForLibrary('engine'), [ "import 'dart:_skwasm_stub' if (dart.library.ffi) 'dart:_skwasm_impl';", "import 'dart:_web_unicode';", + "import 'dart:_web_locale_keymap' as locale_keymap;", ]); expect(getExtraImportsForLibrary('skwasm_stub'), [ "import 'dart:_engine';", "import 'dart:_web_unicode';", + "import 'dart:_web_locale_keymap' as locale_keymap;", ]); expect(getExtraImportsForLibrary('skwasm_impl'), [ "import 'dart:_engine';", "import 'dart:_web_unicode';", + "import 'dart:_web_locale_keymap' as locale_keymap;", ]); // Other libraries (should not have extra imports). From 3cfaf339bb4c2e6cb83e9e1bff256714ab96bfa5 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 28 Nov 2022 14:47:29 -0800 Subject: [PATCH 68/74] Better event code encoding --- .../lib/web_locale_keymap/key_mappings.g.dart | 184 +++++++++--------- .../bin/gen_web_locale_keymap.dart | 11 +- tools/gen_web_locale_keymap/lib/common.dart | 38 ++-- 3 files changed, 115 insertions(+), 118 deletions(-) diff --git a/third_party/web_locale_keymap/lib/web_locale_keymap/key_mappings.g.dart b/third_party/web_locale_keymap/lib/web_locale_keymap/key_mappings.g.dart index 43273c2cdefdf..a440eb65b2eaa 100644 --- a/third_party/web_locale_keymap/lib/web_locale_keymap/key_mappings.g.dart +++ b/third_party/web_locale_keymap/lib/web_locale_keymap/key_mappings.g.dart @@ -129,6 +129,12 @@ class _StringStream { _StringStream(this._data) : _offset = 0; final String _data; + final Map _goalToEventCode = Map.fromEntries( + kLayoutGoals + .entries + .map((MapEntry beforeEntry) => + MapEntry(beforeEntry.value.codeUnitAt(0), beforeEntry.key)) + ); int get offest => _offset; int _offset; @@ -155,14 +161,10 @@ class _StringStream { } } - String readString() { - final int length = readIntAsVerbatim(); - if (length == 0) { - return ''; - } - final String result = _data.substring(_offset, _offset + length); - _offset += length; - return result; + String readEventCode() { + final int charCode = _data.codeUnitAt(_offset); + _offset += 1; + return _goalToEventCode[charCode]!; } } @@ -181,7 +183,7 @@ Map> unmarshallMappingData(String compressed) { final int eventCodeNum = stream.readIntAsVerbatim(); return Map>.fromEntries((() sync* { for (int eventCodeIndex = 0; eventCodeIndex < eventCodeNum; eventCodeIndex += 1) { - yield MapEntry>(stream.readString(), _unmarshallCodeMap(stream)); + yield MapEntry>(stream.readEventCode(), _unmarshallCodeMap(stream)); } })()); } @@ -196,29 +198,29 @@ Map> unmarshallMappingData(String compressed) { Map> getMappingDataWin() { return unmarshallMappingData( r'F' - r'9Backquote1§0' - r'6Digit04)0=0@0}0' - r"6Digit17!1&1'1+1>1|1~1" - '6Digit25"2\'2/2@2~2' - r'6Digit36"3#3*3+3-3^3' - r"6Digit47!4$4'4+4;4{4~4" - r'6Digit53%5(5[5' - r'6Digit66&6-6/6:6^6|6' - r'6Digit77&7/7=7?7`7{7|7' - r'6Digit86!8(8*8[8\8_8' - r'6Digit95(9)9]9^9{9' - r'4KeyB1{b' - r'4KeyC1&c' - r'4KeyF1[f' - r'4KeyG1]g' - r'4KeyM2y' - ); // 308 characters + r'`1§0' + r'04)0=0@0}0' + r"17!1&1'1+1>1|1~1" + '25"2\'2/2@2~2' + r'36"3#3*3+3-3^3' + r"47!4$4'4+4;4{4~4" + r'53%5(5[5' + r'66&6-6/6:6^6|6' + r'77&7/7=7?7`7{7|7' + r'86!8(8*8[8\8_8' + r'95(9)9]9^9{9' + r'b1{b' + r'c1&c' + r'f1[f' + r'g1]g' + r'm2y' + ); // 195 characters } /// Data for [LocaleKeymap] on Linux. @@ -231,25 +233,25 @@ Map> getMappingDataWin() { Map> getMappingDataLinux() { return unmarshallMappingData( r'B' - r'6Digit04)0=0@0}0' - r'6Digit13!1&1|1' - r'6Digit23"2@2~2' - r'6Digit32"3#3' - r"6Digit45$4'4;4{4~4" - r'6Digit53%5(5[5' - r'6Digit65&6-6:6^6|6' - r'6Digit75&7/7?7`7{7' - r'6Digit85(8*8[8\8_8' - r'6Digit94(9)9]9^9' - r'4KeyA2@qΩq' - r'4KeyK1&k' - r'4KeyQ3@qÆaæa' - r'4KeyW2x' - r'4KeyY2¥ÿ←ÿ' - r'4KeyZ5x' + r'y2¥ÿ←ÿ' + r'z5> getMappingDataLinux() { Map> getMappingDataDarwin() { return unmarshallMappingData( r'W' - r'5Comma2„w∑w' - r'6Digit04)0=0`0}0' - r'6Digit13!1&1|1' - r'6Digit22"2@2' - r'6Digit32"3#3' - r"6Digit43$4%4'4" - r'6Digit56%5(5:5[5{5~5' - r'6Digit65 6&6,6]6^6' - r'6Digit75&7.7/7\7|7' - r'6Digit86!8(8*8;8[8{8' - r"6Digit97 9'9(9)9]9{9}9" - r'4KeyA2Ωq‡q' - r'4KeyB2˛x≈x' - r'4KeyC3 cÔj∆j' - r'4KeyD2þe´e' - r'4KeyF2þu¨u' - r'4KeyG2þÿˆi' - r'4KeyH3 hÎÿ∂d' - r'4KeyI3 iÇcçc' - r'4KeyJ2Óh˙h' - r'4KeyK2ˇÿ†t' - r'4KeyL5 l@lþÿ|l˜n' - r'4KeyM1~m' - r'4KeyN3 nıÿ∫b' - r'4KeyO2®r‰r' - r'4KeyP2¬lÒl' - r'4KeyQ2Æaæa' - r'4KeyR3 rπp∏p' - r'4KeyS3 sØoøo' - r'4KeyT2¥yÁy' - r'4KeyU3 u©g˝g' - r'4KeyV2˚kk' - r'4KeyW2ÂzÅz' - r'4KeyX2Œqœq' - r'4KeyY5 yÏfƒfˇzΩz' - r'4KeyZ5 z¥y‡y‹ÿ›w' - r'6Period2√v◊v' - r'9Semicolon4µmÍsÓmßs' - r'5Slash2¸zΩz' - ); // 500 characters + r',2„w∑w' + r'04)0=0`0}0' + r'13!1&1|1' + r'22"2@2' + r'32"3#3' + r"43$4%4'4" + r'56%5(5:5[5{5~5' + r'65 6&6,6]6^6' + r'75&7.7/7\7|7' + r'86!8(8*8;8[8{8' + r"97 9'9(9)9]9{9}9" + r'a2Ωq‡q' + r'b2˛x≈x' + r'c3 cÔj∆j' + r'd2þe´e' + r'f2þu¨u' + r'g2þÿˆi' + r'h3 hÎÿ∂d' + r'i3 iÇcçc' + r'j2Óh˙h' + r'k2ˇÿ†t' + r'l5 l@lþÿ|l˜n' + r'm1~m' + r'n3 nıÿ∫b' + r'o2®r‰r' + r'p2¬lÒl' + r'q2Æaæa' + r'r3 rπp∏p' + r's3 sØoøo' + r't2¥yÁy' + r'u3 u©g˝g' + r'v2˚kk' + r'w2ÂzÅz' + r'x2Œqœq' + r'y5 yÏfƒfˇzΩz' + r'z5 z¥y‡y‹ÿ›w' + r'.2√v◊v' + r';4µmÍsÓmßs' + r'/2¸zΩz' + ); // 315 characters } diff --git a/tools/gen_web_locale_keymap/bin/gen_web_locale_keymap.dart b/tools/gen_web_locale_keymap/bin/gen_web_locale_keymap.dart index 503f15a197cef..a2f2bf3f4a8e3 100644 --- a/tools/gen_web_locale_keymap/bin/gen_web_locale_keymap.dart +++ b/tools/gen_web_locale_keymap/bin/gen_web_locale_keymap.dart @@ -13,8 +13,7 @@ import 'package:path/path.dart' as path; const String kEnvGithubToken = 'GITHUB_TOKEN'; -String _renderTemplate( - String template, Map dictionary) { +String _renderTemplate(String template, Map dictionary) { String result = template; dictionary.forEach((String key, String value) { final String localResult = result.replaceAll('@@@$key@@@', value); @@ -26,10 +25,7 @@ String _renderTemplate( return result; } -void _writeFileTo( - String outputDir, - String outputFileName, - String body) { +void _writeFileTo(String outputDir, String outputFileName, String body) { final String outputPath = path.join(outputDir, outputFileName); Directory(outputDir).createSync(recursive: true); File(outputPath).writeAsStringSync(body); @@ -93,6 +89,9 @@ void _mapForEachEqual(Map a, Map b, _ValueCompare bo } } +// Ensure that two maps are deeply equal. +// +// Differences will be thrown as assertion. bool _verifyMap(Map> a, Map> b) { _mapForEachEqual(a, b, (Map? aMap, Map? bMap, String path) { _mapForEachEqual(aMap!, bMap!, (int? aValue, int? bValue, String path) { diff --git a/tools/gen_web_locale_keymap/lib/common.dart b/tools/gen_web_locale_keymap/lib/common.dart index 5c9a037c48b20..05cca806c1bd3 100644 --- a/tools/gen_web_locale_keymap/lib/common.dart +++ b/tools/gen_web_locale_keymap/lib/common.dart @@ -2,8 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'dart:convert' show utf8; - // The following segment is not only used in the generating script, but also // copied to the generated package. /*@@@ SHARED SEGMENT START @@@*/ @@ -122,6 +120,12 @@ class _StringStream { _StringStream(this._data) : _offset = 0; final String _data; + final Map _goalToEventCode = Map.fromEntries( + kLayoutGoals + .entries + .map((MapEntry beforeEntry) => + MapEntry(beforeEntry.value.codeUnitAt(0), beforeEntry.key)) + ); int get offest => _offset; int _offset; @@ -148,14 +152,10 @@ class _StringStream { } } - String readString() { - final int length = readIntAsVerbatim(); - if (length == 0) { - return ''; - } - final String result = _data.substring(_offset, _offset + length); - _offset += length; - return result; + String readEventCode() { + final int charCode = _data.codeUnitAt(_offset); + _offset += 1; + return _goalToEventCode[charCode]!; } } @@ -174,7 +174,7 @@ Map> unmarshallMappingData(String compressed) { final int eventCodeNum = stream.readIntAsVerbatim(); return Map>.fromEntries((() sync* { for (int eventCodeIndex = 0; eventCodeIndex < eventCodeNum; eventCodeIndex += 1) { - yield MapEntry>(stream.readString(), _unmarshallCodeMap(stream)); + yield MapEntry>(stream.readEventCode(), _unmarshallCodeMap(stream)); } })()); } @@ -222,15 +222,11 @@ void _marshallIntAsVerbatim(StringBuffer builder, int value) { builder.writeCharCode(result); } -// Encode a string, length first, then contents. -// -// The length of string is the amount of characters, not its byte length. -void _marshallString(StringBuffer builder, String value) { - _marshallIntAsVerbatim(builder, value.length); - for (final int char in utf8.encode(value)) { - assert(_isPrintableEascii(char), '0x${char.toRadixString(16)}}'); - } - builder.write(value); +void _marshallEventCode(StringBuffer builder, String value) { + // Instead of recording the entire eventCode, since the eventCode is mapped + // 1-to-1 to a character in kLayoutGoals, we record the goal instead. + final String char = kLayoutGoals[value]!; + builder.write(char); } void _marshallEventKey(StringBuffer builder, String value) { @@ -257,7 +253,7 @@ List marshallMappingData(Map> mappingData) { _marshallIntAsVerbatim(builder, mappingData.length); _sortedForEach(mappingData, (String eventCode, Map codeMap) { builder.write('\n'); - _marshallString(builder, eventCode); + _marshallEventCode(builder, eventCode); _marshallIntAsVerbatim(builder, codeMap.length); _sortedForEach(codeMap, (String eventKey, int logicalKey) { _marshallEventKey(builder, eventKey); From c33c9f2070115f5f08a53209fd63f9d74f3c6bf5 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 28 Nov 2022 14:50:59 -0800 Subject: [PATCH 69/74] Signature --- ci/licenses_golden/tool_signature | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ci/licenses_golden/tool_signature b/ci/licenses_golden/tool_signature index 8a7e2baeac99a..bcc22302b6d60 100644 --- a/ci/licenses_golden/tool_signature +++ b/ci/licenses_golden/tool_signature @@ -1 +1,2 @@ -Signature: 9081858dc189235efdea91ba5c55b432 +Signature: f6d8146c82d268e2e2549bf5019ebf07 + From cedb9bf370c9afc2a6cf8553a8da8af408bb2e99 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 28 Nov 2022 15:39:10 -0800 Subject: [PATCH 70/74] Comment. Change dead key mapping to the last. --- .../lib/src/engine/keyboard_binding.dart | 22 +++++++++++-------- .../lib/web_locale_keymap/key_mappings.g.dart | 2 +- tools/gen_web_locale_keymap/lib/github.dart | 8 +++---- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/lib/web_ui/lib/src/engine/keyboard_binding.dart b/lib/web_ui/lib/src/engine/keyboard_binding.dart index ec0c36811a279..a2943d7a5a603 100644 --- a/lib/web_ui/lib/src/engine/keyboard_binding.dart +++ b/lib/web_ui/lib/src/engine/keyboard_binding.dart @@ -246,7 +246,9 @@ class KeyboardConverter { return locale_keymap.LocaleKeymap.darwin(); case OperatingSystem.windows: return locale_keymap.LocaleKeymap.win(); - default: + case OperatingSystem.android: + case OperatingSystem.linux: + case OperatingSystem.unknown: return locale_keymap.LocaleKeymap.linux(); } } @@ -311,11 +313,13 @@ class KeyboardConverter { // Whether `event.key` is a key name, such as "Shift", or otherwise a // character, such as "S" or "ж". // - // A key name always starts with a capitalized character, and has more than - // 1 letter. + // A key name always has more than 1 letter. Technically there might be cases + // where a non-key-name `event.key` has more than 1 character, but we have yet + // to find one. Moreover, all keys that `LocaleMapping` handles are + // single-character, which is the most important aspect that this function + // cares about. static bool _eventKeyIsKeyname(String key) { - assert(key.isNotEmpty); - return isUpperLetter(key.codeUnitAt(0)) && key.length > 1; + return key.length > 1; } static int _deadKeyToLogicalKey(int physicalKey, FlutterHtmlKeyboardEvent event) { @@ -387,10 +391,6 @@ class KeyboardConverter { final int physicalKey = _getPhysicalCode(event.code!); final bool logicalKeyIsCharacter = !_eventKeyIsKeyname(eventKey); final ValueGetter logicalKey = _cached(() { - // Dead keys. - if (eventKey == _kLogicalDead) { - return _deadKeyToLogicalKey(physicalKey, event); - } // Mapped logical keys, such as ArrowLeft, Escape, AudioVolumeDown. final int? mappedLogicalKey = kWebToLogicalKey[eventKey]; if (mappedLogicalKey != null) { @@ -409,6 +409,10 @@ class KeyboardConverter { return localeLogicalKeys; } } + // Dead keys that are not handled by the locale mapping. + if (eventKey == _kLogicalDead) { + return _deadKeyToLogicalKey(physicalKey, event); + } // Minted logical keys. return eventKey.hashCode + _kWebKeyIdPlane; }); diff --git a/third_party/web_locale_keymap/lib/web_locale_keymap/key_mappings.g.dart b/third_party/web_locale_keymap/lib/web_locale_keymap/key_mappings.g.dart index a440eb65b2eaa..1b4d824318bad 100644 --- a/third_party/web_locale_keymap/lib/web_locale_keymap/key_mappings.g.dart +++ b/third_party/web_locale_keymap/lib/web_locale_keymap/key_mappings.g.dart @@ -6,7 +6,7 @@ // DO NOT EDIT -- DO NOT EDIT -- DO NOT EDIT // // This file is auto generated by flutter/engine:flutter/tools/gen_web_keyboard_layouts based on -// https://github.com/microsoft/vscode/tree/ae34e8d2df286f8c8882d22db417e6dc4cdb01f5/src/vs/workbench/services/keybinding/browser/keyboardLayouts +// https://github.com/microsoft/vscode/tree/ab7ccc9e872dfcdfc429f8f2815109ec0ca926e3/src/vs/workbench/services/keybinding/browser/keyboardLayouts // // Edit the following files instead: // diff --git a/tools/gen_web_locale_keymap/lib/github.dart b/tools/gen_web_locale_keymap/lib/github.dart index 6cbcff8eb891d..9a3f6866e03e9 100644 --- a/tools/gen_web_locale_keymap/lib/github.dart +++ b/tools/gen_web_locale_keymap/lib/github.dart @@ -200,10 +200,10 @@ Layout _parseLayoutFromGithubFile(_GitHubFile file) { if (lineMatch == null) { return; } - // KeyboardKey.key, such as "KeyZ". - final String eventKey = lineMatch.group(1)!; + // KeyboardKey.code, such as "KeyZ". + final String eventCode = lineMatch.group(1)!; // Only record goals. - if (!_kGoalToIndex.containsKey(eventKey)) { + if (!_kGoalToIndex.containsKey(eventCode)) { return; } @@ -218,7 +218,7 @@ Layout _parseLayoutFromGithubFile(_GitHubFile file) { assert(listMatch != null, 'Unable to match $definition'); final int deadMask = int.parse(listMatch!.group(5)!, radix: 10); - entries[eventKey] = LayoutEntry( + entries[eventCode] = LayoutEntry( [ _parsePrintable(listMatch.group(1)!, deadMask & 0x1), _parsePrintable(listMatch.group(2)!, deadMask & 0x2), From fe356c0fc45c0229262ea91230923d77b4ec91a0 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 28 Nov 2022 16:31:15 -0800 Subject: [PATCH 71/74] Better digit heuristic. Better _eventKeyIsKeyName --- .../lib/src/engine/keyboard_binding.dart | 20 +- .../lib/web_locale_keymap/key_mappings.g.dart | 76 +-- .../web_locale_keymap/test/test_cases.g.dart | 440 ------------------ .../lib/benchmark_planner.dart | 2 +- tools/gen_web_locale_keymap/lib/common.dart | 36 +- 5 files changed, 45 insertions(+), 529 deletions(-) diff --git a/lib/web_ui/lib/src/engine/keyboard_binding.dart b/lib/web_ui/lib/src/engine/keyboard_binding.dart index a2943d7a5a603..6e5d11eccc9d0 100644 --- a/lib/web_ui/lib/src/engine/keyboard_binding.dart +++ b/lib/web_ui/lib/src/engine/keyboard_binding.dart @@ -55,12 +55,6 @@ final Map _kLogicalKeyToModifierGetter = event.metaKey, }; -const int _kCharUpperA = 0x41; -const int _kCharUpperZ = 0x5a; -bool isUpperLetter(int charCode) { - return charCode >= _kCharUpperA && charCode <= _kCharUpperZ; -} - const String _kPhysicalCapsLock = 'CapsLock'; const String _kLogicalDead = 'Dead'; @@ -313,13 +307,11 @@ class KeyboardConverter { // Whether `event.key` is a key name, such as "Shift", or otherwise a // character, such as "S" or "ж". // - // A key name always has more than 1 letter. Technically there might be cases - // where a non-key-name `event.key` has more than 1 character, but we have yet - // to find one. Moreover, all keys that `LocaleMapping` handles are - // single-character, which is the most important aspect that this function - // cares about. - static bool _eventKeyIsKeyname(String key) { - return key.length > 1; + // A key name always has more than 1 code unit, and they are all alnums. + // Character keys, however, can also have more than 1 code unit: en-in + // maps KeyL to L̥/l̥. To resolve this, we check the second code unit. + static bool _eventKeyIsKeyName(String key) { + return key.length > 1 && key.codeUnitAt(0) < 0x7F && key.codeUnitAt(1) < 0x7F; } static int _deadKeyToLogicalKey(int physicalKey, FlutterHtmlKeyboardEvent event) { @@ -389,7 +381,7 @@ class KeyboardConverter { final String eventKey = event.key!; final int physicalKey = _getPhysicalCode(event.code!); - final bool logicalKeyIsCharacter = !_eventKeyIsKeyname(eventKey); + final bool logicalKeyIsCharacter = !_eventKeyIsKeyName(eventKey); final ValueGetter logicalKey = _cached(() { // Mapped logical keys, such as ArrowLeft, Escape, AudioVolumeDown. final int? mappedLogicalKey = kWebToLogicalKey[eventKey]; diff --git a/third_party/web_locale_keymap/lib/web_locale_keymap/key_mappings.g.dart b/third_party/web_locale_keymap/lib/web_locale_keymap/key_mappings.g.dart index 1b4d824318bad..cae2917ff0a52 100644 --- a/third_party/web_locale_keymap/lib/web_locale_keymap/key_mappings.g.dart +++ b/third_party/web_locale_keymap/lib/web_locale_keymap/key_mappings.g.dart @@ -83,26 +83,16 @@ final int _kLowerA = 'a'.codeUnitAt(0); final int _kUpperA = 'A'.codeUnitAt(0); final int _kLowerZ = 'z'.codeUnitAt(0); final int _kUpperZ = 'Z'.codeUnitAt(0); -final int _k0 = '0'.codeUnitAt(0); -final int _k9 = '9'.codeUnitAt(0); -bool _isAscii(String key) { - if (key.length != 1) { - return false; - } +bool _isAscii(int charCode) { // 0x20 is the first printable character in ASCII. - return key.codeUnitAt(0) >= 0x20 && key.codeUnitAt(0) <= 0x7F; + return charCode >= 0x20 && charCode <= 0x7F; } /// Returns whether the `char` is a single character of a letter or a digit. -bool isAlnum(String char) { - if (char.length != 1) { - return false; - } - final int charCode = char.codeUnitAt(0); +bool isLetter(int charCode) { return (charCode >= _kLowerA && charCode <= _kLowerZ) - || (charCode >= _kUpperA && charCode <= _kUpperZ) - || (charCode >= _k0 && charCode <= _k9); + || (charCode >= _kUpperA && charCode <= _kUpperZ); } /// A set of rules that can derive a large number of logical keys simply from @@ -110,11 +100,18 @@ bool isAlnum(String char) { /// /// This greatly reduces the entries needed in the final mapping. int? heuristicMapper(String code, String key) { - if (isAlnum(key)) { - return key.toLowerCase().codeUnitAt(0); + // Digit code: return the digit. + if (code.startsWith('Digit')) { + assert(code.length == 6); + return code.codeUnitAt(5); // The character immediately after 'Digit' } - if (!_isAscii(key)) { - return kLayoutGoals[code]!.codeUnitAt(0); + final int charCode = key.codeUnitAt(0); + if (key.length > 1 || !_isAscii(charCode)) { + return kLayoutGoals[code]?.codeUnitAt(0); + } + // Letter key: return the letter. + if (isLetter(charCode)) { + return key.toLowerCase().codeUnitAt(0); } return null; } @@ -197,18 +194,7 @@ Map> unmarshallMappingData(String compressed) { /// heuristics have been omitted. Map> getMappingDataWin() { return unmarshallMappingData( - r'F' - r'`1§0' - r'04)0=0@0}0' - r"17!1&1'1+1>1|1~1" - '25"2\'2/2@2~2' - r'36"3#3*3+3-3^3' - r"47!4$4'4+4;4{4~4" - r'53%5(5[5' - r'66&6-6/6:6^6|6' - r'77&7/7=7?7`7{7|7' - r'86!8(8*8[8\8_8' - r'95(9)9]9^9{9' + r';' r'b1{b' r'c1&c' r'f1[f' @@ -220,7 +206,7 @@ Map> getMappingDataWin() { r'w3"w?w|w' r'x2#x)x' r'z2(z>y' - ); // 195 characters + ); // 59 characters } /// Data for [LocaleKeymap] on Linux. @@ -232,17 +218,7 @@ Map> getMappingDataWin() { /// heuristics have been omitted. Map> getMappingDataLinux() { return unmarshallMappingData( - r'B' - r'04)0=0@0}0' - r'13!1&1|1' - r'23"2@2~2' - r'32"3#3' - r"45$4'4;4{4~4" - r'53%5(5[5' - r'65&6-6:6^6|6' - r'75&7/7?7`7{7' - r'85(8*8[8\8_8' - r'94(9)9]9^9' + r'8' r'a2@qΩq' r'k1&k' r'q3@qÆaæa' @@ -251,7 +227,7 @@ Map> getMappingDataLinux() { r'y2¥ÿ←ÿ' r'z5> getMappingDataLinux() { /// heuristics have been omitted. Map> getMappingDataDarwin() { return unmarshallMappingData( - r'W' + r'M' r',2„w∑w' - r'04)0=0`0}0' - r'13!1&1|1' - r'22"2@2' - r'32"3#3' - r"43$4%4'4" - r'56%5(5:5[5{5~5' - r'65 6&6,6]6^6' - r'75&7.7/7\7|7' - r'86!8(8*8;8[8{8' - r"97 9'9(9)9]9{9}9" r'a2Ωq‡q' r'b2˛x≈x' r'c3 cÔj∆j' @@ -303,5 +269,5 @@ Map> getMappingDataDarwin() { r'.2√v◊v' r';4µmÍsÓmßs' r'/2¸zΩz' - ); // 315 characters + ); // 209 characters } diff --git a/third_party/web_locale_keymap/test/test_cases.g.dart b/third_party/web_locale_keymap/test/test_cases.g.dart index 60c946a2ba943..b57842551d497 100644 --- a/third_party/web_locale_keymap/test/test_cases.g.dart +++ b/third_party/web_locale_keymap/test/test_cases.g.dart @@ -21,16 +21,6 @@ import 'testing.dart'; void testWin(LocaleKeymap mapping) { group('cz', () { - verifyEntry(mapping, 'Digit0', [r'é', r'0', r'˝', r''], '0'); - verifyEntry(mapping, 'Digit1', [r'+', r'1', r'~', r''], '1'); - verifyEntry(mapping, 'Digit2', [r'ě', r'2', r'ˇ', r''], '2'); - verifyEntry(mapping, 'Digit3', [r'š', r'3', r'^', r''], '3'); - verifyEntry(mapping, 'Digit4', [r'č', r'4', r'˘', r''], '4'); - verifyEntry(mapping, 'Digit5', [r'ř', r'5', r'°', r''], '5'); - verifyEntry(mapping, 'Digit6', [r'ž', r'6', r'˛', r''], '6'); - verifyEntry(mapping, 'Digit7', [r'ý', r'7', r'`', r''], '7'); - verifyEntry(mapping, 'Digit8', [r'á', r'8', r'˙', r''], '8'); - verifyEntry(mapping, 'Digit9', [r'í', r'9', r'´', r''], '9'); verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'a'); verifyEntry(mapping, 'KeyB', [r'b', r'B', r'{', r''], 'b'); verifyEntry(mapping, 'KeyC', [r'c', r'C', r'&', r''], 'c'); @@ -60,16 +50,6 @@ void testWin(LocaleKeymap mapping) { }); group('de', () { - verifyEntry(mapping, 'Digit0', [r'0', r'=', r'}', r''], '0'); - verifyEntry(mapping, 'Digit1', [r'1', r'!', r'', r''], '1'); - verifyEntry(mapping, 'Digit2', [r'2', r'"', r'²', r''], '2'); - verifyEntry(mapping, 'Digit3', [r'3', r'§', r'³', r''], '3'); - verifyEntry(mapping, 'Digit4', [r'4', r'$', r'', r''], '4'); - verifyEntry(mapping, 'Digit5', [r'5', r'%', r'', r''], '5'); - verifyEntry(mapping, 'Digit6', [r'6', r'&', r'', r''], '6'); - verifyEntry(mapping, 'Digit7', [r'7', r'/', r'{', r''], '7'); - verifyEntry(mapping, 'Digit8', [r'8', r'(', r'[', r''], '8'); - verifyEntry(mapping, 'Digit9', [r'9', r')', r']', r''], '9'); verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'a'); verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'b'); verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'c'); @@ -99,16 +79,6 @@ void testWin(LocaleKeymap mapping) { }); group('de-swiss', () { - verifyEntry(mapping, 'Digit0', [r'0', r'=', r'', r''], '0'); - verifyEntry(mapping, 'Digit1', [r'1', r'+', r'¦', r''], '1'); - verifyEntry(mapping, 'Digit2', [r'2', r'"', r'@', r''], '2'); - verifyEntry(mapping, 'Digit3', [r'3', r'*', r'#', r''], '3'); - verifyEntry(mapping, 'Digit4', [r'4', r'ç', r'°', r''], '4'); - verifyEntry(mapping, 'Digit5', [r'5', r'%', r'§', r''], '5'); - verifyEntry(mapping, 'Digit6', [r'6', r'&', r'¬', r''], '6'); - verifyEntry(mapping, 'Digit7', [r'7', r'/', r'|', r''], '7'); - verifyEntry(mapping, 'Digit8', [r'8', r'(', r'¢', r''], '8'); - verifyEntry(mapping, 'Digit9', [r'9', r')', r'', r''], '9'); verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'a'); verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'b'); verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'c'); @@ -138,16 +108,6 @@ void testWin(LocaleKeymap mapping) { }); group('dk', () { - verifyEntry(mapping, 'Digit0', [r'0', r'=', r'}', r''], '0'); - verifyEntry(mapping, 'Digit1', [r'1', r'!', r'', r''], '1'); - verifyEntry(mapping, 'Digit2', [r'2', r'"', r'@', r''], '2'); - verifyEntry(mapping, 'Digit3', [r'3', r'#', r'£', r''], '3'); - verifyEntry(mapping, 'Digit4', [r'4', r'¤', r'$', r''], '4'); - verifyEntry(mapping, 'Digit5', [r'5', r'%', r'€', r''], '5'); - verifyEntry(mapping, 'Digit6', [r'6', r'&', r'', r''], '6'); - verifyEntry(mapping, 'Digit7', [r'7', r'/', r'{', r''], '7'); - verifyEntry(mapping, 'Digit8', [r'8', r'(', r'[', r''], '8'); - verifyEntry(mapping, 'Digit9', [r'9', r')', r']', r''], '9'); verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'a'); verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'b'); verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'c'); @@ -177,16 +137,6 @@ void testWin(LocaleKeymap mapping) { }); group('en', () { - verifyEntry(mapping, 'Digit0', [r'0', r')', r'', r''], '0'); - verifyEntry(mapping, 'Digit1', [r'1', r'!', r'', r''], '1'); - verifyEntry(mapping, 'Digit2', [r'2', r'@', r'', r''], '2'); - verifyEntry(mapping, 'Digit3', [r'3', r'#', r'', r''], '3'); - verifyEntry(mapping, 'Digit4', [r'4', r'$', r'', r''], '4'); - verifyEntry(mapping, 'Digit5', [r'5', r'%', r'', r''], '5'); - verifyEntry(mapping, 'Digit6', [r'6', r'^', r'', r''], '6'); - verifyEntry(mapping, 'Digit7', [r'7', r'&', r'', r''], '7'); - verifyEntry(mapping, 'Digit8', [r'8', r'*', r'', r''], '8'); - verifyEntry(mapping, 'Digit9', [r'9', r'(', r'', r''], '9'); verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'a'); verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'b'); verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'c'); @@ -216,16 +166,6 @@ void testWin(LocaleKeymap mapping) { }); group('en-belgian', () { - verifyEntry(mapping, 'Digit0', [r'à', r'0', r'}', r''], '0'); - verifyEntry(mapping, 'Digit1', [r'&', r'1', r'|', r''], '1'); - verifyEntry(mapping, 'Digit2', [r'é', r'2', r'@', r''], '2'); - verifyEntry(mapping, 'Digit3', [r'"', r'3', r'#', r''], '3'); - verifyEntry(mapping, 'Digit4', [r"'", r'4', r'{', r''], '4'); - verifyEntry(mapping, 'Digit5', [r'(', r'5', r'[', r''], '5'); - verifyEntry(mapping, 'Digit6', [r'§', r'6', r'^', r''], '6'); - verifyEntry(mapping, 'Digit7', [r'è', r'7', r'', r''], '7'); - verifyEntry(mapping, 'Digit8', [r'!', r'8', r'', r''], '8'); - verifyEntry(mapping, 'Digit9', [r'ç', r'9', r'{', r''], '9'); verifyEntry(mapping, 'KeyA', [r'q', r'Q', r'', r''], 'q'); verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'b'); verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'c'); @@ -255,16 +195,6 @@ void testWin(LocaleKeymap mapping) { }); group('en-in', () { - verifyEntry(mapping, 'Digit0', [r'0', r')', r'', r''], '0'); - verifyEntry(mapping, 'Digit1', [r'1', r'!', r'', r''], '1'); - verifyEntry(mapping, 'Digit2', [r'2', r'@', r'', r''], '2'); - verifyEntry(mapping, 'Digit3', [r'3', r'#', r'', r''], '3'); - verifyEntry(mapping, 'Digit4', [r'4', r'$', r'₹', r''], '4'); - verifyEntry(mapping, 'Digit5', [r'5', r'%', r'', r''], '5'); - verifyEntry(mapping, 'Digit6', [r'6', r'^', r'', r'ˆ'], '6'); - verifyEntry(mapping, 'Digit7', [r'7', r'&', r'', r''], '7'); - verifyEntry(mapping, 'Digit8', [r'8', r'*', r'', r''], '8'); - verifyEntry(mapping, 'Digit9', [r'9', r'(', r'', r'˘'], '9'); verifyEntry(mapping, 'KeyA', [r'a', r'A', r'ā', r'Ā'], 'a'); verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'b'); verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'c'); @@ -294,16 +224,6 @@ void testWin(LocaleKeymap mapping) { }); group('en-intl', () { - verifyEntry(mapping, 'Digit0', [r'0', r')', r'’', r''], '0'); - verifyEntry(mapping, 'Digit1', [r'1', r'!', r'¡', r'¹'], '1'); - verifyEntry(mapping, 'Digit2', [r'2', r'@', r'²', r''], '2'); - verifyEntry(mapping, 'Digit3', [r'3', r'#', r'³', r''], '3'); - verifyEntry(mapping, 'Digit4', [r'4', r'$', r'¤', r'£'], '4'); - verifyEntry(mapping, 'Digit5', [r'5', r'%', r'€', r''], '5'); - verifyEntry(mapping, 'Digit6', [r'6', r'^', r'¼', r''], '6'); - verifyEntry(mapping, 'Digit7', [r'7', r'&', r'½', r''], '7'); - verifyEntry(mapping, 'Digit8', [r'8', r'*', r'¾', r''], '8'); - verifyEntry(mapping, 'Digit9', [r'9', r'(', r'‘', r''], '9'); verifyEntry(mapping, 'KeyA', [r'a', r'A', r'á', r'Á'], 'a'); verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'b'); verifyEntry(mapping, 'KeyC', [r'c', r'C', r'©', r'¢'], 'c'); @@ -333,16 +253,6 @@ void testWin(LocaleKeymap mapping) { }); group('en-uk', () { - verifyEntry(mapping, 'Digit0', [r'0', r')', r'', r''], '0'); - verifyEntry(mapping, 'Digit1', [r'1', r'!', r'', r''], '1'); - verifyEntry(mapping, 'Digit2', [r'2', r'"', r'', r''], '2'); - verifyEntry(mapping, 'Digit3', [r'3', r'£', r'', r''], '3'); - verifyEntry(mapping, 'Digit4', [r'4', r'$', r'€', r''], '4'); - verifyEntry(mapping, 'Digit5', [r'5', r'%', r'', r''], '5'); - verifyEntry(mapping, 'Digit6', [r'6', r'^', r'', r''], '6'); - verifyEntry(mapping, 'Digit7', [r'7', r'&', r'', r''], '7'); - verifyEntry(mapping, 'Digit8', [r'8', r'*', r'', r''], '8'); - verifyEntry(mapping, 'Digit9', [r'9', r'(', r'', r''], '9'); verifyEntry(mapping, 'KeyA', [r'a', r'A', r'á', r'Á'], 'a'); verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'b'); verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'c'); @@ -372,16 +282,6 @@ void testWin(LocaleKeymap mapping) { }); group('es', () { - verifyEntry(mapping, 'Digit0', [r'0', r'=', r'', r''], '0'); - verifyEntry(mapping, 'Digit1', [r'1', r'!', r'|', r''], '1'); - verifyEntry(mapping, 'Digit2', [r'2', r'"', r'@', r''], '2'); - verifyEntry(mapping, 'Digit3', [r'3', r'·', r'#', r''], '3'); - verifyEntry(mapping, 'Digit4', [r'4', r'$', r'~', r''], '4'); - verifyEntry(mapping, 'Digit5', [r'5', r'%', r'€', r''], '5'); - verifyEntry(mapping, 'Digit6', [r'6', r'&', r'¬', r''], '6'); - verifyEntry(mapping, 'Digit7', [r'7', r'/', r'', r''], '7'); - verifyEntry(mapping, 'Digit8', [r'8', r'(', r'', r''], '8'); - verifyEntry(mapping, 'Digit9', [r'9', r')', r'', r''], '9'); verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'a'); verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'b'); verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'c'); @@ -411,16 +311,6 @@ void testWin(LocaleKeymap mapping) { }); group('es-latin', () { - verifyEntry(mapping, 'Digit0', [r'0', r'=', r'', r''], '0'); - verifyEntry(mapping, 'Digit1', [r'1', r'!', r'', r''], '1'); - verifyEntry(mapping, 'Digit2', [r'2', r'"', r'', r''], '2'); - verifyEntry(mapping, 'Digit3', [r'3', r'#', r'', r''], '3'); - verifyEntry(mapping, 'Digit4', [r'4', r'$', r'', r''], '4'); - verifyEntry(mapping, 'Digit5', [r'5', r'%', r'', r''], '5'); - verifyEntry(mapping, 'Digit6', [r'6', r'&', r'', r''], '6'); - verifyEntry(mapping, 'Digit7', [r'7', r'/', r'', r''], '7'); - verifyEntry(mapping, 'Digit8', [r'8', r'(', r'', r''], '8'); - verifyEntry(mapping, 'Digit9', [r'9', r')', r'', r''], '9'); verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'a'); verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'b'); verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'c'); @@ -450,16 +340,6 @@ void testWin(LocaleKeymap mapping) { }); group('fr', () { - verifyEntry(mapping, 'Digit0', [r'à', r'0', r'@', r''], '0'); - verifyEntry(mapping, 'Digit1', [r'&', r'1', r'', r''], '1'); - verifyEntry(mapping, 'Digit2', [r'é', r'2', r'~', r''], '2'); - verifyEntry(mapping, 'Digit3', [r'"', r'3', r'#', r''], '3'); - verifyEntry(mapping, 'Digit4', [r"'", r'4', r'{', r''], '4'); - verifyEntry(mapping, 'Digit5', [r'(', r'5', r'[', r''], '5'); - verifyEntry(mapping, 'Digit6', [r'-', r'6', r'|', r''], '6'); - verifyEntry(mapping, 'Digit7', [r'è', r'7', r'`', r''], '7'); - verifyEntry(mapping, 'Digit8', [r'_', r'8', r'\', r''], '8'); - verifyEntry(mapping, 'Digit9', [r'ç', r'9', r'^', r''], '9'); verifyEntry(mapping, 'KeyA', [r'q', r'Q', r'', r''], 'q'); verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'b'); verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'c'); @@ -489,16 +369,6 @@ void testWin(LocaleKeymap mapping) { }); group('hu', () { - verifyEntry(mapping, 'Backquote', [r'0', r'§', r'', r''], '0'); - verifyEntry(mapping, 'Digit1', [r'1', r"'", r'~', r''], '1'); - verifyEntry(mapping, 'Digit2', [r'2', r'"', r'ˇ', r''], '2'); - verifyEntry(mapping, 'Digit3', [r'3', r'+', r'^', r''], '3'); - verifyEntry(mapping, 'Digit4', [r'4', r'!', r'˘', r''], '4'); - verifyEntry(mapping, 'Digit5', [r'5', r'%', r'°', r''], '5'); - verifyEntry(mapping, 'Digit6', [r'6', r'/', r'˛', r''], '6'); - verifyEntry(mapping, 'Digit7', [r'7', r'=', r'`', r''], '7'); - verifyEntry(mapping, 'Digit8', [r'8', r'(', r'˙', r''], '8'); - verifyEntry(mapping, 'Digit9', [r'9', r')', r'´', r''], '9'); verifyEntry(mapping, 'KeyA', [r'a', r'A', r'ä', r''], 'a'); verifyEntry(mapping, 'KeyB', [r'b', r'B', r'{', r''], 'b'); verifyEntry(mapping, 'KeyC', [r'c', r'C', r'&', r''], 'c'); @@ -528,16 +398,6 @@ void testWin(LocaleKeymap mapping) { }); group('it', () { - verifyEntry(mapping, 'Digit0', [r'0', r'=', r'', r''], '0'); - verifyEntry(mapping, 'Digit1', [r'1', r'!', r'', r''], '1'); - verifyEntry(mapping, 'Digit2', [r'2', r'"', r'', r''], '2'); - verifyEntry(mapping, 'Digit3', [r'3', r'£', r'', r''], '3'); - verifyEntry(mapping, 'Digit4', [r'4', r'$', r'', r''], '4'); - verifyEntry(mapping, 'Digit5', [r'5', r'%', r'€', r''], '5'); - verifyEntry(mapping, 'Digit6', [r'6', r'&', r'', r''], '6'); - verifyEntry(mapping, 'Digit7', [r'7', r'/', r'', r''], '7'); - verifyEntry(mapping, 'Digit8', [r'8', r'(', r'', r''], '8'); - verifyEntry(mapping, 'Digit9', [r'9', r')', r'', r''], '9'); verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'a'); verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'b'); verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'c'); @@ -567,16 +427,6 @@ void testWin(LocaleKeymap mapping) { }); group('no', () { - verifyEntry(mapping, 'Digit0', [r'0', r'=', r'}', r''], '0'); - verifyEntry(mapping, 'Digit1', [r'1', r'!', r'', r''], '1'); - verifyEntry(mapping, 'Digit2', [r'2', r'"', r'@', r''], '2'); - verifyEntry(mapping, 'Digit3', [r'3', r'#', r'£', r''], '3'); - verifyEntry(mapping, 'Digit4', [r'4', r'¤', r'$', r''], '4'); - verifyEntry(mapping, 'Digit5', [r'5', r'%', r'€', r''], '5'); - verifyEntry(mapping, 'Digit6', [r'6', r'&', r'', r''], '6'); - verifyEntry(mapping, 'Digit7', [r'7', r'/', r'{', r''], '7'); - verifyEntry(mapping, 'Digit8', [r'8', r'(', r'[', r''], '8'); - verifyEntry(mapping, 'Digit9', [r'9', r')', r']', r''], '9'); verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'a'); verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'b'); verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'c'); @@ -606,16 +456,6 @@ void testWin(LocaleKeymap mapping) { }); group('pl', () { - verifyEntry(mapping, 'Digit0', [r'0', r')', r'', r''], '0'); - verifyEntry(mapping, 'Digit1', [r'1', r'!', r'', r''], '1'); - verifyEntry(mapping, 'Digit2', [r'2', r'@', r'', r''], '2'); - verifyEntry(mapping, 'Digit3', [r'3', r'#', r'', r''], '3'); - verifyEntry(mapping, 'Digit4', [r'4', r'$', r'', r''], '4'); - verifyEntry(mapping, 'Digit5', [r'5', r'%', r'', r''], '5'); - verifyEntry(mapping, 'Digit6', [r'6', r'^', r'', r''], '6'); - verifyEntry(mapping, 'Digit7', [r'7', r'&', r'', r''], '7'); - verifyEntry(mapping, 'Digit8', [r'8', r'*', r'', r''], '8'); - verifyEntry(mapping, 'Digit9', [r'9', r'(', r'', r''], '9'); verifyEntry(mapping, 'KeyA', [r'a', r'A', r'ą', r'Ą'], 'a'); verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'b'); verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ć', r'Ć'], 'c'); @@ -645,16 +485,6 @@ void testWin(LocaleKeymap mapping) { }); group('pt', () { - verifyEntry(mapping, 'Digit0', [r'0', r'=', r'}', r''], '0'); - verifyEntry(mapping, 'Digit1', [r'1', r'!', r'', r''], '1'); - verifyEntry(mapping, 'Digit2', [r'2', r'"', r'@', r''], '2'); - verifyEntry(mapping, 'Digit3', [r'3', r'#', r'£', r''], '3'); - verifyEntry(mapping, 'Digit4', [r'4', r'$', r'§', r''], '4'); - verifyEntry(mapping, 'Digit5', [r'5', r'%', r'€', r''], '5'); - verifyEntry(mapping, 'Digit6', [r'6', r'&', r'', r''], '6'); - verifyEntry(mapping, 'Digit7', [r'7', r'/', r'{', r''], '7'); - verifyEntry(mapping, 'Digit8', [r'8', r'(', r'[', r''], '8'); - verifyEntry(mapping, 'Digit9', [r'9', r')', r']', r''], '9'); verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'a'); verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'b'); verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'c'); @@ -684,16 +514,6 @@ void testWin(LocaleKeymap mapping) { }); group('pt-br', () { - verifyEntry(mapping, 'Digit0', [r'0', r')', r'', r''], '0'); - verifyEntry(mapping, 'Digit1', [r'1', r'!', r'¹', r''], '1'); - verifyEntry(mapping, 'Digit2', [r'2', r'@', r'²', r''], '2'); - verifyEntry(mapping, 'Digit3', [r'3', r'#', r'³', r''], '3'); - verifyEntry(mapping, 'Digit4', [r'4', r'$', r'£', r''], '4'); - verifyEntry(mapping, 'Digit5', [r'5', r'%', r'¢', r''], '5'); - verifyEntry(mapping, 'Digit6', [r'6', r'¨', r'¬', r''], '6'); - verifyEntry(mapping, 'Digit7', [r'7', r'&', r'', r''], '7'); - verifyEntry(mapping, 'Digit8', [r'8', r'*', r'', r''], '8'); - verifyEntry(mapping, 'Digit9', [r'9', r'(', r'', r''], '9'); verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'a'); verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'b'); verifyEntry(mapping, 'KeyC', [r'c', r'C', r'₢', r''], 'c'); @@ -723,16 +543,6 @@ void testWin(LocaleKeymap mapping) { }); group('ru', () { - verifyEntry(mapping, 'Digit0', [r'0', r')', r'', r''], '0'); - verifyEntry(mapping, 'Digit1', [r'1', r'!', r'', r''], '1'); - verifyEntry(mapping, 'Digit2', [r'2', r'"', r'', r''], '2'); - verifyEntry(mapping, 'Digit3', [r'3', r'№', r'', r''], '3'); - verifyEntry(mapping, 'Digit4', [r'4', r';', r'', r''], '4'); - verifyEntry(mapping, 'Digit5', [r'5', r'%', r'', r''], '5'); - verifyEntry(mapping, 'Digit6', [r'6', r':', r'', r''], '6'); - verifyEntry(mapping, 'Digit7', [r'7', r'?', r'', r''], '7'); - verifyEntry(mapping, 'Digit8', [r'8', r'*', r'₽', r''], '8'); - verifyEntry(mapping, 'Digit9', [r'9', r'(', r'', r''], '9'); verifyEntry(mapping, 'KeyA', [r'ф', r'Ф', r'', r''], 'a'); verifyEntry(mapping, 'KeyB', [r'и', r'И', r'', r''], 'b'); verifyEntry(mapping, 'KeyC', [r'с', r'С', r'', r''], 'c'); @@ -762,16 +572,6 @@ void testWin(LocaleKeymap mapping) { }); group('sv', () { - verifyEntry(mapping, 'Digit0', [r'0', r'=', r'}', r''], '0'); - verifyEntry(mapping, 'Digit1', [r'1', r'!', r'', r''], '1'); - verifyEntry(mapping, 'Digit2', [r'2', r'"', r'@', r''], '2'); - verifyEntry(mapping, 'Digit3', [r'3', r'#', r'£', r''], '3'); - verifyEntry(mapping, 'Digit4', [r'4', r'¤', r'$', r''], '4'); - verifyEntry(mapping, 'Digit5', [r'5', r'%', r'€', r''], '5'); - verifyEntry(mapping, 'Digit6', [r'6', r'&', r'', r''], '6'); - verifyEntry(mapping, 'Digit7', [r'7', r'/', r'{', r''], '7'); - verifyEntry(mapping, 'Digit8', [r'8', r'(', r'[', r''], '8'); - verifyEntry(mapping, 'Digit9', [r'9', r')', r']', r''], '9'); verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r''], 'a'); verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'b'); verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'c'); @@ -801,16 +601,6 @@ void testWin(LocaleKeymap mapping) { }); group('thai', () { - verifyEntry(mapping, 'Digit0', [r'จ', r'๗', r'', r''], '0'); - verifyEntry(mapping, 'Digit1', [r'ๅ', r'+', r'', r''], '1'); - verifyEntry(mapping, 'Digit2', [r'/', r'๑', r'', r''], '2'); - verifyEntry(mapping, 'Digit3', [r'-', r'๒', r'', r''], '3'); - verifyEntry(mapping, 'Digit4', [r'ภ', r'๓', r'', r''], '4'); - verifyEntry(mapping, 'Digit5', [r'ถ', r'๔', r'', r''], '5'); - verifyEntry(mapping, 'Digit6', [r'ุ', r'ู', r'', r''], '6'); - verifyEntry(mapping, 'Digit7', [r'ึ', r'฿', r'', r''], '7'); - verifyEntry(mapping, 'Digit8', [r'ค', r'๕', r'', r''], '8'); - verifyEntry(mapping, 'Digit9', [r'ต', r'๖', r'', r''], '9'); verifyEntry(mapping, 'KeyA', [r'ฟ', r'ฤ', r'', r''], 'a'); verifyEntry(mapping, 'KeyB', [r'ิ', r'ฺ', r'', r''], 'b'); verifyEntry(mapping, 'KeyC', [r'แ', r'ฉ', r'', r''], 'c'); @@ -840,16 +630,6 @@ void testWin(LocaleKeymap mapping) { }); group('tr', () { - verifyEntry(mapping, 'Digit0', [r'0', r'=', r'}', r''], '0'); - verifyEntry(mapping, 'Digit1', [r'1', r'!', r'>', r''], '1'); - verifyEntry(mapping, 'Digit2', [r'2', r"'", r'£', r''], '2'); - verifyEntry(mapping, 'Digit3', [r'3', r'^', r'#', r''], '3'); - verifyEntry(mapping, 'Digit4', [r'4', r'+', r'$', r''], '4'); - verifyEntry(mapping, 'Digit5', [r'5', r'%', r'½', r''], '5'); - verifyEntry(mapping, 'Digit6', [r'6', r'&', r'', r''], '6'); - verifyEntry(mapping, 'Digit7', [r'7', r'/', r'{', r''], '7'); - verifyEntry(mapping, 'Digit8', [r'8', r'(', r'[', r''], '8'); - verifyEntry(mapping, 'Digit9', [r'9', r')', r']', r''], '9'); verifyEntry(mapping, 'KeyA', [r'a', r'A', r'æ', r'Æ'], 'a'); verifyEntry(mapping, 'KeyB', [r'b', r'B', r'', r''], 'b'); verifyEntry(mapping, 'KeyC', [r'c', r'C', r'', r''], 'c'); @@ -881,16 +661,6 @@ void testWin(LocaleKeymap mapping) { void testLinux(LocaleKeymap mapping) { group('de', () { - verifyEntry(mapping, 'Digit0', [r'0', r'=', r'}', r'°'], '0'); - verifyEntry(mapping, 'Digit1', [r'1', r'!', r'¹', r'¡'], '1'); - verifyEntry(mapping, 'Digit2', [r'2', r'"', r'²', r'⅛'], '2'); - verifyEntry(mapping, 'Digit3', [r'3', r'§', r'³', r'£'], '3'); - verifyEntry(mapping, 'Digit4', [r'4', r'$', r'¼', r'¤'], '4'); - verifyEntry(mapping, 'Digit5', [r'5', r'%', r'½', r'⅜'], '5'); - verifyEntry(mapping, 'Digit6', [r'6', r'&', r'¬', r'⅝'], '6'); - verifyEntry(mapping, 'Digit7', [r'7', r'/', r'{', r'⅞'], '7'); - verifyEntry(mapping, 'Digit8', [r'8', r'(', r'[', r'™'], '8'); - verifyEntry(mapping, 'Digit9', [r'9', r')', r']', r'±'], '9'); verifyEntry(mapping, 'KeyA', [r'a', r'A', r'æ', r'Æ'], 'a'); verifyEntry(mapping, 'KeyB', [r'b', r'B', r'“', r'‘'], 'b'); verifyEntry(mapping, 'KeyC', [r'c', r'C', r'¢', r'©'], 'c'); @@ -920,16 +690,6 @@ void testLinux(LocaleKeymap mapping) { }); group('en', () { - verifyEntry(mapping, 'Digit0', [r'0', r')', r'0', r')'], '0'); - verifyEntry(mapping, 'Digit1', [r'1', r'!', r'1', r'!'], '1'); - verifyEntry(mapping, 'Digit2', [r'2', r'@', r'2', r'@'], '2'); - verifyEntry(mapping, 'Digit3', [r'3', r'#', r'3', r'#'], '3'); - verifyEntry(mapping, 'Digit4', [r'4', r'$', r'4', r'$'], '4'); - verifyEntry(mapping, 'Digit5', [r'5', r'%', r'5', r'%'], '5'); - verifyEntry(mapping, 'Digit6', [r'6', r'^', r'6', r'^'], '6'); - verifyEntry(mapping, 'Digit7', [r'7', r'&', r'7', r'&'], '7'); - verifyEntry(mapping, 'Digit8', [r'8', r'*', r'8', r'*'], '8'); - verifyEntry(mapping, 'Digit9', [r'9', r'(', r'9', r'('], '9'); verifyEntry(mapping, 'KeyA', [r'a', r'A', r'a', r'A'], 'a'); verifyEntry(mapping, 'KeyB', [r'b', r'B', r'b', r'B'], 'b'); verifyEntry(mapping, 'KeyC', [r'c', r'C', r'c', r'C'], 'c'); @@ -959,16 +719,6 @@ void testLinux(LocaleKeymap mapping) { }); group('es', () { - verifyEntry(mapping, 'Digit0', [r'0', r'=', r'}', r'°'], '0'); - verifyEntry(mapping, 'Digit1', [r'1', r'!', r'|', r'¡'], '1'); - verifyEntry(mapping, 'Digit2', [r'2', r'"', r'@', r'⅛'], '2'); - verifyEntry(mapping, 'Digit3', [r'3', r'·', r'#', r'£'], '3'); - verifyEntry(mapping, 'Digit4', [r'4', r'$', r'~', r'$'], '4'); - verifyEntry(mapping, 'Digit5', [r'5', r'%', r'½', r'⅜'], '5'); - verifyEntry(mapping, 'Digit6', [r'6', r'&', r'¬', r'⅝'], '6'); - verifyEntry(mapping, 'Digit7', [r'7', r'/', r'{', r'⅞'], '7'); - verifyEntry(mapping, 'Digit8', [r'8', r'(', r'[', r'™'], '8'); - verifyEntry(mapping, 'Digit9', [r'9', r')', r']', r'±'], '9'); verifyEntry(mapping, 'KeyA', [r'a', r'A', r'æ', r'Æ'], 'a'); verifyEntry(mapping, 'KeyB', [r'b', r'B', r'”', r'’'], 'b'); verifyEntry(mapping, 'KeyC', [r'c', r'C', r'¢', r'©'], 'c'); @@ -998,16 +748,6 @@ void testLinux(LocaleKeymap mapping) { }); group('fr', () { - verifyEntry(mapping, 'Digit0', [r'à', r'0', r'@', r'°'], '0'); - verifyEntry(mapping, 'Digit1', [r'&', r'1', r'¹', r'¡'], '1'); - verifyEntry(mapping, 'Digit2', [r'é', r'2', r'~', r'⅛'], '2'); - verifyEntry(mapping, 'Digit3', [r'"', r'3', r'#', r'£'], '3'); - verifyEntry(mapping, 'Digit4', [r"'", r'4', r'{', r'$'], '4'); - verifyEntry(mapping, 'Digit5', [r'(', r'5', r'[', r'⅜'], '5'); - verifyEntry(mapping, 'Digit6', [r'-', r'6', r'|', r'⅝'], '6'); - verifyEntry(mapping, 'Digit7', [r'è', r'7', r'`', r'⅞'], '7'); - verifyEntry(mapping, 'Digit8', [r'_', r'8', r'\', r'™'], '8'); - verifyEntry(mapping, 'Digit9', [r'ç', r'9', r'^', r'±'], '9'); verifyEntry(mapping, 'KeyA', [r'q', r'Q', r'@', r'Ω'], 'q'); verifyEntry(mapping, 'KeyB', [r'b', r'B', r'”', r'’'], 'b'); verifyEntry(mapping, 'KeyC', [r'c', r'C', r'¢', r'©'], 'c'); @@ -1037,16 +777,6 @@ void testLinux(LocaleKeymap mapping) { }); group('ru', () { - verifyEntry(mapping, 'Digit0', [r'0', r')', r'0', r')'], '0'); - verifyEntry(mapping, 'Digit1', [r'1', r'!', r'1', r'!'], '1'); - verifyEntry(mapping, 'Digit2', [r'2', r'"', r'2', r'"'], '2'); - verifyEntry(mapping, 'Digit3', [r'3', r'№', r'3', r'№'], '3'); - verifyEntry(mapping, 'Digit4', [r'4', r';', r'4', r';'], '4'); - verifyEntry(mapping, 'Digit5', [r'5', r'%', r'5', r'%'], '5'); - verifyEntry(mapping, 'Digit6', [r'6', r':', r'6', r':'], '6'); - verifyEntry(mapping, 'Digit7', [r'7', r'?', r'7', r'?'], '7'); - verifyEntry(mapping, 'Digit8', [r'8', r'*', r'₽', r''], '8'); - verifyEntry(mapping, 'Digit9', [r'9', r'(', r'9', r'('], '9'); verifyEntry(mapping, 'KeyA', [r'ф', r'Ф', r'ф', r'Ф'], 'a'); verifyEntry(mapping, 'KeyB', [r'и', r'И', r'и', r'И'], 'b'); verifyEntry(mapping, 'KeyC', [r'с', r'С', r'с', r'С'], 'c'); @@ -1078,16 +808,6 @@ void testLinux(LocaleKeymap mapping) { void testDarwin(LocaleKeymap mapping) { group('de', () { - verifyEntry(mapping, 'Digit0', [r'0', r'=', r'≠', r'¯'], '0'); - verifyEntry(mapping, 'Digit1', [r'1', r'!', r'¡', r'¬'], '1'); - verifyEntry(mapping, 'Digit2', [r'2', r'"', r'“', r'”'], '2'); - verifyEntry(mapping, 'Digit3', [r'3', r'§', r'¶', r'#'], '3'); - verifyEntry(mapping, 'Digit4', [r'4', r'$', r'¢', r'£'], '4'); - verifyEntry(mapping, 'Digit5', [r'5', r'%', r'[', r'fi'], '5'); - verifyEntry(mapping, 'Digit6', [r'6', r'&', r']', r'Dead'], '6'); - verifyEntry(mapping, 'Digit7', [r'7', r'/', r'|', r'\'], '7'); - verifyEntry(mapping, 'Digit8', [r'8', r'(', r'{', r'˜'], '8'); - verifyEntry(mapping, 'Digit9', [r'9', r')', r'}', r'·'], '9'); verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'a'); verifyEntry(mapping, 'KeyB', [r'b', r'B', r'∫', r'‹'], 'b'); verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ç', r'Ç'], 'c'); @@ -1118,16 +838,6 @@ void testDarwin(LocaleKeymap mapping) { group('dvorak', () { verifyEntry(mapping, 'Comma', [r'w', r'W', r'∑', r'„'], 'w'); - verifyEntry(mapping, 'Digit0', [r'0', r')', r'º', r'‚'], '0'); - verifyEntry(mapping, 'Digit1', [r'1', r'!', r'¡', r'⁄'], '1'); - verifyEntry(mapping, 'Digit2', [r'2', r'@', r'™', r'€'], '2'); - verifyEntry(mapping, 'Digit3', [r'3', r'#', r'£', r'‹'], '3'); - verifyEntry(mapping, 'Digit4', [r'4', r'$', r'¢', r'›'], '4'); - verifyEntry(mapping, 'Digit5', [r'5', r'%', r'∞', r'fi'], '5'); - verifyEntry(mapping, 'Digit6', [r'6', r'^', r'§', r'fl'], '6'); - verifyEntry(mapping, 'Digit7', [r'7', r'&', r'¶', r'‡'], '7'); - verifyEntry(mapping, 'Digit8', [r'8', r'*', r'•', r'°'], '8'); - verifyEntry(mapping, 'Digit9', [r'9', r'(', r'ª', r'·'], '9'); verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'a'); verifyEntry(mapping, 'KeyB', [r'x', r'X', r'≈', r'˛'], 'x'); verifyEntry(mapping, 'KeyC', [r'j', r'J', r'∆', r'Ô'], 'j'); @@ -1156,16 +866,6 @@ void testDarwin(LocaleKeymap mapping) { }); group('en', () { - verifyEntry(mapping, 'Digit0', [r'0', r')', r'º', r'‚'], '0'); - verifyEntry(mapping, 'Digit1', [r'1', r'!', r'¡', r'⁄'], '1'); - verifyEntry(mapping, 'Digit2', [r'2', r'@', r'™', r'€'], '2'); - verifyEntry(mapping, 'Digit3', [r'3', r'#', r'£', r'‹'], '3'); - verifyEntry(mapping, 'Digit4', [r'4', r'$', r'¢', r'›'], '4'); - verifyEntry(mapping, 'Digit5', [r'5', r'%', r'∞', r'fi'], '5'); - verifyEntry(mapping, 'Digit6', [r'6', r'^', r'§', r'fl'], '6'); - verifyEntry(mapping, 'Digit7', [r'7', r'&', r'¶', r'‡'], '7'); - verifyEntry(mapping, 'Digit8', [r'8', r'*', r'•', r'°'], '8'); - verifyEntry(mapping, 'Digit9', [r'9', r'(', r'ª', r'·'], '9'); verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'a'); verifyEntry(mapping, 'KeyB', [r'b', r'B', r'∫', r'ı'], 'b'); verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ç', r'Ç'], 'c'); @@ -1195,16 +895,6 @@ void testDarwin(LocaleKeymap mapping) { }); group('en-ext', () { - verifyEntry(mapping, 'Digit0', [r'0', r')', r'º', r'‚'], '0'); - verifyEntry(mapping, 'Digit1', [r'1', r'!', r'¡', r'⁄'], '1'); - verifyEntry(mapping, 'Digit2', [r'2', r'@', r'™', r'€'], '2'); - verifyEntry(mapping, 'Digit3', [r'3', r'#', r'£', r'‹'], '3'); - verifyEntry(mapping, 'Digit4', [r'4', r'$', r'¢', r'›'], '4'); - verifyEntry(mapping, 'Digit5', [r'5', r'%', r'§', r'†'], '5'); - verifyEntry(mapping, 'Digit6', [r'6', r'^', r'Dead', r'̂'], '6'); - verifyEntry(mapping, 'Digit7', [r'7', r'&', r'¶', r'‡'], '7'); - verifyEntry(mapping, 'Digit8', [r'8', r'*', r'•', r'°'], '8'); - verifyEntry(mapping, 'Digit9', [r'9', r'(', r'ª', r'·'], '9'); verifyEntry(mapping, 'KeyA', [r'a', r'A', r'Dead', r'̄'], 'a'); verifyEntry(mapping, 'KeyB', [r'b', r'B', r'Dead', r'̆'], 'b'); verifyEntry(mapping, 'KeyC', [r'c', r'C', r'Dead', r'̧'], 'c'); @@ -1234,16 +924,6 @@ void testDarwin(LocaleKeymap mapping) { }); group('en-intl', () { - verifyEntry(mapping, 'Digit0', [r'0', r')', r'º', r'‚'], '0'); - verifyEntry(mapping, 'Digit1', [r'1', r'!', r'¡', r'⁄'], '1'); - verifyEntry(mapping, 'Digit2', [r'2', r'@', r'™', r'€'], '2'); - verifyEntry(mapping, 'Digit3', [r'3', r'#', r'£', r'‹'], '3'); - verifyEntry(mapping, 'Digit4', [r'4', r'$', r'¢', r'›'], '4'); - verifyEntry(mapping, 'Digit5', [r'5', r'%', r'∞', r'fi'], '5'); - verifyEntry(mapping, 'Digit6', [r'6', r'Dead', r'§', r'fl'], '6'); - verifyEntry(mapping, 'Digit7', [r'7', r'&', r'¶', r'‡'], '7'); - verifyEntry(mapping, 'Digit8', [r'8', r'*', r'•', r'°'], '8'); - verifyEntry(mapping, 'Digit9', [r'9', r'(', r'ª', r'·'], '9'); verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'a'); verifyEntry(mapping, 'KeyB', [r'b', r'B', r'∫', r'ı'], 'b'); verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ç', r'Ç'], 'c'); @@ -1273,16 +953,6 @@ void testDarwin(LocaleKeymap mapping) { }); group('en-uk', () { - verifyEntry(mapping, 'Digit0', [r'0', r')', r'º', r'‚'], '0'); - verifyEntry(mapping, 'Digit1', [r'1', r'!', r'¡', r'⁄'], '1'); - verifyEntry(mapping, 'Digit2', [r'2', r'@', r'€', r'™'], '2'); - verifyEntry(mapping, 'Digit3', [r'3', r'£', r'#', r'‹'], '3'); - verifyEntry(mapping, 'Digit4', [r'4', r'$', r'¢', r'›'], '4'); - verifyEntry(mapping, 'Digit5', [r'5', r'%', r'∞', r'fi'], '5'); - verifyEntry(mapping, 'Digit6', [r'6', r'^', r'§', r'fl'], '6'); - verifyEntry(mapping, 'Digit7', [r'7', r'&', r'¶', r'‡'], '7'); - verifyEntry(mapping, 'Digit8', [r'8', r'*', r'•', r'°'], '8'); - verifyEntry(mapping, 'Digit9', [r'9', r'(', r'ª', r'·'], '9'); verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'a'); verifyEntry(mapping, 'KeyB', [r'b', r'B', r'∫', r'ı'], 'b'); verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ç', r'Ç'], 'c'); @@ -1312,16 +982,6 @@ void testDarwin(LocaleKeymap mapping) { }); group('es', () { - verifyEntry(mapping, 'Digit0', [r'0', r'=', r'≠', r'≈'], '0'); - verifyEntry(mapping, 'Digit1', [r'1', r'!', r'|', r'ı'], '1'); - verifyEntry(mapping, 'Digit2', [r'2', r'"', r'@', r'˝'], '2'); - verifyEntry(mapping, 'Digit3', [r'3', r'·', r'#', r'•'], '3'); - verifyEntry(mapping, 'Digit4', [r'4', r'$', r'¢', r'£'], '4'); - verifyEntry(mapping, 'Digit5', [r'5', r'%', r'∞', r'‰'], '5'); - verifyEntry(mapping, 'Digit6', [r'6', r'&', r'¬', r' '], '6'); - verifyEntry(mapping, 'Digit7', [r'7', r'/', r'÷', r'⁄'], '7'); - verifyEntry(mapping, 'Digit8', [r'8', r'(', r'“', r'‘'], '8'); - verifyEntry(mapping, 'Digit9', [r'9', r')', r'”', r'’'], '9'); verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'a'); verifyEntry(mapping, 'KeyB', [r'b', r'B', r'ß', r''], 'b'); verifyEntry(mapping, 'KeyC', [r'c', r'C', r'©', r' '], 'c'); @@ -1351,16 +1011,6 @@ void testDarwin(LocaleKeymap mapping) { }); group('fr', () { - verifyEntry(mapping, 'Digit0', [r'à', r'0', r'ø', r'Ø'], '0'); - verifyEntry(mapping, 'Digit1', [r'&', r'1', r'', r'Dead'], '1'); - verifyEntry(mapping, 'Digit2', [r'é', r'2', r'ë', r'„'], '2'); - verifyEntry(mapping, 'Digit3', [r'"', r'3', r'“', r'”'], '3'); - verifyEntry(mapping, 'Digit4', [r"'", r'4', r'‘', r'’'], '4'); - verifyEntry(mapping, 'Digit5', [r'(', r'5', r'{', r'['], '5'); - verifyEntry(mapping, 'Digit6', [r'§', r'6', r'¶', r'å'], '6'); - verifyEntry(mapping, 'Digit7', [r'è', r'7', r'«', r'»'], '7'); - verifyEntry(mapping, 'Digit8', [r'!', r'8', r'¡', r'Û'], '8'); - verifyEntry(mapping, 'Digit9', [r'ç', r'9', r'Ç', r'Á'], '9'); verifyEntry(mapping, 'KeyA', [r'q', r'Q', r'‡', r'Ω'], 'q'); verifyEntry(mapping, 'KeyB', [r'b', r'B', r'ß', r'∫'], 'b'); verifyEntry(mapping, 'KeyC', [r'c', r'C', r'©', r'¢'], 'c'); @@ -1390,16 +1040,6 @@ void testDarwin(LocaleKeymap mapping) { }); group('it', () { - verifyEntry(mapping, 'Digit0', [r'0', r'=', r'≠', r'≈'], '0'); - verifyEntry(mapping, 'Digit1', [r'1', r'!', r'«', r'»'], '1'); - verifyEntry(mapping, 'Digit2', [r'2', r'"', r'“', r'”'], '2'); - verifyEntry(mapping, 'Digit3', [r'3', r'£', r'‘', r'’'], '3'); - verifyEntry(mapping, 'Digit4', [r'4', r'$', r'¥', r'¢'], '4'); - verifyEntry(mapping, 'Digit5', [r'5', r'%', r'~', r'‰'], '5'); - verifyEntry(mapping, 'Digit6', [r'6', r'&', r'‹', r'›'], '6'); - verifyEntry(mapping, 'Digit7', [r'7', r'/', r'÷', r'⁄'], '7'); - verifyEntry(mapping, 'Digit8', [r'8', r'(', r'Dead', r''], '8'); - verifyEntry(mapping, 'Digit9', [r'9', r')', r'Dead', r' '], '9'); verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'a'); verifyEntry(mapping, 'KeyB', [r'b', r'B', r'∫', r'Í'], 'b'); verifyEntry(mapping, 'KeyC', [r'c', r'C', r'©', r'Á'], 'c'); @@ -1429,16 +1069,6 @@ void testDarwin(LocaleKeymap mapping) { }); group('jp', () { - verifyEntry(mapping, 'Digit0', [r'0', r')', r'º', r'‚'], '0'); - verifyEntry(mapping, 'Digit1', [r'1', r'!', r'¡', r'⁄'], '1'); - verifyEntry(mapping, 'Digit2', [r'2', r'@', r'™', r'€'], '2'); - verifyEntry(mapping, 'Digit3', [r'3', r'#', r'£', r'‹'], '3'); - verifyEntry(mapping, 'Digit4', [r'4', r'$', r'¢', r'›'], '4'); - verifyEntry(mapping, 'Digit5', [r'5', r'%', r'∞', r'fi'], '5'); - verifyEntry(mapping, 'Digit6', [r'6', r'^', r'§', r'fl'], '6'); - verifyEntry(mapping, 'Digit7', [r'7', r'&', r'¶', r'‡'], '7'); - verifyEntry(mapping, 'Digit8', [r'8', r'*', r'•', r'°'], '8'); - verifyEntry(mapping, 'Digit9', [r'9', r'(', r'ª', r'·'], '9'); verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'a'); verifyEntry(mapping, 'KeyB', [r'b', r'B', r'∫', r'ı'], 'b'); verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ç', r'Ç'], 'c'); @@ -1468,16 +1098,6 @@ void testDarwin(LocaleKeymap mapping) { }); group('jp-roman', () { - verifyEntry(mapping, 'Digit0', [r'0', r')', r'º', r'‚'], '0'); - verifyEntry(mapping, 'Digit1', [r'1', r'!', r'¡', r'⁄'], '1'); - verifyEntry(mapping, 'Digit2', [r'2', r'@', r'™', r'€'], '2'); - verifyEntry(mapping, 'Digit3', [r'3', r'#', r'£', r'‹'], '3'); - verifyEntry(mapping, 'Digit4', [r'4', r'$', r'¢', r'›'], '4'); - verifyEntry(mapping, 'Digit5', [r'5', r'%', r'§', r'†'], '5'); - verifyEntry(mapping, 'Digit6', [r'6', r'^', r'Dead', r'̂'], '6'); - verifyEntry(mapping, 'Digit7', [r'7', r'&', r'¶', r'‡'], '7'); - verifyEntry(mapping, 'Digit8', [r'8', r'*', r'•', r'°'], '8'); - verifyEntry(mapping, 'Digit9', [r'9', r'(', r'ª', r'·'], '9'); verifyEntry(mapping, 'KeyA', [r'a', r'A', r'Dead', r'̄'], 'a'); verifyEntry(mapping, 'KeyB', [r'b', r'B', r'Dead', r'̆'], 'b'); verifyEntry(mapping, 'KeyC', [r'c', r'C', r'Dead', r'̧'], 'c'); @@ -1507,16 +1127,6 @@ void testDarwin(LocaleKeymap mapping) { }); group('ko', () { - verifyEntry(mapping, 'Digit0', [r'0', r')', r'0', r')'], '0'); - verifyEntry(mapping, 'Digit1', [r'1', r'!', r'1', r'!'], '1'); - verifyEntry(mapping, 'Digit2', [r'2', r'@', r'2', r'@'], '2'); - verifyEntry(mapping, 'Digit3', [r'3', r'#', r'3', r'#'], '3'); - verifyEntry(mapping, 'Digit4', [r'4', r'$', r'4', r'$'], '4'); - verifyEntry(mapping, 'Digit5', [r'5', r'%', r'5', r'%'], '5'); - verifyEntry(mapping, 'Digit6', [r'6', r'^', r'6', r'^'], '6'); - verifyEntry(mapping, 'Digit7', [r'7', r'&', r'7', r'&'], '7'); - verifyEntry(mapping, 'Digit8', [r'8', r'*', r'8', r'*'], '8'); - verifyEntry(mapping, 'Digit9', [r'9', r'(', r'9', r'('], '9'); verifyEntry(mapping, 'KeyA', [r'ㅁ', r'ㅁ', r'a', r'A'], 'a'); verifyEntry(mapping, 'KeyB', [r'ㅠ', r'ㅠ', r'b', r'B'], 'b'); verifyEntry(mapping, 'KeyC', [r'ㅊ', r'ㅊ', r'c', r'C'], 'c'); @@ -1546,16 +1156,6 @@ void testDarwin(LocaleKeymap mapping) { }); group('pl', () { - verifyEntry(mapping, 'Digit0', [r'0', r')', r'ľ', r'‚'], '0'); - verifyEntry(mapping, 'Digit1', [r'1', r'!', r'Ń', r'ŕ'], '1'); - verifyEntry(mapping, 'Digit2', [r'2', r'@', r'™', r'Ř'], '2'); - verifyEntry(mapping, 'Digit3', [r'3', r'#', r'€', r'‹'], '3'); - verifyEntry(mapping, 'Digit4', [r'4', r'$', r'ß', r'›'], '4'); - verifyEntry(mapping, 'Digit5', [r'5', r'%', r'į', r'ř'], '5'); - verifyEntry(mapping, 'Digit6', [r'6', r'^', r'§', r'Ŗ'], '6'); - verifyEntry(mapping, 'Digit7', [r'7', r'&', r'¶', r'ŗ'], '7'); - verifyEntry(mapping, 'Digit8', [r'8', r'*', r'•', r'°'], '8'); - verifyEntry(mapping, 'Digit9', [r'9', r'(', r'Ľ', r'Š'], '9'); verifyEntry(mapping, 'KeyA', [r'a', r'A', r'ą', r'Ą'], 'a'); verifyEntry(mapping, 'KeyB', [r'b', r'B', r'ļ', r'ű'], 'b'); verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ć', r'Ć'], 'c'); @@ -1585,16 +1185,6 @@ void testDarwin(LocaleKeymap mapping) { }); group('pt', () { - verifyEntry(mapping, 'Digit0', [r'0', r')', r'º', r'‚'], '0'); - verifyEntry(mapping, 'Digit1', [r'1', r'!', r'¡', r'⁄'], '1'); - verifyEntry(mapping, 'Digit2', [r'2', r'@', r'™', r'€'], '2'); - verifyEntry(mapping, 'Digit3', [r'3', r'#', r'£', r'‹'], '3'); - verifyEntry(mapping, 'Digit4', [r'4', r'$', r'¢', r'›'], '4'); - verifyEntry(mapping, 'Digit5', [r'5', r'%', r'∞', r'fi'], '5'); - verifyEntry(mapping, 'Digit6', [r'6', r'Dead', r'§', r'fl'], '6'); - verifyEntry(mapping, 'Digit7', [r'7', r'&', r'¶', r'‡'], '7'); - verifyEntry(mapping, 'Digit8', [r'8', r'*', r'•', r'°'], '8'); - verifyEntry(mapping, 'Digit9', [r'9', r'(', r'ª', r'·'], '9'); verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'a'); verifyEntry(mapping, 'KeyB', [r'b', r'B', r'∫', r'ı'], 'b'); verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ç', r'Ç'], 'c'); @@ -1624,16 +1214,6 @@ void testDarwin(LocaleKeymap mapping) { }); group('ru', () { - verifyEntry(mapping, 'Digit0', [r'0', r')', r'}', r'`'], '0'); - verifyEntry(mapping, 'Digit1', [r'1', r'!', r'!', r'|'], '1'); - verifyEntry(mapping, 'Digit2', [r'2', r'"', r'@', r'"'], '2'); - verifyEntry(mapping, 'Digit3', [r'3', r'№', r'#', r'£'], '3'); - verifyEntry(mapping, 'Digit4', [r'4', r'%', r'$', r'€'], '4'); - verifyEntry(mapping, 'Digit5', [r'5', r':', r'%', r'∞'], '5'); - verifyEntry(mapping, 'Digit6', [r'6', r',', r'^', r'¬'], '6'); - verifyEntry(mapping, 'Digit7', [r'7', r'.', r'&', r'¶'], '7'); - verifyEntry(mapping, 'Digit8', [r'8', r';', r'*', r'√'], '8'); - verifyEntry(mapping, 'Digit9', [r'9', r'(', r'{', r"'"], '9'); verifyEntry(mapping, 'KeyA', [r'ф', r'Ф', r'ƒ', r'ƒ'], 'a'); verifyEntry(mapping, 'KeyB', [r'и', r'И', r'и', r'И'], 'b'); verifyEntry(mapping, 'KeyC', [r'с', r'С', r'≠', r'≠'], 'c'); @@ -1663,16 +1243,6 @@ void testDarwin(LocaleKeymap mapping) { }); group('sv', () { - verifyEntry(mapping, 'Digit0', [r'0', r'=', r'≈', r'≠'], '0'); - verifyEntry(mapping, 'Digit1', [r'1', r'!', r'©', r'¡'], '1'); - verifyEntry(mapping, 'Digit2', [r'2', r'"', r'@', r'”'], '2'); - verifyEntry(mapping, 'Digit3', [r'3', r'#', r'£', r'¥'], '3'); - verifyEntry(mapping, 'Digit4', [r'4', r'€', r'$', r'¢'], '4'); - verifyEntry(mapping, 'Digit5', [r'5', r'%', r'∞', r'‰'], '5'); - verifyEntry(mapping, 'Digit6', [r'6', r'&', r'§', r'¶'], '6'); - verifyEntry(mapping, 'Digit7', [r'7', r'/', r'|', r'\'], '7'); - verifyEntry(mapping, 'Digit8', [r'8', r'(', r'[', r'{'], '8'); - verifyEntry(mapping, 'Digit9', [r'9', r')', r']', r'}'], '9'); verifyEntry(mapping, 'KeyA', [r'a', r'A', r'', r'◊'], 'a'); verifyEntry(mapping, 'KeyB', [r'b', r'B', r'›', r'»'], 'b'); verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ç', r'Ç'], 'c'); @@ -1702,16 +1272,6 @@ void testDarwin(LocaleKeymap mapping) { }); group('zh-hans', () { - verifyEntry(mapping, 'Digit0', [r'0', r')', r'º', r'‚'], '0'); - verifyEntry(mapping, 'Digit1', [r'1', r'!', r'¡', r'⁄'], '1'); - verifyEntry(mapping, 'Digit2', [r'2', r'@', r'™', r'€'], '2'); - verifyEntry(mapping, 'Digit3', [r'3', r'#', r'£', r'‹'], '3'); - verifyEntry(mapping, 'Digit4', [r'4', r'¥', r'¢', r'›'], '4'); - verifyEntry(mapping, 'Digit5', [r'5', r'%', r'∞', r'fi'], '5'); - verifyEntry(mapping, 'Digit6', [r'6', r'', r'§', r'fl'], '6'); - verifyEntry(mapping, 'Digit7', [r'7', r'&', r'¶', r'‡'], '7'); - verifyEntry(mapping, 'Digit8', [r'8', r'*', r'•', r'°'], '8'); - verifyEntry(mapping, 'Digit9', [r'9', r'(', r'ª', r'·'], '9'); verifyEntry(mapping, 'KeyA', [r'a', r'A', r'å', r'Å'], 'a'); verifyEntry(mapping, 'KeyB', [r'b', r'B', r'∫', r'ı'], 'b'); verifyEntry(mapping, 'KeyC', [r'c', r'C', r'ç', r'Ç'], 'c'); diff --git a/tools/gen_web_locale_keymap/lib/benchmark_planner.dart b/tools/gen_web_locale_keymap/lib/benchmark_planner.dart index b2d3b23234ee2..9498406381eb2 100644 --- a/tools/gen_web_locale_keymap/lib/benchmark_planner.dart +++ b/tools/gen_web_locale_keymap/lib/benchmark_planner.dart @@ -12,7 +12,7 @@ import 'layout_types.dart'; final Map _kMandatoryGoalsByChar = Map.fromEntries( kLayoutGoals .entries - .where((MapEntry entry) => isAlnum(entry.value)) + .where((MapEntry entry) => isLetter(entry.value.codeUnitAt(0))) .map((MapEntry entry) => MapEntry(entry.value!, entry.key)) ); diff --git a/tools/gen_web_locale_keymap/lib/common.dart b/tools/gen_web_locale_keymap/lib/common.dart index 05cca806c1bd3..2d8526d8773e3 100644 --- a/tools/gen_web_locale_keymap/lib/common.dart +++ b/tools/gen_web_locale_keymap/lib/common.dart @@ -74,26 +74,16 @@ final int _kLowerA = 'a'.codeUnitAt(0); final int _kUpperA = 'A'.codeUnitAt(0); final int _kLowerZ = 'z'.codeUnitAt(0); final int _kUpperZ = 'Z'.codeUnitAt(0); -final int _k0 = '0'.codeUnitAt(0); -final int _k9 = '9'.codeUnitAt(0); -bool _isAscii(String key) { - if (key.length != 1) { - return false; - } +bool _isAscii(int charCode) { // 0x20 is the first printable character in ASCII. - return key.codeUnitAt(0) >= 0x20 && key.codeUnitAt(0) <= 0x7F; + return charCode >= 0x20 && charCode <= 0x7F; } /// Returns whether the `char` is a single character of a letter or a digit. -bool isAlnum(String char) { - if (char.length != 1) { - return false; - } - final int charCode = char.codeUnitAt(0); +bool isLetter(int charCode) { return (charCode >= _kLowerA && charCode <= _kLowerZ) - || (charCode >= _kUpperA && charCode <= _kUpperZ) - || (charCode >= _k0 && charCode <= _k9); + || (charCode >= _kUpperA && charCode <= _kUpperZ); } /// A set of rules that can derive a large number of logical keys simply from @@ -101,11 +91,19 @@ bool isAlnum(String char) { /// /// This greatly reduces the entries needed in the final mapping. int? heuristicMapper(String code, String key) { - if (isAlnum(key)) { - return key.toLowerCase().codeUnitAt(0); + // Digit code: return the digit by event code. + if (code.startsWith('Digit')) { + assert(code.length == 6); + return code.codeUnitAt(5); // The character immediately after 'Digit' + } + final int charCode = key.codeUnitAt(0); + // Non-ascii: return the goal (i.e. US mapping by event code). + if (key.length > 1 || !_isAscii(charCode)) { + return kLayoutGoals[code]?.codeUnitAt(0); } - if (!_isAscii(key)) { - return kLayoutGoals[code]!.codeUnitAt(0); + // Letter key: return the event key letter. + if (isLetter(charCode)) { + return key.toLowerCase().codeUnitAt(0); } return null; } @@ -233,7 +231,7 @@ void _marshallEventKey(StringBuffer builder, String value) { if (value == _kEventKeyDead) { builder.write(_kUseDead); } else { - assert(value.length == 1); + assert(value.length == 1, value); assert(value != _kUseDead); builder.write(value); } From 884e783dd6ea2f6baf11c94fbc10b77ae7add36c Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Tue, 29 Nov 2022 12:10:07 -0800 Subject: [PATCH 72/74] en-in test --- lib/web_ui/test/keyboard_converter_test.dart | 21 ++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/lib/web_ui/test/keyboard_converter_test.dart b/lib/web_ui/test/keyboard_converter_test.dart index bd8f800c0cd4a..3bbbeb8bc6be3 100644 --- a/lib/web_ui/test/keyboard_converter_test.dart +++ b/lib/web_ui/test/keyboard_converter_test.dart @@ -18,6 +18,7 @@ const int kLocationNumpad = 3; final int kPhysicalKeyA = kWebToPhysicalKey['KeyA']!; final int kPhysicalKeyE = kWebToPhysicalKey['KeyE']!; +final int kPhysicalKeyL = kWebToPhysicalKey['KeyL']!; final int kPhysicalKeyU = kWebToPhysicalKey['KeyU']!; final int kPhysicalDigit1 = kWebToPhysicalKey['Digit1']!; final int kPhysicalNumpad1 = kWebToPhysicalKey['Numpad1']!; @@ -31,6 +32,7 @@ final int kPhysicalScrollLock = kWebToPhysicalKey['ScrollLock']!; const int kPhysicalEmptyCode = 0x1700000000; const int kLogicalKeyA = 0x00000000061; +const int kLogicalKeyL = 0x0000000006C; const int kLogicalKeyU = 0x00000000075; const int kLogicalDigit1 = 0x00000000031; final int kLogicalNumpad1 = kWebLogicalLocationMap['1']![kLocationNumpad]!; @@ -128,6 +130,25 @@ void testMain() { expect(MockKeyboardEvent.lastDefaultPrevented, isFalse); }); + test('Special cases', () { + final List keyDataList = []; + final KeyboardConverter converter = KeyboardConverter((ui.KeyData key) { + keyDataList.add(key); + // Only handle down events + return key.type == ui.KeyEventType.down; + }, OperatingSystem.windows); + + // en-in.win, with AltGr + converter.handleEvent(keyDownEvent('KeyL', 'l̥', kCtrl | kAlt)..timeStamp = 1); + expectKeyData(keyDataList.last, + timeStamp: const Duration(milliseconds: 1), + type: ui.KeyEventType.down, + physical: kPhysicalKeyL, + logical: kLogicalKeyL, + character: 'l̥', + ); + }); + test('Release modifier during a repeated sequence', () { final List keyDataList = []; final KeyboardConverter converter = KeyboardConverter((ui.KeyData key) { From 3c48e3de53eda56484f3fc42dbf3bbef47057a18 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Tue, 29 Nov 2022 14:08:44 -0800 Subject: [PATCH 73/74] Remove unnecessary build change --- lib/web_ui/lib/src/engine/keyboard_binding.dart | 13 ++++++------- web_sdk/BUILD.gn | 14 ++------------ web_sdk/test/sdk_rewriter_test.dart | 1 + 3 files changed, 9 insertions(+), 19 deletions(-) diff --git a/lib/web_ui/lib/src/engine/keyboard_binding.dart b/lib/web_ui/lib/src/engine/keyboard_binding.dart index 6e5d11eccc9d0..92d5ec4b5177b 100644 --- a/lib/web_ui/lib/src/engine/keyboard_binding.dart +++ b/lib/web_ui/lib/src/engine/keyboard_binding.dart @@ -123,10 +123,6 @@ class KeyboardBinding { } } - static void debugClearInstance() { - _instance = null; - } - /// The platform as used in the initialization. /// /// By default it is derived from [operatingSystem]. @@ -227,10 +223,10 @@ class KeyboardConverter { _mapping = _mappingFromPlatform(platform); final DispatchKeyData performDispatchKeyData; - // Whether the current platform is macOS, which affects how certain key events - // are comprehended. + /// Whether the current platform is macOS, which affects how certain key events + /// are comprehended. final bool onMacOs; - // Maps logical keys from key event properties. + /// Maps logical keys from key event properties. final locale_keymap.LocaleKeymap _mapping; static locale_keymap.LocaleKeymap _mappingFromPlatform(OperatingSystem platform) { @@ -382,6 +378,9 @@ class KeyboardConverter { final int physicalKey = _getPhysicalCode(event.code!); final bool logicalKeyIsCharacter = !_eventKeyIsKeyName(eventKey); + // The function body might or might not be evaluated. If the event is a key + // up event, the resulting event will simply use the currently pressed + // logical key. final ValueGetter logicalKey = _cached(() { // Mapped logical keys, such as ArrowLeft, Escape, AudioVolumeDown. final int? mappedLogicalKey = kWebToLogicalKey[eventKey]; diff --git a/web_sdk/BUILD.gn b/web_sdk/BUILD.gn index 792e005a5779d..9fe3d8e51edc7 100644 --- a/web_sdk/BUILD.gn +++ b/web_sdk/BUILD.gn @@ -20,14 +20,6 @@ web_ui_sources = exec_script("//third_party/dart/tools/list_dart_files.py", ], "list lines") -web_locale_keymap_sources = - exec_script("//third_party/dart/tools/list_dart_files.py", - [ - "absolute", - rebase_path("//flutter/third_party/web_locale_keymap/lib"), - ], - "list lines") - web_engine_libraries = [ ":skwasm_impl_library", ":skwasm_stub_library", @@ -279,8 +271,7 @@ template("_compile_platform") { assert(defined(invoker.output_dill), "output_dill must be defined for $target_name") _kernel_worker(target_name) { - inputs = - [ "sdk_rewriter.dart" ] + web_ui_sources + web_locale_keymap_sources + inputs = [ "sdk_rewriter.dart" ] + web_ui_sources outputs = [ invoker.output_dill ] @@ -452,8 +443,7 @@ template("_compile_ddc_modules") { "auto_detect must be defined for $target_name") _dartdevc(target_name) { - inputs = - [ "sdk_rewriter.dart" ] + web_ui_sources + web_locale_keymap_sources + inputs = [ "sdk_rewriter.dart" ] + web_ui_sources packages = dart_sdk_package_config diff --git a/web_sdk/test/sdk_rewriter_test.dart b/web_sdk/test/sdk_rewriter_test.dart index 364e0a2e49231..54902cfc14e1e 100644 --- a/web_sdk/test/sdk_rewriter_test.dart +++ b/web_sdk/test/sdk_rewriter_test.dart @@ -145,5 +145,6 @@ void printSomething() { // Other libraries (should not have extra imports). expect(getExtraImportsForLibrary('web_unicode'), isEmpty); + expect(getExtraImportsForLibrary('web_locale_keymap'), isEmpty); }); } From e27af0887ec9e91ddae60751c4d90ca54f0b6a02 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Tue, 29 Nov 2022 15:56:57 -0800 Subject: [PATCH 74/74] Better order --- web_sdk/BUILD.gn | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/web_sdk/BUILD.gn b/web_sdk/BUILD.gn index 9fe3d8e51edc7..46d41ad5305eb 100644 --- a/web_sdk/BUILD.gn +++ b/web_sdk/BUILD.gn @@ -113,14 +113,6 @@ sdk_rewriter("web_ui_library_sources") { exclude_patterns = [ rebase_path("//flutter/lib/web_ui/lib/src/*") ] } -sdk_rewriter("web_locale_keymap_library") { - library_name = "web_locale_keymap" - api_file = - "//flutter/third_party/web_locale_keymap/lib/web_locale_keymap.dart" - input_dir = "//flutter/third_party/web_locale_keymap/lib/web_locale_keymap/" - output_dir = "$root_out_dir/flutter_web_sdk/lib/_web_locale_keymap/" -} - sdk_rewriter("web_engine_library") { library_name = "engine" api_file = "//flutter/lib/web_ui/lib/src/engine.dart" @@ -153,6 +145,14 @@ sdk_rewriter("web_unicode_library") { output_dir = "$root_out_dir/flutter_web_sdk/lib/_web_unicode/" } +sdk_rewriter("web_locale_keymap_library") { + library_name = "web_locale_keymap" + api_file = + "//flutter/third_party/web_locale_keymap/lib/web_locale_keymap.dart" + input_dir = "//flutter/third_party/web_locale_keymap/lib/web_locale_keymap/" + output_dir = "$root_out_dir/flutter_web_sdk/lib/_web_locale_keymap/" +} + copy("web_ui_library") { sources = [ "//flutter/web_sdk/libraries.json" ]