diff --git a/dev/tools/gen_keycodes/README.md b/dev/tools/gen_keycodes/README.md index 6eb50333db..8029d8966e 100644 --- a/dev/tools/gen_keycodes/README.md +++ b/dev/tools/gen_keycodes/README.md @@ -1,61 +1,47 @@ ## Keycode Generator This directory contains a keycode generator that can generate Dart code for -the `LogicalKeyboardKey` and `PhysicalKeyboardKey` classes. It draws information -from both the Chromium and Android source bases and incorporates the -information it finds in those sources into a single key database in JSON form. +the `LogicalKeyboardKey` and `PhysicalKeyboardKey` classes. -It then generates `keyboard_key.dart` (containing the `LogicalKeyboardKey` and -`PhysicalKeyboardKey` classes), and `keyboard_maps.dart`, containing -platform-specific immutable maps for translating platform keycodes and -information into the pre-defined key values in the `LogicalKeyboardKey` and -`PhysicalKeyboardKey` classes. +It generates multiple files across Flutter. For framework, it generates -The `data` subdirectory contains both some local data files and the templates -used to generate the source files. +* [`keyboard_key.dart`](../../../packages/flutter/lib/src/services/keyboard_key.dart), which contains the definition and list of logical keys and physical keys; and +* [`keyboard_maps.dart`](../../../packages/flutter/lib/src/services/keyboard_maps.dart), which contains platform-specific immutable maps used for the `RawKeyboard` API. -- `data/key_data.json`: contains the merged data from all the other sources. - This file will be regenerated if "--collect" is specified for the - gen_keycodes script. -- `data/key_name_to_android_name.json`: contains a mapping from Flutter key - names to Android keycode names (with the "KEY\_" prefix stripped off). -- `data/keyboard_key.tmpl`: contains the template for the `keyboard_key.dart` - file. Markers that begin and end with "@@@" denote the locations where - generated data will be inserted. -- `data/keyboard_maps.tmpl`: contains the template for the `keyboard_maps.dart` - file. Markers that begin and end with "@@@" denote the locations where - generated data will be inserted. -- `data/printable.json`: contains a mapping between Flutter key name and its - printable character. This character is used as the key label. -- `data/synonyms.json`: contains a mapping between pseudo-keys that represent - other keys and the sets of keys they represent. For example, this contains - the "shift" key that represents either a "shiftLeft" or "shiftRight" key. +For engine, it generates one key mapping file for each platform. + +It draws information from various source bases, including online +repositories, and manual mapping in the `data` subdirectory. It incorporates +this information into a giant list of physical keys +([`physical_key_data.json`](data/physical_key_data.json)), +and another for logical keys +([`logical_key_data.json`](data/logical_key_data.json)). +The two files are checked in, and can be used as the data source next time so that +output files can be generated without the Internet. ## Running the tool -To run the `gen_keycodes` tool using the checked in `key_data.json` file, run -it like so: +The tool can be run based on the existing database. To do this, run: ```bash -$FLUTTER_ROOT/bin/cache/dart-sdk/bin/dart bin/gen_keycodes.dart +/PATH/TO/ROOT/bin/gen_keycodes ``` -This will regenerate the `keyboard_key.dart` and `keyboard_maps.dart` files in -place. +The tool can also be run by rebuilding the database by drawing online information +anew before generating the files. To do this, run: -If you wish to incorporate and parse changes from the Chromium and Android -source trees, add `--collect` to the command line. The script will download and -incorporate the changed data automatically. Note that the parsing is specific to -the format of the source code that it is reading, so if the format of those -files changes appreciably, you will need to update the parser. +```bash +/PATH/TO/ROOT/bin/gen_keycodes --collect +``` -There are other options for manually specifying the file to read in place of the -downloaded files, use `--help` to see what is available. +This will generate `physical_key_data.json` and `logical_key_data.json`. These +files should be checked in. -If the data in those files changes in the future to be unhelpful, then we can -switch to another data source, or abandon the parsing and maintain -`key_data.json` manually. All output files and local input files should be -checked in. +By default this tool assumes that the gclient directory for flutter/engine +and the root for the flutter/flutter are placed at the same folder. If not, +use `--engine-root=/ENGINE/GCLIENT/ROOT` to specify the engine root. + +Other options can be found using `--help`. ## Key Code ID Scheme diff --git a/dev/tools/gen_keycodes/analysis_options.yaml b/dev/tools/gen_keycodes/analysis_options.yaml new file mode 100644 index 0000000000..e2badd73ea --- /dev/null +++ b/dev/tools/gen_keycodes/analysis_options.yaml @@ -0,0 +1 @@ +include: ../../../analysis_options.yaml diff --git a/dev/tools/gen_keycodes/bin/gen_keycodes b/dev/tools/gen_keycodes/bin/gen_keycodes new file mode 100755 index 0000000000..6086eed83d --- /dev/null +++ b/dev/tools/gen_keycodes/bin/gen_keycodes @@ -0,0 +1,39 @@ +#!/usr/bin/env bash + +set -euo pipefail + +# Needed because if it is set, cd may print the path it changed to. +unset CDPATH + +# On Mac OS, readlink -f doesn't work, so follow_links traverses the path one +# link at a time, and then cds into the link destination and find out where it +# ends up. +# +# The returned filesystem path must be a format usable by Dart's URI parser, +# since the Dart command line tool treats its argument as a file URI, not a +# filename. For instance, multiple consecutive slashes should be reduced to a +# single slash, since double-slashes indicate a URI "authority", and these are +# supposed to be filenames. There is an edge case where this will return +# multiple slashes: when the input resolves to the root directory. However, if +# that were the case, we wouldn't be running this shell, so we don't do anything +# about it. +# +# The function is enclosed in a subshell to avoid changing the working directory +# of the caller. +function follow_links() ( + cd -P "$(dirname -- "$1")" + file="$PWD/$(basename -- "$1")" + while [[ -h "$file" ]]; do + cd -P "$(dirname -- "$file")" + file="$(readlink -- "$file")" + cd -P "$(dirname -- "$file")" + file="$PWD/$(basename -- "$file")" + done + echo "$file" +) + +PROG_NAME="$(follow_links "${BASH_SOURCE[0]}")" +BIN_DIR="$(cd "${PROG_NAME%/*}" ; pwd -P)" +DART_BIN="$BIN_DIR/../../../../bin/dart" + +"$DART_BIN" --enable-asserts "$BIN_DIR/gen_keycodes.dart" "$@" diff --git a/dev/tools/gen_keycodes/bin/gen_keycodes.dart b/dev/tools/gen_keycodes/bin/gen_keycodes.dart index 2cdf901afd..ceb634ce8a 100644 --- a/dev/tools/gen_keycodes/bin/gen_keycodes.dart +++ b/dev/tools/gen_keycodes/bin/gen_keycodes.dart @@ -8,27 +8,32 @@ import 'dart:io' hide Platform; import 'package:args/args.dart'; import 'package:gen_keycodes/android_code_gen.dart'; import 'package:gen_keycodes/base_code_gen.dart'; -import 'package:gen_keycodes/fuchsia_code_gen.dart'; -import 'package:gen_keycodes/glfw_code_gen.dart'; import 'package:gen_keycodes/gtk_code_gen.dart'; -import 'package:gen_keycodes/ios_code_gen.dart'; -import 'package:gen_keycodes/key_data.dart'; -import 'package:gen_keycodes/keyboard_keys_code_gen.dart'; -import 'package:gen_keycodes/keyboard_maps_code_gen.dart'; import 'package:gen_keycodes/macos_code_gen.dart'; -import 'package:gen_keycodes/utils.dart'; import 'package:gen_keycodes/web_code_gen.dart'; import 'package:gen_keycodes/windows_code_gen.dart'; +import 'package:gen_keycodes/keyboard_keys_code_gen.dart'; +import 'package:gen_keycodes/keyboard_maps_code_gen.dart'; +import 'package:gen_keycodes/physical_key_data.dart'; +import 'package:gen_keycodes/logical_key_data.dart'; +import 'package:gen_keycodes/utils.dart'; import 'package:http/http.dart' as http; import 'package:path/path.dart' as path; -/// Get contents of the file that contains the key code mapping in Chromium +/// Get contents of the file that contains the physical key mapping in Chromium /// source. -Future getChromiumConversions() async { +Future getChromiumCodes() async { final Uri keyCodesUri = Uri.parse('https://chromium.googlesource.com/codesearch/chromium/src/+/refs/heads/master/ui/events/keycodes/dom/dom_code_data.inc?format=TEXT'); return utf8.decode(base64.decode(await http.read(keyCodesUri))); } +/// Get contents of the file that contains the logical key mapping in Chromium +/// source. +Future getChromiumKeys() async { + final Uri keyCodesUri = Uri.parse('https://chromium.googlesource.com/codesearch/chromium/src/+/refs/heads/master/ui/events/keycodes/dom/dom_key_data.inc?format=TEXT'); + return utf8.decode(base64.decode(await http.read(keyCodesUri))); +} + /// Get contents of the file that contains the key codes in Android source. Future getAndroidKeyCodes() async { final Uri keyCodesUri = Uri.parse('https://android.googlesource.com/platform/frameworks/native/+/master/include/android/keycodes.h?format=TEXT'); @@ -61,81 +66,35 @@ Future getGtkKeyCodes() async { return http.read(keyCodesUri); } +String readDataFile(String fileName) { + return File(path.join(dataRoot, fileName)).readAsStringSync(); +} + Future main(List rawArguments) async { final ArgParser argParser = ArgParser(); argParser.addOption( - 'chromium-hid-codes', - defaultsTo: null, - help: 'The path to where the Chromium HID code mapping file should be ' - 'read. If --chromium-hid-codes is not specified, the input will be read ' - 'from the correct file in the Chromium repository.', + 'engine-root', + defaultsTo: path.join(flutterRoot.path, '..', 'engine', 'src', 'flutter'), + help: 'The path to the root of the flutter/engine repository. This is used ' + 'to place the generated engine mapping files. If --engine-root is not ' + r'specified, it will default to $flutterRoot/../engine/src/flutter, ' + 'assuming the engine gclient folder is placed at the same folder as ' + 'the flutter/flutter repository.', ); argParser.addOption( - 'supplemental-hid-codes', - defaultsTo: path.join(flutterRoot.path, 'dev', 'tools', 'gen_keycodes', 'data', 'supplemental_hid_codes.inc'), - help: "The path to where the supplemental HID codes that don't appear in the " - 'Chromium map should be read.', + 'physical-data', + defaultsTo: path.join(dataRoot, 'physical_key_data.json'), + help: 'The path to where the physical key data file should be written when ' + 'collected, and read from when generating output code. If --physical-data is ' + 'not specified, the output will be written to/read from the current ' + "directory. If the output directory doesn't exist, it, and the path to " + 'it, will be created.', ); argParser.addOption( - 'android-keycodes', - defaultsTo: null, - help: 'The path to where the Android keycodes header file should be read. ' - 'If --android-keycodes is not specified, the input will be read from the ' - 'correct file in the Android repository.', - ); - argParser.addOption( - 'android-scancodes', - defaultsTo: null, - help: 'The path to where the Android scancodes header file should be read. ' - 'If --android-scancodes is not specified, the input will be read from the ' - 'correct file in the Android repository.', - ); - argParser.addOption( - 'android-domkey', - defaultsTo: path.join(flutterRoot.path, 'dev', 'tools', 'gen_keycodes', 'data', 'key_name_to_android_name.json'), - help: 'The path to where the Android keycode to DomKey mapping is.', - ); - argParser.addOption( - 'glfw-keycodes', - defaultsTo: null, - help: 'The path to where the GLFW keycodes header file should be read. ' - 'If --glfw-keycodes is not specified, the input will be read from the ' - 'correct file in the GLFW github repository.', - ); - argParser.addOption( - 'gtk-keycodes', - defaultsTo: null, - help: 'The path to where the GTK keycodes header file should be read. ' - 'If --gtk-keycodes is not specified, the input will be read from the ' - 'correct file in the GTK repository.', - ); - argParser.addOption( - 'windows-keycodes', - defaultsTo: null, - help: 'The path to where the Windows keycodes header file should be read. ' - 'If --windows-keycodes is not specified, the input will be read from the ' - 'correct file in the Windows github repository.', - ); - argParser.addOption( - 'windows-domkey', - defaultsTo: path.join(flutterRoot.path, 'dev', 'tools', 'gen_keycodes', 'data', 'key_name_to_windows_name.json'), - help: 'The path to where the Windows keycode to DomKey mapping is.', - ); - argParser.addOption( - 'glfw-domkey', - defaultsTo: path.join(flutterRoot.path, 'dev', 'tools', 'gen_keycodes', 'data', 'key_name_to_glfw_name.json'), - help: 'The path to where the GLFW keycode to DomKey mapping is.', - ); - argParser.addOption( - 'gtk-domkey', - defaultsTo: path.join(flutterRoot.path, 'dev', 'tools', 'gen_keycodes', 'data', 'key_name_to_gtk_name.json'), - help: 'The path to where the GTK keycode to DomKey mapping is.', - ); - argParser.addOption( - 'data', - defaultsTo: path.join(flutterRoot.path, 'dev', 'tools', 'gen_keycodes', 'data', 'key_data.json'), - help: 'The path to where the key code data file should be written when ' - 'collected, and read from when generating output code. If --data is ' + 'logical-data', + defaultsTo: path.join(dataRoot, 'logical_key_data.json'), + help: 'The path to where the logical key data file should be written when ' + 'collected, and read from when generating output code. If --logical-data is ' 'not specified, the output will be written to/read from the current ' "directory. If the output directory doesn't exist, it, and the path to " 'it, will be created.', @@ -143,7 +102,7 @@ Future main(List rawArguments) async { argParser.addOption( 'code', defaultsTo: path.join(flutterRoot.path, 'packages', 'flutter', 'lib', 'src', 'services', 'keyboard_key.dart'), - help: 'The path to where the output "keyboard_keys.dart" file should be ' + help: 'The path to where the output "keyboard_key.dart" file should be ' 'written. If --code is not specified, the output will be written to the ' 'correct directory in the flutter tree. If the output directory does not ' 'exist, it, and the path to it, will be created.', @@ -162,7 +121,8 @@ Future main(List rawArguments) async { negatable: false, help: 'If this flag is set, then collect and parse header files from ' 'Chromium and Android instead of reading pre-parsed data from ' - '"key_data.json", and then update "key_data.json" with the fresh data.', + '"physical_key_data.json" and "logical_key_data.json", and then ' + 'update these files with the fresh data.', ); argParser.addFlag( 'help', @@ -178,64 +138,57 @@ Future main(List rawArguments) async { exit(0); } - KeyData data; + PlatformCodeGenerator.engineRoot = parsedArguments['engine-root'] as String; + + PhysicalKeyData physicalData; + LogicalKeyData logicalData; if (parsedArguments['collect'] as bool) { - String hidCodes; - if (parsedArguments['chromium-hid-codes'] == null) { - hidCodes = await getChromiumConversions(); - } else { - hidCodes = File(parsedArguments['chromium-hid-codes'] as String).readAsStringSync(); - } + // Physical + final String baseHidCodes = await getChromiumCodes(); + final String supplementalHidCodes = readDataFile('supplemental_hid_codes.inc'); + final String androidScanCodes = await getAndroidScanCodes(); + final String androidToDomKey = readDataFile('android_key_name_to_name.json'); + final String glfwKeyCodes = await getGlfwKeyCodes(); + final String glfwToDomKey = readDataFile('glfw_key_name_to_name.json'); + physicalData = PhysicalKeyData( + [baseHidCodes, supplementalHidCodes].join('\n'), + androidScanCodes, + androidToDomKey, + glfwKeyCodes, + glfwToDomKey, + ); - final String supplementalHidCodes = File(parsedArguments['supplemental-hid-codes'] as String).readAsStringSync(); - hidCodes = '$hidCodes\n$supplementalHidCodes'; + // Logical + final String gtkKeyCodes = await getGtkKeyCodes(); + final String webLogicalKeys = await getChromiumKeys(); + final String supplementalKeyData = readDataFile('supplemental_key_data.inc'); + final String gtkToDomKey = readDataFile('gtk_logical_name_mapping.json'); + final String windowsKeyCodes = await getWindowsKeyCodes(); + final String windowsToDomKey = readDataFile('windows_logical_to_window_vk.json'); + final String macosLogicalToPhysical = readDataFile('macos_logical_to_physical.json'); + final String iosLogicalToPhysical = readDataFile('ios_logical_to_physical.json'); + final String androidKeyCodes = await getAndroidKeyCodes(); - String androidKeyCodes; - if (parsedArguments['android-keycodes'] == null) { - androidKeyCodes = await getAndroidKeyCodes(); - } else { - androidKeyCodes = File(parsedArguments['android-keycodes'] as String).readAsStringSync(); - } - - String androidScanCodes; - if (parsedArguments['android-scancodes'] == null) { - androidScanCodes = await getAndroidScanCodes(); - } else { - androidScanCodes = File(parsedArguments['android-scancodes'] as String).readAsStringSync(); - } - - String glfwKeyCodes; - if (parsedArguments['glfw-keycodes'] == null) { - glfwKeyCodes = await getGlfwKeyCodes(); - } else { - glfwKeyCodes = File(parsedArguments['glfw-keycodes'] as String).readAsStringSync(); - } - - String gtkKeyCodes; - if (parsedArguments['gtk-keycodes'] == null) { - gtkKeyCodes = await getGtkKeyCodes(); - } else { - gtkKeyCodes = File(parsedArguments['gtk-keycodes'] as String).readAsStringSync(); - } - - String windowsKeyCodes; - if (parsedArguments['windows-keycodes'] == null) { - windowsKeyCodes = await getWindowsKeyCodes(); - } else { - windowsKeyCodes = File(parsedArguments['windows-keycodes'] as String).readAsStringSync(); - } - - final String windowsToDomKey = File(parsedArguments['windows-domkey'] as String).readAsStringSync(); - final String glfwToDomKey = File(parsedArguments['glfw-domkey'] as String).readAsStringSync(); - final String gtkToDomKey = File(parsedArguments['gtk-domkey'] as String).readAsStringSync(); - final String androidToDomKey = File(parsedArguments['android-domkey'] as String).readAsStringSync(); - - data = KeyData(hidCodes, androidScanCodes, androidKeyCodes, androidToDomKey, glfwKeyCodes, glfwToDomKey, gtkKeyCodes, gtkToDomKey, windowsKeyCodes, windowsToDomKey); + logicalData = LogicalKeyData( + [webLogicalKeys, supplementalKeyData].join('\n'), + gtkKeyCodes, + gtkToDomKey, + windowsKeyCodes, + windowsToDomKey, + androidKeyCodes, + androidToDomKey, + macosLogicalToPhysical, + iosLogicalToPhysical, + physicalData, + ); + // Write data files const JsonEncoder encoder = JsonEncoder.withIndent(' '); - File(parsedArguments['data'] as String).writeAsStringSync(encoder.convert(data.toJson())); + File(parsedArguments['physical-data'] as String).writeAsStringSync(encoder.convert(physicalData.toJson()) + '\n'); + File(parsedArguments['logical-data'] as String).writeAsStringSync(encoder.convert(logicalData.toJson()) + '\n'); } else { - data = KeyData.fromJson(json.decode(await File(parsedArguments['data'] as String).readAsString()) as Map); + physicalData = PhysicalKeyData.fromJson(json.decode(await File(parsedArguments['physical-data'] as String).readAsString()) as Map); + logicalData = LogicalKeyData.fromJson(json.decode(await File(parsedArguments['logical-data'] as String).readAsString()) as Map); } final File codeFile = File(parsedArguments['code'] as String); @@ -243,51 +196,49 @@ Future main(List rawArguments) async { codeFile.createSync(recursive: true); } print('Writing ${'key codes'.padRight(15)}${codeFile.absolute}'); - await codeFile.writeAsString(KeyboardKeysCodeGenerator(data).generate()); + await codeFile.writeAsString(KeyboardKeysCodeGenerator(physicalData, logicalData).generate()); final File mapsFile = File(parsedArguments['maps'] as String); if (!mapsFile.existsSync()) { mapsFile.createSync(recursive: true); } print('Writing ${'key maps'.padRight(15)}${mapsFile.absolute}'); - await mapsFile.writeAsString(KeyboardMapsCodeGenerator(data).generate()); - - for (final String platform in ['android', 'macos', 'ios', 'glfw', 'fuchsia', 'linux', 'windows', 'web']) { - PlatformCodeGenerator codeGenerator; - switch (platform) { - case 'glfw': - codeGenerator = GlfwCodeGenerator(data); - break; - case 'fuchsia': - codeGenerator = FuchsiaCodeGenerator(data); - break; - case 'android': - codeGenerator = AndroidCodeGenerator(data); - break; - case 'macos': - codeGenerator = MacOsCodeGenerator(data); - break; - case 'ios': - codeGenerator = IosCodeGenerator(data); - break; - case 'windows': - codeGenerator = WindowsCodeGenerator(data); - break; - case 'linux': - codeGenerator = GtkCodeGenerator(data); - break; - case 'web': - codeGenerator = WebCodeGenerator(data); - break; - default: - assert(false); - } + await mapsFile.writeAsString(KeyboardMapsCodeGenerator(physicalData, logicalData).generate()); + final Map platforms = { + 'android': AndroidCodeGenerator( + physicalData, + logicalData, + ), + 'macos': MacOsCodeGenerator( + physicalData, + logicalData, + ), + 'windows': WindowsCodeGenerator( + physicalData, + logicalData, + readDataFile('windows_scancode_logical_map.json') + ), + 'linux': GtkCodeGenerator( + physicalData, + logicalData, + readDataFile('gtk_modifier_bit_mapping.json'), + readDataFile('gtk_lock_bit_mapping.json'), + ), + 'web': WebCodeGenerator( + physicalData, + logicalData, + readDataFile('web_logical_location_mapping.json'), + ), + }; + await Future.wait(platforms.entries.map((MapEntry entry) { + final String platform = entry.key; + final PlatformCodeGenerator codeGenerator = entry.value; final File platformFile = File(codeGenerator.outputPath(platform)); if (!platformFile.existsSync()) { platformFile.createSync(recursive: true); } print('Writing ${'$platform map'.padRight(15)}${platformFile.absolute}'); - await platformFile.writeAsString(codeGenerator.generate()); - } + return platformFile.writeAsString(codeGenerator.generate()); + })); } diff --git a/dev/tools/gen_keycodes/data/README.md b/dev/tools/gen_keycodes/data/README.md new file mode 100644 index 0000000000..9283a177e7 --- /dev/null +++ b/dev/tools/gen_keycodes/data/README.md @@ -0,0 +1,82 @@ +## Files + +### General + +| File name | Explanation | +| ---- | ---- | +| [`physical_key_data.json`](physical_key_data.json) | Contains the merged physical key data from all the other sources. This file is regenerated if "--collect" is specified for the gen_keycodes script, or used as a source otherwise. | +| [`logical_key_data.json`](logical_key_data.json) | Contains the merged logical key data from all the other sources. This file is regenerated if "--collect" is specified for the gen_keycodes script, or used as a source otherwise. | +| [`supplemental_hid_codes.inc`](supplemental_hid_codes.inc) | A supplementary HID list on top of Chromium's list of HID codes for extra physical keys. Certain entries may also overwrite Chromium's corresponding entries. | +| [`supplemental_key_data.inc`](supplemental_key_data.inc) | A supplementary key list on top of Chromium's list of keys for extra logical keys.| +| [`chromium_modifiers.json`](chromium_modifiers.json) | Maps the web's `key` for modifier keys to the names of the logical keys for these keys' left and right variations.This is used when generating logical keys to provide independent values for sided logical keys. Web uses the same `key` for modifier keys of different sides, but Flutter's logical key model treats them as different keys.| +| [`printable_to_numpads.json`](printable_to_numpads.json) | Maps a character to the names of the logical keys for these keys' number pad variations. This is used when generating logical keys to provide independent values for number pad logical keys. The web uses the character as the `key` for number pad keys, but Flutter's logical key model treats them as independent keys.| +| [`printable.json`](printable.json) | Maps Flutter key name to its printable character. This character is used as the key label.| +| [`synonyms.json`](synonyms.json) | Maps pseudo-keys that represent other keys to the sets of keys they represent. For example, this contains the "shift" key that represents either a "shiftLeft" or "shiftRight" key.| + +### Framework + +| File name | Explanation | +| ---- | ---- | +| [`keyboard_key.tmpl`](keyboard_key.tmpl) | The template for `keyboard_key.dart`. | +| [`keyboard_maps.tmpl`](keyboard_maps.tmpl) | The template for `keyboard_maps.dart`. | + + +### Android + +| File name | Explanation | +| ---- | ---- | +| [`android_keyboard_map_java.tmpl`](android_keyboard_map_java.tmpl) | The template for `KeyboardMap.java`. | +| [`android_key_name_to_name.json`](android_key_name_to_name.json) | Maps a logical key name to the names of its corresponding keycode constants. This is used to convert logical keys.| + + +### iOS + +| File name | Explanation | +| ---- | ---- | +| [`ios_logical_to_physical.json`](ios_logical_to_physical.json) | Maps a logical key name to the names of its corresponding physical keys. This is used to derive logical keys (from `keyCode`) that can't or shouldn't be derived from `characterIgnoringModifiers`. | +| [`ios_keyboard_map_cc.tmpl`](ios_keyboard_map_cc.tmpl) | The template for `keyboard_map.cc`. (Unused for now.) | + +### Web + +| File name | Explanation | +| ---- | ---- | +| [`web_key_map_dart.tmpl`](web_key_map_dart.tmpl) | The template for `key_map.dart`. | +| [`web_logical_location_mapping.json`](web_logical_location_mapping.json) | Maps a pair of the web's `key` and `location` to the name for its corresponding logical key. This is used to distinguish between logical keys with the same `key` but different `locations`. | + +### Windows + +| File name | Explanation | +| ---- | ---- | +| [`windows_flutter_key_map_cc.tmpl`](windows_flutter_key_map_cc.tmpl) | The template for `flutter_key_map.cc`. | +| [`windows_logical_to_window_vk.json`](windows_logical_to_window_vk.json) | Maps a logical key name to the names of its corresponding virtual keys in Win32. | +| [`windows_scancode_logical_map.json`](windows_scancode_logical_map.json) | Maps a physical key name to a logical key name. This is used to when a `keycode` maps to multiple keys (including when the `keycode` is 0), therefore can only be told apart by the scan code. | + +### Linux (GTK) + +| File name | Explanation | +| ---- | ---- | +| [`gtk_key_mapping_cc.tmpl`](gtk_key_mapping_cc.tmpl) | The template for `key_mapping.cc`. | +| [`gtk_lock_bit_mapping.json`](gtk_lock_bit_mapping.json) | Maps a name for GTK's modifier bit macro to Flutter's logical name (element #0) and physical name (element #1). This is used to generate checked keys that GTK should keep lock state synchronous on.| +| [`gtk_logical_name_mapping.json`](gtk_logical_name_mapping.json) | Maps a logical key name to the macro names of its corresponding `keyval`s. This is used to convert logical keys.| +| [`gtk_modifier_bit_mapping.json`](gtk_modifier_bit_mapping.json) | Maps a name for GTK's modifier bit macro to Flutter's logical name (element #0), physical name (element #1), and the physical name for the paired key (element #2). This is used to generate checked keys that GTK should keep pressing state synchronous on.| +| [`gtk_numpad_shift.json`](gtk_numpad_shift.json) | Maps the name of a `keyval` macro of a numpad key to that of the corresponding key with NumLock on. GTK uses different `keyval` for numpad keys with and without NumLock on, but Flutter's logical key model treats them as the same key.| + +### Linux (GLFW) + +| File name | Explanation | +| ---- | ---- | +| [`glfw_key_name_to_name.json`](glfw_key_name_to_name.json) | Maps a logical key name to the names of its GLFW macro. (Unused for now.) | +| [`glfw_keyboard_map_cc.tmpl`](glfw_keyboard_map_cc.tmpl) | The template for `keyboard_map.cc`. (Unused for now.) | + +### macOS + +| File name | Explanation | +| ---- | ---- | +| [`macos_key_code_map_cc.tmpl`](macos_key_code_map_cc.tmpl) | The template for `KeyCodeMap.cc`. | +| [`macos_logical_to_physical.json`](macos_logical_to_physical.json) | Maps a logical key name to the names of its corresponding physical keys. This is used to derive logical keys (from `keyCode`) that can't or shouldn't be derived from `characterIgnoringModifiers`. | + +### Fuchsia + +| File name | Explanation | +| ---- | ---- | +| [`fuchsia_keyboard_map_cc.tmpl`](fuchsia_keyboard_map_cc.tmpl) | The template for `keyboard_map.cc`. (Unused for now.) | diff --git a/dev/tools/gen_keycodes/data/android_key_name_to_name.json b/dev/tools/gen_keycodes/data/android_key_name_to_name.json new file mode 100644 index 0000000000..a87235295a --- /dev/null +++ b/dev/tools/gen_keycodes/data/android_key_name_to_name.json @@ -0,0 +1,286 @@ +{ + "Again": ["AGAIN"], + "AltLeft": ["ALT_LEFT"], + "AltRight": ["ALT_RIGHT"], + "AppSwitch": ["APP_SWITCH"], + "ArrowDown": ["DPAD_DOWN"], + "ArrowLeft": ["DPAD_LEFT"], + "ArrowRight": ["DPAD_RIGHT"], + "ArrowUp": ["DPAD_UP"], + "AudioVolumeDown": ["VOLUME_DOWN"], + "AudioVolumeMute": ["VOLUME_MUTE"], + "AudioVolumeUp": ["VOLUME_UP"], + "AVRInput": ["AVR_INPUT"], + "AVRPower": ["AVR_POWER"], + "BassBoost": ["BASSBOOST"], + "Print": ["PRINT"], + "Backquote": ["GRAVE"], + "Backslash": ["BACKSLASH"], + "Backspace": ["DEL"], + "BracketLeft": ["LEFT_BRACKET"], + "BracketRight": ["RIGHT_BRACKET"], + "BrightnessDown": ["BRIGHTNESS_DOWN"], + "BrightnessUp": ["BRIGHTNESS_UP"], + "BrowserFavorites": ["BOOKMARK"], + "BrowserForward": ["FORWARD"], + "BrowserSearch": ["SEARCH"], + "Call": ["CALL"], + "Camera": ["CAMERA"], + "CameraFocus": ["FOCUS"], + "CapsLock": ["CAPS_LOCK"], + "ChannelDown": ["CHANNEL_DOWN"], + "ChannelUp": ["CHANNEL_UP"], + "Clear": ["CLEAR"], + "Close": ["MEDIA_CLOSE", "CLOSE"], + "ClosedCaptionToggle": ["CAPTIONS"], + "ColorF0Red": ["PROG_RED"], + "ColorF1Green": ["PROG_GREEN"], + "ColorF2Yellow": ["PROG_YELLOW"], + "ColorF3Blue": ["PROG_BLUE"], + "Comma": ["COMMA"], + "ContextMenu": ["MENU"], + "ControlLeft": ["CTRL_LEFT"], + "ControlRight": ["CTRL_RIGHT"], + "Convert": ["HENKAN"], + "Copy": ["COPY"], + "Cut": ["CUT"], + "Delete": ["FORWARD_DEL"], + "Digit0": ["0"], + "Digit1": ["1"], + "Digit2": ["2"], + "Digit3": ["3"], + "Digit4": ["4"], + "Digit5": ["5"], + "Digit6": ["6"], + "Digit7": ["7"], + "Digit8": ["8"], + "Digit9": ["9"], + "DVR": ["DVR"], + "Eisu": ["EISU"], + "Eject": ["MEDIA_EJECT"], + "End": ["MOVE_END"], + "EndCall": ["ENDCALL"], + "Enter": ["ENTER"], + "Equal": ["EQUALS"], + "Escape": ["ESCAPE"], + "Exit": ["EXIT"], + "F1": ["F1"], + "F2": ["F2"], + "F3": ["F3"], + "F4": ["F4"], + "F5": ["F5"], + "F6": ["F6"], + "F7": ["F7"], + "F8": ["F8"], + "F9": ["F9"], + "F10": ["F10"], + "F11": ["F11"], + "F12": ["F12"], + "F13": ["F13"], + "F14": ["F14"], + "F15": ["F15"], + "F16": ["F16"], + "F17": ["F17"], + "F18": ["F18"], + "F19": ["F19"], + "F20": ["F20"], + "F21": ["F21"], + "F22": ["F22"], + "F23": ["F23"], + "F24": ["F24"], + "Find": ["FIND"], + "Fn": ["FUNCTION"], + "GameButton1": ["BUTTON_1"], + "GameButton2": ["BUTTON_2"], + "GameButton3": ["BUTTON_3"], + "GameButton4": ["BUTTON_4"], + "GameButton5": ["BUTTON_5"], + "GameButton6": ["BUTTON_6"], + "GameButton7": ["BUTTON_7"], + "GameButton8": ["BUTTON_8"], + "GameButton9": ["BUTTON_9"], + "GameButton10": ["BUTTON_10"], + "GameButton11": ["BUTTON_11"], + "GameButton12": ["BUTTON_12"], + "GameButton13": ["BUTTON_13"], + "GameButton14": ["BUTTON_14"], + "GameButton15": ["BUTTON_15"], + "GameButton16": ["BUTTON_16"], + "GameButtonA": ["BUTTON_A"], + "GameButtonB": ["BUTTON_B"], + "GameButtonC": ["BUTTON_C"], + "GameButtonLeft1": ["BUTTON_L1"], + "GameButtonLeft2": ["BUTTON_L2"], + "GameButtonMode": ["BUTTON_MODE"], + "GameButtonRight1": ["BUTTON_R1"], + "GameButtonRight2": ["BUTTON_R2"], + "GameButtonSelect": ["BUTTON_SELECT"], + "GameButtonStart": ["BUTTON_START"], + "GameButtonThumbLeft": ["BUTTON_THUMBL"], + "GameButtonThumbRight": ["BUTTON_THUMBR"], + "GameButtonX": ["BUTTON_X"], + "GameButtonY": ["BUTTON_Y"], + "GameButtonZ": ["BUTTON_Z"], + "GoBack": ["BACK"], + "GoHome": ["HOME"], + "GroupNext": ["LANGUAGE_SWITCH"], + "Guide": ["GUIDE"], + "HeadsetHook": ["HEADSETHOOK"], + "Help": ["HELP"], + "HiraganaKatakana": ["KATAKANA_HIRAGANA"], + "Home": ["MOVE_HOME"], + "Info": ["INFO"], + "Insert": ["INSERT"], + "KanjiMode": ["KANA"], + "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"], + "IntlRo": ["RO"], + "IntlYen": ["YEN"], + "Lang1": [], + "Lang2": [], + "Lang3": ["KATAKANA"], + "Lang4": ["HIRAGANA"], + "LaunchAssistant": ["ASSIST"], + "LaunchCalendar": ["CALENDAR"], + "LaunchContacts": ["CONTACTS"], + "LaunchMail": ["ENVELOPE"], + "LaunchMusicPlayer": ["MUSIC"], + "LaunchWebBrowser": ["EXPLORER"], + "MannerMode": ["MANNER_MODE"], + "MediaAudioTrack": ["MEDIA_AUDIO_TRACK"], + "MediaFastForward": ["MEDIA_FAST_FORWARD"], + "MediaLast": ["LAST_CHANNEL"], + "MediaPause": ["MEDIA_PAUSE"], + "MediaPlay": ["MEDIA_PLAY"], + "MediaPlayPause": ["MEDIA_PLAY_PAUSE"], + "MediaRecord": ["MEDIA_RECORD"], + "MediaRewind": ["MEDIA_REWIND"], + "MediaSkipBackward": ["MEDIA_SKIP_BACKWARD"], + "MediaSkipForward": ["MEDIA_SKIP_FORWARD"], + "MediaStepBackward": ["MEDIA_STEP_BACKWARD"], + "MediaStepForward": ["MEDIA_STEP_FORWARD"], + "MediaStop": ["MEDIA_STOP"], + "MediaTopMenu": ["MEDIA_TOP_MENU"], + "MediaTrackNext": ["MEDIA_NEXT"], + "MediaTrackPrevious": ["MEDIA_PREVIOUS"], + "MetaLeft": ["META_LEFT"], + "MetaRight": ["META_RIGHT"], + "MicrophoneVolumeMute": ["MUTE"], + "Minus": ["MINUS"], + "ModeChange": ["SWITCH_CHARSET"], + "NavigateIn": ["NAVIGATE_IN"], + "NavigateNext": ["NAVIGATE_NEXT"], + "NavigateOut": ["NAVIGATE_OUT"], + "NavigatePrevious": ["NAVIGATE_PREVIOUS"], + "NewKey": ["NEW"], + "NonConvert": ["MUHENKAN"], + "None": ["UNKNOWN"], + "Notification": ["NOTIFICATION"], + "NumLock": ["NUM_LOCK"], + "Numpad0": ["NUMPAD_0"], + "Numpad1": ["NUMPAD_1"], + "Numpad2": ["NUMPAD_2"], + "Numpad3": ["NUMPAD_3"], + "Numpad4": ["NUMPAD_4"], + "Numpad5": ["NUMPAD_5"], + "Numpad6": ["NUMPAD_6"], + "Numpad7": ["NUMPAD_7"], + "Numpad8": ["NUMPAD_8"], + "Numpad9": ["NUMPAD_9"], + "NumpadAdd": ["NUMPAD_ADD"], + "NumpadComma": ["NUMPAD_COMMA"], + "NumpadDecimal": ["NUMPAD_DOT"], + "NumpadDivide": ["NUMPAD_DIVIDE"], + "NumpadEnter": ["NUMPAD_ENTER"], + "NumpadEqual": ["NUMPAD_EQUALS"], + "NumpadMultiply": ["NUMPAD_MULTIPLY"], + "NumpadParenLeft": ["NUMPAD_LEFT_PAREN"], + "NumpadParenRight": ["NUMPAD_RIGHT_PAREN"], + "NumpadSubtract": ["NUMPAD_SUBTRACT"], + "Open": ["OPEN"], + "PageDown": ["PAGE_DOWN"], + "PageUp": ["PAGE_UP"], + "Pairing": ["PAIRING"], + "Paste": ["PASTE"], + "Pause": ["BREAK"], + "Period": ["PERIOD"], + "Power": ["POWER"], + "PrintScreen": ["SYSRQ"], + "Props": ["PROPS"], + "Quote": ["APOSTROPHE"], + "Redo": ["REDO"], + "ScrollLock": ["SCROLL_LOCK"], + "Select": ["DPAD_CENTER"], + "Semicolon": ["SEMICOLON"], + "Settings": ["SETTINGS"], + "ShiftLeft": ["SHIFT_LEFT"], + "ShiftRight": ["SHIFT_RIGHT"], + "Slash": ["SLASH"], + "Sleep": ["SLEEP"], + "Space": ["SPACE"], + "STBInput": ["STB_INPUT"], + "STBPower": ["STB_POWER"], + "Suspend": ["SUSPEND"], + "Symbol": ["SYM"], + "Tab": ["TAB"], + "Teletext": ["TV_TELETEXT"], + "TV": ["TV"], + "TV3DMode": ["3D_MODE"], + "TVAntennaCable": ["TV_ANTENNA_CABLE"], + "TVAudioDescription": ["TV_AUDIO_DESCRIPTION"], + "TVAudioDescriptionMixDown": ["TV_AUDIO_DESCRIPTION_MIX_DOWN"], + "TVAudioDescriptionMixUp": ["TV_AUDIO_DESCRIPTION_MIX_UP"], + "TVContentsMenu": ["TV_CONTENTS_MENU"], + "TVDataService": ["TV_DATA_SERVICE"], + "TVInput": ["TV_INPUT"], + "TVInputComponent1": ["TV_INPUT_COMPONENT_1"], + "TVInputComponent2": ["TV_INPUT_COMPONENT_2"], + "TVInputComposite1": ["TV_INPUT_COMPOSITE_1"], + "TVInputComposite2": ["TV_INPUT_COMPOSITE_2"], + "TVInputHDMI1": ["TV_INPUT_HDMI_1"], + "TVInputHDMI2": ["TV_INPUT_HDMI_2"], + "TVInputHDMI3": ["TV_INPUT_HDMI_3"], + "TVInputHDMI4": ["TV_INPUT_HDMI_4"], + "TVInputVGA1": ["TV_INPUT_VGA_1"], + "TVNetwork": ["TV_NETWORK"], + "TVNumberEntry": ["TV_NUMBER_ENTRY"], + "TVPower": ["TV_POWER"], + "TVRadioService": ["TV_RADIO_SERVICE"], + "TVSatellite": ["TV_SATELLITE"], + "TVSatelliteBS": ["TV_SATELLITE_BS"], + "TVSatelliteCS": ["TV_SATELLITE_CS"], + "TVSatelliteToggle": ["TV_SATELLITE_SERVICE"], + "TVTerrestrialAnalog": ["TV_TERRESTRIAL_ANALOG"], + "TVTerrestrialDigital": ["TV_TERRESTRIAL_DIGITAL"], + "TVTimer": ["TV_TIMER_PROGRAMMING"], + "Undo": ["UNDO"], + "WakeUp": ["WAKEUP"], + "ZenkakuHankaku": ["ZENKAKU_HANKAKU"], + "ZoomIn": ["ZOOM_IN"], + "ZoomOut": ["ZOOM_OUT"], + "ZoomToggle": ["TV_ZOOM_MODE"] +} diff --git a/dev/tools/gen_keycodes/data/android_keyboard_map_java.tmpl b/dev/tools/gen_keycodes/data/android_keyboard_map_java.tmpl new file mode 100644 index 0000000000..6c1a2d14ae --- /dev/null +++ b/dev/tools/gen_keycodes/data/android_keyboard_map_java.tmpl @@ -0,0 +1,34 @@ +package io.flutter.embedding.android; + +// 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. + +// DO NOT EDIT -- DO NOT EDIT -- DO NOT EDIT +// This file is generated by flutter/flutter@dev/tools/gen_keycodes/bin/gen_keycodes.dart and +// should not be edited directly. +// +// Edit the template dev/tools/gen_keycodes/data/android_keyboard_map_java.tmpl instead. +// See dev/tools/gen_keycodes/README.md for more information. + +import java.util.HashMap; + +public class KeyboardMap { + public static final HashMap scanCodeToPhysical = + new HashMap() { + private static final long serialVersionUID = 1L; + + { +@@@ANDROID_SCAN_CODE_MAP@@@ + } + }; + + public static final HashMap keyCodeToLogical = + new HashMap() { + private static final long serialVersionUID = 1L; + + { +@@@ANDROID_KEY_CODE_MAP@@@ + } + }; +} diff --git a/dev/tools/gen_keycodes/data/chromium_modifiers.json b/dev/tools/gen_keycodes/data/chromium_modifiers.json new file mode 100644 index 0000000000..173bbbf734 --- /dev/null +++ b/dev/tools/gen_keycodes/data/chromium_modifiers.json @@ -0,0 +1,6 @@ +{ + "Shift": ["ShiftLeft", "ShiftRight"], + "Meta": ["MetaLeft", "MetaRight"], + "Alt": ["AltLeft", "AltRight"], + "Control": ["ControlLeft", "ControlRight"] +} diff --git a/dev/tools/gen_keycodes/data/keyboard_map_fuchsia_cc.tmpl b/dev/tools/gen_keycodes/data/fuchsia_keyboard_map_cc.tmpl similarity index 89% rename from dev/tools/gen_keycodes/data/keyboard_map_fuchsia_cc.tmpl rename to dev/tools/gen_keycodes/data/fuchsia_keyboard_map_cc.tmpl index 012b359230..47aa41ea2a 100644 --- a/dev/tools/gen_keycodes/data/keyboard_map_fuchsia_cc.tmpl +++ b/dev/tools/gen_keycodes/data/fuchsia_keyboard_map_cc.tmpl @@ -8,7 +8,7 @@ // This file is generated by flutter/flutter@dev/tools/gen_keycodes/bin/gen_keycodes.dart and // should not be edited directly. // -// Edit the template dev/tools/gen_keycodes/data/keyboard_map_fuchsia_cc.tmpl instead. +// Edit the template dev/tools/gen_keycodes/data/fuchsia_keyboard_map_cc.tmpl instead. // See dev/tools/gen_keycodes/README.md for more information. /// Maps Fuchsia-specific IDs to the matching LogicalKeyboardKey. diff --git a/dev/tools/gen_keycodes/data/glfw_key_name_to_name.json b/dev/tools/gen_keycodes/data/glfw_key_name_to_name.json new file mode 100644 index 0000000000..7524a15cf9 --- /dev/null +++ b/dev/tools/gen_keycodes/data/glfw_key_name_to_name.json @@ -0,0 +1,118 @@ +{ + "AltLeft": ["LEFT_ALT"], + "AltRight": ["RIGHT_ALT"], + "ArrowDown": ["DOWN"], + "ArrowLeft": ["LEFT"], + "ArrowRight": ["RIGHT"], + "ArrowUp": ["UP"], + "Backquote": ["GRAVE_ACCENT"], + "Backslash": ["BACKSLASH"], + "Backspace": ["BACKSPACE"], + "BracketLeft": ["LEFT_BRACKET"], + "BracketRight": ["RIGHT_BRACKET"], + "CapsLock": ["CAPS_LOCK"], + "Comma": ["COMMA"], + "ContextMenu": ["MENU"], + "ControlLeft": ["LEFT_CONTROL"], + "ControlRight": ["RIGHT_CONTROL"], + "Delete": ["DELETE"], + "Digit0": ["0"], + "Digit1": ["1"], + "Digit2": ["2"], + "Digit3": ["3"], + "Digit4": ["4"], + "Digit5": ["5"], + "Digit6": ["6"], + "Digit7": ["7"], + "Digit8": ["8"], + "Digit9": ["9"], + "End": ["END"], + "Enter": ["ENTER"], + "Equal": ["EQUAL"], + "Escape": ["ESCAPE"], + "F1": ["F1"], + "F2": ["F2"], + "F3": ["F3"], + "F4": ["F4"], + "F5": ["F5"], + "F6": ["F6"], + "F7": ["F7"], + "F8": ["F8"], + "F9": ["F9"], + "F10": ["F10"], + "F11": ["F11"], + "F12": ["F12"], + "F13": ["F13"], + "F14": ["F14"], + "F15": ["F15"], + "F16": ["F16"], + "F17": ["F17"], + "F18": ["F18"], + "F19": ["F19"], + "F20": ["F20"], + "F21": ["F21"], + "F22": ["F22"], + "F23": ["F23"], + "F25": ["F25"], + "Home": ["HOME"], + "Insert": ["INSERT"], + "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"], + "MetaLeft": ["LEFT_SUPER"], + "MetaRight": ["RIGHT_SUPER"], + "Minus": ["MINUS"], + "NumLock": ["NUM_LOCK"], + "Numpad0": ["KP_0"], + "Numpad1": ["KP_1"], + "Numpad2": ["KP_2"], + "Numpad3": ["KP_3"], + "Numpad4": ["KP_4"], + "Numpad5": ["KP_5"], + "Numpad6": ["KP_6"], + "Numpad7": ["KP_7"], + "Numpad8": ["KP_8"], + "Numpad9": ["KP_9"], + "NumpadAdd": ["KP_ADD"], + "NumpadDecimal": ["KP_DECIMAL"], + "NumpadDivide": ["KP_DIVIDE"], + "NumpadEnter": ["KP_ENTER"], + "NumpadEqual": ["KP_EQUAL"], + "NumpadMultiply": ["KP_MULTIPLY"], + "NumpadSubtract": ["NUMPAD_SUBTRACT"], + "PageDown": ["PAGE_DOWN"], + "PageUp": ["PAGE_UP"], + "Pause": ["PAUSE"], + "Period": ["PERIOD"], + "PrintScreen": ["PRINT_SCREEN"], + "Quote": ["APOSTROPHE"], + "Semicolon": ["SEMICOLON"], + "ShiftLeft": ["LEFT_SHIFT"], + "ShiftRight": ["RIGHT_SHIFT"], + "Slash": ["SLASH"], + "Space": ["SPACE"], + "Tab": ["TAB"] +} diff --git a/dev/tools/gen_keycodes/data/keyboard_map_glfw_cc.tmpl b/dev/tools/gen_keycodes/data/glfw_keyboard_map_cc.tmpl similarity index 90% rename from dev/tools/gen_keycodes/data/keyboard_map_glfw_cc.tmpl rename to dev/tools/gen_keycodes/data/glfw_keyboard_map_cc.tmpl index 6b064fc7bf..21bbf2fa5f 100644 --- a/dev/tools/gen_keycodes/data/keyboard_map_glfw_cc.tmpl +++ b/dev/tools/gen_keycodes/data/glfw_keyboard_map_cc.tmpl @@ -8,7 +8,7 @@ // This file is generated by flutter/flutter@dev/tools/gen_keycodes/bin/gen_keycodes.dart and // should not be edited directly. // -// Edit the template dev/tools/gen_keycodes/data/keyboard_map_glfw_cc.tmpl instead. +// Edit the template dev/tools/gen_keycodes/data/glfw_keyboard_map_cc.tmpl instead. // See dev/tools/gen_keycodes/README.md for more information. /// Maps GLFW-specific key codes to the matching [LogicalKeyboardKey]. diff --git a/dev/tools/gen_keycodes/data/gtk_key_mapping_cc.tmpl b/dev/tools/gen_keycodes/data/gtk_key_mapping_cc.tmpl new file mode 100644 index 0000000000..e77e796bd0 --- /dev/null +++ b/dev/tools/gen_keycodes/data/gtk_key_mapping_cc.tmpl @@ -0,0 +1,44 @@ +// 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. + +#include "key_mapping.h" + +#include +#include + +#include "flutter/shell/platform/linux/fl_key_embedder_responder_private.h" + +// DO NOT EDIT -- DO NOT EDIT -- DO NOT EDIT +// This file is generated by +// flutter/flutter@dev/tools/gen_keycodes/bin/gen_keycodes.dart and should not +// be edited directly. +// +// Edit the template dev/tools/gen_keycodes/data/gtk_key_mapping_cc.tmpl +// instead. See dev/tools/gen_keycodes/README.md for more information. + +// Insert a new entry into a hashtable from uint64 to uint64. +// +// Returns whether the newly added value was already in the hash table or not. +static bool insert_record(GHashTable* table, guint64 xkb, guint64 fl_key) { + return g_hash_table_insert(table, uint64_to_gpointer(xkb), + uint64_to_gpointer(fl_key)); +} + +void initialize_xkb_to_physical_key(GHashTable* table) { +@@@XKB_SCAN_CODE_MAP@@@ +} + +void initialize_gtk_keyval_to_logical_key(GHashTable* table) { +@@@GTK_KEYVAL_CODE_MAP@@@ +} + +void initialize_modifier_bit_to_checked_keys(GHashTable* table) { + FlKeyEmbedderCheckedKey* data; +@@@GTK_MODIFIER_BIT_MAP@@@ +} + +void initialize_lock_bit_to_checked_keys(GHashTable* table) { + FlKeyEmbedderCheckedKey* data; +@@@GTK_MODE_BIT_MAP@@@ +} diff --git a/dev/tools/gen_keycodes/data/gtk_lock_bit_mapping.json b/dev/tools/gen_keycodes/data/gtk_lock_bit_mapping.json new file mode 100644 index 0000000000..21e60ea353 --- /dev/null +++ b/dev/tools/gen_keycodes/data/gtk_lock_bit_mapping.json @@ -0,0 +1,4 @@ +{ + "LOCK": ["CapsLock", "CapsLock"], + "MOD2": ["NumLock", "NumLock"] +} diff --git a/dev/tools/gen_keycodes/data/gtk_logical_name_mapping.json b/dev/tools/gen_keycodes/data/gtk_logical_name_mapping.json new file mode 100644 index 0000000000..2c73091d98 --- /dev/null +++ b/dev/tools/gen_keycodes/data/gtk_logical_name_mapping.json @@ -0,0 +1,160 @@ +{ + "NumpadAdd": ["KP_Add"], + "NumpadMultiply": ["KP_Multiply"], + "NumpadSubtract": ["KP_Subtract"], + "NumpadDivide": ["KP_Divide"], + "Space": ["KP_Space"], + "Period": ["KP_Decimal"], + "NumpadEqual": ["KP_Equal"], + "Numpad0": ["KP_0", "KP_Insert"], + "Numpad1": ["KP_1", "KP_End"], + "Numpad2": ["KP_2", "KP_Down"], + "Numpad3": ["KP_3", "KP_Page_Down"], + "Numpad4": ["KP_4", "KP_Left"], + "Numpad5": ["KP_5"], + "Numpad6": ["KP_6", "KP_Right"], + "Numpad7": ["KP_7", "KP_Home"], + "Numpad8": ["KP_8", "KP_Up"], + "Numpad9": ["KP_9", "KP_Page_Up"], + "NumpadDecimal": ["KP_Period", "KP_Delete"], + "NumpadEnter": ["KP_Enter"], + "AltLeft": ["Alt_L"], + "AltRight": ["Alt_R", "ISO_Level3_Shift"], + "ArrowDown": ["Down"], + "ArrowLeft": ["Left"], + "ArrowRight": ["Right"], + "ArrowUp": ["Up"], + "Attn": ["3270_Attn"], + "AudioVolumeDown": ["AudioLowerVolume"], + "AudioVolumeMute": ["AudioMute"], + "AudioVolumeUp": ["AudioRaiseVolume"], + "Backspace": ["BackSpace"], + "BrightnessDown": ["MonBrightnessDown"], + "BrightnessUp": ["MonBrightnessUp"], + "BrowserBack": ["Back"], + "BrowserFavorites": ["Favorites"], + "BrowserFavourites": ["Favourites"], + "BrowserForward": ["Forward"], + "BrowserHome": ["HomePage"], + "BrowserRefresh": ["Refresh"], + "BrowserSearch": ["Search"], + "BrowserStop": ["Stop"], + "Cancel": ["Cancel"], + "CapsLock": ["Caps_Lock"], + "Clear": ["Clear"], + "Close": ["Close"], + "CodeInput": ["Codeinput"], + "ContextMenu": ["Menu"], + "ControlLeft": ["Control_L"], + "ControlRight": ["Control_R"], + "Copy": ["Copy", "3270_Copy"], + "Cut": ["Cut"], + "Delete": ["Delete"], + "Eisu": ["Eisu_Shift"], + "Eject": ["Eject"], + "End": ["End"], + "Enter": ["Return", "3270_Enter", "ISO_Enter"], + "EraseEof": ["3270_EraseEOF"], + "Escape": ["Escape"], + "ExSel": ["3270_ExSelect"], + "Execute": ["Execute"], + "F1": ["F1", "KP_F1"], + "F2": ["F2", "KP_F2"], + "F3": ["F3", "KP_F3"], + "F4": ["F4", "KP_F4"], + "F5": ["F5"], + "F6": ["F6"], + "F7": ["F7"], + "F8": ["F8"], + "F9": ["F9"], + "F10": ["F10"], + "F11": ["F11"], + "F12": ["F12"], + "F13": ["F13"], + "F14": ["F14"], + "F15": ["F15"], + "F16": ["F16"], + "F17": ["F17"], + "F18": ["F18"], + "F19": ["F19"], + "F20": ["F20"], + "F21": ["F21"], + "F22": ["F22"], + "F23": ["F23"], + "F24": ["F24"], + "F25": ["F25"], + "Find": ["Find"], + "GroupFirst": ["ISO_First_Group"], + "GroupLast": ["ISO_Last_Group"], + "GroupNext": ["ISO_Next_Group"], + "GroupPrevious": ["ISO_Prev_Group"], + "HangulMode": ["Hangul"], + "HanjaMode": ["Hangul_Hanja"], + "Hankaku": ["Hankaku"], + "Help": ["Help"], + "Hiragana": ["Hiragana"], + "HiraganaKatakana": ["Hiragana_Katakana"], + "Home": ["Home"], + "Hybernate": ["Hybernate"], + "Hyper": ["Hyper_L", "Hyper_R"], + "Insert": ["Insert"], + "IntlYen": ["yen"], + "KanjiMode": ["Kanji"], + "Katakana": ["Katakana"], + "KbdIllumDown": ["KbdBrightnessDown"], + "KbdIllumUp": ["KbdBrightnessUp"], + "LaunchAudioBrowser": ["Music"], + "LaunchCalendar": ["Calendar"], + "LaunchDocuments": ["Document"], + "LaunchInternetBrowser": ["WWW"], + "LaunchMail": ["Mail"], + "LaunchPhone": ["Phone"], + "LaunchScreenSaver": ["ScreenSaver"], + "LogOff": ["LogOff"], + "MailForward": ["MailForward"], + "MailReply": ["Reply"], + "MailSend": ["Send"], + "MediaFastForward": ["AudioForward"], + "MediaPause": ["AudioPause"], + "MediaPlay": ["AudioPlay", "3270_Play"], + "MediaRecord": ["AudioRecord"], + "MediaRewind": ["AudioRewind"], + "MediaStop": ["AudioStop"], + "MediaTrackNext": ["AudioNext"], + "MediaTrackPrevious": ["AudioPrev"], + "MetaLeft": ["Meta_L"], + "MetaRight": ["Meta_R"], + "ModeChange": ["Mode_switch"], + "New": ["New"], + "NumLock": ["Num_Lock"], + "Open": ["Open"], + "PageDown": ["Page_Down"], + "PageUp": ["Page_Up"], + "Paste": ["Paste"], + "Pause": ["Pause"], + "PowerOff": ["PowerOff"], + "PreviousCandidate": ["PreviousCandidate"], + "Print": ["Print"], + "PrintScreen": ["3270_PrintScreen"], + "Redo": ["Redo"], + "Resume": ["Resume"], + "Romaji": ["Romaji"], + "Save": ["Save"], + "ScrollLock": ["Scroll_Lock"], + "Select": ["Select"], + "ShiftLeft": ["Shift_L"], + "ShiftRight": ["Shift_R"], + "SingleCandidate": ["SingleCandidate"], + "Sleep": ["Sleep"], + "SpellCheck": ["Spell"], + "Standby": ["Standby"], + "Super": ["Super_L", "Super_R"], + "Suspend": ["Suspend"], + "Tab": ["Tab", "KP_Tab", "ISO_Left_Tab"], + "Undo": ["Undo"], + "WakeUp": ["WakeUp"], + "Zenkaku": ["Zenkaku"], + "ZenkakuHankaku": ["Zenkaku_Hankaku"], + "ZoomIn": ["ZoomIn"], + "ZoomOut": ["ZoomOut"] +} diff --git a/dev/tools/gen_keycodes/data/gtk_modifier_bit_mapping.json b/dev/tools/gen_keycodes/data/gtk_modifier_bit_mapping.json new file mode 100644 index 0000000000..98d96f8f8c --- /dev/null +++ b/dev/tools/gen_keycodes/data/gtk_modifier_bit_mapping.json @@ -0,0 +1,6 @@ +{ + "SHIFT": ["ShiftLeft", "ShiftLeft", "ShiftRight"], + "CONTROL": ["ControlLeft", "ControlLeft", "ControlRight"], + "MOD1": ["AltLeft", "AltLeft", "AltRight"], + "META": ["MetaLeft", "MetaLeft", "MetaRight"] +} diff --git a/dev/tools/gen_keycodes/data/gtk_numpad_shift.json b/dev/tools/gen_keycodes/data/gtk_numpad_shift.json new file mode 100644 index 0000000000..c3b04b98db --- /dev/null +++ b/dev/tools/gen_keycodes/data/gtk_numpad_shift.json @@ -0,0 +1,12 @@ +{ + "Numpad0": "NumpadInsert", + "Numpad1": "NumpadEnd", + "Numpad2": "NumpadDown", + "Numpad3": "NumpadPageDown", + "Numpad4": "NumpadLeft", + "Numpad6": "NumpadRight", + "Numpad7": "NumpadHome", + "Numpad8": "NumpadUp", + "Numpad9": "NumpadPageUp", + "NumpadPeriod": "NumpadDelete" +} diff --git a/dev/tools/gen_keycodes/data/keyboard_map_ios_cc.tmpl b/dev/tools/gen_keycodes/data/ios_keyboard_map_cc.tmpl similarity index 91% rename from dev/tools/gen_keycodes/data/keyboard_map_ios_cc.tmpl rename to dev/tools/gen_keycodes/data/ios_keyboard_map_cc.tmpl index f7a1efe5b5..b36a967142 100644 --- a/dev/tools/gen_keycodes/data/keyboard_map_ios_cc.tmpl +++ b/dev/tools/gen_keycodes/data/ios_keyboard_map_cc.tmpl @@ -8,7 +8,7 @@ // This file is generated by flutter/flutter@dev/tools/gen_keycodes/bin/gen_keycodes.dart and // should not be edited directly. // -// Edit the template dev/tools/gen_keycodes/data/keyboard_map_ios_cc.tmpl instead. +// Edit the template dev/tools/gen_keycodes/data/ios_keyboard_map_cc.tmpl instead. // See dev/tools/gen_keycodes/README.md for more information. // Maps macOS-specific key code values representing [PhysicalKeyboardKey]. diff --git a/dev/tools/gen_keycodes/data/ios_logical_to_physical.json b/dev/tools/gen_keycodes/data/ios_logical_to_physical.json new file mode 100644 index 0000000000..d1fb1171f2 --- /dev/null +++ b/dev/tools/gen_keycodes/data/ios_logical_to_physical.json @@ -0,0 +1,74 @@ + +{ + "Backspace": ["Backspace"], + "Escape": ["Escape"], + "CapsLock": ["CapsLock"], + "NumLock": ["NumLock"], + "ArrowDown": ["ArrowDown"], + "ArrowLeft": ["ArrowLeft"], + "ArrowRight": ["ArrowRight"], + "ArrowUp": ["ArrowUp"], + "End": ["End"], + "Home": ["Home"], + "PageDown": ["PageDown"], + "PageUp": ["PageUp"], + "Insert": ["Insert"], + "Delete": ["Delete"], + "ContextMenu": ["ContextMenu"], + "F1": ["F1"], + "F2": ["F2"], + "F3": ["F3"], + "F4": ["F4"], + "F5": ["F5"], + "F6": ["F6"], + "F7": ["F7"], + "F8": ["F8"], + "F9": ["F9"], + "F10": ["F10"], + "F11": ["F11"], + "F12": ["F12"], + "F13": ["F13"], + "F14": ["F14"], + "F15": ["F15"], + "F16": ["F16"], + "F17": ["F17"], + "F18": ["F18"], + "F19": ["F19"], + "F20": ["F20"], + "NumpadEnter": ["NumpadEnter"], + "NumpadMultiply": ["NumpadMultiply"], + "NumpadAdd": ["NumpadAdd"], + "NumpadComma": ["NumpadComma"], + "NumpadSubtract": ["NumpadSubtract"], + "NumpadDecimal": ["NumpadDecimal"], + "NumpadDivide": ["NumpadDivide"], + "Numpad0": ["Numpad0"], + "Numpad1": ["Numpad1"], + "Numpad2": ["Numpad2"], + "Numpad3": ["Numpad3"], + "Numpad4": ["Numpad4"], + "Numpad5": ["Numpad5"], + "Numpad6": ["Numpad6"], + "Numpad7": ["Numpad7"], + "Numpad8": ["Numpad8"], + "Numpad9": ["Numpad9"], + "NumpadEqual": ["NumpadEqual"], + "AltLeft": ["AltLeft"], + "ControlLeft": ["ControlLeft"], + "MetaLeft": ["MetaLeft"], + "ShiftLeft": ["ShiftLeft"], + "AltRight": ["AltRight"], + "ControlRight": ["ControlRight"], + "MetaRight": ["MetaRight"], + "ShiftRight": ["ShiftRight"], + "Lang1": ["Lang1"], + "Lang2": ["Lang2"], + "Lang3": ["Lang3"], + "Lang4": ["Lang4"], + "Lang5": ["Lang5"], + "IntlYen": ["IntlYen"], + "IntlRo": ["IntlRo"], + "AudioVolumeUp": ["AudioVolumeUp"], + "AudioVolumeDown": ["AudioVolumeDown"], + "AudioVolumeMute": ["AudioVolumeMute"] +} diff --git a/dev/tools/gen_keycodes/data/key_data.json b/dev/tools/gen_keycodes/data/key_data.json deleted file mode 100644 index 1c2c6b358a..0000000000 --- a/dev/tools/gen_keycodes/data/key_data.json +++ /dev/null @@ -1,9878 +0,0 @@ -{ - "none": { - "names": { - "domkey": "None", - "android": [ - "UNKNOWN" - ], - "english": "None", - "chromium": "none", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 0, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 0 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "hyper": { - "names": { - "domkey": "Hyper", - "android": null, - "english": "Hyper", - "chromium": "hyper", - "glfw": null, - "gtk": [ - "Hyper_L", - "Hyper_R" - ], - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 16, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": [ - 65517, - 65518 - ], - "windows": null - } - }, - "superKey": { - "names": { - "domkey": "Super", - "android": null, - "english": "Super Key", - "chromium": "super", - "glfw": null, - "gtk": [ - "Super_L", - "Super_R" - ], - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 17, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": [ - 65515, - 65516 - ], - "windows": null - } - }, - "fnLock": { - "names": { - "domkey": "FnLock", - "android": null, - "english": "Fn Lock", - "chromium": "fnLock", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 19, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "suspend": { - "names": { - "domkey": "Suspend", - "android": [ - "SUSPEND" - ], - "english": "Suspend", - "chromium": "suspend", - "glfw": null, - "gtk": [ - "Suspend" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 205 - ], - "usb": 20, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": [ - 269025191 - ], - "windows": null - } - }, - "resume": { - "names": { - "domkey": "Resume", - "android": null, - "english": "Resume", - "chromium": "resume", - "glfw": null, - "gtk": [ - "Resume" - ], - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 21, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "turbo": { - "names": { - "domkey": "Turbo", - "android": null, - "english": "Turbo", - "chromium": "turbo", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 22, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "privacyScreenToggle": { - "names": { - "domkey": "PrivacyScreenToggle", - "android": null, - "english": "Privacy Screen Toggle", - "chromium": "privacyScreenToggle", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 23, - "linux": 633, - "xkb": 641, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "sleep": { - "names": { - "domkey": "Sleep", - "android": [ - "SLEEP" - ], - "english": "Sleep", - "chromium": "sleep", - "glfw": null, - "gtk": [ - "Sleep" - ], - "windows": [ - "SLEEP" - ] - }, - "scanCodes": { - "android": [ - 142 - ], - "usb": 65666, - "linux": 142, - "xkb": 150, - "windows": 57439, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 223 - ], - "glfw": null, - "gtk": [ - 269025071 - ], - "windows": [ - 95 - ] - } - }, - "wakeUp": { - "names": { - "domkey": "WakeUp", - "android": [ - "WAKEUP" - ], - "english": "Wake Up", - "chromium": "wakeUp", - "glfw": null, - "gtk": [ - "WakeUp" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 143 - ], - "usb": 65667, - "linux": 143, - "xkb": 151, - "windows": 57443, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 224 - ], - "glfw": null, - "gtk": [ - 269025067 - ], - "windows": null - } - }, - "displayToggleIntExt": { - "names": { - "domkey": "DisplayToggleIntExt", - "android": null, - "english": "Display Toggle Int Ext", - "chromium": "displayToggleIntExt", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 65717, - "linux": 227, - "xkb": 235, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "usbReserved": { - "names": { - "domkey": null, - "android": null, - "english": "Usb Reserved", - "chromium": "usbReserved", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 458752, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": 0 - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "usbErrorRollOver": { - "names": { - "domkey": null, - "android": null, - "english": "Usb Error Roll Over", - "chromium": "usbErrorRollOver", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 458753, - "linux": null, - "xkb": null, - "windows": 255, - "macos": null, - "ios": 1 - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "usbPostFail": { - "names": { - "domkey": null, - "android": null, - "english": "Usb Post Fail", - "chromium": "usbPostFail", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 458754, - "linux": null, - "xkb": null, - "windows": 252, - "macos": null, - "ios": 2 - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "usbErrorUndefined": { - "names": { - "domkey": null, - "android": null, - "english": "Usb Error Undefined", - "chromium": "usbErrorUndefined", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 458755, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": 3 - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "keyA": { - "names": { - "domkey": "KeyA", - "android": [ - "A" - ], - "english": "Key A", - "chromium": "usA", - "glfw": [ - "A" - ], - "gtk": [ - "A" - ], - "windows": [ - "A" - ] - }, - "scanCodes": { - "android": [ - 30 - ], - "usb": 458756, - "linux": 30, - "xkb": 38, - "windows": 30, - "macos": 0, - "ios": 4 - }, - "keyCodes": { - "android": [ - 29 - ], - "glfw": [ - 65 - ], - "gtk": [ - 65 - ], - "windows": [ - 65 - ] - } - }, - "keyB": { - "names": { - "domkey": "KeyB", - "android": [ - "B" - ], - "english": "Key B", - "chromium": "usB", - "glfw": [ - "B" - ], - "gtk": [ - "B" - ], - "windows": [ - "B" - ] - }, - "scanCodes": { - "android": [ - 48 - ], - "usb": 458757, - "linux": 48, - "xkb": 56, - "windows": 48, - "macos": 11, - "ios": 5 - }, - "keyCodes": { - "android": [ - 30 - ], - "glfw": [ - 66 - ], - "gtk": [ - 66 - ], - "windows": [ - 66 - ] - } - }, - "keyC": { - "names": { - "domkey": "KeyC", - "android": [ - "C" - ], - "english": "Key C", - "chromium": "usC", - "glfw": [ - "C" - ], - "gtk": [ - "C" - ], - "windows": [ - "C" - ] - }, - "scanCodes": { - "android": [ - 46 - ], - "usb": 458758, - "linux": 46, - "xkb": 54, - "windows": 46, - "macos": 8, - "ios": 6 - }, - "keyCodes": { - "android": [ - 31 - ], - "glfw": [ - 67 - ], - "gtk": [ - 67 - ], - "windows": [ - 67 - ] - } - }, - "keyD": { - "names": { - "domkey": "KeyD", - "android": [ - "D" - ], - "english": "Key D", - "chromium": "usD", - "glfw": [ - "D" - ], - "gtk": [ - "D" - ], - "windows": [ - "D" - ] - }, - "scanCodes": { - "android": [ - 32 - ], - "usb": 458759, - "linux": 32, - "xkb": 40, - "windows": 32, - "macos": 2, - "ios": 7 - }, - "keyCodes": { - "android": [ - 32 - ], - "glfw": [ - 68 - ], - "gtk": [ - 68 - ], - "windows": [ - 68 - ] - } - }, - "keyE": { - "names": { - "domkey": "KeyE", - "android": [ - "E" - ], - "english": "Key E", - "chromium": "usE", - "glfw": [ - "E" - ], - "gtk": [ - "E" - ], - "windows": [ - "E" - ] - }, - "scanCodes": { - "android": [ - 18 - ], - "usb": 458760, - "linux": 18, - "xkb": 26, - "windows": 18, - "macos": 14, - "ios": 8 - }, - "keyCodes": { - "android": [ - 33 - ], - "glfw": [ - 69 - ], - "gtk": [ - 69 - ], - "windows": [ - 69 - ] - } - }, - "keyF": { - "names": { - "domkey": "KeyF", - "android": [ - "F" - ], - "english": "Key F", - "chromium": "usF", - "glfw": [ - "F" - ], - "gtk": [ - "F" - ], - "windows": [ - "F" - ] - }, - "scanCodes": { - "android": [ - 33 - ], - "usb": 458761, - "linux": 33, - "xkb": 41, - "windows": 33, - "macos": 3, - "ios": 9 - }, - "keyCodes": { - "android": [ - 34 - ], - "glfw": [ - 70 - ], - "gtk": [ - 70 - ], - "windows": [ - 70 - ] - } - }, - "keyG": { - "names": { - "domkey": "KeyG", - "android": [ - "G" - ], - "english": "Key G", - "chromium": "usG", - "glfw": [ - "G" - ], - "gtk": [ - "G" - ], - "windows": [ - "G" - ] - }, - "scanCodes": { - "android": [ - 34 - ], - "usb": 458762, - "linux": 34, - "xkb": 42, - "windows": 34, - "macos": 5, - "ios": 10 - }, - "keyCodes": { - "android": [ - 35 - ], - "glfw": [ - 71 - ], - "gtk": [ - 71 - ], - "windows": [ - 71 - ] - } - }, - "keyH": { - "names": { - "domkey": "KeyH", - "android": [ - "H" - ], - "english": "Key H", - "chromium": "usH", - "glfw": [ - "H" - ], - "gtk": [ - "H" - ], - "windows": [ - "H" - ] - }, - "scanCodes": { - "android": [ - 35 - ], - "usb": 458763, - "linux": 35, - "xkb": 43, - "windows": 35, - "macos": 4, - "ios": 11 - }, - "keyCodes": { - "android": [ - 36 - ], - "glfw": [ - 72 - ], - "gtk": [ - 72 - ], - "windows": [ - 72 - ] - } - }, - "keyI": { - "names": { - "domkey": "KeyI", - "android": [ - "I" - ], - "english": "Key I", - "chromium": "usI", - "glfw": [ - "I" - ], - "gtk": [ - "I" - ], - "windows": [ - "I" - ] - }, - "scanCodes": { - "android": [ - 23 - ], - "usb": 458764, - "linux": 23, - "xkb": 31, - "windows": 23, - "macos": 34, - "ios": 12 - }, - "keyCodes": { - "android": [ - 37 - ], - "glfw": [ - 73 - ], - "gtk": [ - 73 - ], - "windows": [ - 73 - ] - } - }, - "keyJ": { - "names": { - "domkey": "KeyJ", - "android": [ - "J" - ], - "english": "Key J", - "chromium": "usJ", - "glfw": [ - "J" - ], - "gtk": [ - "J" - ], - "windows": [ - "J" - ] - }, - "scanCodes": { - "android": [ - 36 - ], - "usb": 458765, - "linux": 36, - "xkb": 44, - "windows": 36, - "macos": 38, - "ios": 13 - }, - "keyCodes": { - "android": [ - 38 - ], - "glfw": [ - 74 - ], - "gtk": [ - 74 - ], - "windows": [ - 74 - ] - } - }, - "keyK": { - "names": { - "domkey": "KeyK", - "android": [ - "K" - ], - "english": "Key K", - "chromium": "usK", - "glfw": [ - "K" - ], - "gtk": [ - "K" - ], - "windows": [ - "K" - ] - }, - "scanCodes": { - "android": [ - 37 - ], - "usb": 458766, - "linux": 37, - "xkb": 45, - "windows": 37, - "macos": 40, - "ios": 14 - }, - "keyCodes": { - "android": [ - 39 - ], - "glfw": [ - 75 - ], - "gtk": [ - 75 - ], - "windows": [ - 75 - ] - } - }, - "keyL": { - "names": { - "domkey": "KeyL", - "android": [ - "L" - ], - "english": "Key L", - "chromium": "usL", - "glfw": [ - "L" - ], - "gtk": [ - "L" - ], - "windows": [ - "L" - ] - }, - "scanCodes": { - "android": [ - 38 - ], - "usb": 458767, - "linux": 38, - "xkb": 46, - "windows": 38, - "macos": 37, - "ios": 15 - }, - "keyCodes": { - "android": [ - 40 - ], - "glfw": [ - 76 - ], - "gtk": [ - 76 - ], - "windows": [ - 76 - ] - } - }, - "keyM": { - "names": { - "domkey": "KeyM", - "android": [ - "M" - ], - "english": "Key M", - "chromium": "usM", - "glfw": [ - "M" - ], - "gtk": [ - "M" - ], - "windows": [ - "M" - ] - }, - "scanCodes": { - "android": [ - 50 - ], - "usb": 458768, - "linux": 50, - "xkb": 58, - "windows": 50, - "macos": 46, - "ios": 16 - }, - "keyCodes": { - "android": [ - 41 - ], - "glfw": [ - 77 - ], - "gtk": [ - 77 - ], - "windows": [ - 77 - ] - } - }, - "keyN": { - "names": { - "domkey": "KeyN", - "android": [ - "N" - ], - "english": "Key N", - "chromium": "usN", - "glfw": [ - "N" - ], - "gtk": [ - "N" - ], - "windows": [ - "N" - ] - }, - "scanCodes": { - "android": [ - 49 - ], - "usb": 458769, - "linux": 49, - "xkb": 57, - "windows": 49, - "macos": 45, - "ios": 17 - }, - "keyCodes": { - "android": [ - 42 - ], - "glfw": [ - 78 - ], - "gtk": [ - 78 - ], - "windows": [ - 78 - ] - } - }, - "keyO": { - "names": { - "domkey": "KeyO", - "android": [ - "O" - ], - "english": "Key O", - "chromium": "usO", - "glfw": [ - "O" - ], - "gtk": [ - "O" - ], - "windows": [ - "O" - ] - }, - "scanCodes": { - "android": [ - 24 - ], - "usb": 458770, - "linux": 24, - "xkb": 32, - "windows": 24, - "macos": 31, - "ios": 18 - }, - "keyCodes": { - "android": [ - 43 - ], - "glfw": [ - 79 - ], - "gtk": [ - 79 - ], - "windows": [ - 79 - ] - } - }, - "keyP": { - "names": { - "domkey": "KeyP", - "android": [ - "P" - ], - "english": "Key P", - "chromium": "usP", - "glfw": [ - "P" - ], - "gtk": [ - "P" - ], - "windows": [ - "P" - ] - }, - "scanCodes": { - "android": [ - 25 - ], - "usb": 458771, - "linux": 25, - "xkb": 33, - "windows": 25, - "macos": 35, - "ios": 19 - }, - "keyCodes": { - "android": [ - 44 - ], - "glfw": [ - 80 - ], - "gtk": [ - 80 - ], - "windows": [ - 80 - ] - } - }, - "keyQ": { - "names": { - "domkey": "KeyQ", - "android": [ - "Q" - ], - "english": "Key Q", - "chromium": "usQ", - "glfw": [ - "Q" - ], - "gtk": [ - "Q" - ], - "windows": [ - "Q" - ] - }, - "scanCodes": { - "android": [ - 16 - ], - "usb": 458772, - "linux": 16, - "xkb": 24, - "windows": 16, - "macos": 12, - "ios": 20 - }, - "keyCodes": { - "android": [ - 45 - ], - "glfw": [ - 81 - ], - "gtk": [ - 81 - ], - "windows": [ - 81 - ] - } - }, - "keyR": { - "names": { - "domkey": "KeyR", - "android": [ - "R" - ], - "english": "Key R", - "chromium": "usR", - "glfw": [ - "R" - ], - "gtk": [ - "R" - ], - "windows": [ - "R" - ] - }, - "scanCodes": { - "android": [ - 19 - ], - "usb": 458773, - "linux": 19, - "xkb": 27, - "windows": 19, - "macos": 15, - "ios": 21 - }, - "keyCodes": { - "android": [ - 46 - ], - "glfw": [ - 82 - ], - "gtk": [ - 82 - ], - "windows": [ - 82 - ] - } - }, - "keyS": { - "names": { - "domkey": "KeyS", - "android": [ - "S" - ], - "english": "Key S", - "chromium": "usS", - "glfw": [ - "S" - ], - "gtk": [ - "S" - ], - "windows": [ - "S" - ] - }, - "scanCodes": { - "android": [ - 31 - ], - "usb": 458774, - "linux": 31, - "xkb": 39, - "windows": 31, - "macos": 1, - "ios": 22 - }, - "keyCodes": { - "android": [ - 47 - ], - "glfw": [ - 83 - ], - "gtk": [ - 83 - ], - "windows": [ - 83 - ] - } - }, - "keyT": { - "names": { - "domkey": "KeyT", - "android": [ - "T" - ], - "english": "Key T", - "chromium": "usT", - "glfw": [ - "T" - ], - "gtk": [ - "T" - ], - "windows": [ - "T" - ] - }, - "scanCodes": { - "android": [ - 20 - ], - "usb": 458775, - "linux": 20, - "xkb": 28, - "windows": 20, - "macos": 17, - "ios": 23 - }, - "keyCodes": { - "android": [ - 48 - ], - "glfw": [ - 84 - ], - "gtk": [ - 84 - ], - "windows": [ - 84 - ] - } - }, - "keyU": { - "names": { - "domkey": "KeyU", - "android": [ - "U" - ], - "english": "Key U", - "chromium": "usU", - "glfw": [ - "U" - ], - "gtk": [ - "U" - ], - "windows": [ - "U" - ] - }, - "scanCodes": { - "android": [ - 22 - ], - "usb": 458776, - "linux": 22, - "xkb": 30, - "windows": 22, - "macos": 32, - "ios": 24 - }, - "keyCodes": { - "android": [ - 49 - ], - "glfw": [ - 85 - ], - "gtk": [ - 85 - ], - "windows": [ - 85 - ] - } - }, - "keyV": { - "names": { - "domkey": "KeyV", - "android": [ - "V" - ], - "english": "Key V", - "chromium": "usV", - "glfw": [ - "V" - ], - "gtk": [ - "V" - ], - "windows": [ - "V" - ] - }, - "scanCodes": { - "android": [ - 47 - ], - "usb": 458777, - "linux": 47, - "xkb": 55, - "windows": 47, - "macos": 9, - "ios": 25 - }, - "keyCodes": { - "android": [ - 50 - ], - "glfw": [ - 86 - ], - "gtk": [ - 86 - ], - "windows": [ - 86 - ] - } - }, - "keyW": { - "names": { - "domkey": "KeyW", - "android": [ - "W" - ], - "english": "Key W", - "chromium": "usW", - "glfw": [ - "W" - ], - "gtk": [ - "W" - ], - "windows": [ - "W" - ] - }, - "scanCodes": { - "android": [ - 17 - ], - "usb": 458778, - "linux": 17, - "xkb": 25, - "windows": 17, - "macos": 13, - "ios": 26 - }, - "keyCodes": { - "android": [ - 51 - ], - "glfw": [ - 87 - ], - "gtk": [ - 87 - ], - "windows": [ - 87 - ] - } - }, - "keyX": { - "names": { - "domkey": "KeyX", - "android": [ - "X" - ], - "english": "Key X", - "chromium": "usX", - "glfw": [ - "X" - ], - "gtk": [ - "X" - ], - "windows": [ - "X" - ] - }, - "scanCodes": { - "android": [ - 45 - ], - "usb": 458779, - "linux": 45, - "xkb": 53, - "windows": 45, - "macos": 7, - "ios": 27 - }, - "keyCodes": { - "android": [ - 52 - ], - "glfw": [ - 88 - ], - "gtk": [ - 88 - ], - "windows": [ - 88 - ] - } - }, - "keyY": { - "names": { - "domkey": "KeyY", - "android": [ - "Y" - ], - "english": "Key Y", - "chromium": "usY", - "glfw": [ - "Y" - ], - "gtk": [ - "Y" - ], - "windows": [ - "Y" - ] - }, - "scanCodes": { - "android": [ - 21 - ], - "usb": 458780, - "linux": 21, - "xkb": 29, - "windows": 21, - "macos": 16, - "ios": 28 - }, - "keyCodes": { - "android": [ - 53 - ], - "glfw": [ - 89 - ], - "gtk": [ - 89 - ], - "windows": [ - 89 - ] - } - }, - "keyZ": { - "names": { - "domkey": "KeyZ", - "android": [ - "Z" - ], - "english": "Key Z", - "chromium": "usZ", - "glfw": [ - "Z" - ], - "gtk": [ - "Z" - ], - "windows": [ - "Z" - ] - }, - "scanCodes": { - "android": [ - 44 - ], - "usb": 458781, - "linux": 44, - "xkb": 52, - "windows": 44, - "macos": 6, - "ios": 29 - }, - "keyCodes": { - "android": [ - 54 - ], - "glfw": [ - 90 - ], - "gtk": [ - 90 - ], - "windows": [ - 90 - ] - } - }, - "digit1": { - "names": { - "domkey": "Digit1", - "android": [ - "1" - ], - "english": "Digit 1", - "chromium": "digit1", - "glfw": [ - "1" - ], - "gtk": [ - "1" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 2 - ], - "usb": 458782, - "linux": 2, - "xkb": 10, - "windows": 2, - "macos": 18, - "ios": 30 - }, - "keyCodes": { - "android": [ - 8 - ], - "glfw": [ - 49 - ], - "gtk": [ - 49 - ], - "windows": null - } - }, - "digit2": { - "names": { - "domkey": "Digit2", - "android": [ - "2" - ], - "english": "Digit 2", - "chromium": "digit2", - "glfw": [ - "2" - ], - "gtk": [ - "2" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 3 - ], - "usb": 458783, - "linux": 3, - "xkb": 11, - "windows": 3, - "macos": 19, - "ios": 31 - }, - "keyCodes": { - "android": [ - 9 - ], - "glfw": [ - 50 - ], - "gtk": [ - 50 - ], - "windows": null - } - }, - "digit3": { - "names": { - "domkey": "Digit3", - "android": [ - "3" - ], - "english": "Digit 3", - "chromium": "digit3", - "glfw": [ - "3" - ], - "gtk": [ - "3" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 4 - ], - "usb": 458784, - "linux": 4, - "xkb": 12, - "windows": 4, - "macos": 20, - "ios": 32 - }, - "keyCodes": { - "android": [ - 10 - ], - "glfw": [ - 51 - ], - "gtk": [ - 51 - ], - "windows": null - } - }, - "digit4": { - "names": { - "domkey": "Digit4", - "android": [ - "4" - ], - "english": "Digit 4", - "chromium": "digit4", - "glfw": [ - "4" - ], - "gtk": [ - "4" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 5 - ], - "usb": 458785, - "linux": 5, - "xkb": 13, - "windows": 5, - "macos": 21, - "ios": 33 - }, - "keyCodes": { - "android": [ - 11 - ], - "glfw": [ - 52 - ], - "gtk": [ - 52 - ], - "windows": null - } - }, - "digit5": { - "names": { - "domkey": "Digit5", - "android": [ - "5" - ], - "english": "Digit 5", - "chromium": "digit5", - "glfw": [ - "5" - ], - "gtk": [ - "5" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 6 - ], - "usb": 458786, - "linux": 6, - "xkb": 14, - "windows": 6, - "macos": 23, - "ios": 34 - }, - "keyCodes": { - "android": [ - 12 - ], - "glfw": [ - 53 - ], - "gtk": [ - 53 - ], - "windows": null - } - }, - "digit6": { - "names": { - "domkey": "Digit6", - "android": [ - "6" - ], - "english": "Digit 6", - "chromium": "digit6", - "glfw": [ - "6" - ], - "gtk": [ - "6" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 7 - ], - "usb": 458787, - "linux": 7, - "xkb": 15, - "windows": 7, - "macos": 22, - "ios": 35 - }, - "keyCodes": { - "android": [ - 13 - ], - "glfw": [ - 54 - ], - "gtk": [ - 54 - ], - "windows": null - } - }, - "digit7": { - "names": { - "domkey": "Digit7", - "android": [ - "7" - ], - "english": "Digit 7", - "chromium": "digit7", - "glfw": [ - "7" - ], - "gtk": [ - "7" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 8 - ], - "usb": 458788, - "linux": 8, - "xkb": 16, - "windows": 8, - "macos": 26, - "ios": 36 - }, - "keyCodes": { - "android": [ - 14 - ], - "glfw": [ - 55 - ], - "gtk": [ - 55 - ], - "windows": null - } - }, - "digit8": { - "names": { - "domkey": "Digit8", - "android": [ - "8" - ], - "english": "Digit 8", - "chromium": "digit8", - "glfw": [ - "8" - ], - "gtk": [ - "8" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 9 - ], - "usb": 458789, - "linux": 9, - "xkb": 17, - "windows": 9, - "macos": 28, - "ios": 37 - }, - "keyCodes": { - "android": [ - 15 - ], - "glfw": [ - 56 - ], - "gtk": [ - 56 - ], - "windows": null - } - }, - "digit9": { - "names": { - "domkey": "Digit9", - "android": [ - "9" - ], - "english": "Digit 9", - "chromium": "digit9", - "glfw": [ - "9" - ], - "gtk": [ - "9" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 10 - ], - "usb": 458790, - "linux": 10, - "xkb": 18, - "windows": 10, - "macos": 25, - "ios": 38 - }, - "keyCodes": { - "android": [ - 16 - ], - "glfw": [ - 57 - ], - "gtk": [ - 57 - ], - "windows": null - } - }, - "digit0": { - "names": { - "domkey": "Digit0", - "android": [ - "0" - ], - "english": "Digit 0", - "chromium": "digit0", - "glfw": [ - "0" - ], - "gtk": [ - "0" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 11 - ], - "usb": 458791, - "linux": 11, - "xkb": 19, - "windows": 11, - "macos": 29, - "ios": 39 - }, - "keyCodes": { - "android": [ - 7 - ], - "glfw": [ - 48 - ], - "gtk": [ - 48 - ], - "windows": null - } - }, - "enter": { - "names": { - "domkey": "Enter", - "android": [ - "ENTER" - ], - "english": "Enter", - "chromium": "enter", - "glfw": [ - "ENTER" - ], - "gtk": [ - "Return", - "Enter", - "ISO_Enter" - ], - "windows": [ - "RETURN" - ] - }, - "scanCodes": { - "android": [ - 28 - ], - "usb": 458792, - "linux": 28, - "xkb": 36, - "windows": 28, - "macos": 36, - "ios": 40 - }, - "keyCodes": { - "android": [ - 66 - ], - "glfw": [ - 257 - ], - "gtk": [ - 65293, - 65076 - ], - "windows": [ - 13 - ] - } - }, - "escape": { - "names": { - "domkey": "Escape", - "android": [ - "ESCAPE" - ], - "english": "Escape", - "chromium": "escape", - "glfw": [ - "ESCAPE" - ], - "gtk": [ - "Escape" - ], - "windows": [ - "ESCAPE" - ] - }, - "scanCodes": { - "android": [ - 1 - ], - "usb": 458793, - "linux": 1, - "xkb": 9, - "windows": 1, - "macos": 53, - "ios": 41 - }, - "keyCodes": { - "android": [ - 111 - ], - "glfw": [ - 256 - ], - "gtk": [ - 65307 - ], - "windows": [ - 27 - ] - } - }, - "backspace": { - "names": { - "domkey": "Backspace", - "android": [ - "DEL" - ], - "english": "Backspace", - "chromium": "backspace", - "glfw": [ - "BACKSPACE" - ], - "gtk": [ - "BackSpace" - ], - "windows": [ - "BACK" - ] - }, - "scanCodes": { - "android": [ - 14 - ], - "usb": 458794, - "linux": 14, - "xkb": 22, - "windows": 14, - "macos": 51, - "ios": 42 - }, - "keyCodes": { - "android": [ - 67 - ], - "glfw": [ - 259 - ], - "gtk": [ - 65288 - ], - "windows": [ - 8 - ] - } - }, - "tab": { - "names": { - "domkey": "Tab", - "android": [ - "TAB" - ], - "english": "Tab", - "chromium": "tab", - "glfw": [ - "TAB" - ], - "gtk": [ - "Tab", - "KP_Tab", - "ISO_Left_Tab" - ], - "windows": [ - "TAB" - ] - }, - "scanCodes": { - "android": [ - 15 - ], - "usb": 458795, - "linux": 15, - "xkb": 23, - "windows": 15, - "macos": 48, - "ios": 43 - }, - "keyCodes": { - "android": [ - 61 - ], - "glfw": [ - 258 - ], - "gtk": [ - 65289, - 65417, - 65056 - ], - "windows": [ - 9 - ] - } - }, - "space": { - "names": { - "domkey": "Space", - "android": [ - "SPACE" - ], - "english": "Space", - "chromium": "space", - "glfw": [ - "SPACE" - ], - "gtk": [ - "space", - "KP_Space" - ], - "windows": [ - "SPACE" - ] - }, - "scanCodes": { - "android": [ - 57 - ], - "usb": 458796, - "linux": 57, - "xkb": 65, - "windows": 57, - "macos": 49, - "ios": 44 - }, - "keyCodes": { - "android": [ - 62 - ], - "glfw": [ - 32 - ], - "gtk": [ - 32, - 65408 - ], - "windows": [ - 32 - ] - } - }, - "minus": { - "names": { - "domkey": "Minus", - "android": [ - "MINUS" - ], - "english": "Minus", - "chromium": "minus", - "glfw": [ - "MINUS" - ], - "gtk": [ - "minus" - ], - "windows": [ - "OEM_MINUS" - ] - }, - "scanCodes": { - "android": [ - 12 - ], - "usb": 458797, - "linux": 12, - "xkb": 20, - "windows": 12, - "macos": 27, - "ios": 45 - }, - "keyCodes": { - "android": [ - 69 - ], - "glfw": [ - 45 - ], - "gtk": [ - 45 - ], - "windows": [ - 189 - ] - } - }, - "equal": { - "names": { - "domkey": "Equal", - "android": [ - "EQUALS" - ], - "english": "Equal", - "chromium": "equal", - "glfw": [ - "EQUAL" - ], - "gtk": [ - "equal" - ], - "windows": [ - "OEM_PLUS" - ] - }, - "scanCodes": { - "android": [ - 13 - ], - "usb": 458798, - "linux": 13, - "xkb": 21, - "windows": 13, - "macos": 24, - "ios": 46 - }, - "keyCodes": { - "android": [ - 70 - ], - "glfw": [ - 61 - ], - "gtk": [ - 61 - ], - "windows": [ - 187 - ] - } - }, - "bracketLeft": { - "names": { - "domkey": "BracketLeft", - "android": [ - "LEFT_BRACKET" - ], - "english": "Bracket Left", - "chromium": "bracketLeft", - "glfw": [ - "LEFT_BRACKET" - ], - "gtk": [ - "bracketleft" - ], - "windows": [ - "OEM_4" - ] - }, - "scanCodes": { - "android": [ - 26 - ], - "usb": 458799, - "linux": 26, - "xkb": 34, - "windows": 26, - "macos": 33, - "ios": 47 - }, - "keyCodes": { - "android": [ - 71 - ], - "glfw": [ - 91 - ], - "gtk": [ - 91 - ], - "windows": [ - 219 - ] - } - }, - "bracketRight": { - "names": { - "domkey": "BracketRight", - "android": [ - "RIGHT_BRACKET" - ], - "english": "Bracket Right", - "chromium": "bracketRight", - "glfw": [ - "RIGHT_BRACKET" - ], - "gtk": [ - "bracketright" - ], - "windows": [ - "OEM_6" - ] - }, - "scanCodes": { - "android": [ - 27 - ], - "usb": 458800, - "linux": 27, - "xkb": 35, - "windows": 27, - "macos": 30, - "ios": 48 - }, - "keyCodes": { - "android": [ - 72 - ], - "glfw": [ - 93 - ], - "gtk": [ - 93 - ], - "windows": [ - 221 - ] - } - }, - "backslash": { - "names": { - "domkey": "Backslash", - "android": [ - "BACKSLASH" - ], - "english": "Backslash", - "chromium": "backslash", - "glfw": [ - "BACKSLASH" - ], - "gtk": [ - "backslash" - ], - "windows": [ - "OEM_5" - ] - }, - "scanCodes": { - "android": [ - 43, - 86 - ], - "usb": 458801, - "linux": 43, - "xkb": 51, - "windows": 43, - "macos": 42, - "ios": 49 - }, - "keyCodes": { - "android": [ - 73 - ], - "glfw": [ - 92 - ], - "gtk": [ - 92 - ], - "windows": [ - 220 - ] - } - }, - "semicolon": { - "names": { - "domkey": "Semicolon", - "android": [ - "SEMICOLON" - ], - "english": "Semicolon", - "chromium": "semicolon", - "glfw": [ - "SEMICOLON" - ], - "gtk": [ - "semicolon" - ], - "windows": [ - "OEM_1" - ] - }, - "scanCodes": { - "android": [ - 39 - ], - "usb": 458803, - "linux": 39, - "xkb": 47, - "windows": 39, - "macos": 41, - "ios": 51 - }, - "keyCodes": { - "android": [ - 74 - ], - "glfw": [ - 59 - ], - "gtk": [ - 59 - ], - "windows": [ - 186 - ] - } - }, - "quote": { - "names": { - "domkey": "Quote", - "android": [ - "APOSTROPHE" - ], - "english": "Quote", - "chromium": "quote", - "glfw": [ - "APOSTROPHE" - ], - "gtk": [ - "apostrophe" - ], - "windows": [ - "OEM_7" - ] - }, - "scanCodes": { - "android": [ - 40 - ], - "usb": 458804, - "linux": 40, - "xkb": 48, - "windows": 40, - "macos": 39, - "ios": 52 - }, - "keyCodes": { - "android": [ - 75 - ], - "glfw": [ - 39 - ], - "gtk": [ - 39 - ], - "windows": [ - 222 - ] - } - }, - "backquote": { - "names": { - "domkey": "Backquote", - "android": [ - "GRAVE" - ], - "english": "Backquote", - "chromium": "backquote", - "glfw": [ - "GRAVE_ACCENT" - ], - "gtk": [ - "quoteleft" - ], - "windows": [ - "OEM_3" - ] - }, - "scanCodes": { - "android": [ - 41 - ], - "usb": 458805, - "linux": 41, - "xkb": 49, - "windows": 41, - "macos": 50, - "ios": 53 - }, - "keyCodes": { - "android": [ - 68 - ], - "glfw": [ - 96 - ], - "gtk": [ - 96 - ], - "windows": [ - 192 - ] - } - }, - "comma": { - "names": { - "domkey": "Comma", - "android": [ - "COMMA" - ], - "english": "Comma", - "chromium": "comma", - "glfw": [ - "COMMA" - ], - "gtk": [ - "comma" - ], - "windows": [ - "OEM_COMMA" - ] - }, - "scanCodes": { - "android": [ - 51 - ], - "usb": 458806, - "linux": 51, - "xkb": 59, - "windows": 51, - "macos": 43, - "ios": 54 - }, - "keyCodes": { - "android": [ - 55 - ], - "glfw": [ - 44 - ], - "gtk": [ - 44 - ], - "windows": [ - 188 - ] - } - }, - "period": { - "names": { - "domkey": "Period", - "android": [ - "PERIOD" - ], - "english": "Period", - "chromium": "period", - "glfw": [ - "PERIOD" - ], - "gtk": [ - "period" - ], - "windows": [ - "OEM_PERIOD" - ] - }, - "scanCodes": { - "android": [ - 52 - ], - "usb": 458807, - "linux": 52, - "xkb": 60, - "windows": 52, - "macos": 47, - "ios": 55 - }, - "keyCodes": { - "android": [ - 56 - ], - "glfw": [ - 46 - ], - "gtk": [ - 46 - ], - "windows": [ - 190 - ] - } - }, - "slash": { - "names": { - "domkey": "Slash", - "android": [ - "SLASH" - ], - "english": "Slash", - "chromium": "slash", - "glfw": [ - "SLASH" - ], - "gtk": [ - "slash" - ], - "windows": [ - "OEM_2" - ] - }, - "scanCodes": { - "android": [ - 53 - ], - "usb": 458808, - "linux": 53, - "xkb": 61, - "windows": 53, - "macos": 44, - "ios": 56 - }, - "keyCodes": { - "android": [ - 76 - ], - "glfw": [ - 47 - ], - "gtk": [ - 47 - ], - "windows": [ - 191 - ] - } - }, - "capsLock": { - "names": { - "domkey": "CapsLock", - "android": [ - "CAPS_LOCK" - ], - "english": "Caps Lock", - "chromium": "capsLock", - "glfw": [ - "CAPS_LOCK" - ], - "gtk": [ - "Caps_Lock" - ], - "windows": [ - "CAPITAL" - ] - }, - "scanCodes": { - "android": [ - 58 - ], - "usb": 458809, - "linux": 58, - "xkb": 66, - "windows": 58, - "macos": 57, - "ios": 57 - }, - "keyCodes": { - "android": [ - 115 - ], - "glfw": [ - 280 - ], - "gtk": [ - 65509 - ], - "windows": [ - 20 - ] - } - }, - "f1": { - "names": { - "domkey": "F1", - "android": [ - "F1" - ], - "english": "F1", - "chromium": "f1", - "glfw": [ - "F1" - ], - "gtk": [ - "F1", - "KP_F1" - ], - "windows": [ - "F1" - ] - }, - "scanCodes": { - "android": [ - 59 - ], - "usb": 458810, - "linux": 59, - "xkb": 67, - "windows": 59, - "macos": 122, - "ios": 58 - }, - "keyCodes": { - "android": [ - 131 - ], - "glfw": [ - 290 - ], - "gtk": [ - 65470, - 65425 - ], - "windows": [ - 112 - ] - } - }, - "f2": { - "names": { - "domkey": "F2", - "android": [ - "F2" - ], - "english": "F2", - "chromium": "f2", - "glfw": [ - "F2" - ], - "gtk": [ - "F2", - "KP_F2" - ], - "windows": [ - "F2" - ] - }, - "scanCodes": { - "android": [ - 60 - ], - "usb": 458811, - "linux": 60, - "xkb": 68, - "windows": 60, - "macos": 120, - "ios": 59 - }, - "keyCodes": { - "android": [ - 132 - ], - "glfw": [ - 291 - ], - "gtk": [ - 65471, - 65426 - ], - "windows": [ - 113 - ] - } - }, - "f3": { - "names": { - "domkey": "F3", - "android": [ - "F3" - ], - "english": "F3", - "chromium": "f3", - "glfw": [ - "F3" - ], - "gtk": [ - "F3", - "KP_F3" - ], - "windows": [ - "F3" - ] - }, - "scanCodes": { - "android": [ - 61 - ], - "usb": 458812, - "linux": 61, - "xkb": 69, - "windows": 61, - "macos": 99, - "ios": 60 - }, - "keyCodes": { - "android": [ - 133 - ], - "glfw": [ - 292 - ], - "gtk": [ - 65472, - 65427 - ], - "windows": [ - 114 - ] - } - }, - "f4": { - "names": { - "domkey": "F4", - "android": [ - "F4" - ], - "english": "F4", - "chromium": "f4", - "glfw": [ - "F4" - ], - "gtk": [ - "F4", - "KP_F4" - ], - "windows": [ - "F4" - ] - }, - "scanCodes": { - "android": [ - 62 - ], - "usb": 458813, - "linux": 62, - "xkb": 70, - "windows": 62, - "macos": 118, - "ios": 61 - }, - "keyCodes": { - "android": [ - 134 - ], - "glfw": [ - 293 - ], - "gtk": [ - 65473, - 65428 - ], - "windows": [ - 115 - ] - } - }, - "f5": { - "names": { - "domkey": "F5", - "android": [ - "F5" - ], - "english": "F5", - "chromium": "f5", - "glfw": [ - "F5" - ], - "gtk": [ - "F5" - ], - "windows": [ - "F5" - ] - }, - "scanCodes": { - "android": [ - 63 - ], - "usb": 458814, - "linux": 63, - "xkb": 71, - "windows": 63, - "macos": 96, - "ios": 62 - }, - "keyCodes": { - "android": [ - 135 - ], - "glfw": [ - 294 - ], - "gtk": [ - 65474 - ], - "windows": [ - 116 - ] - } - }, - "f6": { - "names": { - "domkey": "F6", - "android": [ - "F6" - ], - "english": "F6", - "chromium": "f6", - "glfw": [ - "F6" - ], - "gtk": [ - "F6" - ], - "windows": [ - "F6" - ] - }, - "scanCodes": { - "android": [ - 64 - ], - "usb": 458815, - "linux": 64, - "xkb": 72, - "windows": 64, - "macos": 97, - "ios": 63 - }, - "keyCodes": { - "android": [ - 136 - ], - "glfw": [ - 295 - ], - "gtk": [ - 65475 - ], - "windows": [ - 117 - ] - } - }, - "f7": { - "names": { - "domkey": "F7", - "android": [ - "F7" - ], - "english": "F7", - "chromium": "f7", - "glfw": [ - "F7" - ], - "gtk": [ - "F7" - ], - "windows": [ - "F7" - ] - }, - "scanCodes": { - "android": [ - 65 - ], - "usb": 458816, - "linux": 65, - "xkb": 73, - "windows": 65, - "macos": 98, - "ios": 64 - }, - "keyCodes": { - "android": [ - 137 - ], - "glfw": [ - 296 - ], - "gtk": [ - 65476 - ], - "windows": [ - 118 - ] - } - }, - "f8": { - "names": { - "domkey": "F8", - "android": [ - "F8" - ], - "english": "F8", - "chromium": "f8", - "glfw": [ - "F8" - ], - "gtk": [ - "F8" - ], - "windows": [ - "F8" - ] - }, - "scanCodes": { - "android": [ - 66 - ], - "usb": 458817, - "linux": 66, - "xkb": 74, - "windows": 66, - "macos": 100, - "ios": 65 - }, - "keyCodes": { - "android": [ - 138 - ], - "glfw": [ - 297 - ], - "gtk": [ - 65477 - ], - "windows": [ - 119 - ] - } - }, - "f9": { - "names": { - "domkey": "F9", - "android": [ - "F9" - ], - "english": "F9", - "chromium": "f9", - "glfw": [ - "F9" - ], - "gtk": [ - "F9" - ], - "windows": [ - "F9" - ] - }, - "scanCodes": { - "android": [ - 67 - ], - "usb": 458818, - "linux": 67, - "xkb": 75, - "windows": 67, - "macos": 101, - "ios": 66 - }, - "keyCodes": { - "android": [ - 139 - ], - "glfw": [ - 298 - ], - "gtk": [ - 65478 - ], - "windows": [ - 120 - ] - } - }, - "f10": { - "names": { - "domkey": "F10", - "android": [ - "F10" - ], - "english": "F10", - "chromium": "f10", - "glfw": [ - "F10" - ], - "gtk": [ - "F10" - ], - "windows": [ - "F10" - ] - }, - "scanCodes": { - "android": [ - 68 - ], - "usb": 458819, - "linux": 68, - "xkb": 76, - "windows": 68, - "macos": 109, - "ios": 67 - }, - "keyCodes": { - "android": [ - 140 - ], - "glfw": [ - 299 - ], - "gtk": [ - 65479 - ], - "windows": [ - 121 - ] - } - }, - "f11": { - "names": { - "domkey": "F11", - "android": [ - "F11" - ], - "english": "F11", - "chromium": "f11", - "glfw": [ - "F11" - ], - "gtk": [ - "F11" - ], - "windows": [ - "F11" - ] - }, - "scanCodes": { - "android": [ - 87 - ], - "usb": 458820, - "linux": 87, - "xkb": 95, - "windows": 87, - "macos": 103, - "ios": 68 - }, - "keyCodes": { - "android": [ - 141 - ], - "glfw": [ - 300 - ], - "gtk": [ - 65480 - ], - "windows": [ - 122 - ] - } - }, - "f12": { - "names": { - "domkey": "F12", - "android": [ - "F12" - ], - "english": "F12", - "chromium": "f12", - "glfw": [ - "F12" - ], - "gtk": [ - "F12" - ], - "windows": [ - "F12" - ] - }, - "scanCodes": { - "android": [ - 88 - ], - "usb": 458821, - "linux": 88, - "xkb": 96, - "windows": 88, - "macos": 111, - "ios": 69 - }, - "keyCodes": { - "android": [ - 142 - ], - "glfw": [ - 301 - ], - "gtk": [ - 65481 - ], - "windows": [ - 123 - ] - } - }, - "printScreen": { - "names": { - "domkey": "PrintScreen", - "android": [ - "SYSRQ" - ], - "english": "Print Screen", - "chromium": "printScreen", - "glfw": [ - "PRINT_SCREEN" - ], - "gtk": [ - "3270_PrintScreen" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 99 - ], - "usb": 458822, - "linux": 99, - "xkb": 107, - "windows": 57399, - "macos": null, - "ios": 70 - }, - "keyCodes": { - "android": [ - 120 - ], - "glfw": [ - 283 - ], - "gtk": [ - 64797 - ], - "windows": null - } - }, - "scrollLock": { - "names": { - "domkey": "ScrollLock", - "android": [ - "SCROLL_LOCK" - ], - "english": "Scroll Lock", - "chromium": "scrollLock", - "glfw": null, - "gtk": [ - "Scroll_Lock" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 70 - ], - "usb": 458823, - "linux": 70, - "xkb": 78, - "windows": 70, - "macos": null, - "ios": 71 - }, - "keyCodes": { - "android": [ - 116 - ], - "glfw": null, - "gtk": [ - 65300 - ], - "windows": null - } - }, - "pause": { - "names": { - "domkey": "Pause", - "android": [ - "BREAK" - ], - "english": "Pause", - "chromium": "pause", - "glfw": [ - "PAUSE" - ], - "gtk": [ - "Pause" - ], - "windows": [ - "PAUSE" - ] - }, - "scanCodes": { - "android": [ - 119, - 411 - ], - "usb": 458824, - "linux": 119, - "xkb": 127, - "windows": 69, - "macos": null, - "ios": 72 - }, - "keyCodes": { - "android": [ - 121 - ], - "glfw": [ - 284 - ], - "gtk": [ - 65299 - ], - "windows": [ - 19 - ] - } - }, - "insert": { - "names": { - "domkey": "Insert", - "android": [ - "INSERT" - ], - "english": "Insert", - "chromium": "insert", - "glfw": [ - "INSERT" - ], - "gtk": [ - "Insert", - "KP_Insert" - ], - "windows": [ - "INSERT" - ] - }, - "scanCodes": { - "android": [ - 110 - ], - "usb": 458825, - "linux": 110, - "xkb": 118, - "windows": 57426, - "macos": 114, - "ios": 73 - }, - "keyCodes": { - "android": [ - 124 - ], - "glfw": [ - 260 - ], - "gtk": [ - 65379, - 65438 - ], - "windows": [ - 45 - ] - } - }, - "home": { - "names": { - "domkey": "Home", - "android": [ - "MOVE_HOME" - ], - "english": "Home", - "chromium": "home", - "glfw": [ - "HOME" - ], - "gtk": [ - "Home", - "KP_Home" - ], - "windows": [ - "HOME" - ] - }, - "scanCodes": { - "android": [ - 102 - ], - "usb": 458826, - "linux": 102, - "xkb": 110, - "windows": 57415, - "macos": 115, - "ios": 74 - }, - "keyCodes": { - "android": [ - 122 - ], - "glfw": [ - 268 - ], - "gtk": [ - 65360, - 65429 - ], - "windows": [ - 36 - ] - } - }, - "pageUp": { - "names": { - "domkey": "PageUp", - "android": [ - "PAGE_UP" - ], - "english": "Page Up", - "chromium": "pageUp", - "glfw": [ - "PAGE_UP" - ], - "gtk": [ - "Page_Up", - "KP_Page_Up" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 104, - 177 - ], - "usb": 458827, - "linux": 104, - "xkb": 112, - "windows": 57417, - "macos": 116, - "ios": 75 - }, - "keyCodes": { - "android": [ - 92 - ], - "glfw": [ - 266 - ], - "gtk": [ - 65365, - 65434 - ], - "windows": null - } - }, - "delete": { - "names": { - "domkey": "Delete", - "android": [ - "FORWARD_DEL" - ], - "english": "Delete", - "chromium": "del", - "glfw": [ - "DELETE" - ], - "gtk": [ - "Delete", - "KP_Delete" - ], - "windows": [ - "DELETE" - ] - }, - "scanCodes": { - "android": [ - 111 - ], - "usb": 458828, - "linux": 111, - "xkb": 119, - "windows": 57427, - "macos": 117, - "ios": 76 - }, - "keyCodes": { - "android": [ - 112 - ], - "glfw": [ - 261 - ], - "gtk": [ - 65535, - 65439 - ], - "windows": [ - 46 - ] - } - }, - "end": { - "names": { - "domkey": "End", - "android": [ - "MOVE_END" - ], - "english": "End", - "chromium": "end", - "glfw": [ - "END" - ], - "gtk": [ - "End", - "KP_End" - ], - "windows": [ - "END" - ] - }, - "scanCodes": { - "android": [ - 107 - ], - "usb": 458829, - "linux": 107, - "xkb": 115, - "windows": 57423, - "macos": 119, - "ios": 77 - }, - "keyCodes": { - "android": [ - 123 - ], - "glfw": [ - 269 - ], - "gtk": [ - 65367, - 65436 - ], - "windows": [ - 35 - ] - } - }, - "pageDown": { - "names": { - "domkey": "PageDown", - "android": [ - "PAGE_DOWN" - ], - "english": "Page Down", - "chromium": "pageDown", - "glfw": [ - "PAGE_DOWN" - ], - "gtk": [ - "Page_Down", - "KP_Page_Down" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 109, - 178 - ], - "usb": 458830, - "linux": 109, - "xkb": 117, - "windows": 57425, - "macos": 121, - "ios": 78 - }, - "keyCodes": { - "android": [ - 93 - ], - "glfw": [ - 267 - ], - "gtk": [ - 65366, - 65435 - ], - "windows": null - } - }, - "arrowRight": { - "names": { - "domkey": "ArrowRight", - "android": [ - "DPAD_RIGHT" - ], - "english": "Arrow Right", - "chromium": "arrowRight", - "glfw": [ - "RIGHT" - ], - "gtk": [ - "Right", - "KP_Right" - ], - "windows": [ - "RIGHT" - ] - }, - "scanCodes": { - "android": [ - 106 - ], - "usb": 458831, - "linux": 106, - "xkb": 114, - "windows": 57421, - "macos": 124, - "ios": 79 - }, - "keyCodes": { - "android": [ - 22 - ], - "glfw": [ - 262 - ], - "gtk": [ - 65363, - 65432 - ], - "windows": [ - 39 - ] - } - }, - "arrowLeft": { - "names": { - "domkey": "ArrowLeft", - "android": [ - "DPAD_LEFT" - ], - "english": "Arrow Left", - "chromium": "arrowLeft", - "glfw": [ - "LEFT" - ], - "gtk": [ - "Left", - "KP_Left" - ], - "windows": [ - "LEFT" - ] - }, - "scanCodes": { - "android": [ - 105 - ], - "usb": 458832, - "linux": 105, - "xkb": 113, - "windows": 57419, - "macos": 123, - "ios": 80 - }, - "keyCodes": { - "android": [ - 21 - ], - "glfw": [ - 263 - ], - "gtk": [ - 65361, - 65430 - ], - "windows": [ - 37 - ] - } - }, - "arrowDown": { - "names": { - "domkey": "ArrowDown", - "android": [ - "DPAD_DOWN" - ], - "english": "Arrow Down", - "chromium": "arrowDown", - "glfw": [ - "DOWN" - ], - "gtk": [ - "Down", - "KP_Down" - ], - "windows": [ - "DOWN" - ] - }, - "scanCodes": { - "android": [ - 108 - ], - "usb": 458833, - "linux": 108, - "xkb": 116, - "windows": 57424, - "macos": 125, - "ios": 81 - }, - "keyCodes": { - "android": [ - 20 - ], - "glfw": [ - 264 - ], - "gtk": [ - 65364, - 65433 - ], - "windows": [ - 40 - ] - } - }, - "arrowUp": { - "names": { - "domkey": "ArrowUp", - "android": [ - "DPAD_UP" - ], - "english": "Arrow Up", - "chromium": "arrowUp", - "glfw": [ - "UP" - ], - "gtk": [ - "Up", - "KP_Up" - ], - "windows": [ - "UP" - ] - }, - "scanCodes": { - "android": [ - 103 - ], - "usb": 458834, - "linux": 103, - "xkb": 111, - "windows": 57416, - "macos": 126, - "ios": 82 - }, - "keyCodes": { - "android": [ - 19 - ], - "glfw": [ - 265 - ], - "gtk": [ - 65362, - 65431 - ], - "windows": [ - 38 - ] - } - }, - "numLock": { - "names": { - "domkey": "NumLock", - "android": [ - "NUM_LOCK" - ], - "english": "Num Lock", - "chromium": "numLock", - "glfw": [ - "NUM_LOCK" - ], - "gtk": [ - "Num_Lock" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 69 - ], - "usb": 458835, - "linux": 69, - "xkb": 77, - "windows": 57413, - "macos": 71, - "ios": 83 - }, - "keyCodes": { - "android": [ - 143 - ], - "glfw": [ - 282 - ], - "gtk": [ - 65407 - ], - "windows": null - } - }, - "numpadDivide": { - "names": { - "domkey": "NumpadDivide", - "android": [ - "NUMPAD_DIVIDE" - ], - "english": "Numpad Divide", - "chromium": "numpadDivide", - "glfw": [ - "KP_DIVIDE" - ], - "gtk": [ - "KP_Divide" - ], - "windows": [ - "DIVIDE" - ] - }, - "scanCodes": { - "android": [ - 98 - ], - "usb": 458836, - "linux": 98, - "xkb": 106, - "windows": 57397, - "macos": 75, - "ios": 84 - }, - "keyCodes": { - "android": [ - 154 - ], - "glfw": [ - 331 - ], - "gtk": [ - 65455 - ], - "windows": [ - 111 - ] - } - }, - "numpadMultiply": { - "names": { - "domkey": "NumpadMultiply", - "android": [ - "NUMPAD_MULTIPLY" - ], - "english": "Numpad Multiply", - "chromium": "numpadMultiply", - "glfw": [ - "KP_MULTIPLY" - ], - "gtk": [ - "KP_Multiply" - ], - "windows": [ - "MULTIPLY" - ] - }, - "scanCodes": { - "android": [ - 55 - ], - "usb": 458837, - "linux": 55, - "xkb": 63, - "windows": 55, - "macos": 67, - "ios": 85 - }, - "keyCodes": { - "android": [ - 155 - ], - "glfw": [ - 332 - ], - "gtk": [ - 65450 - ], - "windows": [ - 106 - ] - } - }, - "numpadSubtract": { - "names": { - "domkey": "NumpadSubtract", - "android": [ - "NUMPAD_SUBTRACT" - ], - "english": "Numpad Subtract", - "chromium": "numpadSubtract", - "glfw": [ - "NUMPAD_SUBTRACT" - ], - "gtk": [ - "KP_Subtract" - ], - "windows": [ - "SUBTRACT" - ] - }, - "scanCodes": { - "android": [ - 74 - ], - "usb": 458838, - "linux": 74, - "xkb": 82, - "windows": 74, - "macos": 78, - "ios": 86 - }, - "keyCodes": { - "android": [ - 156 - ], - "glfw": null, - "gtk": [ - 65453 - ], - "windows": [ - 109 - ] - } - }, - "numpadAdd": { - "names": { - "domkey": "NumpadAdd", - "android": [ - "NUMPAD_ADD" - ], - "english": "Numpad Add", - "chromium": "numpadAdd", - "glfw": [ - "KP_ADD" - ], - "gtk": [ - "KP_Add" - ], - "windows": [ - "ADD" - ] - }, - "scanCodes": { - "android": [ - 78 - ], - "usb": 458839, - "linux": 78, - "xkb": 86, - "windows": 78, - "macos": 69, - "ios": 87 - }, - "keyCodes": { - "android": [ - 157 - ], - "glfw": [ - 334 - ], - "gtk": [ - 65451 - ], - "windows": [ - 107 - ] - } - }, - "numpadEnter": { - "names": { - "domkey": "NumpadEnter", - "android": [ - "NUMPAD_ENTER" - ], - "english": "Numpad Enter", - "chromium": "numpadEnter", - "glfw": [ - "KP_ENTER" - ], - "gtk": [ - "KP_Enter" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 96 - ], - "usb": 458840, - "linux": 96, - "xkb": 104, - "windows": 57372, - "macos": 76, - "ios": 88 - }, - "keyCodes": { - "android": [ - 160 - ], - "glfw": [ - 335 - ], - "gtk": [ - 65421 - ], - "windows": null - } - }, - "numpad1": { - "names": { - "domkey": "Numpad1", - "android": [ - "NUMPAD_1" - ], - "english": "Numpad 1", - "chromium": "numpad1", - "glfw": [ - "KP_1" - ], - "gtk": [ - "KP_1" - ], - "windows": [ - "NUMPAD1" - ] - }, - "scanCodes": { - "android": [ - 79 - ], - "usb": 458841, - "linux": 79, - "xkb": 87, - "windows": 79, - "macos": 83, - "ios": 89 - }, - "keyCodes": { - "android": [ - 145 - ], - "glfw": [ - 321 - ], - "gtk": [ - 65457 - ], - "windows": [ - 97 - ] - } - }, - "numpad2": { - "names": { - "domkey": "Numpad2", - "android": [ - "NUMPAD_2" - ], - "english": "Numpad 2", - "chromium": "numpad2", - "glfw": [ - "KP_2" - ], - "gtk": [ - "KP_2" - ], - "windows": [ - "NUMPAD2" - ] - }, - "scanCodes": { - "android": [ - 80 - ], - "usb": 458842, - "linux": 80, - "xkb": 88, - "windows": 80, - "macos": 84, - "ios": 90 - }, - "keyCodes": { - "android": [ - 146 - ], - "glfw": [ - 322 - ], - "gtk": [ - 65458 - ], - "windows": [ - 98 - ] - } - }, - "numpad3": { - "names": { - "domkey": "Numpad3", - "android": [ - "NUMPAD_3" - ], - "english": "Numpad 3", - "chromium": "numpad3", - "glfw": [ - "KP_3" - ], - "gtk": [ - "KP_3" - ], - "windows": [ - "NUMPAD3" - ] - }, - "scanCodes": { - "android": [ - 81 - ], - "usb": 458843, - "linux": 81, - "xkb": 89, - "windows": 81, - "macos": 85, - "ios": 91 - }, - "keyCodes": { - "android": [ - 147 - ], - "glfw": [ - 323 - ], - "gtk": [ - 65459 - ], - "windows": [ - 99 - ] - } - }, - "numpad4": { - "names": { - "domkey": "Numpad4", - "android": [ - "NUMPAD_4" - ], - "english": "Numpad 4", - "chromium": "numpad4", - "glfw": [ - "KP_4" - ], - "gtk": [ - "KP_4" - ], - "windows": [ - "NUMPAD4" - ] - }, - "scanCodes": { - "android": [ - 75 - ], - "usb": 458844, - "linux": 75, - "xkb": 83, - "windows": 75, - "macos": 86, - "ios": 92 - }, - "keyCodes": { - "android": [ - 148 - ], - "glfw": [ - 324 - ], - "gtk": [ - 65460 - ], - "windows": [ - 100 - ] - } - }, - "numpad5": { - "names": { - "domkey": "Numpad5", - "android": [ - "NUMPAD_5" - ], - "english": "Numpad 5", - "chromium": "numpad5", - "glfw": [ - "KP_5" - ], - "gtk": [ - "KP_5" - ], - "windows": [ - "NUMPAD5" - ] - }, - "scanCodes": { - "android": [ - 76 - ], - "usb": 458845, - "linux": 76, - "xkb": 84, - "windows": 76, - "macos": 87, - "ios": 93 - }, - "keyCodes": { - "android": [ - 149 - ], - "glfw": [ - 325 - ], - "gtk": [ - 65461 - ], - "windows": [ - 101 - ] - } - }, - "numpad6": { - "names": { - "domkey": "Numpad6", - "android": [ - "NUMPAD_6" - ], - "english": "Numpad 6", - "chromium": "numpad6", - "glfw": [ - "KP_6" - ], - "gtk": [ - "KP_6" - ], - "windows": [ - "NUMPAD6" - ] - }, - "scanCodes": { - "android": [ - 77 - ], - "usb": 458846, - "linux": 77, - "xkb": 85, - "windows": 77, - "macos": 88, - "ios": 94 - }, - "keyCodes": { - "android": [ - 150 - ], - "glfw": [ - 326 - ], - "gtk": [ - 65462 - ], - "windows": [ - 102 - ] - } - }, - "numpad7": { - "names": { - "domkey": "Numpad7", - "android": [ - "NUMPAD_7" - ], - "english": "Numpad 7", - "chromium": "numpad7", - "glfw": [ - "KP_7" - ], - "gtk": [ - "KP_7" - ], - "windows": [ - "NUMPAD7" - ] - }, - "scanCodes": { - "android": [ - 71 - ], - "usb": 458847, - "linux": 71, - "xkb": 79, - "windows": 71, - "macos": 89, - "ios": 95 - }, - "keyCodes": { - "android": [ - 151 - ], - "glfw": [ - 327 - ], - "gtk": [ - 65463 - ], - "windows": [ - 103 - ] - } - }, - "numpad8": { - "names": { - "domkey": "Numpad8", - "android": [ - "NUMPAD_8" - ], - "english": "Numpad 8", - "chromium": "numpad8", - "glfw": [ - "KP_8" - ], - "gtk": [ - "KP_8" - ], - "windows": [ - "NUMPAD8" - ] - }, - "scanCodes": { - "android": [ - 72 - ], - "usb": 458848, - "linux": 72, - "xkb": 80, - "windows": 72, - "macos": 91, - "ios": 96 - }, - "keyCodes": { - "android": [ - 152 - ], - "glfw": [ - 328 - ], - "gtk": [ - 65464 - ], - "windows": [ - 104 - ] - } - }, - "numpad9": { - "names": { - "domkey": "Numpad9", - "android": [ - "NUMPAD_9" - ], - "english": "Numpad 9", - "chromium": "numpad9", - "glfw": [ - "KP_9" - ], - "gtk": [ - "KP_9" - ], - "windows": [ - "NUMPAD9" - ] - }, - "scanCodes": { - "android": [ - 73 - ], - "usb": 458849, - "linux": 73, - "xkb": 81, - "windows": 73, - "macos": 92, - "ios": 97 - }, - "keyCodes": { - "android": [ - 153 - ], - "glfw": [ - 329 - ], - "gtk": [ - 65465 - ], - "windows": [ - 105 - ] - } - }, - "numpad0": { - "names": { - "domkey": "Numpad0", - "android": [ - "NUMPAD_0" - ], - "english": "Numpad 0", - "chromium": "numpad0", - "glfw": [ - "KP_0" - ], - "gtk": [ - "KP_0" - ], - "windows": [ - "NUMPAD0" - ] - }, - "scanCodes": { - "android": [ - 82 - ], - "usb": 458850, - "linux": 82, - "xkb": 90, - "windows": 82, - "macos": 82, - "ios": 98 - }, - "keyCodes": { - "android": [ - 144 - ], - "glfw": [ - 320 - ], - "gtk": [ - 65456 - ], - "windows": [ - 96 - ] - } - }, - "numpadDecimal": { - "names": { - "domkey": "NumpadDecimal", - "android": [ - "NUMPAD_DOT" - ], - "english": "Numpad Decimal", - "chromium": "numpadDecimal", - "glfw": [ - "KP_DECIMAL" - ], - "gtk": [ - "KP_Decimal" - ], - "windows": [ - "DECIMAL" - ] - }, - "scanCodes": { - "android": [ - 83 - ], - "usb": 458851, - "linux": 83, - "xkb": 91, - "windows": 83, - "macos": 65, - "ios": 99 - }, - "keyCodes": { - "android": [ - 158 - ], - "glfw": [ - 330 - ], - "gtk": [ - 65454 - ], - "windows": [ - 110 - ] - } - }, - "intlBackslash": { - "names": { - "domkey": "IntlBackslash", - "android": null, - "english": "Intl Backslash", - "chromium": "intlBackslash", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 458852, - "linux": 86, - "xkb": 94, - "windows": 86, - "macos": 10, - "ios": 100 - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "contextMenu": { - "names": { - "domkey": "ContextMenu", - "android": [ - "MENU" - ], - "english": "Context Menu", - "chromium": "contextMenu", - "glfw": [ - "MENU" - ], - "gtk": [ - "Menu" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 127, - 139 - ], - "usb": 458853, - "linux": 127, - "xkb": 135, - "windows": 57437, - "macos": 110, - "ios": 101 - }, - "keyCodes": { - "android": [ - 82 - ], - "glfw": [ - 348 - ], - "gtk": [ - 65383 - ], - "windows": null - } - }, - "power": { - "names": { - "domkey": "Power", - "android": [ - "POWER" - ], - "english": "Power", - "chromium": "power", - "glfw": null, - "gtk": [ - "PowerOff" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 116, - 152 - ], - "usb": 458854, - "linux": 116, - "xkb": 124, - "windows": 57438, - "macos": null, - "ios": 102 - }, - "keyCodes": { - "android": [ - 26 - ], - "glfw": null, - "gtk": [ - 269025066 - ], - "windows": null - } - }, - "numpadEqual": { - "names": { - "domkey": "NumpadEqual", - "android": [ - "NUMPAD_EQUALS" - ], - "english": "Numpad Equal", - "chromium": "numpadEqual", - "glfw": [ - "KP_EQUAL" - ], - "gtk": [ - "KP_Equal" - ], - "windows": [ - "OEM_NEC_EQUAL" - ] - }, - "scanCodes": { - "android": [ - 117 - ], - "usb": 458855, - "linux": 117, - "xkb": 125, - "windows": 89, - "macos": 81, - "ios": 103 - }, - "keyCodes": { - "android": [ - 161 - ], - "glfw": [ - 336 - ], - "gtk": [ - 65469 - ], - "windows": [ - 146 - ] - } - }, - "f13": { - "names": { - "domkey": "F13", - "android": [ - "F13" - ], - "english": "F13", - "chromium": "f13", - "glfw": [ - "F13" - ], - "gtk": [ - "F13" - ], - "windows": [ - "F13" - ] - }, - "scanCodes": { - "android": [ - 183 - ], - "usb": 458856, - "linux": 183, - "xkb": 191, - "windows": 100, - "macos": 105, - "ios": 104 - }, - "keyCodes": { - "android": null, - "glfw": [ - 302 - ], - "gtk": [ - 65482 - ], - "windows": [ - 124 - ] - } - }, - "f14": { - "names": { - "domkey": "F14", - "android": [ - "F14" - ], - "english": "F14", - "chromium": "f14", - "glfw": [ - "F14" - ], - "gtk": [ - "F14" - ], - "windows": [ - "F14" - ] - }, - "scanCodes": { - "android": [ - 184 - ], - "usb": 458857, - "linux": 184, - "xkb": 192, - "windows": 101, - "macos": 107, - "ios": 105 - }, - "keyCodes": { - "android": null, - "glfw": [ - 303 - ], - "gtk": [ - 65483 - ], - "windows": [ - 125 - ] - } - }, - "f15": { - "names": { - "domkey": "F15", - "android": [ - "F15" - ], - "english": "F15", - "chromium": "f15", - "glfw": [ - "F15" - ], - "gtk": [ - "F15" - ], - "windows": [ - "F15" - ] - }, - "scanCodes": { - "android": [ - 185 - ], - "usb": 458858, - "linux": 185, - "xkb": 193, - "windows": 102, - "macos": 113, - "ios": 106 - }, - "keyCodes": { - "android": null, - "glfw": [ - 304 - ], - "gtk": [ - 65484 - ], - "windows": [ - 126 - ] - } - }, - "f16": { - "names": { - "domkey": "F16", - "android": [ - "F16" - ], - "english": "F16", - "chromium": "f16", - "glfw": [ - "F16" - ], - "gtk": [ - "F16" - ], - "windows": [ - "F16" - ] - }, - "scanCodes": { - "android": [ - 186 - ], - "usb": 458859, - "linux": 186, - "xkb": 194, - "windows": 103, - "macos": 106, - "ios": 107 - }, - "keyCodes": { - "android": null, - "glfw": [ - 305 - ], - "gtk": [ - 65485 - ], - "windows": [ - 127 - ] - } - }, - "f17": { - "names": { - "domkey": "F17", - "android": [ - "F17" - ], - "english": "F17", - "chromium": "f17", - "glfw": [ - "F17" - ], - "gtk": [ - "F17" - ], - "windows": [ - "F17" - ] - }, - "scanCodes": { - "android": [ - 187 - ], - "usb": 458860, - "linux": 187, - "xkb": 195, - "windows": 104, - "macos": 64, - "ios": 108 - }, - "keyCodes": { - "android": null, - "glfw": [ - 306 - ], - "gtk": [ - 65486 - ], - "windows": [ - 128 - ] - } - }, - "f18": { - "names": { - "domkey": "F18", - "android": [ - "F18" - ], - "english": "F18", - "chromium": "f18", - "glfw": [ - "F18" - ], - "gtk": [ - "F18" - ], - "windows": [ - "F18" - ] - }, - "scanCodes": { - "android": [ - 188 - ], - "usb": 458861, - "linux": 188, - "xkb": 196, - "windows": 105, - "macos": 79, - "ios": 109 - }, - "keyCodes": { - "android": null, - "glfw": [ - 307 - ], - "gtk": [ - 65487 - ], - "windows": [ - 129 - ] - } - }, - "f19": { - "names": { - "domkey": "F19", - "android": [ - "F19" - ], - "english": "F19", - "chromium": "f19", - "glfw": [ - "F19" - ], - "gtk": [ - "F19" - ], - "windows": [ - "F19" - ] - }, - "scanCodes": { - "android": [ - 189 - ], - "usb": 458862, - "linux": 189, - "xkb": 197, - "windows": 106, - "macos": 80, - "ios": 110 - }, - "keyCodes": { - "android": null, - "glfw": [ - 308 - ], - "gtk": [ - 65488 - ], - "windows": [ - 130 - ] - } - }, - "f20": { - "names": { - "domkey": "F20", - "android": [ - "F20" - ], - "english": "F20", - "chromium": "f20", - "glfw": [ - "F20" - ], - "gtk": [ - "F20" - ], - "windows": [ - "F20" - ] - }, - "scanCodes": { - "android": [ - 190 - ], - "usb": 458863, - "linux": 190, - "xkb": 198, - "windows": 107, - "macos": 90, - "ios": 111 - }, - "keyCodes": { - "android": null, - "glfw": [ - 309 - ], - "gtk": [ - 65489 - ], - "windows": [ - 131 - ] - } - }, - "f21": { - "names": { - "domkey": "F21", - "android": [ - "F21" - ], - "english": "F21", - "chromium": "f21", - "glfw": [ - "F21" - ], - "gtk": [ - "F21" - ], - "windows": [ - "F21" - ] - }, - "scanCodes": { - "android": [ - 191 - ], - "usb": 458864, - "linux": 191, - "xkb": 199, - "windows": 108, - "macos": null, - "ios": 112 - }, - "keyCodes": { - "android": null, - "glfw": [ - 310 - ], - "gtk": [ - 65490 - ], - "windows": [ - 132 - ] - } - }, - "f22": { - "names": { - "domkey": "F22", - "android": [ - "F22" - ], - "english": "F22", - "chromium": "f22", - "glfw": [ - "F22" - ], - "gtk": [ - "F22" - ], - "windows": [ - "F22" - ] - }, - "scanCodes": { - "android": [ - 192 - ], - "usb": 458865, - "linux": 192, - "xkb": 200, - "windows": 109, - "macos": null, - "ios": 113 - }, - "keyCodes": { - "android": null, - "glfw": [ - 311 - ], - "gtk": [ - 65491 - ], - "windows": [ - 133 - ] - } - }, - "f23": { - "names": { - "domkey": "F23", - "android": [ - "F23" - ], - "english": "F23", - "chromium": "f23", - "glfw": [ - "F23" - ], - "gtk": [ - "F23" - ], - "windows": [ - "F23" - ] - }, - "scanCodes": { - "android": [ - 193 - ], - "usb": 458866, - "linux": 193, - "xkb": 201, - "windows": 110, - "macos": null, - "ios": 114 - }, - "keyCodes": { - "android": null, - "glfw": [ - 312 - ], - "gtk": [ - 65492 - ], - "windows": [ - 134 - ] - } - }, - "f24": { - "names": { - "domkey": "F24", - "android": [ - "F24" - ], - "english": "F24", - "chromium": "f24", - "glfw": null, - "gtk": [ - "F24" - ], - "windows": [ - "F24" - ] - }, - "scanCodes": { - "android": [ - 194 - ], - "usb": 458867, - "linux": 194, - "xkb": 202, - "windows": 118, - "macos": null, - "ios": 115 - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": [ - 65493 - ], - "windows": [ - 135 - ] - } - }, - "open": { - "names": { - "domkey": "Open", - "android": [ - "OPEN" - ], - "english": "Open", - "chromium": "open", - "glfw": null, - "gtk": [ - "Open" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 134 - ], - "usb": 458868, - "linux": 134, - "xkb": 142, - "windows": null, - "macos": null, - "ios": 116 - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": [ - 269025131 - ], - "windows": null - } - }, - "help": { - "names": { - "domkey": "Help", - "android": [ - "HELP" - ], - "english": "Help", - "chromium": "help", - "glfw": null, - "gtk": [ - "Help" - ], - "windows": [ - "HELP" - ] - }, - "scanCodes": { - "android": [ - 138 - ], - "usb": 458869, - "linux": 138, - "xkb": 146, - "windows": 57403, - "macos": null, - "ios": 117 - }, - "keyCodes": { - "android": [ - 259 - ], - "glfw": null, - "gtk": [ - 65386 - ], - "windows": [ - 47 - ] - } - }, - "select": { - "names": { - "domkey": "Select", - "android": [ - "DPAD_CENTER" - ], - "english": "Select", - "chromium": "select", - "glfw": null, - "gtk": [ - "Select" - ], - "windows": [ - "SELECT" - ] - }, - "scanCodes": { - "android": [ - 353 - ], - "usb": 458871, - "linux": 132, - "xkb": 140, - "windows": null, - "macos": null, - "ios": 119 - }, - "keyCodes": { - "android": [ - 23 - ], - "glfw": null, - "gtk": [ - 65376 - ], - "windows": [ - 41 - ] - } - }, - "again": { - "names": { - "domkey": "Again", - "android": [ - "AGAIN" - ], - "english": "Again", - "chromium": "again", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 129 - ], - "usb": 458873, - "linux": 129, - "xkb": 137, - "windows": null, - "macos": null, - "ios": 121 - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "undo": { - "names": { - "domkey": "Undo", - "android": [ - "UNDO" - ], - "english": "Undo", - "chromium": "undo", - "glfw": null, - "gtk": [ - "Undo" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 131 - ], - "usb": 458874, - "linux": 131, - "xkb": 139, - "windows": 57352, - "macos": null, - "ios": 122 - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": [ - 65381 - ], - "windows": null - } - }, - "cut": { - "names": { - "domkey": "Cut", - "android": [ - "CUT" - ], - "english": "Cut", - "chromium": "cut", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 137 - ], - "usb": 458875, - "linux": 137, - "xkb": 145, - "windows": 57367, - "macos": null, - "ios": 123 - }, - "keyCodes": { - "android": [ - 277 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "copy": { - "names": { - "domkey": "Copy", - "android": [ - "COPY" - ], - "english": "Copy", - "chromium": "copy", - "glfw": null, - "gtk": [ - "Copy", - "3270_Copy" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 133 - ], - "usb": 458876, - "linux": 133, - "xkb": 141, - "windows": 57368, - "macos": null, - "ios": 124 - }, - "keyCodes": { - "android": [ - 278 - ], - "glfw": null, - "gtk": [ - 269025111, - 64789 - ], - "windows": null - } - }, - "paste": { - "names": { - "domkey": "Paste", - "android": [ - "PASTE" - ], - "english": "Paste", - "chromium": "paste", - "glfw": null, - "gtk": [ - "Paste" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 135 - ], - "usb": 458877, - "linux": 135, - "xkb": 143, - "windows": 57354, - "macos": null, - "ios": 125 - }, - "keyCodes": { - "android": [ - 279 - ], - "glfw": null, - "gtk": [ - 269025133 - ], - "windows": null - } - }, - "find": { - "names": { - "domkey": "Find", - "android": [ - "FIND" - ], - "english": "Find", - "chromium": "find", - "glfw": null, - "gtk": [ - "Find" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 136 - ], - "usb": 458878, - "linux": 136, - "xkb": 144, - "windows": null, - "macos": null, - "ios": 126 - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": [ - 65384 - ], - "windows": null - } - }, - "audioVolumeMute": { - "names": { - "domkey": "AudioVolumeMute", - "android": [ - "VOLUME_MUTE" - ], - "english": "Audio Volume Mute", - "chromium": "volumeMute", - "glfw": null, - "gtk": [ - "AudioMute" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 113 - ], - "usb": 458879, - "linux": 113, - "xkb": 121, - "windows": 57376, - "macos": 74, - "ios": 127 - }, - "keyCodes": { - "android": [ - 164 - ], - "glfw": null, - "gtk": [ - 269025042 - ], - "windows": null - } - }, - "audioVolumeUp": { - "names": { - "domkey": "AudioVolumeUp", - "android": [ - "VOLUME_UP" - ], - "english": "Audio Volume Up", - "chromium": "volumeUp", - "glfw": null, - "gtk": [ - "AudioRaiseVolume" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 115 - ], - "usb": 458880, - "linux": 115, - "xkb": 123, - "windows": 57392, - "macos": 72, - "ios": 128 - }, - "keyCodes": { - "android": [ - 24 - ], - "glfw": null, - "gtk": [ - 269025043 - ], - "windows": null - } - }, - "audioVolumeDown": { - "names": { - "domkey": "AudioVolumeDown", - "android": [ - "VOLUME_DOWN" - ], - "english": "Audio Volume Down", - "chromium": "volumeDown", - "glfw": null, - "gtk": [ - "AudioLowerVolume" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 114 - ], - "usb": 458881, - "linux": 114, - "xkb": 122, - "windows": 57390, - "macos": 73, - "ios": 129 - }, - "keyCodes": { - "android": [ - 25 - ], - "glfw": null, - "gtk": [ - 269025041 - ], - "windows": null - } - }, - "numpadComma": { - "names": { - "domkey": "NumpadComma", - "android": [ - "NUMPAD_COMMA" - ], - "english": "Numpad Comma", - "chromium": "numpadComma", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 95, - 121 - ], - "usb": 458885, - "linux": 121, - "xkb": 129, - "windows": 126, - "macos": 95, - "ios": 133 - }, - "keyCodes": { - "android": [ - 159 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "intlRo": { - "names": { - "domkey": "IntlRo", - "android": null, - "english": "Intl Ro", - "chromium": "intlRo", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 458887, - "linux": 89, - "xkb": 97, - "windows": 115, - "macos": 94, - "ios": 135 - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "kanaMode": { - "names": { - "domkey": "KanaMode", - "android": null, - "english": "Kana Mode", - "chromium": "kanaMode", - "glfw": null, - "gtk": [ - "kana_switch" - ], - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 458888, - "linux": 93, - "xkb": 101, - "windows": 112, - "macos": null, - "ios": 136 - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": [ - 65406 - ], - "windows": null - } - }, - "intlYen": { - "names": { - "domkey": "IntlYen", - "android": null, - "english": "Intl Yen", - "chromium": "intlYen", - "glfw": null, - "gtk": [ - "yen" - ], - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 458889, - "linux": 124, - "xkb": 132, - "windows": 125, - "macos": 93, - "ios": 137 - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": [ - 165 - ], - "windows": null - } - }, - "convert": { - "names": { - "domkey": "Convert", - "android": [ - "HENKAN" - ], - "english": "Convert", - "chromium": "convert", - "glfw": null, - "gtk": null, - "windows": [ - "CONVERT" - ] - }, - "scanCodes": { - "android": [ - 92 - ], - "usb": 458890, - "linux": 92, - "xkb": 100, - "windows": 121, - "macos": null, - "ios": 138 - }, - "keyCodes": { - "android": [ - 214 - ], - "glfw": null, - "gtk": null, - "windows": [ - 28 - ] - } - }, - "nonConvert": { - "names": { - "domkey": "NonConvert", - "android": [ - "MUHENKAN" - ], - "english": "Non Convert", - "chromium": "nonConvert", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 94 - ], - "usb": 458891, - "linux": 94, - "xkb": 102, - "windows": 123, - "macos": null, - "ios": 139 - }, - "keyCodes": { - "android": [ - 213 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "lang1": { - "names": { - "domkey": "Lang1", - "android": null, - "english": "Lang 1", - "chromium": "lang1", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 458896, - "linux": 122, - "xkb": 130, - "windows": 114, - "macos": 104, - "ios": 144 - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "lang2": { - "names": { - "domkey": "Lang2", - "android": null, - "english": "Lang 2", - "chromium": "lang2", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 458897, - "linux": 123, - "xkb": 131, - "windows": 113, - "macos": 102, - "ios": 145 - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "lang3": { - "names": { - "domkey": "Lang3", - "android": [ - "KATAKANA" - ], - "english": "Lang 3", - "chromium": "lang3", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 90 - ], - "usb": 458898, - "linux": 90, - "xkb": 98, - "windows": 120, - "macos": null, - "ios": 146 - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "lang4": { - "names": { - "domkey": "Lang4", - "android": [ - "HIRAGANA" - ], - "english": "Lang 4", - "chromium": "lang4", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 91 - ], - "usb": 458899, - "linux": 91, - "xkb": 99, - "windows": 119, - "macos": null, - "ios": 147 - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "lang5": { - "names": { - "domkey": "Lang5", - "android": null, - "english": "Lang 5", - "chromium": "lang5", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 458900, - "linux": 85, - "xkb": 93, - "windows": null, - "macos": null, - "ios": 148 - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "abort": { - "names": { - "domkey": "Abort", - "android": null, - "english": "Abort", - "chromium": "abort", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 458907, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": 155 - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "props": { - "names": { - "domkey": "Props", - "android": [ - "PROPS" - ], - "english": "Props", - "chromium": "props", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 130 - ], - "usb": 458915, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": 163 - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "numpadParenLeft": { - "names": { - "domkey": "NumpadParenLeft", - "android": [ - "NUMPAD_LEFT_PAREN" - ], - "english": "Numpad Paren Left", - "chromium": "numpadParenLeft", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 179 - ], - "usb": 458934, - "linux": 179, - "xkb": 187, - "windows": null, - "macos": null, - "ios": 182 - }, - "keyCodes": { - "android": [ - 162 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "numpadParenRight": { - "names": { - "domkey": "NumpadParenRight", - "android": [ - "NUMPAD_RIGHT_PAREN" - ], - "english": "Numpad Paren Right", - "chromium": "numpadParenRight", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 180 - ], - "usb": 458935, - "linux": 180, - "xkb": 188, - "windows": null, - "macos": null, - "ios": 183 - }, - "keyCodes": { - "android": [ - 163 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "numpadBackspace": { - "names": { - "domkey": "NumpadBackspace", - "android": null, - "english": "Numpad Backspace", - "chromium": "numpadBackspace", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 458939, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": 187 - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "numpadMemoryStore": { - "names": { - "domkey": "NumpadMemoryStore", - "android": null, - "english": "Numpad Memory Store", - "chromium": "numpadMemoryStore", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 458960, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": 208 - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "numpadMemoryRecall": { - "names": { - "domkey": "NumpadMemoryRecall", - "android": null, - "english": "Numpad Memory Recall", - "chromium": "numpadMemoryRecall", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 458961, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": 209 - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "numpadMemoryClear": { - "names": { - "domkey": "NumpadMemoryClear", - "android": null, - "english": "Numpad Memory Clear", - "chromium": "numpadMemoryClear", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 458962, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": 210 - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "numpadMemoryAdd": { - "names": { - "domkey": "NumpadMemoryAdd", - "android": null, - "english": "Numpad Memory Add", - "chromium": "numpadMemoryAdd", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 458963, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": 211 - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "numpadMemorySubtract": { - "names": { - "domkey": "NumpadMemorySubtract", - "android": null, - "english": "Numpad Memory Subtract", - "chromium": "numpadMemorySubtract", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 458964, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": 212 - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "numpadSignChange": { - "names": { - "domkey": null, - "android": null, - "english": "Numpad Sign Change", - "chromium": "numpadSignChange", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 458967, - "linux": 118, - "xkb": 126, - "windows": null, - "macos": null, - "ios": 215 - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "numpadClear": { - "names": { - "domkey": "NumpadClear", - "android": null, - "english": "Numpad Clear", - "chromium": "numpadClear", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 458968, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": 216 - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "numpadClearEntry": { - "names": { - "domkey": "NumpadClearEntry", - "android": null, - "english": "Numpad Clear Entry", - "chromium": "numpadClearEntry", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 458969, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": 217 - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "controlLeft": { - "names": { - "domkey": "ControlLeft", - "android": [ - "CTRL_LEFT" - ], - "english": "Control Left", - "chromium": "controlLeft", - "glfw": [ - "LEFT_CONTROL" - ], - "gtk": [ - "Control_L" - ], - "windows": [ - "LCONTROL" - ] - }, - "scanCodes": { - "android": [ - 29 - ], - "usb": 458976, - "linux": 29, - "xkb": 37, - "windows": 29, - "macos": 59, - "ios": 224 - }, - "keyCodes": { - "android": [ - 113 - ], - "glfw": [ - 341 - ], - "gtk": [ - 65507 - ], - "windows": [ - 162 - ] - } - }, - "shiftLeft": { - "names": { - "domkey": "ShiftLeft", - "android": [ - "SHIFT_LEFT" - ], - "english": "Shift Left", - "chromium": "shiftLeft", - "glfw": [ - "LEFT_SHIFT" - ], - "gtk": [ - "Shift_L" - ], - "windows": [ - "LSHIFT" - ] - }, - "scanCodes": { - "android": [ - 42 - ], - "usb": 458977, - "linux": 42, - "xkb": 50, - "windows": 42, - "macos": 56, - "ios": 225 - }, - "keyCodes": { - "android": [ - 59 - ], - "glfw": [ - 340 - ], - "gtk": [ - 65505 - ], - "windows": [ - 160 - ] - } - }, - "altLeft": { - "names": { - "domkey": "AltLeft", - "android": [ - "ALT_LEFT" - ], - "english": "Alt Left", - "chromium": "altLeft", - "glfw": [ - "LEFT_ALT" - ], - "gtk": [ - "Alt_L" - ], - "windows": [ - "LMENU" - ] - }, - "scanCodes": { - "android": [ - 56 - ], - "usb": 458978, - "linux": 56, - "xkb": 64, - "windows": 56, - "macos": 58, - "ios": 226 - }, - "keyCodes": { - "android": [ - 57 - ], - "glfw": [ - 342 - ], - "gtk": [ - 65513 - ], - "windows": [ - 164 - ] - } - }, - "metaLeft": { - "names": { - "domkey": "MetaLeft", - "android": [ - "META_LEFT" - ], - "english": "Meta Left", - "chromium": "metaLeft", - "glfw": [ - "LEFT_SUPER" - ], - "gtk": [ - "Meta_L" - ], - "windows": [ - "LWIN" - ] - }, - "scanCodes": { - "android": [ - 125 - ], - "usb": 458979, - "linux": 125, - "xkb": 133, - "windows": 57435, - "macos": 55, - "ios": 227 - }, - "keyCodes": { - "android": [ - 117 - ], - "glfw": [ - 343 - ], - "gtk": [ - 65511 - ], - "windows": [ - 91 - ] - } - }, - "controlRight": { - "names": { - "domkey": "ControlRight", - "android": [ - "CTRL_RIGHT" - ], - "english": "Control Right", - "chromium": "controlRight", - "glfw": [ - "RIGHT_CONTROL" - ], - "gtk": [ - "Control_R" - ], - "windows": [ - "RCONTROL" - ] - }, - "scanCodes": { - "android": [ - 97 - ], - "usb": 458980, - "linux": 97, - "xkb": 105, - "windows": 57373, - "macos": 62, - "ios": 228 - }, - "keyCodes": { - "android": [ - 114 - ], - "glfw": [ - 345 - ], - "gtk": [ - 65508 - ], - "windows": [ - 163 - ] - } - }, - "shiftRight": { - "names": { - "domkey": "ShiftRight", - "android": [ - "SHIFT_RIGHT" - ], - "english": "Shift Right", - "chromium": "shiftRight", - "glfw": [ - "RIGHT_SHIFT" - ], - "gtk": [ - "Shift_R" - ], - "windows": [ - "RSHIFT" - ] - }, - "scanCodes": { - "android": [ - 54 - ], - "usb": 458981, - "linux": 54, - "xkb": 62, - "windows": 54, - "macos": 60, - "ios": 229 - }, - "keyCodes": { - "android": [ - 60 - ], - "glfw": [ - 344 - ], - "gtk": [ - 65506 - ], - "windows": [ - 161 - ] - } - }, - "altRight": { - "names": { - "domkey": "AltRight", - "android": [ - "ALT_RIGHT" - ], - "english": "Alt Right", - "chromium": "altRight", - "glfw": [ - "RIGHT_ALT" - ], - "gtk": [ - "Alt_R", - "ISO_Level3_Shift" - ], - "windows": [ - "RMENU" - ] - }, - "scanCodes": { - "android": [ - 100 - ], - "usb": 458982, - "linux": 100, - "xkb": 108, - "windows": 57400, - "macos": 61, - "ios": 230 - }, - "keyCodes": { - "android": [ - 58 - ], - "glfw": [ - 346 - ], - "gtk": [ - 65514, - 65027 - ], - "windows": [ - 165 - ] - } - }, - "metaRight": { - "names": { - "domkey": "MetaRight", - "android": [ - "META_RIGHT" - ], - "english": "Meta Right", - "chromium": "metaRight", - "glfw": [ - "RIGHT_SUPER" - ], - "gtk": [ - "Meta_R" - ], - "windows": [ - "RWIN" - ] - }, - "scanCodes": { - "android": [ - 126 - ], - "usb": 458983, - "linux": 126, - "xkb": 134, - "windows": 57436, - "macos": 54, - "ios": 231 - }, - "keyCodes": { - "android": [ - 118 - ], - "glfw": [ - 347 - ], - "gtk": [ - 65512 - ], - "windows": [ - 92 - ] - } - }, - "info": { - "names": { - "domkey": null, - "android": [ - "INFO" - ], - "english": "Info", - "chromium": "info", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 358 - ], - "usb": 786528, - "linux": 358, - "xkb": 366, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 165 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "closedCaptionToggle": { - "names": { - "domkey": null, - "android": [ - "CAPTIONS" - ], - "english": "Closed Caption Toggle", - "chromium": "closedCaptionToggle", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 370 - ], - "usb": 786529, - "linux": 370, - "xkb": 378, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 175 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "brightnessUp": { - "names": { - "domkey": "BrightnessUp", - "android": [ - "BRIGHTNESS_UP" - ], - "english": "Brightness Up", - "chromium": "brightnessUp", - "glfw": null, - "gtk": [ - "MonBrightnessUp" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 225 - ], - "usb": 786543, - "linux": 225, - "xkb": 233, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 221 - ], - "glfw": null, - "gtk": [ - 269025026 - ], - "windows": null - } - }, - "brightnessDown": { - "names": { - "domkey": "BrightnessDown", - "android": [ - "BRIGHTNESS_DOWN" - ], - "english": "Brightness Down", - "chromium": "brightnessDown", - "glfw": null, - "gtk": [ - "MonBrightnessDown" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 224 - ], - "usb": 786544, - "linux": 224, - "xkb": 232, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 220 - ], - "glfw": null, - "gtk": [ - 269025027 - ], - "windows": null - } - }, - "brightnessToggle": { - "names": { - "domkey": null, - "android": null, - "english": "Brightness Toggle", - "chromium": "brightnessToggle", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 786546, - "linux": 431, - "xkb": 439, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "brightnessMinimum": { - "names": { - "domkey": null, - "android": null, - "english": "Brightness Minimum", - "chromium": "brightnessMinimum", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 786547, - "linux": 592, - "xkb": 600, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "brightnessMaximum": { - "names": { - "domkey": null, - "android": null, - "english": "Brightness Maximum", - "chromium": "brightnessMaximum", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 786548, - "linux": 593, - "xkb": 601, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "brightnessAuto": { - "names": { - "domkey": null, - "android": null, - "english": "Brightness Auto", - "chromium": "brightnessAuto", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 786549, - "linux": 244, - "xkb": 252, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "kbdIllumUp": { - "names": { - "domkey": null, - "android": null, - "english": "Kbd Illum Up", - "chromium": "kbdIllumUp", - "glfw": null, - "gtk": [ - "KbdBrightnessUp" - ], - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 786553, - "linux": 230, - "xkb": 238, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": [ - 269025029 - ], - "windows": null - } - }, - "kbdIllumDown": { - "names": { - "domkey": null, - "android": null, - "english": "Kbd Illum Down", - "chromium": "kbdIllumDown", - "glfw": null, - "gtk": [ - "KbdBrightnessDown" - ], - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 786554, - "linux": 229, - "xkb": 237, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": [ - 269025030 - ], - "windows": null - } - }, - "mediaLast": { - "names": { - "domkey": null, - "android": [ - "LAST_CHANNEL" - ], - "english": "Media Last", - "chromium": "mediaLast", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 405 - ], - "usb": 786563, - "linux": 405, - "xkb": 413, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 229 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "launchPhone": { - "names": { - "domkey": null, - "android": null, - "english": "Launch Phone", - "chromium": "launchPhone", - "glfw": null, - "gtk": [ - "Phone" - ], - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 786572, - "linux": 169, - "xkb": 177, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": [ - 269025134 - ], - "windows": null - } - }, - "programGuide": { - "names": { - "domkey": null, - "android": null, - "english": "Program Guide", - "chromium": "programGuide", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 786573, - "linux": 362, - "xkb": 370, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "exit": { - "names": { - "domkey": null, - "android": [ - "EXIT" - ], - "english": "Exit", - "chromium": "exit", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 174 - ], - "usb": 786580, - "linux": 174, - "xkb": 182, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "channelUp": { - "names": { - "domkey": null, - "android": [ - "CHANNEL_UP" - ], - "english": "Channel Up", - "chromium": "channelUp", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 402 - ], - "usb": 786588, - "linux": 410, - "xkb": 418, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 166 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "channelDown": { - "names": { - "domkey": null, - "android": [ - "CHANNEL_DOWN" - ], - "english": "Channel Down", - "chromium": "channelDown", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 403 - ], - "usb": 786589, - "linux": 411, - "xkb": 419, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 167 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "mediaPlay": { - "names": { - "domkey": "MediaPlay", - "android": [ - "MEDIA_PLAY" - ], - "english": "Media Play", - "chromium": "mediaPlay", - "glfw": null, - "gtk": [ - "AudioPlay", - "3270_Play" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 200, - 207 - ], - "usb": 786608, - "linux": 207, - "xkb": 215, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 126 - ], - "glfw": null, - "gtk": [ - 269025044, - 64790 - ], - "windows": null - } - }, - "mediaPause": { - "names": { - "domkey": "MediaPause", - "android": [ - "MEDIA_PAUSE" - ], - "english": "Media Pause", - "chromium": "mediaPause", - "glfw": null, - "gtk": [ - "AudioPause" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 201 - ], - "usb": 786609, - "linux": 201, - "xkb": 209, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 127 - ], - "glfw": null, - "gtk": [ - 269025073 - ], - "windows": null - } - }, - "mediaRecord": { - "names": { - "domkey": "MediaRecord", - "android": [ - "MEDIA_RECORD" - ], - "english": "Media Record", - "chromium": "mediaRecord", - "glfw": null, - "gtk": [ - "AudioRecord" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 167 - ], - "usb": 786610, - "linux": 167, - "xkb": 175, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 130 - ], - "glfw": null, - "gtk": [ - 269025052 - ], - "windows": null - } - }, - "mediaFastForward": { - "names": { - "domkey": "MediaFastForward", - "android": [ - "MEDIA_FAST_FORWARD" - ], - "english": "Media Fast Forward", - "chromium": "mediaFastForward", - "glfw": null, - "gtk": [ - "AudioForward" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 208 - ], - "usb": 786611, - "linux": 208, - "xkb": 216, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 90 - ], - "glfw": null, - "gtk": [ - 269025175 - ], - "windows": null - } - }, - "mediaRewind": { - "names": { - "domkey": "MediaRewind", - "android": [ - "MEDIA_REWIND" - ], - "english": "Media Rewind", - "chromium": "mediaRewind", - "glfw": null, - "gtk": [ - "AudioRewind" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 168 - ], - "usb": 786612, - "linux": 168, - "xkb": 176, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 89 - ], - "glfw": null, - "gtk": [ - 269025086 - ], - "windows": null - } - }, - "mediaTrackNext": { - "names": { - "domkey": "MediaTrackNext", - "android": [ - "MEDIA_NEXT" - ], - "english": "Media Track Next", - "chromium": "mediaTrackNext", - "glfw": null, - "gtk": [ - "AudioNext" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 163 - ], - "usb": 786613, - "linux": 163, - "xkb": 171, - "windows": 57369, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 87 - ], - "glfw": null, - "gtk": [ - 269025047 - ], - "windows": null - } - }, - "mediaTrackPrevious": { - "names": { - "domkey": "MediaTrackPrevious", - "android": [ - "MEDIA_PREVIOUS" - ], - "english": "Media Track Previous", - "chromium": "mediaTrackPrevious", - "glfw": null, - "gtk": [ - "AudioPrev" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 165 - ], - "usb": 786614, - "linux": 165, - "xkb": 173, - "windows": 57360, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 88 - ], - "glfw": null, - "gtk": [ - 269025046 - ], - "windows": null - } - }, - "mediaStop": { - "names": { - "domkey": "MediaStop", - "android": [ - "MEDIA_STOP" - ], - "english": "Media Stop", - "chromium": "mediaStop", - "glfw": null, - "gtk": [ - "AudioStop" - ], - "windows": [ - "MEDIA_STOP" - ] - }, - "scanCodes": { - "android": [ - 128, - 166 - ], - "usb": 786615, - "linux": 166, - "xkb": 174, - "windows": 57380, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 86 - ], - "glfw": null, - "gtk": [ - 269025045 - ], - "windows": [ - 178 - ] - } - }, - "eject": { - "names": { - "domkey": "Eject", - "android": [ - "MEDIA_EJECT" - ], - "english": "Eject", - "chromium": "eject", - "glfw": null, - "gtk": [ - "Eject" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 161, - 162 - ], - "usb": 786616, - "linux": 161, - "xkb": 169, - "windows": 57388, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 129 - ], - "glfw": null, - "gtk": [ - 269025068 - ], - "windows": null - } - }, - "mediaPlayPause": { - "names": { - "domkey": "MediaPlayPause", - "android": [ - "MEDIA_PLAY_PAUSE" - ], - "english": "Media Play Pause", - "chromium": "mediaPlayPause", - "glfw": null, - "gtk": null, - "windows": [ - "MEDIA_PLAY_PAUSE" - ] - }, - "scanCodes": { - "android": [ - 164 - ], - "usb": 786637, - "linux": 164, - "xkb": 172, - "windows": 57378, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 85 - ], - "glfw": null, - "gtk": null, - "windows": [ - 179 - ] - } - }, - "speechInputToggle": { - "names": { - "domkey": null, - "android": null, - "english": "Speech Input Toggle", - "chromium": "speechInputToggle", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 786639, - "linux": 582, - "xkb": 590, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "bassBoost": { - "names": { - "domkey": null, - "android": [ - "BASSBOOST" - ], - "english": "Bass Boost", - "chromium": "bassBoost", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 209 - ], - "usb": 786661, - "linux": 209, - "xkb": 217, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "mediaSelect": { - "names": { - "domkey": "MediaSelect", - "android": null, - "english": "Media Select", - "chromium": "mediaSelect", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 786819, - "linux": 171, - "xkb": 179, - "windows": 57453, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "launchWordProcessor": { - "names": { - "domkey": null, - "android": null, - "english": "Launch Word Processor", - "chromium": "launchWordProcessor", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 786820, - "linux": 421, - "xkb": 429, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "launchSpreadsheet": { - "names": { - "domkey": null, - "android": null, - "english": "Launch Spreadsheet", - "chromium": "launchSpreadsheet", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 786822, - "linux": 423, - "xkb": 431, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "launchMail": { - "names": { - "domkey": "LaunchMail", - "android": [ - "ENVELOPE" - ], - "english": "Launch Mail", - "chromium": "launchMail", - "glfw": null, - "gtk": [ - "Mail" - ], - "windows": [ - "LAUNCH_MAIL" - ] - }, - "scanCodes": { - "android": [ - 155, - 215 - ], - "usb": 786826, - "linux": 155, - "xkb": 163, - "windows": 57452, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 65 - ], - "glfw": null, - "gtk": [ - 269025049 - ], - "windows": [ - 180 - ] - } - }, - "launchContacts": { - "names": { - "domkey": null, - "android": [ - "CONTACTS" - ], - "english": "Launch Contacts", - "chromium": "launchContacts", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 429 - ], - "usb": 786829, - "linux": 429, - "xkb": 437, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 207 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "launchCalendar": { - "names": { - "domkey": null, - "android": [ - "CALENDAR" - ], - "english": "Launch Calendar", - "chromium": "launchCalendar", - "glfw": null, - "gtk": [ - "Calendar" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 397 - ], - "usb": 786830, - "linux": 397, - "xkb": 405, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 208 - ], - "glfw": null, - "gtk": [ - 269025056 - ], - "windows": null - } - }, - "launchApp2": { - "names": { - "domkey": "LaunchApp2", - "android": null, - "english": "Launch App2", - "chromium": "launchApp2", - "glfw": null, - "gtk": null, - "windows": [ - "LAUNCH_APP2" - ] - }, - "scanCodes": { - "android": null, - "usb": 786834, - "linux": 140, - "xkb": 148, - "windows": 57377, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": [ - 183 - ] - } - }, - "launchApp1": { - "names": { - "domkey": "LaunchApp1", - "android": null, - "english": "Launch App1", - "chromium": "launchApp1", - "glfw": null, - "gtk": null, - "windows": [ - "LAUNCH_APP1" - ] - }, - "scanCodes": { - "android": null, - "usb": 786836, - "linux": 144, - "xkb": 152, - "windows": 57451, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": [ - 182 - ] - } - }, - "launchInternetBrowser": { - "names": { - "domkey": null, - "android": null, - "english": "Launch Internet Browser", - "chromium": "launchInternetBrowser", - "glfw": null, - "gtk": [ - "WWW" - ], - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 786838, - "linux": 150, - "xkb": 158, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": [ - 269025070 - ], - "windows": null - } - }, - "logOff": { - "names": { - "domkey": null, - "android": null, - "english": "Log Off", - "chromium": "logOff", - "glfw": null, - "gtk": [ - "LogOff" - ], - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 786844, - "linux": 433, - "xkb": 441, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": [ - 269025121 - ], - "windows": null - } - }, - "lockScreen": { - "names": { - "domkey": null, - "android": null, - "english": "Lock Screen", - "chromium": "lockScreen", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 786846, - "linux": 152, - "xkb": 160, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "launchControlPanel": { - "names": { - "domkey": "LaunchControlPanel", - "android": null, - "english": "Launch Control Panel", - "chromium": "launchControlPanel", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 786847, - "linux": 579, - "xkb": 587, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "selectTask": { - "names": { - "domkey": "SelectTask", - "android": null, - "english": "Select Task", - "chromium": "selectTask", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 786850, - "linux": 580, - "xkb": 588, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "launchDocuments": { - "names": { - "domkey": null, - "android": null, - "english": "Launch Documents", - "chromium": "launchDocuments", - "glfw": null, - "gtk": [ - "Document" - ], - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 786855, - "linux": 235, - "xkb": 243, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "spellCheck": { - "names": { - "domkey": null, - "android": null, - "english": "Spell Check", - "chromium": "spellCheck", - "glfw": null, - "gtk": [ - "Spell" - ], - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 786859, - "linux": 432, - "xkb": 440, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": [ - 269025148 - ], - "windows": null - } - }, - "launchKeyboardLayout": { - "names": { - "domkey": null, - "android": null, - "english": "Launch Keyboard Layout", - "chromium": "launchKeyboardLayout", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 786862, - "linux": 374, - "xkb": 382, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "launchScreenSaver": { - "names": { - "domkey": "LaunchScreenSaver", - "android": null, - "english": "Launch Screen Saver", - "chromium": "launchScreenSaver", - "glfw": null, - "gtk": [ - "ScreenSaver" - ], - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 786865, - "linux": 581, - "xkb": 589, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": [ - 269025069 - ], - "windows": null - } - }, - "launchAssistant": { - "names": { - "domkey": "LaunchAssistant", - "android": [ - "ASSIST" - ], - "english": "Launch Assistant", - "chromium": "launchAssistant", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 583 - ], - "usb": 786891, - "linux": 583, - "xkb": 591, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 219 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "launchAudioBrowser": { - "names": { - "domkey": null, - "android": null, - "english": "Launch Audio Browser", - "chromium": "launchAudioBrowser", - "glfw": null, - "gtk": [ - "Music" - ], - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 786871, - "linux": 392, - "xkb": 400, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": [ - 269025170 - ], - "windows": null - } - }, - "newKey": { - "names": { - "domkey": null, - "android": [ - "NEW" - ], - "english": "New Key", - "chromium": "new", - "glfw": null, - "gtk": [ - "New" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 181 - ], - "usb": 786945, - "linux": 181, - "xkb": 189, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": [ - 269025128 - ], - "windows": null - } - }, - "close": { - "names": { - "domkey": null, - "android": [ - "MEDIA_CLOSE", - "CLOSE" - ], - "english": "Close", - "chromium": "close", - "glfw": null, - "gtk": [ - "Close" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 160, - 206 - ], - "usb": 786947, - "linux": 206, - "xkb": 214, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 128 - ], - "glfw": null, - "gtk": [ - 269025110 - ], - "windows": null - } - }, - "save": { - "names": { - "domkey": null, - "android": null, - "english": "Save", - "chromium": "save", - "glfw": null, - "gtk": [ - "Save" - ], - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 786951, - "linux": 234, - "xkb": 242, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": [ - 269025143 - ], - "windows": null - } - }, - "print": { - "names": { - "domkey": null, - "android": [ - "PRINT" - ], - "english": "Print", - "chromium": "print", - "glfw": null, - "gtk": [ - "Print" - ], - "windows": [ - "PRINT" - ] - }, - "scanCodes": { - "android": [ - 210 - ], - "usb": 786952, - "linux": 210, - "xkb": 218, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": [ - 65377 - ], - "windows": [ - 42 - ] - } - }, - "browserSearch": { - "names": { - "domkey": "BrowserSearch", - "android": [ - "SEARCH" - ], - "english": "Browser Search", - "chromium": "browserSearch", - "glfw": null, - "gtk": [ - "Search" - ], - "windows": [ - "BROWSER_SEARCH" - ] - }, - "scanCodes": { - "android": [ - 217 - ], - "usb": 786977, - "linux": 217, - "xkb": 225, - "windows": 57445, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 84 - ], - "glfw": null, - "gtk": [ - 269025051 - ], - "windows": [ - 170 - ] - } - }, - "browserHome": { - "names": { - "domkey": "BrowserHome", - "android": null, - "english": "Browser Home", - "chromium": "browserHome", - "glfw": null, - "gtk": [ - "HomePage" - ], - "windows": [ - "BROWSER_HOME" - ] - }, - "scanCodes": { - "android": null, - "usb": 786979, - "linux": 172, - "xkb": 180, - "windows": 57394, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": [ - 269025048 - ], - "windows": [ - 172 - ] - } - }, - "browserBack": { - "names": { - "domkey": "BrowserBack", - "android": null, - "english": "Browser Back", - "chromium": "browserBack", - "glfw": null, - "gtk": [ - "Back" - ], - "windows": [ - "BROWSER_BACK" - ] - }, - "scanCodes": { - "android": null, - "usb": 786980, - "linux": 158, - "xkb": 166, - "windows": 57450, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": [ - 269025062 - ], - "windows": [ - 166 - ] - } - }, - "browserForward": { - "names": { - "domkey": "BrowserForward", - "android": [ - "FORWARD" - ], - "english": "Browser Forward", - "chromium": "browserForward", - "glfw": null, - "gtk": [ - "Forward" - ], - "windows": [ - "BROWSER_FORWARD" - ] - }, - "scanCodes": { - "android": [ - 159 - ], - "usb": 786981, - "linux": 159, - "xkb": 167, - "windows": 57449, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 125 - ], - "glfw": null, - "gtk": [ - 269025063 - ], - "windows": [ - 167 - ] - } - }, - "browserStop": { - "names": { - "domkey": "BrowserStop", - "android": null, - "english": "Browser Stop", - "chromium": "browserStop", - "glfw": null, - "gtk": [ - "Stop" - ], - "windows": [ - "BROWSER_STOP" - ] - }, - "scanCodes": { - "android": null, - "usb": 786982, - "linux": 128, - "xkb": 136, - "windows": 57448, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": [ - 269025064 - ], - "windows": [ - 169 - ] - } - }, - "browserRefresh": { - "names": { - "domkey": "BrowserRefresh", - "android": null, - "english": "Browser Refresh", - "chromium": "browserRefresh", - "glfw": null, - "gtk": [ - "Refresh" - ], - "windows": [ - "BROWSER_REFRESH" - ] - }, - "scanCodes": { - "android": null, - "usb": 786983, - "linux": 173, - "xkb": 181, - "windows": 57447, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": [ - 269025065 - ], - "windows": [ - 168 - ] - } - }, - "browserFavorites": { - "names": { - "domkey": "BrowserFavorites", - "android": [ - "BOOKMARK" - ], - "english": "Browser Favorites", - "chromium": "browserFavorites", - "glfw": null, - "gtk": [ - "Favorites" - ], - "windows": [ - "BROWSER_FAVORITES" - ] - }, - "scanCodes": { - "android": [ - 156 - ], - "usb": 786986, - "linux": 156, - "xkb": 164, - "windows": 57446, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 174 - ], - "glfw": null, - "gtk": [ - 269025072 - ], - "windows": [ - 171 - ] - } - }, - "zoomIn": { - "names": { - "domkey": null, - "android": [ - "ZOOM_IN" - ], - "english": "Zoom In", - "chromium": "zoomIn", - "glfw": null, - "gtk": [ - "ZoomIn" - ], - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 786989, - "linux": 418, - "xkb": 426, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 168 - ], - "glfw": null, - "gtk": [ - 269025163 - ], - "windows": null - } - }, - "zoomOut": { - "names": { - "domkey": null, - "android": [ - "ZOOM_OUT" - ], - "english": "Zoom Out", - "chromium": "zoomOut", - "glfw": null, - "gtk": [ - "ZoomOut" - ], - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 786990, - "linux": 419, - "xkb": 427, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 169 - ], - "glfw": null, - "gtk": [ - 269025164 - ], - "windows": null - } - }, - "zoomToggle": { - "names": { - "domkey": "ZoomToggle", - "android": [ - "TV_ZOOM_MODE" - ], - "english": "Zoom Toggle", - "chromium": "zoomToggle", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 786994, - "linux": 372, - "xkb": 380, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 255 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "redo": { - "names": { - "domkey": null, - "android": [ - "REDO" - ], - "english": "Redo", - "chromium": "redo", - "glfw": null, - "gtk": [ - "Redo" - ], - "windows": null - }, - "scanCodes": { - "android": [ - 182 - ], - "usb": 787065, - "linux": 182, - "xkb": 190, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": [ - 65382 - ], - "windows": null - } - }, - "mailReply": { - "names": { - "domkey": "MailReply", - "android": null, - "english": "Mail Reply", - "chromium": "mailReply", - "glfw": null, - "gtk": [ - "Reply" - ], - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 787081, - "linux": 232, - "xkb": 240, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": [ - 269025138 - ], - "windows": null - } - }, - "mailForward": { - "names": { - "domkey": "MailForward", - "android": null, - "english": "Mail Forward", - "chromium": "mailForward", - "glfw": null, - "gtk": [ - "MailForward" - ], - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 787083, - "linux": 233, - "xkb": 241, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": [ - 269025168 - ], - "windows": null - } - }, - "mailSend": { - "names": { - "domkey": "MailSend", - "android": null, - "english": "Mail Send", - "chromium": "mailSend", - "glfw": null, - "gtk": [ - "Send" - ], - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 787084, - "linux": 231, - "xkb": 239, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": [ - 269025147 - ], - "windows": null - } - }, - "keyboardLayoutSelect": { - "names": { - "domkey": "KeyboardLayoutSelect", - "android": null, - "english": "Keyboard Layout Select", - "chromium": "keyboardLayoutSelect", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 787101, - "linux": 584, - "xkb": 592, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "showAllWindows": { - "names": { - "domkey": "ShowAllWindows", - "android": null, - "english": "Show All Windows", - "chromium": "showAllWindows", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": null, - "usb": 787103, - "linux": 120, - "xkb": 128, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": null, - "glfw": null, - "gtk": null, - "windows": null - } - }, - "gameButton1": { - "names": { - "domkey": "GameButton1", - "android": [ - "BUTTON_1" - ], - "english": "Game Button 1", - "chromium": "button1", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 256, - 288 - ], - "usb": 392961, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 188 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "gameButton2": { - "names": { - "domkey": "GameButton2", - "android": [ - "BUTTON_2" - ], - "english": "Game Button 2", - "chromium": "button2", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 257, - 289 - ], - "usb": 392962, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 189 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "gameButton3": { - "names": { - "domkey": "GameButton3", - "android": [ - "BUTTON_3" - ], - "english": "Game Button 3", - "chromium": "button3", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 258, - 290 - ], - "usb": 392963, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 190 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "gameButton4": { - "names": { - "domkey": "GameButton4", - "android": [ - "BUTTON_4" - ], - "english": "Game Button 4", - "chromium": "button4", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 259, - 291 - ], - "usb": 392964, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 191 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "gameButton5": { - "names": { - "domkey": "GameButton5", - "android": [ - "BUTTON_5" - ], - "english": "Game Button 5", - "chromium": "button5", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 260, - 292 - ], - "usb": 392965, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 192 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "gameButton6": { - "names": { - "domkey": "GameButton6", - "android": [ - "BUTTON_6" - ], - "english": "Game Button 6", - "chromium": "button6", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 261, - 293 - ], - "usb": 392966, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 193 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "gameButton7": { - "names": { - "domkey": "GameButton7", - "android": [ - "BUTTON_7" - ], - "english": "Game Button 7", - "chromium": "button7", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 262, - 294 - ], - "usb": 392967, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 194 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "gameButton8": { - "names": { - "domkey": "GameButton8", - "android": [ - "BUTTON_8" - ], - "english": "Game Button 8", - "chromium": "button8", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 263, - 295 - ], - "usb": 392968, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 195 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "gameButton9": { - "names": { - "domkey": "GameButton9", - "android": [ - "BUTTON_9" - ], - "english": "Game Button 9", - "chromium": "button9", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 264, - 296 - ], - "usb": 392969, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 196 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "gameButton10": { - "names": { - "domkey": "GameButton10", - "android": [ - "BUTTON_10" - ], - "english": "Game Button 10", - "chromium": "button10", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 265, - 297 - ], - "usb": 392970, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 197 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "gameButton11": { - "names": { - "domkey": "GameButton11", - "android": [ - "BUTTON_11" - ], - "english": "Game Button 11", - "chromium": "button11", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 266, - 298 - ], - "usb": 392971, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 198 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "gameButton12": { - "names": { - "domkey": "GameButton12", - "android": [ - "BUTTON_12" - ], - "english": "Game Button 12", - "chromium": "button12", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 267, - 299 - ], - "usb": 392972, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 199 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "gameButton13": { - "names": { - "domkey": "GameButton13", - "android": [ - "BUTTON_13" - ], - "english": "Game Button 13", - "chromium": "button13", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 268, - 300 - ], - "usb": 392973, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 200 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "gameButton14": { - "names": { - "domkey": "GameButton14", - "android": [ - "BUTTON_14" - ], - "english": "Game Button 14", - "chromium": "button14", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 269, - 301 - ], - "usb": 392974, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 201 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "gameButton15": { - "names": { - "domkey": "GameButton15", - "android": [ - "BUTTON_15" - ], - "english": "Game Button 15", - "chromium": "button15", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 270, - 302 - ], - "usb": 392975, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 202 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "gameButton16": { - "names": { - "domkey": "GameButton16", - "android": [ - "BUTTON_16" - ], - "english": "Game Button 16", - "chromium": "button16", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 271, - 303 - ], - "usb": 392976, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 203 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "gameButtonA": { - "names": { - "domkey": "GameButtonA", - "android": [ - "BUTTON_A" - ], - "english": "Game Button A", - "chromium": "buttonA", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 304 - ], - "usb": 392977, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 96 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "gameButtonB": { - "names": { - "domkey": "GameButtonB", - "android": [ - "BUTTON_B" - ], - "english": "Game Button B", - "chromium": "buttonB", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 305 - ], - "usb": 392978, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 97 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "gameButtonC": { - "names": { - "domkey": "GameButtonC", - "android": [ - "BUTTON_C" - ], - "english": "Game Button C", - "chromium": "buttonC", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 306 - ], - "usb": 392979, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 98 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "gameButtonLeft1": { - "names": { - "domkey": "GameButtonLeft1", - "android": [ - "BUTTON_L1" - ], - "english": "Game Button Left 1", - "chromium": "buttonL1", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 310 - ], - "usb": 392980, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 102 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "gameButtonLeft2": { - "names": { - "domkey": "GameButtonLeft2", - "android": [ - "BUTTON_L2" - ], - "english": "Game Button Left 2", - "chromium": "buttonL2", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 312 - ], - "usb": 392981, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 104 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "gameButtonMode": { - "names": { - "domkey": "GameButtonMode", - "android": [ - "BUTTON_MODE" - ], - "english": "Game Button Mode", - "chromium": "buttonMode", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 316 - ], - "usb": 392982, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 110 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "gameButtonRight1": { - "names": { - "domkey": "GameButtonRight1", - "android": [ - "BUTTON_R1" - ], - "english": "Game Button Right 1", - "chromium": "buttonR1", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 311 - ], - "usb": 392983, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 103 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "gameButtonRight2": { - "names": { - "domkey": "GameButtonRight2", - "android": [ - "BUTTON_R2" - ], - "english": "Game Button Right 2", - "chromium": "buttonR2", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 313 - ], - "usb": 392984, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 105 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "gameButtonSelect": { - "names": { - "domkey": "GameButtonSelect", - "android": [ - "BUTTON_SELECT" - ], - "english": "Game Button Select", - "chromium": "buttonSelect", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 314 - ], - "usb": 392985, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 109 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "gameButtonStart": { - "names": { - "domkey": "GameButtonStart", - "android": [ - "BUTTON_START" - ], - "english": "Game Button Start", - "chromium": "buttonStart", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 315 - ], - "usb": 392986, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 108 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "gameButtonThumbLeft": { - "names": { - "domkey": "GameButtonThumbLeft", - "android": [ - "BUTTON_THUMBL" - ], - "english": "Game Button Thumb Left", - "chromium": "buttonThumbl", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 317 - ], - "usb": 392987, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 106 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "gameButtonThumbRight": { - "names": { - "domkey": "GameButtonThumbRight", - "android": [ - "BUTTON_THUMBR" - ], - "english": "Game Button Thumb Right", - "chromium": "buttonThumbr", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 318 - ], - "usb": 392988, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 107 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "gameButtonX": { - "names": { - "domkey": "GameButtonX", - "android": [ - "BUTTON_X" - ], - "english": "Game Button X", - "chromium": "buttonX", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 307 - ], - "usb": 392989, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 99 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "gameButtonY": { - "names": { - "domkey": "GameButtonY", - "android": [ - "BUTTON_Y" - ], - "english": "Game Button Y", - "chromium": "buttonY", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 308 - ], - "usb": 392990, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 100 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "gameButtonZ": { - "names": { - "domkey": "GameButtonZ", - "android": [ - "BUTTON_Z" - ], - "english": "Game Button Z", - "chromium": "buttonZ", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 309 - ], - "usb": 392991, - "linux": null, - "xkb": null, - "windows": null, - "macos": null, - "ios": null - }, - "keyCodes": { - "android": [ - 101 - ], - "glfw": null, - "gtk": null, - "windows": null - } - }, - "fn": { - "names": { - "domkey": "Fn", - "android": [ - "FUNCTION" - ], - "english": "Fn", - "chromium": "fn", - "glfw": null, - "gtk": null, - "windows": null - }, - "scanCodes": { - "android": [ - 464 - ], - "usb": 18, - "linux": null, - "xkb": null, - "windows": null, - "macos": 63, - "ios": null - }, - "keyCodes": { - "android": [ - 119 - ], - "glfw": null, - "gtk": null, - "windows": null - } - } -} \ No newline at end of file diff --git a/dev/tools/gen_keycodes/data/key_name_to_android_name.json b/dev/tools/gen_keycodes/data/key_name_to_android_name.json deleted file mode 100644 index 856a4f9f64..0000000000 --- a/dev/tools/gen_keycodes/data/key_name_to_android_name.json +++ /dev/null @@ -1,284 +0,0 @@ -{ - "again": ["AGAIN"], - "altLeft": ["ALT_LEFT"], - "altRight": ["ALT_RIGHT"], - "appSwitch": ["APP_SWITCH"], - "arrowDown": ["DPAD_DOWN"], - "arrowLeft": ["DPAD_LEFT"], - "arrowRight": ["DPAD_RIGHT"], - "arrowUp": ["DPAD_UP"], - "audioVolumeDown": ["VOLUME_DOWN"], - "audioVolumeMute": ["VOLUME_MUTE"], - "audioVolumeUp": ["VOLUME_UP"], - "avrInput": ["AVR_INPUT"], - "avrPower": ["AVR_POWER"], - "bassBoost": ["BASSBOOST"], - "print": ["PRINT"], - "backquote": ["GRAVE"], - "backslash": ["BACKSLASH"], - "backspace": ["DEL"], - "bracketLeft": ["LEFT_BRACKET"], - "bracketRight": ["RIGHT_BRACKET"], - "brightnessDown": ["BRIGHTNESS_DOWN"], - "brightnessUp": ["BRIGHTNESS_UP"], - "browserFavorites": ["BOOKMARK"], - "browserForward": ["FORWARD"], - "browserSearch": ["SEARCH"], - "call": ["CALL"], - "camera": ["CAMERA"], - "cameraFocus": ["FOCUS"], - "capsLock": ["CAPS_LOCK"], - "channelDown": ["CHANNEL_DOWN"], - "channelUp": ["CHANNEL_UP"], - "clear": ["CLEAR"], - "close": ["MEDIA_CLOSE", "CLOSE"], - "closedCaptionToggle": ["CAPTIONS"], - "colorF0Red": ["PROG_RED"], - "colorF1Green": ["PROG_GREEN"], - "colorF2Yellow": ["PROG_YELLOW"], - "colorF3Blue": ["PROG_BLUE"], - "comma": ["COMMA"], - "contextMenu": ["MENU"], - "controlLeft": ["CTRL_LEFT"], - "controlRight": ["CTRL_RIGHT"], - "convert": ["HENKAN"], - "copy": ["COPY"], - "cut": ["CUT"], - "delete": ["FORWARD_DEL"], - "digit0": ["0"], - "digit1": ["1"], - "digit2": ["2"], - "digit3": ["3"], - "digit4": ["4"], - "digit5": ["5"], - "digit6": ["6"], - "digit7": ["7"], - "digit8": ["8"], - "digit9": ["9"], - "dvr": ["DVR"], - "eisu": ["EISU"], - "eject": ["MEDIA_EJECT"], - "end": ["MOVE_END"], - "endCall": ["ENDCALL"], - "enter": ["ENTER"], - "equal": ["EQUALS"], - "escape": ["ESCAPE"], - "exit": ["EXIT"], - "f1": ["F1"], - "f2": ["F2"], - "f3": ["F3"], - "f4": ["F4"], - "f5": ["F5"], - "f6": ["F6"], - "f7": ["F7"], - "f8": ["F8"], - "f9": ["F9"], - "f10": ["F10"], - "f11": ["F11"], - "f12": ["F12"], - "f13": ["F13"], - "f14": ["F14"], - "f15": ["F15"], - "f16": ["F16"], - "f17": ["F17"], - "f18": ["F18"], - "f19": ["F19"], - "f20": ["F20"], - "f21": ["F21"], - "f22": ["F22"], - "f23": ["F23"], - "f24": ["F24"], - "find": ["FIND"], - "fn": ["FUNCTION"], - "gameButton1": ["BUTTON_1"], - "gameButton2": ["BUTTON_2"], - "gameButton3": ["BUTTON_3"], - "gameButton4": ["BUTTON_4"], - "gameButton5": ["BUTTON_5"], - "gameButton6": ["BUTTON_6"], - "gameButton7": ["BUTTON_7"], - "gameButton8": ["BUTTON_8"], - "gameButton9": ["BUTTON_9"], - "gameButton10": ["BUTTON_10"], - "gameButton11": ["BUTTON_11"], - "gameButton12": ["BUTTON_12"], - "gameButton13": ["BUTTON_13"], - "gameButton14": ["BUTTON_14"], - "gameButton15": ["BUTTON_15"], - "gameButton16": ["BUTTON_16"], - "gameButtonA": ["BUTTON_A"], - "gameButtonB": ["BUTTON_B"], - "gameButtonC": ["BUTTON_C"], - "gameButtonLeft1": ["BUTTON_L1"], - "gameButtonLeft2": ["BUTTON_L2"], - "gameButtonMode": ["BUTTON_MODE"], - "gameButtonRight1": ["BUTTON_R1"], - "gameButtonRight2": ["BUTTON_R2"], - "gameButtonSelect": ["BUTTON_SELECT"], - "gameButtonStart": ["BUTTON_START"], - "gameButtonThumbLeft": ["BUTTON_THUMBL"], - "gameButtonThumbRight": ["BUTTON_THUMBR"], - "gameButtonX": ["BUTTON_X"], - "gameButtonY": ["BUTTON_Y"], - "gameButtonZ": ["BUTTON_Z"], - "goBack": ["BACK"], - "goHome": ["HOME"], - "groupNext": ["LANGUAGE_SWITCH"], - "guide": ["GUIDE"], - "headsetHook": ["HEADSETHOOK"], - "help": ["HELP"], - "hiraganaKatakana": ["KATAKANA_HIRAGANA"], - "home": ["MOVE_HOME"], - "info": ["INFO"], - "insert": ["INSERT"], - "kanjiMode": ["KANA"], - "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"], - "lang3": ["KATAKANA"], - "lang4": ["HIRAGANA"], - "launchAssistant": ["ASSIST"], - "launchCalculator": ["CALCULATOR"], - "launchCalendar": ["CALENDAR"], - "launchContacts": ["CONTACTS"], - "launchMail": ["ENVELOPE"], - "launchMusicPlayer": ["MUSIC"], - "launchWebBrowser": ["EXPLORER"], - "mannerMode": ["MANNER_MODE"], - "mediaAudioTrack": ["MEDIA_AUDIO_TRACK"], - "mediaFastForward": ["MEDIA_FAST_FORWARD"], - "mediaLast": ["LAST_CHANNEL"], - "mediaPause": ["MEDIA_PAUSE"], - "mediaPlay": ["MEDIA_PLAY"], - "mediaPlayPause": ["MEDIA_PLAY_PAUSE"], - "mediaRecord": ["MEDIA_RECORD"], - "mediaRewind": ["MEDIA_REWIND"], - "mediaSkipBackward": ["MEDIA_SKIP_BACKWARD"], - "mediaSkipForward": ["MEDIA_SKIP_FORWARD"], - "mediaStepBackward": ["MEDIA_STEP_BACKWARD"], - "mediaStepForward": ["MEDIA_STEP_FORWARD"], - "mediaStop": ["MEDIA_STOP"], - "mediaTopMenu": ["MEDIA_TOP_MENU"], - "mediaTrackNext": ["MEDIA_NEXT"], - "mediaTrackPrevious": ["MEDIA_PREVIOUS"], - "metaLeft": ["META_LEFT"], - "metaRight": ["META_RIGHT"], - "microphoneVolumeMute": ["MUTE"], - "minus": ["MINUS"], - "modeChange": ["SWITCH_CHARSET"], - "navigateIn": ["NAVIGATE_IN"], - "navigateNext": ["NAVIGATE_NEXT"], - "navigateOut": ["NAVIGATE_OUT"], - "navigatePrevious": ["NAVIGATE_PREVIOUS"], - "newKey": ["NEW"], - "nonConvert": ["MUHENKAN"], - "none": ["UNKNOWN"], - "notification": ["NOTIFICATION"], - "numLock": ["NUM_LOCK"], - "numpad0": ["NUMPAD_0"], - "numpad1": ["NUMPAD_1"], - "numpad2": ["NUMPAD_2"], - "numpad3": ["NUMPAD_3"], - "numpad4": ["NUMPAD_4"], - "numpad5": ["NUMPAD_5"], - "numpad6": ["NUMPAD_6"], - "numpad7": ["NUMPAD_7"], - "numpad8": ["NUMPAD_8"], - "numpad9": ["NUMPAD_9"], - "numpadAdd": ["NUMPAD_ADD"], - "numpadComma": ["NUMPAD_COMMA"], - "numpadDecimal": ["NUMPAD_DOT"], - "numpadDivide": ["NUMPAD_DIVIDE"], - "numpadEnter": ["NUMPAD_ENTER"], - "numpadEqual": ["NUMPAD_EQUALS"], - "numpadMultiply": ["NUMPAD_MULTIPLY"], - "numpadParenLeft": ["NUMPAD_LEFT_PAREN"], - "numpadParenRight": ["NUMPAD_RIGHT_PAREN"], - "numpadSubtract": ["NUMPAD_SUBTRACT"], - "open": ["OPEN"], - "pageDown": ["PAGE_DOWN"], - "pageUp": ["PAGE_UP"], - "pairing": ["PAIRING"], - "paste": ["PASTE"], - "pause": ["BREAK"], - "period": ["PERIOD"], - "power": ["POWER"], - "printScreen": ["SYSRQ"], - "props": ["PROPS"], - "quote": ["APOSTROPHE"], - "redo": ["REDO"], - "scrollLock": ["SCROLL_LOCK"], - "select": ["DPAD_CENTER"], - "semicolon": ["SEMICOLON"], - "settings": ["SETTINGS"], - "shiftLeft": ["SHIFT_LEFT"], - "shiftRight": ["SHIFT_RIGHT"], - "slash": ["SLASH"], - "sleep": ["SLEEP"], - "space": ["SPACE"], - "standby": ["SLEEP"], - "stbInput": ["STB_INPUT"], - "stbPower": ["STB_POWER"], - "suspend": ["SUSPEND"], - "symbol": ["SYM"], - "tab": ["TAB"], - "teletext": ["TV_TELETEXT"], - "tv": ["TV"], - "tv3dMode": ["3D_MODE"], - "tvAntennaCable": ["TV_ANTENNA_CABLE"], - "tvAudioDescription": ["TV_AUDIO_DESCRIPTION"], - "tvAudioDescriptionMixDown": ["TV_AUDIO_DESCRIPTION_MIX_DOWN"], - "tvAudioDescriptionMixUp": ["TV_AUDIO_DESCRIPTION_MIX_UP"], - "tvContentsMenu": ["TV_CONTENTS_MENU"], - "tvDataService": ["TV_DATA_SERVICE"], - "tvInput": ["TV_INPUT"], - "tvInputComponent1": ["TV_INPUT_COMPONENT_1"], - "tvInputComponent2": ["TV_INPUT_COMPONENT_2"], - "tvInputComposite1": ["TV_INPUT_COMPOSITE_1"], - "tvInputComposite2": ["TV_INPUT_COMPOSITE_2"], - "tvInputHdmi1": ["TV_INPUT_HDMI_1"], - "tvInputHdmi2": ["TV_INPUT_HDMI_2"], - "tvInputHdmi3": ["TV_INPUT_HDMI_3"], - "tvInputHdmi4": ["TV_INPUT_HDMI_4"], - "tvInputVga1": ["TV_INPUT_VGA_1"], - "tvNetwork": ["TV_NETWORK"], - "tvNumberEntry": ["TV_NUMBER_ENTRY"], - "tvPower": ["TV_POWER"], - "tvRadioService": ["TV_RADIO_SERVICE"], - "tvSatellite": ["TV_SATELLITE"], - "tvSatelliteBs": ["TV_SATELLITE_BS"], - "tvSatelliteCs": ["TV_SATELLITE_CS"], - "tvSatelliteToggle": ["TV_SATELLITE_SERVICE"], - "tvTerrestrialAnalog": ["TV_TERRESTRIAL_ANALOG"], - "tvTerrestrialDigital": ["TV_TERRESTRIAL_DIGITAL"], - "tvTimer": ["TV_TIMER_PROGRAMMING"], - "undo": ["UNDO"], - "wakeUp": ["WAKEUP"], - "zenkakuHankaku": ["ZENKAKU_HANKAKU"], - "zoomIn": ["ZOOM_IN"], - "zoomOut": ["ZOOM_OUT"], - "zoomToggle": ["TV_ZOOM_MODE"] -} diff --git a/dev/tools/gen_keycodes/data/key_name_to_glfw_name.json b/dev/tools/gen_keycodes/data/key_name_to_glfw_name.json deleted file mode 100644 index f52194f9b6..0000000000 --- a/dev/tools/gen_keycodes/data/key_name_to_glfw_name.json +++ /dev/null @@ -1,118 +0,0 @@ -{ - "altLeft": ["LEFT_ALT"], - "altRight": ["RIGHT_ALT"], - "arrowDown": ["DOWN"], - "arrowLeft": ["LEFT"], - "arrowRight": ["RIGHT"], - "arrowUp": ["UP"], - "backquote": ["GRAVE_ACCENT"], - "backslash": ["BACKSLASH"], - "backspace": ["BACKSPACE"], - "bracketLeft": ["LEFT_BRACKET"], - "bracketRight": ["RIGHT_BRACKET"], - "capsLock": ["CAPS_LOCK"], - "comma": ["COMMA"], - "contextMenu": ["MENU"], - "controlLeft": ["LEFT_CONTROL"], - "controlRight": ["RIGHT_CONTROL"], - "delete": ["DELETE"], - "digit0": ["0"], - "digit1": ["1"], - "digit2": ["2"], - "digit3": ["3"], - "digit4": ["4"], - "digit5": ["5"], - "digit6": ["6"], - "digit7": ["7"], - "digit8": ["8"], - "digit9": ["9"], - "end": ["END"], - "enter": ["ENTER"], - "equal": ["EQUAL"], - "escape": ["ESCAPE"], - "f1": ["F1"], - "f2": ["F2"], - "f3": ["F3"], - "f4": ["F4"], - "f5": ["F5"], - "f6": ["F6"], - "f7": ["F7"], - "f8": ["F8"], - "f9": ["F9"], - "f10": ["F10"], - "f11": ["F11"], - "f12": ["F12"], - "f13": ["F13"], - "f14": ["F14"], - "f15": ["F15"], - "f16": ["F16"], - "f17": ["F17"], - "f18": ["F18"], - "f19": ["F19"], - "f20": ["F20"], - "f21": ["F21"], - "f22": ["F22"], - "f23": ["F23"], - "f25": ["F25"], - "home": ["HOME"], - "insert": ["INSERT"], - "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"], - "metaLeft": ["LEFT_SUPER"], - "metaRight": ["RIGHT_SUPER"], - "minus": ["MINUS"], - "numLock": ["NUM_LOCK"], - "numpad0": ["KP_0"], - "numpad1": ["KP_1"], - "numpad2": ["KP_2"], - "numpad3": ["KP_3"], - "numpad4": ["KP_4"], - "numpad5": ["KP_5"], - "numpad6": ["KP_6"], - "numpad7": ["KP_7"], - "numpad8": ["KP_8"], - "numpad9": ["KP_9"], - "numpadAdd": ["KP_ADD"], - "numpadDecimal": ["KP_DECIMAL"], - "numpadDivide": ["KP_DIVIDE"], - "numpadEnter": ["KP_ENTER"], - "numpadEqual": ["KP_EQUAL"], - "numpadMultiply": ["KP_MULTIPLY"], - "numpadSubtract": ["NUMPAD_SUBTRACT"], - "pageDown": ["PAGE_DOWN"], - "pageUp": ["PAGE_UP"], - "pause": ["PAUSE"], - "period": ["PERIOD"], - "printScreen": ["PRINT_SCREEN"], - "quote": ["APOSTROPHE"], - "semicolon": ["SEMICOLON"], - "shiftLeft": ["LEFT_SHIFT"], - "shiftRight": ["RIGHT_SHIFT"], - "slash": ["SLASH"], - "space": ["SPACE"], - "tab": ["TAB"] -} diff --git a/dev/tools/gen_keycodes/data/key_name_to_gtk_name.json b/dev/tools/gen_keycodes/data/key_name_to_gtk_name.json deleted file mode 100644 index 09a2045c3b..0000000000 --- a/dev/tools/gen_keycodes/data/key_name_to_gtk_name.json +++ /dev/null @@ -1,179 +0,0 @@ -{ - "altLeft": ["Alt_L"], - "altRight": ["Alt_R", "ISO_Level3_Shift"], - "arrowDown": ["Down", "KP_Down"], - "arrowLeft": ["Left", "KP_Left"], - "arrowRight": ["Right", "KP_Right"], - "arrowUp": ["Up", "KP_Up"], - "audioVolumeDown": ["AudioLowerVolume"], - "audioVolumeMute": ["AudioMute"], - "audioVolumeUp": ["AudioRaiseVolume"], - "backquote": ["quoteleft"], - "backslash": ["backslash"], - "backspace": ["BackSpace"], - "bracketLeft": ["bracketleft"], - "bracketRight": ["bracketright"], - "brightnessDown": ["MonBrightnessDown"], - "brightnessUp": ["MonBrightnessUp"], - "browserBack": ["Back"], - "browserFavorites": ["Favorites"], - "browserFavourites": ["Favourites"], - "browserForward": ["Forward"], - "browserHome": ["HomePage"], - "browserRefresh": ["Refresh"], - "browserSearch": ["Search"], - "browserStop": ["Stop"], - "capsLock": ["Caps_Lock"], - "close": ["Close"], - "comma": ["comma"], - "contextMenu": ["Menu"], - "controlLeft": ["Control_L"], - "controlRight": ["Control_R"], - "copy": ["Copy", "3270_Copy"], - "delete": ["Delete", "KP_Delete"], - "digit0": ["0"], - "digit1": ["1"], - "digit2": ["2"], - "digit3": ["3"], - "digit4": ["4"], - "digit5": ["5"], - "digit6": ["6"], - "digit7": ["7"], - "digit8": ["8"], - "digit9": ["9"], - "eject": ["Eject"], - "end": ["End", "KP_End"], - "enter": ["Return", "Enter", "ISO_Enter"], - "equal": ["equal"], - "escape": ["Escape"], - "f1": ["F1", "KP_F1"], - "f2": ["F2", "KP_F2"], - "f3": ["F3", "KP_F3"], - "f4": ["F4", "KP_F4"], - "f5": ["F5"], - "f6": ["F6"], - "f7": ["F7"], - "f8": ["F8"], - "f9": ["F9"], - "f10": ["F10"], - "f11": ["F11"], - "f12": ["F12"], - "f13": ["F13"], - "f14": ["F14"], - "f15": ["F15"], - "f16": ["F16"], - "f17": ["F17"], - "f18": ["F18"], - "f19": ["F19"], - "f20": ["F20"], - "f21": ["F21"], - "f22": ["F22"], - "f23": ["F23"], - "f24": ["F24"], - "f25": ["F25"], - "find": ["Find"], - "help": ["Help"], - "home": ["Home", "KP_Home"], - "hyper": ["Hyper_L", "Hyper_R"], - "insert": ["Insert", "KP_Insert"], - "intlYen": ["yen"], - "kanaMode": ["kana_switch"], - "kbdIllumDown": ["KbdBrightnessDown"], - "kbdIllumUp": ["KbdBrightnessUp"], - "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"], - "launchAudioBrowser": ["Music"], - "launchCalendar": ["Calendar"], - "launchDocuments": ["Document"], - "launchInternetBrowser": ["WWW"], - "launchMail": ["Mail"], - "launchPhone": ["Phone"], - "launchScreenSaver": ["ScreenSaver"], - "logOff": ["LogOff"], - "mailForward": ["MailForward"], - "mailReply": ["Reply"], - "mailSend": ["Send"], - "mediaFastForward": ["AudioForward"], - "mediaPause": ["AudioPause"], - "mediaPlay": ["AudioPlay", "3270_Play"], - "mediaRecord": ["AudioRecord"], - "mediaRewind": ["AudioRewind"], - "mediaStop": ["AudioStop"], - "mediaTrackNext": ["AudioNext"], - "mediaTrackPrevious": ["AudioPrev"], - "metaLeft": ["Meta_L"], - "metaRight": ["Meta_R"], - "minus": ["minus"], - "newKey": ["New"], - "numLock": ["Num_Lock"], - "numpad0": ["KP_0"], - "numpad1": ["KP_1"], - "numpad2": ["KP_2"], - "numpad3": ["KP_3"], - "numpad4": ["KP_4"], - "numpad5": ["KP_5"], - "numpad6": ["KP_6"], - "numpad7": ["KP_7"], - "numpad8": ["KP_8"], - "numpad9": ["KP_9"], - "numpadAdd": ["KP_Add"], - "numpadDecimal": ["KP_Decimal"], - "numpadDivide": ["KP_Divide"], - "numpadEnter": ["KP_Enter"], - "numpadEqual": ["KP_Equal"], - "numpadMultiply": ["KP_Multiply"], - "numpadSubtract": ["KP_Subtract"], - "open": ["Open"], - "pageDown": ["Page_Down", "KP_Page_Down"], - "pageUp": ["Page_Up", "KP_Page_Up"], - "paste": ["Paste"], - "pause": ["Pause"], - "period": ["period"], - "power": ["PowerOff"], - "print": ["Print"], - "printScreen": ["3270_PrintScreen"], - "quote": ["apostrophe"], - "redo": ["Redo"], - "resume": ["Resume"], - "save": ["Save"], - "scrollLock": ["Scroll_Lock"], - "select": ["Select"], - "semicolon": ["semicolon"], - "shiftLeft": ["Shift_L"], - "shiftRight": ["Shift_R"], - "slash": ["slash"], - "sleep": ["Sleep"], - "space": ["space", "KP_Space"], - "spellCheck": ["Spell"], - "superKey": ["Super_L", "Super_R"], - "suspend": ["Suspend"], - "tab": ["Tab", "KP_Tab", "ISO_Left_Tab"], - "undo": ["Undo"], - "wakeUp": ["WakeUp"], - "zoomIn": ["ZoomIn"], - "zoomOut": ["ZoomOut"] -} diff --git a/dev/tools/gen_keycodes/data/key_name_to_windows_name.json b/dev/tools/gen_keycodes/data/key_name_to_windows_name.json deleted file mode 100644 index 921ca874ad..0000000000 --- a/dev/tools/gen_keycodes/data/key_name_to_windows_name.json +++ /dev/null @@ -1,230 +0,0 @@ -{ - "leftMouseButton": ["LBUTTON"], - "rightMouseButton": ["RBUTTON"], - "cancel": ["CANCEL"], - "middleMouseButton": ["MBUTTON"], - "xMouseButton1": ["XBUTTON1"], - "xMouseButton2": ["XBUTTON2"], - "backspace": ["BACK"], - "tab": ["TAB"], - "clear": ["CLEAR"], - "enter": ["RETURN"], - "shift": ["SHIFT"], - "control": ["CONTROL"], - "menu": ["MENU"], - "pause": ["PAUSE"], - "capsLock": ["CAPITAL"], - "kana": ["KANA"], - "hangeul": ["HANGEUL"], - "hangul": ["HANGUL"], - "junja": ["JUNJA"], - "final": ["FINAL"], - "hanja": ["HANJA"], - "kanji": ["KANJI"], - "escape": ["ESCAPE"], - "convert": ["CONVERT"], - "nonconvert": ["NONCONVERT"], - "accept": ["ACCEPT"], - "modeChange": ["MODECHANGE"], - "space": ["SPACE"], - "prior": ["PRIOR"], - "next": ["NEXT"], - "end": ["END"], - "home": ["HOME"], - "arrowLeft": ["LEFT"], - "arrowUp": ["UP"], - "arrowRight": ["RIGHT"], - "arrowDown": ["DOWN"], - "select": ["SELECT"], - "print": ["PRINT"], - "execute": ["EXECUTE"], - "snapshot": ["SNAPSHOT"], - "insert": ["INSERT"], - "delete": ["DELETE"], - "help": ["HELP"], - "metaLeft": ["LWIN"], - "metaRight": ["RWIN"], - "apps": ["APPS"], - "sleep": ["SLEEP"], - "numpad0": ["NUMPAD0"], - "numpad1": ["NUMPAD1"], - "numpad2": ["NUMPAD2"], - "numpad3": ["NUMPAD3"], - "numpad4": ["NUMPAD4"], - "numpad5": ["NUMPAD5"], - "numpad6": ["NUMPAD6"], - "numpad7": ["NUMPAD7"], - "numpad8": ["NUMPAD8"], - "numpad9": ["NUMPAD9"], - "numpadMultiply": ["MULTIPLY"], - "numpadAdd": ["ADD"], - "numpadSeparator": ["SEPARATOR"], - "numpadSubtract": ["SUBTRACT"], - "numpadDecimal": ["DECIMAL"], - "numpadDivide": ["DIVIDE"], - "f1": ["F1"], - "f2": ["F2"], - "f3": ["F3"], - "f4": ["F4"], - "f5": ["F5"], - "f6": ["F6"], - "f7": ["F7"], - "f8": ["F8"], - "f9": ["F9"], - "f10": ["F10"], - "f11": ["F11"], - "f12": ["F12"], - "f13": ["F13"], - "f14": ["F14"], - "f15": ["F15"], - "f16": ["F16"], - "f17": ["F17"], - "f18": ["F18"], - "f19": ["F19"], - "f20": ["F20"], - "f21": ["F21"], - "f22": ["F22"], - "f23": ["F23"], - "f24": ["F24"], - "navigationView": ["NAVIGATION_VIEW"], - "navigationMenu": ["NAVIGATION_MENU"], - "navigationUp": ["NAVIGATION_UP"], - "navigationDown": ["NAVIGATION_DOWN"], - "navigationLeft": ["NAVIGATION_LEFT"], - "navigationRight": ["NAVIGATION_RIGHT"], - "navigationAccept": ["NAVIGATION_ACCEPT"], - "navigationCancel": ["NAVIGATION_CANCEL"], - "numlock": ["NUMLOCK"], - "scroll": ["SCROLL"], - "numpadEqual": ["OEM_NEC_EQUAL"], - "oemFjJisho": ["OEM_FJ_JISHO"], - "oemFjMasshou": ["OEM_FJ_MASSHOU"], - "oemFjTouroku": ["OEM_FJ_TOUROKU"], - "oemFjLoya": ["OEM_FJ_LOYA"], - "oemFjRoya": ["OEM_FJ_ROYA"], - "shiftLeft": ["LSHIFT"], - "shiftRight": ["RSHIFT"], - "controlLeft": ["LCONTROL"], - "controlRight": ["RCONTROL"], - "altLeft": ["LMENU"], - "altRight": ["RMENU"], - "browserBack": ["BROWSER_BACK"], - "browserForward": ["BROWSER_FORWARD"], - "browserRefresh": ["BROWSER_REFRESH"], - "browserStop": ["BROWSER_STOP"], - "browserSearch": ["BROWSER_SEARCH"], - "browserFavorites": ["BROWSER_FAVORITES"], - "browserHome": ["BROWSER_HOME"], - "volumeMute": ["VOLUME_MUTE"], - "volumeDown": ["VOLUME_DOWN"], - "volumeUp": ["VOLUME_UP"], - "mediaNextTrack": ["MEDIA_NEXT_TRACK"], - "mediaPrevTrack": ["MEDIA_PREV_TRACK"], - "mediaStop": ["MEDIA_STOP"], - "mediaPlayPause": ["MEDIA_PLAY_PAUSE"], - "launchMail": ["LAUNCH_MAIL"], - "launchMediaSelect": ["LAUNCH_MEDIA_SELECT"], - "launchApp1": ["LAUNCH_APP1"], - "launchApp2": ["LAUNCH_APP2"], - "semicolon": ["OEM_1"], - "equal": ["OEM_PLUS"], - "comma": ["OEM_COMMA"], - "minus": ["OEM_MINUS"], - "period": ["OEM_PERIOD"], - "slash": ["OEM_2"], - "backquote": ["OEM_3"], - "gamepadA": ["GAMEPAD_A"], - "gamepadB": ["GAMEPAD_B"], - "gamepadX": ["GAMEPAD_X"], - "gamepadY": ["GAMEPAD_Y"], - "gamepadRightShoulder": ["GAMEPAD_RIGHT_SHOULDER"], - "gamepadLeftShoulder": ["GAMEPAD_LEFT_SHOULDER"], - "gamepadLeftTrigger": ["GAMEPAD_LEFT_TRIGGER"], - "gamepadRightTrigger": ["GAMEPAD_RIGHT_TRIGGER"], - "gamepadDpadUp": ["GAMEPAD_DPAD_UP"], - "gamepadDpadDown": ["GAMEPAD_DPAD_DOWN"], - "gamepadDpadLeft": ["GAMEPAD_DPAD_LEFT"], - "gamepadDpadRight": ["GAMEPAD_DPAD_RIGHT"], - "gamepadMenu": ["GAMEPAD_MENU"], - "gamepadView": ["GAMEPAD_VIEW"], - "gamepadLeftThumbstickButton": ["GAMEPAD_LEFT_THUMBSTICK_BUTTON"], - "gamepadRightThumbstickButton": ["GAMEPAD_RIGHT_THUMBSTICK_BUTTON"], - "gamepadLeftThumbstickUp": ["GAMEPAD_LEFT_THUMBSTICK_UP"], - "gamepadLeftThumbstickDown": ["GAMEPAD_LEFT_THUMBSTICK_DOWN"], - "gamepadLeftThumbstickRight": ["GAMEPAD_LEFT_THUMBSTICK_RIGHT"], - "gamepadLeftThumbstickLeft": ["GAMEPAD_LEFT_THUMBSTICK_LEFT"], - "gamepadRightThumbstickUp": ["GAMEPAD_RIGHT_THUMBSTICK_UP"], - "gamepadRightThumbstickDown": ["GAMEPAD_RIGHT_THUMBSTICK_DOWN"], - "gamepadRightThumbstickRight": ["GAMEPAD_RIGHT_THUMBSTICK_RIGHT"], - "gamepadRightThumbstickLeft": ["GAMEPAD_RIGHT_THUMBSTICK_LEFT"], - "bracketLeft": ["OEM_4"], - "backslash": ["OEM_5"], - "bracketRight": ["OEM_6"], - "quote": ["OEM_7"], - "oem8": ["OEM_8"], - "oemAx": ["OEM_AX"], - "oem102": ["OEM_102"], - "icoHelp": ["ICO_HELP"], - "ico00": ["ICO_00"], - "processkey": ["PROCESSKEY"], - "icoClear": ["ICO_CLEAR"], - "packet": ["PACKET"], - "oemReset": ["OEM_RESET"], - "oemJump": ["OEM_JUMP"], - "oemPa1": ["OEM_PA1"], - "oemPa2": ["OEM_PA2"], - "oemPa3": ["OEM_PA3"], - "oemWsctrl": ["OEM_WSCTRL"], - "oemCusel": ["OEM_CUSEL"], - "oemAttn": ["OEM_ATTN"], - "oemFinish": ["OEM_FINISH"], - "oemCopy": ["OEM_COPY"], - "oemAuto": ["OEM_AUTO"], - "oemEnlw": ["OEM_ENLW"], - "oemBacktab": ["OEM_BACKTAB"], - "attn": ["ATTN"], - "crsel": ["CRSEL"], - "exsel": ["EXSEL"], - "ereof": ["EREOF"], - "play": ["PLAY"], - "zoom": ["ZOOM"], - "noname": ["NONAME"], - "pa1": ["PA1"], - "oemClear": ["OEM_CLEAR"], - "0": ["0"], - "1": ["1"], - "2": ["2"], - "3": ["3"], - "4": ["4"], - "5": ["5"], - "6": ["6"], - "7": ["7"], - "8": ["8"], - "9": ["9"], - "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"] -} diff --git a/dev/tools/gen_keycodes/data/keyboard_map_android_cc.tmpl b/dev/tools/gen_keycodes/data/keyboard_map_android_cc.tmpl deleted file mode 100644 index ae876554ef..0000000000 --- a/dev/tools/gen_keycodes/data/keyboard_map_android_cc.tmpl +++ /dev/null @@ -1,30 +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. - -#include - -// DO NOT EDIT -- DO NOT EDIT -- DO NOT EDIT -// This file is generated by flutter/flutter@dev/tools/gen_keycodes/bin/gen_keycodes.dart and -// should not be edited directly. -// -// Edit the template dev/tools/gen_keycodes/data/keyboard_map_android_cc.tmpl instead. -// See dev/tools/gen_keycodes/README.md for more information. - -// Maps Android-specific key codes to the matching LogicalKeyboardKey id. -const std::map g_android_to_logical_key = { -@@@ANDROID_KEY_CODE_MAP@@@ -}; - -// Maps Android-specific scan codes to the matching PhysicalKeyboardKey id (a.k.a. HID USB code). -const std::map g_android_to_physical_key = { -@@@ANDROID_SCAN_CODE_MAP@@@ -}; - -// A map of Android key codes which have printable representations, but appear -// on the number pad. Used to provide different key objects for keys like -// KEY_EQUALS and NUMPAD_EQUALS. Maps Android key codes to PhysicalKeyboardKey -// codes (USB HID codes). -const std::map g_android_numpad_map = { -@@@ANDROID_NUMPAD_MAP@@@ -}; diff --git a/dev/tools/gen_keycodes/data/keyboard_map_linux_cc.tmpl b/dev/tools/gen_keycodes/data/keyboard_map_linux_cc.tmpl deleted file mode 100644 index d27d37dcfa..0000000000 --- a/dev/tools/gen_keycodes/data/keyboard_map_linux_cc.tmpl +++ /dev/null @@ -1,17 +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. - -#include - -// DO NOT EDIT -- DO NOT EDIT -- DO NOT EDIT -// This file is generated by flutter/flutter@dev/tools/gen_keycodes/bin/gen_keycodes.dart and -// should not be edited directly. -// -// Edit the template dev/tools/gen_keycodes/data/keyboard_map_android_cc.tmpl instead. -// See dev/tools/gen_keycodes/README.md for more information. - -/// Maps XKB specific key code values representing [PhysicalKeyboardKey]. -const std::map g_xkb_to_physical_key = { -@@@XKB_SCAN_CODE_MAP@@@ -}; diff --git a/dev/tools/gen_keycodes/data/keyboard_map_macos_cc.tmpl b/dev/tools/gen_keycodes/data/keyboard_map_macos_cc.tmpl deleted file mode 100644 index 29f5c83b13..0000000000 --- a/dev/tools/gen_keycodes/data/keyboard_map_macos_cc.tmpl +++ /dev/null @@ -1,32 +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. - -#include - -// DO NOT EDIT -- DO NOT EDIT -- DO NOT EDIT -// This file is generated by flutter/flutter@dev/tools/gen_keycodes/bin/gen_keycodes.dart and -// should not be edited directly. -// -// Edit the template dev/tools/gen_keycodes/data/keyboard_map_macos_cc.tmpl instead. -// See dev/tools/gen_keycodes/README.md for more information. - -// Maps macOS-specific key code values representing [PhysicalKeyboardKey]. -// -// MacOS doesn't provide a scan code, but a virtual keycode to represent a physical key. -const std::map g_macos_to_physical_key = { -@@@MACOS_SCAN_CODE_MAP@@@ -}; - -// A map of macOS key codes which have printable representations, but appear -// on the number pad. Used to provide different key objects for keys like -// KEY_EQUALS and NUMPAD_EQUALS. -const std::map g_macos_numpad_map = { -@@@MACOS_NUMPAD_MAP@@@ -}; - -// A map of macOS key codes which are numbered function keys, so that they -// can be excluded when asking "is the Fn modifier down?". -const std::map g_macos_function_key_map = { -@@@MACOS_FUNCTION_KEY_MAP@@@ -}; diff --git a/dev/tools/gen_keycodes/data/keyboard_map_windows_cc.tmpl b/dev/tools/gen_keycodes/data/keyboard_map_windows_cc.tmpl deleted file mode 100644 index 082b60c2a1..0000000000 --- a/dev/tools/gen_keycodes/data/keyboard_map_windows_cc.tmpl +++ /dev/null @@ -1,29 +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. - -#include - -// DO NOT EDIT -- DO NOT EDIT -- DO NOT EDIT -// This file is generated by flutter/flutter@dev/tools/gen_keycodes/bin/gen_keycodes.dart and -// should not be edited directly. -// -// Edit the template dev/tools/gen_keycodes/data/keyboard_map_windows_cc.tmpl instead. -// See dev/tools/gen_keycodes/README.md for more information. - -/// Maps g_windows_to_physical_key specific key code values representing [PhysicalKeyboardKey]. -const std::map g_windows_to_physical_key = { -@@@WINDOWS_SCAN_CODE_MAP@@@ -}; - -/// Maps Windows-specific key codes to the matching [LogicalKeyboardKey]. -const std::map g_windows_to_logical_key = { -@@@WINDOWS_KEY_CODE_MAP@@@ -}; - -/// A map of GLFW key codes which have printable representations, but appear -/// on the number pad. Used to provide different key objects for keys like -/// KEY_EQUALS and NUMPAD_EQUALS. -const std::map g_windows_numpad_map = { -@@@WINDOWS_NUMPAD_MAP@@@ -}; diff --git a/dev/tools/gen_keycodes/data/keyboard_maps.tmpl b/dev/tools/gen_keycodes/data/keyboard_maps.tmpl index c141cf7d74..4331d1cec0 100644 --- a/dev/tools/gen_keycodes/data/keyboard_maps.tmpl +++ b/dev/tools/gen_keycodes/data/keyboard_maps.tmpl @@ -59,6 +59,16 @@ const Map kMacOsFunctionKeyMap = kMacOsToLogicalKey = { +@@@MACOS_KEY_CODE_MAP@@@ +}; + /// Maps iOS-specific key code values representing [PhysicalKeyboardKey]. /// /// iOS doesn't provide a scan code, but a virtual keycode to represent a physical key. @@ -73,6 +83,16 @@ const Map kIosNumPadMap = { @@@IOS_NUMPAD_MAP@@@ }; +/// A map of iOS key codes presenting [LogicalKeyboardKey]. +/// +/// Logical key codes are not available in iOS key events. Most of the logical keys +/// are derived from its `characterIgnoringModifiers`, but those keys that don't +/// have a character representation will be derived from their key codes using +/// this map. +const Map kIosToLogicalKey = { +@@@IOS_KEY_CODE_MAP@@@ +}; + /// Maps GLFW-specific key codes to the matching [LogicalKeyboardKey]. const Map kGlfwToLogicalKey = { @@@GLFW_KEY_CODE_MAP@@@ @@ -119,6 +139,13 @@ const Map kWebNumPadMap = > kWebLocationMap = >{ +@@@WEB_LOCATION_MAP@@@ +}; + /// Maps Windows KeyboardEvent codes to the matching [LogicalKeyboardKey]. const Map kWindowsToLogicalKey = { @@@WINDOWS_LOGICAL_KEY_MAP@@@ diff --git a/dev/tools/gen_keycodes/data/logical_key_data.json b/dev/tools/gen_keycodes/data/logical_key_data.json new file mode 100644 index 0000000000..32349c1d1b --- /dev/null +++ b/dev/tools/gen_keycodes/data/logical_key_data.json @@ -0,0 +1,10984 @@ +{ + "None": { + "name": "None", + "value": 0, + "names": { + "web": [ + "None" + ], + "android": [ + "UNKNOWN" + ] + }, + "values": { + "web": [ + 0 + ], + "android": [ + 0 + ], + "fuchsia": [ + 0 + ] + } + }, + "Space": { + "name": "Space", + "value": 32, + "keyLabel": " ", + "names": { + "web": [ + "Space" + ], + "gtk": [ + "KP_Space" + ], + "windows": [ + "SPACE" + ], + "android": [ + "SPACE" + ] + }, + "values": { + "web": [ + 32 + ], + "gtk": [ + 65408 + ], + "windows": [ + 32 + ], + "android": [ + 62 + ], + "fuchsia": [ + 4295426092 + ] + } + }, + "Exclamation": { + "name": "Exclamation", + "value": 33, + "keyLabel": "!", + "names": { + "web": [ + "Exclamation" + ] + }, + "values": { + "web": [ + 33 + ] + } + }, + "Quote": { + "name": "Quote", + "value": 34, + "keyLabel": "\"", + "names": { + "web": [ + "Quote" + ], + "windows": [ + "OEM_7" + ], + "android": [ + "APOSTROPHE" + ] + }, + "values": { + "web": [ + 34 + ], + "windows": [ + 222 + ], + "android": [ + 75 + ], + "fuchsia": [ + 4295426100 + ] + } + }, + "NumberSign": { + "name": "NumberSign", + "value": 35, + "keyLabel": "#", + "names": { + "web": [ + "NumberSign" + ] + }, + "values": { + "web": [ + 35 + ] + } + }, + "Dollar": { + "name": "Dollar", + "value": 36, + "keyLabel": "$", + "names": { + "web": [ + "Dollar" + ] + }, + "values": { + "web": [ + 36 + ] + } + }, + "Percent": { + "name": "Percent", + "value": 37, + "keyLabel": "%", + "names": { + "web": [ + "Percent" + ] + }, + "values": { + "web": [ + 37 + ] + } + }, + "Ampersand": { + "name": "Ampersand", + "value": 38, + "keyLabel": "&", + "names": { + "web": [ + "Ampersand" + ] + }, + "values": { + "web": [ + 38 + ] + } + }, + "QuoteSingle": { + "name": "QuoteSingle", + "value": 39, + "keyLabel": "'", + "names": { + "web": [ + "QuoteSingle" + ] + }, + "values": { + "web": [ + 39 + ] + } + }, + "ParenthesisLeft": { + "name": "ParenthesisLeft", + "value": 40, + "keyLabel": "(", + "names": { + "web": [ + "ParenthesisLeft" + ] + }, + "values": { + "web": [ + 40 + ] + } + }, + "ParenthesisRight": { + "name": "ParenthesisRight", + "value": 41, + "keyLabel": ")", + "names": { + "web": [ + "ParenthesisRight" + ] + }, + "values": { + "web": [ + 41 + ] + } + }, + "Asterisk": { + "name": "Asterisk", + "value": 42, + "keyLabel": "*", + "names": { + "web": [ + "Asterisk" + ] + }, + "values": { + "web": [ + 42 + ] + } + }, + "Add": { + "name": "Add", + "value": 43, + "keyLabel": "+", + "names": { + "web": [ + "Add" + ] + }, + "values": { + "web": [ + 43 + ] + } + }, + "Comma": { + "name": "Comma", + "value": 44, + "keyLabel": ",", + "names": { + "web": [ + "Comma" + ], + "windows": [ + "OEM_COMMA" + ], + "android": [ + "COMMA" + ] + }, + "values": { + "web": [ + 44 + ], + "windows": [ + 188 + ], + "android": [ + 55 + ], + "fuchsia": [ + 4295426102 + ] + } + }, + "Minus": { + "name": "Minus", + "value": 45, + "keyLabel": "-", + "names": { + "web": [ + "Minus" + ], + "windows": [ + "OEM_MINUS" + ], + "android": [ + "MINUS" + ] + }, + "values": { + "web": [ + 45 + ], + "windows": [ + 189 + ], + "android": [ + 69 + ], + "fuchsia": [ + 4295426093 + ] + } + }, + "Period": { + "name": "Period", + "value": 46, + "keyLabel": ".", + "names": { + "web": [ + "Period" + ], + "gtk": [ + "KP_Decimal" + ], + "windows": [ + "OEM_PERIOD" + ], + "android": [ + "PERIOD" + ] + }, + "values": { + "web": [ + 46 + ], + "gtk": [ + 65454 + ], + "windows": [ + 190 + ], + "android": [ + 56 + ], + "fuchsia": [ + 4295426103 + ] + } + }, + "Slash": { + "name": "Slash", + "value": 47, + "keyLabel": "/", + "names": { + "web": [ + "Slash" + ], + "windows": [ + "OEM_2" + ], + "android": [ + "SLASH" + ] + }, + "values": { + "web": [ + 47 + ], + "windows": [ + 191 + ], + "android": [ + 76 + ], + "fuchsia": [ + 4295426104 + ] + } + }, + "Digit0": { + "name": "Digit0", + "value": 48, + "keyLabel": "0", + "names": { + "web": [ + "Digit0" + ], + "android": [ + "0" + ] + }, + "values": { + "web": [ + 48 + ], + "android": [ + 7 + ], + "fuchsia": [ + 4295426087 + ] + } + }, + "Digit1": { + "name": "Digit1", + "value": 49, + "keyLabel": "1", + "names": { + "web": [ + "Digit1" + ], + "android": [ + "1" + ] + }, + "values": { + "web": [ + 49 + ], + "android": [ + 8 + ], + "fuchsia": [ + 4295426078 + ] + } + }, + "Digit2": { + "name": "Digit2", + "value": 50, + "keyLabel": "2", + "names": { + "web": [ + "Digit2" + ], + "android": [ + "2" + ] + }, + "values": { + "web": [ + 50 + ], + "android": [ + 9 + ], + "fuchsia": [ + 4295426079 + ] + } + }, + "Digit3": { + "name": "Digit3", + "value": 51, + "keyLabel": "3", + "names": { + "web": [ + "Digit3" + ], + "android": [ + "3" + ] + }, + "values": { + "web": [ + 51 + ], + "android": [ + 10 + ], + "fuchsia": [ + 4295426080 + ] + } + }, + "Digit4": { + "name": "Digit4", + "value": 52, + "keyLabel": "4", + "names": { + "web": [ + "Digit4" + ], + "android": [ + "4" + ] + }, + "values": { + "web": [ + 52 + ], + "android": [ + 11 + ], + "fuchsia": [ + 4295426081 + ] + } + }, + "Digit5": { + "name": "Digit5", + "value": 53, + "keyLabel": "5", + "names": { + "web": [ + "Digit5" + ], + "android": [ + "5" + ] + }, + "values": { + "web": [ + 53 + ], + "android": [ + 12 + ], + "fuchsia": [ + 4295426082 + ] + } + }, + "Digit6": { + "name": "Digit6", + "value": 54, + "keyLabel": "6", + "names": { + "web": [ + "Digit6" + ], + "android": [ + "6" + ] + }, + "values": { + "web": [ + 54 + ], + "android": [ + 13 + ], + "fuchsia": [ + 4295426083 + ] + } + }, + "Digit7": { + "name": "Digit7", + "value": 55, + "keyLabel": "7", + "names": { + "web": [ + "Digit7" + ], + "android": [ + "7" + ] + }, + "values": { + "web": [ + 55 + ], + "android": [ + 14 + ], + "fuchsia": [ + 4295426084 + ] + } + }, + "Digit8": { + "name": "Digit8", + "value": 56, + "keyLabel": "8", + "names": { + "web": [ + "Digit8" + ], + "android": [ + "8" + ] + }, + "values": { + "web": [ + 56 + ], + "android": [ + 15 + ], + "fuchsia": [ + 4295426085 + ] + } + }, + "Digit9": { + "name": "Digit9", + "value": 57, + "keyLabel": "9", + "names": { + "web": [ + "Digit9" + ], + "android": [ + "9" + ] + }, + "values": { + "web": [ + 57 + ], + "android": [ + 16 + ], + "fuchsia": [ + 4295426086 + ] + } + }, + "Colon": { + "name": "Colon", + "value": 58, + "keyLabel": ":", + "names": { + "web": [ + "Colon" + ] + }, + "values": { + "web": [ + 58 + ] + } + }, + "Semicolon": { + "name": "Semicolon", + "value": 59, + "keyLabel": ";", + "names": { + "web": [ + "Semicolon" + ], + "windows": [ + "OEM_1" + ], + "android": [ + "SEMICOLON" + ] + }, + "values": { + "web": [ + 59 + ], + "windows": [ + 186 + ], + "android": [ + 74 + ], + "fuchsia": [ + 4295426099 + ] + } + }, + "Less": { + "name": "Less", + "value": 60, + "keyLabel": "<", + "names": { + "web": [ + "Less" + ] + }, + "values": { + "web": [ + 60 + ] + } + }, + "Equal": { + "name": "Equal", + "value": 61, + "keyLabel": "=", + "names": { + "web": [ + "Equal" + ], + "windows": [ + "OEM_PLUS" + ], + "android": [ + "EQUALS" + ] + }, + "values": { + "web": [ + 61 + ], + "windows": [ + 187 + ], + "android": [ + 70 + ], + "fuchsia": [ + 4295426094 + ] + } + }, + "Greater": { + "name": "Greater", + "value": 62, + "keyLabel": ">", + "names": { + "web": [ + "Greater" + ] + }, + "values": { + "web": [ + 62 + ] + } + }, + "Question": { + "name": "Question", + "value": 63, + "keyLabel": "?", + "names": { + "web": [ + "Question" + ] + }, + "values": { + "web": [ + 63 + ] + } + }, + "At": { + "name": "At", + "value": 64, + "keyLabel": "@", + "names": { + "web": [ + "At" + ] + }, + "values": { + "web": [ + 64 + ] + } + }, + "BracketLeft": { + "name": "BracketLeft", + "value": 91, + "keyLabel": "[", + "names": { + "web": [ + "BracketLeft" + ], + "windows": [ + "OEM_4" + ], + "android": [ + "LEFT_BRACKET" + ] + }, + "values": { + "web": [ + 91 + ], + "windows": [ + 219 + ], + "android": [ + 71 + ], + "fuchsia": [ + 4295426095 + ] + } + }, + "Backslash": { + "name": "Backslash", + "value": 92, + "keyLabel": "\\", + "names": { + "web": [ + "Backslash" + ], + "windows": [ + "OEM_5" + ], + "android": [ + "BACKSLASH" + ] + }, + "values": { + "web": [ + 92 + ], + "windows": [ + 220 + ], + "android": [ + 73 + ], + "fuchsia": [ + 4295426097 + ] + } + }, + "BracketRight": { + "name": "BracketRight", + "value": 93, + "keyLabel": "]", + "names": { + "web": [ + "BracketRight" + ], + "windows": [ + "OEM_6" + ], + "android": [ + "RIGHT_BRACKET" + ] + }, + "values": { + "web": [ + 93 + ], + "windows": [ + 221 + ], + "android": [ + 72 + ], + "fuchsia": [ + 4295426096 + ] + } + }, + "Caret": { + "name": "Caret", + "value": 94, + "keyLabel": "^", + "names": { + "web": [ + "Caret" + ] + }, + "values": { + "web": [ + 94 + ] + } + }, + "Underscore": { + "name": "Underscore", + "value": 95, + "keyLabel": "_", + "names": { + "web": [ + "Underscore" + ] + }, + "values": { + "web": [ + 95 + ] + } + }, + "Backquote": { + "name": "Backquote", + "value": 96, + "keyLabel": "`", + "names": { + "web": [ + "Backquote" + ], + "windows": [ + "OEM_3" + ], + "android": [ + "GRAVE" + ] + }, + "values": { + "web": [ + 96 + ], + "windows": [ + 192 + ], + "android": [ + 68 + ], + "fuchsia": [ + 4295426101 + ] + } + }, + "KeyA": { + "name": "KeyA", + "value": 97, + "keyLabel": "a", + "names": { + "web": [ + "KeyA" + ], + "android": [ + "A" + ] + }, + "values": { + "web": [ + 97 + ], + "android": [ + 29 + ], + "fuchsia": [ + 4295426052 + ] + } + }, + "KeyB": { + "name": "KeyB", + "value": 98, + "keyLabel": "b", + "names": { + "web": [ + "KeyB" + ], + "android": [ + "B" + ] + }, + "values": { + "web": [ + 98 + ], + "android": [ + 30 + ], + "fuchsia": [ + 4295426053 + ] + } + }, + "KeyC": { + "name": "KeyC", + "value": 99, + "keyLabel": "c", + "names": { + "web": [ + "KeyC" + ], + "android": [ + "C" + ] + }, + "values": { + "web": [ + 99 + ], + "android": [ + 31 + ], + "fuchsia": [ + 4295426054 + ] + } + }, + "KeyD": { + "name": "KeyD", + "value": 100, + "keyLabel": "d", + "names": { + "web": [ + "KeyD" + ], + "android": [ + "D" + ] + }, + "values": { + "web": [ + 100 + ], + "android": [ + 32 + ], + "fuchsia": [ + 4295426055 + ] + } + }, + "KeyE": { + "name": "KeyE", + "value": 101, + "keyLabel": "e", + "names": { + "web": [ + "KeyE" + ], + "android": [ + "E" + ] + }, + "values": { + "web": [ + 101 + ], + "android": [ + 33 + ], + "fuchsia": [ + 4295426056 + ] + } + }, + "KeyF": { + "name": "KeyF", + "value": 102, + "keyLabel": "f", + "names": { + "web": [ + "KeyF" + ], + "android": [ + "F" + ] + }, + "values": { + "web": [ + 102 + ], + "android": [ + 34 + ], + "fuchsia": [ + 4295426057 + ] + } + }, + "KeyG": { + "name": "KeyG", + "value": 103, + "keyLabel": "g", + "names": { + "web": [ + "KeyG" + ], + "android": [ + "G" + ] + }, + "values": { + "web": [ + 103 + ], + "android": [ + 35 + ], + "fuchsia": [ + 4295426058 + ] + } + }, + "KeyH": { + "name": "KeyH", + "value": 104, + "keyLabel": "h", + "names": { + "web": [ + "KeyH" + ], + "android": [ + "H" + ] + }, + "values": { + "web": [ + 104 + ], + "android": [ + 36 + ], + "fuchsia": [ + 4295426059 + ] + } + }, + "KeyI": { + "name": "KeyI", + "value": 105, + "keyLabel": "i", + "names": { + "web": [ + "KeyI" + ], + "android": [ + "I" + ] + }, + "values": { + "web": [ + 105 + ], + "android": [ + 37 + ], + "fuchsia": [ + 4295426060 + ] + } + }, + "KeyJ": { + "name": "KeyJ", + "value": 106, + "keyLabel": "j", + "names": { + "web": [ + "KeyJ" + ], + "android": [ + "J" + ] + }, + "values": { + "web": [ + 106 + ], + "android": [ + 38 + ], + "fuchsia": [ + 4295426061 + ] + } + }, + "KeyK": { + "name": "KeyK", + "value": 107, + "keyLabel": "k", + "names": { + "web": [ + "KeyK" + ], + "android": [ + "K" + ] + }, + "values": { + "web": [ + 107 + ], + "android": [ + 39 + ], + "fuchsia": [ + 4295426062 + ] + } + }, + "KeyL": { + "name": "KeyL", + "value": 108, + "keyLabel": "l", + "names": { + "web": [ + "KeyL" + ], + "android": [ + "L" + ] + }, + "values": { + "web": [ + 108 + ], + "android": [ + 40 + ], + "fuchsia": [ + 4295426063 + ] + } + }, + "KeyM": { + "name": "KeyM", + "value": 109, + "keyLabel": "m", + "names": { + "web": [ + "KeyM" + ], + "android": [ + "M" + ] + }, + "values": { + "web": [ + 109 + ], + "android": [ + 41 + ], + "fuchsia": [ + 4295426064 + ] + } + }, + "KeyN": { + "name": "KeyN", + "value": 110, + "keyLabel": "n", + "names": { + "web": [ + "KeyN" + ], + "android": [ + "N" + ] + }, + "values": { + "web": [ + 110 + ], + "android": [ + 42 + ], + "fuchsia": [ + 4295426065 + ] + } + }, + "KeyO": { + "name": "KeyO", + "value": 111, + "keyLabel": "o", + "names": { + "web": [ + "KeyO" + ], + "android": [ + "O" + ] + }, + "values": { + "web": [ + 111 + ], + "android": [ + 43 + ], + "fuchsia": [ + 4295426066 + ] + } + }, + "KeyP": { + "name": "KeyP", + "value": 112, + "keyLabel": "p", + "names": { + "web": [ + "KeyP" + ], + "android": [ + "P" + ] + }, + "values": { + "web": [ + 112 + ], + "android": [ + 44 + ], + "fuchsia": [ + 4295426067 + ] + } + }, + "KeyQ": { + "name": "KeyQ", + "value": 113, + "keyLabel": "q", + "names": { + "web": [ + "KeyQ" + ], + "android": [ + "Q" + ] + }, + "values": { + "web": [ + 113 + ], + "android": [ + 45 + ], + "fuchsia": [ + 4295426068 + ] + } + }, + "KeyR": { + "name": "KeyR", + "value": 114, + "keyLabel": "r", + "names": { + "web": [ + "KeyR" + ], + "android": [ + "R" + ] + }, + "values": { + "web": [ + 114 + ], + "android": [ + 46 + ], + "fuchsia": [ + 4295426069 + ] + } + }, + "KeyS": { + "name": "KeyS", + "value": 115, + "keyLabel": "s", + "names": { + "web": [ + "KeyS" + ], + "android": [ + "S" + ] + }, + "values": { + "web": [ + 115 + ], + "android": [ + 47 + ], + "fuchsia": [ + 4295426070 + ] + } + }, + "KeyT": { + "name": "KeyT", + "value": 116, + "keyLabel": "t", + "names": { + "web": [ + "KeyT" + ], + "android": [ + "T" + ] + }, + "values": { + "web": [ + 116 + ], + "android": [ + 48 + ], + "fuchsia": [ + 4295426071 + ] + } + }, + "KeyU": { + "name": "KeyU", + "value": 117, + "keyLabel": "u", + "names": { + "web": [ + "KeyU" + ], + "android": [ + "U" + ] + }, + "values": { + "web": [ + 117 + ], + "android": [ + 49 + ], + "fuchsia": [ + 4295426072 + ] + } + }, + "KeyV": { + "name": "KeyV", + "value": 118, + "keyLabel": "v", + "names": { + "web": [ + "KeyV" + ], + "android": [ + "V" + ] + }, + "values": { + "web": [ + 118 + ], + "android": [ + 50 + ], + "fuchsia": [ + 4295426073 + ] + } + }, + "KeyW": { + "name": "KeyW", + "value": 119, + "keyLabel": "w", + "names": { + "web": [ + "KeyW" + ], + "android": [ + "W" + ] + }, + "values": { + "web": [ + 119 + ], + "android": [ + 51 + ], + "fuchsia": [ + 4295426074 + ] + } + }, + "KeyX": { + "name": "KeyX", + "value": 120, + "keyLabel": "x", + "names": { + "web": [ + "KeyX" + ], + "android": [ + "X" + ] + }, + "values": { + "web": [ + 120 + ], + "android": [ + 52 + ], + "fuchsia": [ + 4295426075 + ] + } + }, + "KeyY": { + "name": "KeyY", + "value": 121, + "keyLabel": "y", + "names": { + "web": [ + "KeyY" + ], + "android": [ + "Y" + ] + }, + "values": { + "web": [ + 121 + ], + "android": [ + 53 + ], + "fuchsia": [ + 4295426076 + ] + } + }, + "KeyZ": { + "name": "KeyZ", + "value": 122, + "keyLabel": "z", + "names": { + "web": [ + "KeyZ" + ], + "android": [ + "Z" + ] + }, + "values": { + "web": [ + 122 + ], + "android": [ + 54 + ], + "fuchsia": [ + 4295426077 + ] + } + }, + "BraceLeft": { + "name": "BraceLeft", + "value": 123, + "keyLabel": "{", + "names": { + "web": [ + "BraceLeft" + ] + }, + "values": { + "web": [ + 123 + ] + } + }, + "Bar": { + "name": "Bar", + "value": 124, + "keyLabel": "|", + "names": { + "web": [ + "Bar" + ] + }, + "values": { + "web": [ + 124 + ] + } + }, + "BraceRight": { + "name": "BraceRight", + "value": 125, + "keyLabel": "}", + "names": { + "web": [ + "BraceRight" + ] + }, + "values": { + "web": [ + 125 + ] + } + }, + "Tilde": { + "name": "Tilde", + "value": 126, + "keyLabel": "~", + "names": { + "web": [ + "Tilde" + ] + }, + "values": { + "web": [ + 126 + ] + } + }, + "Unidentified": { + "name": "Unidentified", + "value": 68719476737, + "names": { + "web": [ + "Unidentified" + ] + }, + "values": { + "web": [ + 1 + ] + } + }, + "Backspace": { + "name": "Backspace", + "value": 68719476744, + "keyLabel": "\b", + "names": { + "web": [ + "Backspace" + ], + "macOs": [ + "Backspace" + ], + "ios": [ + "Backspace" + ], + "gtk": [ + "BackSpace" + ], + "windows": [ + "BACK" + ], + "android": [ + "DEL" + ] + }, + "values": { + "web": [ + 8 + ], + "macOs": [ + 51 + ], + "ios": [ + 42 + ], + "gtk": [ + 65288 + ], + "windows": [ + 8 + ], + "android": [ + 67 + ], + "fuchsia": [ + 4295426090 + ] + } + }, + "Tab": { + "name": "Tab", + "value": 68719476745, + "keyLabel": "\t", + "names": { + "web": [ + "Tab" + ], + "gtk": [ + "Tab", + "KP_Tab", + "ISO_Left_Tab" + ], + "windows": [ + "TAB" + ], + "android": [ + "TAB" + ] + }, + "values": { + "web": [ + 9 + ], + "gtk": [ + 65289, + 65417, + 65056 + ], + "windows": [ + 9 + ], + "android": [ + 61 + ], + "fuchsia": [ + 4295426091 + ] + } + }, + "Enter": { + "name": "Enter", + "value": 68719476749, + "keyLabel": "\r", + "names": { + "web": [ + "Enter" + ], + "gtk": [ + "Return", + "ISO_Enter", + "3270_Enter" + ], + "windows": [ + "RETURN" + ], + "android": [ + "ENTER" + ] + }, + "values": { + "web": [ + 13 + ], + "gtk": [ + 65293, + 65076, + 64798 + ], + "windows": [ + 13 + ], + "android": [ + 66 + ], + "fuchsia": [ + 4295426088 + ] + } + }, + "Escape": { + "name": "Escape", + "value": 68719476763, + "keyLabel": "\u001b", + "names": { + "web": [ + "Escape" + ], + "macOs": [ + "Escape" + ], + "ios": [ + "Escape" + ], + "gtk": [ + "Escape" + ], + "windows": [ + "ESCAPE" + ], + "android": [ + "ESCAPE" + ] + }, + "values": { + "web": [ + 27 + ], + "macOs": [ + 53 + ], + "ios": [ + 41 + ], + "gtk": [ + 65307 + ], + "windows": [ + 27 + ], + "android": [ + 111 + ], + "fuchsia": [ + 4295426089 + ] + } + }, + "Delete": { + "name": "Delete", + "value": 68719476863, + "keyLabel": "", + "names": { + "web": [ + "Delete" + ], + "macOs": [ + "Delete" + ], + "ios": [ + "Delete" + ], + "gtk": [ + "Delete" + ], + "windows": [ + "DELETE" + ], + "android": [ + "FORWARD_DEL" + ] + }, + "values": { + "web": [ + 127 + ], + "macOs": [ + 117 + ], + "ios": [ + 76 + ], + "gtk": [ + 65535 + ], + "windows": [ + 46 + ], + "android": [ + 112 + ], + "fuchsia": [ + 4295426124 + ] + } + }, + "Accel": { + "name": "Accel", + "value": 68719476993, + "names": { + "web": [ + "Accel" + ] + }, + "values": { + "web": [ + 257 + ] + } + }, + "AltGraph": { + "name": "AltGraph", + "value": 68719476995, + "names": { + "web": [ + "AltGraph" + ] + }, + "values": { + "web": [ + 259 + ] + } + }, + "CapsLock": { + "name": "CapsLock", + "value": 68719476996, + "names": { + "web": [ + "CapsLock" + ], + "macOs": [ + "CapsLock" + ], + "ios": [ + "CapsLock" + ], + "gtk": [ + "Caps_Lock" + ], + "windows": [ + "CAPITAL" + ], + "android": [ + "CAPS_LOCK" + ] + }, + "values": { + "web": [ + 260 + ], + "macOs": [ + 57 + ], + "ios": [ + 57 + ], + "gtk": [ + 65509 + ], + "windows": [ + 20 + ], + "android": [ + 115 + ], + "fuchsia": [ + 4295426105 + ] + } + }, + "Fn": { + "name": "Fn", + "value": 68719476998, + "names": { + "web": [ + "Fn" + ], + "macOs": [ + "Fn" + ], + "android": [ + "FUNCTION" + ] + }, + "values": { + "web": [ + 262 + ], + "macOs": [ + 63 + ], + "android": [ + 119 + ], + "fuchsia": [ + 4294967314 + ] + } + }, + "FnLock": { + "name": "FnLock", + "value": 68719476999, + "names": { + "web": [ + "FnLock" + ] + }, + "values": { + "web": [ + 263 + ], + "fuchsia": [ + 4294967315 + ] + } + }, + "Hyper": { + "name": "Hyper", + "value": 68719477000, + "names": { + "web": [ + "Hyper" + ], + "gtk": [ + "Hyper_L", + "Hyper_R" + ] + }, + "values": { + "web": [ + 264 + ], + "gtk": [ + 65517, + 65518 + ], + "fuchsia": [ + 4294967312 + ] + } + }, + "NumLock": { + "name": "NumLock", + "value": 68719477002, + "names": { + "web": [ + "NumLock" + ], + "macOs": [ + "NumLock" + ], + "ios": [ + "NumLock" + ], + "gtk": [ + "Num_Lock" + ], + "windows": [ + "NUMLOCK" + ], + "android": [ + "NUM_LOCK" + ] + }, + "values": { + "web": [ + 266 + ], + "macOs": [ + 71 + ], + "ios": [ + 83 + ], + "gtk": [ + 65407 + ], + "windows": [ + 144 + ], + "android": [ + 143 + ], + "fuchsia": [ + 4295426131 + ] + } + }, + "ScrollLock": { + "name": "ScrollLock", + "value": 68719477004, + "names": { + "web": [ + "ScrollLock" + ], + "gtk": [ + "Scroll_Lock" + ], + "windows": [ + "SCROLL" + ], + "android": [ + "SCROLL_LOCK" + ] + }, + "values": { + "web": [ + 268 + ], + "gtk": [ + 65300 + ], + "windows": [ + 145 + ], + "android": [ + 116 + ], + "fuchsia": [ + 4295426119 + ] + } + }, + "Super": { + "name": "Super", + "value": 68719477006, + "names": { + "web": [ + "Super" + ], + "gtk": [ + "Super_L", + "Super_R" + ] + }, + "values": { + "web": [ + 270 + ], + "gtk": [ + 65515, + 65516 + ], + "fuchsia": [ + 4294967313 + ] + } + }, + "Symbol": { + "name": "Symbol", + "value": 68719477007, + "names": { + "web": [ + "Symbol" + ], + "android": [ + "SYM" + ] + }, + "values": { + "web": [ + 271 + ], + "android": [ + 63 + ] + } + }, + "SymbolLock": { + "name": "SymbolLock", + "value": 68719477008, + "names": { + "web": [ + "SymbolLock" + ] + }, + "values": { + "web": [ + 272 + ] + } + }, + "ShiftLevel5": { + "name": "ShiftLevel5", + "value": 68719477009, + "names": { + "web": [ + "ShiftLevel5" + ] + }, + "values": { + "web": [ + 273 + ] + } + }, + "ArrowDown": { + "name": "ArrowDown", + "value": 68719477505, + "names": { + "web": [ + "ArrowDown" + ], + "macOs": [ + "ArrowDown" + ], + "ios": [ + "ArrowDown" + ], + "gtk": [ + "Down" + ], + "windows": [ + "DOWN" + ], + "android": [ + "DPAD_DOWN" + ] + }, + "values": { + "web": [ + 769 + ], + "macOs": [ + 125 + ], + "ios": [ + 81 + ], + "gtk": [ + 65364 + ], + "windows": [ + 40 + ], + "android": [ + 20 + ], + "fuchsia": [ + 4295426129 + ] + } + }, + "ArrowLeft": { + "name": "ArrowLeft", + "value": 68719477506, + "names": { + "web": [ + "ArrowLeft" + ], + "macOs": [ + "ArrowLeft" + ], + "ios": [ + "ArrowLeft" + ], + "gtk": [ + "Left" + ], + "windows": [ + "LEFT" + ], + "android": [ + "DPAD_LEFT" + ] + }, + "values": { + "web": [ + 770 + ], + "macOs": [ + 123 + ], + "ios": [ + 80 + ], + "gtk": [ + 65361 + ], + "windows": [ + 37 + ], + "android": [ + 21 + ], + "fuchsia": [ + 4295426128 + ] + } + }, + "ArrowRight": { + "name": "ArrowRight", + "value": 68719477507, + "names": { + "web": [ + "ArrowRight" + ], + "macOs": [ + "ArrowRight" + ], + "ios": [ + "ArrowRight" + ], + "gtk": [ + "Right" + ], + "windows": [ + "RIGHT" + ], + "android": [ + "DPAD_RIGHT" + ] + }, + "values": { + "web": [ + 771 + ], + "macOs": [ + 124 + ], + "ios": [ + 79 + ], + "gtk": [ + 65363 + ], + "windows": [ + 39 + ], + "android": [ + 22 + ], + "fuchsia": [ + 4295426127 + ] + } + }, + "ArrowUp": { + "name": "ArrowUp", + "value": 68719477508, + "names": { + "web": [ + "ArrowUp" + ], + "macOs": [ + "ArrowUp" + ], + "ios": [ + "ArrowUp" + ], + "gtk": [ + "Up" + ], + "windows": [ + "UP" + ], + "android": [ + "DPAD_UP" + ] + }, + "values": { + "web": [ + 772 + ], + "macOs": [ + 126 + ], + "ios": [ + 82 + ], + "gtk": [ + 65362 + ], + "windows": [ + 38 + ], + "android": [ + 19 + ], + "fuchsia": [ + 4295426130 + ] + } + }, + "End": { + "name": "End", + "value": 68719477509, + "names": { + "web": [ + "End" + ], + "macOs": [ + "End" + ], + "ios": [ + "End" + ], + "gtk": [ + "End" + ], + "windows": [ + "END" + ], + "android": [ + "MOVE_END" + ] + }, + "values": { + "web": [ + 773 + ], + "macOs": [ + 119 + ], + "ios": [ + 77 + ], + "gtk": [ + 65367 + ], + "windows": [ + 35 + ], + "android": [ + 123 + ], + "fuchsia": [ + 4295426125 + ] + } + }, + "Home": { + "name": "Home", + "value": 68719477510, + "names": { + "web": [ + "Home" + ], + "macOs": [ + "Home" + ], + "ios": [ + "Home" + ], + "gtk": [ + "Home" + ], + "windows": [ + "HOME" + ], + "android": [ + "MOVE_HOME" + ] + }, + "values": { + "web": [ + 774 + ], + "macOs": [ + 115 + ], + "ios": [ + 74 + ], + "gtk": [ + 65360 + ], + "windows": [ + 36 + ], + "android": [ + 122 + ], + "fuchsia": [ + 4295426122 + ] + } + }, + "PageDown": { + "name": "PageDown", + "value": 68719477511, + "names": { + "web": [ + "PageDown" + ], + "macOs": [ + "PageDown" + ], + "ios": [ + "PageDown" + ], + "gtk": [ + "Page_Down" + ], + "windows": [ + "NEXT" + ], + "android": [ + "PAGE_DOWN" + ] + }, + "values": { + "web": [ + 775 + ], + "macOs": [ + 121 + ], + "ios": [ + 78 + ], + "gtk": [ + 65366 + ], + "windows": [ + 34 + ], + "android": [ + 93 + ], + "fuchsia": [ + 4295426126 + ] + } + }, + "PageUp": { + "name": "PageUp", + "value": 68719477512, + "names": { + "web": [ + "PageUp" + ], + "macOs": [ + "PageUp" + ], + "ios": [ + "PageUp" + ], + "gtk": [ + "Page_Up" + ], + "windows": [ + "PRIOR" + ], + "android": [ + "PAGE_UP" + ] + }, + "values": { + "web": [ + 776 + ], + "macOs": [ + 116 + ], + "ios": [ + 75 + ], + "gtk": [ + 65365 + ], + "windows": [ + 33 + ], + "android": [ + 92 + ], + "fuchsia": [ + 4295426123 + ] + } + }, + "Clear": { + "name": "Clear", + "value": 68719477761, + "names": { + "web": [ + "Clear" + ], + "gtk": [ + "Clear" + ], + "windows": [ + "CLEAR" + ], + "android": [ + "CLEAR" + ] + }, + "values": { + "web": [ + 1025 + ], + "gtk": [ + 65291 + ], + "windows": [ + 12 + ], + "android": [ + 28 + ] + } + }, + "Copy": { + "name": "Copy", + "value": 68719477762, + "names": { + "web": [ + "Copy" + ], + "gtk": [ + "3270_Copy", + "Copy" + ], + "android": [ + "COPY" + ] + }, + "values": { + "web": [ + 1026 + ], + "gtk": [ + 64789, + 269025111 + ], + "android": [ + 278 + ], + "fuchsia": [ + 4295426172 + ] + } + }, + "CrSel": { + "name": "CrSel", + "value": 68719477763, + "names": { + "web": [ + "CrSel" + ] + }, + "values": { + "web": [ + 1027 + ] + } + }, + "Cut": { + "name": "Cut", + "value": 68719477764, + "names": { + "web": [ + "Cut" + ], + "gtk": [ + "Cut" + ], + "android": [ + "CUT" + ] + }, + "values": { + "web": [ + 1028 + ], + "gtk": [ + 269025112 + ], + "android": [ + 277 + ], + "fuchsia": [ + 4295426171 + ] + } + }, + "EraseEof": { + "name": "EraseEof", + "value": 68719477765, + "names": { + "web": [ + "EraseEof" + ], + "gtk": [ + "3270_EraseEOF" + ] + }, + "values": { + "web": [ + 1029 + ], + "gtk": [ + 64774 + ] + } + }, + "ExSel": { + "name": "ExSel", + "value": 68719477766, + "names": { + "web": [ + "ExSel" + ], + "gtk": [ + "3270_ExSelect" + ] + }, + "values": { + "web": [ + 1030 + ], + "gtk": [ + 64795 + ] + } + }, + "Insert": { + "name": "Insert", + "value": 68719477767, + "names": { + "web": [ + "Insert" + ], + "macOs": [ + "Insert" + ], + "ios": [ + "Insert" + ], + "gtk": [ + "Insert" + ], + "windows": [ + "INSERT" + ], + "android": [ + "INSERT" + ] + }, + "values": { + "web": [ + 1031 + ], + "macOs": [ + 114 + ], + "ios": [ + 73 + ], + "gtk": [ + 65379 + ], + "windows": [ + 45 + ], + "android": [ + 124 + ], + "fuchsia": [ + 4295426121 + ] + } + }, + "Paste": { + "name": "Paste", + "value": 68719477768, + "names": { + "web": [ + "Paste" + ], + "gtk": [ + "Paste" + ], + "android": [ + "PASTE" + ] + }, + "values": { + "web": [ + 1032 + ], + "gtk": [ + 269025133 + ], + "android": [ + 279 + ], + "fuchsia": [ + 4295426173 + ] + } + }, + "Redo": { + "name": "Redo", + "value": 68719477769, + "names": { + "web": [ + "Redo" + ], + "gtk": [ + "Redo" + ] + }, + "values": { + "web": [ + 1033 + ], + "gtk": [ + 65382 + ], + "fuchsia": [ + 4295754361 + ] + } + }, + "Undo": { + "name": "Undo", + "value": 68719477770, + "names": { + "web": [ + "Undo" + ], + "gtk": [ + "Undo" + ] + }, + "values": { + "web": [ + 1034 + ], + "gtk": [ + 65381 + ], + "fuchsia": [ + 4295426170 + ] + } + }, + "Accept": { + "name": "Accept", + "value": 68719478017, + "names": { + "web": [ + "Accept" + ], + "windows": [ + "ACCEPT" + ] + }, + "values": { + "web": [ + 1281 + ], + "windows": [ + 30 + ] + } + }, + "Again": { + "name": "Again", + "value": 68719478018, + "names": { + "web": [ + "Again" + ] + }, + "values": { + "web": [ + 1282 + ], + "fuchsia": [ + 4295426169 + ] + } + }, + "Attn": { + "name": "Attn", + "value": 68719478019, + "names": { + "web": [ + "Attn" + ], + "gtk": [ + "3270_Attn" + ], + "windows": [ + "ATTN" + ] + }, + "values": { + "web": [ + 1283 + ], + "gtk": [ + 64782 + ], + "windows": [ + 246 + ] + } + }, + "Cancel": { + "name": "Cancel", + "value": 68719478020, + "names": { + "web": [ + "Cancel" + ], + "gtk": [ + "Cancel" + ], + "windows": [ + "CANCEL" + ] + }, + "values": { + "web": [ + 1284 + ], + "gtk": [ + 65385 + ], + "windows": [ + 3 + ] + } + }, + "ContextMenu": { + "name": "ContextMenu", + "value": 68719478021, + "names": { + "web": [ + "ContextMenu" + ], + "macOs": [ + "ContextMenu" + ], + "ios": [ + "ContextMenu" + ], + "gtk": [ + "Menu" + ], + "windows": [ + "APPS" + ], + "android": [ + "MENU" + ] + }, + "values": { + "web": [ + 1285 + ], + "macOs": [ + 110 + ], + "ios": [ + 101 + ], + "gtk": [ + 65383 + ], + "windows": [ + 93 + ], + "android": [ + 82 + ], + "fuchsia": [ + 4295426149 + ] + } + }, + "Execute": { + "name": "Execute", + "value": 68719478022, + "names": { + "web": [ + "Execute" + ], + "gtk": [ + "Execute" + ], + "windows": [ + "EXECUTE" + ] + }, + "values": { + "web": [ + 1286 + ], + "gtk": [ + 65378 + ], + "windows": [ + 43 + ] + } + }, + "Find": { + "name": "Find", + "value": 68719478023, + "names": { + "web": [ + "Find" + ], + "gtk": [ + "Find" + ] + }, + "values": { + "web": [ + 1287 + ], + "gtk": [ + 65384 + ], + "fuchsia": [ + 4295426174 + ] + } + }, + "Help": { + "name": "Help", + "value": 68719478024, + "names": { + "web": [ + "Help" + ], + "gtk": [ + "Help" + ], + "windows": [ + "HELP" + ], + "android": [ + "HELP" + ] + }, + "values": { + "web": [ + 1288 + ], + "gtk": [ + 65386 + ], + "windows": [ + 47 + ], + "android": [ + 259 + ], + "fuchsia": [ + 4295426165 + ] + } + }, + "Pause": { + "name": "Pause", + "value": 68719478025, + "names": { + "web": [ + "Pause" + ], + "gtk": [ + "Pause" + ], + "windows": [ + "PAUSE" + ], + "android": [ + "BREAK" + ] + }, + "values": { + "web": [ + 1289 + ], + "gtk": [ + 65299 + ], + "windows": [ + 19 + ], + "android": [ + 121 + ], + "fuchsia": [ + 4295426120 + ] + } + }, + "Play": { + "name": "Play", + "value": 68719478026, + "names": { + "web": [ + "Play" + ], + "windows": [ + "PLAY" + ] + }, + "values": { + "web": [ + 1290 + ], + "windows": [ + 250 + ] + } + }, + "Props": { + "name": "Props", + "value": 68719478027, + "names": { + "web": [ + "Props" + ] + }, + "values": { + "web": [ + 1291 + ], + "fuchsia": [ + 4295426211 + ] + } + }, + "Select": { + "name": "Select", + "value": 68719478028, + "names": { + "web": [ + "Select" + ], + "gtk": [ + "Select" + ], + "windows": [ + "SELECT" + ], + "android": [ + "DPAD_CENTER" + ] + }, + "values": { + "web": [ + 1292 + ], + "gtk": [ + 65376 + ], + "windows": [ + 41 + ], + "android": [ + 23 + ], + "fuchsia": [ + 4295426167 + ] + } + }, + "ZoomIn": { + "name": "ZoomIn", + "value": 68719478029, + "names": { + "web": [ + "ZoomIn" + ], + "gtk": [ + "ZoomIn" + ], + "android": [ + "ZOOM_IN" + ] + }, + "values": { + "web": [ + 1293 + ], + "gtk": [ + 269025163 + ], + "android": [ + 168 + ], + "fuchsia": [ + 4295754285 + ] + } + }, + "ZoomOut": { + "name": "ZoomOut", + "value": 68719478030, + "names": { + "web": [ + "ZoomOut" + ], + "gtk": [ + "ZoomOut" + ], + "android": [ + "ZOOM_OUT" + ] + }, + "values": { + "web": [ + 1294 + ], + "gtk": [ + 269025164 + ], + "android": [ + 169 + ], + "fuchsia": [ + 4295754286 + ] + } + }, + "BrightnessDown": { + "name": "BrightnessDown", + "value": 68719478273, + "names": { + "web": [ + "BrightnessDown" + ], + "gtk": [ + "MonBrightnessDown" + ], + "android": [ + "BRIGHTNESS_DOWN" + ] + }, + "values": { + "web": [ + 1537 + ], + "gtk": [ + 269025027 + ], + "android": [ + 220 + ], + "fuchsia": [ + 4295753840 + ] + } + }, + "BrightnessUp": { + "name": "BrightnessUp", + "value": 68719478274, + "names": { + "web": [ + "BrightnessUp" + ], + "gtk": [ + "MonBrightnessUp" + ], + "android": [ + "BRIGHTNESS_UP" + ] + }, + "values": { + "web": [ + 1538 + ], + "gtk": [ + 269025026 + ], + "android": [ + 221 + ], + "fuchsia": [ + 4295753839 + ] + } + }, + "Camera": { + "name": "Camera", + "value": 68719478275, + "names": { + "web": [ + "Camera" + ], + "android": [ + "CAMERA" + ] + }, + "values": { + "web": [ + 1539 + ], + "android": [ + 27 + ] + } + }, + "Eject": { + "name": "Eject", + "value": 68719478276, + "names": { + "web": [ + "Eject" + ], + "gtk": [ + "Eject" + ], + "android": [ + "MEDIA_EJECT" + ] + }, + "values": { + "web": [ + 1540 + ], + "gtk": [ + 269025068 + ], + "android": [ + 129 + ], + "fuchsia": [ + 4295753912 + ] + } + }, + "LogOff": { + "name": "LogOff", + "value": 68719478277, + "names": { + "web": [ + "LogOff" + ], + "gtk": [ + "LogOff" + ] + }, + "values": { + "web": [ + 1541 + ], + "gtk": [ + 269025121 + ], + "fuchsia": [ + 4295754140 + ] + } + }, + "Power": { + "name": "Power", + "value": 68719478278, + "names": { + "web": [ + "Power" + ], + "android": [ + "POWER" + ] + }, + "values": { + "web": [ + 1542 + ], + "android": [ + 26 + ], + "fuchsia": [ + 4295426150 + ] + } + }, + "PowerOff": { + "name": "PowerOff", + "value": 68719478279, + "names": { + "web": [ + "PowerOff" + ], + "gtk": [ + "PowerOff" + ] + }, + "values": { + "web": [ + 1543 + ], + "gtk": [ + 269025066 + ] + } + }, + "PrintScreen": { + "name": "PrintScreen", + "value": 68719478280, + "names": { + "web": [ + "PrintScreen" + ], + "gtk": [ + "3270_PrintScreen" + ], + "android": [ + "SYSRQ" + ] + }, + "values": { + "web": [ + 1544 + ], + "gtk": [ + 64797 + ], + "android": [ + 120 + ], + "fuchsia": [ + 4295426118 + ] + } + }, + "Hibernate": { + "name": "Hibernate", + "value": 68719478281, + "names": { + "web": [ + "Hibernate" + ] + }, + "values": { + "web": [ + 1545 + ] + } + }, + "Standby": { + "name": "Standby", + "value": 68719478282, + "names": { + "web": [ + "Standby" + ], + "gtk": [ + "Standby" + ] + }, + "values": { + "web": [ + 1546 + ], + "gtk": [ + 269025040 + ] + } + }, + "WakeUp": { + "name": "WakeUp", + "value": 68719478283, + "names": { + "web": [ + "WakeUp" + ], + "gtk": [ + "WakeUp" + ], + "android": [ + "WAKEUP" + ] + }, + "values": { + "web": [ + 1547 + ], + "gtk": [ + 269025067 + ], + "android": [ + 224 + ], + "fuchsia": [ + 4295032963 + ] + } + }, + "AllCandidates": { + "name": "AllCandidates", + "value": 68719478529, + "names": { + "web": [ + "AllCandidates" + ] + }, + "values": { + "web": [ + 1793 + ] + } + }, + "Alphanumeric": { + "name": "Alphanumeric", + "value": 68719478530, + "names": { + "web": [ + "Alphanumeric" + ] + }, + "values": { + "web": [ + 1794 + ] + } + }, + "CodeInput": { + "name": "CodeInput", + "value": 68719478531, + "names": { + "web": [ + "CodeInput" + ], + "gtk": [ + "Codeinput" + ] + }, + "values": { + "web": [ + 1795 + ], + "gtk": [ + 65335 + ] + } + }, + "Compose": { + "name": "Compose", + "value": 68719478532, + "names": { + "web": [ + "Compose" + ] + }, + "values": { + "web": [ + 1796 + ] + } + }, + "Convert": { + "name": "Convert", + "value": 68719478533, + "names": { + "web": [ + "Convert" + ], + "windows": [ + "CONVERT" + ], + "android": [ + "HENKAN" + ] + }, + "values": { + "web": [ + 1797 + ], + "windows": [ + 28 + ], + "android": [ + 214 + ], + "fuchsia": [ + 4295426186 + ] + } + }, + "FinalMode": { + "name": "FinalMode", + "value": 68719478534, + "names": { + "web": [ + "FinalMode" + ], + "windows": [ + "FINAL" + ] + }, + "values": { + "web": [ + 1798 + ], + "windows": [ + 24 + ] + } + }, + "GroupFirst": { + "name": "GroupFirst", + "value": 68719478535, + "names": { + "web": [ + "GroupFirst" + ], + "gtk": [ + "ISO_First_Group" + ] + }, + "values": { + "web": [ + 1799 + ], + "gtk": [ + 65036 + ] + } + }, + "GroupLast": { + "name": "GroupLast", + "value": 68719478536, + "names": { + "web": [ + "GroupLast" + ], + "gtk": [ + "ISO_Last_Group" + ] + }, + "values": { + "web": [ + 1800 + ], + "gtk": [ + 65038 + ] + } + }, + "GroupNext": { + "name": "GroupNext", + "value": 68719478537, + "names": { + "web": [ + "GroupNext" + ], + "gtk": [ + "ISO_Next_Group" + ], + "android": [ + "LANGUAGE_SWITCH" + ] + }, + "values": { + "web": [ + 1801 + ], + "gtk": [ + 65032 + ], + "android": [ + 204 + ] + } + }, + "GroupPrevious": { + "name": "GroupPrevious", + "value": 68719478538, + "names": { + "web": [ + "GroupPrevious" + ], + "gtk": [ + "ISO_Prev_Group" + ] + }, + "values": { + "web": [ + 1802 + ], + "gtk": [ + 65034 + ] + } + }, + "ModeChange": { + "name": "ModeChange", + "value": 68719478539, + "names": { + "web": [ + "ModeChange" + ], + "gtk": [ + "Mode_switch" + ], + "windows": [ + "MODECHANGE" + ], + "android": [ + "SWITCH_CHARSET" + ] + }, + "values": { + "web": [ + 1803 + ], + "gtk": [ + 65406 + ], + "windows": [ + 31 + ], + "android": [ + 95 + ] + } + }, + "NextCandidate": { + "name": "NextCandidate", + "value": 68719478540, + "names": { + "web": [ + "NextCandidate" + ] + }, + "values": { + "web": [ + 1804 + ] + } + }, + "NonConvert": { + "name": "NonConvert", + "value": 68719478541, + "names": { + "web": [ + "NonConvert" + ], + "android": [ + "MUHENKAN" + ] + }, + "values": { + "web": [ + 1805 + ], + "android": [ + 213 + ], + "fuchsia": [ + 4295426187 + ] + } + }, + "PreviousCandidate": { + "name": "PreviousCandidate", + "value": 68719478542, + "names": { + "web": [ + "PreviousCandidate" + ], + "gtk": [ + "PreviousCandidate" + ] + }, + "values": { + "web": [ + 1806 + ], + "gtk": [ + 65342 + ] + } + }, + "Process": { + "name": "Process", + "value": 68719478543, + "names": { + "web": [ + "Process" + ] + }, + "values": { + "web": [ + 1807 + ] + } + }, + "SingleCandidate": { + "name": "SingleCandidate", + "value": 68719478544, + "names": { + "web": [ + "SingleCandidate" + ], + "gtk": [ + "SingleCandidate" + ] + }, + "values": { + "web": [ + 1808 + ], + "gtk": [ + 65340 + ] + } + }, + "HangulMode": { + "name": "HangulMode", + "value": 68719478545, + "names": { + "web": [ + "HangulMode" + ], + "gtk": [ + "Hangul" + ] + }, + "values": { + "web": [ + 1809 + ], + "gtk": [ + 65329 + ] + } + }, + "HanjaMode": { + "name": "HanjaMode", + "value": 68719478546, + "names": { + "web": [ + "HanjaMode" + ], + "gtk": [ + "Hangul_Hanja" + ], + "windows": [ + "HANJA" + ] + }, + "values": { + "web": [ + 1810 + ], + "gtk": [ + 65332 + ], + "windows": [ + 25 + ] + } + }, + "JunjaMode": { + "name": "JunjaMode", + "value": 68719478547, + "names": { + "web": [ + "JunjaMode" + ], + "windows": [ + "JUNJA" + ] + }, + "values": { + "web": [ + 1811 + ], + "windows": [ + 23 + ] + } + }, + "Eisu": { + "name": "Eisu", + "value": 68719478548, + "names": { + "web": [ + "Eisu" + ], + "gtk": [ + "Eisu_Shift" + ], + "android": [ + "EISU" + ] + }, + "values": { + "web": [ + 1812 + ], + "gtk": [ + 65327 + ], + "android": [ + 212 + ] + } + }, + "Hankaku": { + "name": "Hankaku", + "value": 68719478549, + "names": { + "web": [ + "Hankaku" + ], + "gtk": [ + "Hankaku" + ] + }, + "values": { + "web": [ + 1813 + ], + "gtk": [ + 65321 + ] + } + }, + "Hiragana": { + "name": "Hiragana", + "value": 68719478550, + "names": { + "web": [ + "Hiragana" + ], + "gtk": [ + "Hiragana" + ] + }, + "values": { + "web": [ + 1814 + ], + "gtk": [ + 65317 + ] + } + }, + "HiraganaKatakana": { + "name": "HiraganaKatakana", + "value": 68719478551, + "names": { + "web": [ + "HiraganaKatakana" + ], + "gtk": [ + "Hiragana_Katakana" + ], + "android": [ + "KATAKANA_HIRAGANA" + ] + }, + "values": { + "web": [ + 1815 + ], + "gtk": [ + 65319 + ], + "android": [ + 215 + ] + } + }, + "KanaMode": { + "name": "KanaMode", + "value": 68719478552, + "names": { + "web": [ + "KanaMode" + ] + }, + "values": { + "web": [ + 1816 + ], + "fuchsia": [ + 4295426184 + ] + } + }, + "KanjiMode": { + "name": "KanjiMode", + "value": 68719478553, + "names": { + "web": [ + "KanjiMode" + ], + "gtk": [ + "Kanji" + ], + "windows": [ + "KANJI" + ], + "android": [ + "KANA" + ] + }, + "values": { + "web": [ + 1817 + ], + "gtk": [ + 65313 + ], + "windows": [ + 25 + ], + "android": [ + 218 + ] + } + }, + "Katakana": { + "name": "Katakana", + "value": 68719478554, + "names": { + "web": [ + "Katakana" + ], + "gtk": [ + "Katakana" + ] + }, + "values": { + "web": [ + 1818 + ], + "gtk": [ + 65318 + ] + } + }, + "Romaji": { + "name": "Romaji", + "value": 68719478555, + "names": { + "web": [ + "Romaji" + ], + "gtk": [ + "Romaji" + ] + }, + "values": { + "web": [ + 1819 + ], + "gtk": [ + 65316 + ] + } + }, + "Zenkaku": { + "name": "Zenkaku", + "value": 68719478556, + "names": { + "web": [ + "Zenkaku" + ], + "gtk": [ + "Zenkaku" + ] + }, + "values": { + "web": [ + 1820 + ], + "gtk": [ + 65320 + ] + } + }, + "ZenkakuHankaku": { + "name": "ZenkakuHankaku", + "value": 68719478557, + "names": { + "web": [ + "ZenkakuHankaku" + ], + "gtk": [ + "Zenkaku_Hankaku" + ], + "android": [ + "ZENKAKU_HANKAKU" + ] + }, + "values": { + "web": [ + 1821 + ], + "gtk": [ + 65322 + ], + "android": [ + 211 + ] + } + }, + "F1": { + "name": "F1", + "value": 68719478785, + "names": { + "web": [ + "F1" + ], + "macOs": [ + "F1" + ], + "ios": [ + "F1" + ], + "gtk": [ + "KP_F1", + "F1" + ], + "windows": [ + "F1" + ], + "android": [ + "F1" + ] + }, + "values": { + "web": [ + 2049 + ], + "macOs": [ + 122 + ], + "ios": [ + 58 + ], + "gtk": [ + 65425, + 65470 + ], + "windows": [ + 112 + ], + "android": [ + 131 + ], + "fuchsia": [ + 4295426106 + ] + } + }, + "F2": { + "name": "F2", + "value": 68719478786, + "names": { + "web": [ + "F2" + ], + "macOs": [ + "F2" + ], + "ios": [ + "F2" + ], + "gtk": [ + "KP_F2", + "F2" + ], + "windows": [ + "F2" + ], + "android": [ + "F2" + ] + }, + "values": { + "web": [ + 2050 + ], + "macOs": [ + 120 + ], + "ios": [ + 59 + ], + "gtk": [ + 65426, + 65471 + ], + "windows": [ + 113 + ], + "android": [ + 132 + ], + "fuchsia": [ + 4295426107 + ] + } + }, + "F3": { + "name": "F3", + "value": 68719478787, + "names": { + "web": [ + "F3" + ], + "macOs": [ + "F3" + ], + "ios": [ + "F3" + ], + "gtk": [ + "KP_F3", + "F3" + ], + "windows": [ + "F3" + ], + "android": [ + "F3" + ] + }, + "values": { + "web": [ + 2051 + ], + "macOs": [ + 99 + ], + "ios": [ + 60 + ], + "gtk": [ + 65427, + 65472 + ], + "windows": [ + 114 + ], + "android": [ + 133 + ], + "fuchsia": [ + 4295426108 + ] + } + }, + "F4": { + "name": "F4", + "value": 68719478788, + "names": { + "web": [ + "F4" + ], + "macOs": [ + "F4" + ], + "ios": [ + "F4" + ], + "gtk": [ + "KP_F4", + "F4" + ], + "windows": [ + "F4" + ], + "android": [ + "F4" + ] + }, + "values": { + "web": [ + 2052 + ], + "macOs": [ + 118 + ], + "ios": [ + 61 + ], + "gtk": [ + 65428, + 65473 + ], + "windows": [ + 115 + ], + "android": [ + 134 + ], + "fuchsia": [ + 4295426109 + ] + } + }, + "F5": { + "name": "F5", + "value": 68719478789, + "names": { + "web": [ + "F5" + ], + "macOs": [ + "F5" + ], + "ios": [ + "F5" + ], + "gtk": [ + "F5" + ], + "windows": [ + "F5" + ], + "android": [ + "F5" + ] + }, + "values": { + "web": [ + 2053 + ], + "macOs": [ + 96 + ], + "ios": [ + 62 + ], + "gtk": [ + 65474 + ], + "windows": [ + 116 + ], + "android": [ + 135 + ], + "fuchsia": [ + 4295426110 + ] + } + }, + "F6": { + "name": "F6", + "value": 68719478790, + "names": { + "web": [ + "F6" + ], + "macOs": [ + "F6" + ], + "ios": [ + "F6" + ], + "gtk": [ + "F6" + ], + "windows": [ + "F6" + ], + "android": [ + "F6" + ] + }, + "values": { + "web": [ + 2054 + ], + "macOs": [ + 97 + ], + "ios": [ + 63 + ], + "gtk": [ + 65475 + ], + "windows": [ + 117 + ], + "android": [ + 136 + ], + "fuchsia": [ + 4295426111 + ] + } + }, + "F7": { + "name": "F7", + "value": 68719478791, + "names": { + "web": [ + "F7" + ], + "macOs": [ + "F7" + ], + "ios": [ + "F7" + ], + "gtk": [ + "F7" + ], + "windows": [ + "F7" + ], + "android": [ + "F7" + ] + }, + "values": { + "web": [ + 2055 + ], + "macOs": [ + 98 + ], + "ios": [ + 64 + ], + "gtk": [ + 65476 + ], + "windows": [ + 118 + ], + "android": [ + 137 + ], + "fuchsia": [ + 4295426112 + ] + } + }, + "F8": { + "name": "F8", + "value": 68719478792, + "names": { + "web": [ + "F8" + ], + "macOs": [ + "F8" + ], + "ios": [ + "F8" + ], + "gtk": [ + "F8" + ], + "windows": [ + "F8" + ], + "android": [ + "F8" + ] + }, + "values": { + "web": [ + 2056 + ], + "macOs": [ + 100 + ], + "ios": [ + 65 + ], + "gtk": [ + 65477 + ], + "windows": [ + 119 + ], + "android": [ + 138 + ], + "fuchsia": [ + 4295426113 + ] + } + }, + "F9": { + "name": "F9", + "value": 68719478793, + "names": { + "web": [ + "F9" + ], + "macOs": [ + "F9" + ], + "ios": [ + "F9" + ], + "gtk": [ + "F9" + ], + "windows": [ + "F9" + ], + "android": [ + "F9" + ] + }, + "values": { + "web": [ + 2057 + ], + "macOs": [ + 101 + ], + "ios": [ + 66 + ], + "gtk": [ + 65478 + ], + "windows": [ + 120 + ], + "android": [ + 139 + ], + "fuchsia": [ + 4295426114 + ] + } + }, + "F10": { + "name": "F10", + "value": 68719478794, + "names": { + "web": [ + "F10" + ], + "macOs": [ + "F10" + ], + "ios": [ + "F10" + ], + "gtk": [ + "F10" + ], + "windows": [ + "F10" + ], + "android": [ + "F10" + ] + }, + "values": { + "web": [ + 2058 + ], + "macOs": [ + 109 + ], + "ios": [ + 67 + ], + "gtk": [ + 65479 + ], + "windows": [ + 121 + ], + "android": [ + 140 + ], + "fuchsia": [ + 4295426115 + ] + } + }, + "F11": { + "name": "F11", + "value": 68719478795, + "names": { + "web": [ + "F11" + ], + "macOs": [ + "F11" + ], + "ios": [ + "F11" + ], + "gtk": [ + "F11" + ], + "windows": [ + "F11" + ], + "android": [ + "F11" + ] + }, + "values": { + "web": [ + 2059 + ], + "macOs": [ + 103 + ], + "ios": [ + 68 + ], + "gtk": [ + 65480 + ], + "windows": [ + 122 + ], + "android": [ + 141 + ], + "fuchsia": [ + 4295426116 + ] + } + }, + "F12": { + "name": "F12", + "value": 68719478796, + "names": { + "web": [ + "F12" + ], + "macOs": [ + "F12" + ], + "ios": [ + "F12" + ], + "gtk": [ + "F12" + ], + "windows": [ + "F12" + ], + "android": [ + "F12" + ] + }, + "values": { + "web": [ + 2060 + ], + "macOs": [ + 111 + ], + "ios": [ + 69 + ], + "gtk": [ + 65481 + ], + "windows": [ + 123 + ], + "android": [ + 142 + ], + "fuchsia": [ + 4295426117 + ] + } + }, + "F13": { + "name": "F13", + "value": 68719478797, + "names": { + "web": [ + "F13" + ], + "macOs": [ + "F13" + ], + "ios": [ + "F13" + ], + "gtk": [ + "F13" + ], + "windows": [ + "F13" + ] + }, + "values": { + "web": [ + 2061 + ], + "macOs": [ + 105 + ], + "ios": [ + 104 + ], + "gtk": [ + 65482 + ], + "windows": [ + 124 + ], + "fuchsia": [ + 4295426152 + ] + } + }, + "F14": { + "name": "F14", + "value": 68719478798, + "names": { + "web": [ + "F14" + ], + "macOs": [ + "F14" + ], + "ios": [ + "F14" + ], + "gtk": [ + "F14" + ], + "windows": [ + "F14" + ] + }, + "values": { + "web": [ + 2062 + ], + "macOs": [ + 107 + ], + "ios": [ + 105 + ], + "gtk": [ + 65483 + ], + "windows": [ + 125 + ], + "fuchsia": [ + 4295426153 + ] + } + }, + "F15": { + "name": "F15", + "value": 68719478799, + "names": { + "web": [ + "F15" + ], + "macOs": [ + "F15" + ], + "ios": [ + "F15" + ], + "gtk": [ + "F15" + ], + "windows": [ + "F15" + ] + }, + "values": { + "web": [ + 2063 + ], + "macOs": [ + 113 + ], + "ios": [ + 106 + ], + "gtk": [ + 65484 + ], + "windows": [ + 126 + ], + "fuchsia": [ + 4295426154 + ] + } + }, + "F16": { + "name": "F16", + "value": 68719478800, + "names": { + "web": [ + "F16" + ], + "macOs": [ + "F16" + ], + "ios": [ + "F16" + ], + "gtk": [ + "F16" + ], + "windows": [ + "F16" + ] + }, + "values": { + "web": [ + 2064 + ], + "macOs": [ + 106 + ], + "ios": [ + 107 + ], + "gtk": [ + 65485 + ], + "windows": [ + 127 + ], + "fuchsia": [ + 4295426155 + ] + } + }, + "F17": { + "name": "F17", + "value": 68719478801, + "names": { + "web": [ + "F17" + ], + "macOs": [ + "F17" + ], + "ios": [ + "F17" + ], + "gtk": [ + "F17" + ], + "windows": [ + "F17" + ] + }, + "values": { + "web": [ + 2065 + ], + "macOs": [ + 64 + ], + "ios": [ + 108 + ], + "gtk": [ + 65486 + ], + "windows": [ + 128 + ], + "fuchsia": [ + 4295426156 + ] + } + }, + "F18": { + "name": "F18", + "value": 68719478802, + "names": { + "web": [ + "F18" + ], + "macOs": [ + "F18" + ], + "ios": [ + "F18" + ], + "gtk": [ + "F18" + ], + "windows": [ + "F18" + ] + }, + "values": { + "web": [ + 2066 + ], + "macOs": [ + 79 + ], + "ios": [ + 109 + ], + "gtk": [ + 65487 + ], + "windows": [ + 129 + ], + "fuchsia": [ + 4295426157 + ] + } + }, + "F19": { + "name": "F19", + "value": 68719478803, + "names": { + "web": [ + "F19" + ], + "macOs": [ + "F19" + ], + "ios": [ + "F19" + ], + "gtk": [ + "F19" + ], + "windows": [ + "F19" + ] + }, + "values": { + "web": [ + 2067 + ], + "macOs": [ + 80 + ], + "ios": [ + 110 + ], + "gtk": [ + 65488 + ], + "windows": [ + 130 + ], + "fuchsia": [ + 4295426158 + ] + } + }, + "F20": { + "name": "F20", + "value": 68719478804, + "names": { + "web": [ + "F20" + ], + "macOs": [ + "F20" + ], + "ios": [ + "F20" + ], + "gtk": [ + "F20" + ], + "windows": [ + "F20" + ] + }, + "values": { + "web": [ + 2068 + ], + "macOs": [ + 90 + ], + "ios": [ + 111 + ], + "gtk": [ + 65489 + ], + "windows": [ + 131 + ], + "fuchsia": [ + 4295426159 + ] + } + }, + "F21": { + "name": "F21", + "value": 68719478805, + "names": { + "web": [ + "F21" + ], + "gtk": [ + "F21" + ], + "windows": [ + "F21" + ] + }, + "values": { + "web": [ + 2069 + ], + "gtk": [ + 65490 + ], + "windows": [ + 132 + ], + "fuchsia": [ + 4295426160 + ] + } + }, + "F22": { + "name": "F22", + "value": 68719478806, + "names": { + "web": [ + "F22" + ], + "gtk": [ + "F22" + ], + "windows": [ + "F22" + ] + }, + "values": { + "web": [ + 2070 + ], + "gtk": [ + 65491 + ], + "windows": [ + 133 + ], + "fuchsia": [ + 4295426161 + ] + } + }, + "F23": { + "name": "F23", + "value": 68719478807, + "names": { + "web": [ + "F23" + ], + "gtk": [ + "F23" + ], + "windows": [ + "F23" + ] + }, + "values": { + "web": [ + 2071 + ], + "gtk": [ + 65492 + ], + "windows": [ + 134 + ], + "fuchsia": [ + 4295426162 + ] + } + }, + "F24": { + "name": "F24", + "value": 68719478808, + "names": { + "web": [ + "F24" + ], + "gtk": [ + "F24" + ], + "windows": [ + "F24" + ] + }, + "values": { + "web": [ + 2072 + ], + "gtk": [ + 65493 + ], + "windows": [ + 135 + ], + "fuchsia": [ + 4295426163 + ] + } + }, + "Soft1": { + "name": "Soft1", + "value": 68719479041, + "names": { + "web": [ + "Soft1" + ] + }, + "values": { + "web": [ + 2305 + ] + } + }, + "Soft2": { + "name": "Soft2", + "value": 68719479042, + "names": { + "web": [ + "Soft2" + ] + }, + "values": { + "web": [ + 2306 + ] + } + }, + "Soft3": { + "name": "Soft3", + "value": 68719479043, + "names": { + "web": [ + "Soft3" + ] + }, + "values": { + "web": [ + 2307 + ] + } + }, + "Soft4": { + "name": "Soft4", + "value": 68719479044, + "names": { + "web": [ + "Soft4" + ] + }, + "values": { + "web": [ + 2308 + ] + } + }, + "Soft5": { + "name": "Soft5", + "value": 68719479045, + "names": { + "web": [ + "Soft5" + ] + }, + "values": { + "web": [ + 2309 + ] + } + }, + "Soft6": { + "name": "Soft6", + "value": 68719479046, + "names": { + "web": [ + "Soft6" + ] + }, + "values": { + "web": [ + 2310 + ] + } + }, + "Soft7": { + "name": "Soft7", + "value": 68719479047, + "names": { + "web": [ + "Soft7" + ] + }, + "values": { + "web": [ + 2311 + ] + } + }, + "Soft8": { + "name": "Soft8", + "value": 68719479048, + "names": { + "web": [ + "Soft8" + ] + }, + "values": { + "web": [ + 2312 + ] + } + }, + "Close": { + "name": "Close", + "value": 68719479297, + "names": { + "web": [ + "Close" + ], + "gtk": [ + "Close" + ], + "android": [ + "MEDIA_CLOSE" + ] + }, + "values": { + "web": [ + 2561 + ], + "gtk": [ + 269025110 + ], + "android": [ + 128 + ], + "fuchsia": [ + 4295754243 + ] + } + }, + "MailForward": { + "name": "MailForward", + "value": 68719479298, + "names": { + "web": [ + "MailForward" + ], + "gtk": [ + "MailForward" + ] + }, + "values": { + "web": [ + 2562 + ], + "gtk": [ + 269025168 + ], + "fuchsia": [ + 4295754379 + ] + } + }, + "MailReply": { + "name": "MailReply", + "value": 68719479299, + "names": { + "web": [ + "MailReply" + ], + "gtk": [ + "Reply" + ] + }, + "values": { + "web": [ + 2563 + ], + "gtk": [ + 269025138 + ], + "fuchsia": [ + 4295754377 + ] + } + }, + "MailSend": { + "name": "MailSend", + "value": 68719479300, + "names": { + "web": [ + "MailSend" + ], + "gtk": [ + "Send" + ] + }, + "values": { + "web": [ + 2564 + ], + "gtk": [ + 269025147 + ], + "fuchsia": [ + 4295754380 + ] + } + }, + "MediaPlayPause": { + "name": "MediaPlayPause", + "value": 68719479301, + "names": { + "web": [ + "MediaPlayPause" + ], + "windows": [ + "MEDIA_PLAY_PAUSE" + ], + "android": [ + "MEDIA_PLAY_PAUSE" + ] + }, + "values": { + "web": [ + 2565 + ], + "windows": [ + 179 + ], + "android": [ + 85 + ], + "fuchsia": [ + 4295753933 + ] + } + }, + "MediaStop": { + "name": "MediaStop", + "value": 68719479303, + "names": { + "web": [ + "MediaStop" + ], + "gtk": [ + "AudioStop" + ], + "windows": [ + "MEDIA_STOP" + ], + "android": [ + "MEDIA_STOP" + ] + }, + "values": { + "web": [ + 2567 + ], + "gtk": [ + 269025045 + ], + "windows": [ + 178 + ], + "android": [ + 86 + ], + "fuchsia": [ + 4295753911 + ] + } + }, + "MediaTrackNext": { + "name": "MediaTrackNext", + "value": 68719479304, + "names": { + "web": [ + "MediaTrackNext" + ], + "gtk": [ + "AudioNext" + ], + "android": [ + "MEDIA_NEXT" + ] + }, + "values": { + "web": [ + 2568 + ], + "gtk": [ + 269025047 + ], + "android": [ + 87 + ], + "fuchsia": [ + 4295753909 + ] + } + }, + "MediaTrackPrevious": { + "name": "MediaTrackPrevious", + "value": 68719479305, + "names": { + "web": [ + "MediaTrackPrevious" + ], + "gtk": [ + "AudioPrev" + ], + "android": [ + "MEDIA_PREVIOUS" + ] + }, + "values": { + "web": [ + 2569 + ], + "gtk": [ + 269025046 + ], + "android": [ + 88 + ], + "fuchsia": [ + 4295753910 + ] + } + }, + "New": { + "name": "New", + "value": 68719479306, + "names": { + "web": [ + "New" + ], + "gtk": [ + "New" + ] + }, + "values": { + "web": [ + 2570 + ], + "gtk": [ + 269025128 + ], + "fuchsia": [ + 4295754241 + ] + } + }, + "Open": { + "name": "Open", + "value": 68719479307, + "names": { + "web": [ + "Open" + ], + "gtk": [ + "Open" + ] + }, + "values": { + "web": [ + 2571 + ], + "gtk": [ + 269025131 + ], + "fuchsia": [ + 4295426164 + ] + } + }, + "Print": { + "name": "Print", + "value": 68719479308, + "names": { + "web": [ + "Print" + ], + "gtk": [ + "Print" + ], + "windows": [ + "PRINT" + ] + }, + "values": { + "web": [ + 2572 + ], + "gtk": [ + 65377 + ], + "windows": [ + 42 + ], + "fuchsia": [ + 4295754248 + ] + } + }, + "Save": { + "name": "Save", + "value": 68719479309, + "names": { + "web": [ + "Save" + ], + "gtk": [ + "Save" + ] + }, + "values": { + "web": [ + 2573 + ], + "gtk": [ + 269025143 + ], + "fuchsia": [ + 4295754247 + ] + } + }, + "SpellCheck": { + "name": "SpellCheck", + "value": 68719479310, + "names": { + "web": [ + "SpellCheck" + ], + "gtk": [ + "Spell" + ] + }, + "values": { + "web": [ + 2574 + ], + "gtk": [ + 269025148 + ], + "fuchsia": [ + 4295754155 + ] + } + }, + "AudioVolumeDown": { + "name": "AudioVolumeDown", + "value": 68719479311, + "names": { + "web": [ + "AudioVolumeDown" + ], + "macOs": [ + "AudioVolumeDown" + ], + "ios": [ + "AudioVolumeDown" + ], + "gtk": [ + "AudioLowerVolume" + ], + "windows": [ + "VOLUME_DOWN" + ], + "android": [ + "VOLUME_DOWN" + ] + }, + "values": { + "web": [ + 2575 + ], + "macOs": [ + 73 + ], + "ios": [ + 129 + ], + "gtk": [ + 269025041 + ], + "windows": [ + 174 + ], + "android": [ + 25 + ], + "fuchsia": [ + 4295426177 + ] + } + }, + "AudioVolumeUp": { + "name": "AudioVolumeUp", + "value": 68719479312, + "names": { + "web": [ + "AudioVolumeUp" + ], + "macOs": [ + "AudioVolumeUp" + ], + "ios": [ + "AudioVolumeUp" + ], + "gtk": [ + "AudioRaiseVolume" + ], + "windows": [ + "VOLUME_UP" + ], + "android": [ + "VOLUME_UP" + ] + }, + "values": { + "web": [ + 2576 + ], + "macOs": [ + 72 + ], + "ios": [ + 128 + ], + "gtk": [ + 269025043 + ], + "windows": [ + 175 + ], + "android": [ + 24 + ], + "fuchsia": [ + 4295426176 + ] + } + }, + "AudioVolumeMute": { + "name": "AudioVolumeMute", + "value": 68719479313, + "names": { + "web": [ + "AudioVolumeMute" + ], + "macOs": [ + "AudioVolumeMute" + ], + "ios": [ + "AudioVolumeMute" + ], + "gtk": [ + "AudioMute" + ], + "windows": [ + "VOLUME_MUTE" + ], + "android": [ + "VOLUME_MUTE" + ] + }, + "values": { + "web": [ + 2577 + ], + "macOs": [ + 74 + ], + "ios": [ + 127 + ], + "gtk": [ + 269025042 + ], + "windows": [ + 173 + ], + "android": [ + 164 + ], + "fuchsia": [ + 4295426175 + ] + } + }, + "LaunchApplication2": { + "name": "LaunchApplication2", + "value": 68719479553, + "names": { + "web": [ + "LaunchApplication2" + ] + }, + "values": { + "web": [ + 2817 + ] + } + }, + "LaunchCalendar": { + "name": "LaunchCalendar", + "value": 68719479554, + "names": { + "web": [ + "LaunchCalendar" + ], + "gtk": [ + "Calendar" + ], + "android": [ + "CALENDAR" + ] + }, + "values": { + "web": [ + 2818 + ], + "gtk": [ + 269025056 + ], + "android": [ + 208 + ], + "fuchsia": [ + 4295754126 + ] + } + }, + "LaunchMail": { + "name": "LaunchMail", + "value": 68719479555, + "names": { + "web": [ + "LaunchMail" + ], + "gtk": [ + "Mail" + ], + "windows": [ + "LAUNCH_MAIL" + ], + "android": [ + "ENVELOPE" + ] + }, + "values": { + "web": [ + 2819 + ], + "gtk": [ + 269025049 + ], + "windows": [ + 180 + ], + "android": [ + 65 + ], + "fuchsia": [ + 4295754122 + ] + } + }, + "LaunchMediaPlayer": { + "name": "LaunchMediaPlayer", + "value": 68719479556, + "names": { + "web": [ + "LaunchMediaPlayer" + ] + }, + "values": { + "web": [ + 2820 + ] + } + }, + "LaunchMusicPlayer": { + "name": "LaunchMusicPlayer", + "value": 68719479557, + "names": { + "web": [ + "LaunchMusicPlayer" + ], + "android": [ + "MUSIC" + ] + }, + "values": { + "web": [ + 2821 + ], + "android": [ + 209 + ] + } + }, + "LaunchApplication1": { + "name": "LaunchApplication1", + "value": 68719479558, + "names": { + "web": [ + "LaunchApplication1" + ] + }, + "values": { + "web": [ + 2822 + ] + } + }, + "LaunchScreenSaver": { + "name": "LaunchScreenSaver", + "value": 68719479559, + "names": { + "web": [ + "LaunchScreenSaver" + ], + "gtk": [ + "ScreenSaver" + ] + }, + "values": { + "web": [ + 2823 + ], + "gtk": [ + 269025069 + ], + "fuchsia": [ + 4295754161 + ] + } + }, + "LaunchSpreadsheet": { + "name": "LaunchSpreadsheet", + "value": 68719479560, + "names": { + "web": [ + "LaunchSpreadsheet" + ] + }, + "values": { + "web": [ + 2824 + ], + "fuchsia": [ + 4295754118 + ] + } + }, + "LaunchWebBrowser": { + "name": "LaunchWebBrowser", + "value": 68719479561, + "names": { + "web": [ + "LaunchWebBrowser" + ], + "android": [ + "EXPLORER" + ] + }, + "values": { + "web": [ + 2825 + ], + "android": [ + 64 + ] + } + }, + "LaunchWebCam": { + "name": "LaunchWebCam", + "value": 68719479562, + "names": { + "web": [ + "LaunchWebCam" + ] + }, + "values": { + "web": [ + 2826 + ] + } + }, + "LaunchWordProcessor": { + "name": "LaunchWordProcessor", + "value": 68719479563, + "names": { + "web": [ + "LaunchWordProcessor" + ] + }, + "values": { + "web": [ + 2827 + ], + "fuchsia": [ + 4295754116 + ] + } + }, + "LaunchContacts": { + "name": "LaunchContacts", + "value": 68719479564, + "names": { + "web": [ + "LaunchContacts" + ], + "android": [ + "CONTACTS" + ] + }, + "values": { + "web": [ + 2828 + ], + "android": [ + 207 + ], + "fuchsia": [ + 4295754125 + ] + } + }, + "LaunchPhone": { + "name": "LaunchPhone", + "value": 68719479565, + "names": { + "web": [ + "LaunchPhone" + ], + "gtk": [ + "Phone" + ] + }, + "values": { + "web": [ + 2829 + ], + "gtk": [ + 269025134 + ], + "fuchsia": [ + 4295753868 + ] + } + }, + "LaunchAssistant": { + "name": "LaunchAssistant", + "value": 68719479566, + "names": { + "web": [ + "LaunchAssistant" + ], + "android": [ + "ASSIST" + ] + }, + "values": { + "web": [ + 2830 + ], + "android": [ + 219 + ], + "fuchsia": [ + 4295754187 + ] + } + }, + "LaunchControlPanel": { + "name": "LaunchControlPanel", + "value": 68719479567, + "names": { + "web": [ + "LaunchControlPanel" + ] + }, + "values": { + "web": [ + 2831 + ], + "fuchsia": [ + 4295754143 + ] + } + }, + "BrowserBack": { + "name": "BrowserBack", + "value": 68719479809, + "names": { + "web": [ + "BrowserBack" + ], + "gtk": [ + "Back" + ], + "windows": [ + "BROWSER_BACK" + ] + }, + "values": { + "web": [ + 3073 + ], + "gtk": [ + 269025062 + ], + "windows": [ + 166 + ], + "fuchsia": [ + 4295754276 + ] + } + }, + "BrowserFavorites": { + "name": "BrowserFavorites", + "value": 68719479810, + "names": { + "web": [ + "BrowserFavorites" + ], + "gtk": [ + "Favorites" + ], + "windows": [ + "BROWSER_FAVORITES" + ], + "android": [ + "BOOKMARK" + ] + }, + "values": { + "web": [ + 3074 + ], + "gtk": [ + 269025072 + ], + "windows": [ + 171 + ], + "android": [ + 174 + ], + "fuchsia": [ + 4295754282 + ] + } + }, + "BrowserForward": { + "name": "BrowserForward", + "value": 68719479811, + "names": { + "web": [ + "BrowserForward" + ], + "gtk": [ + "Forward" + ], + "windows": [ + "BROWSER_FORWARD" + ], + "android": [ + "FORWARD" + ] + }, + "values": { + "web": [ + 3075 + ], + "gtk": [ + 269025063 + ], + "windows": [ + 167 + ], + "android": [ + 125 + ], + "fuchsia": [ + 4295754277 + ] + } + }, + "BrowserHome": { + "name": "BrowserHome", + "value": 68719479812, + "names": { + "web": [ + "BrowserHome" + ], + "gtk": [ + "HomePage" + ], + "windows": [ + "BROWSER_HOME" + ] + }, + "values": { + "web": [ + 3076 + ], + "gtk": [ + 269025048 + ], + "windows": [ + 172 + ], + "fuchsia": [ + 4295754275 + ] + } + }, + "BrowserRefresh": { + "name": "BrowserRefresh", + "value": 68719479813, + "names": { + "web": [ + "BrowserRefresh" + ], + "gtk": [ + "Refresh" + ], + "windows": [ + "BROWSER_REFRESH" + ] + }, + "values": { + "web": [ + 3077 + ], + "gtk": [ + 269025065 + ], + "windows": [ + 168 + ], + "fuchsia": [ + 4295754279 + ] + } + }, + "BrowserSearch": { + "name": "BrowserSearch", + "value": 68719479814, + "names": { + "web": [ + "BrowserSearch" + ], + "gtk": [ + "Search" + ], + "windows": [ + "BROWSER_SEARCH" + ], + "android": [ + "SEARCH" + ] + }, + "values": { + "web": [ + 3078 + ], + "gtk": [ + 269025051 + ], + "windows": [ + 170 + ], + "android": [ + 84 + ], + "fuchsia": [ + 4295754273 + ] + } + }, + "BrowserStop": { + "name": "BrowserStop", + "value": 68719479815, + "names": { + "web": [ + "BrowserStop" + ], + "gtk": [ + "Stop" + ], + "windows": [ + "BROWSER_STOP" + ] + }, + "values": { + "web": [ + 3079 + ], + "gtk": [ + 269025064 + ], + "windows": [ + 169 + ], + "fuchsia": [ + 4295754278 + ] + } + }, + "AudioBalanceLeft": { + "name": "AudioBalanceLeft", + "value": 68719480065, + "names": { + "web": [ + "AudioBalanceLeft" + ] + }, + "values": { + "web": [ + 3329 + ] + } + }, + "AudioBalanceRight": { + "name": "AudioBalanceRight", + "value": 68719480066, + "names": { + "web": [ + "AudioBalanceRight" + ] + }, + "values": { + "web": [ + 3330 + ] + } + }, + "AudioBassBoostDown": { + "name": "AudioBassBoostDown", + "value": 68719480067, + "names": { + "web": [ + "AudioBassBoostDown" + ] + }, + "values": { + "web": [ + 3331 + ] + } + }, + "AudioBassBoostUp": { + "name": "AudioBassBoostUp", + "value": 68719480068, + "names": { + "web": [ + "AudioBassBoostUp" + ] + }, + "values": { + "web": [ + 3332 + ] + } + }, + "AudioFaderFront": { + "name": "AudioFaderFront", + "value": 68719480069, + "names": { + "web": [ + "AudioFaderFront" + ] + }, + "values": { + "web": [ + 3333 + ] + } + }, + "AudioFaderRear": { + "name": "AudioFaderRear", + "value": 68719480070, + "names": { + "web": [ + "AudioFaderRear" + ] + }, + "values": { + "web": [ + 3334 + ] + } + }, + "AudioSurroundModeNext": { + "name": "AudioSurroundModeNext", + "value": 68719480071, + "names": { + "web": [ + "AudioSurroundModeNext" + ] + }, + "values": { + "web": [ + 3335 + ] + } + }, + "AVRInput": { + "name": "AVRInput", + "value": 68719480072, + "names": { + "web": [ + "AVRInput" + ], + "android": [ + "AVR_INPUT" + ] + }, + "values": { + "web": [ + 3336 + ], + "android": [ + 182 + ] + } + }, + "AVRPower": { + "name": "AVRPower", + "value": 68719480073, + "names": { + "web": [ + "AVRPower" + ], + "android": [ + "AVR_POWER" + ] + }, + "values": { + "web": [ + 3337 + ], + "android": [ + 181 + ] + } + }, + "ChannelDown": { + "name": "ChannelDown", + "value": 68719480074, + "names": { + "web": [ + "ChannelDown" + ], + "android": [ + "CHANNEL_DOWN" + ] + }, + "values": { + "web": [ + 3338 + ], + "android": [ + 167 + ], + "fuchsia": [ + 4295753885 + ] + } + }, + "ChannelUp": { + "name": "ChannelUp", + "value": 68719480075, + "names": { + "web": [ + "ChannelUp" + ], + "android": [ + "CHANNEL_UP" + ] + }, + "values": { + "web": [ + 3339 + ], + "android": [ + 166 + ], + "fuchsia": [ + 4295753884 + ] + } + }, + "ColorF0Red": { + "name": "ColorF0Red", + "value": 68719480076, + "names": { + "web": [ + "ColorF0Red" + ], + "android": [ + "PROG_RED" + ] + }, + "values": { + "web": [ + 3340 + ], + "android": [ + 183 + ] + } + }, + "ColorF1Green": { + "name": "ColorF1Green", + "value": 68719480077, + "names": { + "web": [ + "ColorF1Green" + ], + "android": [ + "PROG_GREEN" + ] + }, + "values": { + "web": [ + 3341 + ], + "android": [ + 184 + ] + } + }, + "ColorF2Yellow": { + "name": "ColorF2Yellow", + "value": 68719480078, + "names": { + "web": [ + "ColorF2Yellow" + ], + "android": [ + "PROG_YELLOW" + ] + }, + "values": { + "web": [ + 3342 + ], + "android": [ + 185 + ] + } + }, + "ColorF3Blue": { + "name": "ColorF3Blue", + "value": 68719480079, + "names": { + "web": [ + "ColorF3Blue" + ], + "android": [ + "PROG_BLUE" + ] + }, + "values": { + "web": [ + 3343 + ], + "android": [ + 186 + ] + } + }, + "ColorF4Grey": { + "name": "ColorF4Grey", + "value": 68719480080, + "names": { + "web": [ + "ColorF4Grey" + ] + }, + "values": { + "web": [ + 3344 + ] + } + }, + "ColorF5Brown": { + "name": "ColorF5Brown", + "value": 68719480081, + "names": { + "web": [ + "ColorF5Brown" + ] + }, + "values": { + "web": [ + 3345 + ] + } + }, + "ClosedCaptionToggle": { + "name": "ClosedCaptionToggle", + "value": 68719480082, + "names": { + "web": [ + "ClosedCaptionToggle" + ], + "android": [ + "CAPTIONS" + ] + }, + "values": { + "web": [ + 3346 + ], + "android": [ + 175 + ], + "fuchsia": [ + 4295753825 + ] + } + }, + "Dimmer": { + "name": "Dimmer", + "value": 68719480083, + "names": { + "web": [ + "Dimmer" + ] + }, + "values": { + "web": [ + 3347 + ] + } + }, + "DisplaySwap": { + "name": "DisplaySwap", + "value": 68719480084, + "names": { + "web": [ + "DisplaySwap" + ] + }, + "values": { + "web": [ + 3348 + ] + } + }, + "Exit": { + "name": "Exit", + "value": 68719480085, + "names": { + "web": [ + "Exit" + ] + }, + "values": { + "web": [ + 3349 + ], + "fuchsia": [ + 4295753876 + ] + } + }, + "FavoriteClear0": { + "name": "FavoriteClear0", + "value": 68719480086, + "names": { + "web": [ + "FavoriteClear0" + ] + }, + "values": { + "web": [ + 3350 + ] + } + }, + "FavoriteClear1": { + "name": "FavoriteClear1", + "value": 68719480087, + "names": { + "web": [ + "FavoriteClear1" + ] + }, + "values": { + "web": [ + 3351 + ] + } + }, + "FavoriteClear2": { + "name": "FavoriteClear2", + "value": 68719480088, + "names": { + "web": [ + "FavoriteClear2" + ] + }, + "values": { + "web": [ + 3352 + ] + } + }, + "FavoriteClear3": { + "name": "FavoriteClear3", + "value": 68719480089, + "names": { + "web": [ + "FavoriteClear3" + ] + }, + "values": { + "web": [ + 3353 + ] + } + }, + "FavoriteRecall0": { + "name": "FavoriteRecall0", + "value": 68719480090, + "names": { + "web": [ + "FavoriteRecall0" + ] + }, + "values": { + "web": [ + 3354 + ] + } + }, + "FavoriteRecall1": { + "name": "FavoriteRecall1", + "value": 68719480091, + "names": { + "web": [ + "FavoriteRecall1" + ] + }, + "values": { + "web": [ + 3355 + ] + } + }, + "FavoriteRecall2": { + "name": "FavoriteRecall2", + "value": 68719480092, + "names": { + "web": [ + "FavoriteRecall2" + ] + }, + "values": { + "web": [ + 3356 + ] + } + }, + "FavoriteRecall3": { + "name": "FavoriteRecall3", + "value": 68719480093, + "names": { + "web": [ + "FavoriteRecall3" + ] + }, + "values": { + "web": [ + 3357 + ] + } + }, + "FavoriteStore0": { + "name": "FavoriteStore0", + "value": 68719480094, + "names": { + "web": [ + "FavoriteStore0" + ] + }, + "values": { + "web": [ + 3358 + ] + } + }, + "FavoriteStore1": { + "name": "FavoriteStore1", + "value": 68719480095, + "names": { + "web": [ + "FavoriteStore1" + ] + }, + "values": { + "web": [ + 3359 + ] + } + }, + "FavoriteStore2": { + "name": "FavoriteStore2", + "value": 68719480096, + "names": { + "web": [ + "FavoriteStore2" + ] + }, + "values": { + "web": [ + 3360 + ] + } + }, + "FavoriteStore3": { + "name": "FavoriteStore3", + "value": 68719480097, + "names": { + "web": [ + "FavoriteStore3" + ] + }, + "values": { + "web": [ + 3361 + ] + } + }, + "Guide": { + "name": "Guide", + "value": 68719480098, + "names": { + "web": [ + "Guide" + ], + "android": [ + "GUIDE" + ] + }, + "values": { + "web": [ + 3362 + ], + "android": [ + 172 + ] + } + }, + "GuideNextDay": { + "name": "GuideNextDay", + "value": 68719480099, + "names": { + "web": [ + "GuideNextDay" + ] + }, + "values": { + "web": [ + 3363 + ] + } + }, + "GuidePreviousDay": { + "name": "GuidePreviousDay", + "value": 68719480100, + "names": { + "web": [ + "GuidePreviousDay" + ] + }, + "values": { + "web": [ + 3364 + ] + } + }, + "Info": { + "name": "Info", + "value": 68719480101, + "names": { + "web": [ + "Info" + ], + "android": [ + "INFO" + ] + }, + "values": { + "web": [ + 3365 + ], + "android": [ + 165 + ], + "fuchsia": [ + 4295753824 + ] + } + }, + "InstantReplay": { + "name": "InstantReplay", + "value": 68719480102, + "names": { + "web": [ + "InstantReplay" + ] + }, + "values": { + "web": [ + 3366 + ] + } + }, + "Link": { + "name": "Link", + "value": 68719480103, + "names": { + "web": [ + "Link" + ] + }, + "values": { + "web": [ + 3367 + ] + } + }, + "ListProgram": { + "name": "ListProgram", + "value": 68719480104, + "names": { + "web": [ + "ListProgram" + ] + }, + "values": { + "web": [ + 3368 + ] + } + }, + "LiveContent": { + "name": "LiveContent", + "value": 68719480105, + "names": { + "web": [ + "LiveContent" + ] + }, + "values": { + "web": [ + 3369 + ] + } + }, + "Lock": { + "name": "Lock", + "value": 68719480106, + "names": { + "web": [ + "Lock" + ] + }, + "values": { + "web": [ + 3370 + ] + } + }, + "MediaApps": { + "name": "MediaApps", + "value": 68719480107, + "names": { + "web": [ + "MediaApps" + ] + }, + "values": { + "web": [ + 3371 + ] + } + }, + "MediaFastForward": { + "name": "MediaFastForward", + "value": 68719480108, + "names": { + "web": [ + "MediaFastForward" + ], + "gtk": [ + "AudioForward" + ], + "android": [ + "MEDIA_FAST_FORWARD" + ] + }, + "values": { + "web": [ + 3372 + ], + "gtk": [ + 269025175 + ], + "android": [ + 90 + ], + "fuchsia": [ + 4295753907 + ] + } + }, + "MediaLast": { + "name": "MediaLast", + "value": 68719480109, + "names": { + "web": [ + "MediaLast" + ], + "android": [ + "LAST_CHANNEL" + ] + }, + "values": { + "web": [ + 3373 + ], + "android": [ + 229 + ], + "fuchsia": [ + 4295753859 + ] + } + }, + "MediaPause": { + "name": "MediaPause", + "value": 68719480110, + "names": { + "web": [ + "MediaPause" + ], + "gtk": [ + "AudioPause" + ], + "android": [ + "MEDIA_PAUSE" + ] + }, + "values": { + "web": [ + 3374 + ], + "gtk": [ + 269025073 + ], + "android": [ + 127 + ], + "fuchsia": [ + 4295753905 + ] + } + }, + "MediaPlay": { + "name": "MediaPlay", + "value": 68719480111, + "names": { + "web": [ + "MediaPlay" + ], + "gtk": [ + "3270_Play", + "AudioPlay" + ], + "android": [ + "MEDIA_PLAY" + ] + }, + "values": { + "web": [ + 3375 + ], + "gtk": [ + 64790, + 269025044 + ], + "android": [ + 126 + ], + "fuchsia": [ + 4295753904 + ] + } + }, + "MediaRecord": { + "name": "MediaRecord", + "value": 68719480112, + "names": { + "web": [ + "MediaRecord" + ], + "gtk": [ + "AudioRecord" + ], + "android": [ + "MEDIA_RECORD" + ] + }, + "values": { + "web": [ + 3376 + ], + "gtk": [ + 269025052 + ], + "android": [ + 130 + ], + "fuchsia": [ + 4295753906 + ] + } + }, + "MediaRewind": { + "name": "MediaRewind", + "value": 68719480113, + "names": { + "web": [ + "MediaRewind" + ], + "gtk": [ + "AudioRewind" + ], + "android": [ + "MEDIA_REWIND" + ] + }, + "values": { + "web": [ + 3377 + ], + "gtk": [ + 269025086 + ], + "android": [ + 89 + ], + "fuchsia": [ + 4295753908 + ] + } + }, + "MediaSkip": { + "name": "MediaSkip", + "value": 68719480114, + "names": { + "web": [ + "MediaSkip" + ] + }, + "values": { + "web": [ + 3378 + ] + } + }, + "NextFavoriteChannel": { + "name": "NextFavoriteChannel", + "value": 68719480115, + "names": { + "web": [ + "NextFavoriteChannel" + ] + }, + "values": { + "web": [ + 3379 + ] + } + }, + "NextUserProfile": { + "name": "NextUserProfile", + "value": 68719480116, + "names": { + "web": [ + "NextUserProfile" + ] + }, + "values": { + "web": [ + 3380 + ] + } + }, + "OnDemand": { + "name": "OnDemand", + "value": 68719480117, + "names": { + "web": [ + "OnDemand" + ] + }, + "values": { + "web": [ + 3381 + ] + } + }, + "PInPDown": { + "name": "PInPDown", + "value": 68719480118, + "names": { + "web": [ + "PinPDown" + ] + }, + "values": { + "web": [ + 3382 + ] + } + }, + "PInPMove": { + "name": "PInPMove", + "value": 68719480119, + "names": { + "web": [ + "PinPMove" + ] + }, + "values": { + "web": [ + 3383 + ] + } + }, + "PInPToggle": { + "name": "PInPToggle", + "value": 68719480120, + "names": { + "web": [ + "PinPToggle" + ] + }, + "values": { + "web": [ + 3384 + ] + } + }, + "PInPUp": { + "name": "PInPUp", + "value": 68719480121, + "names": { + "web": [ + "PinPUp" + ] + }, + "values": { + "web": [ + 3385 + ] + } + }, + "PlaySpeedDown": { + "name": "PlaySpeedDown", + "value": 68719480122, + "names": { + "web": [ + "PlaySpeedDown" + ] + }, + "values": { + "web": [ + 3386 + ] + } + }, + "PlaySpeedReset": { + "name": "PlaySpeedReset", + "value": 68719480123, + "names": { + "web": [ + "PlaySpeedReset" + ] + }, + "values": { + "web": [ + 3387 + ] + } + }, + "PlaySpeedUp": { + "name": "PlaySpeedUp", + "value": 68719480124, + "names": { + "web": [ + "PlaySpeedUp" + ] + }, + "values": { + "web": [ + 3388 + ] + } + }, + "RandomToggle": { + "name": "RandomToggle", + "value": 68719480125, + "names": { + "web": [ + "RandomToggle" + ] + }, + "values": { + "web": [ + 3389 + ] + } + }, + "RcLowBattery": { + "name": "RcLowBattery", + "value": 68719480126, + "names": { + "web": [ + "RcLowBattery" + ] + }, + "values": { + "web": [ + 3390 + ] + } + }, + "RecordSpeedNext": { + "name": "RecordSpeedNext", + "value": 68719480127, + "names": { + "web": [ + "RecordSpeedNext" + ] + }, + "values": { + "web": [ + 3391 + ] + } + }, + "RfBypass": { + "name": "RfBypass", + "value": 68719480128, + "names": { + "web": [ + "RfBypass" + ] + }, + "values": { + "web": [ + 3392 + ] + } + }, + "ScanChannelsToggle": { + "name": "ScanChannelsToggle", + "value": 68719480129, + "names": { + "web": [ + "ScanChannelsToggle" + ] + }, + "values": { + "web": [ + 3393 + ] + } + }, + "ScreenModeNext": { + "name": "ScreenModeNext", + "value": 68719480130, + "names": { + "web": [ + "ScreenModeNext" + ] + }, + "values": { + "web": [ + 3394 + ] + } + }, + "Settings": { + "name": "Settings", + "value": 68719480131, + "names": { + "web": [ + "Settings" + ], + "android": [ + "SETTINGS" + ] + }, + "values": { + "web": [ + 3395 + ], + "android": [ + 176 + ] + } + }, + "SplitScreenToggle": { + "name": "SplitScreenToggle", + "value": 68719480132, + "names": { + "web": [ + "SplitScreenToggle" + ] + }, + "values": { + "web": [ + 3396 + ] + } + }, + "STBInput": { + "name": "STBInput", + "value": 68719480133, + "names": { + "web": [ + "STBInput" + ], + "android": [ + "STB_INPUT" + ] + }, + "values": { + "web": [ + 3397 + ], + "android": [ + 180 + ] + } + }, + "STBPower": { + "name": "STBPower", + "value": 68719480134, + "names": { + "web": [ + "STBPower" + ], + "android": [ + "STB_POWER" + ] + }, + "values": { + "web": [ + 3398 + ], + "android": [ + 179 + ] + } + }, + "Subtitle": { + "name": "Subtitle", + "value": 68719480135, + "names": { + "web": [ + "Subtitle" + ] + }, + "values": { + "web": [ + 3399 + ] + } + }, + "Teletext": { + "name": "Teletext", + "value": 68719480136, + "names": { + "web": [ + "Teletext" + ], + "android": [ + "TV_TELETEXT" + ] + }, + "values": { + "web": [ + 3400 + ], + "android": [ + 233 + ] + } + }, + "TV": { + "name": "TV", + "value": 68719480137, + "names": { + "web": [ + "TV" + ], + "android": [ + "TV" + ] + }, + "values": { + "web": [ + 3401 + ], + "android": [ + 170 + ] + } + }, + "TVInput": { + "name": "TVInput", + "value": 68719480138, + "names": { + "web": [ + "TVInput" + ], + "android": [ + "TV_INPUT" + ] + }, + "values": { + "web": [ + 3402 + ], + "android": [ + 178 + ] + } + }, + "TVPower": { + "name": "TVPower", + "value": 68719480139, + "names": { + "web": [ + "TVPower" + ], + "android": [ + "TV_POWER" + ] + }, + "values": { + "web": [ + 3403 + ], + "android": [ + 177 + ] + } + }, + "VideoModeNext": { + "name": "VideoModeNext", + "value": 68719480140, + "names": { + "web": [ + "VideoModeNext" + ] + }, + "values": { + "web": [ + 3404 + ] + } + }, + "Wink": { + "name": "Wink", + "value": 68719480141, + "names": { + "web": [ + "Wink" + ] + }, + "values": { + "web": [ + 3405 + ] + } + }, + "ZoomToggle": { + "name": "ZoomToggle", + "value": 68719480142, + "names": { + "web": [ + "ZoomToggle" + ], + "android": [ + "TV_ZOOM_MODE" + ] + }, + "values": { + "web": [ + 3406 + ], + "android": [ + 255 + ], + "fuchsia": [ + 4295754290 + ] + } + }, + "DVR": { + "name": "DVR", + "value": 68719480143, + "names": { + "web": [ + "DVR" + ], + "android": [ + "DVR" + ] + }, + "values": { + "web": [ + 3407 + ], + "android": [ + 173 + ] + } + }, + "MediaAudioTrack": { + "name": "MediaAudioTrack", + "value": 68719480144, + "names": { + "web": [ + "MediaAudioTrack" + ], + "android": [ + "MEDIA_AUDIO_TRACK" + ] + }, + "values": { + "web": [ + 3408 + ], + "android": [ + 222 + ] + } + }, + "MediaSkipBackward": { + "name": "MediaSkipBackward", + "value": 68719480145, + "names": { + "web": [ + "MediaSkipBackward" + ], + "android": [ + "MEDIA_SKIP_BACKWARD" + ] + }, + "values": { + "web": [ + 3409 + ], + "android": [ + 273 + ] + } + }, + "MediaSkipForward": { + "name": "MediaSkipForward", + "value": 68719480146, + "names": { + "web": [ + "MediaSkipForward" + ], + "android": [ + "MEDIA_SKIP_FORWARD" + ] + }, + "values": { + "web": [ + 3410 + ], + "android": [ + 272 + ] + } + }, + "MediaStepBackward": { + "name": "MediaStepBackward", + "value": 68719480147, + "names": { + "web": [ + "MediaStepBackward" + ], + "android": [ + "MEDIA_STEP_BACKWARD" + ] + }, + "values": { + "web": [ + 3411 + ], + "android": [ + 275 + ] + } + }, + "MediaStepForward": { + "name": "MediaStepForward", + "value": 68719480148, + "names": { + "web": [ + "MediaStepForward" + ], + "android": [ + "MEDIA_STEP_FORWARD" + ] + }, + "values": { + "web": [ + 3412 + ], + "android": [ + 274 + ] + } + }, + "MediaTopMenu": { + "name": "MediaTopMenu", + "value": 68719480149, + "names": { + "web": [ + "MediaTopMenu" + ], + "android": [ + "MEDIA_TOP_MENU" + ] + }, + "values": { + "web": [ + 3413 + ], + "android": [ + 226 + ] + } + }, + "NavigateIn": { + "name": "NavigateIn", + "value": 68719480150, + "names": { + "web": [ + "NavigateIn" + ], + "android": [ + "NAVIGATE_IN" + ] + }, + "values": { + "web": [ + 3414 + ], + "android": [ + 262 + ] + } + }, + "NavigateNext": { + "name": "NavigateNext", + "value": 68719480151, + "names": { + "web": [ + "NavigateNext" + ], + "android": [ + "NAVIGATE_NEXT" + ] + }, + "values": { + "web": [ + 3415 + ], + "android": [ + 261 + ] + } + }, + "NavigateOut": { + "name": "NavigateOut", + "value": 68719480152, + "names": { + "web": [ + "NavigateOut" + ], + "android": [ + "NAVIGATE_OUT" + ] + }, + "values": { + "web": [ + 3416 + ], + "android": [ + 263 + ] + } + }, + "NavigatePrevious": { + "name": "NavigatePrevious", + "value": 68719480153, + "names": { + "web": [ + "NavigatePrevious" + ], + "android": [ + "NAVIGATE_PREVIOUS" + ] + }, + "values": { + "web": [ + 3417 + ], + "android": [ + 260 + ] + } + }, + "Pairing": { + "name": "Pairing", + "value": 68719480154, + "names": { + "web": [ + "Pairing" + ], + "android": [ + "PAIRING" + ] + }, + "values": { + "web": [ + 3418 + ], + "android": [ + 225 + ] + } + }, + "MediaClose": { + "name": "MediaClose", + "value": 68719480155, + "names": { + "web": [ + "MediaClose" + ] + }, + "values": { + "web": [ + 3419 + ] + } + }, + "AudioBassBoostToggle": { + "name": "AudioBassBoostToggle", + "value": 68719480322, + "names": { + "web": [ + "AudioBassBoostToggle" + ] + }, + "values": { + "web": [ + 3586 + ] + } + }, + "AudioTrebleDown": { + "name": "AudioTrebleDown", + "value": 68719480324, + "names": { + "web": [ + "AudioTrebleDown" + ] + }, + "values": { + "web": [ + 3588 + ] + } + }, + "AudioTrebleUp": { + "name": "AudioTrebleUp", + "value": 68719480325, + "names": { + "web": [ + "AudioTrebleUp" + ] + }, + "values": { + "web": [ + 3589 + ] + } + }, + "MicrophoneToggle": { + "name": "MicrophoneToggle", + "value": 68719480326, + "names": { + "web": [ + "MicrophoneToggle" + ] + }, + "values": { + "web": [ + 3590 + ] + } + }, + "MicrophoneVolumeDown": { + "name": "MicrophoneVolumeDown", + "value": 68719480327, + "names": { + "web": [ + "MicrophoneVolumeDown" + ] + }, + "values": { + "web": [ + 3591 + ] + } + }, + "MicrophoneVolumeUp": { + "name": "MicrophoneVolumeUp", + "value": 68719480328, + "names": { + "web": [ + "MicrophoneVolumeUp" + ] + }, + "values": { + "web": [ + 3592 + ] + } + }, + "MicrophoneVolumeMute": { + "name": "MicrophoneVolumeMute", + "value": 68719480329, + "names": { + "web": [ + "MicrophoneVolumeMute" + ], + "android": [ + "MUTE" + ] + }, + "values": { + "web": [ + 3593 + ], + "android": [ + 91 + ] + } + }, + "SpeechCorrectionList": { + "name": "SpeechCorrectionList", + "value": 68719480577, + "names": { + "web": [ + "SpeechCorrectionList" + ] + }, + "values": { + "web": [ + 3841 + ] + } + }, + "SpeechInputToggle": { + "name": "SpeechInputToggle", + "value": 68719480578, + "names": { + "web": [ + "SpeechInputToggle" + ] + }, + "values": { + "web": [ + 3842 + ], + "fuchsia": [ + 4295753935 + ] + } + }, + "AppSwitch": { + "name": "AppSwitch", + "value": 68719480833, + "names": { + "web": [ + "AppSwitch" + ], + "android": [ + "APP_SWITCH" + ] + }, + "values": { + "web": [ + 4097 + ], + "android": [ + 187 + ] + } + }, + "Call": { + "name": "Call", + "value": 68719480834, + "names": { + "web": [ + "Call" + ], + "android": [ + "CALL" + ] + }, + "values": { + "web": [ + 4098 + ], + "android": [ + 5 + ] + } + }, + "CameraFocus": { + "name": "CameraFocus", + "value": 68719480835, + "names": { + "web": [ + "CameraFocus" + ], + "android": [ + "FOCUS" + ] + }, + "values": { + "web": [ + 4099 + ], + "android": [ + 80 + ] + } + }, + "EndCall": { + "name": "EndCall", + "value": 68719480836, + "names": { + "web": [ + "EndCall" + ], + "android": [ + "ENDCALL" + ] + }, + "values": { + "web": [ + 4100 + ], + "android": [ + 6 + ] + } + }, + "GoBack": { + "name": "GoBack", + "value": 68719480837, + "names": { + "web": [ + "GoBack" + ], + "android": [ + "BACK" + ] + }, + "values": { + "web": [ + 4101 + ], + "android": [ + 4 + ] + } + }, + "GoHome": { + "name": "GoHome", + "value": 68719480838, + "names": { + "web": [ + "GoHome" + ], + "android": [ + "HOME" + ] + }, + "values": { + "web": [ + 4102 + ], + "android": [ + 3 + ] + } + }, + "HeadsetHook": { + "name": "HeadsetHook", + "value": 68719480839, + "names": { + "web": [ + "HeadsetHook" + ], + "android": [ + "HEADSETHOOK" + ] + }, + "values": { + "web": [ + 4103 + ], + "android": [ + 79 + ] + } + }, + "LastNumberRedial": { + "name": "LastNumberRedial", + "value": 68719480840, + "names": { + "web": [ + "LastNumberRedial" + ] + }, + "values": { + "web": [ + 4104 + ] + } + }, + "Notification": { + "name": "Notification", + "value": 68719480841, + "names": { + "web": [ + "Notification" + ], + "android": [ + "NOTIFICATION" + ] + }, + "values": { + "web": [ + 4105 + ], + "android": [ + 83 + ] + } + }, + "MannerMode": { + "name": "MannerMode", + "value": 68719480842, + "names": { + "web": [ + "MannerMode" + ], + "android": [ + "MANNER_MODE" + ] + }, + "values": { + "web": [ + 4106 + ], + "android": [ + 205 + ] + } + }, + "VoiceDial": { + "name": "VoiceDial", + "value": 68719480843, + "names": { + "web": [ + "VoiceDial" + ] + }, + "values": { + "web": [ + 4107 + ] + } + }, + "TV3DMode": { + "name": "TV3DMode", + "value": 68719481089, + "names": { + "web": [ + "TV3DMode" + ], + "android": [ + "3D_MODE" + ] + }, + "values": { + "web": [ + 4353 + ], + "android": [ + 206 + ] + } + }, + "TVAntennaCable": { + "name": "TVAntennaCable", + "value": 68719481090, + "names": { + "web": [ + "TVAntennaCable" + ], + "android": [ + "TV_ANTENNA_CABLE" + ] + }, + "values": { + "web": [ + 4354 + ], + "android": [ + 242 + ] + } + }, + "TVAudioDescription": { + "name": "TVAudioDescription", + "value": 68719481091, + "names": { + "web": [ + "TVAudioDescription" + ], + "android": [ + "TV_AUDIO_DESCRIPTION" + ] + }, + "values": { + "web": [ + 4355 + ], + "android": [ + 252 + ] + } + }, + "TVAudioDescriptionMixDown": { + "name": "TVAudioDescriptionMixDown", + "value": 68719481092, + "names": { + "web": [ + "TVAudioDescriptionMixDown" + ], + "android": [ + "TV_AUDIO_DESCRIPTION_MIX_DOWN" + ] + }, + "values": { + "web": [ + 4356 + ], + "android": [ + 254 + ] + } + }, + "TVAudioDescriptionMixUp": { + "name": "TVAudioDescriptionMixUp", + "value": 68719481093, + "names": { + "web": [ + "TVAudioDescriptionMixUp" + ], + "android": [ + "TV_AUDIO_DESCRIPTION_MIX_UP" + ] + }, + "values": { + "web": [ + 4357 + ], + "android": [ + 253 + ] + } + }, + "TVContentsMenu": { + "name": "TVContentsMenu", + "value": 68719481094, + "names": { + "web": [ + "TVContentsMenu" + ], + "android": [ + "TV_CONTENTS_MENU" + ] + }, + "values": { + "web": [ + 4358 + ], + "android": [ + 256 + ] + } + }, + "TVDataService": { + "name": "TVDataService", + "value": 68719481095, + "names": { + "web": [ + "TVDataService" + ], + "android": [ + "TV_DATA_SERVICE" + ] + }, + "values": { + "web": [ + 4359 + ], + "android": [ + 230 + ] + } + }, + "TVInputComponent1": { + "name": "TVInputComponent1", + "value": 68719481096, + "names": { + "web": [ + "TVInputComponent1" + ], + "android": [ + "TV_INPUT_COMPONENT_1" + ] + }, + "values": { + "web": [ + 4360 + ], + "android": [ + 249 + ] + } + }, + "TVInputComponent2": { + "name": "TVInputComponent2", + "value": 68719481097, + "names": { + "web": [ + "TVInputComponent2" + ], + "android": [ + "TV_INPUT_COMPONENT_2" + ] + }, + "values": { + "web": [ + 4361 + ], + "android": [ + 250 + ] + } + }, + "TVInputComposite1": { + "name": "TVInputComposite1", + "value": 68719481098, + "names": { + "web": [ + "TVInputComposite1" + ], + "android": [ + "TV_INPUT_COMPOSITE_1" + ] + }, + "values": { + "web": [ + 4362 + ], + "android": [ + 247 + ] + } + }, + "TVInputComposite2": { + "name": "TVInputComposite2", + "value": 68719481099, + "names": { + "web": [ + "TVInputComposite2" + ], + "android": [ + "TV_INPUT_COMPOSITE_2" + ] + }, + "values": { + "web": [ + 4363 + ], + "android": [ + 248 + ] + } + }, + "TVInputHDMI1": { + "name": "TVInputHDMI1", + "value": 68719481100, + "names": { + "web": [ + "TVInputHDMI1" + ], + "android": [ + "TV_INPUT_HDMI_1" + ] + }, + "values": { + "web": [ + 4364 + ], + "android": [ + 243 + ] + } + }, + "TVInputHDMI2": { + "name": "TVInputHDMI2", + "value": 68719481101, + "names": { + "web": [ + "TVInputHDMI2" + ], + "android": [ + "TV_INPUT_HDMI_2" + ] + }, + "values": { + "web": [ + 4365 + ], + "android": [ + 244 + ] + } + }, + "TVInputHDMI3": { + "name": "TVInputHDMI3", + "value": 68719481102, + "names": { + "web": [ + "TVInputHDMI3" + ], + "android": [ + "TV_INPUT_HDMI_3" + ] + }, + "values": { + "web": [ + 4366 + ], + "android": [ + 245 + ] + } + }, + "TVInputHDMI4": { + "name": "TVInputHDMI4", + "value": 68719481103, + "names": { + "web": [ + "TVInputHDMI4" + ], + "android": [ + "TV_INPUT_HDMI_4" + ] + }, + "values": { + "web": [ + 4367 + ], + "android": [ + 246 + ] + } + }, + "TVInputVGA1": { + "name": "TVInputVGA1", + "value": 68719481104, + "names": { + "web": [ + "TVInputVGA1" + ], + "android": [ + "TV_INPUT_VGA_1" + ] + }, + "values": { + "web": [ + 4368 + ], + "android": [ + 251 + ] + } + }, + "TVMediaContext": { + "name": "TVMediaContext", + "value": 68719481105, + "names": { + "web": [ + "TVMediaContext" + ] + }, + "values": { + "web": [ + 4369 + ] + } + }, + "TVNetwork": { + "name": "TVNetwork", + "value": 68719481106, + "names": { + "web": [ + "TVNetwork" + ], + "android": [ + "TV_NETWORK" + ] + }, + "values": { + "web": [ + 4370 + ], + "android": [ + 241 + ] + } + }, + "TVNumberEntry": { + "name": "TVNumberEntry", + "value": 68719481107, + "names": { + "web": [ + "TVNumberEntry" + ], + "android": [ + "TV_NUMBER_ENTRY" + ] + }, + "values": { + "web": [ + 4371 + ], + "android": [ + 234 + ] + } + }, + "TVRadioService": { + "name": "TVRadioService", + "value": 68719481108, + "names": { + "web": [ + "TVRadioService" + ], + "android": [ + "TV_RADIO_SERVICE" + ] + }, + "values": { + "web": [ + 4372 + ], + "android": [ + 232 + ] + } + }, + "TVSatellite": { + "name": "TVSatellite", + "value": 68719481109, + "names": { + "web": [ + "TVSatellite" + ], + "android": [ + "TV_SATELLITE" + ] + }, + "values": { + "web": [ + 4373 + ], + "android": [ + 237 + ] + } + }, + "TVSatelliteBS": { + "name": "TVSatelliteBS", + "value": 68719481110, + "names": { + "web": [ + "TVSatelliteBS" + ], + "android": [ + "TV_SATELLITE_BS" + ] + }, + "values": { + "web": [ + 4374 + ], + "android": [ + 238 + ] + } + }, + "TVSatelliteCS": { + "name": "TVSatelliteCS", + "value": 68719481111, + "names": { + "web": [ + "TVSatelliteCS" + ], + "android": [ + "TV_SATELLITE_CS" + ] + }, + "values": { + "web": [ + 4375 + ], + "android": [ + 239 + ] + } + }, + "TVSatelliteToggle": { + "name": "TVSatelliteToggle", + "value": 68719481112, + "names": { + "web": [ + "TVSatelliteToggle" + ], + "android": [ + "TV_SATELLITE_SERVICE" + ] + }, + "values": { + "web": [ + 4376 + ], + "android": [ + 240 + ] + } + }, + "TVTerrestrialAnalog": { + "name": "TVTerrestrialAnalog", + "value": 68719481113, + "names": { + "web": [ + "TVTerrestrialAnalog" + ], + "android": [ + "TV_TERRESTRIAL_ANALOG" + ] + }, + "values": { + "web": [ + 4377 + ], + "android": [ + 235 + ] + } + }, + "TVTerrestrialDigital": { + "name": "TVTerrestrialDigital", + "value": 68719481114, + "names": { + "web": [ + "TVTerrestrialDigital" + ], + "android": [ + "TV_TERRESTRIAL_DIGITAL" + ] + }, + "values": { + "web": [ + 4378 + ], + "android": [ + 236 + ] + } + }, + "TVTimer": { + "name": "TVTimer", + "value": 68719481115, + "names": { + "web": [ + "TVTimer" + ], + "android": [ + "TV_TIMER_PROGRAMMING" + ] + }, + "values": { + "web": [ + 4379 + ], + "android": [ + 258 + ] + } + }, + "Key11": { + "name": "Key11", + "value": 68719481345, + "names": { + "web": [ + "Key11" + ] + }, + "values": { + "web": [ + 4609 + ] + } + }, + "Key12": { + "name": "Key12", + "value": 68719481346, + "names": { + "web": [ + "Key12" + ] + }, + "values": { + "web": [ + 4610 + ] + } + }, + "GameButton1": { + "name": "GameButton1", + "value": 68719869697, + "names": { + "web": [ + "GameButton1" + ], + "android": [ + "BUTTON_1" + ] + }, + "values": { + "web": [ + 392961 + ], + "android": [ + 188 + ], + "fuchsia": [ + 4295360257 + ] + } + }, + "GameButton2": { + "name": "GameButton2", + "value": 68719869698, + "names": { + "web": [ + "GameButton2" + ], + "android": [ + "BUTTON_2" + ] + }, + "values": { + "web": [ + 392962 + ], + "android": [ + 189 + ], + "fuchsia": [ + 4295360258 + ] + } + }, + "GameButton3": { + "name": "GameButton3", + "value": 68719869699, + "names": { + "web": [ + "GameButton3" + ], + "android": [ + "BUTTON_3" + ] + }, + "values": { + "web": [ + 392963 + ], + "android": [ + 190 + ], + "fuchsia": [ + 4295360259 + ] + } + }, + "GameButton4": { + "name": "GameButton4", + "value": 68719869700, + "names": { + "web": [ + "GameButton4" + ], + "android": [ + "BUTTON_4" + ] + }, + "values": { + "web": [ + 392964 + ], + "android": [ + 191 + ], + "fuchsia": [ + 4295360260 + ] + } + }, + "GameButton5": { + "name": "GameButton5", + "value": 68719869701, + "names": { + "web": [ + "GameButton5" + ], + "android": [ + "BUTTON_5" + ] + }, + "values": { + "web": [ + 392965 + ], + "android": [ + 192 + ], + "fuchsia": [ + 4295360261 + ] + } + }, + "GameButton6": { + "name": "GameButton6", + "value": 68719869702, + "names": { + "web": [ + "GameButton6" + ], + "android": [ + "BUTTON_6" + ] + }, + "values": { + "web": [ + 392966 + ], + "android": [ + 193 + ], + "fuchsia": [ + 4295360262 + ] + } + }, + "GameButton7": { + "name": "GameButton7", + "value": 68719869703, + "names": { + "web": [ + "GameButton7" + ], + "android": [ + "BUTTON_7" + ] + }, + "values": { + "web": [ + 392967 + ], + "android": [ + 194 + ], + "fuchsia": [ + 4295360263 + ] + } + }, + "GameButton8": { + "name": "GameButton8", + "value": 68719869704, + "names": { + "web": [ + "GameButton8" + ], + "windows": [ + "GAMEPAD_A" + ], + "android": [ + "BUTTON_8" + ] + }, + "values": { + "web": [ + 392968 + ], + "windows": [ + 195 + ], + "android": [ + 195 + ], + "fuchsia": [ + 4295360264 + ] + } + }, + "GameButton9": { + "name": "GameButton9", + "value": 68719869705, + "names": { + "web": [ + "GameButton9" + ], + "windows": [ + "GAMEPAD_B" + ], + "android": [ + "BUTTON_9" + ] + }, + "values": { + "web": [ + 392969 + ], + "windows": [ + 196 + ], + "android": [ + 196 + ], + "fuchsia": [ + 4295360265 + ] + } + }, + "GameButton10": { + "name": "GameButton10", + "value": 68719869706, + "names": { + "web": [ + "GameButton10" + ], + "windows": [ + "GAMEPAD_X" + ], + "android": [ + "BUTTON_10" + ] + }, + "values": { + "web": [ + 392970 + ], + "windows": [ + 197 + ], + "android": [ + 197 + ], + "fuchsia": [ + 4295360266 + ] + } + }, + "GameButton11": { + "name": "GameButton11", + "value": 68719869707, + "names": { + "web": [ + "GameButton11" + ], + "windows": [ + "GAMEPAD_Y" + ], + "android": [ + "BUTTON_11" + ] + }, + "values": { + "web": [ + 392971 + ], + "windows": [ + 198 + ], + "android": [ + 198 + ], + "fuchsia": [ + 4295360267 + ] + } + }, + "GameButton12": { + "name": "GameButton12", + "value": 68719869708, + "names": { + "web": [ + "GameButton12" + ], + "windows": [ + "GAMEPAD_RIGHT_SHOULDER" + ], + "android": [ + "BUTTON_12" + ] + }, + "values": { + "web": [ + 392972 + ], + "windows": [ + 199 + ], + "android": [ + 199 + ], + "fuchsia": [ + 4295360268 + ] + } + }, + "GameButton13": { + "name": "GameButton13", + "value": 68719869709, + "names": { + "web": [ + "GameButton13" + ], + "windows": [ + "GAMEPAD_LEFT_SHOULDER" + ], + "android": [ + "BUTTON_13" + ] + }, + "values": { + "web": [ + 392973 + ], + "windows": [ + 200 + ], + "android": [ + 200 + ], + "fuchsia": [ + 4295360269 + ] + } + }, + "GameButton14": { + "name": "GameButton14", + "value": 68719869710, + "names": { + "web": [ + "GameButton14" + ], + "windows": [ + "GAMEPAD_LEFT_TRIGGER" + ], + "android": [ + "BUTTON_14" + ] + }, + "values": { + "web": [ + 392974 + ], + "windows": [ + 201 + ], + "android": [ + 201 + ], + "fuchsia": [ + 4295360270 + ] + } + }, + "GameButton15": { + "name": "GameButton15", + "value": 68719869711, + "names": { + "web": [ + "GameButton15" + ], + "windows": [ + "GAMEPAD_RIGHT_TRIGGER" + ], + "android": [ + "BUTTON_15" + ] + }, + "values": { + "web": [ + 392975 + ], + "windows": [ + 202 + ], + "android": [ + 202 + ], + "fuchsia": [ + 4295360271 + ] + } + }, + "GameButton16": { + "name": "GameButton16", + "value": 68719869712, + "names": { + "web": [ + "GameButton16" + ], + "windows": [ + "GAMEPAD_DPAD_UP" + ], + "android": [ + "BUTTON_16" + ] + }, + "values": { + "web": [ + 392976 + ], + "windows": [ + 203 + ], + "android": [ + 203 + ], + "fuchsia": [ + 4295360272 + ] + } + }, + "GameButtonA": { + "name": "GameButtonA", + "value": 68719869713, + "names": { + "web": [ + "GameButtonA" + ], + "android": [ + "BUTTON_A" + ] + }, + "values": { + "web": [ + 392977 + ], + "android": [ + 96 + ], + "fuchsia": [ + 4295360273 + ] + } + }, + "GameButtonB": { + "name": "GameButtonB", + "value": 68719869714, + "names": { + "web": [ + "GameButtonB" + ], + "android": [ + "BUTTON_B" + ] + }, + "values": { + "web": [ + 392978 + ], + "android": [ + 97 + ], + "fuchsia": [ + 4295360274 + ] + } + }, + "GameButtonC": { + "name": "GameButtonC", + "value": 68719869715, + "names": { + "web": [ + "GameButtonC" + ], + "android": [ + "BUTTON_C" + ] + }, + "values": { + "web": [ + 392979 + ], + "android": [ + 98 + ], + "fuchsia": [ + 4295360275 + ] + } + }, + "GameButtonLeft1": { + "name": "GameButtonLeft1", + "value": 68719869716, + "names": { + "web": [ + "GameButtonLeft1" + ], + "android": [ + "BUTTON_L1" + ] + }, + "values": { + "web": [ + 392980 + ], + "android": [ + 102 + ], + "fuchsia": [ + 4295360276 + ] + } + }, + "GameButtonLeft2": { + "name": "GameButtonLeft2", + "value": 68719869717, + "names": { + "web": [ + "GameButtonLeft2" + ], + "android": [ + "BUTTON_L2" + ] + }, + "values": { + "web": [ + 392981 + ], + "android": [ + 104 + ], + "fuchsia": [ + 4295360277 + ] + } + }, + "GameButtonMode": { + "name": "GameButtonMode", + "value": 68719869718, + "names": { + "web": [ + "GameButtonMode" + ], + "android": [ + "BUTTON_MODE" + ] + }, + "values": { + "web": [ + 392982 + ], + "android": [ + 110 + ], + "fuchsia": [ + 4295360278 + ] + } + }, + "GameButtonRight1": { + "name": "GameButtonRight1", + "value": 68719869719, + "names": { + "web": [ + "GameButtonRight1" + ], + "android": [ + "BUTTON_R1" + ] + }, + "values": { + "web": [ + 392983 + ], + "android": [ + 103 + ], + "fuchsia": [ + 4295360279 + ] + } + }, + "GameButtonRight2": { + "name": "GameButtonRight2", + "value": 68719869720, + "names": { + "web": [ + "GameButtonRight2" + ], + "android": [ + "BUTTON_R2" + ] + }, + "values": { + "web": [ + 392984 + ], + "android": [ + 105 + ], + "fuchsia": [ + 4295360280 + ] + } + }, + "GameButtonSelect": { + "name": "GameButtonSelect", + "value": 68719869721, + "names": { + "web": [ + "GameButtonSelect" + ], + "android": [ + "BUTTON_SELECT" + ] + }, + "values": { + "web": [ + 392985 + ], + "android": [ + 109 + ], + "fuchsia": [ + 4295360281 + ] + } + }, + "GameButtonStart": { + "name": "GameButtonStart", + "value": 68719869722, + "names": { + "web": [ + "GameButtonStart" + ], + "android": [ + "BUTTON_START" + ] + }, + "values": { + "web": [ + 392986 + ], + "android": [ + 108 + ], + "fuchsia": [ + 4295360282 + ] + } + }, + "GameButtonThumbLeft": { + "name": "GameButtonThumbLeft", + "value": 68719869723, + "names": { + "web": [ + "GameButtonThumbLeft" + ], + "android": [ + "BUTTON_THUMBL" + ] + }, + "values": { + "web": [ + 392987 + ], + "android": [ + 106 + ], + "fuchsia": [ + 4295360283 + ] + } + }, + "GameButtonThumbRight": { + "name": "GameButtonThumbRight", + "value": 68719869724, + "names": { + "web": [ + "GameButtonThumbRight" + ], + "android": [ + "BUTTON_THUMBR" + ] + }, + "values": { + "web": [ + 392988 + ], + "android": [ + 107 + ], + "fuchsia": [ + 4295360284 + ] + } + }, + "GameButtonX": { + "name": "GameButtonX", + "value": 68719869725, + "names": { + "web": [ + "GameButtonX" + ], + "android": [ + "BUTTON_X" + ] + }, + "values": { + "web": [ + 392989 + ], + "android": [ + 99 + ], + "fuchsia": [ + 4295360285 + ] + } + }, + "GameButtonY": { + "name": "GameButtonY", + "value": 68719869726, + "names": { + "web": [ + "GameButtonY" + ], + "android": [ + "BUTTON_Y" + ] + }, + "values": { + "web": [ + 392990 + ], + "android": [ + 100 + ], + "fuchsia": [ + 4295360286 + ] + } + }, + "GameButtonZ": { + "name": "GameButtonZ", + "value": 68719869727, + "names": { + "web": [ + "GameButtonZ" + ], + "android": [ + "BUTTON_Z" + ] + }, + "values": { + "web": [ + 392991 + ], + "android": [ + 101 + ], + "fuchsia": [ + 4295360287 + ] + } + }, + "Suspend": { + "name": "Suspend", + "value": 73014444052, + "names": { + "web": [ + "Suspend" + ], + "gtk": [ + "Suspend" + ] + }, + "values": { + "web": [ + 4294967316 + ], + "gtk": [ + 269025191 + ], + "fuchsia": [ + 4294967316 + ] + } + }, + "Resume": { + "name": "Resume", + "value": 73014444053, + "names": { + "web": [ + "Resume" + ] + }, + "values": { + "web": [ + 4294967317 + ], + "fuchsia": [ + 4294967317 + ] + } + }, + "Sleep": { + "name": "Sleep", + "value": 73014509698, + "names": { + "web": [ + "Sleep" + ], + "gtk": [ + "Sleep" + ], + "windows": [ + "SLEEP" + ], + "android": [ + "SLEEP" + ] + }, + "values": { + "web": [ + 4295032962 + ], + "gtk": [ + 269025071 + ], + "windows": [ + 95 + ], + "android": [ + 223 + ], + "fuchsia": [ + 4295032962 + ] + } + }, + "IntlBackslash": { + "name": "IntlBackslash", + "value": 73014902884, + "names": { + "web": [ + "IntlBackslash" + ] + }, + "values": { + "web": [ + 4295426148 + ], + "fuchsia": [ + 4295426148 + ] + } + }, + "IntlRo": { + "name": "IntlRo", + "value": 73014902919, + "names": { + "web": [ + "IntlRo" + ], + "macOs": [ + "IntlRo" + ], + "ios": [ + "IntlRo" + ], + "android": [ + "RO" + ] + }, + "values": { + "web": [ + 4295426183 + ], + "macOs": [ + 94 + ], + "ios": [ + 135 + ], + "android": [ + 217 + ], + "fuchsia": [ + 4295426183 + ] + } + }, + "IntlYen": { + "name": "IntlYen", + "value": 73014902921, + "names": { + "web": [ + "IntlYen" + ], + "macOs": [ + "IntlYen" + ], + "ios": [ + "IntlYen" + ], + "gtk": [ + "yen" + ], + "android": [ + "YEN" + ] + }, + "values": { + "web": [ + 4295426185 + ], + "macOs": [ + 93 + ], + "ios": [ + 137 + ], + "gtk": [ + 165 + ], + "android": [ + 216 + ], + "fuchsia": [ + 4295426185 + ] + } + }, + "Lang1": { + "name": "Lang1", + "value": 73014902928, + "names": { + "web": [ + "Lang1" + ], + "macOs": [ + "Lang1" + ], + "ios": [ + "Lang1" + ], + "windows": [ + "KANA, HANGEUL, HANGUL" + ] + }, + "values": { + "web": [ + 4295426192 + ], + "macOs": [ + 104 + ], + "ios": [ + 144 + ], + "windows": [ + 21 + ], + "fuchsia": [ + 4295426192 + ] + } + }, + "Lang2": { + "name": "Lang2", + "value": 73014902929, + "names": { + "web": [ + "Lang2" + ], + "macOs": [ + "Lang2" + ], + "ios": [ + "Lang2" + ] + }, + "values": { + "web": [ + 4295426193 + ], + "macOs": [ + 102 + ], + "ios": [ + 145 + ], + "fuchsia": [ + 4295426193 + ] + } + }, + "Lang3": { + "name": "Lang3", + "value": 73014902930, + "names": { + "web": [ + "Lang3" + ], + "ios": [ + "Lang3" + ] + }, + "values": { + "web": [ + 4295426194 + ], + "ios": [ + 146 + ], + "fuchsia": [ + 4295426194 + ] + } + }, + "Lang4": { + "name": "Lang4", + "value": 73014902931, + "names": { + "web": [ + "Lang4" + ], + "ios": [ + "Lang4" + ] + }, + "values": { + "web": [ + 4295426195 + ], + "ios": [ + 147 + ], + "fuchsia": [ + 4295426195 + ] + } + }, + "Lang5": { + "name": "Lang5", + "value": 73014902932, + "names": { + "web": [ + "Lang5" + ], + "ios": [ + "Lang5" + ] + }, + "values": { + "web": [ + 4295426196 + ], + "ios": [ + 148 + ], + "fuchsia": [ + 4295426196 + ] + } + }, + "Abort": { + "name": "Abort", + "value": 73014902939, + "names": { + "web": [ + "Abort" + ] + }, + "values": { + "web": [ + 4295426203 + ], + "fuchsia": [ + 4295426203 + ] + } + }, + "AltLeft": { + "name": "AltLeft", + "value": 3298534883586, + "names": { + "web": [ + "AltLeft" + ], + "macOs": [ + "AltLeft" + ], + "ios": [ + "AltLeft" + ], + "gtk": [ + "Alt_L" + ], + "windows": [ + "LMENU" + ], + "android": [ + "ALT_LEFT" + ] + }, + "values": { + "web": [ + 3298534883586 + ], + "macOs": [ + 58 + ], + "ios": [ + 226 + ], + "gtk": [ + 65513 + ], + "windows": [ + 164 + ], + "android": [ + 57 + ], + "fuchsia": [ + 4295426274 + ] + } + }, + "ControlLeft": { + "name": "ControlLeft", + "value": 3298534883589, + "names": { + "web": [ + "ControlLeft" + ], + "macOs": [ + "ControlLeft" + ], + "ios": [ + "ControlLeft" + ], + "gtk": [ + "Control_L" + ], + "windows": [ + "CONTROL", + "LCONTROL" + ], + "android": [ + "CTRL_LEFT" + ] + }, + "values": { + "web": [ + 3298534883589 + ], + "macOs": [ + 59 + ], + "ios": [ + 224 + ], + "gtk": [ + 65507 + ], + "windows": [ + 17, + 162 + ], + "android": [ + 113 + ], + "fuchsia": [ + 4295426272 + ] + } + }, + "MetaLeft": { + "name": "MetaLeft", + "value": 3298534883593, + "names": { + "web": [ + "MetaLeft" + ], + "macOs": [ + "MetaLeft" + ], + "ios": [ + "MetaLeft" + ], + "gtk": [ + "Meta_L" + ], + "windows": [ + "LWIN" + ], + "android": [ + "META_LEFT" + ] + }, + "values": { + "web": [ + 3298534883593 + ], + "macOs": [ + 55 + ], + "ios": [ + 227 + ], + "gtk": [ + 65511 + ], + "windows": [ + 91 + ], + "android": [ + 117 + ], + "fuchsia": [ + 4295426275 + ] + } + }, + "ShiftLeft": { + "name": "ShiftLeft", + "value": 3298534883597, + "names": { + "web": [ + "ShiftLeft" + ], + "macOs": [ + "ShiftLeft" + ], + "ios": [ + "ShiftLeft" + ], + "gtk": [ + "Shift_L" + ], + "windows": [ + "SHIFT", + "LSHIFT" + ], + "android": [ + "SHIFT_LEFT" + ] + }, + "values": { + "web": [ + 3298534883597 + ], + "macOs": [ + 56 + ], + "ios": [ + 225 + ], + "gtk": [ + 65505 + ], + "windows": [ + 16, + 160 + ], + "android": [ + 59 + ], + "fuchsia": [ + 4295426273 + ] + } + }, + "AltRight": { + "name": "AltRight", + "value": 4398046511362, + "names": { + "web": [ + "AltRight" + ], + "macOs": [ + "AltRight" + ], + "ios": [ + "AltRight" + ], + "gtk": [ + "Alt_R", + "ISO_Level3_Shift" + ], + "windows": [ + "RMENU" + ], + "android": [ + "ALT_RIGHT" + ] + }, + "values": { + "web": [ + 4398046511362 + ], + "macOs": [ + 61 + ], + "ios": [ + 230 + ], + "gtk": [ + 65514, + 65027 + ], + "windows": [ + 165 + ], + "android": [ + 58 + ], + "fuchsia": [ + 4295426278 + ] + } + }, + "ControlRight": { + "name": "ControlRight", + "value": 4398046511365, + "names": { + "web": [ + "ControlRight" + ], + "macOs": [ + "ControlRight" + ], + "ios": [ + "ControlRight" + ], + "gtk": [ + "Control_R" + ], + "windows": [ + "RCONTROL" + ], + "android": [ + "CTRL_RIGHT" + ] + }, + "values": { + "web": [ + 4398046511365 + ], + "macOs": [ + 62 + ], + "ios": [ + 228 + ], + "gtk": [ + 65508 + ], + "windows": [ + 163 + ], + "android": [ + 114 + ], + "fuchsia": [ + 4295426276 + ] + } + }, + "MetaRight": { + "name": "MetaRight", + "value": 4398046511369, + "names": { + "web": [ + "MetaRight" + ], + "macOs": [ + "MetaRight" + ], + "ios": [ + "MetaRight" + ], + "gtk": [ + "Meta_R" + ], + "windows": [ + "RWIN" + ], + "android": [ + "META_RIGHT" + ] + }, + "values": { + "web": [ + 4398046511369 + ], + "macOs": [ + 54 + ], + "ios": [ + 231 + ], + "gtk": [ + 65512 + ], + "windows": [ + 92 + ], + "android": [ + 118 + ], + "fuchsia": [ + 4295426279 + ] + } + }, + "ShiftRight": { + "name": "ShiftRight", + "value": 4398046511373, + "names": { + "web": [ + "ShiftRight" + ], + "macOs": [ + "ShiftRight" + ], + "ios": [ + "ShiftRight" + ], + "gtk": [ + "Shift_R" + ], + "windows": [ + "RSHIFT" + ], + "android": [ + "SHIFT_RIGHT" + ] + }, + "values": { + "web": [ + 4398046511373 + ], + "macOs": [ + 60 + ], + "ios": [ + 229 + ], + "gtk": [ + 65506 + ], + "windows": [ + 161 + ], + "android": [ + 60 + ], + "fuchsia": [ + 4295426277 + ] + } + }, + "NumpadEnter": { + "name": "NumpadEnter", + "value": 5497558138893, + "names": { + "web": [ + "NumpadEnter" + ], + "macOs": [ + "NumpadEnter" + ], + "ios": [ + "NumpadEnter" + ], + "gtk": [ + "KP_Enter" + ], + "android": [ + "NUMPAD_ENTER" + ] + }, + "values": { + "web": [ + 5497558138893 + ], + "macOs": [ + 76 + ], + "ios": [ + 88 + ], + "gtk": [ + 65421 + ], + "android": [ + 160 + ], + "fuchsia": [ + 4295426136 + ] + } + }, + "NumpadParenLeft": { + "name": "NumpadParenLeft", + "value": 5497558138920, + "names": { + "web": [ + "NumpadParenLeft" + ], + "android": [ + "NUMPAD_LEFT_PAREN" + ] + }, + "values": { + "web": [ + 5497558138920 + ], + "android": [ + 162 + ], + "fuchsia": [ + 4295426230 + ] + } + }, + "NumpadParenRight": { + "name": "NumpadParenRight", + "value": 5497558138921, + "names": { + "web": [ + "NumpadParenRight" + ], + "android": [ + "NUMPAD_RIGHT_PAREN" + ] + }, + "values": { + "web": [ + 5497558138921 + ], + "android": [ + 163 + ], + "fuchsia": [ + 4295426231 + ] + } + }, + "NumpadMultiply": { + "name": "NumpadMultiply", + "value": 5497558138922, + "names": { + "web": [ + "NumpadMultiply" + ], + "macOs": [ + "NumpadMultiply" + ], + "ios": [ + "NumpadMultiply" + ], + "gtk": [ + "KP_Multiply" + ], + "windows": [ + "MULTIPLY" + ], + "android": [ + "NUMPAD_MULTIPLY" + ] + }, + "values": { + "web": [ + 5497558138922 + ], + "macOs": [ + 67 + ], + "ios": [ + 85 + ], + "gtk": [ + 65450 + ], + "windows": [ + 106 + ], + "android": [ + 155 + ], + "fuchsia": [ + 4295426133 + ] + } + }, + "NumpadAdd": { + "name": "NumpadAdd", + "value": 5497558138923, + "names": { + "web": [ + "NumpadAdd" + ], + "macOs": [ + "NumpadAdd" + ], + "ios": [ + "NumpadAdd" + ], + "gtk": [ + "KP_Add" + ], + "windows": [ + "ADD" + ], + "android": [ + "NUMPAD_ADD" + ] + }, + "values": { + "web": [ + 5497558138923 + ], + "macOs": [ + 69 + ], + "ios": [ + 87 + ], + "gtk": [ + 65451 + ], + "windows": [ + 107 + ], + "android": [ + 157 + ], + "fuchsia": [ + 4295426135 + ] + } + }, + "NumpadComma": { + "name": "NumpadComma", + "value": 5497558138924, + "names": { + "web": [ + "NumpadComma" + ], + "macOs": [ + "NumpadComma" + ], + "ios": [ + "NumpadComma" + ], + "android": [ + "NUMPAD_COMMA" + ] + }, + "values": { + "web": [ + 5497558138924 + ], + "macOs": [ + 95 + ], + "ios": [ + 133 + ], + "android": [ + 159 + ], + "fuchsia": [ + 4295426181 + ] + } + }, + "NumpadSubtract": { + "name": "NumpadSubtract", + "value": 5497558138925, + "names": { + "web": [ + "NumpadSubtract" + ], + "macOs": [ + "NumpadSubtract" + ], + "ios": [ + "NumpadSubtract" + ], + "gtk": [ + "KP_Subtract" + ], + "windows": [ + "SUBTRACT" + ], + "android": [ + "NUMPAD_SUBTRACT" + ] + }, + "values": { + "web": [ + 5497558138925 + ], + "macOs": [ + 78 + ], + "ios": [ + 86 + ], + "gtk": [ + 65453 + ], + "windows": [ + 109 + ], + "android": [ + 156 + ], + "fuchsia": [ + 4295426134 + ] + } + }, + "NumpadDecimal": { + "name": "NumpadDecimal", + "value": 5497558138926, + "names": { + "web": [ + "NumpadDecimal" + ], + "macOs": [ + "NumpadDecimal" + ], + "ios": [ + "NumpadDecimal" + ], + "gtk": [ + "KP_Delete" + ], + "windows": [ + "DECIMAL" + ], + "android": [ + "NUMPAD_DOT" + ] + }, + "values": { + "web": [ + 5497558138926 + ], + "macOs": [ + 65 + ], + "ios": [ + 99 + ], + "gtk": [ + 65439 + ], + "windows": [ + 110 + ], + "android": [ + 158 + ], + "fuchsia": [ + 4295426147 + ] + } + }, + "NumpadDivide": { + "name": "NumpadDivide", + "value": 5497558138927, + "names": { + "web": [ + "NumpadDivide" + ], + "macOs": [ + "NumpadDivide" + ], + "ios": [ + "NumpadDivide" + ], + "gtk": [ + "KP_Divide" + ], + "windows": [ + "DIVIDE" + ], + "android": [ + "NUMPAD_DIVIDE" + ] + }, + "values": { + "web": [ + 5497558138927 + ], + "macOs": [ + 75 + ], + "ios": [ + 84 + ], + "gtk": [ + 65455 + ], + "windows": [ + 111 + ], + "android": [ + 154 + ], + "fuchsia": [ + 4295426132 + ] + } + }, + "Numpad0": { + "name": "Numpad0", + "value": 5497558138928, + "names": { + "web": [ + "Numpad0" + ], + "macOs": [ + "Numpad0" + ], + "ios": [ + "Numpad0" + ], + "gtk": [ + "KP_Insert", + "KP_0" + ], + "windows": [ + "NUMPAD0" + ], + "android": [ + "NUMPAD_0" + ] + }, + "values": { + "web": [ + 5497558138928 + ], + "macOs": [ + 82 + ], + "ios": [ + 98 + ], + "gtk": [ + 65438, + 65456 + ], + "windows": [ + 96 + ], + "android": [ + 144 + ], + "fuchsia": [ + 4295426146 + ] + } + }, + "Numpad1": { + "name": "Numpad1", + "value": 5497558138929, + "names": { + "web": [ + "Numpad1" + ], + "macOs": [ + "Numpad1" + ], + "ios": [ + "Numpad1" + ], + "gtk": [ + "KP_End", + "KP_1" + ], + "windows": [ + "NUMPAD1" + ], + "android": [ + "NUMPAD_1" + ] + }, + "values": { + "web": [ + 5497558138929 + ], + "macOs": [ + 83 + ], + "ios": [ + 89 + ], + "gtk": [ + 65436, + 65457 + ], + "windows": [ + 97 + ], + "android": [ + 145 + ], + "fuchsia": [ + 4295426137 + ] + } + }, + "Numpad2": { + "name": "Numpad2", + "value": 5497558138930, + "names": { + "web": [ + "Numpad2" + ], + "macOs": [ + "Numpad2" + ], + "ios": [ + "Numpad2" + ], + "gtk": [ + "KP_Down", + "KP_2" + ], + "windows": [ + "NUMPAD2" + ], + "android": [ + "NUMPAD_2" + ] + }, + "values": { + "web": [ + 5497558138930 + ], + "macOs": [ + 84 + ], + "ios": [ + 90 + ], + "gtk": [ + 65433, + 65458 + ], + "windows": [ + 98 + ], + "android": [ + 146 + ], + "fuchsia": [ + 4295426138 + ] + } + }, + "Numpad3": { + "name": "Numpad3", + "value": 5497558138931, + "names": { + "web": [ + "Numpad3" + ], + "macOs": [ + "Numpad3" + ], + "ios": [ + "Numpad3" + ], + "gtk": [ + "KP_Page_Down", + "KP_3" + ], + "windows": [ + "NUMPAD3" + ], + "android": [ + "NUMPAD_3" + ] + }, + "values": { + "web": [ + 5497558138931 + ], + "macOs": [ + 85 + ], + "ios": [ + 91 + ], + "gtk": [ + 65435, + 65459 + ], + "windows": [ + 99 + ], + "android": [ + 147 + ], + "fuchsia": [ + 4295426139 + ] + } + }, + "Numpad4": { + "name": "Numpad4", + "value": 5497558138932, + "names": { + "web": [ + "Numpad4" + ], + "macOs": [ + "Numpad4" + ], + "ios": [ + "Numpad4" + ], + "gtk": [ + "KP_Left", + "KP_4" + ], + "windows": [ + "NUMPAD4" + ], + "android": [ + "NUMPAD_4" + ] + }, + "values": { + "web": [ + 5497558138932 + ], + "macOs": [ + 86 + ], + "ios": [ + 92 + ], + "gtk": [ + 65430, + 65460 + ], + "windows": [ + 100 + ], + "android": [ + 148 + ], + "fuchsia": [ + 4295426140 + ] + } + }, + "Numpad5": { + "name": "Numpad5", + "value": 5497558138933, + "names": { + "web": [ + "Numpad5" + ], + "macOs": [ + "Numpad5" + ], + "ios": [ + "Numpad5" + ], + "gtk": [ + "KP_5" + ], + "windows": [ + "NUMPAD5" + ], + "android": [ + "NUMPAD_5" + ] + }, + "values": { + "web": [ + 5497558138933 + ], + "macOs": [ + 87 + ], + "ios": [ + 93 + ], + "gtk": [ + 65461 + ], + "windows": [ + 101 + ], + "android": [ + 149 + ], + "fuchsia": [ + 4295426141 + ] + } + }, + "Numpad6": { + "name": "Numpad6", + "value": 5497558138934, + "names": { + "web": [ + "Numpad6" + ], + "macOs": [ + "Numpad6" + ], + "ios": [ + "Numpad6" + ], + "gtk": [ + "KP_Right", + "KP_6" + ], + "windows": [ + "NUMPAD6" + ], + "android": [ + "NUMPAD_6" + ] + }, + "values": { + "web": [ + 5497558138934 + ], + "macOs": [ + 88 + ], + "ios": [ + 94 + ], + "gtk": [ + 65432, + 65462 + ], + "windows": [ + 102 + ], + "android": [ + 150 + ], + "fuchsia": [ + 4295426142 + ] + } + }, + "Numpad7": { + "name": "Numpad7", + "value": 5497558138935, + "names": { + "web": [ + "Numpad7" + ], + "macOs": [ + "Numpad7" + ], + "ios": [ + "Numpad7" + ], + "gtk": [ + "KP_Home", + "KP_7" + ], + "windows": [ + "NUMPAD7" + ], + "android": [ + "NUMPAD_7" + ] + }, + "values": { + "web": [ + 5497558138935 + ], + "macOs": [ + 89 + ], + "ios": [ + 95 + ], + "gtk": [ + 65429, + 65463 + ], + "windows": [ + 103 + ], + "android": [ + 151 + ], + "fuchsia": [ + 4295426143 + ] + } + }, + "Numpad8": { + "name": "Numpad8", + "value": 5497558138936, + "names": { + "web": [ + "Numpad8" + ], + "macOs": [ + "Numpad8" + ], + "ios": [ + "Numpad8" + ], + "gtk": [ + "KP_Up", + "KP_8" + ], + "windows": [ + "NUMPAD8" + ], + "android": [ + "NUMPAD_8" + ] + }, + "values": { + "web": [ + 5497558138936 + ], + "macOs": [ + 91 + ], + "ios": [ + 96 + ], + "gtk": [ + 65431, + 65464 + ], + "windows": [ + 104 + ], + "android": [ + 152 + ], + "fuchsia": [ + 4295426144 + ] + } + }, + "Numpad9": { + "name": "Numpad9", + "value": 5497558138937, + "names": { + "web": [ + "Numpad9" + ], + "macOs": [ + "Numpad9" + ], + "ios": [ + "Numpad9" + ], + "gtk": [ + "KP_Page_Up", + "KP_9" + ], + "windows": [ + "NUMPAD9" + ], + "android": [ + "NUMPAD_9" + ] + }, + "values": { + "web": [ + 5497558138937 + ], + "macOs": [ + 92 + ], + "ios": [ + 97 + ], + "gtk": [ + 65434, + 65465 + ], + "windows": [ + 105 + ], + "android": [ + 153 + ], + "fuchsia": [ + 4295426145 + ] + } + }, + "NumpadEqual": { + "name": "NumpadEqual", + "value": 5497558138941, + "names": { + "web": [ + "NumpadEqual" + ], + "macOs": [ + "NumpadEqual" + ], + "ios": [ + "NumpadEqual" + ], + "gtk": [ + "KP_Equal" + ], + "windows": [ + "OEM_NEC_EQUAL" + ], + "android": [ + "NUMPAD_EQUALS" + ] + }, + "values": { + "web": [ + 5497558138941 + ], + "macOs": [ + 81 + ], + "ios": [ + 103 + ], + "gtk": [ + 65469 + ], + "windows": [ + 146 + ], + "android": [ + 161 + ], + "fuchsia": [ + 4295426151 + ] + } + } +} diff --git a/dev/tools/gen_keycodes/data/macos_key_code_map_cc.tmpl b/dev/tools/gen_keycodes/data/macos_key_code_map_cc.tmpl new file mode 100644 index 0000000000..876d5806ce --- /dev/null +++ b/dev/tools/gen_keycodes/data/macos_key_code_map_cc.tmpl @@ -0,0 +1,34 @@ +// 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 +#import +#include "./KeyCodeMap_internal.h" + +// DO NOT EDIT -- DO NOT EDIT -- DO NOT EDIT +// This file is generated by flutter/flutter@dev/tools/gen_keycodes/bin/gen_keycodes.dart and +// should not be edited directly. +// +// Edit the template dev/tools/gen_keycodes/data/keyboard_map_macos_cc.tmpl instead. +// See dev/tools/gen_keycodes/README.md for more information. + +@@@MASK_CONSTANTS@@@ + +const NSDictionary* keyCodeToPhysicalKey = @{ +@@@MACOS_SCAN_CODE_MAP@@@ +}; + +const NSDictionary* keyCodeToLogicalKey = @{ +@@@MACOS_KEYCODE_LOGICAL_MAP@@@ +}; + +const NSDictionary* keyCodeToModifierFlag = @{ +@@@KEYCODE_TO_MODIFIER_FLAG_MAP@@@ +}; + +const NSDictionary* modifierFlagToKeyCode = @{ +@@@MODIFIER_FLAG_TO_KEYCODE_MAP@@@ +}; + +@@@SPECIAL_KEY_CONSTANTS@@@ diff --git a/dev/tools/gen_keycodes/data/macos_logical_to_physical.json b/dev/tools/gen_keycodes/data/macos_logical_to_physical.json new file mode 100644 index 0000000000..996cf5e868 --- /dev/null +++ b/dev/tools/gen_keycodes/data/macos_logical_to_physical.json @@ -0,0 +1,72 @@ + +{ + "Backspace": ["Backspace"], + "Escape": ["Escape"], + "CapsLock": ["CapsLock"], + "Fn": ["Fn"], + "NumLock": ["NumLock"], + "ArrowDown": ["ArrowDown"], + "ArrowLeft": ["ArrowLeft"], + "ArrowRight": ["ArrowRight"], + "ArrowUp": ["ArrowUp"], + "End": ["End"], + "Home": ["Home"], + "PageDown": ["PageDown"], + "PageUp": ["PageUp"], + "Insert": ["Insert"], + "Delete": ["Delete"], + "ContextMenu": ["ContextMenu"], + "F1": ["F1"], + "F2": ["F2"], + "F3": ["F3"], + "F4": ["F4"], + "F5": ["F5"], + "F6": ["F6"], + "F7": ["F7"], + "F8": ["F8"], + "F9": ["F9"], + "F10": ["F10"], + "F11": ["F11"], + "F12": ["F12"], + "F13": ["F13"], + "F14": ["F14"], + "F15": ["F15"], + "F16": ["F16"], + "F17": ["F17"], + "F18": ["F18"], + "F19": ["F19"], + "F20": ["F20"], + "NumpadEnter": ["NumpadEnter"], + "NumpadMultiply": ["NumpadMultiply"], + "NumpadAdd": ["NumpadAdd"], + "NumpadComma": ["NumpadComma"], + "NumpadSubtract": ["NumpadSubtract"], + "NumpadDecimal": ["NumpadDecimal"], + "NumpadDivide": ["NumpadDivide"], + "Numpad0": ["Numpad0"], + "Numpad1": ["Numpad1"], + "Numpad2": ["Numpad2"], + "Numpad3": ["Numpad3"], + "Numpad4": ["Numpad4"], + "Numpad5": ["Numpad5"], + "Numpad6": ["Numpad6"], + "Numpad7": ["Numpad7"], + "Numpad8": ["Numpad8"], + "Numpad9": ["Numpad9"], + "NumpadEqual": ["NumpadEqual"], + "AltLeft": ["AltLeft"], + "ControlLeft": ["ControlLeft"], + "MetaLeft": ["MetaLeft"], + "ShiftLeft": ["ShiftLeft"], + "AltRight": ["AltRight"], + "ControlRight": ["ControlRight"], + "MetaRight": ["MetaRight"], + "ShiftRight": ["ShiftRight"], + "Lang1": ["Lang1"], + "Lang2": ["Lang2"], + "IntlYen": ["IntlYen"], + "IntlRo": ["IntlRo"], + "AudioVolumeUp": ["AudioVolumeUp"], + "AudioVolumeDown": ["AudioVolumeDown"], + "AudioVolumeMute": ["AudioVolumeMute"] +} diff --git a/dev/tools/gen_keycodes/data/mask_constants.json b/dev/tools/gen_keycodes/data/mask_constants.json new file mode 100644 index 0000000000..a6769fca85 --- /dev/null +++ b/dev/tools/gen_keycodes/data/mask_constants.json @@ -0,0 +1,50 @@ +{ + "valueMask": { + "value": "0x000FFFFFFFF", + "description": [ + "Mask for the 32-bit value portion of the key code.", + "This is used by platform-specific code to generate Flutter key codes." + ] + }, + + "platformMask": { + "value": "0x0FF00000000", + "description": [ + "Mask for the platform prefix portion of the key code.", + "This is used by platform-specific code to generate Flutter key codes." + ] + }, + + "unicodePlane": { + "value": "0x00000000000", + "description": [ + "The code prefix for keys which have a Unicode representation.", + "This is used by platform-specific code to generate Flutter key codes." + ] + }, + + "autogeneratedMask": { + "value": "0x10000000000", + "description": [ + "Mask for the auto-generated bit portion of the key code.", + "This is used by platform-specific code to generate new Flutter key codes for keys which are not recognized." + ] + }, + + "synonymMask": { + "value": "0x20000000000", + "description": [ + "Mask for the synonym pseudo-keys generated for keys which appear in more than one place on the keyboard.", + "IDs in this range are used to represent keys which appear in multiple places on the keyboard, such as the SHIFT, ALT, CTRL, and numeric keypad keys. These key codes will never be generated by the key event system, but may be used in key maps to represent the union of all the keys of each type in order to match them.", + "To look up the synonyms that are defined, look in the [synonyms] map." + ] + }, + + "hidPlane": { + "value": "0x00100000000", + "description": [ + "The code prefix for keys which do not have a Unicode representation.", + "This is used by platform-specific code to generate Flutter key codes using HID Usage codes." + ] + } +} diff --git a/dev/tools/gen_keycodes/data/physical_key_data.json b/dev/tools/gen_keycodes/data/physical_key_data.json new file mode 100644 index 0000000000..606bbba886 --- /dev/null +++ b/dev/tools/gen_keycodes/data/physical_key_data.json @@ -0,0 +1,4461 @@ +{ + "None": { + "names": { + "name": "None" + }, + "scanCodes": { + "usb": 0 + } + }, + "Hyper": { + "names": { + "name": "Hyper", + "chromium": "Hyper" + }, + "scanCodes": { + "usb": 16 + } + }, + "Super": { + "names": { + "name": "Super", + "chromium": "Super" + }, + "scanCodes": { + "usb": 17 + } + }, + "Fn": { + "names": { + "name": "Fn", + "chromium": "Fn" + }, + "scanCodes": { + "android": [ + 464 + ], + "usb": 18, + "macos": 63 + } + }, + "FnLock": { + "names": { + "name": "FnLock", + "chromium": "FnLock" + }, + "scanCodes": { + "usb": 19 + } + }, + "Suspend": { + "names": { + "name": "Suspend", + "chromium": "Suspend" + }, + "scanCodes": { + "android": [ + 205 + ], + "usb": 20 + } + }, + "Resume": { + "names": { + "name": "Resume", + "chromium": "Resume" + }, + "scanCodes": { + "usb": 21 + } + }, + "Turbo": { + "names": { + "name": "Turbo", + "chromium": "Turbo" + }, + "scanCodes": { + "usb": 22 + } + }, + "PrivacyScreenToggle": { + "names": { + "name": "PrivacyScreenToggle", + "chromium": "PrivacyScreenToggle" + }, + "scanCodes": { + "usb": 23, + "linux": 633, + "xkb": 641 + } + }, + "Sleep": { + "names": { + "name": "Sleep", + "chromium": "Sleep" + }, + "scanCodes": { + "android": [ + 142 + ], + "usb": 65666, + "linux": 142, + "xkb": 150, + "windows": 57439 + } + }, + "WakeUp": { + "names": { + "name": "WakeUp", + "chromium": "WakeUp" + }, + "scanCodes": { + "android": [ + 143 + ], + "usb": 65667, + "linux": 143, + "xkb": 151, + "windows": 57443 + } + }, + "DisplayToggleIntExt": { + "names": { + "name": "DisplayToggleIntExt", + "chromium": "DisplayToggleIntExt" + }, + "scanCodes": { + "usb": 65717, + "linux": 227, + "xkb": 235 + } + }, + "GameButton1": { + "names": { + "name": "GameButton1", + "chromium": "GameButton1" + }, + "scanCodes": { + "android": [ + 256, + 288 + ], + "usb": 392961 + } + }, + "GameButton2": { + "names": { + "name": "GameButton2", + "chromium": "GameButton2" + }, + "scanCodes": { + "android": [ + 257, + 289 + ], + "usb": 392962 + } + }, + "GameButton3": { + "names": { + "name": "GameButton3", + "chromium": "GameButton3" + }, + "scanCodes": { + "android": [ + 258, + 290 + ], + "usb": 392963 + } + }, + "GameButton4": { + "names": { + "name": "GameButton4", + "chromium": "GameButton4" + }, + "scanCodes": { + "android": [ + 259, + 291 + ], + "usb": 392964 + } + }, + "GameButton5": { + "names": { + "name": "GameButton5", + "chromium": "GameButton5" + }, + "scanCodes": { + "android": [ + 260, + 292 + ], + "usb": 392965 + } + }, + "GameButton6": { + "names": { + "name": "GameButton6", + "chromium": "GameButton6" + }, + "scanCodes": { + "android": [ + 261, + 293 + ], + "usb": 392966 + } + }, + "GameButton7": { + "names": { + "name": "GameButton7", + "chromium": "GameButton7" + }, + "scanCodes": { + "android": [ + 262, + 294 + ], + "usb": 392967 + } + }, + "GameButton8": { + "names": { + "name": "GameButton8", + "chromium": "GameButton8" + }, + "scanCodes": { + "android": [ + 263, + 295 + ], + "usb": 392968 + } + }, + "GameButton9": { + "names": { + "name": "GameButton9", + "chromium": "GameButton9" + }, + "scanCodes": { + "android": [ + 264, + 296 + ], + "usb": 392969 + } + }, + "GameButton10": { + "names": { + "name": "GameButton10", + "chromium": "GameButton10" + }, + "scanCodes": { + "android": [ + 265, + 297 + ], + "usb": 392970 + } + }, + "GameButton11": { + "names": { + "name": "GameButton11", + "chromium": "GameButton11" + }, + "scanCodes": { + "android": [ + 266, + 298 + ], + "usb": 392971 + } + }, + "GameButton12": { + "names": { + "name": "GameButton12", + "chromium": "GameButton12" + }, + "scanCodes": { + "android": [ + 267, + 299 + ], + "usb": 392972 + } + }, + "GameButton13": { + "names": { + "name": "GameButton13", + "chromium": "GameButton13" + }, + "scanCodes": { + "android": [ + 268, + 300 + ], + "usb": 392973 + } + }, + "GameButton14": { + "names": { + "name": "GameButton14", + "chromium": "GameButton14" + }, + "scanCodes": { + "android": [ + 269, + 301 + ], + "usb": 392974 + } + }, + "GameButton15": { + "names": { + "name": "GameButton15", + "chromium": "GameButton15" + }, + "scanCodes": { + "android": [ + 270, + 302 + ], + "usb": 392975 + } + }, + "GameButton16": { + "names": { + "name": "GameButton16", + "chromium": "GameButton16" + }, + "scanCodes": { + "android": [ + 271, + 303 + ], + "usb": 392976 + } + }, + "GameButtonA": { + "names": { + "name": "GameButtonA", + "chromium": "GameButtonA" + }, + "scanCodes": { + "android": [ + 304 + ], + "usb": 392977 + } + }, + "GameButtonB": { + "names": { + "name": "GameButtonB", + "chromium": "GameButtonB" + }, + "scanCodes": { + "android": [ + 305 + ], + "usb": 392978 + } + }, + "GameButtonC": { + "names": { + "name": "GameButtonC", + "chromium": "GameButtonC" + }, + "scanCodes": { + "android": [ + 306 + ], + "usb": 392979 + } + }, + "GameButtonLeft1": { + "names": { + "name": "GameButtonLeft1", + "chromium": "GameButtonLeft1" + }, + "scanCodes": { + "android": [ + 310 + ], + "usb": 392980 + } + }, + "GameButtonLeft2": { + "names": { + "name": "GameButtonLeft2", + "chromium": "GameButtonLeft2" + }, + "scanCodes": { + "android": [ + 312 + ], + "usb": 392981 + } + }, + "GameButtonMode": { + "names": { + "name": "GameButtonMode", + "chromium": "GameButtonMode" + }, + "scanCodes": { + "android": [ + 316 + ], + "usb": 392982 + } + }, + "GameButtonRight1": { + "names": { + "name": "GameButtonRight1", + "chromium": "GameButtonRight1" + }, + "scanCodes": { + "android": [ + 311 + ], + "usb": 392983 + } + }, + "GameButtonRight2": { + "names": { + "name": "GameButtonRight2", + "chromium": "GameButtonRight2" + }, + "scanCodes": { + "android": [ + 313 + ], + "usb": 392984 + } + }, + "GameButtonSelect": { + "names": { + "name": "GameButtonSelect", + "chromium": "GameButtonSelect" + }, + "scanCodes": { + "android": [ + 314 + ], + "usb": 392985 + } + }, + "GameButtonStart": { + "names": { + "name": "GameButtonStart", + "chromium": "GameButtonStart" + }, + "scanCodes": { + "android": [ + 315 + ], + "usb": 392986 + } + }, + "GameButtonThumbLeft": { + "names": { + "name": "GameButtonThumbLeft", + "chromium": "GameButtonThumbLeft" + }, + "scanCodes": { + "android": [ + 317 + ], + "usb": 392987 + } + }, + "GameButtonThumbRight": { + "names": { + "name": "GameButtonThumbRight", + "chromium": "GameButtonThumbRight" + }, + "scanCodes": { + "android": [ + 318 + ], + "usb": 392988 + } + }, + "GameButtonX": { + "names": { + "name": "GameButtonX", + "chromium": "GameButtonX" + }, + "scanCodes": { + "android": [ + 307 + ], + "usb": 392989 + } + }, + "GameButtonY": { + "names": { + "name": "GameButtonY", + "chromium": "GameButtonY" + }, + "scanCodes": { + "android": [ + 308 + ], + "usb": 392990 + } + }, + "GameButtonZ": { + "names": { + "name": "GameButtonZ", + "chromium": "GameButtonZ" + }, + "scanCodes": { + "android": [ + 309 + ], + "usb": 392991 + } + }, + "UsbReserved": { + "names": { + "name": "UsbReserved" + }, + "scanCodes": { + "usb": 458752, + "ios": 0 + } + }, + "UsbErrorRollOver": { + "names": { + "name": "UsbErrorRollOver" + }, + "scanCodes": { + "usb": 458753, + "windows": 255, + "ios": 1 + } + }, + "UsbPostFail": { + "names": { + "name": "UsbPostFail" + }, + "scanCodes": { + "usb": 458754, + "windows": 252, + "ios": 2 + } + }, + "UsbErrorUndefined": { + "names": { + "name": "UsbErrorUndefined" + }, + "scanCodes": { + "usb": 458755, + "ios": 3 + } + }, + "KeyA": { + "names": { + "name": "KeyA", + "chromium": "KeyA" + }, + "scanCodes": { + "android": [ + 30 + ], + "usb": 458756, + "linux": 30, + "xkb": 38, + "windows": 30, + "macos": 0, + "ios": 4 + }, + "keyCodes": { + "glfw": [ + 65 + ] + } + }, + "KeyB": { + "names": { + "name": "KeyB", + "chromium": "KeyB" + }, + "scanCodes": { + "android": [ + 48 + ], + "usb": 458757, + "linux": 48, + "xkb": 56, + "windows": 48, + "macos": 11, + "ios": 5 + }, + "keyCodes": { + "glfw": [ + 66 + ] + } + }, + "KeyC": { + "names": { + "name": "KeyC", + "chromium": "KeyC" + }, + "scanCodes": { + "android": [ + 46 + ], + "usb": 458758, + "linux": 46, + "xkb": 54, + "windows": 46, + "macos": 8, + "ios": 6 + }, + "keyCodes": { + "glfw": [ + 67 + ] + } + }, + "KeyD": { + "names": { + "name": "KeyD", + "chromium": "KeyD" + }, + "scanCodes": { + "android": [ + 32 + ], + "usb": 458759, + "linux": 32, + "xkb": 40, + "windows": 32, + "macos": 2, + "ios": 7 + }, + "keyCodes": { + "glfw": [ + 68 + ] + } + }, + "KeyE": { + "names": { + "name": "KeyE", + "chromium": "KeyE" + }, + "scanCodes": { + "android": [ + 18 + ], + "usb": 458760, + "linux": 18, + "xkb": 26, + "windows": 18, + "macos": 14, + "ios": 8 + }, + "keyCodes": { + "glfw": [ + 69 + ] + } + }, + "KeyF": { + "names": { + "name": "KeyF", + "chromium": "KeyF" + }, + "scanCodes": { + "android": [ + 33 + ], + "usb": 458761, + "linux": 33, + "xkb": 41, + "windows": 33, + "macos": 3, + "ios": 9 + }, + "keyCodes": { + "glfw": [ + 70 + ] + } + }, + "KeyG": { + "names": { + "name": "KeyG", + "chromium": "KeyG" + }, + "scanCodes": { + "android": [ + 34 + ], + "usb": 458762, + "linux": 34, + "xkb": 42, + "windows": 34, + "macos": 5, + "ios": 10 + }, + "keyCodes": { + "glfw": [ + 71 + ] + } + }, + "KeyH": { + "names": { + "name": "KeyH", + "chromium": "KeyH" + }, + "scanCodes": { + "android": [ + 35 + ], + "usb": 458763, + "linux": 35, + "xkb": 43, + "windows": 35, + "macos": 4, + "ios": 11 + }, + "keyCodes": { + "glfw": [ + 72 + ] + } + }, + "KeyI": { + "names": { + "name": "KeyI", + "chromium": "KeyI" + }, + "scanCodes": { + "android": [ + 23 + ], + "usb": 458764, + "linux": 23, + "xkb": 31, + "windows": 23, + "macos": 34, + "ios": 12 + }, + "keyCodes": { + "glfw": [ + 73 + ] + } + }, + "KeyJ": { + "names": { + "name": "KeyJ", + "chromium": "KeyJ" + }, + "scanCodes": { + "android": [ + 36 + ], + "usb": 458765, + "linux": 36, + "xkb": 44, + "windows": 36, + "macos": 38, + "ios": 13 + }, + "keyCodes": { + "glfw": [ + 74 + ] + } + }, + "KeyK": { + "names": { + "name": "KeyK", + "chromium": "KeyK" + }, + "scanCodes": { + "android": [ + 37 + ], + "usb": 458766, + "linux": 37, + "xkb": 45, + "windows": 37, + "macos": 40, + "ios": 14 + }, + "keyCodes": { + "glfw": [ + 75 + ] + } + }, + "KeyL": { + "names": { + "name": "KeyL", + "chromium": "KeyL" + }, + "scanCodes": { + "android": [ + 38 + ], + "usb": 458767, + "linux": 38, + "xkb": 46, + "windows": 38, + "macos": 37, + "ios": 15 + }, + "keyCodes": { + "glfw": [ + 76 + ] + } + }, + "KeyM": { + "names": { + "name": "KeyM", + "chromium": "KeyM" + }, + "scanCodes": { + "android": [ + 50 + ], + "usb": 458768, + "linux": 50, + "xkb": 58, + "windows": 50, + "macos": 46, + "ios": 16 + }, + "keyCodes": { + "glfw": [ + 77 + ] + } + }, + "KeyN": { + "names": { + "name": "KeyN", + "chromium": "KeyN" + }, + "scanCodes": { + "android": [ + 49 + ], + "usb": 458769, + "linux": 49, + "xkb": 57, + "windows": 49, + "macos": 45, + "ios": 17 + }, + "keyCodes": { + "glfw": [ + 78 + ] + } + }, + "KeyO": { + "names": { + "name": "KeyO", + "chromium": "KeyO" + }, + "scanCodes": { + "android": [ + 24 + ], + "usb": 458770, + "linux": 24, + "xkb": 32, + "windows": 24, + "macos": 31, + "ios": 18 + }, + "keyCodes": { + "glfw": [ + 79 + ] + } + }, + "KeyP": { + "names": { + "name": "KeyP", + "chromium": "KeyP" + }, + "scanCodes": { + "android": [ + 25 + ], + "usb": 458771, + "linux": 25, + "xkb": 33, + "windows": 25, + "macos": 35, + "ios": 19 + }, + "keyCodes": { + "glfw": [ + 80 + ] + } + }, + "KeyQ": { + "names": { + "name": "KeyQ", + "chromium": "KeyQ" + }, + "scanCodes": { + "android": [ + 16 + ], + "usb": 458772, + "linux": 16, + "xkb": 24, + "windows": 16, + "macos": 12, + "ios": 20 + }, + "keyCodes": { + "glfw": [ + 81 + ] + } + }, + "KeyR": { + "names": { + "name": "KeyR", + "chromium": "KeyR" + }, + "scanCodes": { + "android": [ + 19 + ], + "usb": 458773, + "linux": 19, + "xkb": 27, + "windows": 19, + "macos": 15, + "ios": 21 + }, + "keyCodes": { + "glfw": [ + 82 + ] + } + }, + "KeyS": { + "names": { + "name": "KeyS", + "chromium": "KeyS" + }, + "scanCodes": { + "android": [ + 31 + ], + "usb": 458774, + "linux": 31, + "xkb": 39, + "windows": 31, + "macos": 1, + "ios": 22 + }, + "keyCodes": { + "glfw": [ + 83 + ] + } + }, + "KeyT": { + "names": { + "name": "KeyT", + "chromium": "KeyT" + }, + "scanCodes": { + "android": [ + 20 + ], + "usb": 458775, + "linux": 20, + "xkb": 28, + "windows": 20, + "macos": 17, + "ios": 23 + }, + "keyCodes": { + "glfw": [ + 84 + ] + } + }, + "KeyU": { + "names": { + "name": "KeyU", + "chromium": "KeyU" + }, + "scanCodes": { + "android": [ + 22 + ], + "usb": 458776, + "linux": 22, + "xkb": 30, + "windows": 22, + "macos": 32, + "ios": 24 + }, + "keyCodes": { + "glfw": [ + 85 + ] + } + }, + "KeyV": { + "names": { + "name": "KeyV", + "chromium": "KeyV" + }, + "scanCodes": { + "android": [ + 47 + ], + "usb": 458777, + "linux": 47, + "xkb": 55, + "windows": 47, + "macos": 9, + "ios": 25 + }, + "keyCodes": { + "glfw": [ + 86 + ] + } + }, + "KeyW": { + "names": { + "name": "KeyW", + "chromium": "KeyW" + }, + "scanCodes": { + "android": [ + 17 + ], + "usb": 458778, + "linux": 17, + "xkb": 25, + "windows": 17, + "macos": 13, + "ios": 26 + }, + "keyCodes": { + "glfw": [ + 87 + ] + } + }, + "KeyX": { + "names": { + "name": "KeyX", + "chromium": "KeyX" + }, + "scanCodes": { + "android": [ + 45 + ], + "usb": 458779, + "linux": 45, + "xkb": 53, + "windows": 45, + "macos": 7, + "ios": 27 + }, + "keyCodes": { + "glfw": [ + 88 + ] + } + }, + "KeyY": { + "names": { + "name": "KeyY", + "chromium": "KeyY" + }, + "scanCodes": { + "android": [ + 21 + ], + "usb": 458780, + "linux": 21, + "xkb": 29, + "windows": 21, + "macos": 16, + "ios": 28 + }, + "keyCodes": { + "glfw": [ + 89 + ] + } + }, + "KeyZ": { + "names": { + "name": "KeyZ", + "chromium": "KeyZ" + }, + "scanCodes": { + "android": [ + 44 + ], + "usb": 458781, + "linux": 44, + "xkb": 52, + "windows": 44, + "macos": 6, + "ios": 29 + }, + "keyCodes": { + "glfw": [ + 90 + ] + } + }, + "Digit1": { + "names": { + "name": "Digit1", + "chromium": "Digit1" + }, + "scanCodes": { + "android": [ + 2 + ], + "usb": 458782, + "linux": 2, + "xkb": 10, + "windows": 2, + "macos": 18, + "ios": 30 + }, + "keyCodes": { + "glfw": [ + 49 + ] + } + }, + "Digit2": { + "names": { + "name": "Digit2", + "chromium": "Digit2" + }, + "scanCodes": { + "android": [ + 3 + ], + "usb": 458783, + "linux": 3, + "xkb": 11, + "windows": 3, + "macos": 19, + "ios": 31 + }, + "keyCodes": { + "glfw": [ + 50 + ] + } + }, + "Digit3": { + "names": { + "name": "Digit3", + "chromium": "Digit3" + }, + "scanCodes": { + "android": [ + 4 + ], + "usb": 458784, + "linux": 4, + "xkb": 12, + "windows": 4, + "macos": 20, + "ios": 32 + }, + "keyCodes": { + "glfw": [ + 51 + ] + } + }, + "Digit4": { + "names": { + "name": "Digit4", + "chromium": "Digit4" + }, + "scanCodes": { + "android": [ + 5 + ], + "usb": 458785, + "linux": 5, + "xkb": 13, + "windows": 5, + "macos": 21, + "ios": 33 + }, + "keyCodes": { + "glfw": [ + 52 + ] + } + }, + "Digit5": { + "names": { + "name": "Digit5", + "chromium": "Digit5" + }, + "scanCodes": { + "android": [ + 6 + ], + "usb": 458786, + "linux": 6, + "xkb": 14, + "windows": 6, + "macos": 23, + "ios": 34 + }, + "keyCodes": { + "glfw": [ + 53 + ] + } + }, + "Digit6": { + "names": { + "name": "Digit6", + "chromium": "Digit6" + }, + "scanCodes": { + "android": [ + 7 + ], + "usb": 458787, + "linux": 7, + "xkb": 15, + "windows": 7, + "macos": 22, + "ios": 35 + }, + "keyCodes": { + "glfw": [ + 54 + ] + } + }, + "Digit7": { + "names": { + "name": "Digit7", + "chromium": "Digit7" + }, + "scanCodes": { + "android": [ + 8 + ], + "usb": 458788, + "linux": 8, + "xkb": 16, + "windows": 8, + "macos": 26, + "ios": 36 + }, + "keyCodes": { + "glfw": [ + 55 + ] + } + }, + "Digit8": { + "names": { + "name": "Digit8", + "chromium": "Digit8" + }, + "scanCodes": { + "android": [ + 9 + ], + "usb": 458789, + "linux": 9, + "xkb": 17, + "windows": 9, + "macos": 28, + "ios": 37 + }, + "keyCodes": { + "glfw": [ + 56 + ] + } + }, + "Digit9": { + "names": { + "name": "Digit9", + "chromium": "Digit9" + }, + "scanCodes": { + "android": [ + 10 + ], + "usb": 458790, + "linux": 10, + "xkb": 18, + "windows": 10, + "macos": 25, + "ios": 38 + }, + "keyCodes": { + "glfw": [ + 57 + ] + } + }, + "Digit0": { + "names": { + "name": "Digit0", + "chromium": "Digit0" + }, + "scanCodes": { + "android": [ + 11 + ], + "usb": 458791, + "linux": 11, + "xkb": 19, + "windows": 11, + "macos": 29, + "ios": 39 + }, + "keyCodes": { + "glfw": [ + 48 + ] + } + }, + "Enter": { + "names": { + "name": "Enter", + "chromium": "Enter" + }, + "scanCodes": { + "android": [ + 28 + ], + "usb": 458792, + "linux": 28, + "xkb": 36, + "windows": 28, + "macos": 36, + "ios": 40 + }, + "keyCodes": { + "glfw": [ + 257 + ] + } + }, + "Escape": { + "names": { + "name": "Escape", + "chromium": "Escape" + }, + "scanCodes": { + "android": [ + 1 + ], + "usb": 458793, + "linux": 1, + "xkb": 9, + "windows": 1, + "macos": 53, + "ios": 41 + }, + "keyCodes": { + "glfw": [ + 256 + ] + } + }, + "Backspace": { + "names": { + "name": "Backspace", + "chromium": "Backspace" + }, + "scanCodes": { + "android": [ + 14 + ], + "usb": 458794, + "linux": 14, + "xkb": 22, + "windows": 14, + "macos": 51, + "ios": 42 + }, + "keyCodes": { + "glfw": [ + 259 + ] + } + }, + "Tab": { + "names": { + "name": "Tab", + "chromium": "Tab" + }, + "scanCodes": { + "android": [ + 15 + ], + "usb": 458795, + "linux": 15, + "xkb": 23, + "windows": 15, + "macos": 48, + "ios": 43 + }, + "keyCodes": { + "glfw": [ + 258 + ] + } + }, + "Space": { + "names": { + "name": "Space", + "chromium": "Space" + }, + "scanCodes": { + "android": [ + 57 + ], + "usb": 458796, + "linux": 57, + "xkb": 65, + "windows": 57, + "macos": 49, + "ios": 44 + }, + "keyCodes": { + "glfw": [ + 32 + ] + } + }, + "Minus": { + "names": { + "name": "Minus", + "chromium": "Minus" + }, + "scanCodes": { + "android": [ + 12 + ], + "usb": 458797, + "linux": 12, + "xkb": 20, + "windows": 12, + "macos": 27, + "ios": 45 + }, + "keyCodes": { + "glfw": [ + 45 + ] + } + }, + "Equal": { + "names": { + "name": "Equal", + "chromium": "Equal" + }, + "scanCodes": { + "android": [ + 13 + ], + "usb": 458798, + "linux": 13, + "xkb": 21, + "windows": 13, + "macos": 24, + "ios": 46 + }, + "keyCodes": { + "glfw": [ + 61 + ] + } + }, + "BracketLeft": { + "names": { + "name": "BracketLeft", + "chromium": "BracketLeft" + }, + "scanCodes": { + "android": [ + 26 + ], + "usb": 458799, + "linux": 26, + "xkb": 34, + "windows": 26, + "macos": 33, + "ios": 47 + }, + "keyCodes": { + "glfw": [ + 91 + ] + } + }, + "BracketRight": { + "names": { + "name": "BracketRight", + "chromium": "BracketRight" + }, + "scanCodes": { + "android": [ + 27 + ], + "usb": 458800, + "linux": 27, + "xkb": 35, + "windows": 27, + "macos": 30, + "ios": 48 + }, + "keyCodes": { + "glfw": [ + 93 + ] + } + }, + "Backslash": { + "names": { + "name": "Backslash", + "chromium": "Backslash" + }, + "scanCodes": { + "android": [ + 43, + 86 + ], + "usb": 458801, + "linux": 43, + "xkb": 51, + "windows": 43, + "macos": 42, + "ios": 49 + }, + "keyCodes": { + "glfw": [ + 92 + ] + } + }, + "Semicolon": { + "names": { + "name": "Semicolon", + "chromium": "Semicolon" + }, + "scanCodes": { + "android": [ + 39 + ], + "usb": 458803, + "linux": 39, + "xkb": 47, + "windows": 39, + "macos": 41, + "ios": 51 + }, + "keyCodes": { + "glfw": [ + 59 + ] + } + }, + "Quote": { + "names": { + "name": "Quote", + "chromium": "Quote" + }, + "scanCodes": { + "android": [ + 40 + ], + "usb": 458804, + "linux": 40, + "xkb": 48, + "windows": 40, + "macos": 39, + "ios": 52 + }, + "keyCodes": { + "glfw": [ + 39 + ] + } + }, + "Backquote": { + "names": { + "name": "Backquote", + "chromium": "Backquote" + }, + "scanCodes": { + "android": [ + 41 + ], + "usb": 458805, + "linux": 41, + "xkb": 49, + "windows": 41, + "macos": 50, + "ios": 53 + }, + "keyCodes": { + "glfw": [ + 96 + ] + } + }, + "Comma": { + "names": { + "name": "Comma", + "chromium": "Comma" + }, + "scanCodes": { + "android": [ + 51 + ], + "usb": 458806, + "linux": 51, + "xkb": 59, + "windows": 51, + "macos": 43, + "ios": 54 + }, + "keyCodes": { + "glfw": [ + 44 + ] + } + }, + "Period": { + "names": { + "name": "Period", + "chromium": "Period" + }, + "scanCodes": { + "android": [ + 52 + ], + "usb": 458807, + "linux": 52, + "xkb": 60, + "windows": 52, + "macos": 47, + "ios": 55 + }, + "keyCodes": { + "glfw": [ + 46 + ] + } + }, + "Slash": { + "names": { + "name": "Slash", + "chromium": "Slash" + }, + "scanCodes": { + "android": [ + 53 + ], + "usb": 458808, + "linux": 53, + "xkb": 61, + "windows": 53, + "macos": 44, + "ios": 56 + }, + "keyCodes": { + "glfw": [ + 47 + ] + } + }, + "CapsLock": { + "names": { + "name": "CapsLock", + "chromium": "CapsLock" + }, + "scanCodes": { + "android": [ + 58 + ], + "usb": 458809, + "linux": 58, + "xkb": 66, + "windows": 58, + "macos": 57, + "ios": 57 + }, + "keyCodes": { + "glfw": [ + 280 + ] + } + }, + "F1": { + "names": { + "name": "F1", + "chromium": "F1" + }, + "scanCodes": { + "android": [ + 59 + ], + "usb": 458810, + "linux": 59, + "xkb": 67, + "windows": 59, + "macos": 122, + "ios": 58 + }, + "keyCodes": { + "glfw": [ + 290 + ] + } + }, + "F2": { + "names": { + "name": "F2", + "chromium": "F2" + }, + "scanCodes": { + "android": [ + 60 + ], + "usb": 458811, + "linux": 60, + "xkb": 68, + "windows": 60, + "macos": 120, + "ios": 59 + }, + "keyCodes": { + "glfw": [ + 291 + ] + } + }, + "F3": { + "names": { + "name": "F3", + "chromium": "F3" + }, + "scanCodes": { + "android": [ + 61 + ], + "usb": 458812, + "linux": 61, + "xkb": 69, + "windows": 61, + "macos": 99, + "ios": 60 + }, + "keyCodes": { + "glfw": [ + 292 + ] + } + }, + "F4": { + "names": { + "name": "F4", + "chromium": "F4" + }, + "scanCodes": { + "android": [ + 62 + ], + "usb": 458813, + "linux": 62, + "xkb": 70, + "windows": 62, + "macos": 118, + "ios": 61 + }, + "keyCodes": { + "glfw": [ + 293 + ] + } + }, + "F5": { + "names": { + "name": "F5", + "chromium": "F5" + }, + "scanCodes": { + "android": [ + 63 + ], + "usb": 458814, + "linux": 63, + "xkb": 71, + "windows": 63, + "macos": 96, + "ios": 62 + }, + "keyCodes": { + "glfw": [ + 294 + ] + } + }, + "F6": { + "names": { + "name": "F6", + "chromium": "F6" + }, + "scanCodes": { + "android": [ + 64 + ], + "usb": 458815, + "linux": 64, + "xkb": 72, + "windows": 64, + "macos": 97, + "ios": 63 + }, + "keyCodes": { + "glfw": [ + 295 + ] + } + }, + "F7": { + "names": { + "name": "F7", + "chromium": "F7" + }, + "scanCodes": { + "android": [ + 65 + ], + "usb": 458816, + "linux": 65, + "xkb": 73, + "windows": 65, + "macos": 98, + "ios": 64 + }, + "keyCodes": { + "glfw": [ + 296 + ] + } + }, + "F8": { + "names": { + "name": "F8", + "chromium": "F8" + }, + "scanCodes": { + "android": [ + 66 + ], + "usb": 458817, + "linux": 66, + "xkb": 74, + "windows": 66, + "macos": 100, + "ios": 65 + }, + "keyCodes": { + "glfw": [ + 297 + ] + } + }, + "F9": { + "names": { + "name": "F9", + "chromium": "F9" + }, + "scanCodes": { + "android": [ + 67 + ], + "usb": 458818, + "linux": 67, + "xkb": 75, + "windows": 67, + "macos": 101, + "ios": 66 + }, + "keyCodes": { + "glfw": [ + 298 + ] + } + }, + "F10": { + "names": { + "name": "F10", + "chromium": "F10" + }, + "scanCodes": { + "android": [ + 68 + ], + "usb": 458819, + "linux": 68, + "xkb": 76, + "windows": 68, + "macos": 109, + "ios": 67 + }, + "keyCodes": { + "glfw": [ + 299 + ] + } + }, + "F11": { + "names": { + "name": "F11", + "chromium": "F11" + }, + "scanCodes": { + "android": [ + 87 + ], + "usb": 458820, + "linux": 87, + "xkb": 95, + "windows": 87, + "macos": 103, + "ios": 68 + }, + "keyCodes": { + "glfw": [ + 300 + ] + } + }, + "F12": { + "names": { + "name": "F12", + "chromium": "F12" + }, + "scanCodes": { + "android": [ + 88 + ], + "usb": 458821, + "linux": 88, + "xkb": 96, + "windows": 88, + "macos": 111, + "ios": 69 + }, + "keyCodes": { + "glfw": [ + 301 + ] + } + }, + "PrintScreen": { + "names": { + "name": "PrintScreen", + "chromium": "PrintScreen" + }, + "scanCodes": { + "android": [ + 99 + ], + "usb": 458822, + "linux": 99, + "xkb": 107, + "windows": 57399, + "ios": 70 + }, + "keyCodes": { + "glfw": [ + 283 + ] + } + }, + "ScrollLock": { + "names": { + "name": "ScrollLock", + "chromium": "ScrollLock" + }, + "scanCodes": { + "android": [ + 70 + ], + "usb": 458823, + "linux": 70, + "xkb": 78, + "windows": 70, + "ios": 71 + } + }, + "Pause": { + "names": { + "name": "Pause", + "chromium": "Pause" + }, + "scanCodes": { + "android": [ + 119, + 411 + ], + "usb": 458824, + "linux": 119, + "xkb": 127, + "windows": 69, + "ios": 72 + }, + "keyCodes": { + "glfw": [ + 284 + ] + } + }, + "Insert": { + "names": { + "name": "Insert", + "chromium": "Insert" + }, + "scanCodes": { + "android": [ + 110 + ], + "usb": 458825, + "linux": 110, + "xkb": 118, + "windows": 57426, + "macos": 114, + "ios": 73 + }, + "keyCodes": { + "glfw": [ + 260 + ] + } + }, + "Home": { + "names": { + "name": "Home", + "chromium": "Home" + }, + "scanCodes": { + "android": [ + 102 + ], + "usb": 458826, + "linux": 102, + "xkb": 110, + "windows": 57415, + "macos": 115, + "ios": 74 + }, + "keyCodes": { + "glfw": [ + 268 + ] + } + }, + "PageUp": { + "names": { + "name": "PageUp", + "chromium": "PageUp" + }, + "scanCodes": { + "android": [ + 104, + 177 + ], + "usb": 458827, + "linux": 104, + "xkb": 112, + "windows": 57417, + "macos": 116, + "ios": 75 + }, + "keyCodes": { + "glfw": [ + 266 + ] + } + }, + "Delete": { + "names": { + "name": "Delete", + "chromium": "Delete" + }, + "scanCodes": { + "android": [ + 111 + ], + "usb": 458828, + "linux": 111, + "xkb": 119, + "windows": 57427, + "macos": 117, + "ios": 76 + }, + "keyCodes": { + "glfw": [ + 261 + ] + } + }, + "End": { + "names": { + "name": "End", + "chromium": "End" + }, + "scanCodes": { + "android": [ + 107 + ], + "usb": 458829, + "linux": 107, + "xkb": 115, + "windows": 57423, + "macos": 119, + "ios": 77 + }, + "keyCodes": { + "glfw": [ + 269 + ] + } + }, + "PageDown": { + "names": { + "name": "PageDown", + "chromium": "PageDown" + }, + "scanCodes": { + "android": [ + 109, + 178 + ], + "usb": 458830, + "linux": 109, + "xkb": 117, + "windows": 57425, + "macos": 121, + "ios": 78 + }, + "keyCodes": { + "glfw": [ + 267 + ] + } + }, + "ArrowRight": { + "names": { + "name": "ArrowRight", + "chromium": "ArrowRight" + }, + "scanCodes": { + "android": [ + 106 + ], + "usb": 458831, + "linux": 106, + "xkb": 114, + "windows": 57421, + "macos": 124, + "ios": 79 + }, + "keyCodes": { + "glfw": [ + 262 + ] + } + }, + "ArrowLeft": { + "names": { + "name": "ArrowLeft", + "chromium": "ArrowLeft" + }, + "scanCodes": { + "android": [ + 105 + ], + "usb": 458832, + "linux": 105, + "xkb": 113, + "windows": 57419, + "macos": 123, + "ios": 80 + }, + "keyCodes": { + "glfw": [ + 263 + ] + } + }, + "ArrowDown": { + "names": { + "name": "ArrowDown", + "chromium": "ArrowDown" + }, + "scanCodes": { + "android": [ + 108 + ], + "usb": 458833, + "linux": 108, + "xkb": 116, + "windows": 57424, + "macos": 125, + "ios": 81 + }, + "keyCodes": { + "glfw": [ + 264 + ] + } + }, + "ArrowUp": { + "names": { + "name": "ArrowUp", + "chromium": "ArrowUp" + }, + "scanCodes": { + "android": [ + 103 + ], + "usb": 458834, + "linux": 103, + "xkb": 111, + "windows": 57416, + "macos": 126, + "ios": 82 + }, + "keyCodes": { + "glfw": [ + 265 + ] + } + }, + "NumLock": { + "names": { + "name": "NumLock", + "chromium": "NumLock" + }, + "scanCodes": { + "android": [ + 69 + ], + "usb": 458835, + "linux": 69, + "xkb": 77, + "windows": 57413, + "macos": 71, + "ios": 83 + }, + "keyCodes": { + "glfw": [ + 282 + ] + } + }, + "NumpadDivide": { + "names": { + "name": "NumpadDivide", + "chromium": "NumpadDivide" + }, + "scanCodes": { + "android": [ + 98 + ], + "usb": 458836, + "linux": 98, + "xkb": 106, + "windows": 57397, + "macos": 75, + "ios": 84 + }, + "keyCodes": { + "glfw": [ + 331 + ] + } + }, + "NumpadMultiply": { + "names": { + "name": "NumpadMultiply", + "chromium": "NumpadMultiply" + }, + "scanCodes": { + "android": [ + 55 + ], + "usb": 458837, + "linux": 55, + "xkb": 63, + "windows": 55, + "macos": 67, + "ios": 85 + }, + "keyCodes": { + "glfw": [ + 332 + ] + } + }, + "NumpadSubtract": { + "names": { + "name": "NumpadSubtract", + "chromium": "NumpadSubtract" + }, + "scanCodes": { + "android": [ + 74 + ], + "usb": 458838, + "linux": 74, + "xkb": 82, + "windows": 74, + "macos": 78, + "ios": 86 + } + }, + "NumpadAdd": { + "names": { + "name": "NumpadAdd", + "chromium": "NumpadAdd" + }, + "scanCodes": { + "android": [ + 78 + ], + "usb": 458839, + "linux": 78, + "xkb": 86, + "windows": 78, + "macos": 69, + "ios": 87 + }, + "keyCodes": { + "glfw": [ + 334 + ] + } + }, + "NumpadEnter": { + "names": { + "name": "NumpadEnter", + "chromium": "NumpadEnter" + }, + "scanCodes": { + "android": [ + 96 + ], + "usb": 458840, + "linux": 96, + "xkb": 104, + "windows": 57372, + "macos": 76, + "ios": 88 + }, + "keyCodes": { + "glfw": [ + 335 + ] + } + }, + "Numpad1": { + "names": { + "name": "Numpad1", + "chromium": "Numpad1" + }, + "scanCodes": { + "android": [ + 79 + ], + "usb": 458841, + "linux": 79, + "xkb": 87, + "windows": 79, + "macos": 83, + "ios": 89 + }, + "keyCodes": { + "glfw": [ + 321 + ] + } + }, + "Numpad2": { + "names": { + "name": "Numpad2", + "chromium": "Numpad2" + }, + "scanCodes": { + "android": [ + 80 + ], + "usb": 458842, + "linux": 80, + "xkb": 88, + "windows": 80, + "macos": 84, + "ios": 90 + }, + "keyCodes": { + "glfw": [ + 322 + ] + } + }, + "Numpad3": { + "names": { + "name": "Numpad3", + "chromium": "Numpad3" + }, + "scanCodes": { + "android": [ + 81 + ], + "usb": 458843, + "linux": 81, + "xkb": 89, + "windows": 81, + "macos": 85, + "ios": 91 + }, + "keyCodes": { + "glfw": [ + 323 + ] + } + }, + "Numpad4": { + "names": { + "name": "Numpad4", + "chromium": "Numpad4" + }, + "scanCodes": { + "android": [ + 75 + ], + "usb": 458844, + "linux": 75, + "xkb": 83, + "windows": 75, + "macos": 86, + "ios": 92 + }, + "keyCodes": { + "glfw": [ + 324 + ] + } + }, + "Numpad5": { + "names": { + "name": "Numpad5", + "chromium": "Numpad5" + }, + "scanCodes": { + "android": [ + 76 + ], + "usb": 458845, + "linux": 76, + "xkb": 84, + "windows": 76, + "macos": 87, + "ios": 93 + }, + "keyCodes": { + "glfw": [ + 325 + ] + } + }, + "Numpad6": { + "names": { + "name": "Numpad6", + "chromium": "Numpad6" + }, + "scanCodes": { + "android": [ + 77 + ], + "usb": 458846, + "linux": 77, + "xkb": 85, + "windows": 77, + "macos": 88, + "ios": 94 + }, + "keyCodes": { + "glfw": [ + 326 + ] + } + }, + "Numpad7": { + "names": { + "name": "Numpad7", + "chromium": "Numpad7" + }, + "scanCodes": { + "android": [ + 71 + ], + "usb": 458847, + "linux": 71, + "xkb": 79, + "windows": 71, + "macos": 89, + "ios": 95 + }, + "keyCodes": { + "glfw": [ + 327 + ] + } + }, + "Numpad8": { + "names": { + "name": "Numpad8", + "chromium": "Numpad8" + }, + "scanCodes": { + "android": [ + 72 + ], + "usb": 458848, + "linux": 72, + "xkb": 80, + "windows": 72, + "macos": 91, + "ios": 96 + }, + "keyCodes": { + "glfw": [ + 328 + ] + } + }, + "Numpad9": { + "names": { + "name": "Numpad9", + "chromium": "Numpad9" + }, + "scanCodes": { + "android": [ + 73 + ], + "usb": 458849, + "linux": 73, + "xkb": 81, + "windows": 73, + "macos": 92, + "ios": 97 + }, + "keyCodes": { + "glfw": [ + 329 + ] + } + }, + "Numpad0": { + "names": { + "name": "Numpad0", + "chromium": "Numpad0" + }, + "scanCodes": { + "android": [ + 82 + ], + "usb": 458850, + "linux": 82, + "xkb": 90, + "windows": 82, + "macos": 82, + "ios": 98 + }, + "keyCodes": { + "glfw": [ + 320 + ] + } + }, + "NumpadDecimal": { + "names": { + "name": "NumpadDecimal", + "chromium": "NumpadDecimal" + }, + "scanCodes": { + "android": [ + 83 + ], + "usb": 458851, + "linux": 83, + "xkb": 91, + "windows": 83, + "macos": 65, + "ios": 99 + }, + "keyCodes": { + "glfw": [ + 330 + ] + } + }, + "IntlBackslash": { + "names": { + "name": "IntlBackslash", + "chromium": "IntlBackslash" + }, + "scanCodes": { + "usb": 458852, + "linux": 86, + "xkb": 94, + "windows": 86, + "macos": 10, + "ios": 100 + } + }, + "ContextMenu": { + "names": { + "name": "ContextMenu", + "chromium": "ContextMenu" + }, + "scanCodes": { + "android": [ + 127, + 139 + ], + "usb": 458853, + "linux": 127, + "xkb": 135, + "windows": 57437, + "macos": 110, + "ios": 101 + }, + "keyCodes": { + "glfw": [ + 348 + ] + } + }, + "Power": { + "names": { + "name": "Power", + "chromium": "Power" + }, + "scanCodes": { + "android": [ + 116, + 152 + ], + "usb": 458854, + "linux": 116, + "xkb": 124, + "windows": 57438, + "ios": 102 + } + }, + "NumpadEqual": { + "names": { + "name": "NumpadEqual", + "chromium": "NumpadEqual" + }, + "scanCodes": { + "android": [ + 117 + ], + "usb": 458855, + "linux": 117, + "xkb": 125, + "windows": 89, + "macos": 81, + "ios": 103 + }, + "keyCodes": { + "glfw": [ + 336 + ] + } + }, + "F13": { + "names": { + "name": "F13", + "chromium": "F13" + }, + "scanCodes": { + "android": [ + 183 + ], + "usb": 458856, + "linux": 183, + "xkb": 191, + "windows": 100, + "macos": 105, + "ios": 104 + }, + "keyCodes": { + "glfw": [ + 302 + ] + } + }, + "F14": { + "names": { + "name": "F14", + "chromium": "F14" + }, + "scanCodes": { + "android": [ + 184 + ], + "usb": 458857, + "linux": 184, + "xkb": 192, + "windows": 101, + "macos": 107, + "ios": 105 + }, + "keyCodes": { + "glfw": [ + 303 + ] + } + }, + "F15": { + "names": { + "name": "F15", + "chromium": "F15" + }, + "scanCodes": { + "android": [ + 185 + ], + "usb": 458858, + "linux": 185, + "xkb": 193, + "windows": 102, + "macos": 113, + "ios": 106 + }, + "keyCodes": { + "glfw": [ + 304 + ] + } + }, + "F16": { + "names": { + "name": "F16", + "chromium": "F16" + }, + "scanCodes": { + "android": [ + 186 + ], + "usb": 458859, + "linux": 186, + "xkb": 194, + "windows": 103, + "macos": 106, + "ios": 107 + }, + "keyCodes": { + "glfw": [ + 305 + ] + } + }, + "F17": { + "names": { + "name": "F17", + "chromium": "F17" + }, + "scanCodes": { + "android": [ + 187 + ], + "usb": 458860, + "linux": 187, + "xkb": 195, + "windows": 104, + "macos": 64, + "ios": 108 + }, + "keyCodes": { + "glfw": [ + 306 + ] + } + }, + "F18": { + "names": { + "name": "F18", + "chromium": "F18" + }, + "scanCodes": { + "android": [ + 188 + ], + "usb": 458861, + "linux": 188, + "xkb": 196, + "windows": 105, + "macos": 79, + "ios": 109 + }, + "keyCodes": { + "glfw": [ + 307 + ] + } + }, + "F19": { + "names": { + "name": "F19", + "chromium": "F19" + }, + "scanCodes": { + "android": [ + 189 + ], + "usb": 458862, + "linux": 189, + "xkb": 197, + "windows": 106, + "macos": 80, + "ios": 110 + }, + "keyCodes": { + "glfw": [ + 308 + ] + } + }, + "F20": { + "names": { + "name": "F20", + "chromium": "F20" + }, + "scanCodes": { + "android": [ + 190 + ], + "usb": 458863, + "linux": 190, + "xkb": 198, + "windows": 107, + "macos": 90, + "ios": 111 + }, + "keyCodes": { + "glfw": [ + 309 + ] + } + }, + "F21": { + "names": { + "name": "F21", + "chromium": "F21" + }, + "scanCodes": { + "android": [ + 191 + ], + "usb": 458864, + "linux": 191, + "xkb": 199, + "windows": 108, + "ios": 112 + }, + "keyCodes": { + "glfw": [ + 310 + ] + } + }, + "F22": { + "names": { + "name": "F22", + "chromium": "F22" + }, + "scanCodes": { + "android": [ + 192 + ], + "usb": 458865, + "linux": 192, + "xkb": 200, + "windows": 109, + "ios": 113 + }, + "keyCodes": { + "glfw": [ + 311 + ] + } + }, + "F23": { + "names": { + "name": "F23", + "chromium": "F23" + }, + "scanCodes": { + "android": [ + 193 + ], + "usb": 458866, + "linux": 193, + "xkb": 201, + "windows": 110, + "ios": 114 + }, + "keyCodes": { + "glfw": [ + 312 + ] + } + }, + "F24": { + "names": { + "name": "F24", + "chromium": "F24" + }, + "scanCodes": { + "android": [ + 194 + ], + "usb": 458867, + "linux": 194, + "xkb": 202, + "windows": 118, + "ios": 115 + } + }, + "Open": { + "names": { + "name": "Open", + "chromium": "Open" + }, + "scanCodes": { + "android": [ + 134 + ], + "usb": 458868, + "linux": 134, + "xkb": 142, + "ios": 116 + } + }, + "Help": { + "names": { + "name": "Help", + "chromium": "Help" + }, + "scanCodes": { + "android": [ + 138 + ], + "usb": 458869, + "linux": 138, + "xkb": 146, + "windows": 57403, + "ios": 117 + } + }, + "Select": { + "names": { + "name": "Select", + "chromium": "Select" + }, + "scanCodes": { + "android": [ + 353 + ], + "usb": 458871, + "linux": 132, + "xkb": 140, + "ios": 119 + } + }, + "Again": { + "names": { + "name": "Again", + "chromium": "Again" + }, + "scanCodes": { + "android": [ + 129 + ], + "usb": 458873, + "linux": 129, + "xkb": 137, + "ios": 121 + } + }, + "Undo": { + "names": { + "name": "Undo", + "chromium": "Undo" + }, + "scanCodes": { + "android": [ + 131 + ], + "usb": 458874, + "linux": 131, + "xkb": 139, + "windows": 57352, + "ios": 122 + } + }, + "Cut": { + "names": { + "name": "Cut", + "chromium": "Cut" + }, + "scanCodes": { + "android": [ + 137 + ], + "usb": 458875, + "linux": 137, + "xkb": 145, + "windows": 57367, + "ios": 123 + } + }, + "Copy": { + "names": { + "name": "Copy", + "chromium": "Copy" + }, + "scanCodes": { + "android": [ + 133 + ], + "usb": 458876, + "linux": 133, + "xkb": 141, + "windows": 57368, + "ios": 124 + } + }, + "Paste": { + "names": { + "name": "Paste", + "chromium": "Paste" + }, + "scanCodes": { + "android": [ + 135 + ], + "usb": 458877, + "linux": 135, + "xkb": 143, + "windows": 57354, + "ios": 125 + } + }, + "Find": { + "names": { + "name": "Find", + "chromium": "Find" + }, + "scanCodes": { + "android": [ + 136 + ], + "usb": 458878, + "linux": 136, + "xkb": 144, + "ios": 126 + } + }, + "AudioVolumeMute": { + "names": { + "name": "AudioVolumeMute", + "chromium": "AudioVolumeMute" + }, + "scanCodes": { + "android": [ + 113 + ], + "usb": 458879, + "linux": 113, + "xkb": 121, + "windows": 57376, + "macos": 74, + "ios": 127 + } + }, + "AudioVolumeUp": { + "names": { + "name": "AudioVolumeUp", + "chromium": "AudioVolumeUp" + }, + "scanCodes": { + "android": [ + 115 + ], + "usb": 458880, + "linux": 115, + "xkb": 123, + "windows": 57392, + "macos": 72, + "ios": 128 + } + }, + "AudioVolumeDown": { + "names": { + "name": "AudioVolumeDown", + "chromium": "AudioVolumeDown" + }, + "scanCodes": { + "android": [ + 114 + ], + "usb": 458881, + "linux": 114, + "xkb": 122, + "windows": 57390, + "macos": 73, + "ios": 129 + } + }, + "NumpadComma": { + "names": { + "name": "NumpadComma", + "chromium": "NumpadComma" + }, + "scanCodes": { + "android": [ + 95, + 121 + ], + "usb": 458885, + "linux": 121, + "xkb": 129, + "windows": 126, + "macos": 95, + "ios": 133 + } + }, + "IntlRo": { + "names": { + "name": "IntlRo", + "chromium": "IntlRo" + }, + "scanCodes": { + "android": [ + 89 + ], + "usb": 458887, + "linux": 89, + "xkb": 97, + "windows": 115, + "macos": 94, + "ios": 135 + } + }, + "KanaMode": { + "names": { + "name": "KanaMode", + "chromium": "KanaMode" + }, + "scanCodes": { + "usb": 458888, + "linux": 93, + "xkb": 101, + "windows": 112, + "ios": 136 + } + }, + "IntlYen": { + "names": { + "name": "IntlYen", + "chromium": "IntlYen" + }, + "scanCodes": { + "android": [ + 124 + ], + "usb": 458889, + "linux": 124, + "xkb": 132, + "windows": 125, + "macos": 93, + "ios": 137 + } + }, + "Convert": { + "names": { + "name": "Convert", + "chromium": "Convert" + }, + "scanCodes": { + "android": [ + 92 + ], + "usb": 458890, + "linux": 92, + "xkb": 100, + "windows": 121, + "ios": 138 + } + }, + "NonConvert": { + "names": { + "name": "NonConvert", + "chromium": "NonConvert" + }, + "scanCodes": { + "android": [ + 94 + ], + "usb": 458891, + "linux": 94, + "xkb": 102, + "windows": 123, + "ios": 139 + } + }, + "Lang1": { + "names": { + "name": "Lang1", + "chromium": "Lang1" + }, + "scanCodes": { + "usb": 458896, + "linux": 122, + "xkb": 130, + "windows": 114, + "macos": 104, + "ios": 144 + } + }, + "Lang2": { + "names": { + "name": "Lang2", + "chromium": "Lang2" + }, + "scanCodes": { + "usb": 458897, + "linux": 123, + "xkb": 131, + "windows": 113, + "macos": 102, + "ios": 145 + } + }, + "Lang3": { + "names": { + "name": "Lang3", + "chromium": "Lang3" + }, + "scanCodes": { + "android": [ + 90 + ], + "usb": 458898, + "linux": 90, + "xkb": 98, + "windows": 120, + "ios": 146 + } + }, + "Lang4": { + "names": { + "name": "Lang4", + "chromium": "Lang4" + }, + "scanCodes": { + "android": [ + 91 + ], + "usb": 458899, + "linux": 91, + "xkb": 99, + "windows": 119, + "ios": 147 + } + }, + "Lang5": { + "names": { + "name": "Lang5", + "chromium": "Lang5" + }, + "scanCodes": { + "usb": 458900, + "linux": 85, + "xkb": 93, + "ios": 148 + } + }, + "Abort": { + "names": { + "name": "Abort", + "chromium": "Abort" + }, + "scanCodes": { + "usb": 458907, + "ios": 155 + } + }, + "Props": { + "names": { + "name": "Props", + "chromium": "Props" + }, + "scanCodes": { + "android": [ + 130 + ], + "usb": 458915, + "ios": 163 + } + }, + "NumpadParenLeft": { + "names": { + "name": "NumpadParenLeft", + "chromium": "NumpadParenLeft" + }, + "scanCodes": { + "android": [ + 179 + ], + "usb": 458934, + "linux": 179, + "xkb": 187, + "ios": 182 + } + }, + "NumpadParenRight": { + "names": { + "name": "NumpadParenRight", + "chromium": "NumpadParenRight" + }, + "scanCodes": { + "android": [ + 180 + ], + "usb": 458935, + "linux": 180, + "xkb": 188, + "ios": 183 + } + }, + "NumpadBackspace": { + "names": { + "name": "NumpadBackspace", + "chromium": "NumpadBackspace" + }, + "scanCodes": { + "usb": 458939, + "ios": 187 + } + }, + "NumpadMemoryStore": { + "names": { + "name": "NumpadMemoryStore", + "chromium": "NumpadMemoryStore" + }, + "scanCodes": { + "usb": 458960, + "ios": 208 + } + }, + "NumpadMemoryRecall": { + "names": { + "name": "NumpadMemoryRecall", + "chromium": "NumpadMemoryRecall" + }, + "scanCodes": { + "usb": 458961, + "ios": 209 + } + }, + "NumpadMemoryClear": { + "names": { + "name": "NumpadMemoryClear", + "chromium": "NumpadMemoryClear" + }, + "scanCodes": { + "usb": 458962, + "ios": 210 + } + }, + "NumpadMemoryAdd": { + "names": { + "name": "NumpadMemoryAdd", + "chromium": "NumpadMemoryAdd" + }, + "scanCodes": { + "usb": 458963, + "ios": 211 + } + }, + "NumpadMemorySubtract": { + "names": { + "name": "NumpadMemorySubtract", + "chromium": "NumpadMemorySubtract" + }, + "scanCodes": { + "usb": 458964, + "ios": 212 + } + }, + "NumpadSignChange": { + "names": { + "name": "NumpadSignChange" + }, + "scanCodes": { + "usb": 458967, + "linux": 118, + "xkb": 126, + "ios": 215 + } + }, + "NumpadClear": { + "names": { + "name": "NumpadClear", + "chromium": "NumpadClear" + }, + "scanCodes": { + "usb": 458968, + "ios": 216 + } + }, + "NumpadClearEntry": { + "names": { + "name": "NumpadClearEntry", + "chromium": "NumpadClearEntry" + }, + "scanCodes": { + "usb": 458969, + "ios": 217 + } + }, + "ControlLeft": { + "names": { + "name": "ControlLeft", + "chromium": "ControlLeft" + }, + "scanCodes": { + "android": [ + 29 + ], + "usb": 458976, + "linux": 29, + "xkb": 37, + "windows": 29, + "macos": 59, + "ios": 224 + }, + "keyCodes": { + "glfw": [ + 341 + ] + } + }, + "ShiftLeft": { + "names": { + "name": "ShiftLeft", + "chromium": "ShiftLeft" + }, + "scanCodes": { + "android": [ + 42 + ], + "usb": 458977, + "linux": 42, + "xkb": 50, + "windows": 42, + "macos": 56, + "ios": 225 + }, + "keyCodes": { + "glfw": [ + 340 + ] + } + }, + "AltLeft": { + "names": { + "name": "AltLeft", + "chromium": "AltLeft" + }, + "scanCodes": { + "android": [ + 56 + ], + "usb": 458978, + "linux": 56, + "xkb": 64, + "windows": 56, + "macos": 58, + "ios": 226 + }, + "keyCodes": { + "glfw": [ + 342 + ] + } + }, + "MetaLeft": { + "names": { + "name": "MetaLeft", + "chromium": "MetaLeft" + }, + "scanCodes": { + "android": [ + 125 + ], + "usb": 458979, + "linux": 125, + "xkb": 133, + "windows": 57435, + "macos": 55, + "ios": 227 + }, + "keyCodes": { + "glfw": [ + 343 + ] + } + }, + "ControlRight": { + "names": { + "name": "ControlRight", + "chromium": "ControlRight" + }, + "scanCodes": { + "android": [ + 97 + ], + "usb": 458980, + "linux": 97, + "xkb": 105, + "windows": 57373, + "macos": 62, + "ios": 228 + }, + "keyCodes": { + "glfw": [ + 345 + ] + } + }, + "ShiftRight": { + "names": { + "name": "ShiftRight", + "chromium": "ShiftRight" + }, + "scanCodes": { + "android": [ + 54 + ], + "usb": 458981, + "linux": 54, + "xkb": 62, + "windows": 54, + "macos": 60, + "ios": 229 + }, + "keyCodes": { + "glfw": [ + 344 + ] + } + }, + "AltRight": { + "names": { + "name": "AltRight", + "chromium": "AltRight" + }, + "scanCodes": { + "android": [ + 100 + ], + "usb": 458982, + "linux": 100, + "xkb": 108, + "windows": 57400, + "macos": 61, + "ios": 230 + }, + "keyCodes": { + "glfw": [ + 346 + ] + } + }, + "MetaRight": { + "names": { + "name": "MetaRight", + "chromium": "MetaRight" + }, + "scanCodes": { + "android": [ + 126 + ], + "usb": 458983, + "linux": 126, + "xkb": 134, + "windows": 57436, + "macos": 54, + "ios": 231 + }, + "keyCodes": { + "glfw": [ + 347 + ] + } + }, + "Info": { + "names": { + "name": "Info" + }, + "scanCodes": { + "android": [ + 358 + ], + "usb": 786528, + "linux": 358, + "xkb": 366 + } + }, + "ClosedCaptionToggle": { + "names": { + "name": "ClosedCaptionToggle" + }, + "scanCodes": { + "android": [ + 370 + ], + "usb": 786529, + "linux": 370, + "xkb": 378 + } + }, + "BrightnessUp": { + "names": { + "name": "BrightnessUp", + "chromium": "BrightnessUp" + }, + "scanCodes": { + "android": [ + 225 + ], + "usb": 786543, + "linux": 225, + "xkb": 233 + } + }, + "BrightnessDown": { + "names": { + "name": "BrightnessDown", + "chromium": "BrightnessDown" + }, + "scanCodes": { + "android": [ + 224 + ], + "usb": 786544, + "linux": 224, + "xkb": 232 + } + }, + "BrightnessToggle": { + "names": { + "name": "BrightnessToggle" + }, + "scanCodes": { + "usb": 786546, + "linux": 431, + "xkb": 439 + } + }, + "BrightnessMinimum": { + "names": { + "name": "BrightnessMinimum" + }, + "scanCodes": { + "usb": 786547, + "linux": 592, + "xkb": 600 + } + }, + "BrightnessMaximum": { + "names": { + "name": "BrightnessMaximum" + }, + "scanCodes": { + "usb": 786548, + "linux": 593, + "xkb": 601 + } + }, + "BrightnessAuto": { + "names": { + "name": "BrightnessAuto" + }, + "scanCodes": { + "usb": 786549, + "linux": 244, + "xkb": 252 + } + }, + "KbdIllumUp": { + "names": { + "name": "KbdIllumUp" + }, + "scanCodes": { + "usb": 786553, + "linux": 230, + "xkb": 238 + } + }, + "KbdIllumDown": { + "names": { + "name": "KbdIllumDown" + }, + "scanCodes": { + "usb": 786554, + "linux": 229, + "xkb": 237 + } + }, + "MediaLast": { + "names": { + "name": "MediaLast" + }, + "scanCodes": { + "android": [ + 405 + ], + "usb": 786563, + "linux": 405, + "xkb": 413 + } + }, + "LaunchPhone": { + "names": { + "name": "LaunchPhone" + }, + "scanCodes": { + "usb": 786572, + "linux": 169, + "xkb": 177 + } + }, + "ProgramGuide": { + "names": { + "name": "ProgramGuide" + }, + "scanCodes": { + "usb": 786573, + "linux": 362, + "xkb": 370 + } + }, + "Exit": { + "names": { + "name": "Exit" + }, + "scanCodes": { + "android": [ + 174 + ], + "usb": 786580, + "linux": 174, + "xkb": 182 + } + }, + "ChannelUp": { + "names": { + "name": "ChannelUp" + }, + "scanCodes": { + "android": [ + 402 + ], + "usb": 786588, + "linux": 410, + "xkb": 418 + } + }, + "ChannelDown": { + "names": { + "name": "ChannelDown" + }, + "scanCodes": { + "android": [ + 403 + ], + "usb": 786589, + "linux": 411, + "xkb": 419 + } + }, + "MediaPlay": { + "names": { + "name": "MediaPlay", + "chromium": "MediaPlay" + }, + "scanCodes": { + "android": [ + 200, + 207 + ], + "usb": 786608, + "linux": 207, + "xkb": 215 + } + }, + "MediaPause": { + "names": { + "name": "MediaPause", + "chromium": "MediaPause" + }, + "scanCodes": { + "android": [ + 201 + ], + "usb": 786609, + "linux": 201, + "xkb": 209 + } + }, + "MediaRecord": { + "names": { + "name": "MediaRecord", + "chromium": "MediaRecord" + }, + "scanCodes": { + "android": [ + 167 + ], + "usb": 786610, + "linux": 167, + "xkb": 175 + } + }, + "MediaFastForward": { + "names": { + "name": "MediaFastForward", + "chromium": "MediaFastForward" + }, + "scanCodes": { + "android": [ + 208 + ], + "usb": 786611, + "linux": 208, + "xkb": 216 + } + }, + "MediaRewind": { + "names": { + "name": "MediaRewind", + "chromium": "MediaRewind" + }, + "scanCodes": { + "android": [ + 168 + ], + "usb": 786612, + "linux": 168, + "xkb": 176 + } + }, + "MediaTrackNext": { + "names": { + "name": "MediaTrackNext", + "chromium": "MediaTrackNext" + }, + "scanCodes": { + "android": [ + 163 + ], + "usb": 786613, + "linux": 163, + "xkb": 171, + "windows": 57369 + } + }, + "MediaTrackPrevious": { + "names": { + "name": "MediaTrackPrevious", + "chromium": "MediaTrackPrevious" + }, + "scanCodes": { + "android": [ + 165 + ], + "usb": 786614, + "linux": 165, + "xkb": 173, + "windows": 57360 + } + }, + "MediaStop": { + "names": { + "name": "MediaStop", + "chromium": "MediaStop" + }, + "scanCodes": { + "android": [ + 128, + 166 + ], + "usb": 786615, + "linux": 166, + "xkb": 174, + "windows": 57380 + } + }, + "Eject": { + "names": { + "name": "Eject", + "chromium": "Eject" + }, + "scanCodes": { + "android": [ + 161, + 162 + ], + "usb": 786616, + "linux": 161, + "xkb": 169, + "windows": 57388 + } + }, + "MediaPlayPause": { + "names": { + "name": "MediaPlayPause", + "chromium": "MediaPlayPause" + }, + "scanCodes": { + "android": [ + 164 + ], + "usb": 786637, + "linux": 164, + "xkb": 172, + "windows": 57378 + } + }, + "SpeechInputToggle": { + "names": { + "name": "SpeechInputToggle" + }, + "scanCodes": { + "usb": 786639, + "linux": 582, + "xkb": 590 + } + }, + "BassBoost": { + "names": { + "name": "BassBoost" + }, + "scanCodes": { + "android": [ + 209 + ], + "usb": 786661, + "linux": 209, + "xkb": 217 + } + }, + "MediaSelect": { + "names": { + "name": "MediaSelect", + "chromium": "MediaSelect" + }, + "scanCodes": { + "usb": 786819, + "linux": 171, + "xkb": 179, + "windows": 57453 + } + }, + "LaunchWordProcessor": { + "names": { + "name": "LaunchWordProcessor" + }, + "scanCodes": { + "usb": 786820, + "linux": 421, + "xkb": 429 + } + }, + "LaunchSpreadsheet": { + "names": { + "name": "LaunchSpreadsheet" + }, + "scanCodes": { + "usb": 786822, + "linux": 423, + "xkb": 431 + } + }, + "LaunchMail": { + "names": { + "name": "LaunchMail", + "chromium": "LaunchMail" + }, + "scanCodes": { + "android": [ + 155, + 215 + ], + "usb": 786826, + "linux": 155, + "xkb": 163, + "windows": 57452 + } + }, + "LaunchContacts": { + "names": { + "name": "LaunchContacts" + }, + "scanCodes": { + "android": [ + 429 + ], + "usb": 786829, + "linux": 429, + "xkb": 437 + } + }, + "LaunchCalendar": { + "names": { + "name": "LaunchCalendar" + }, + "scanCodes": { + "android": [ + 397 + ], + "usb": 786830, + "linux": 397, + "xkb": 405 + } + }, + "LaunchApp2": { + "names": { + "name": "LaunchApp2", + "chromium": "LaunchApp2" + }, + "scanCodes": { + "usb": 786834, + "linux": 140, + "xkb": 148, + "windows": 57377 + } + }, + "LaunchApp1": { + "names": { + "name": "LaunchApp1", + "chromium": "LaunchApp1" + }, + "scanCodes": { + "usb": 786836, + "linux": 144, + "xkb": 152, + "windows": 57451 + } + }, + "LaunchInternetBrowser": { + "names": { + "name": "LaunchInternetBrowser" + }, + "scanCodes": { + "usb": 786838, + "linux": 150, + "xkb": 158 + } + }, + "LogOff": { + "names": { + "name": "LogOff" + }, + "scanCodes": { + "usb": 786844, + "linux": 433, + "xkb": 441 + } + }, + "LockScreen": { + "names": { + "name": "LockScreen" + }, + "scanCodes": { + "usb": 786846, + "linux": 152, + "xkb": 160 + } + }, + "LaunchControlPanel": { + "names": { + "name": "LaunchControlPanel", + "chromium": "LaunchControlPanel" + }, + "scanCodes": { + "usb": 786847, + "linux": 579, + "xkb": 587 + } + }, + "SelectTask": { + "names": { + "name": "SelectTask", + "chromium": "SelectTask" + }, + "scanCodes": { + "usb": 786850, + "linux": 580, + "xkb": 588 + } + }, + "LaunchDocuments": { + "names": { + "name": "LaunchDocuments" + }, + "scanCodes": { + "usb": 786855, + "linux": 235, + "xkb": 243 + } + }, + "SpellCheck": { + "names": { + "name": "SpellCheck" + }, + "scanCodes": { + "usb": 786859, + "linux": 432, + "xkb": 440 + } + }, + "LaunchKeyboardLayout": { + "names": { + "name": "LaunchKeyboardLayout" + }, + "scanCodes": { + "usb": 786862, + "linux": 374, + "xkb": 382 + } + }, + "LaunchScreenSaver": { + "names": { + "name": "LaunchScreenSaver", + "chromium": "LaunchScreenSaver" + }, + "scanCodes": { + "usb": 786865, + "linux": 581, + "xkb": 589 + } + }, + "LaunchAudioBrowser": { + "names": { + "name": "LaunchAudioBrowser" + }, + "scanCodes": { + "usb": 786871, + "linux": 392, + "xkb": 400 + } + }, + "LaunchAssistant": { + "names": { + "name": "LaunchAssistant", + "chromium": "LaunchAssistant" + }, + "scanCodes": { + "android": [ + 583 + ], + "usb": 786891, + "linux": 583, + "xkb": 591 + } + }, + "New": { + "names": { + "name": "New" + }, + "scanCodes": { + "usb": 786945, + "linux": 181, + "xkb": 189 + } + }, + "Close": { + "names": { + "name": "Close" + }, + "scanCodes": { + "android": [ + 160, + 206 + ], + "usb": 786947, + "linux": 206, + "xkb": 214 + } + }, + "Save": { + "names": { + "name": "Save" + }, + "scanCodes": { + "usb": 786951, + "linux": 234, + "xkb": 242 + } + }, + "Print": { + "names": { + "name": "Print" + }, + "scanCodes": { + "android": [ + 210 + ], + "usb": 786952, + "linux": 210, + "xkb": 218 + } + }, + "BrowserSearch": { + "names": { + "name": "BrowserSearch", + "chromium": "BrowserSearch" + }, + "scanCodes": { + "android": [ + 217 + ], + "usb": 786977, + "linux": 217, + "xkb": 225, + "windows": 57445 + } + }, + "BrowserHome": { + "names": { + "name": "BrowserHome", + "chromium": "BrowserHome" + }, + "scanCodes": { + "usb": 786979, + "linux": 172, + "xkb": 180, + "windows": 57394 + } + }, + "BrowserBack": { + "names": { + "name": "BrowserBack", + "chromium": "BrowserBack" + }, + "scanCodes": { + "usb": 786980, + "linux": 158, + "xkb": 166, + "windows": 57450 + } + }, + "BrowserForward": { + "names": { + "name": "BrowserForward", + "chromium": "BrowserForward" + }, + "scanCodes": { + "android": [ + 159 + ], + "usb": 786981, + "linux": 159, + "xkb": 167, + "windows": 57449 + } + }, + "BrowserStop": { + "names": { + "name": "BrowserStop", + "chromium": "BrowserStop" + }, + "scanCodes": { + "usb": 786982, + "linux": 128, + "xkb": 136, + "windows": 57448 + } + }, + "BrowserRefresh": { + "names": { + "name": "BrowserRefresh", + "chromium": "BrowserRefresh" + }, + "scanCodes": { + "usb": 786983, + "linux": 173, + "xkb": 181, + "windows": 57447 + } + }, + "BrowserFavorites": { + "names": { + "name": "BrowserFavorites", + "chromium": "BrowserFavorites" + }, + "scanCodes": { + "android": [ + 156 + ], + "usb": 786986, + "linux": 156, + "xkb": 164, + "windows": 57446 + } + }, + "ZoomIn": { + "names": { + "name": "ZoomIn" + }, + "scanCodes": { + "usb": 786989, + "linux": 418, + "xkb": 426 + } + }, + "ZoomOut": { + "names": { + "name": "ZoomOut" + }, + "scanCodes": { + "usb": 786990, + "linux": 419, + "xkb": 427 + } + }, + "ZoomToggle": { + "names": { + "name": "ZoomToggle", + "chromium": "ZoomToggle" + }, + "scanCodes": { + "usb": 786994, + "linux": 372, + "xkb": 380 + } + }, + "Redo": { + "names": { + "name": "Redo" + }, + "scanCodes": { + "android": [ + 182 + ], + "usb": 787065, + "linux": 182, + "xkb": 190 + } + }, + "MailReply": { + "names": { + "name": "MailReply", + "chromium": "MailReply" + }, + "scanCodes": { + "usb": 787081, + "linux": 232, + "xkb": 240 + } + }, + "MailForward": { + "names": { + "name": "MailForward", + "chromium": "MailForward" + }, + "scanCodes": { + "usb": 787083, + "linux": 233, + "xkb": 241 + } + }, + "MailSend": { + "names": { + "name": "MailSend", + "chromium": "MailSend" + }, + "scanCodes": { + "usb": 787084, + "linux": 231, + "xkb": 239 + } + }, + "KeyboardLayoutSelect": { + "names": { + "name": "KeyboardLayoutSelect", + "chromium": "KeyboardLayoutSelect" + }, + "scanCodes": { + "usb": 787101, + "linux": 584, + "xkb": 592 + } + }, + "ShowAllWindows": { + "names": { + "name": "ShowAllWindows", + "chromium": "ShowAllWindows" + }, + "scanCodes": { + "usb": 787103, + "linux": 120, + "xkb": 128 + } + } +} diff --git a/dev/tools/gen_keycodes/data/printable.json b/dev/tools/gen_keycodes/data/printable.json index ccf667f605..98eba3e020 100644 --- a/dev/tools/gen_keycodes/data/printable.json +++ b/dev/tools/gen_keycodes/data/printable.json @@ -1,69 +1,69 @@ { - "backquote": "`", - "backslash": "\\", - "bracketLeft": "[", - "bracketRight": "]", - "comma": ",", - "digit0": "0", - "digit1": "1", - "digit2": "2", - "digit3": "3", - "digit4": "4", - "digit5": "5", - "digit6": "6", - "digit7": "7", - "digit8": "8", - "digit9": "9", - "equal": "=", - "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", - "minus": "-", - "numpad0": "0", - "numpad1": "1", - "numpad2": "2", - "numpad3": "3", - "numpad4": "4", - "numpad5": "5", - "numpad6": "6", - "numpad7": "7", - "numpad8": "8", - "numpad9": "9", - "numpadAdd": "+", - "numpadComma": ",", - "numpadDecimal": ".", - "numpadDivide": "/", - "numpadEqual": "=", - "numpadMultiply": "*", - "numpadParenLeft": "(", - "numpadParenRight": ")", - "numpadSubtract": "-", - "period": ".", - "quote": "'", - "semicolon": ";", - "slash": "/", - "space": " " + "Backquote": "`", + "Backslash": "\\", + "BracketLeft": "[", + "BracketRight": "]", + "Comma": ",", + "Digit0": "0", + "Digit1": "1", + "Digit2": "2", + "Digit3": "3", + "Digit4": "4", + "Digit5": "5", + "Digit6": "6", + "Digit7": "7", + "Digit8": "8", + "Digit9": "9", + "Equal": "=", + "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", + "Minus": "-", + "Numpad0": "0", + "Numpad1": "1", + "Numpad2": "2", + "Numpad3": "3", + "Numpad4": "4", + "Numpad5": "5", + "Numpad6": "6", + "Numpad7": "7", + "Numpad8": "8", + "Numpad9": "9", + "NumpadAdd": "+", + "NumpadComma": ",", + "NumpadDecimal": ".", + "NumpadDivide": "/", + "NumpadEqual": "=", + "NumpadMultiply": "*", + "NumpadParenLeft": "(", + "NumpadParenRight": ")", + "NumpadSubtract": "-", + "Period": ".", + "Quote": "'", + "Semicolon": ";", + "Slash": "/", + "Space": " " } diff --git a/dev/tools/gen_keycodes/data/printable_to_numpads.json b/dev/tools/gen_keycodes/data/printable_to_numpads.json new file mode 100644 index 0000000000..8b65e4d9ad --- /dev/null +++ b/dev/tools/gen_keycodes/data/printable_to_numpads.json @@ -0,0 +1,22 @@ +{ + "0": "Numpad0", + "1": "Numpad1", + "2": "Numpad2", + "3": "Numpad3", + "4": "Numpad4", + "5": "Numpad5", + "6": "Numpad6", + "7": "Numpad7", + "8": "Numpad8", + "9": "Numpad9", + ".": "NumpadDecimal", + "+": "NumpadAdd", + "-": "NumpadSubtract", + "*": "NumpadMultiply", + "/": "NumpadDivide", + "=": "NumpadEqual", + ",": "NumpadComma", + "(": "NumpadParenLeft", + ")": "NumpadParenRight", + "\u000D": "NumpadEnter" +} diff --git a/dev/tools/gen_keycodes/data/supplemental_hid_codes.inc b/dev/tools/gen_keycodes/data/supplemental_hid_codes.inc index 2d4ea5f9af..8917dcbce2 100644 --- a/dev/tools/gen_keycodes/data/supplemental_hid_codes.inc +++ b/dev/tools/gen_keycodes/data/supplemental_hid_codes.inc @@ -1,5 +1,11 @@ - // These are supplemental key codes to be added to those that Chromium - // defines. Since the web doesn't have game controller buttons defined in the + // These are supplemental code data to be added to those that Chromium + // defines. + + // ============================================================ + // Game controller buttons + // ============================================================ + + // Since the web doesn't have game controller buttons defined in the // same way, these map USB HID codes for game controller buttons to // Android/Linux button names. // @@ -44,6 +50,10 @@ DOM_CODE(0x05ff1e, 0x0000, 0x0000, 0x0000, 0xffff, "GameButtonY", BUTTON_Y), DOM_CODE(0x05ff1f, 0x0000, 0x0000, 0x0000, 0xffff, "GameButtonZ", BUTTON_Z), + // ============================================================ + // Fn key for Mac + // ============================================================ + // The Mac defines a key code for the Fn key on Mac keyboards, but it's not // defined on other platforms. Chromium does define an "Fn" row, but doesn't // give it a Mac keycode. This overrides their definition. diff --git a/dev/tools/gen_keycodes/data/supplemental_key_data.inc b/dev/tools/gen_keycodes/data/supplemental_key_data.inc new file mode 100644 index 0000000000..a04c0c3add --- /dev/null +++ b/dev/tools/gen_keycodes/data/supplemental_key_data.inc @@ -0,0 +1,138 @@ + // These are supplemental key data to be added to those that Chromium + // defines. + + // ============================================================ + // Printable keys + // ============================================================ + + // Key Enum Unicode code point + DOM_KEY_UNI("Space", SPACE, ' '), + DOM_KEY_UNI("Exclamation", EXCLAMATION, '!'), + DOM_KEY_UNI("NumberSign", NUMBER_SIGN, '#'), + DOM_KEY_UNI("Dollar", DOLLAR, '$'), + DOM_KEY_UNI("Percent", PERCENT, '%'), + DOM_KEY_UNI("Ampersand", AMPERSAND, '&'), + DOM_KEY_UNI("QuoteSingle", QUOTE_SINGLE, 0x0027), + DOM_KEY_UNI("Quote", QUOTE, '"')", + DOM_KEY_UNI("ParenthesisLeft", PARENTHESIS_LEFT, '('), + DOM_KEY_UNI("ParenthesisRight", PARENTHESIS_RIGHT, ')'), + DOM_KEY_UNI("Asterisk", ASTERISK, '*'), + DOM_KEY_UNI("Add", ADD, '+'), + DOM_KEY_UNI("Comma", COMMA, ','), + DOM_KEY_UNI("Minus", MINUS, '-'), + DOM_KEY_UNI("Period", PERIOD, '.'), + DOM_KEY_UNI("Slash", SLASH, '/'), + DOM_KEY_UNI("Digit0", DIGIT0, '0'), + DOM_KEY_UNI("Digit1", DIGIT1, '1'), + DOM_KEY_UNI("Digit2", DIGIT2, '2'), + DOM_KEY_UNI("Digit3", DIGIT3, '3'), + DOM_KEY_UNI("Digit4", DIGIT4, '4'), + DOM_KEY_UNI("Digit5", DIGIT5, '5'), + DOM_KEY_UNI("Digit6", DIGIT6, '6'), + DOM_KEY_UNI("Digit7", DIGIT7, '7'), + DOM_KEY_UNI("Digit8", DIGIT8, '8'), + DOM_KEY_UNI("Digit9", DIGIT9, '9'), + DOM_KEY_UNI("Colon", COLON, ':'), + DOM_KEY_UNI("Semicolon", SEMICOLON, ';'), + DOM_KEY_UNI("Less", LESS, '<'), + DOM_KEY_UNI("Equal", EQUAL, '='), + DOM_KEY_UNI("Greater", GREATER, '>'), + DOM_KEY_UNI("Question", QUESTION, '?'), + DOM_KEY_UNI("At", AT, '@'), + DOM_KEY_UNI("BracketLeft", BRACKET_LEFT, '['), + DOM_KEY_UNI("Backslash", BACKSLASH, 0x005c), + DOM_KEY_UNI("BracketRight", BRACKET_RIGHT, ']'), + DOM_KEY_UNI("Caret", CARET, '^'), + DOM_KEY_UNI("Backquote", BACKQUOTE, '`'), + DOM_KEY_UNI("Underscore", UNDERSCORE, '_'), + DOM_KEY_UNI("KeyA", KEY_A, 'a'), + DOM_KEY_UNI("KeyB", KEY_B, 'b'), + DOM_KEY_UNI("KeyC", KEY_C, 'c'), + DOM_KEY_UNI("KeyD", KEY_D, 'd'), + DOM_KEY_UNI("KeyE", KEY_E, 'e'), + DOM_KEY_UNI("KeyF", KEY_F, 'f'), + DOM_KEY_UNI("KeyG", KEY_G, 'g'), + DOM_KEY_UNI("KeyH", KEY_H, 'h'), + DOM_KEY_UNI("KeyI", KEY_I, 'i'), + DOM_KEY_UNI("KeyJ", KEY_J, 'j'), + DOM_KEY_UNI("KeyK", KEY_K, 'k'), + DOM_KEY_UNI("KeyL", KEY_L, 'l'), + DOM_KEY_UNI("KeyM", KEY_M, 'm'), + DOM_KEY_UNI("KeyN", KEY_N, 'n'), + DOM_KEY_UNI("KeyO", KEY_O, 'o'), + DOM_KEY_UNI("KeyP", KEY_P, 'p'), + DOM_KEY_UNI("KeyQ", KEY_Q, 'q'), + DOM_KEY_UNI("KeyR", KEY_R, 'r'), + DOM_KEY_UNI("KeyS", KEY_S, 's'), + DOM_KEY_UNI("KeyT", KEY_T, 't'), + DOM_KEY_UNI("KeyU", KEY_U, 'u'), + DOM_KEY_UNI("KeyV", KEY_V, 'v'), + DOM_KEY_UNI("KeyW", KEY_W, 'w'), + DOM_KEY_UNI("KeyX", KEY_X, 'x'), + DOM_KEY_UNI("KeyY", KEY_Y, 'y'), + DOM_KEY_UNI("KeyZ", KEY_Z, 'z'), + DOM_KEY_UNI("BraceLeft", BRACE_LEFT, '{'), + DOM_KEY_UNI("BraceRight", BRACE_RIGHT, '}'), + DOM_KEY_UNI("Tilde", TILDE, '~'), + DOM_KEY_UNI("Bar", BAR, '|'), + + + // ============================================================ + // Game controller buttons + // ============================================================ + + // Since the web doesn't have game controller buttons defined in the + // same way, these map USB HID codes for game controller buttons to + // Android/Linux button names. + // Key Enum Value + DOM_KEY_MAP("GameButton1", GAME_BUTTON_1, 0x05ff01), + DOM_KEY_MAP("GameButton2", GAME_BUTTON_2, 0x05ff02), + DOM_KEY_MAP("GameButton3", GAME_BUTTON_3, 0x05ff03), + DOM_KEY_MAP("GameButton4", GAME_BUTTON_4, 0x05ff04), + DOM_KEY_MAP("GameButton5", GAME_BUTTON_5, 0x05ff05), + DOM_KEY_MAP("GameButton6", GAME_BUTTON_6, 0x05ff06), + DOM_KEY_MAP("GameButton7", GAME_BUTTON_7, 0x05ff07), + DOM_KEY_MAP("GameButton8", GAME_BUTTON_8, 0x05ff08), + DOM_KEY_MAP("GameButton9", GAME_BUTTON_9, 0x05ff09), + DOM_KEY_MAP("GameButton10", GAME_BUTTON_10, 0x05ff0a), + DOM_KEY_MAP("GameButton11", GAME_BUTTON_11, 0x05ff0b), + DOM_KEY_MAP("GameButton12", GAME_BUTTON_12, 0x05ff0c), + DOM_KEY_MAP("GameButton13", GAME_BUTTON_13, 0x05ff0d), + DOM_KEY_MAP("GameButton14", GAME_BUTTON_14, 0x05ff0e), + DOM_KEY_MAP("GameButton15", GAME_BUTTON_15, 0x05ff0f), + DOM_KEY_MAP("GameButton16", GAME_BUTTON_16, 0x05ff10), + DOM_KEY_MAP("GameButtonA", GAME_BUTTON_A, 0x05ff11), + DOM_KEY_MAP("GameButtonB", GAME_BUTTON_B, 0x05ff12), + DOM_KEY_MAP("GameButtonC", GAME_BUTTON_C, 0x05ff13), + DOM_KEY_MAP("GameButtonLeft1", GAME_BUTTON_L1, 0x05ff14), + DOM_KEY_MAP("GameButtonLeft2", GAME_BUTTON_L2, 0x05ff15), + DOM_KEY_MAP("GameButtonMode", GAME_BUTTON_MODE, 0x05ff16), + DOM_KEY_MAP("GameButtonRight1", GAME_BUTTON_R1, 0x05ff17), + DOM_KEY_MAP("GameButtonRight2", GAME_BUTTON_R2, 0x05ff18), + DOM_KEY_MAP("GameButtonSelect", GAME_BUTTON_SELECT, 0x05ff19), + DOM_KEY_MAP("GameButtonStart", GAME_BUTTON_START, 0x05ff1a), + DOM_KEY_MAP("GameButtonThumbLeft", GAME_BUTTON_THUMBL, 0x05ff1b), + DOM_KEY_MAP("GameButtonThumbRight", GAME_BUTTON_THUMBR, 0x05ff1c), + DOM_KEY_MAP("GameButtonX", GAME_BUTTON_X, 0x05ff1d), + DOM_KEY_MAP("GameButtonY", GAME_BUTTON_Y, 0x05ff1e), + DOM_KEY_MAP("GameButtonZ", GAME_BUTTON_Z, 0x05ff1f), + + + // ============================================================ + // Other buttons + // ============================================================ + + // Key Enum Value + DOM_KEY_MAP("None", NONE, 0x0), + DOM_KEY_MAP("Suspend", SUSPEND, 0x100000014), + DOM_KEY_MAP("Resume", RESUME, 0x100000015), + DOM_KEY_MAP("Sleep", SLEEP, 0x100010082), + DOM_KEY_MAP("IntlBackslash", INTL_BACKSLASH, 0x100070064), + DOM_KEY_MAP("IntlRo", INTL_RO, 0x100070087), + DOM_KEY_MAP("IntlYen", INTL_YEN, 0x100070089), + DOM_KEY_MAP("Lang1", LANG1, 0x100070090), + DOM_KEY_MAP("Lang2", LANG2, 0x100070091), + DOM_KEY_MAP("Lang3", LANG3, 0x100070092), + DOM_KEY_MAP("Lang4", LANG4, 0x100070093), + DOM_KEY_MAP("Lang5", LANG5, 0x100070094), + DOM_KEY_MAP("Abort", ABORT, 0x10007009b), diff --git a/dev/tools/gen_keycodes/data/synonyms.json b/dev/tools/gen_keycodes/data/synonyms.json index fe6e6bbbbd..173bbbf734 100644 --- a/dev/tools/gen_keycodes/data/synonyms.json +++ b/dev/tools/gen_keycodes/data/synonyms.json @@ -1,6 +1,6 @@ { - "shift": ["ShiftLeft", "ShiftRight"], - "meta": ["MetaLeft", "MetaRight"], - "alt": ["AltLeft", "AltRight"], - "control": ["ControlLeft", "ControlRight"] + "Shift": ["ShiftLeft", "ShiftRight"], + "Meta": ["MetaLeft", "MetaRight"], + "Alt": ["AltLeft", "AltRight"], + "Control": ["ControlLeft", "ControlRight"] } diff --git a/dev/tools/gen_keycodes/data/keyboard_map_web.tmpl b/dev/tools/gen_keycodes/data/web_key_map_dart.tmpl similarity index 63% rename from dev/tools/gen_keycodes/data/keyboard_map_web.tmpl rename to dev/tools/gen_keycodes/data/web_key_map_dart.tmpl index 957f890eb8..9fbea34167 100644 --- a/dev/tools/gen_keycodes/data/keyboard_map_web.tmpl +++ b/dev/tools/gen_keycodes/data/web_key_map_dart.tmpl @@ -6,9 +6,12 @@ // This file is generated by dev/tools/gen_keycodes/bin/gen_keycodes.dart and // should not be edited directly. // -// Edit the template dev/tools/gen_keycodes/data/keyboard_map_web.tmpl instead. +// Edit the template dev/tools/gen_keycodes/data/web_key_map_dart.tmpl instead. // See dev/tools/gen_keycodes/README.md for more information. +// @dart = 2.12 +part of engine; + /// Maps Web KeyboardEvent codes to the matching LogicalKeyboardKey id. const Map kWebToLogicalKey = { @@@WEB_LOGICAL_KEY_CODE_MAP@@@ @@ -19,9 +22,14 @@ const Map kWebToPhysicalKey = { @@@WEB_PHYSICAL_KEY_CODE_MAP@@@ }; -/// A map of Web KeyboardEvent codes which have printable representations, but appear -/// on the number pad. Used to provide different key objects for keys like -/// KEY_EQUALS and NUMPAD_EQUALS. -const Map kWebNumPadMap = { -@@@WEB_NUMPAD_CODE_MAP@@@ +/// Maps Web KeyboardEvent keys to Flutter logical IDs that depend on locations. +/// +/// `KeyboardEvent.location` is defined as: +/// +/// * 0: Standard +/// * 1: Left +/// * 2: Right +/// * 3: Numpad +const Map> kWebLogicalLocationMap = >{ +@@@WEB_LOGICAL_LOCATION_MAP@@@ }; diff --git a/dev/tools/gen_keycodes/data/web_logical_location_mapping.json b/dev/tools/gen_keycodes/data/web_logical_location_mapping.json new file mode 100644 index 0000000000..c5b19daf19 --- /dev/null +++ b/dev/tools/gen_keycodes/data/web_logical_location_mapping.json @@ -0,0 +1,33 @@ +{ + "0": ["Digit0", null, null, "Numpad0"], + "1": ["Digit1", null, null, "Numpad1"], + "2": ["Digit2", null, null, "Numpad2"], + "3": ["Digit3", null, null, "Numpad3"], + "4": ["Digit4", null, null, "Numpad4"], + "5": ["Digit5", null, null, "Numpad5"], + "6": ["Digit6", null, null, "Numpad6"], + "7": ["Digit7", null, null, "Numpad7"], + "8": ["Digit8", null, null, "Numpad8"], + "9": ["Digit9", null, null, "Numpad9"], + ".": ["Period", null, null, "NumpadDecimal"], + "Insert": ["Insert", null, null, "Numpad0"], + "End": ["End", null, null, "Numpad1"], + "ArrowDown": ["ArrowDown", null, null, "Numpad2"], + "PageDown": ["PageDown", null, null, "Numpad3"], + "ArrowLeft": ["ArrowLeft", null, null, "Numpad4"], + "Clear": ["Clear", null, null, "Numpad5"], + "ArrowRight": ["ArrowRight", null, null, "Numpad6"], + "Home": ["Home", null, null, "Numpad7"], + "ArrowUp": ["ArrowUp", null, null, "Numpad8"], + "PageUp": ["PageUp", null, null, "Numpad9"], + "Delete": ["Delete", null, null, "NumpadDecimal"], + "/": ["Slash", null, null, "NumpadDivide"], + "*": ["Asterisk", null, null, "NumpadMultiply"], + "-": ["Minus", null, null, "NumpadSubtract"], + "+": ["Add", null, null, "NumpadAdd"], + "Enter": ["Enter", null, null, "NumpadEnter"], + "Shift": [null, "ShiftLeft", "ShiftRight", null], + "Control": [null, "ControlLeft", "ControlRight", null], + "Alt": [null, "AltLeft", "AltRight", null], + "Meta": [null, "MetaLeft", "MetaRight", null] +} diff --git a/dev/tools/gen_keycodes/data/windows_flutter_key_map_cc.tmpl b/dev/tools/gen_keycodes/data/windows_flutter_key_map_cc.tmpl new file mode 100644 index 0000000000..302fe8f30e --- /dev/null +++ b/dev/tools/gen_keycodes/data/windows_flutter_key_map_cc.tmpl @@ -0,0 +1,39 @@ +// 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. + +#ifndef FLUTTER_SHELL_PLATFORM_WINDOWS_FLUTTER_KEY_MAP_H_ +#define FLUTTER_SHELL_PLATFORM_WINDOWS_FLUTTER_KEY_MAP_H_ + +#include "flutter/shell/platform/windows/keyboard_key_embedder_handler.h" + +#include + +// DO NOT EDIT -- DO NOT EDIT -- DO NOT EDIT +// This file is generated by +// flutter/flutter@dev/tools/gen_keycodes/bin/gen_keycodes.dart and should not +// be edited directly. +// +// Edit the template dev/tools/gen_keycodes/data/windows_flutter_key_map_cc.tmpl +// instead. See dev/tools/gen_keycodes/README.md for more information. + +namespace flutter { + +std::map KeyboardKeyEmbedderHandler::windowsToPhysicalMap_ = + { +@@@WINDOWS_SCAN_CODE_MAP@@@ +}; + +std::map KeyboardKeyEmbedderHandler::windowsToLogicalMap_ = + { +@@@WINDOWS_KEY_CODE_MAP@@@ +}; + +std::map KeyboardKeyEmbedderHandler::scanCodeToLogicalMap_ = + { +@@@WINDOWS_SCAN_CODE_TO_LOGICAL_MAP@@@ +}; + +} // namespace flutter + +#endif diff --git a/dev/tools/gen_keycodes/data/windows_logical_to_window_vk.json b/dev/tools/gen_keycodes/data/windows_logical_to_window_vk.json new file mode 100644 index 0000000000..e8d022450b --- /dev/null +++ b/dev/tools/gen_keycodes/data/windows_logical_to_window_vk.json @@ -0,0 +1,217 @@ +{ + "Cancel": ["CANCEL"], + "Backspace": ["BACK"], + "Tab": ["TAB"], + "Clear": ["CLEAR"], + "Enter": ["RETURN"], + "Menu": ["MENU"], + "Pause": ["PAUSE"], + "CapsLock": ["CAPITAL"], + "Lang1": ["HANGUL", "HANGEUL", "KANA"], + "JunjaMode": ["JUNJA"], + "FinalMode": ["FINAL"], + "HanjaMode": ["HANJA"], + "KanjiMode": ["KANJI"], + "Escape": ["ESCAPE"], + "Convert": ["CONVERT"], + "Nonconvert": ["NONCONVERT"], + "Accept": ["ACCEPT"], + "ModeChange": ["MODECHANGE"], + "Space": ["SPACE"], + "Home": ["HOME"], + "End": ["END"], + "ArrowLeft": ["LEFT"], + "ArrowUp": ["UP"], + "ArrowRight": ["RIGHT"], + "ArrowDown": ["DOWN"], + "Sleep": ["SLEEP"], + "Select": ["SELECT"], + "Print": ["PRINT"], + "Execute": ["EXECUTE"], + "Snapshot": ["SNAPSHOT"], + "Insert": ["INSERT"], + "Delete": ["DELETE"], + "Help": ["HELP"], + "MetaLeft": ["LWIN"], + "MetaRight": ["RWIN"], + "ContextMenu": ["APPS"], + "PageDown": ["NEXT"], + "PageUp": ["PRIOR"], + "Numpad0": ["NUMPAD0"], + "Numpad1": ["NUMPAD1"], + "Numpad2": ["NUMPAD2"], + "Numpad3": ["NUMPAD3"], + "Numpad4": ["NUMPAD4"], + "Numpad5": ["NUMPAD5"], + "Numpad6": ["NUMPAD6"], + "Numpad7": ["NUMPAD7"], + "Numpad8": ["NUMPAD8"], + "Numpad9": ["NUMPAD9"], + "NumpadMultiply": ["MULTIPLY"], + "NumpadAdd": ["ADD"], + "NumpadSeparator": ["SEPARATOR"], + "NumpadSubtract": ["SUBTRACT"], + "NumpadDecimal": ["DECIMAL"], + "NumpadDivide": ["DIVIDE"], + "F1": ["F1"], + "F2": ["F2"], + "F3": ["F3"], + "F4": ["F4"], + "F5": ["F5"], + "F6": ["F6"], + "F7": ["F7"], + "F8": ["F8"], + "F9": ["F9"], + "F10": ["F10"], + "F11": ["F11"], + "F12": ["F12"], + "F13": ["F13"], + "F14": ["F14"], + "F15": ["F15"], + "F16": ["F16"], + "F17": ["F17"], + "F18": ["F18"], + "F19": ["F19"], + "F20": ["F20"], + "F21": ["F21"], + "F22": ["F22"], + "F23": ["F23"], + "F24": ["F24"], + "NavigationView": ["NAVIGATION_VIEW"], + "NavigationMenu": ["NAVIGATION_MENU"], + "NavigationUp": ["NAVIGATION_UP"], + "NavigationDown": ["NAVIGATION_DOWN"], + "NavigationLeft": ["NAVIGATION_LEFT"], + "NavigationRight": ["NAVIGATION_RIGHT"], + "NavigationAccept": ["NAVIGATION_ACCEPT"], + "NavigationCancel": ["NAVIGATION_CANCEL"], + "NumLock": ["NUMLOCK"], + "ScrollLock": ["SCROLL"], + "NumpadEqual": ["OEM_NEC_EQUAL"], + "ShiftLeft": ["LSHIFT", "SHIFT"], + "ShiftRight": ["RSHIFT"], + "ShiftLock": ["OEM_SHIFT"], + "ControlLeft": ["LCONTROL", "CONTROL"], + "ControlRight": ["RCONTROL"], + "AltLeft": ["LMENU"], + "AltRight": ["RMENU"], + "BrowserBack": ["BROWSER_BACK"], + "BrowserForward": ["BROWSER_FORWARD"], + "BrowserRefresh": ["BROWSER_REFRESH"], + "BrowserStop": ["BROWSER_STOP"], + "BrowserSearch": ["BROWSER_SEARCH"], + "BrowserFavorites": ["BROWSER_FAVORITES"], + "BrowserHome": ["BROWSER_HOME"], + "AudioVolumeMute": ["VOLUME_MUTE"], + "AudioVolumeDown": ["VOLUME_DOWN"], + "AudioVolumeUp": ["VOLUME_UP"], + "MediaNextTrack": ["MEDIA_NEXT_TRACK"], + "MediaPrevTrack": ["MEDIA_PREV_TRACK"], + "MediaStop": ["MEDIA_STOP"], + "MediaPlayPause": ["MEDIA_PLAY_PAUSE"], + "LaunchMail": ["LAUNCH_MAIL"], + "LaunchMediaSelect": ["LAUNCH_MEDIA_SELECT"], + "LaunchApp1": ["LAUNCH_APP1"], + "LaunchApp2": ["LAUNCH_APP2"], + "Semicolon": ["OEM_1"], + "Equal": ["OEM_PLUS"], + "Comma": ["OEM_COMMA"], + "Minus": ["OEM_MINUS"], + "Period": ["OEM_PERIOD"], + "Slash": ["OEM_2"], + "Backquote": ["OEM_3"], + "GameButton8": ["GAMEPAD_A"], + "GameButton9": ["GAMEPAD_B"], + "GameButton10": ["GAMEPAD_X"], + "GameButton11": ["GAMEPAD_Y"], + "GameButton12": ["GAMEPAD_RIGHT_SHOULDER"], + "GameButton13": ["GAMEPAD_LEFT_SHOULDER"], + "GameButton14": ["GAMEPAD_LEFT_TRIGGER"], + "GameButton15": ["GAMEPAD_RIGHT_TRIGGER"], + "GameButton16": ["GAMEPAD_DPAD_UP"], + "GameButton17": ["GAMEPAD_DPAD_DOWN"], + "GameButton18": ["GAMEPAD_DPAD_LEFT"], + "GameButton19": ["GAMEPAD_DPAD_RIGHT"], + "GamepadMenu": ["GAMEPAD_MENU"], + "GamepadView": ["GAMEPAD_VIEW"], + "GamepadLeftThumbstickButton": ["GAMEPAD_LEFT_THUMBSTICK_BUTTON"], + "GamepadRightThumbstickButton": ["GAMEPAD_RIGHT_THUMBSTICK_BUTTON"], + "GamepadLeftThumbstickUp": ["GAMEPAD_LEFT_THUMBSTICK_UP"], + "GamepadLeftThumbstickDown": ["GAMEPAD_LEFT_THUMBSTICK_DOWN"], + "GamepadLeftThumbstickRight": ["GAMEPAD_LEFT_THUMBSTICK_RIGHT"], + "GamepadLeftThumbstickLeft": ["GAMEPAD_LEFT_THUMBSTICK_LEFT"], + "GamepadRightThumbstickUp": ["GAMEPAD_RIGHT_THUMBSTICK_UP"], + "GamepadRightThumbstickDown": ["GAMEPAD_RIGHT_THUMBSTICK_DOWN"], + "GamepadRightThumbstickRight": ["GAMEPAD_RIGHT_THUMBSTICK_RIGHT"], + "GamepadRightThumbstickLeft": ["GAMEPAD_RIGHT_THUMBSTICK_LEFT"], + "BracketLeft": ["OEM_4"], + "Backslash": ["OEM_5"], + "BracketRight": ["OEM_6"], + "Quote": ["OEM_7"], + "Oem8": ["OEM_8"], + "OemAx": ["OEM_AX"], + "Oem102": ["OEM_102"], + "IcoHelp": ["ICO_HELP"], + "Ico00": ["ICO_00"], + "Processkey": ["PROCESSKEY"], + "IcoClear": ["ICO_CLEAR"], + "Packet": ["PACKET"], + "OemReset": ["OEM_RESET"], + "OemJump": ["OEM_JUMP"], + "OemPa1": ["OEM_PA1"], + "OemPa2": ["OEM_PA2"], + "OemPa3": ["OEM_PA3"], + "OemWsctrl": ["OEM_WSCTRL"], + "OemCusel": ["OEM_CUSEL"], + "OemAttn": ["OEM_ATTN"], + "OemFinish": ["OEM_FINISH"], + "OemCopy": ["OEM_COPY"], + "OemAuto": ["OEM_AUTO"], + "OemEnlw": ["OEM_ENLW"], + "OemBacktab": ["OEM_BACKTAB"], + "Attn": ["ATTN"], + "Crsel": ["CRSEL"], + "Exsel": ["EXSEL"], + "Ereof": ["EREOF"], + "Play": ["PLAY"], + "Zoom": ["ZOOM"], + "Noname": ["NONAME"], + "Pa1": ["PA1"], + "OemClear": ["OEM_CLEAR"], + "0": ["0"], + "1": ["1"], + "2": ["2"], + "3": ["3"], + "4": ["4"], + "5": ["5"], + "6": ["6"], + "7": ["7"], + "8": ["8"], + "9": ["9"], + "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"] +} diff --git a/dev/tools/gen_keycodes/data/windows_scancode_logical_map.json b/dev/tools/gen_keycodes/data/windows_scancode_logical_map.json new file mode 100644 index 0000000000..5462da282a --- /dev/null +++ b/dev/tools/gen_keycodes/data/windows_scancode_logical_map.json @@ -0,0 +1,20 @@ +{ + "ControlRight": "ControlRight", + "AltRight": "AltRight", + "Numpad1": "Numpad1", + "Numpad2": "Numpad2", + "Numpad3": "Numpad3", + "Numpad4": "Numpad4", + "Numpad5": "Numpad5", + "Numpad6": "Numpad6", + "Numpad7": "Numpad7", + "Numpad8": "Numpad8", + "Numpad9": "Numpad9", + "Numpad0": "Numpad0", + "NumpadAdd": "NumpadAdd", + "NumpadDecimal": "NumpadDecimal", + "NumpadDivide": "NumpadDivide", + "NumpadEqual": "NumpadEqual", + "NumpadMultiply": "NumpadMultiply", + "NumpadSubtract": "NumpadSubtract" +} diff --git a/dev/tools/gen_keycodes/lib/android_code_gen.dart b/dev/tools/gen_keycodes/lib/android_code_gen.dart index 89de4de0f7..69c4ce58b7 100644 --- a/dev/tools/gen_keycodes/lib/android_code_gen.dart +++ b/dev/tools/gen_keycodes/lib/android_code_gen.dart @@ -5,36 +5,23 @@ import 'package:path/path.dart' as path; import 'base_code_gen.dart'; -import 'key_data.dart'; +import 'logical_key_data.dart'; +import 'physical_key_data.dart'; import 'utils.dart'; -/// Generates the key mapping of Android, based on the information in the key +/// Generates the key mapping for Android, based on the information in the key /// data structure given to it. class AndroidCodeGenerator extends PlatformCodeGenerator { - AndroidCodeGenerator(KeyData keyData) : super(keyData); + AndroidCodeGenerator(PhysicalKeyData physicalData, LogicalKeyData logicalData) + : super(physicalData, logicalData); /// This generates the map of Android key codes to logical keys. String get _androidKeyCodeMap { final StringBuffer androidKeyCodeMap = StringBuffer(); - for (final Key entry in keyData.data) { - if (entry.androidKeyCodes != null) { - for (final int code in entry.androidKeyCodes.cast()) { - androidKeyCodeMap.writeln(' { $code, ${toHex(entry.flutterId, digits: 10)} }, // ${entry.constantName}'); - } - } - } - return androidKeyCodeMap.toString().trimRight(); - } - - /// This generates the map of Android number pad key codes to logical keys. - String get _androidNumpadMap { - final StringBuffer androidKeyCodeMap = StringBuffer(); - for (final Key entry in numpadKeyData) { - if (entry.androidKeyCodes != null) { - for (final int code in entry.androidKeyCodes.cast()) { - androidKeyCodeMap.writeln(' { $code, ${toHex(entry.flutterId, digits: 10)} }, // ${entry.constantName}'); - } + for (final LogicalKeyEntry entry in logicalData.entries) { + for (final int code in entry.androidValues) { + androidKeyCodeMap.writeln(' put(${toHex(code, digits: 10)}L, ${toHex(entry.value, digits: 10)}L); // ${entry.constantName}'); } } return androidKeyCodeMap.toString().trimRight(); @@ -43,10 +30,10 @@ class AndroidCodeGenerator extends PlatformCodeGenerator { /// This generates the map of Android scan codes to physical keys. String get _androidScanCodeMap { final StringBuffer androidScanCodeMap = StringBuffer(); - for (final Key entry in keyData.data) { + for (final PhysicalKeyEntry entry in keyData.entries) { if (entry.androidScanCodes != null) { for (final int code in entry.androidScanCodes.cast()) { - androidScanCodeMap.writeln(' { $code, ${toHex(entry.usbHidCode)} }, // ${entry.constantName}'); + androidScanCodeMap.writeln(' put(${toHex(code, digits: 10)}L, ${toHex(entry.usbHidCode, digits: 10)}L); // ${entry.constantName}'); } } } @@ -54,14 +41,17 @@ class AndroidCodeGenerator extends PlatformCodeGenerator { } @override - String get templatePath => path.join(flutterRoot.path, 'dev', 'tools', 'gen_keycodes', 'data', 'keyboard_map_android_cc.tmpl'); + String get templatePath => path.join(dataRoot, 'android_keyboard_map_java.tmpl'); + + @override + String outputPath(String platform) => path.join(PlatformCodeGenerator.engineRoot, 'shell', 'platform', + path.join('android', 'io', 'flutter', 'embedding', 'android', 'KeyboardMap.java')); @override Map mappings() { return { 'ANDROID_SCAN_CODE_MAP': _androidScanCodeMap, 'ANDROID_KEY_CODE_MAP': _androidKeyCodeMap, - 'ANDROID_NUMPAD_MAP': _androidNumpadMap, }; } } diff --git a/dev/tools/gen_keycodes/lib/base_code_gen.dart b/dev/tools/gen_keycodes/lib/base_code_gen.dart index 162de81a47..8713e286fe 100644 --- a/dev/tools/gen_keycodes/lib/base_code_gen.dart +++ b/dev/tools/gen_keycodes/lib/base_code_gen.dart @@ -3,15 +3,14 @@ // found in the LICENSE file. import 'dart:io'; -import 'package:path/path.dart' as path; +import 'package:gen_keycodes/logical_key_data.dart'; -import 'key_data.dart'; -import 'utils.dart'; +import 'physical_key_data.dart'; String _injectDictionary(String template, Map dictionary) { String result = template; for (final String key in dictionary.keys) { - result = result.replaceAll('@@@$key@@@', dictionary[key]); + result = result.replaceAll('@@@$key@@@', dictionary[key] ?? '@@@$key@@@'); } return result; } @@ -26,7 +25,7 @@ String _injectDictionary(String template, Map dictionary) { /// Subclasses must implement [templatePath] and [mappings]. abstract class BaseCodeGenerator { /// Create a code generator while providing [keyData] to be used in [mappings]. - BaseCodeGenerator(this.keyData); + BaseCodeGenerator(this.keyData, this.logicalData); /// Absolute path to the template file that this file is generated on. String get templatePath; @@ -42,30 +41,20 @@ abstract class BaseCodeGenerator { } /// The database of keys loaded from disk. - final KeyData keyData; + final PhysicalKeyData keyData; + + final LogicalKeyData logicalData; } /// A code generator which also defines platform-based behavior. abstract class PlatformCodeGenerator extends BaseCodeGenerator { - PlatformCodeGenerator(KeyData keyData) : super(keyData); - - // Used by platform code generators. - List get numpadKeyData { - return keyData.data.where((Key entry) { - return entry.constantName.startsWith('numpad') && entry.keyLabel != null; - }).toList(); - } - - // Used by platform code generators. - List get functionKeyData { - final RegExp functionKeyRe = RegExp(r'^f[0-9]+$'); - return keyData.data.where((Key entry) { - return functionKeyRe.hasMatch(entry.constantName); - }).toList(); - } + PlatformCodeGenerator(PhysicalKeyData keyData, LogicalKeyData logicalData) + : super(keyData, logicalData); /// Absolute path to the output file. /// /// How this value will be used is based on the callee. - String outputPath(String platform) => path.join(flutterRoot.path, '..', path.join('engine', 'src', 'flutter', 'shell', 'platform', platform, 'keycodes', 'keyboard_map_$platform.h')); + String outputPath(String platform); + + static String engineRoot = ''; } diff --git a/dev/tools/gen_keycodes/lib/constants.dart b/dev/tools/gen_keycodes/lib/constants.dart new file mode 100644 index 0000000000..bf2c0f221a --- /dev/null +++ b/dev/tools/gen_keycodes/lib/constants.dart @@ -0,0 +1,148 @@ +// 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. + +/* === LOGICAL KEY BITMASKS === */ +// The following constants are used to composite the value for a Flutter logical +// key. +// +// A Flutter logical key supports up to 53-bits, as limited by JavaScript +// integers. + +/* Bit 31-0: Value */ +// The lower 32 bits represent different values within a plane. + +/// Mask for the 32-bit value portion of the code. +const int kValueMask = 0x000FFFFFFFF; + + +/* Bit 39-32: Source of value */ +// The next 8 bits represent where the values come from, consequently how to +// interpret them. + +/// Mask for bit #39-32 portion of the code, indicating the source of the value. +const int kPlatformMask = 0x0FF00000000; + +/// The code prefix for keys that have a Unicode representation, generated from +/// their code points. +/// +/// See also: +/// +/// * [kUnprintablePlane], for keys that are also generated from code points but +/// unprintable. +const int kUnicodePlane = 0x00000000000; + +/// The code prefix for keys generated from their USB HID usages. +const int kHidPlane = 0x00100000000; + +/// The code prefix for unrecognized keys that are unique to Android, generated +/// from platform-specific codes. +const int kAndroidPlane = 0x00200000000; + +/// The code prefix for unrecognized keys that are unique to Fuchsia, generated +/// from platform-specific codes. +const int kFuchsiaPlane = 0x00300000000; + +/// The code prefix for unrecognized keys that are unique to iOS, generated +/// from platform-specific codes. +const int kIosPlane = 0x00400000000; + +/// The code prefix for unrecognized keys that are unique to macOS, generated +/// from platform-specific codes. +const int kMacOsPlane = 0x00500000000; + +/// The code prefix for unrecognized keys that are unique to Gtk, generated from +/// platform-specific codes. +const int kGtkPlane = 0x00600000000; + +/// The code prefix for unrecognized keys that are unique to Windows, generated +/// from platform-specific codes. +const int kWindowsPlane = 0x00700000000; + +/// The code prefix for unrecognized keys that are unique to Web, generated from +/// platform-specific codes. +const int kWebPlane = 0x00800000000; + +/// The code prefix for keys that do not have a Unicode representation, generated +/// from their code points. +/// +/// See also: +/// +/// * [kUnicodePlane], for keys that are also generated from code points but +/// printable. +const int kUnprintablePlane = 0x01000000000; + + +/* Bit 43-40: Key variation */ +// The next 4 bits represent keys that have multiple variations, such as a left +// and right variation of a modifier key, or a Numpad variation of a digit key. + +/// Mask for bit #43-40 portion of the code, indicating the variation of the key. +const int kVariationMask = 0xF0000000000; + +/// The code prefix for pseudo-keys which represent collections of key synonyms, +/// such as Control. +const int kSynonymPlane = 0x20000000000; + +/// The code prefix for the left modifier of a pair of modifiers, such as Control +/// Left. +const int kLeftModifierPlane = 0x30000000000; + +/// The code prefix for the right modifier of a pair of modifiers, such as Control +/// Right. +const int kRightModifierPlane = 0x40000000000; + +/// The code prefix for a Numpad key, such as Numpad 1. +const int kNumpadPlane = 0x50000000000; + +class MaskConstant { + const MaskConstant({required this.name, required this.value, required this.description}); + + final String name; + final int value; + final List description; +} + +const List maskConstants = [ + MaskConstant( + name: 'valueMask', + value: kValueMask, + description: [ + 'Mask for the 32-bit value portion of the key code.', + 'This is used by platform-specific code to generate Flutter key codes.', + ], + ), + MaskConstant( + name: 'platformMask', + value: kPlatformMask, + description: [ + 'Mask for the platform prefix portion of the key code.', + 'This is used by platform-specific code to generate Flutter key codes.' + ], + ), + MaskConstant( + name: 'unicodePlane', + value: kUnicodePlane, + description: [ + 'The code prefix for keys which have a Unicode representation.', + 'This is used by platform-specific code to generate Flutter key codes.' + ], + ), + MaskConstant( + name: 'synonymMask', + value: kSynonymPlane, + description: [ + 'Mask for the synonym pseudo-keys generated for keys which appear in more than one place on the keyboard.', + 'IDs in this range are used to represent keys which appear in multiple places on the keyboard, such as the SHIFT, ALT, CTRL, and numeric keypad keys. These key codes will never be generated by the key event system, but may be used in key maps to represent the union of all the keys of each type in order to match them.', + 'To look up the synonyms that are defined, look in the [synonyms] map.' + ], + ), + MaskConstant( + name: 'hidPlane', + value: kHidPlane, + description: [ + 'The code prefix for keys which do not have a Unicode representation.', + 'This is used by platform-specific code to generate Flutter key codes using HID Usage codes.' + ], + ), +]; diff --git a/dev/tools/gen_keycodes/lib/fuchsia_code_gen.dart b/dev/tools/gen_keycodes/lib/fuchsia_code_gen.dart deleted file mode 100644 index fe4404e660..0000000000 --- a/dev/tools/gen_keycodes/lib/fuchsia_code_gen.dart +++ /dev/null @@ -1,49 +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 'package:path/path.dart' as path; - -import 'base_code_gen.dart'; -import 'key_data.dart'; -import 'utils.dart'; - - -/// Generates the key mapping of Fuchsia, based on the information in the key -/// data structure given to it. -class FuchsiaCodeGenerator extends PlatformCodeGenerator { - FuchsiaCodeGenerator(KeyData keyData) : super(keyData); - - /// This generates the map of Fuchsia key codes to logical keys. - String get _fuchsiaKeyCodeMap { - final StringBuffer fuchsiaKeyCodeMap = StringBuffer(); - for (final Key entry in keyData.data) { - if (entry.usbHidCode != null) { - fuchsiaKeyCodeMap.writeln(' { ${toHex(entry.flutterId)}, ${toHex(entry.flutterId, digits: 10)} }, // ${entry.constantName}'); - } - } - return fuchsiaKeyCodeMap.toString().trimRight(); - } - - /// This generates the map of Fuchsia USB HID codes to physical keys. - String get _fuchsiaHidCodeMap { - final StringBuffer fuchsiaScanCodeMap = StringBuffer(); - for (final Key entry in keyData.data) { - if (entry.usbHidCode != null) { - fuchsiaScanCodeMap.writeln(' { ${toHex(entry.usbHidCode)}, ${toHex(entry.usbHidCode)} }, // ${entry.constantName}'); - } - } - return fuchsiaScanCodeMap.toString().trimRight(); - } - - @override - String get templatePath => path.join(flutterRoot.path, 'dev', 'tools', 'gen_keycodes', 'data', 'keyboard_map_fuchsia_cc.tmpl'); - - @override - Map mappings() { - return { - 'FUCHSIA_SCAN_CODE_MAP': _fuchsiaHidCodeMap, - 'FUCHSIA_KEY_CODE_MAP': _fuchsiaKeyCodeMap, - }; - } -} diff --git a/dev/tools/gen_keycodes/lib/glfw_code_gen.dart b/dev/tools/gen_keycodes/lib/glfw_code_gen.dart deleted file mode 100644 index 5667d64230..0000000000 --- a/dev/tools/gen_keycodes/lib/glfw_code_gen.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. - -import 'package:path/path.dart' as path; - -import 'base_code_gen.dart'; -import 'key_data.dart'; -import 'utils.dart'; - - -/// Generates the key mapping of GLFW, based on the information in the key -/// data structure given to it. -class GlfwCodeGenerator extends PlatformCodeGenerator { - GlfwCodeGenerator(KeyData keyData) : super(keyData); - - /// This generates the map of GLFW number pad key codes to logical keys. - String get _glfwNumpadMap { - final StringBuffer glfwNumpadMap = StringBuffer(); - for (final Key entry in numpadKeyData) { - if (entry.glfwKeyCodes != null) { - for (final int code in entry.glfwKeyCodes.cast()) { - glfwNumpadMap.writeln(' { $code, ${toHex(entry.flutterId, digits: 10)} }, // ${entry.constantName}'); - } - } - } - return glfwNumpadMap.toString().trimRight(); - } - - /// This generates the map of GLFW key codes to logical keys. - String get _glfwKeyCodeMap { - final StringBuffer glfwKeyCodeMap = StringBuffer(); - for (final Key entry in keyData.data) { - if (entry.glfwKeyCodes != null) { - for (final int code in entry.glfwKeyCodes.cast()) { - glfwKeyCodeMap.writeln(' { $code, ${toHex(entry.flutterId, digits: 10)} }, // ${entry.constantName}'); - } - } - } - return glfwKeyCodeMap.toString().trimRight(); - } - - @override - String get templatePath => path.join(flutterRoot.path, 'dev', 'tools', 'gen_keycodes', 'data', 'keyboard_map_glfw_cc.tmpl'); - - @override - Map mappings() { - return { - 'GLFW_KEY_CODE_MAP': _glfwKeyCodeMap, - 'GLFW_NUMPAD_MAP': _glfwNumpadMap, - }; - } -} diff --git a/dev/tools/gen_keycodes/lib/gtk_code_gen.dart b/dev/tools/gen_keycodes/lib/gtk_code_gen.dart index 1c5ede8fc8..2f61022aba 100644 --- a/dev/tools/gen_keycodes/lib/gtk_code_gen.dart +++ b/dev/tools/gen_keycodes/lib/gtk_code_gen.dart @@ -5,33 +5,104 @@ import 'package:path/path.dart' as path; import 'base_code_gen.dart'; -import 'key_data.dart'; +import 'logical_key_data.dart'; +import 'physical_key_data.dart'; import 'utils.dart'; -/// Generates the key mapping of GTK, based on the information in the key +/// Generates the key mapping for GTK, based on the information in the key /// data structure given to it. class GtkCodeGenerator extends PlatformCodeGenerator { - GtkCodeGenerator(KeyData keyData) : super(keyData); + GtkCodeGenerator( + PhysicalKeyData keyData, + LogicalKeyData logicalData, + String modifierBitMapping, + String lockBitMapping, + ) : _modifierBitMapping = parseMapOfListOfString(modifierBitMapping), + _lockBitMapping = parseMapOfListOfString(lockBitMapping), + super(keyData, logicalData); - /// This generates the map of XKB scan codes to USB HID codes. - String get xkbScanCodeMap { - final StringBuffer xkbScanCodeMap = StringBuffer(); - for (final Key entry in keyData.data) { + /// This generates the map of XKB scan codes to Flutter physical keys. + String get _xkbScanCodeMap { + final OutputLines lines = OutputLines('GTK scancode map'); + for (final PhysicalKeyEntry entry in keyData.entries) { if (entry.xKbScanCode != null) { - xkbScanCodeMap.writeln(' { ${toHex(entry.xKbScanCode)}, ${toHex(entry.usbHidCode)} }, // ${entry.constantName}'); + lines.add(entry.xKbScanCode!, ' insert_record(table, ${toHex(entry.xKbScanCode)}, ${toHex(entry.usbHidCode)}); // ${entry.constantName}'); } } - return xkbScanCodeMap.toString().trimRight(); + return lines.sortedJoin().trimRight(); } + /// This generates the map of GTK keyval codes to Flutter logical keys. + String get _gtkKeyvalCodeMap { + final OutputLines lines = OutputLines('GTK keyval map'); + for (final LogicalKeyEntry entry in logicalData.entries) { + zipStrict(entry.gtkValues, entry.gtkNames, (int value, String name) { + lines.add(value, ' insert_record(table, ${toHex(value)}, ${toHex(entry.value, digits: 11)}); // $name'); + }); + } + return lines.sortedJoin().trimRight(); + } + + static String constructMapFromModToKeys( + Map> source, + PhysicalKeyData physicalData, + LogicalKeyData logicalData, + String debugFunctionName, + ) { + final StringBuffer result = StringBuffer(); + source.forEach((String modifierBitName, List keyNames) { + assert(keyNames.length == 2 || keyNames.length == 3); + final String primaryLogicalName = keyNames[0]; + final String primaryPhysicalName = keyNames[1]; + final String? secondaryPhysicalName = keyNames.length == 3 ? keyNames[2] : null; + final LogicalKeyEntry primaryLogical = logicalData.entryByName(primaryLogicalName); + final PhysicalKeyEntry primaryPhysical = physicalData.entryByName(primaryPhysicalName); + final PhysicalKeyEntry? secondaryPhysical = secondaryPhysicalName == null ? null : physicalData.entryByName(secondaryPhysicalName); + if (secondaryPhysical == null && secondaryPhysicalName != null) { + print('Unrecognized secondary physical key $secondaryPhysicalName specified for $debugFunctionName.'); + return; + } + final String pad = secondaryPhysical == null ? '' : ' '; + result.writeln(''' + + data = g_new(FlKeyEmbedderCheckedKey, 1); + g_hash_table_insert(table, GUINT_TO_POINTER(GDK_${modifierBitName}_MASK), data); + data->is_caps_lock = ${primaryPhysicalName == 'CapsLock' ? 'true' : 'false'}; + data->primary_logical_key = ${toHex(primaryLogical.value, digits: 11)};$pad // ${primaryLogical.constantName} + data->primary_physical_key = ${toHex(primaryPhysical.usbHidCode, digits: 9)};$pad // ${primaryPhysical.constantName}'''); + if (secondaryPhysical != null) { + result.writeln(''' + data->secondary_physical_key = ${toHex(secondaryPhysical.usbHidCode, digits: 9)}; // ${secondaryPhysical.constantName}'''); + } + }); + return result.toString().trimRight(); + } + + String get _gtkModifierBitMap { + return constructMapFromModToKeys(_modifierBitMapping, keyData, logicalData, 'gtkModifierBitMap'); + } + final Map> _modifierBitMapping; + + String get _gtkModeBitMap { + return constructMapFromModToKeys(_lockBitMapping, keyData, logicalData, 'gtkModeBitMap'); + } + final Map> _lockBitMapping; + @override - String get templatePath => path.join(flutterRoot.path, 'dev', 'tools', 'gen_keycodes', 'data', 'keyboard_map_linux_cc.tmpl'); + String get templatePath => path.join(dataRoot, 'gtk_key_mapping_cc.tmpl'); + + @override + String outputPath(String platform) => path.join(PlatformCodeGenerator.engineRoot, + 'shell', 'platform', 'linux', 'key_mapping.cc'); @override Map mappings() { return { - 'XKB_SCAN_CODE_MAP': xkbScanCodeMap, + 'XKB_SCAN_CODE_MAP': _xkbScanCodeMap, + 'GTK_KEYVAL_CODE_MAP': _gtkKeyvalCodeMap, + 'GTK_MODIFIER_BIT_MAP': _gtkModifierBitMap, + 'GTK_MODE_BIT_MAP': _gtkModeBitMap, }; } } diff --git a/dev/tools/gen_keycodes/lib/ios_code_gen.dart b/dev/tools/gen_keycodes/lib/ios_code_gen.dart deleted file mode 100644 index 162e69fa97..0000000000 --- a/dev/tools/gen_keycodes/lib/ios_code_gen.dart +++ /dev/null @@ -1,54 +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 'package:path/path.dart' as path; - -import 'base_code_gen.dart'; -import 'key_data.dart'; -import 'utils.dart'; - -/// Generates the key mapping of iOS, based on the information in the key -/// data structure given to it. -class IosCodeGenerator extends PlatformCodeGenerator { - IosCodeGenerator(KeyData keyData) : super(keyData); - - /// This generates the map of iOS key codes to physical keys. - String get _iosScanCodeMap { - final StringBuffer iosScanCodeMap = StringBuffer(); - for (final Key entry in keyData.data) { - if (entry.iosScanCode != null) { - iosScanCodeMap.writeln(' { ${toHex(entry.iosScanCode)}, ${toHex(entry.usbHidCode)} }, // ${entry.constantName}'); - } - } - return iosScanCodeMap.toString().trimRight(); - } - - /// This generates the map of iOS number pad key codes to logical keys. - String get _iosNumpadMap { - final StringBuffer iosNumPadMap = StringBuffer(); - for (final Key entry in numpadKeyData) { - if (entry.iosScanCode != null) { - iosNumPadMap.writeln(' { ${toHex(entry.iosScanCode)}, ${toHex(entry.flutterId, digits: 10)} }, // ${entry.constantName}'); - } - } - return iosNumPadMap.toString().trimRight(); - } - - @override - String get templatePath => path.join(flutterRoot.path, 'dev', 'tools', 'gen_keycodes', 'data', 'keyboard_map_ios_cc.tmpl'); - - @override - String outputPath(String platform) => path.joinAll([flutterRoot.path, '..', 'engine', 'src', 'flutter', 'shell', 'platform', 'darwin', platform, 'keycodes', 'keyboard_map_$platform.h']); - - @override - Map mappings() { - // There is no iOS keycode map since iOS uses keycode to represent a physical key. - // The LogicalKeyboardKey is generated by raw_keyboard_macos.dart from the unmodified characters - // from NSEvent. - return { - 'IOS_SCAN_CODE_MAP': _iosScanCodeMap, - 'IOS_NUMPAD_MAP': _iosNumpadMap - }; - } -} diff --git a/dev/tools/gen_keycodes/lib/key_data.dart b/dev/tools/gen_keycodes/lib/key_data.dart deleted file mode 100644 index 3bad403e6b..0000000000 --- a/dev/tools/gen_keycodes/lib/key_data.dart +++ /dev/null @@ -1,601 +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:convert'; -import 'dart:io'; - -import 'package:gen_keycodes/utils.dart'; -import 'package:meta/meta.dart'; -import 'package:path/path.dart' as path; - -/// The data structure used to manage keyboard key entries. -/// -/// The main constructor parses the given input data into the data structure. -/// -/// The data structure can be also loaded and saved to JSON, with the -/// [KeyData.fromJson] constructor and [toJson] method, respectively. -class KeyData { - /// Parses the input data given in from the various data source files, - /// populating the data structure. - /// - /// None of the parameters may be null. - KeyData( - String chromiumHidCodes, - String androidKeyboardLayout, - String androidKeyCodeHeader, - String androidNameMap, - String glfwKeyCodeHeader, - String glfwNameMap, - String gtkKeyCodeHeader, - String gtkNameMap, - String windowsKeyCodeHeader, - String windowsNameMap, - ) : assert(chromiumHidCodes != null), - assert(androidKeyboardLayout != null), - assert(androidKeyCodeHeader != null), - assert(androidNameMap != null), - assert(glfwKeyCodeHeader != null), - assert(glfwNameMap != null), - assert(gtkKeyCodeHeader != null), - assert(gtkNameMap != null), - assert(windowsKeyCodeHeader != null), - assert(windowsNameMap != null) { - _nameToAndroidScanCodes = _readAndroidScanCodes(androidKeyboardLayout); - _nameToAndroidKeyCode = _readAndroidKeyCodes(androidKeyCodeHeader); - _nameToGlfwKeyCode = _readGlfwKeyCodes(glfwKeyCodeHeader); - _nameToGtkKeyCode = _readGtkKeyCodes(gtkKeyCodeHeader); - _nameToWindowsKeyCode = _readWindowsKeyCodes(windowsKeyCodeHeader); - // Cast Android dom map - final Map> dynamicAndroidNames = (json.decode(androidNameMap) as Map).cast>(); - _nameToAndroidName = dynamicAndroidNames.map>((String key, List value) { - return MapEntry>(key, value.cast()); - }); - // Cast GLFW dom map - final Map> dynamicGlfwNames = (json.decode(glfwNameMap) as Map).cast>(); - _nameToGlfwName = dynamicGlfwNames.map>((String key, List value) { - return MapEntry>(key, value.cast()); - }); - // Cast GTK dom map - final Map> dynamicGtkNames = (json.decode(gtkNameMap) as Map).cast>(); - _nameToGtkName = dynamicGtkNames.map>((String key, List value) { - return MapEntry>(key, value.cast()); - }); - // Cast Windows dom map - final Map> dynamicWindowsNames = (json.decode(windowsNameMap) as Map).cast>(); - _nameToWindowsName = dynamicWindowsNames.map>((String key, List value) { - return MapEntry>(key, value.cast()); - }); - data = _readHidEntries(chromiumHidCodes); - } - - /// Parses the given JSON data and populates the data structure from it. - KeyData.fromJson(Map contentMap) { - data = [ - for (final String key in contentMap.keys) Key.fromJsonMapEntry(key, contentMap[key] as Map), - ]; - } - - /// Converts the data structure into a JSON structure that can be parsed by - /// [KeyData.fromJson]. - Map toJson() { - for (final Key entry in data) { - // Android Key names - entry.androidKeyNames = _nameToAndroidName[entry.constantName]?.cast(); - if (entry.androidKeyNames != null && entry.androidKeyNames.isNotEmpty) { - for (final String androidKeyName in entry.androidKeyNames) { - if (_nameToAndroidKeyCode[androidKeyName] != null) { - entry.androidKeyCodes ??= []; - entry.androidKeyCodes.add(_nameToAndroidKeyCode[androidKeyName]); - } - if (_nameToAndroidScanCodes[androidKeyName] != null && _nameToAndroidScanCodes[androidKeyName].isNotEmpty) { - entry.androidScanCodes ??= []; - entry.androidScanCodes.addAll(_nameToAndroidScanCodes[androidKeyName]); - } - } - } - - // GLFW key names - entry.glfwKeyNames = _nameToGlfwName[entry.constantName]?.cast(); - if (entry.glfwKeyNames != null && entry.glfwKeyNames.isNotEmpty) { - for (final String glfwKeyName in entry.glfwKeyNames) { - if (_nameToGlfwKeyCode[glfwKeyName] != null) { - entry.glfwKeyCodes ??= []; - entry.glfwKeyCodes.add(_nameToGlfwKeyCode[glfwKeyName]); - } - } - } - - // GTK key names - entry.gtkKeyNames = _nameToGtkName[entry.constantName]?.cast(); - if (entry.gtkKeyNames != null && entry.gtkKeyNames.isNotEmpty) { - for (final String gtkKeyName in entry.gtkKeyNames) { - if (_nameToGtkKeyCode[gtkKeyName] != null) { - entry.gtkKeyCodes ??= []; - entry.gtkKeyCodes.add(_nameToGtkKeyCode[gtkKeyName]); - } - } - } - - // Windows key names - entry.windowsKeyNames = _nameToWindowsName[entry.constantName]?.cast(); - if (entry.windowsKeyNames != null && entry.windowsKeyNames.isNotEmpty) { - for (final String windowsKeyName in entry.windowsKeyNames) { - if (_nameToWindowsKeyCode[windowsKeyName] != null) { - entry.windowsKeyCodes ??= []; - entry.windowsKeyCodes.add(_nameToWindowsKeyCode[windowsKeyName]); - } - } - } - } - - final Map outputMap = {}; - for (final Key entry in data) { - outputMap[entry.constantName] = entry.toJson(); - } - return outputMap; - } - - /// The list of keys. - List data; - - /// The mapping from the Flutter name (e.g. "eject") to the Android name (e.g. - /// "MEDIA_EJECT"). - /// - /// Only populated if data is parsed from the source files, not if parsed from - /// JSON. - Map> _nameToAndroidName; - - /// The mapping from the Flutter name (e.g. "eject") to the GLFW name (e.g. - /// "GLFW_MEDIA_EJECT"). - /// - /// Only populated if data is parsed from the source files, not if parsed from - /// JSON. - Map> _nameToGlfwName; - - /// The mapping from the Flutter name (e.g. "eject") to the GTK name (e.g. - /// "GDK_KEY_Eject"). - /// - /// Only populated if data is parsed from the source files, not if parsed from - /// JSON. - Map> _nameToGtkName; - - /// The mapping from the Android name (e.g. "MEDIA_EJECT") to the integer scan - /// code (physical location) of the key. - /// - /// Only populated if data is parsed from the source files, not if parsed from - /// JSON. - Map> _nameToAndroidScanCodes; - - /// The mapping from Android name (e.g. "MEDIA_EJECT") to the integer key code - /// (logical meaning) of the key. - /// - /// Only populated if data is parsed from the source files, not if parsed from - /// JSON. - Map _nameToAndroidKeyCode; - - /// The mapping from GLFW name (e.g. "GLFW_KEY_COMMA") to the integer key code - /// (logical meaning) of the key. - /// - /// Only populated if data is parsed from the source files, not if parsed from - /// JSON. - Map _nameToGlfwKeyCode; - - /// The mapping from GTK name (e.g. "GTK_KEY_comma") to the integer key code - /// (logical meaning) of the key. - /// - /// Only populated if data is parsed from the source files, not if parsed from - /// JSON. - Map _nameToGtkKeyCode; - - /// The mapping from Widows name (e.g. "RETURN") to the integer key code - /// (logical meaning) of the key. - /// - /// Only populated if data is parsed from the source files, not if parsed from - /// JSON. - Map _nameToWindowsKeyCode; - - /// The mapping from the Flutter name (e.g. "enter") to the Windows name (e.g. - /// "RETURN"). - /// - /// Only populated if data is parsed from the source files, not if parsed from - /// JSON. - Map> _nameToWindowsName; - - - /// Parses entries from Androids Generic.kl scan code data file. - /// - /// Lines in this file look like this (without the ///): - /// key 100 ALT_RIGHT - /// # key 101 "KEY_LINEFEED" - /// - /// We parse the commented out lines as well as the non-commented lines, so so - /// that we can get names for all of the available scan codes, not just ones - /// defined for the generic profile. - /// - /// Also, note that some keys (notably MEDIA_EJECT) can be mapped to more than - /// one scan code, so the mapping can't just be 1:1, it has to be 1:many. - Map> _readAndroidScanCodes(String keyboardLayout) { - final RegExp keyEntry = RegExp(r'#?\s*key\s+([0-9]+)\s*"?(?:KEY_)?([0-9A-Z_]+|\(undefined\))"?\s*(FUNCTION)?'); - final Map> result = >{}; - keyboardLayout.replaceAllMapped(keyEntry, (Match match) { - if (match.group(3) == 'FUNCTION') { - // Skip odd duplicate Android FUNCTION keys (F1-F12 are already defined). - return ''; - } - final String name = match.group(2); - if (name == '(undefined)') { - // Skip undefined scan codes. - return ''; - } - final String androidName = match.group(2); - result[androidName] ??= []; - result[androidName].add(int.parse(match.group(1))); - return null; - }); - - return result; - } - - /// Parses entries from Android's keycodes.h key code data file. - /// - /// Lines in this file look like this (without the ///): - /// /** Left Control modifier key. */ - /// AKEYCODE_CTRL_LEFT = 113, - Map _readAndroidKeyCodes(String headerFile) { - final RegExp enumBlock = RegExp(r'enum\s*\{(.*)\};', multiLine: true); - // Eliminate everything outside of the enum block. - headerFile = headerFile.replaceAllMapped(enumBlock, (Match match) => match.group(1)); - final RegExp enumEntry = RegExp(r'AKEYCODE_([A-Z0-9_]+)\s*=\s*([0-9]+),?'); - final Map result = {}; - for (final Match match in enumEntry.allMatches(headerFile)) { - result[match.group(1)] = int.parse(match.group(2)); - } - return result; - } - - /// Parses entries from GLFW's keycodes.h key code data file. - /// - /// Lines in this file look like this (without the ///): - /// /** Space key. */ - /// #define GLFW_KEY_SPACE 32, - Map _readGlfwKeyCodes(String headerFile) { - // Only get the KEY definitions, ignore the rest (mouse, joystick, etc). - final RegExp definedCodes = RegExp(r'define GLFW_KEY_([A-Z0-9_]+)\s*([A-Z0-9_]+),?'); - final Map replaced = {}; - for (final Match match in definedCodes.allMatches(headerFile)) { - replaced[match.group(1)] = int.tryParse(match.group(2)) ?? match.group(2).replaceAll('GLFW_KEY_', ''); - } - final Map result = {}; - replaced.forEach((String key, dynamic value) { - // Some definition values point to other definitions (e.g #define GLFW_KEY_LAST GLFW_KEY_MENU). - if (value is String) { - result[key] = replaced[value] as int; - } else { - result[key] = value as int; - } - }); - return result; - } - - /// Parses entries from GTK's gdkkeysyms.h key code data file. - /// - /// Lines in this file look like this (without the ///): - /// /** Space key. */ - /// #define GDK_KEY_space 0x020 - Map _readGtkKeyCodes(String headerFile) { - final RegExp definedCodes = RegExp(r'#define GDK_KEY_([a-zA-Z0-9_]+)\s*0x([0-9a-f]+),?'); - final Map replaced = {}; - for (final Match match in definedCodes.allMatches(headerFile)) { - replaced[match.group(1)] = int.parse(match.group(2), radix: 16); - } - return replaced; - } - - Map _readWindowsKeyCodes(String headerFile) { - final RegExp definedCodes = RegExp(r'define VK_([A-Z0-9_]+)\s*([A-Z0-9_x]+),?'); - final Map replaced = {}; - for (final Match match in definedCodes.allMatches(headerFile)) { - replaced[match.group(1)] = int.tryParse(match.group(2)); - } - // The header doesn't explicitly define the [0-9] and [A-Z], but they mention that the range - // is equivalent to the ASCII value. - for (int i = 0x30; i <= 0x39; i++) { - replaced[String.fromCharCode(i)] = i; - } - for (int i = 0x41; i <= 0x5A; i++) { - replaced[String.fromCharCode(i)] = i; - } - return replaced; - } - - /// Parses entries from Chromium's HID code mapping header file. - /// - /// Lines in this file look like this (without the ///): - /// USB evdev XKB Win Mac Code Enum - /// DOM_CODE(0x000010, 0x0000, 0x0000, 0x0000, 0xffff, "Hyper", HYPER), - List _readHidEntries(String input) { - final List entries = []; - final RegExp usbMapRegExp = RegExp( - r'DOM_CODE\s*\(\s*0x([a-fA-F0-9]+),\s*0x([a-fA-F0-9]+),' - r'\s*0x([a-fA-F0-9]+),\s*0x([a-fA-F0-9]+),\s*0x([a-fA-F0-9]+),\s*"?([^\s]+?)"?,\s*([^\s]+?)\s*\)', - multiLine: true); - final RegExp commentRegExp = RegExp(r'//.*$', multiLine: true); - input = input.replaceAll(commentRegExp, ''); - input.replaceAllMapped(usbMapRegExp, (Match match) { - if (match != null) { - final int usbHidCode = getHex(match.group(1)); - final int macScanCode = getHex(match.group(5)); - final int linuxScanCode = getHex(match.group(2)); - final int xKbScanCode = getHex(match.group(3)); - final int windowsScanCode = getHex(match.group(4)); - final Key newEntry = Key( - usbHidCode: usbHidCode, - linuxScanCode: linuxScanCode == 0 ? null : linuxScanCode, - xKbScanCode: xKbScanCode == 0 ? null : xKbScanCode, - windowsScanCode: windowsScanCode == 0 ? null : windowsScanCode, - macOsScanCode: macScanCode == 0xffff ? null : macScanCode, - iosScanCode: (usbHidCode & 0x070000) == 0x070000 ? (usbHidCode ^ 0x070000) : null, - name: match.group(6) == 'NULL' ? null : match.group(6), - // The input data has a typo... - chromiumName: shoutingToLowerCamel(match.group(7)).replaceAll('Minimium', 'Minimum'), - ); - if (newEntry.chromiumName == 'none') { - newEntry.name = 'None'; - } - if (newEntry.name == 'IntlHash') { - // Skip key that is not actually generated by any keyboard. - return ''; - } - // Remove duplicates: last one wins, so that supplemental codes - // override. - entries.removeWhere((Key entry) => entry.usbHidCode == newEntry.usbHidCode); - entries.add(newEntry); - } - return match.group(0); - }); - return entries; - } -} - -/// A single entry in the key data structure. -/// -/// Can be read from JSON with the [Key.fromJsonMapEntry] constructor, or -/// written with the [toJson] method. -class Key { - /// Creates a single key entry from available data. - /// - /// The [usbHidCode] and [chromiumName] parameters must not be null. - Key({ - String enumName, - this.name, - @required this.usbHidCode, - this.linuxScanCode, - this.xKbScanCode, - this.windowsScanCode, - this.windowsKeyNames, - this.windowsKeyCodes, - this.macOsScanCode, - this.iosScanCode, - @required this.chromiumName, - this.androidKeyNames, - this.androidScanCodes, - this.androidKeyCodes, - this.glfwKeyNames, - this.glfwKeyCodes, - this.gtkKeyNames, - this.gtkKeyCodes, - }) : assert(usbHidCode != null), - assert(chromiumName != null), - _constantName = enumName; - - /// Populates the key from a JSON map. - factory Key.fromJsonMapEntry(String name, Map map) { - return Key( - enumName: name, - name: map['names']['domkey'] as String, - chromiumName: map['names']['chromium'] as String, - usbHidCode: map['scanCodes']['usb'] as int, - androidKeyNames: (map['names']['android'] as List)?.cast(), - androidScanCodes: (map['scanCodes']['android'] as List)?.cast(), - androidKeyCodes: (map['keyCodes']['android'] as List)?.cast(), - linuxScanCode: map['scanCodes']['linux'] as int, - xKbScanCode: map['scanCodes']['xkb'] as int, - windowsScanCode: map['scanCodes']['windows'] as int, - windowsKeyCodes: (map['keyCodes']['windows'] as List)?.cast(), - windowsKeyNames: (map['names']['windows'] as List)?.cast(), - macOsScanCode: map['scanCodes']['macos'] as int, - iosScanCode: map['scanCodes']['ios'] as int, - glfwKeyNames: (map['names']['glfw'] as List)?.cast(), - glfwKeyCodes: (map['keyCodes']['glfw'] as List)?.cast(), - gtkKeyNames: (map['names']['gtk'] as List)?.cast(), - gtkKeyCodes: (map['keyCodes']['gtk'] as List)?.cast(), - ); - } - - /// The USB HID code of the key - int usbHidCode; - - /// The Linux scan code of the key, from Chromium's header file. - int linuxScanCode; - /// The XKb scan code of the key from Chromium's header file. - int xKbScanCode; - /// The Windows scan code of the key from Chromium's header file. - int windowsScanCode; - /// The list of Windows key codes matching this key, created by looking up the - /// Windows name in the Chromium data, and substituting the Windows key code - /// value. - List windowsKeyCodes; - /// The list of names that Windows gives to this key (symbol names minus the - /// prefix). - List windowsKeyNames; - /// The macOS scan code of the key from Chromium's header file. - int macOsScanCode; - /// The iOS scan code of the key from UIKey's documentation (USB Hid table) - int iosScanCode; - /// The name of the key, mostly derived from the DomKey name in Chromium, - /// but where there was no DomKey representation, derived from the Chromium - /// symbol name. - String name; - /// The Chromium symbol name for the key. - String chromiumName; - /// The list of names that Android gives to this key (symbol names minus the - /// prefix). - List androidKeyNames; - /// The list of Android key codes matching this key, created by looking up the - /// Android name in the Chromium data, and substituting the Android key code - /// value. - List androidKeyCodes; - /// The list of Android scan codes matching this key, created by looking up - /// the Android name in the Chromium data, and substituting the Android scan - /// code value. - List androidScanCodes; - - /// The list of names that GFLW gives to this key (symbol names minus the - /// prefix). - List glfwKeyNames; - - /// The list of GLFW key codes matching this key, created by looking up the - /// Linux name in the Chromium data, and substituting the GLFW key code - /// value. - List glfwKeyCodes; - - /// The list of names that GTK gives to this key (symbol names minus the - /// prefix). - List gtkKeyNames; - - /// The list of GTK key codes matching this key, created by looking up the - /// Linux name in the GTK data, and substituting the GTK key code - /// value. - List gtkKeyCodes; - - /// Creates a JSON map from the key data. - Map toJson() { - return { - 'names': { - 'domkey': name, - 'android': androidKeyNames, - 'english': commentName, - 'chromium': chromiumName, - 'glfw': glfwKeyNames, - 'gtk': gtkKeyNames, - 'windows': windowsKeyNames, - }, - 'scanCodes': { - 'android': androidScanCodes, - 'usb': usbHidCode, - 'linux': linuxScanCode, - 'xkb': xKbScanCode, - 'windows': windowsScanCode, - 'macos': macOsScanCode, - 'ios': iosScanCode, - }, - 'keyCodes': >{ - 'android': androidKeyCodes, - 'glfw': glfwKeyCodes, - 'gtk': gtkKeyCodes, - 'windows': windowsKeyCodes, - }, - }; - } - - /// Returns the printable representation of this key, if any. - /// - /// If there is no printable representation, returns null. - String get keyLabel => printable[constantName]; - - int get flutterId { - if (printable.containsKey(constantName) && !constantName.startsWith('numpad')) { - return unicodePlane | (keyLabel.codeUnitAt(0) & valueMask); - } - return hidPlane | (usbHidCode & valueMask); - } - - static String getCommentName(String constantName) { - String upperCamel = lowerCamelToUpperCamel(constantName); - upperCamel = upperCamel.replaceAllMapped(RegExp(r'(Digit|Numpad|Lang|Button|Left|Right)([0-9]+)'), (Match match) => '${match.group(1)} ${match.group(2)}'); - return upperCamel.replaceAllMapped(RegExp(r'([A-Z])'), (Match match) => ' ${match.group(1)}').trim(); - } - - /// Gets the name of the key suitable for placing in comments. - /// - /// Takes the [constantName] and converts it from lower camel case to capitalized - /// separate words (e.g. "wakeUp" converts to "Wake Up"). - String get commentName => getCommentName(constantName); - - /// Gets the named used for the key constant in the definitions in - /// keyboard_keys.dart. - /// - /// If set by the constructor, returns the name set, but otherwise constructs - /// the name from the various different names available, making sure that the - /// name isn't a Dart reserved word (if it is, then it adds the word "Key" to - /// the end of the name). - String get constantName { - if (_constantName == null) { - String result; - if (name == null || name.isEmpty) { - // If it doesn't have a DomKey name then use the Chromium symbol name. - result = chromiumName; - } else { - result = upperCamelToLowerCamel(name); - } - if (kDartReservedWords.contains(result)) { - return '${result}Key'; - } - // Don't set enumName: we want it to regen each time if never set, but - // to stay set if set by the JSON loading. - return result; - } - return _constantName; - } - set constantName(String value) => _constantName = value; - String _constantName; - - @override - String toString() { - return """'$constantName': (name: "$name", usbHidCode: ${toHex(usbHidCode)}, """ - 'linuxScanCode: ${toHex(linuxScanCode)}, xKbScanCode: ${toHex(xKbScanCode)}, ' - 'windowsKeyCode: ${toHex(windowsScanCode)}, macOsScanCode: ${toHex(macOsScanCode)}, ' - 'windowsScanCode: ${toHex(windowsScanCode)}, chromiumSymbolName: $chromiumName ' - 'iOSScanCode: ${toHex(iosScanCode)})'; - } - - /// Returns the static map of printable representations. - static Map get printable { - if (_printable == null) { - final String printableKeys = File(path.join(flutterRoot.path, 'dev', 'tools', 'gen_keycodes', 'data', 'printable.json',)).readAsStringSync(); - final Map printable = json.decode(printableKeys) as Map; - _printable = printable.cast(); - } - return _printable; - } - static Map _printable; - - /// Returns the static map of synonym representations. - /// - /// These include synonyms for keys which don't have printable - /// representations, and appear in more than one place on the keyboard (e.g. - /// SHIFT, ALT, etc.). - static Map> get synonyms { - if (_synonym == null) { - final String synonymKeys = File(path.join(flutterRoot.path, 'dev', 'tools', 'gen_keycodes', 'data', 'synonyms.json',)).readAsStringSync(); - final Map synonym = json.decode(synonymKeys) as Map; - _synonym = synonym.cast>(); - } - return _synonym; - } - static Map> _synonym; - - /// Mask for the 32-bit value portion of the code. - static const int valueMask = 0x000FFFFFFFF; - - /// The code prefix for keys which have a Unicode representation. - static const int unicodePlane = 0x00000000000; - - /// The code prefix for keys which do not have a Unicode representation, but - /// do have a USB HID ID. - static const int hidPlane = 0x00100000000; - - /// The code prefix for pseudo-keys which represent collections of key synonyms. - static const int synonymPlane = 0x20000000000; -} diff --git a/dev/tools/gen_keycodes/lib/keyboard_keys_code_gen.dart b/dev/tools/gen_keycodes/lib/keyboard_keys_code_gen.dart index 0ff2ea32af..529e29485f 100644 --- a/dev/tools/gen_keycodes/lib/keyboard_keys_code_gen.dart +++ b/dev/tools/gen_keycodes/lib/keyboard_keys_code_gen.dart @@ -5,39 +5,40 @@ import 'package:path/path.dart' as path; import 'base_code_gen.dart'; -import 'key_data.dart'; +import 'constants.dart'; +import 'logical_key_data.dart'; +import 'physical_key_data.dart'; import 'utils.dart'; /// Given an [input] string, wraps the text at 80 characters and prepends each /// line with the [prefix] string. Use for generated comments. -String _wrapString(String input, {String prefix = ' /// '}) { - final int wrapWidth = 80 - prefix.length; - final StringBuffer result = StringBuffer(); - final List words = input.split(RegExp(r'\s+')); - String currentLine = words.removeAt(0); - for (final String word in words) { - if ((currentLine.length + word.length) < wrapWidth) { - currentLine += ' $word'; - } else { - result.writeln('$prefix$currentLine'); - currentLine = word; - } - } - if (currentLine.isNotEmpty) { - result.writeln('$prefix$currentLine'); - } - return result.toString(); +String _wrapString(String input) { + return wrapString(input, prefix: ' /// '); } -/// Generates the keyboard_keys.dart based on the information in the key data +class SynonymKeyInfo { + SynonymKeyInfo(this.keys, this.name); + + final List keys; + final String name; + + // Use the first item in the synonyms as a template for the ID to use. + // It won't end up being the same value because it'll be in the pseudo-key + // plane. + LogicalKeyEntry get primaryKey => keys[0]; + int get value => (primaryKey.value & ~kVariationMask) + kSynonymPlane; + String get constantName => upperCamelToLowerCamel(name); +} + +/// Generates the keyboard_key.dart based on the information in the key data /// structure given to it. class KeyboardKeysCodeGenerator extends BaseCodeGenerator { - KeyboardKeysCodeGenerator(KeyData keyData) : super(keyData); + KeyboardKeysCodeGenerator(PhysicalKeyData keyData, LogicalKeyData logicalData) : super(keyData, logicalData); /// Gets the generated definitions of PhysicalKeyboardKeys. String get _physicalDefinitions { final StringBuffer definitions = StringBuffer(); - for (final Key entry in keyData.data) { + for (final PhysicalKeyEntry entry in keyData.entries) { final String firstComment = _wrapString('Represents the location of the ' '"${entry.commentName}" key on a generalized keyboard.'); final String otherComments = _wrapString('See the function ' @@ -53,7 +54,7 @@ $otherComments static const PhysicalKeyboardKey ${entry.constantName} = Physica String get _physicalDebugNames { final StringBuffer result = StringBuffer(); - for (final Key entry in keyData.data) { + for (final PhysicalKeyEntry entry in keyData.entries) { result.write(''' ${toHex(entry.usbHidCode, digits: 8)}: '${entry.commentName}', '''); @@ -64,7 +65,7 @@ $otherComments static const PhysicalKeyboardKey ${entry.constantName} = Physica /// Gets the generated definitions of LogicalKeyboardKeys. String get _logicalDefinitions { final StringBuffer definitions = StringBuffer(); - void printKey(int flutterId, String constantName, String commentName, {String otherComments}) { + void printKey(int flutterId, String constantName, String commentName, {String? otherComments}) { final String firstComment = _wrapString('Represents the logical "$commentName" key on the keyboard.'); otherComments ??= _wrapString('See the function [RawKeyEvent.logicalKey] for more information.'); definitions.write(''' @@ -74,22 +75,20 @@ $otherComments static const LogicalKeyboardKey $constantName = LogicalKeyboardK '''); } - for (final Key entry in keyData.data) { + for (final LogicalKeyEntry entry in logicalData.entries) { printKey( - entry.flutterId, + entry.value, entry.constantName, entry.commentName, ); } - for (final String name in Key.synonyms.keys) { + for (final SynonymKeyInfo synonymInfo in synonyms) { // Use the first item in the synonyms as a template for the ID to use. // It won't end up being the same value because it'll be in the pseudo-key // plane. - final Key entry = keyData.data.firstWhere((Key item) => item.name == Key.synonyms[name][0]); - final Set unionNames = Key.synonyms[name].map((dynamic name) { - return upperCamelToLowerCamel(name as String); - }).toSet(); - printKey(Key.synonymPlane | entry.flutterId, name, Key.getCommentName(name), + final Set unionNames = synonymInfo.keys.map( + (LogicalKeyEntry entry) => entry.constantName).toSet(); + printKey(synonymInfo.value, synonymInfo.constantName, PhysicalKeyEntry.getCommentName(synonymInfo.name), otherComments: _wrapString('This key represents the union of the keys ' '$unionNames when comparing keys. This key will never be generated ' 'directly, its main use is in defining key maps.')); @@ -98,30 +97,26 @@ $otherComments static const LogicalKeyboardKey $constantName = LogicalKeyboardK } String get _logicalSynonyms { - final StringBuffer synonyms = StringBuffer(); - for (final String name in Key.synonyms.keys) { - for (final String synonym in Key.synonyms[name].cast()) { - final String keyName = upperCamelToLowerCamel(synonym); - synonyms.writeln(' $keyName: $name,'); + final StringBuffer result = StringBuffer(); + for (final SynonymKeyInfo synonymInfo in synonyms) { + for (final LogicalKeyEntry key in synonymInfo.keys) { + final String synonymName = upperCamelToLowerCamel(synonymInfo.name); + result.writeln(' ${key.constantName}: $synonymName,'); } } - return synonyms.toString(); + return result.toString(); } String get _logicalKeyLabels { final StringBuffer result = StringBuffer(); - for (final Key entry in keyData.data) { + for (final LogicalKeyEntry entry in logicalData.entries) { result.write(''' - ${toHex(entry.flutterId, digits: 11)}: '${entry.commentName}', + ${toHex(entry.value, digits: 11)}: '${entry.commentName}', '''); } - for (final String name in Key.synonyms.keys) { - // Use the first item in the synonyms as a template for the ID to use. - // It won't end up being the same value because it'll be in the pseudo-key - // plane. - final Key entry = keyData.data.firstWhere((Key item) => item.name == Key.synonyms[name][0]); + for (final SynonymKeyInfo synonymInfo in synonyms) { result.write(''' - ${toHex(Key.synonymPlane | entry.flutterId, digits: 11)}: '${Key.getCommentName(name)}', + ${toHex(synonymInfo.value)}: '${synonymInfo.name}', '''); } return result.toString(); @@ -130,7 +125,7 @@ $otherComments static const LogicalKeyboardKey $constantName = LogicalKeyboardK /// This generates the map of USB HID codes to physical keys. String get _predefinedHidCodeMap { final StringBuffer scanCodeMap = StringBuffer(); - for (final Key entry in keyData.data) { + for (final PhysicalKeyEntry entry in keyData.entries) { scanCodeMap.writeln(' ${toHex(entry.usbHidCode)}: ${entry.constantName},'); } return scanCodeMap.toString().trimRight(); @@ -139,35 +134,39 @@ $otherComments static const LogicalKeyboardKey $constantName = LogicalKeyboardK /// This generates the map of Flutter key codes to logical keys. String get _predefinedKeyCodeMap { final StringBuffer keyCodeMap = StringBuffer(); - for (final Key entry in keyData.data) { - keyCodeMap.writeln(' ${toHex(entry.flutterId, digits: 10)}: ${entry.constantName},'); + for (final LogicalKeyEntry entry in logicalData.entries) { + keyCodeMap.writeln(' ${toHex(entry.value, digits: 11)}: ${entry.constantName},'); } - for (final String entry in Key.synonyms.keys) { - // Use the first item in the synonyms as a template for the ID to use. - // It won't end up being the same value because it'll be in the pseudo-key - // plane. - final Key primaryKey = keyData.data.firstWhere((Key item) { - return item.name == Key.synonyms[entry][0]; - }, orElse: () => null); - assert(primaryKey != null); - keyCodeMap.writeln(' ${toHex(Key.synonymPlane | primaryKey.flutterId, digits: 10)}: $entry,'); + for (final SynonymKeyInfo synonymInfo in synonyms) { + keyCodeMap.writeln(' ${toHex(synonymInfo.value, digits: 11)}: ${synonymInfo.constantName},'); } return keyCodeMap.toString().trimRight(); } @override - String get templatePath => path.join(flutterRoot.path, 'dev', 'tools', 'gen_keycodes', 'data', 'keyboard_key.tmpl'); + String get templatePath => path.join(dataRoot, 'keyboard_key.tmpl'); @override Map mappings() { return { - 'PHYSICAL_KEY_MAP': _predefinedHidCodeMap, 'LOGICAL_KEY_MAP': _predefinedKeyCodeMap, 'LOGICAL_KEY_DEFINITIONS': _logicalDefinitions, 'LOGICAL_KEY_SYNONYMS': _logicalSynonyms, 'LOGICAL_KEY_KEY_LABELS': _logicalKeyLabels, + 'PHYSICAL_KEY_MAP': _predefinedHidCodeMap, 'PHYSICAL_KEY_DEFINITIONS': _physicalDefinitions, 'PHYSICAL_KEY_DEBUG_NAMES': _physicalDebugNames, }; } + + late final List synonyms = LogicalKeyData.synonyms.entries.map( + (MapEntry> synonymDefinition) { + final List entries = synonymDefinition.value.map( + (String name) => logicalData.entryByName(name)).toList(); + return SynonymKeyInfo( + entries, + synonymDefinition.key, + ); + } + ).toList(); } diff --git a/dev/tools/gen_keycodes/lib/keyboard_maps_code_gen.dart b/dev/tools/gen_keycodes/lib/keyboard_maps_code_gen.dart index b7b510ec1f..bdf44ce748 100644 --- a/dev/tools/gen_keycodes/lib/keyboard_maps_code_gen.dart +++ b/dev/tools/gen_keycodes/lib/keyboard_maps_code_gen.dart @@ -2,87 +2,101 @@ // 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:path/path.dart' as path; import 'base_code_gen.dart'; -import 'key_data.dart'; +import 'logical_key_data.dart'; +import 'physical_key_data.dart'; import 'utils.dart'; +bool _isAsciiLetter(String? char) { + if (char == null) + return false; + const int charUpperA = 0x41; + const int charUpperZ = 0x5A; + const int charLowerA = 0x61; + const int charLowerZ = 0x7A; + assert(char.length == 1); + final int charCode = char.codeUnitAt(0); + return (charCode >= charUpperA && charCode <= charUpperZ) + || (charCode >= charLowerA && charCode <= charLowerZ); +} /// Generates the keyboard_maps.dart files, based on the information in the key /// data structure given to it. class KeyboardMapsCodeGenerator extends BaseCodeGenerator { - KeyboardMapsCodeGenerator(KeyData keyData) : super(keyData); + KeyboardMapsCodeGenerator(PhysicalKeyData keyData, LogicalKeyData logicalData) + : super(keyData, logicalData); - List get numpadKeyData { - return keyData.data.where((Key entry) { - return entry.constantName.startsWith('numpad') && entry.keyLabel != null; + List get _numpadKeyData { + return keyData.entries.where((PhysicalKeyEntry entry) { + return entry.constantName.startsWith('numpad') && LogicalKeyData.printable.containsKey(entry.name); }).toList(); } - List get functionKeyData { + List get _functionKeyData { final RegExp functionKeyRe = RegExp(r'^f[0-9]+$'); - return keyData.data.where((Key entry) { + return keyData.entries.where((PhysicalKeyEntry entry) { return functionKeyRe.hasMatch(entry.constantName); }).toList(); } + List get _numpadLogicalKeyData { + return logicalData.entries.where((LogicalKeyEntry entry) { + return entry.constantName.startsWith('numpad') && LogicalKeyData.printable.containsKey(entry.name); + }).toList(); + } + /// This generates the map of GLFW number pad key codes to logical keys. - String get glfwNumpadMap { + String get _glfwNumpadMap { final StringBuffer glfwNumpadMap = StringBuffer(); - for (final Key entry in numpadKeyData) { - if (entry.glfwKeyCodes != null) { - for (final int code in entry.glfwKeyCodes.cast()) { - glfwNumpadMap.writeln(' $code: LogicalKeyboardKey.${entry.constantName},'); - } + for (final PhysicalKeyEntry entry in _numpadKeyData) { + for (final int code in entry.glfwKeyCodes) { + glfwNumpadMap.writeln(' $code: LogicalKeyboardKey.${entry.constantName},'); } } return glfwNumpadMap.toString().trimRight(); } /// This generates the map of GLFW key codes to logical keys. - String get glfwKeyCodeMap { + String get _glfwKeyCodeMap { final StringBuffer glfwKeyCodeMap = StringBuffer(); - for (final Key entry in keyData.data) { - if (entry.glfwKeyCodes != null) { - for (final int code in entry.glfwKeyCodes.cast()) { - glfwKeyCodeMap.writeln(' $code: LogicalKeyboardKey.${entry.constantName},'); - } + for (final PhysicalKeyEntry entry in keyData.entries) { + for (final int code in entry.glfwKeyCodes) { + glfwKeyCodeMap.writeln(' $code: LogicalKeyboardKey.${entry.constantName},'); } } return glfwKeyCodeMap.toString().trimRight(); } /// This generates the map of GTK number pad key codes to logical keys. - String get gtkNumpadMap { - final StringBuffer gtkNumpadMap = StringBuffer(); - for (final Key entry in numpadKeyData) { - if (entry.gtkKeyCodes != null) { - for (final int code in entry.gtkKeyCodes.cast()) { - gtkNumpadMap.writeln(' $code: LogicalKeyboardKey.${entry.constantName},'); - } + String get _gtkNumpadMap { + final OutputLines lines = OutputLines('GTK numpad map'); + for (final LogicalKeyEntry entry in _numpadLogicalKeyData) { + for (final int code in entry.gtkValues) { + lines.add(code, ' $code: LogicalKeyboardKey.${entry.constantName},'); } } - return gtkNumpadMap.toString().trimRight(); + return lines.sortedJoin().trimRight(); } /// This generates the map of GTK key codes to logical keys. - String get gtkKeyCodeMap { - final StringBuffer gtkKeyCodeMap = StringBuffer(); - for (final Key entry in keyData.data) { - if (entry.gtkKeyCodes != null) { - for (final int code in entry.gtkKeyCodes.cast()) { - gtkKeyCodeMap.writeln(' $code: LogicalKeyboardKey.${entry.constantName},'); - } + String get _gtkKeyCodeMap { + final OutputLines lines = OutputLines('GTK key code map'); + for (final LogicalKeyEntry entry in logicalData.entries) { + for (final int code in entry.gtkValues) { + lines.add(code, ' $code: LogicalKeyboardKey.${entry.constantName},'); } } - return gtkKeyCodeMap.toString().trimRight(); + return lines.sortedJoin().trimRight(); } /// This generates the map of XKB USB HID codes to physical keys. - String get xkbScanCodeMap { + String get _xkbScanCodeMap { final StringBuffer xkbScanCodeMap = StringBuffer(); - for (final Key entry in keyData.data) { + for (final PhysicalKeyEntry entry in keyData.entries) { if (entry.xKbScanCode != null) { xkbScanCodeMap.writeln(' ${toHex(entry.xKbScanCode)}: PhysicalKeyboardKey.${entry.constantName},'); } @@ -91,37 +105,33 @@ class KeyboardMapsCodeGenerator extends BaseCodeGenerator { } /// This generates the map of Android key codes to logical keys. - String get androidKeyCodeMap { - final StringBuffer androidKeyCodeMap = StringBuffer(); - for (final Key entry in keyData.data) { - if (entry.androidKeyCodes != null) { - for (final int code in entry.androidKeyCodes.cast()) { - androidKeyCodeMap.writeln(' $code: LogicalKeyboardKey.${entry.constantName},'); - } + String get _androidKeyCodeMap { + final OutputLines lines = OutputLines('Android key code map'); + for (final LogicalKeyEntry entry in logicalData.entries) { + for (final int code in entry.androidValues) { + lines.add(code, ' $code: LogicalKeyboardKey.${entry.constantName},'); } } - return androidKeyCodeMap.toString().trimRight(); + return lines.sortedJoin().trimRight(); } /// This generates the map of Android number pad key codes to logical keys. - String get androidNumpadMap { - final StringBuffer androidKeyCodeMap = StringBuffer(); - for (final Key entry in numpadKeyData) { - if (entry.androidKeyCodes != null) { - for (final int code in entry.androidKeyCodes.cast()) { - androidKeyCodeMap.writeln(' $code: LogicalKeyboardKey.${entry.constantName},'); - } + String get _androidNumpadMap { + final OutputLines lines = OutputLines('Android numpad map'); + for (final LogicalKeyEntry entry in _numpadLogicalKeyData) { + for (final int code in entry.androidValues) { + lines.add(code, ' $code: LogicalKeyboardKey.${entry.constantName},'); } } - return androidKeyCodeMap.toString().trimRight(); + return lines.sortedJoin().trimRight(); } /// This generates the map of Android scan codes to physical keys. - String get androidScanCodeMap { + String get _androidScanCodeMap { final StringBuffer androidScanCodeMap = StringBuffer(); - for (final Key entry in keyData.data) { + for (final PhysicalKeyEntry entry in keyData.entries) { if (entry.androidScanCodes != null) { - for (final int code in entry.androidScanCodes.cast()) { + for (final int code in entry.androidScanCodes) { androidScanCodeMap.writeln(' $code: PhysicalKeyboardKey.${entry.constantName},'); } } @@ -130,9 +140,9 @@ class KeyboardMapsCodeGenerator extends BaseCodeGenerator { } /// This generates the map of Windows scan codes to physical keys. - String get windowsScanCodeMap { + String get _windowsScanCodeMap { final StringBuffer windowsScanCodeMap = StringBuffer(); - for (final Key entry in keyData.data) { + for (final PhysicalKeyEntry entry in keyData.entries) { if (entry.windowsScanCode != null) { windowsScanCodeMap.writeln(' ${toHex(entry.windowsScanCode)}: PhysicalKeyboardKey.${entry.constantName},'); } @@ -141,35 +151,38 @@ class KeyboardMapsCodeGenerator extends BaseCodeGenerator { } /// This generates the map of Windows number pad key codes to logical keys. - String get windowsNumpadMap { - final StringBuffer windowsNumPadMap = StringBuffer(); - for (final Key entry in numpadKeyData) { - if (entry.windowsKeyCodes != null){ - for (final int code in entry.windowsKeyCodes) { - windowsNumPadMap.writeln(' $code: LogicalKeyboardKey.${entry.constantName},'); - } + String get _windowsNumpadMap { + final OutputLines lines = OutputLines('Windows numpad map'); + for (final LogicalKeyEntry entry in _numpadLogicalKeyData) { + for (final int code in entry.windowsValues) { + lines.add(code, ' $code: LogicalKeyboardKey.${entry.constantName},'); } } - return windowsNumPadMap.toString().trimRight(); + return lines.sortedJoin().trimRight(); } /// This generates the map of Windows key codes to logical keys. - String get windowsKeyCodeMap { - final StringBuffer windowsKeyCodeMap = StringBuffer(); - for (final Key entry in keyData.data) { - if (entry.windowsKeyCodes != null) { - for (final int code in entry.windowsKeyCodes) { - windowsKeyCodeMap.writeln(' $code: LogicalKeyboardKey.${entry.constantName},'); + String get _windowsKeyCodeMap { + final OutputLines lines = OutputLines('Windows key code map'); + for (final LogicalKeyEntry entry in logicalData.entries) { + // Letter keys on Windows are not recorded in logical_key_data.json, + // because they are not used by the embedding. Add them manually. + final List? keyCodes = entry.windowsValues.isNotEmpty + ? entry.windowsValues + : (_isAsciiLetter(entry.keyLabel) ? [entry.keyLabel!.toUpperCase().codeUnitAt(0)] : null); + if (keyCodes != null) { + for (final int code in keyCodes) { + lines.add(code, ' $code: LogicalKeyboardKey.${entry.constantName},'); } } } - return windowsKeyCodeMap.toString().trimRight(); + return lines.sortedJoin().trimRight(); } /// This generates the map of macOS key codes to physical keys. - String get macOsScanCodeMap { + String get _macOsScanCodeMap { final StringBuffer macOsScanCodeMap = StringBuffer(); - for (final Key entry in keyData.data) { + for (final PhysicalKeyEntry entry in keyData.entries) { if (entry.macOsScanCode != null) { macOsScanCodeMap.writeln(' ${toHex(entry.macOsScanCode)}: PhysicalKeyboardKey.${entry.constantName},'); } @@ -178,9 +191,9 @@ class KeyboardMapsCodeGenerator extends BaseCodeGenerator { } /// This generates the map of macOS number pad key codes to logical keys. - String get macOsNumpadMap { + String get _macOsNumpadMap { final StringBuffer macOsNumPadMap = StringBuffer(); - for (final Key entry in numpadKeyData) { + for (final PhysicalKeyEntry entry in _numpadKeyData) { if (entry.macOsScanCode != null) { macOsNumPadMap.writeln(' ${toHex(entry.macOsScanCode)}: LogicalKeyboardKey.${entry.constantName},'); } @@ -188,9 +201,9 @@ class KeyboardMapsCodeGenerator extends BaseCodeGenerator { return macOsNumPadMap.toString().trimRight(); } - String get macOsFunctionKeyMap { + String get _macOsFunctionKeyMap { final StringBuffer macOsFunctionKeyMap = StringBuffer(); - for (final Key entry in functionKeyData) { + for (final PhysicalKeyEntry entry in _functionKeyData) { if (entry.macOsScanCode != null) { macOsFunctionKeyMap.writeln(' ${toHex(entry.macOsScanCode)}: LogicalKeyboardKey.${entry.constantName},'); } @@ -198,43 +211,65 @@ class KeyboardMapsCodeGenerator extends BaseCodeGenerator { return macOsFunctionKeyMap.toString().trimRight(); } - /// This generates the map of iOS key codes to physical keys. - String get iosScanCodeMap { - final StringBuffer iosScanCodeMap = StringBuffer(); - for (final Key entry in keyData.data) { - if (entry.iosScanCode != null) { - iosScanCodeMap.writeln(' ${toHex(entry.iosScanCode)}: PhysicalKeyboardKey.${entry.constantName},'); + /// This generates the map of macOS key codes to physical keys. + String get _macOsKeyCodeMap { + final OutputLines lines = OutputLines('MacOS key code map'); + for (final LogicalKeyEntry entry in logicalData.entries) { + for (final int code in entry.macOsKeyCodeValues) { + lines.add(code, ' $code: LogicalKeyboardKey.${entry.constantName},'); } } - return iosScanCodeMap.toString().trimRight(); + return lines.sortedJoin().trimRight(); + } + + /// This generates the map of iOS key codes to physical keys. + String get _iosScanCodeMap { + final OutputLines lines = OutputLines('iOS scancode map'); + for (final PhysicalKeyEntry entry in keyData.entries) { + if (entry.iosScanCode != null) { + lines.add(entry.iosScanCode!, ' ${toHex(entry.iosScanCode)}: PhysicalKeyboardKey.${entry.constantName},'); + } + } + return lines.sortedJoin().trimRight(); } /// This generates the map of iOS number pad key codes to logical keys. - String get iosNumpadMap { - final StringBuffer iosNumPadMap = StringBuffer(); - for (final Key entry in numpadKeyData) { + String get _iosNumpadMap { + final OutputLines lines = OutputLines('iOS numpad map'); + for (final PhysicalKeyEntry entry in _numpadKeyData) { if (entry.iosScanCode != null) { - iosNumPadMap.writeln(' ${toHex(entry.iosScanCode)}: LogicalKeyboardKey.${entry.constantName},'); + lines.add(entry.iosScanCode!,' ${toHex(entry.iosScanCode)}: LogicalKeyboardKey.${entry.constantName},'); } } - return iosNumPadMap.toString().trimRight(); + return lines.sortedJoin().trimRight(); + } + + /// This generates the map of macOS key codes to physical keys. + String get _iosKeyCodeMap { + final OutputLines lines = OutputLines('iOS key code map'); + for (final LogicalKeyEntry entry in logicalData.entries) { + for (final int code in entry.iosKeyCodeValues) { + lines.add(code, ' $code: LogicalKeyboardKey.${entry.constantName},'); + } + } + return lines.sortedJoin().trimRight(); } /// This generates the map of Fuchsia key codes to logical keys. - String get fuchsiaKeyCodeMap { - final StringBuffer fuchsiaKeyCodeMap = StringBuffer(); - for (final Key entry in keyData.data) { - if (entry.usbHidCode != null) { - fuchsiaKeyCodeMap.writeln(' ${toHex(entry.flutterId)}: LogicalKeyboardKey.${entry.constantName},'); + String get _fuchsiaKeyCodeMap { + final OutputLines lines = OutputLines('Fuchsia key code map'); + for (final LogicalKeyEntry entry in logicalData.entries) { + for (final int value in entry.fuchsiaValues) { + lines.add(value, ' ${toHex(value)}: LogicalKeyboardKey.${entry.constantName},'); } } - return fuchsiaKeyCodeMap.toString().trimRight(); + return lines.sortedJoin().trimRight(); } /// This generates the map of Fuchsia USB HID codes to physical keys. - String get fuchsiaHidCodeMap { + String get _fuchsiaHidCodeMap { final StringBuffer fuchsiaScanCodeMap = StringBuffer(); - for (final Key entry in keyData.data) { + for (final PhysicalKeyEntry entry in keyData.entries) { if (entry.usbHidCode != null) { fuchsiaScanCodeMap.writeln(' ${toHex(entry.usbHidCode)}: PhysicalKeyboardKey.${entry.constantName},'); } @@ -243,20 +278,20 @@ class KeyboardMapsCodeGenerator extends BaseCodeGenerator { } /// This generates the map of Web KeyboardEvent codes to logical keys. - String get webLogicalKeyMap { - final StringBuffer result = StringBuffer(); - for (final Key entry in keyData.data) { - if (entry.name != null) { - result.writeln(" '${entry.name}': LogicalKeyboardKey.${entry.constantName},"); + String get _webLogicalKeyMap { + final OutputLines lines = OutputLines('Web logical key map'); + for (final LogicalKeyEntry entry in logicalData.entries) { + for (final String name in entry.webNames) { + lines.add(name, " '$name': LogicalKeyboardKey.${entry.constantName},"); } } - return result.toString().trimRight(); + return lines.sortedJoin().trimRight(); } /// This generates the map of Web KeyboardEvent codes to physical keys. - String get webPhysicalKeyMap { + String get _webPhysicalKeyMap { final StringBuffer result = StringBuffer(); - for (final Key entry in keyData.data) { + for (final PhysicalKeyEntry entry in keyData.entries) { if (entry.name != null) { result.writeln(" '${entry.name}': PhysicalKeyboardKey.${entry.constantName},"); } @@ -264,10 +299,9 @@ class KeyboardMapsCodeGenerator extends BaseCodeGenerator { return result.toString().trimRight(); } - /// This generates the map of Web number pad codes to logical keys. - String get webNumpadMap { + String get _webNumpadMap { final StringBuffer result = StringBuffer(); - for (final Key entry in numpadKeyData) { + for (final LogicalKeyEntry entry in _numpadLogicalKeyData) { if (entry.name != null) { result.writeln(" '${entry.name}': LogicalKeyboardKey.${entry.constantName},"); } @@ -275,33 +309,51 @@ class KeyboardMapsCodeGenerator extends BaseCodeGenerator { return result.toString().trimRight(); } + /// This generates the map of Web number pad codes to logical keys. + String get _webLocationMap { + final String jsonRaw = File(path.join(dataRoot, 'web_logical_location_mapping.json')).readAsStringSync(); + final Map> locationMap = parseMapOfListOfNullableString(jsonRaw); + final StringBuffer result = StringBuffer(); + locationMap.forEach((String key, List keyNames) { + final String keyStrings = keyNames.map((String? keyName) { + final String? constantName = keyName == null ? null : logicalData.entryByName(keyName).constantName; + return constantName != null ? 'LogicalKeyboardKey.$constantName' : 'null'; + }).join(', '); + result.writeln(" '$key': [$keyStrings],"); + }); + return result.toString().trimRight(); + } + @override - String get templatePath => path.join(flutterRoot.path, 'dev', 'tools', 'gen_keycodes', 'data', 'keyboard_maps.tmpl'); + String get templatePath => path.join(dataRoot, 'keyboard_maps.tmpl'); @override Map mappings() { return { - 'ANDROID_SCAN_CODE_MAP': androidScanCodeMap, - 'ANDROID_KEY_CODE_MAP': androidKeyCodeMap, - 'ANDROID_NUMPAD_MAP': androidNumpadMap, - 'FUCHSIA_SCAN_CODE_MAP': fuchsiaHidCodeMap, - 'FUCHSIA_KEY_CODE_MAP': fuchsiaKeyCodeMap, - 'MACOS_SCAN_CODE_MAP': macOsScanCodeMap, - 'MACOS_NUMPAD_MAP': macOsNumpadMap, - 'MACOS_FUNCTION_KEY_MAP': macOsFunctionKeyMap, - 'IOS_SCAN_CODE_MAP': iosScanCodeMap, - 'IOS_NUMPAD_MAP': iosNumpadMap, - 'GLFW_KEY_CODE_MAP': glfwKeyCodeMap, - 'GLFW_NUMPAD_MAP': glfwNumpadMap, - 'GTK_KEY_CODE_MAP': gtkKeyCodeMap, - 'GTK_NUMPAD_MAP': gtkNumpadMap, - 'XKB_SCAN_CODE_MAP': xkbScanCodeMap, - 'WEB_LOGICAL_KEY_MAP': webLogicalKeyMap, - 'WEB_PHYSICAL_KEY_MAP': webPhysicalKeyMap, - 'WEB_NUMPAD_MAP': webNumpadMap, - 'WINDOWS_LOGICAL_KEY_MAP': windowsKeyCodeMap, - 'WINDOWS_PHYSICAL_KEY_MAP': windowsScanCodeMap, - 'WINDOWS_NUMPAD_MAP': windowsNumpadMap, + 'ANDROID_SCAN_CODE_MAP': _androidScanCodeMap, + 'ANDROID_KEY_CODE_MAP': _androidKeyCodeMap, + 'ANDROID_NUMPAD_MAP': _androidNumpadMap, + 'FUCHSIA_SCAN_CODE_MAP': _fuchsiaHidCodeMap, + 'FUCHSIA_KEY_CODE_MAP': _fuchsiaKeyCodeMap, + 'MACOS_SCAN_CODE_MAP': _macOsScanCodeMap, + 'MACOS_NUMPAD_MAP': _macOsNumpadMap, + 'MACOS_FUNCTION_KEY_MAP': _macOsFunctionKeyMap, + 'MACOS_KEY_CODE_MAP': _macOsKeyCodeMap, + 'IOS_SCAN_CODE_MAP': _iosScanCodeMap, + 'IOS_NUMPAD_MAP': _iosNumpadMap, + 'IOS_KEY_CODE_MAP': _iosKeyCodeMap, + 'GLFW_KEY_CODE_MAP': _glfwKeyCodeMap, + 'GLFW_NUMPAD_MAP': _glfwNumpadMap, + 'GTK_KEY_CODE_MAP': _gtkKeyCodeMap, + 'GTK_NUMPAD_MAP': _gtkNumpadMap, + 'XKB_SCAN_CODE_MAP': _xkbScanCodeMap, + 'WEB_LOGICAL_KEY_MAP': _webLogicalKeyMap, + 'WEB_PHYSICAL_KEY_MAP': _webPhysicalKeyMap, + 'WEB_NUMPAD_MAP': _webNumpadMap, + 'WEB_LOCATION_MAP': _webLocationMap, + 'WINDOWS_LOGICAL_KEY_MAP': _windowsKeyCodeMap, + 'WINDOWS_PHYSICAL_KEY_MAP': _windowsScanCodeMap, + 'WINDOWS_NUMPAD_MAP': _windowsNumpadMap, }; } } diff --git a/dev/tools/gen_keycodes/lib/logical_key_data.dart b/dev/tools/gen_keycodes/lib/logical_key_data.dart new file mode 100644 index 0000000000..db5bfd367c --- /dev/null +++ b/dev/tools/gen_keycodes/lib/logical_key_data.dart @@ -0,0 +1,611 @@ +// 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:path/path.dart' as path; + +import 'package:gen_keycodes/utils.dart'; + +import 'constants.dart'; +import 'physical_key_data.dart'; + +bool _isControlCharacter(String label) { + if (label.length != 1) { + return false; + } + final int codeUnit = label.codeUnitAt(0); + return (codeUnit <= 0x1f && codeUnit >= 0x00) || (codeUnit >= 0x7f && codeUnit <= 0x9f); +} + +/// A pair of strings that represents left and right modifiers. +class _ModifierPair { + const _ModifierPair(this.left, this.right); + + final String left; + final String right; +} + +List _toNonEmptyArray(dynamic source) { + final List? dynamicNullableList = source as List?; + final List dynamicList = dynamicNullableList ?? []; + return dynamicList.cast(); +} + +/// The data structure used to manage keyboard key entries. +/// +/// The main constructor parses the given input data into the data structure. +/// +/// The data structure can be also loaded and saved to JSON, with the +/// [LogicalKeyData.fromJson] constructor and [toJson] method, respectively. +class LogicalKeyData { + factory LogicalKeyData( + String chromiumKeys, + String gtkKeyCodeHeader, + String gtkNameMap, + String windowsKeyCodeHeader, + String windowsNameMap, + String androidKeyCodeHeader, + String androidNameMap, + String macosLogicalToPhysical, + String iosLogicalToPhysical, + PhysicalKeyData physicalKeyData, + ) { + final Map data = {}; + _readKeyEntries(data, chromiumKeys); + _readWindowsKeyCodes(data, windowsKeyCodeHeader, parseMapOfListOfString(windowsNameMap)); + _readGtkKeyCodes(data, gtkKeyCodeHeader, parseMapOfListOfString(gtkNameMap)); + _readAndroidKeyCodes(data, androidKeyCodeHeader, parseMapOfListOfString(androidNameMap)); + _readMacOsKeyCodes(data, physicalKeyData, parseMapOfListOfString(macosLogicalToPhysical)); + _readIosKeyCodes(data, physicalKeyData, parseMapOfListOfString(iosLogicalToPhysical)); + _readFuchsiaKeyCodes(data, physicalKeyData); + // Sort entries by value + final List> sortedEntries = data.entries.toList()..sort( + (MapEntry a, MapEntry b) => + LogicalKeyEntry.compareByValue(a.value, b.value), + ); + data + ..clear() + ..addEntries(sortedEntries); + return LogicalKeyData._(data); + } + + /// Parses the given JSON data and populates the data structure from it. + factory LogicalKeyData.fromJson(Map contentMap) { + final Map data = {}; + data.addEntries(contentMap.values.map((dynamic value) { + final LogicalKeyEntry entry = LogicalKeyEntry.fromJsonMapEntry(value as Map); + return MapEntry(entry.name, entry); + })); + return LogicalKeyData._(data); + } + + /// Parses the input data given in from the various data source files, + /// populating the data structure. + /// + /// None of the parameters may be null. + LogicalKeyData._(this._data); + + /// Converts the data structure into a JSON structure that can be parsed by + /// [LogicalKeyData.fromJson]. + Map toJson() { + final Map outputMap = {}; + for (final LogicalKeyEntry entry in _data.values) { + outputMap[entry.name] = entry.toJson(); + } + return outputMap; + } + + /// Find an entry from name. + /// + /// Asserts if the name is not found. + LogicalKeyEntry entryByName(String name) { + assert(_data.containsKey(name), + 'Unable to find logical entry by name $name.'); + return _data[name]!; + } + + /// All entries. + Iterable get entries => _data.values; + + // Keys mapped from their names. + final Map _data; + + /// Parses entries from Chromium's key mapping header file. + /// + /// Lines in this file look like either of these (without the ///): + /// Key Enum Unicode code point + /// DOM_KEY_UNI("Backspace", BACKSPACE, 0x0008), + /// Key Enum Value + /// DOM_KEY_MAP("Accel", ACCEL, 0x0101), + /// + /// Flutter's supplemental_key_data.inc also has a new format + /// that uses a character as the 3rd argument. + /// Key Enum Character + /// DOM_KEY_UNI("KeyB", KEY_B, 'b'), + static void _readKeyEntries(Map data, String input) { + final Map unusedNumpad = Map.from(_printableToNumpads); + + final RegExp domKeyRegExp = RegExp( + r'DOM_KEY_(?UNI|MAP)\s*\(\s*' + r'"(?[^\s]+?)",\s*' + r'(?[^\s]+?),\s*' + r"(?:0[xX](?[a-fA-F0-9]+)|'(?.)')\s*" + r'\)', + // Multiline is necessary because some definitions spread across + // multiple lines. + multiLine: true, + ); + final RegExp commentRegExp = RegExp(r'//.*$', multiLine: true); + input = input.replaceAll(commentRegExp, ''); + for (final RegExpMatch match in domKeyRegExp.allMatches(input)) { + final String webName = match.namedGroup('name')!; + // ".AltGraphLatch" is consumed internally and not expressed to the Web. + if (webName.startsWith('.')) { + continue; + } + final String name = LogicalKeyEntry.computeName(webName.replaceAll(RegExp('[^A-Za-z0-9]'), '')); + final int value = match.namedGroup('unicode') != null ? + getHex(match.namedGroup('unicode')!) : + match.namedGroup('char')!.codeUnitAt(0); + final String? keyLabel = match.namedGroup('kind')! == 'UNI' ? String.fromCharCode(value) : null; + // If it's a modifier key, add left and right keys instead. + // Don't add web names and values; they're solved with locations. + if (_chromeModifiers.containsKey(name)) { + final _ModifierPair pair = _chromeModifiers[name]!; + data[pair.left] = LogicalKeyEntry.fromName( + value: value + kLeftModifierPlane, + name: pair.left, + keyLabel: null, // Modifier keys don't have keyLabels + )..webNames.add(pair.left) + ..webValues.add(value + kLeftModifierPlane); + data[pair.right] = LogicalKeyEntry.fromName( + value: value + kRightModifierPlane, + name: pair.right, + keyLabel: null, // Modifier keys don't have keyLabels + )..webNames.add(pair.right) + ..webValues.add(value + kRightModifierPlane); + continue; + } + + // If it has a numpad counterpart, also add the numpad key. + final String? char = value < 256 ? String.fromCharCode(value) : null; + if (char != null && _printableToNumpads.containsKey(char)) { + final String numpadName = _printableToNumpads[char]!; + data[numpadName] = LogicalKeyEntry.fromName( + value: char.codeUnitAt(0) + kNumpadPlane, + name: numpadName, + keyLabel: null, // Don't add keyLabel for numpad counterparts + )..webNames.add(numpadName) + ..webValues.add(char.codeUnitAt(0) + kNumpadPlane); + unusedNumpad.remove(char); + } + + data.putIfAbsent(name, () { + final bool isPrintable = (keyLabel != null && !_isControlCharacter(keyLabel)) + || printable.containsKey(name) + || value == 0; // "None" key + return LogicalKeyEntry.fromName( + value: value + (isPrintable ? kUnicodePlane : kUnprintablePlane), + name: name, + keyLabel: keyLabel, + )..webNames.add(webName) + ..webValues.add(value); + }); + } + + // Make sure every Numpad key that we care about has been defined. + unusedNumpad.forEach((String key, String value) { + print('Unuadded numpad key $value'); + }); + } + + static void _readMacOsKeyCodes( + Map data, + PhysicalKeyData physicalKeyData, + Map> logicalToPhysical, + ) { + final Map physicalToLogical = reverseMapOfListOfString(logicalToPhysical, + (String logicalKeyName, String physicalKeyName) { print('Duplicate logical key name $logicalKeyName for macOS'); }); + + physicalToLogical.forEach((String physicalKeyName, String logicalKeyName) { + final PhysicalKeyEntry physicalEntry = physicalKeyData.entryByName(physicalKeyName); + assert(physicalEntry.macOsScanCode != null, + 'Physical entry $physicalKeyName does not have a macOsScanCode.'); + final LogicalKeyEntry? logicalEntry = data[logicalKeyName]; + assert(logicalEntry != null, + 'Unable to find logical entry by name $logicalKeyName.'); + logicalEntry!.macOsKeyCodeNames.add(physicalEntry.name); + logicalEntry.macOsKeyCodeValues.add(physicalEntry.macOsScanCode!); + }); + } + + static void _readIosKeyCodes( + Map data, + PhysicalKeyData physicalKeyData, + Map> logicalToPhysical, + ) { + final Map physicalToLogical = reverseMapOfListOfString(logicalToPhysical, + (String logicalKeyName, String physicalKeyName) { print('Duplicate logical key name $logicalKeyName for iOS'); }); + + physicalToLogical.forEach((String physicalKeyName, String logicalKeyName) { + final PhysicalKeyEntry physicalEntry = physicalKeyData.entryByName(physicalKeyName); + assert(physicalEntry.iosScanCode != null, + 'Physical entry $physicalKeyName does not have an iosScanCode.'); + final LogicalKeyEntry? logicalEntry = data[logicalKeyName]; + assert(logicalEntry != null, + 'Unable to find logical entry by name $logicalKeyName.'); + logicalEntry!.iosKeyCodeNames.add(physicalEntry.name); + logicalEntry.iosKeyCodeValues.add(physicalEntry.iosScanCode!); + }); + } + + /// Parses entries from GTK's gdkkeysyms.h key code data file. + /// + /// Lines in this file look like this (without the ///): + /// /** Space key. */ + /// #define GDK_KEY_space 0x020 + static void _readGtkKeyCodes(Map data, String headerFile, Map> nameToGtkName) { + final RegExp definedCodes = RegExp( + r'#define ' + r'GDK_KEY_(?[a-zA-Z0-9_]+)\s*' + r'0x(?[0-9a-f]+),?', + ); + final Map gtkNameToFlutterName = reverseMapOfListOfString(nameToGtkName, + (String flutterName, String gtkName) { print('Duplicate GTK logical name $gtkName'); }); + + for (final RegExpMatch match in definedCodes.allMatches(headerFile)) { + final String gtkName = match.namedGroup('name')!; + final String? name = gtkNameToFlutterName[gtkName]; + final int value = int.parse(match.namedGroup('value')!, radix: 16); + if (name == null) { + // print('Unmapped GTK logical entry $gtkName'); + continue; + } + + final LogicalKeyEntry? entry = data[name]; + if (entry == null) { + print('Invalid logical entry by name $name (from GTK $gtkName)'); + continue; + } + entry + ..gtkNames.add(gtkName) + ..gtkValues.add(value); + } + } + + static void _readWindowsKeyCodes(Map data, String headerFile, Map> nameMap) { + // The mapping from the Flutter name (e.g. "enter") to the Windows name (e.g. + // "RETURN"). + final Map nameToFlutterName = reverseMapOfListOfString(nameMap, + (String flutterName, String windowsName) { print('Duplicate Windows logical name $windowsName'); }); + + final RegExp definedCodes = RegExp( + r'define ' + r'VK_(?[A-Z0-9_]+)\s*' + r'(?[A-Z0-9_x]+),?', + ); + for (final RegExpMatch match in definedCodes.allMatches(headerFile)) { + final String windowsName = match.namedGroup('name')!; + final String? name = nameToFlutterName[windowsName]; + final int value = int.tryParse(match.namedGroup('value')!)!; + if (name == null) { + print('Unmapped Windows logical entry $windowsName'); + continue; + } + final LogicalKeyEntry? entry = data[name]; + if (entry == null) { + print('Invalid logical entry by name $name (from Windows $windowsName)'); + continue; + } + addNameValue( + entry.windowsNames, + entry.windowsValues, + windowsName, + value, + ); + } + } + + /// Parses entries from Android's keycodes.h key code data file. + /// + /// Lines in this file look like this (without the ///): + /// /** Left Control modifier key. */ + /// AKEYCODE_CTRL_LEFT = 113, + static void _readAndroidKeyCodes(Map data, String headerFile, Map> nameMap) { + final Map nameToFlutterName = reverseMapOfListOfString(nameMap, + (String flutterName, String androidName) { print('Duplicate Android logical name $androidName'); }); + + final RegExp enumBlock = RegExp(r'enum\s*\{(.*)\};', multiLine: true); + // Eliminate everything outside of the enum block. + headerFile = headerFile.replaceAllMapped(enumBlock, (Match match) => match.group(1)!); + final RegExp enumEntry = RegExp( + r'AKEYCODE_(?[A-Z0-9_]+)\s*' + r'=\s*' + r'(?[0-9]+),?', + ); + for (final RegExpMatch match in enumEntry.allMatches(headerFile)) { + final String androidName = match.namedGroup('name')!; + final String? name = nameToFlutterName[androidName]; + final int value = int.tryParse(match.namedGroup('value')!)!; + if (name == null) { + print('Unmapped Android logical entry $androidName'); + continue; + } + final LogicalKeyEntry? entry = data[name]; + if (entry == null) { + print('Invalid logical entry by name $name (from Android $androidName)'); + continue; + } + entry + ..androidNames.add(androidName) + ..androidValues.add(value); + } + } + + static void _readFuchsiaKeyCodes(Map data, PhysicalKeyData physicalData) { + for (final LogicalKeyEntry entry in data.values) { + final int? value = (() { + if (entry.value == 0) // "None" key + return 0; + final String? keyLabel = printable[entry.constantName]; + if (keyLabel != null && !entry.constantName.startsWith('numpad')) { + return kUnicodePlane | (keyLabel.codeUnitAt(0) & kValueMask); + } else { + final PhysicalKeyEntry? physicalEntry = physicalData.tryEntryByName(entry.name); + if (physicalEntry != null) { + return kHidPlane | (physicalEntry.usbHidCode & kValueMask); + } + } + })(); + if (value != null) + entry.fuchsiaValues.add(value); + } + } + + // Map Web key to the pair of key names + static late final Map _chromeModifiers = () { + final String rawJson = File(path.join(dataRoot, 'chromium_modifiers.json',)).readAsStringSync(); + return (json.decode(rawJson) as Map).map((String key, dynamic value) { + final List pair = value as List; + return MapEntry(key, _ModifierPair(pair[0] as String, pair[1] as String)); + }); + }(); + + /// Returns the static map of printable representations. + static late final Map printable = ((){ + final String printableKeys = File(path.join(dataRoot, 'printable.json',)).readAsStringSync(); + return (json.decode(printableKeys) as Map) + .cast(); + })(); + + // Map printable to corresponding numpad key name + static late final Map _printableToNumpads = () { + final String rawJson = File(path.join(dataRoot, 'printable_to_numpads.json',)).readAsStringSync(); + return (json.decode(rawJson) as Map).map((String key, dynamic value) { + return MapEntry(key, value as String); + }); + }(); + + /// Returns the static map of synonym representations. + /// + /// These include synonyms for keys which don't have printable + /// representations, and appear in more than one place on the keyboard (e.g. + /// SHIFT, ALT, etc.). + static late final Map> synonyms = ((){ + final String synonymKeys = File(path.join(dataRoot, 'synonyms.json',)).readAsStringSync(); + final Map dynamicSynonym = json.decode(synonymKeys) as Map; + return dynamicSynonym.map((String name, dynamic values) { + // The keygen and algorithm of macOS relies on synonyms being pairs. + // See siblingKeyMap in macos_code_gen.dart. + final List names = (values as List).whereType().toList(); + assert(names.length == 2); + return MapEntry>(name, names); + }); + })(); +} + + +/// A single entry in the key data structure. +/// +/// Can be read from JSON with the [LogicalKeyEntry.fromJsonMapEntry] constructor, or +/// written with the [toJson] method. +class LogicalKeyEntry { + /// Creates a single key entry from available data. + LogicalKeyEntry({ + required this.value, + required this.name, + this.keyLabel, + }) : webNames = [], + webValues = [], + macOsKeyCodeNames = [], + macOsKeyCodeValues = [], + iosKeyCodeNames = [], + iosKeyCodeValues = [], + gtkNames = [], + gtkValues = [], + windowsNames = [], + windowsValues = [], + androidNames = [], + androidValues = [], + fuchsiaValues = []; + + LogicalKeyEntry.fromName({ + required int value, + required String name, + String? keyLabel, + }) : this( + value: value, + name: name, + keyLabel: keyLabel, + ); + + /// Populates the key from a JSON map. + LogicalKeyEntry.fromJsonMapEntry(Map map) + : value = map['value'] as int, + name = map['name'] as String, + webNames = _toNonEmptyArray(map['names']['web']), + webValues = _toNonEmptyArray(map['values']['web']), + macOsKeyCodeNames = _toNonEmptyArray(map['names']['macOs']), + macOsKeyCodeValues = _toNonEmptyArray(map['values']['macOs']), + iosKeyCodeNames = _toNonEmptyArray(map['names']['ios']), + iosKeyCodeValues = _toNonEmptyArray(map['values']['ios']), + gtkNames = _toNonEmptyArray(map['names']['gtk']), + gtkValues = _toNonEmptyArray(map['values']['gtk']), + windowsNames = _toNonEmptyArray(map['names']['windows']), + windowsValues = _toNonEmptyArray(map['values']['windows']), + androidNames = _toNonEmptyArray(map['names']['android']), + androidValues = _toNonEmptyArray(map['values']['android']), + fuchsiaValues = _toNonEmptyArray(map['values']['fuchsia']), + keyLabel = map['keyLabel'] as String?; + + final int value; + + final String name; + + /// The name of the key suitable for placing in comments. + String get commentName => computeCommentName(name); + + String get constantName => computeConstantName(commentName); + + /// The name of the key, mostly derived from the DomKey name in Chromium, + /// but where there was no DomKey representation, derived from the Chromium + /// symbol name. + final List webNames; + + /// The value of the key. + final List webValues; + + /// The names of the key codes that corresponds to this logical key on macOS, + /// created from the corresponding physical keys. + final List macOsKeyCodeNames; + + /// The key codes that corresponds to this logical key on macOS, created from + /// the physical key list substituted with the key mapping. + final List macOsKeyCodeValues; + + /// The names of the key codes that corresponds to this logical key on iOS, + /// created from the corresponding physical keys. + final List iosKeyCodeNames; + + /// The key codes that corresponds to this logical key on iOS, created from the + /// physical key list substituted with the key mapping. + final List iosKeyCodeValues; + + /// The list of names that GTK gives to this key (symbol names minus the + /// prefix). + final List gtkNames; + + /// The list of GTK key codes matching this key, created by looking up the + /// Linux name in the GTK data, and substituting the GTK key code + /// value. + final List gtkValues; + + /// The list of names that Windows gives to this key (symbol names minus the + /// prefix). + final List windowsNames; + + /// The list of Windows key codes matching this key, created by looking up the + /// Windows name in the Chromium data, and substituting the Windows key code + /// value. + final List windowsValues; + + /// The list of names that Android gives to this key (symbol names minus the + /// prefix). + final List androidNames; + + /// The list of Android key codes matching this key, created by looking up the + /// Android name in the Chromium data, and substituting the Android key code + /// value. + final List androidValues; + + final List fuchsiaValues; + + /// A string indicating the letter on the keycap of a letter key. + /// + /// This is only used to generate the key label mapping in keyboard_map.dart. + /// [LogicalKeyboardKey.keyLabel] uses a different definition and is generated + /// differently. + final String? keyLabel; + + /// Creates a JSON map from the key data. + Map toJson() { + return removeEmptyValues({ + 'name': name, + 'value': value, + 'keyLabel': keyLabel, + 'names': { + 'web': webNames, + 'macOs': macOsKeyCodeNames, + 'ios': iosKeyCodeNames, + 'gtk': gtkNames, + 'windows': windowsNames, + 'android': androidNames, + }, + 'values': >{ + 'web': webValues, + 'macOs': macOsKeyCodeValues, + 'ios': iosKeyCodeValues, + 'gtk': gtkValues, + 'windows': windowsValues, + 'android': androidValues, + 'fuchsia': fuchsiaValues, + }, + }); + } + + @override + String toString() { + return "'$name': (value: ${toHex(value)}) "; + } + + /// Gets the named used for the key constant in the definitions in + /// keyboard_key.dart. + /// + /// If set by the constructor, returns the name set, but otherwise constructs + /// the name from the various different names available, making sure that the + /// name isn't a Dart reserved word (if it is, then it adds the word "Key" to + /// the end of the name). + static String computeName(String rawName) { + final String result = rawName.replaceAll('PinP', 'PInP'); + if (kDartReservedWords.contains(result)) { + return '${result}Key'; + } + return result; + } + + /// Takes the [name] and converts it from lower camel case to capitalized + /// separate words (e.g. "wakeUp" converts to "Wake Up"). + static String computeCommentName(String name) { + final String replaced = name.replaceAllMapped( + RegExp(r'(Digit|Numpad|Lang|Button|Left|Right)([0-9]+)'), (Match match) => '${match.group(1)} ${match.group(2)}', + ); + return replaced + // 'fooBar' => 'foo Bar', 'fooBAR' => 'foo BAR' + .replaceAllMapped(RegExp(r'([^A-Z])([A-Z])'), (Match match) => '${match.group(1)} ${match.group(2)}') + // 'ABCDoo' => 'ABC Doo' + .replaceAllMapped(RegExp(r'([A-Z])([A-Z])([a-z])'), (Match match) => '${match.group(1)} ${match.group(2)}${match.group(3)}') + // 'AB1' => 'AB 1', 'F1' => 'F1' + .replaceAllMapped(RegExp(r'([A-Z]{2,})([0-9])'), (Match match) => '${match.group(1)} ${match.group(2)}') + // 'Foo1' => 'Foo 1' + .replaceAllMapped(RegExp(r'([a-z])([0-9])'), (Match match) => '${match.group(1)} ${match.group(2)}') + .trim(); + } + + static String computeConstantName(String commentName) { + // Convert the first word in the comment name. + final String lowerCamelSpace = commentName.replaceFirstMapped(RegExp(r'^[^ ]+'), + (Match match) => match[0]!.toLowerCase(), + ); + final String result = lowerCamelSpace.replaceAll(' ', ''); + if (kDartReservedWords.contains(result)) { + return '${result}Key'; + } + return result; + } + + static int compareByValue(LogicalKeyEntry a, LogicalKeyEntry b) => + a.value.compareTo(b.value); +} diff --git a/dev/tools/gen_keycodes/lib/macos_code_gen.dart b/dev/tools/gen_keycodes/lib/macos_code_gen.dart index 3af5f1ea9b..f2f7c8d718 100644 --- a/dev/tools/gen_keycodes/lib/macos_code_gen.dart +++ b/dev/tools/gen_keycodes/lib/macos_code_gen.dart @@ -5,52 +5,108 @@ import 'package:path/path.dart' as path; import 'base_code_gen.dart'; -import 'key_data.dart'; +import 'constants.dart'; +import 'logical_key_data.dart'; +import 'physical_key_data.dart'; import 'utils.dart'; +const List kModifiersOfInterest = [ + 'ShiftLeft', + 'ShiftRight', + 'ControlLeft', + 'ControlRight', + 'AltLeft', + 'AltRight', + 'MetaLeft', + 'MetaRight', +]; -/// Generates the key mapping of macOS, based on the information in the key +// The name of keys that require special attention. +const List kSpecialPhysicalKeys = ['CapsLock']; +const List kSpecialLogicalKeys = ['CapsLock']; + +String _toConstantVariableName(String variableName) { + return 'k${variableName[0].toUpperCase()}${variableName.substring(1)}'; +} + +/// Generates the key mapping for macOS, based on the information in the key /// data structure given to it. class MacOsCodeGenerator extends PlatformCodeGenerator { - MacOsCodeGenerator(KeyData keyData) : super(keyData); + MacOsCodeGenerator(PhysicalKeyData keyData, LogicalKeyData logicalData) + : super(keyData, logicalData); /// This generates the map of macOS key codes to physical keys. - String get _macOsScanCodeMap { - final StringBuffer macOsScanCodeMap = StringBuffer(); - for (final Key entry in keyData.data) { + String get _scanCodeMap { + final StringBuffer scanCodeMap = StringBuffer(); + for (final PhysicalKeyEntry entry in keyData.entries) { if (entry.macOsScanCode != null) { - macOsScanCodeMap.writeln(' { ${toHex(entry.macOsScanCode)}, ${toHex(entry.usbHidCode)} }, // ${entry.constantName}'); + scanCodeMap.writeln(' @${toHex(entry.macOsScanCode)} : @${toHex(entry.usbHidCode)}, // ${entry.constantName}'); } } - return macOsScanCodeMap.toString().trimRight(); + return scanCodeMap.toString().trimRight(); } - /// This generates the map of macOS number pad key codes to logical keys. - String get _macOsNumpadMap { - final StringBuffer macOsNumPadMap = StringBuffer(); - for (final Key entry in numpadKeyData) { - if (entry.macOsScanCode != null) { - macOsNumPadMap.writeln(' { ${toHex(entry.macOsScanCode)}, ${toHex(entry.flutterId, digits: 10)} }, // ${entry.constantName}'); - } + String get _keyCodeToLogicalMap { + final StringBuffer result = StringBuffer(); + for (final LogicalKeyEntry entry in logicalData.entries) { + zipStrict(entry.macOsKeyCodeValues, entry.macOsKeyCodeNames, (int macOsValue, String macOsName) { + result.writeln(' @${toHex(macOsValue)} : @${toHex(entry.value, digits: 10)}, // $macOsName'); + }); } - return macOsNumPadMap.toString().trimRight(); + return result.toString().trimRight(); } - String get _macOsFunctionKeyMap { - final StringBuffer macOsFunctionKeyMap = StringBuffer(); - for (final Key entry in functionKeyData) { - if (entry.macOsScanCode != null) { - macOsFunctionKeyMap.writeln(' { ${toHex(entry.macOsScanCode)}, ${toHex(entry.flutterId, digits: 10)} }, // ${entry.constantName}'); - } + /// This generates the mask values for the part of a key code that defines its plane. + String get _maskConstants { + final StringBuffer buffer = StringBuffer(); + for (final MaskConstant constant in maskConstants) { + buffer.writeln('/**'); + buffer.write(constant.description + .map((String line) => wrapString(line, prefix: ' * ')) + .join(' *\n')); + buffer.writeln(' */'); + buffer.writeln('const uint64_t ${_toConstantVariableName(constant.name)} = ${toHex(constant.value, digits: 11)};'); + buffer.writeln(''); } - return macOsFunctionKeyMap.toString().trimRight(); + return buffer.toString().trimRight(); + } + + /// This generates a map from the key code to a modifier flag. + String get _keyToModifierFlagMap { + final StringBuffer modifierKeyMap = StringBuffer(); + for (final String name in kModifiersOfInterest) { + modifierKeyMap.writeln(' @${toHex(logicalData.entryByName(name).macOsKeyCodeValues[0])} : @(kModifierFlag${lowerCamelToUpperCamel(name)}),'); + } + return modifierKeyMap.toString().trimRight(); + } + + /// This generates a map from the modifier flag to the key code. + String get _modifierFlagToKeyMap { + final StringBuffer modifierKeyMap = StringBuffer(); + for (final String name in kModifiersOfInterest) { + modifierKeyMap.writeln(' @(kModifierFlag${lowerCamelToUpperCamel(name)}) : @${toHex(logicalData.entryByName(name).macOsKeyCodeValues[0])},'); + } + return modifierKeyMap.toString().trimRight(); + } + + /// This generates some keys that needs special attention. + String get _specialKeyConstants { + final StringBuffer specialKeyConstants = StringBuffer(); + for (final String keyName in kSpecialPhysicalKeys) { + specialKeyConstants.writeln('const uint64_t k${keyName}PhysicalKey = ${toHex(keyData.entryByName(keyName).usbHidCode)};'); + } + for (final String keyName in kSpecialLogicalKeys) { + specialKeyConstants.writeln('const uint64_t k${lowerCamelToUpperCamel(keyName)}LogicalKey = ${toHex(logicalData.entryByName(keyName).value)};'); + } + return specialKeyConstants.toString().trimRight(); } @override - String get templatePath => path.join(flutterRoot.path, 'dev', 'tools', 'gen_keycodes', 'data', 'keyboard_map_macos_cc.tmpl'); + String get templatePath => path.join(dataRoot, 'macos_key_code_map_cc.tmpl'); @override - String outputPath(String platform) => path.joinAll([flutterRoot.path, '..', 'engine', 'src', 'flutter', 'shell', 'platform', 'darwin', platform, 'keycodes', 'keyboard_map_$platform.h']); + String outputPath(String platform) => path.join(PlatformCodeGenerator.engineRoot, + 'shell', 'platform', 'darwin', 'macos', 'framework', 'Source', 'KeyCodeMap.mm'); @override Map mappings() { @@ -58,9 +114,12 @@ class MacOsCodeGenerator extends PlatformCodeGenerator { // The LogicalKeyboardKey is generated by raw_keyboard_macos.dart from the unmodified characters // from NSEvent. return { - 'MACOS_SCAN_CODE_MAP': _macOsScanCodeMap, - 'MACOS_NUMPAD_MAP': _macOsNumpadMap, - 'MACOS_FUNCTION_KEY_MAP': _macOsFunctionKeyMap, + 'MACOS_SCAN_CODE_MAP': _scanCodeMap, + 'MACOS_KEYCODE_LOGICAL_MAP': _keyCodeToLogicalMap, + 'MASK_CONSTANTS': _maskConstants, + 'KEYCODE_TO_MODIFIER_FLAG_MAP': _keyToModifierFlagMap, + 'MODIFIER_FLAG_TO_KEYCODE_MAP': _modifierFlagToKeyMap, + 'SPECIAL_KEY_CONSTANTS': _specialKeyConstants, }; } } diff --git a/dev/tools/gen_keycodes/lib/physical_key_data.dart b/dev/tools/gen_keycodes/lib/physical_key_data.dart new file mode 100644 index 0000000000..f6a92623ae --- /dev/null +++ b/dev/tools/gen_keycodes/lib/physical_key_data.dart @@ -0,0 +1,390 @@ +// 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 'package:gen_keycodes/utils.dart'; + +/// The data structure used to manage keyboard key entries. +/// +/// The main constructor parses the given input data into the data structure. +/// +/// The data structure can be also loaded and saved to JSON, with the +/// [PhysicalKeyData.fromJson] constructor and [toJson] method, respectively. +class PhysicalKeyData { + factory PhysicalKeyData( + String chromiumHidCodes, + String androidKeyboardLayout, + String androidNameMap, + String glfwHeaderFile, + String glfwNameMap, + ) { + final Map> nameToAndroidScanCodes = _readAndroidScanCodes(androidKeyboardLayout, androidNameMap); + final Map> nameToGlfwKeyCodes = _readGlfwKeyCodes(glfwHeaderFile, glfwNameMap); + final Map data = _readHidEntries( + chromiumHidCodes, + nameToAndroidScanCodes, + nameToGlfwKeyCodes, + ); + final List> sortedEntries = data.entries.toList()..sort( + (MapEntry a, MapEntry b) => + PhysicalKeyEntry.compareByUsbHidCode(a.value, b.value), + ); + data + ..clear() + ..addEntries(sortedEntries); + return PhysicalKeyData._(data); + } + + /// Parses the given JSON data and populates the data structure from it. + factory PhysicalKeyData.fromJson(Map contentMap) { + final Map data = {}; + for (final MapEntry jsonEntry in contentMap.entries) { + final PhysicalKeyEntry entry = PhysicalKeyEntry.fromJsonMapEntry(jsonEntry.value as Map); + data[entry.name] = entry; + } + return PhysicalKeyData._(data); + } + + PhysicalKeyData._(this._data); + + /// Find an entry from name, or null if not found. + PhysicalKeyEntry? tryEntryByName(String name) { + return _data[name]; + } + + /// Find an entry from name. + /// + /// Asserts if the name is not found. + PhysicalKeyEntry entryByName(String name) { + final PhysicalKeyEntry? entry = tryEntryByName(name); + assert(entry != null, + 'Unable to find logical entry by name $name.'); + return entry!; + } + + /// All entries. + Iterable get entries => _data.values; + + // Keys mapped from their names. + final Map _data; + + /// Converts the data structure into a JSON structure that can be parsed by + /// [PhysicalKeyData.fromJson]. + Map toJson() { + final Map outputMap = {}; + for (final PhysicalKeyEntry entry in _data.values) { + outputMap[entry.name] = entry.toJson(); + } + return outputMap; + } + + /// Parses entries from Androids Generic.kl scan code data file. + /// + /// Lines in this file look like this (without the ///): + /// key 100 ALT_RIGHT + /// # key 101 "KEY_LINEFEED" + /// key 477 F12 FUNCTION + /// + /// We parse the commented out lines as well as the non-commented lines, so so + /// that we can get names for all of the available scan codes, not just ones + /// defined for the generic profile. + /// + /// Also, note that some keys (notably MEDIA_EJECT) can be mapped to more than + /// one scan code, so the mapping can't just be 1:1, it has to be 1:many. + static Map> _readAndroidScanCodes(String keyboardLayout, String nameMap) { + final RegExp keyEntry = RegExp( + r'#?\s*' // Optional comment mark + r'key\s+' // Literal "key" + r'(?[0-9]+)\s*' // ID section + r'"?(?:KEY_)?(?[0-9A-Z_]+|\(undefined\))"?\s*' // Name section + r'(?FUNCTION)?' // Optional literal "FUNCTION" + ); + final Map> androidNameToScanCodes = >{}; + for (final RegExpMatch match in keyEntry.allMatches(keyboardLayout)) { + if (match.namedGroup('function') == 'FUNCTION') { + // Skip odd duplicate Android FUNCTION keys (F1-F12 are already defined). + continue; + } + final String name = match.namedGroup('name')!; + if (name == '(undefined)') { + // Skip undefined scan codes. + continue; + } + androidNameToScanCodes.putIfAbsent(name, () => []) + .add(int.parse(match.namedGroup('id')!)); + } + + // Cast Android dom map + final Map> nameToAndroidNames = (json.decode(nameMap) as Map) + .cast>() + .map>((String key, List value) { + return MapEntry>(key, value.cast()); + }); + + final Map> result = nameToAndroidNames.map((String name, List androidNames) { + final Set scanCodes = {}; + for (final String androidName in androidNames) { + scanCodes.addAll(androidNameToScanCodes[androidName] ?? []); + } + return MapEntry>(name, scanCodes.toList()..sort()); + }); + + return result; + } + + /// Parses entries from GLFW's keycodes.h key code data file. + /// + /// Lines in this file look like this (without the ///): + /// /** Space key. */ + /// #define GLFW_KEY_SPACE 32, + /// #define GLFW_KEY_LAST GLFW_KEY_MENU + + static Map> _readGlfwKeyCodes(String headerFile, String nameMap) { + // Only get the KEY definitions, ignore the rest (mouse, joystick, etc). + final RegExp definedCodes = RegExp( + r'define\s+' + r'GLFW_KEY_(?[A-Z0-9_]+)\s+' + r'(?[A-Z0-9_]+),?', + ); + final Map replaced = {}; + for (final RegExpMatch match in definedCodes.allMatches(headerFile)) { + final String name = match.namedGroup('name')!; + final String value = match.namedGroup('value')!; + replaced[name] = int.tryParse(value) ?? value.replaceAll('GLFW_KEY_', ''); + } + final Map glfwNameToKeyCode = {}; + replaced.forEach((String key, dynamic value) { + // Some definition values point to other definitions (e.g #define GLFW_KEY_LAST GLFW_KEY_MENU). + if (value is String) { + glfwNameToKeyCode[key] = replaced[value] as int; + } else { + glfwNameToKeyCode[key] = value as int; + } + }); + + final Map> nameToGlfwNames = (json.decode(nameMap) as Map) + .cast>() + .map>((String key, List value) { + return MapEntry>(key, value.cast()); + }); + + final Map> result = nameToGlfwNames.map((String name, List glfwNames) { + final Set keyCodes = {}; + for (final String glfwName in glfwNames) { + if (glfwNameToKeyCode[glfwName] != null) + keyCodes.add(glfwNameToKeyCode[glfwName]!); + } + return MapEntry>(name, keyCodes.toList()..sort()); + }); + + return result; + } + + /// Parses entries from Chromium's HID code mapping header file. + /// + /// Lines in this file look like this (without the ///): + /// USB evdev XKB Win Mac Code Enum + /// DOM_CODE(0x000010, 0x0000, 0x0000, 0x0000, 0xffff, "Hyper", HYPER), + static Map _readHidEntries( + String input, + Map> nameToAndroidScanCodes, + Map> nameToGlfwKeyCodes, + ) { + final Map entries = {}; + final RegExp usbMapRegExp = RegExp( + r'DOM_CODE\s*\(\s*' + r'0[xX](?[a-fA-F0-9]+),\s*' + r'0[xX](?[a-fA-F0-9]+),\s*' + r'0[xX](?[a-fA-F0-9]+),\s*' + r'0[xX](?[a-fA-F0-9]+),\s*' + r'0[xX](?[a-fA-F0-9]+),\s*' + r'(?:"(?[^\s]+)")?[^")]*?,' + r'\s*(?[^\s]+?)\s*' + r'\)', + // Multiline is necessary because some definitions spread across + // multiple lines. + multiLine: true, + ); + final RegExp commentRegExp = RegExp(r'//.*$', multiLine: true); + input = input.replaceAll(commentRegExp, ''); + for (final RegExpMatch match in usbMapRegExp.allMatches(input)) { + final int usbHidCode = getHex(match.namedGroup('usb')!); + final int linuxScanCode = getHex(match.namedGroup('evdev')!); + final int xKbScanCode = getHex(match.namedGroup('xkb')!); + final int windowsScanCode = getHex(match.namedGroup('win')!); + final int macScanCode = getHex(match.namedGroup('mac')!); + final String? chromiumCode = match.namedGroup('code'); + // The input data has a typo... + final String enumName = match.namedGroup('enum')!.replaceAll('MINIMIUM', 'MINIMUM'); + + final String name = chromiumCode ?? shoutingToUpperCamel(enumName); + if (name == 'IntlHash') { + // Skip key that is not actually generated by any keyboard. + continue; + } + final PhysicalKeyEntry newEntry = PhysicalKeyEntry( + usbHidCode: usbHidCode, + androidScanCodes: nameToAndroidScanCodes[name] ?? [], + glfwKeyCodes: nameToGlfwKeyCodes[name] ?? [], + linuxScanCode: linuxScanCode == 0 ? null : linuxScanCode, + xKbScanCode: xKbScanCode == 0 ? null : xKbScanCode, + windowsScanCode: windowsScanCode == 0 ? null : windowsScanCode, + macOsScanCode: macScanCode == 0xffff ? null : macScanCode, + iosScanCode: (usbHidCode & 0x070000) == 0x070000 ? (usbHidCode ^ 0x070000) : null, + name: name, + chromiumCode: chromiumCode, + ); + // Remove duplicates: last one wins, so that supplemental codes + // override. + if (entries.containsKey(newEntry.usbHidCode)) { + // This is expected for Fn. Warn for other keys. + if (newEntry.name != 'Fn') { + print('Duplicate usbHidCode ${newEntry.usbHidCode} of key ${newEntry.name} ' + 'conflicts with existing ${entries[newEntry.usbHidCode]!.name}. Keeping the new one.'); + } + } + entries[newEntry.usbHidCode] = newEntry; + } + return entries.map((int code, PhysicalKeyEntry entry) => + MapEntry(entry.name, entry)); + } +} + +/// A single entry in the key data structure. +/// +/// Can be read from JSON with the [PhysicalKeyEntry.fromJsonMapEntry] constructor, or +/// written with the [toJson] method. +class PhysicalKeyEntry { + /// Creates a single key entry from available data. + /// + /// The [usbHidCode] and [chromiumName] parameters must not be null. + PhysicalKeyEntry({ + required this.usbHidCode, + required this.name, + required this.androidScanCodes, + required this.linuxScanCode, + required this.xKbScanCode, + required this.windowsScanCode, + required this.macOsScanCode, + required this.iosScanCode, + required this.chromiumCode, + required this.glfwKeyCodes, + }); + + /// Populates the key from a JSON map. + factory PhysicalKeyEntry.fromJsonMapEntry(Map map) { + return PhysicalKeyEntry( + name: map['names']['name'] as String, + chromiumCode: map['names']['chromium'] as String?, + usbHidCode: map['scanCodes']['usb'] as int, + androidScanCodes: (map['scanCodes']['android'] as List?)?.cast() ?? [], + linuxScanCode: map['scanCodes']['linux'] as int?, + xKbScanCode: map['scanCodes']['xkb'] as int?, + windowsScanCode: map['scanCodes']['windows'] as int?, + macOsScanCode: map['scanCodes']['macos'] as int?, + iosScanCode: map['scanCodes']['ios'] as int?, + glfwKeyCodes: (map['keyCodes']?['glfw'] as List?)?.cast() ?? [], + ); + } + + /// The USB HID code of the key + final int usbHidCode; + + /// The Linux scan code of the key, from Chromium's header file. + final int? linuxScanCode; + /// The XKb scan code of the key from Chromium's header file. + final int? xKbScanCode; + /// The Windows scan code of the key from Chromium's header file. + final int? windowsScanCode; + /// The macOS scan code of the key from Chromium's header file. + final int? macOsScanCode; + /// The iOS scan code of the key from UIKey's documentation (USB Hid table) + final int? iosScanCode; + /// The list of Android scan codes matching this key, created by looking up + /// the Android name in the Chromium data, and substituting the Android scan + /// code value. + final List androidScanCodes; + /// The list of GLFW key codes matching this key, created by looking up the + /// Linux name in the Chromium data, and substituting the GLFW key code + /// value. + final List glfwKeyCodes; + /// The name of the key, mostly derived from the DomKey name in Chromium, + /// but where there was no DomKey representation, derived from the Chromium + /// symbol name. + final String name; + /// The Chromium event code for the key. + final String? chromiumCode; + + /// Creates a JSON map from the key data. + Map toJson() { + return removeEmptyValues({ + 'names': { + 'name': name, + 'chromium': chromiumCode, + }, + 'scanCodes': { + 'android': androidScanCodes, + 'usb': usbHidCode, + 'linux': linuxScanCode, + 'xkb': xKbScanCode, + 'windows': windowsScanCode, + 'macos': macOsScanCode, + 'ios': iosScanCode, + }, + 'keyCodes': >{ + 'glfw': glfwKeyCodes, + }, + }); + } + + static String getCommentName(String constantName) { + String upperCamel = lowerCamelToUpperCamel(constantName); + upperCamel = upperCamel.replaceAllMapped( + RegExp(r'(Digit|Numpad|Lang|Button|Left|Right)([0-9]+)'), + (Match match) => '${match.group(1)} ${match.group(2)}', + ); + return upperCamel.replaceAllMapped(RegExp(r'([A-Z])'), (Match match) => ' ${match.group(1)}').trim(); + } + + /// Gets the name of the key suitable for placing in comments. + /// + /// Takes the [constantName] and converts it from lower camel case to capitalized + /// separate words (e.g. "wakeUp" converts to "Wake Up"). + String get commentName => getCommentName(constantName); + + /// Gets the named used for the key constant in the definitions in + /// keyboard_key.dart. + /// + /// If set by the constructor, returns the name set, but otherwise constructs + /// the name from the various different names available, making sure that the + /// name isn't a Dart reserved word (if it is, then it adds the word "Key" to + /// the end of the name). + late final String constantName = ((){ + String? result; + if (name.isEmpty) { + // If it doesn't have a DomKey name then use the Chromium symbol name. + result = chromiumCode; + } else { + result = upperCamelToLowerCamel(name); + } + result ??= 'Key${toHex(usbHidCode)}'; + if (kDartReservedWords.contains(result)) { + return '${result}Key'; + } + return result; + })(); + + @override + String toString() { + return """'$constantName': (name: "$name", usbHidCode: ${toHex(usbHidCode)}, """ + 'linuxScanCode: ${toHex(linuxScanCode)}, xKbScanCode: ${toHex(xKbScanCode)}, ' + 'windowsKeyCode: ${toHex(windowsScanCode)}, macOsScanCode: ${toHex(macOsScanCode)}, ' + 'windowsScanCode: ${toHex(windowsScanCode)}, chromiumSymbolName: $chromiumCode ' + 'iOSScanCode: ${toHex(iosScanCode)})'; + } + + static int compareByUsbHidCode(PhysicalKeyEntry a, PhysicalKeyEntry b) => + a.usbHidCode.compareTo(b.usbHidCode); +} diff --git a/dev/tools/gen_keycodes/lib/utils.dart b/dev/tools/gen_keycodes/lib/utils.dart index 95f990f031..7be65c6318 100644 --- a/dev/tools/gen_keycodes/lib/utils.dart +++ b/dev/tools/gen_keycodes/lib/utils.dart @@ -2,6 +2,7 @@ // 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:path/path.dart' as path; @@ -9,20 +10,27 @@ import 'package:path/path.dart' as path; /// The location of the Flutter root directory, based on the known location of /// this script. final Directory flutterRoot = Directory(path.dirname(Platform.script.toFilePath())).parent.parent.parent.parent; +final String dataRoot = path.join(flutterRoot.path, 'dev', 'tools', 'gen_keycodes', 'data'); -/// Converts `FOO_BAR` to `fooBar`. -String shoutingToLowerCamel(String shouting) { - final RegExp initialLetter = RegExp(r'_([^_])([^_]*)'); +/// Converts `FOO_BAR` to `FooBar`. +String shoutingToUpperCamel(String shouting) { + final RegExp initialLetter = RegExp(r'(?:_|^)([^_])([^_]*)'); final String snake = shouting.toLowerCase(); final String result = snake.replaceAllMapped(initialLetter, (Match match) { - return match.group(1).toUpperCase() + match.group(2).toLowerCase(); + return match.group(1)!.toUpperCase() + match.group(2)!.toLowerCase(); }); return result; } /// Converts 'FooBar' to 'fooBar'. +/// +/// 'TVFoo' should be convert to 'tvFoo'. +/// 'KeyX' should be convert to 'keyX'. String upperCamelToLowerCamel(String upperCamel) { - return upperCamel.substring(0, 1).toLowerCase() + upperCamel.substring(1); + final RegExp initialGroup = RegExp(r'^([A-Z]([A-Z]*|[^A-Z]*))([A-Z]([^A-Z]|$)|$)'); + return upperCamel.replaceFirstMapped(initialGroup, (Match match) { + return match.group(1)!.toLowerCase() + (match.group(3) ?? ''); + }); } /// Converts 'fooBar' to 'FooBar'. @@ -97,7 +105,7 @@ const List kDartReservedWords = [ ]; /// Converts an integer into a hex string with the given number of digits. -String toHex(int value, {int digits = 8}) { +String toHex(int? value, {int digits = 8}) { if (value == null) { return 'null'; } @@ -108,3 +116,137 @@ String toHex(int value, {int digits = 8}) { int getHex(String input) { return int.parse(input, radix: 16); } + +/// Given an [input] string, wraps the text at 80 characters and prepends each +/// line with the [prefix] string. Use for generated comments. +String wrapString(String input, {required String prefix}) { + final int wrapWidth = 80 - prefix.length; + final StringBuffer result = StringBuffer(); + final List words = input.split(RegExp(r'\s+')); + String currentLine = words.removeAt(0); + for (final String word in words) { + if ((currentLine.length + word.length) < wrapWidth) { + currentLine += ' $word'; + } else { + result.writeln('$prefix$currentLine'); + currentLine = word; + } + } + if (currentLine.isNotEmpty) { + result.writeln('$prefix$currentLine'); + } + return result.toString(); +} + +/// Run `fn` with each corresponding element from list1 and list2. +/// +/// If `list1` has a different length from `list2`, the execution is aborted +/// after printing an error. +/// +/// An null list is considered a list with length 0. +void zipStrict(Iterable list1, Iterable list2, void Function(T1, T2) fn) { + if (list1 == null && list2 == null) + return; + assert(list1.length == list2.length); + final Iterator it1 = list1.iterator; + final Iterator it2 = list2.iterator; + while (it1.moveNext()) { + it2.moveNext(); + fn(it1.current, it2.current); + } +} + +/// Read a Map out of its string representation in JSON. +Map parseMapOfString(String jsonString) { + return (json.decode(jsonString) as Map).cast(); +} + +/// Read a Map> out of its string representation in JSON. +Map> parseMapOfListOfString(String jsonString) { + final Map> dynamicMap = (json.decode(jsonString) as Map).cast>(); + return dynamicMap.map>((String key, List value) { + return MapEntry>(key, value.cast()); + }); +} + +Map> parseMapOfListOfNullableString(String jsonString) { + final Map> dynamicMap = (json.decode(jsonString) as Map).cast>(); + return dynamicMap.map>((String key, List value) { + return MapEntry>(key, value.cast()); + }); +} + +/// Reverse the map of { fromValue -> list of toValue } to { toValue -> fromValue } and return. +Map reverseMapOfListOfString(Map> inMap, void Function(String fromValue, String newToValue) onDuplicate) { + final Map result = {}; + inMap.forEach((String fromValue, List toValues) { + for (final String toValue in toValues) { + if (result.containsKey(toValue)) { + onDuplicate(fromValue, toValue); + continue; + } + result[toValue] = fromValue; + } + }); + return result; +} + +/// Remove entries whose value `isEmpty` or is null, and return the map. +/// +/// Will modify the input map. +Map removeEmptyValues(Map map) { + return map..removeWhere((String key, dynamic value) { + if (value == null) + return true; + if (value is Map) { + final Map regularizedMap = removeEmptyValues(value); + return regularizedMap.isEmpty; + } + if (value is Iterable) { + return value.isEmpty; + } + return false; + }); +} + +void addNameValue(List names, List values, String name, int value) { + final int foundIndex = values.indexOf(value); + if (foundIndex == -1) { + names.add(name); + values.add(value); + } else { + if (!RegExp(r'(^|, )abc1($|, )').hasMatch(name)) { + names[foundIndex] = '${names[foundIndex]}, $name'; + } + } +} + +/// A utility class to build join a number of lines in a sorted order. +/// +/// Use [add] to add a line and associate it with an index. Use [sortedJoin] to +/// get the joined string of these lines joined sorting them in the order of the +/// index. +class OutputLines> { + OutputLines(this.mapName); + + /// The name for this map. + /// + /// Used in warning messages. + final String mapName; + + final Map lines = {}; + + void add(T code, String line) { + if (lines.containsKey(code)) { + print('Warn: $mapName is requested to add line $code as:\n $line\n but it already exists as:\n ${lines[code]}'); + } + lines[code] = line; + } + + String sortedJoin() { + return (lines.entries.toList() + ..sort((MapEntry a, MapEntry b) => a.key.compareTo(b.key))) + .map((MapEntry entry) => entry.value) + .join('\n'); + } +} diff --git a/dev/tools/gen_keycodes/lib/web_code_gen.dart b/dev/tools/gen_keycodes/lib/web_code_gen.dart index 662af7a34d..c48e46e3eb 100644 --- a/dev/tools/gen_keycodes/lib/web_code_gen.dart +++ b/dev/tools/gen_keycodes/lib/web_code_gen.dart @@ -5,22 +5,27 @@ import 'package:path/path.dart' as path; import 'base_code_gen.dart'; -import 'key_data.dart'; +import 'logical_key_data.dart'; +import 'physical_key_data.dart'; import 'utils.dart'; - -/// Generates the key mapping of Web, based on the information in the key +/// Generates the key mapping for Web, based on the information in the key /// data structure given to it. class WebCodeGenerator extends PlatformCodeGenerator { - WebCodeGenerator(KeyData keyData) : super(keyData); + WebCodeGenerator( + PhysicalKeyData keyData, + LogicalKeyData logicalData, + String logicalLocationMap, + ) : _logicalLocationMap = parseMapOfListOfNullableString(logicalLocationMap), + super(keyData, logicalData); /// This generates the map of Web KeyboardEvent codes to logical key ids. String get _webLogicalKeyCodeMap { final StringBuffer result = StringBuffer(); - for (final Key entry in keyData.data) { - if (entry.name != null) { - result.writeln(" '${entry.name}': ${toHex(entry.flutterId, digits: 10)},"); - } + for (final LogicalKeyEntry entry in logicalData.entries) { + zipStrict(entry.webValues, entry.webNames, (int value, String name) { + result.writeln(" '$name': ${toHex(value, digits: 10)},"); + }); } return result.toString().trimRight(); } @@ -28,7 +33,7 @@ class WebCodeGenerator extends PlatformCodeGenerator { /// This generates the map of Web KeyboardEvent codes to physical key USB HID codes. String get _webPhysicalKeyCodeMap { final StringBuffer result = StringBuffer(); - for (final Key entry in keyData.data) { + for (final PhysicalKeyEntry entry in keyData.entries) { if (entry.name != null) { result.writeln(" '${entry.name}': ${toHex(entry.usbHidCode)},"); } @@ -37,28 +42,31 @@ class WebCodeGenerator extends PlatformCodeGenerator { } /// This generates the map of Web number pad codes to logical key ids. - String get _webNumpadCodeMap { + String get _webLogicalLocationMap { final StringBuffer result = StringBuffer(); - for (final Key entry in numpadKeyData) { - if (entry.name != null) { - result.writeln(" '${entry.name}': ${toHex(entry.flutterId, digits: 10)},"); - } - } + _logicalLocationMap.forEach((String webKey, List locations) { + final String valuesString = locations.map((String? value) { + return value == null ? 'null' : toHex(logicalData.entryByName(value).value, digits: 10); + }).join(', '); + result.writeln(" '$webKey': [$valuesString],"); + }); return result.toString().trimRight(); } + final Map> _logicalLocationMap; @override - String get templatePath => path.join(flutterRoot.path, 'dev', 'tools', 'gen_keycodes', 'data', 'keyboard_map_web.tmpl'); + String get templatePath => path.join(dataRoot, 'web_key_map_dart.tmpl'); @override - String outputPath(String platform) => path.join(flutterRoot.path, '..', 'engine', 'src', 'flutter', path.join('lib', 'web_ui', 'lib', 'src', 'engine', 'keycodes', 'keyboard_map_web.dart')); + String outputPath(String platform) => path.join(PlatformCodeGenerator.engineRoot, + 'lib', 'web_ui', 'lib', 'src', 'engine', 'key_map.dart'); @override Map mappings() { return { 'WEB_LOGICAL_KEY_CODE_MAP': _webLogicalKeyCodeMap, 'WEB_PHYSICAL_KEY_CODE_MAP': _webPhysicalKeyCodeMap, - 'WEB_NUMPAD_CODE_MAP': _webNumpadCodeMap, + 'WEB_LOGICAL_LOCATION_MAP': _webLogicalLocationMap, }; } } diff --git a/dev/tools/gen_keycodes/lib/windows_code_gen.dart b/dev/tools/gen_keycodes/lib/windows_code_gen.dart index a79a3c4c76..f8553c544c 100644 --- a/dev/tools/gen_keycodes/lib/windows_code_gen.dart +++ b/dev/tools/gen_keycodes/lib/windows_code_gen.dart @@ -5,59 +5,71 @@ import 'package:path/path.dart' as path; import 'base_code_gen.dart'; -import 'key_data.dart'; +import 'logical_key_data.dart'; +import 'physical_key_data.dart'; import 'utils.dart'; - -/// Generates the key mapping of Windows, based on the information in the key +/// Generates the key mapping for Windows, based on the information in the key /// data structure given to it. class WindowsCodeGenerator extends PlatformCodeGenerator { - WindowsCodeGenerator(KeyData keyData) : super(keyData); + WindowsCodeGenerator( + PhysicalKeyData keyData, + LogicalKeyData logicalData, + String scancodeToLogical, + ) : _scancodeToLogical = parseMapOfString(scancodeToLogical), + super(keyData, logicalData); /// This generates the map of Windows scan codes to physical keys. String get _windowsScanCodeMap { final StringBuffer windowsScanCodeMap = StringBuffer(); - for (final Key entry in keyData.data) { + for (final PhysicalKeyEntry entry in keyData.entries) { if (entry.windowsScanCode != null) { - windowsScanCodeMap.writeln(' { ${entry.windowsScanCode}, ${toHex(entry.usbHidCode)} }, // ${entry.constantName}'); + windowsScanCodeMap.writeln(' {${toHex(entry.windowsScanCode)}, ${toHex(entry.usbHidCode)}}, // ${entry.constantName}'); } } return windowsScanCodeMap.toString().trimRight(); } - /// This generates the map of Windows number pad key codes to logical keys. - String get _windowsNumpadMap { - final StringBuffer windowsNumPadMap = StringBuffer(); - for (final Key entry in numpadKeyData) { - if (entry.windowsScanCode != null) { - windowsNumPadMap.writeln(' { ${toHex(entry.windowsScanCode)}, ${toHex(entry.flutterId, digits: 10)} }, // ${entry.constantName}'); - } + /// This generates the map of Windows key codes to logical keys. + String get _windowsLogicalKeyCodeMap { + final StringBuffer result = StringBuffer(); + for (final LogicalKeyEntry entry in logicalData.entries) { + zipStrict(entry.windowsValues, entry.windowsNames, (int windowsValue, String windowsName) { + result.writeln(' {${toHex(windowsValue)}, ${toHex(entry.value, digits: 11)}}, // $windowsName'); + }); } - return windowsNumPadMap.toString().trimRight(); + return result.toString().trimRight(); } - /// This generates the map of Android key codes to logical keys. - String get _windowsKeyCodeMap { - final StringBuffer windowsKeyCodeMap = StringBuffer(); - for (final Key entry in keyData.data) { - if (entry.windowsKeyCodes != null) { - for (final int code in entry.windowsKeyCodes.cast()) { - windowsKeyCodeMap.writeln(' { $code, ${toHex(entry.flutterId, digits: 10)} }, // ${entry.constantName}'); - } - } - } - return windowsKeyCodeMap.toString().trimRight(); + /// This generates the map from scan code to logical keys. + /// + /// Normally logical keys should only be derived from key codes, but since some + /// key codes are either 0 or ambiguous (multiple keys using the same key + /// code), these keys are resolved by scan codes. + String get _scanCodeToLogicalMap { + final StringBuffer result = StringBuffer(); + _scancodeToLogical.forEach((String scanCodeName, String logicalName) { + final PhysicalKeyEntry physicalEntry = keyData.entryByName(scanCodeName); + final int logicalValue = logicalData.entryByName(logicalName).value; + result.writeln(' {${toHex(physicalEntry.windowsScanCode)}, ${toHex(logicalValue, digits: 10)}}, // ${physicalEntry.name}'); + }); + return result.toString().trimRight(); } + final Map _scancodeToLogical; @override - String get templatePath => path.join(flutterRoot.path, 'dev', 'tools', 'gen_keycodes', 'data', 'keyboard_map_windows_cc.tmpl'); + String get templatePath => path.join(dataRoot, 'windows_flutter_key_map_cc.tmpl'); + + @override + String outputPath(String platform) => path.join(PlatformCodeGenerator.engineRoot, + 'shell', 'platform', 'windows', 'flutter_key_map.cc'); @override Map mappings() { return { 'WINDOWS_SCAN_CODE_MAP': _windowsScanCodeMap, - 'WINDOWS_NUMPAD_MAP': _windowsNumpadMap, - 'WINDOWS_KEY_CODE_MAP': _windowsKeyCodeMap, + 'WINDOWS_SCAN_CODE_TO_LOGICAL_MAP': _scanCodeToLogicalMap, + 'WINDOWS_KEY_CODE_MAP': _windowsLogicalKeyCodeMap, }; } } diff --git a/dev/tools/gen_keycodes/pubspec.yaml b/dev/tools/gen_keycodes/pubspec.yaml index 7f068e1483..c1bd6d30b5 100644 --- a/dev/tools/gen_keycodes/pubspec.yaml +++ b/dev/tools/gen_keycodes/pubspec.yaml @@ -2,7 +2,7 @@ name: gen_keycodes description: Generates keycode source files from various resources. environment: - sdk: ">=2.2.2 <3.0.0" + sdk: ">=2.12.0-0 <3.0.0" dependencies: args: 2.1.0 diff --git a/packages/flutter/lib/src/services/keyboard_key.dart b/packages/flutter/lib/src/services/keyboard_key.dart index 6a5cdac01d..144740b168 100644 --- a/packages/flutter/lib/src/services/keyboard_key.dart +++ b/packages/flutter/lib/src/services/keyboard_key.dart @@ -148,7 +148,8 @@ class LogicalKeyboardKey extends KeyboardKey { // Equivalent to assert(divisorForValueMask == (1 << valueMaskWidth)). const int _firstDivisorWidth = 28; - assert(divisorForValueMask == (1 << _firstDivisorWidth) * (1 << (valueMaskWidth - _firstDivisorWidth))); + assert(divisorForValueMask == + (1 << _firstDivisorWidth) * (1 << (valueMaskWidth - _firstDivisorWidth))); // JS only supports up to 2^53 - 1, therefore non-value bits can only // contain (maxSafeIntegerWidth - valueMaskWidth) bits. @@ -364,77 +365,202 @@ class LogicalKeyboardKey extends KeyboardKey { /// Represents the logical "None" key on the keyboard. /// /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey none = LogicalKeyboardKey(0x00100000000); + static const LogicalKeyboardKey none = LogicalKeyboardKey(0x00000000000); - /// Represents the logical "Hyper" key on the keyboard. + /// Represents the logical "Space" key on the keyboard. /// /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey hyper = LogicalKeyboardKey(0x00100000010); + static const LogicalKeyboardKey space = LogicalKeyboardKey(0x00000000020); - /// Represents the logical "Super Key" key on the keyboard. + /// Represents the logical "Exclamation" key on the keyboard. /// /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey superKey = LogicalKeyboardKey(0x00100000011); + static const LogicalKeyboardKey exclamation = LogicalKeyboardKey(0x00000000021); - /// Represents the logical "Fn Lock" key on the keyboard. + /// Represents the logical "Quote" key on the keyboard. /// /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey fnLock = LogicalKeyboardKey(0x00100000013); + static const LogicalKeyboardKey quote = LogicalKeyboardKey(0x00000000022); - /// Represents the logical "Suspend" key on the keyboard. + /// Represents the logical "Number Sign" key on the keyboard. /// /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey suspend = LogicalKeyboardKey(0x00100000014); + static const LogicalKeyboardKey numberSign = LogicalKeyboardKey(0x00000000023); - /// Represents the logical "Resume" key on the keyboard. + /// Represents the logical "Dollar" key on the keyboard. /// /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey resume = LogicalKeyboardKey(0x00100000015); + static const LogicalKeyboardKey dollar = LogicalKeyboardKey(0x00000000024); - /// Represents the logical "Turbo" key on the keyboard. + /// Represents the logical "Percent" key on the keyboard. /// /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey turbo = LogicalKeyboardKey(0x00100000016); + static const LogicalKeyboardKey percent = LogicalKeyboardKey(0x00000000025); - /// Represents the logical "Privacy Screen Toggle" key on the keyboard. + /// Represents the logical "Ampersand" key on the keyboard. /// /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey privacyScreenToggle = LogicalKeyboardKey(0x00100000017); + static const LogicalKeyboardKey ampersand = LogicalKeyboardKey(0x00000000026); - /// Represents the logical "Sleep" key on the keyboard. + /// Represents the logical "Quote Single" key on the keyboard. /// /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey sleep = LogicalKeyboardKey(0x00100010082); + static const LogicalKeyboardKey quoteSingle = LogicalKeyboardKey(0x00000000027); - /// Represents the logical "Wake Up" key on the keyboard. + /// Represents the logical "Parenthesis Left" key on the keyboard. /// /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey wakeUp = LogicalKeyboardKey(0x00100010083); + static const LogicalKeyboardKey parenthesisLeft = LogicalKeyboardKey(0x00000000028); - /// Represents the logical "Display Toggle Int Ext" key on the keyboard. + /// Represents the logical "Parenthesis Right" key on the keyboard. /// /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey displayToggleIntExt = LogicalKeyboardKey(0x001000100b5); + static const LogicalKeyboardKey parenthesisRight = LogicalKeyboardKey(0x00000000029); - /// Represents the logical "Usb Reserved" key on the keyboard. + /// Represents the logical "Asterisk" key on the keyboard. /// /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey usbReserved = LogicalKeyboardKey(0x00100070000); + static const LogicalKeyboardKey asterisk = LogicalKeyboardKey(0x0000000002a); - /// Represents the logical "Usb Error Roll Over" key on the keyboard. + /// Represents the logical "Add" key on the keyboard. /// /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey usbErrorRollOver = LogicalKeyboardKey(0x00100070001); + static const LogicalKeyboardKey add = LogicalKeyboardKey(0x0000000002b); - /// Represents the logical "Usb Post Fail" key on the keyboard. + /// Represents the logical "Comma" key on the keyboard. /// /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey usbPostFail = LogicalKeyboardKey(0x00100070002); + static const LogicalKeyboardKey comma = LogicalKeyboardKey(0x0000000002c); - /// Represents the logical "Usb Error Undefined" key on the keyboard. + /// Represents the logical "Minus" key on the keyboard. /// /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey usbErrorUndefined = LogicalKeyboardKey(0x00100070003); + static const LogicalKeyboardKey minus = LogicalKeyboardKey(0x0000000002d); + + /// Represents the logical "Period" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey period = LogicalKeyboardKey(0x0000000002e); + + /// Represents the logical "Slash" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey slash = LogicalKeyboardKey(0x0000000002f); + + /// Represents the logical "Digit 0" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey digit0 = LogicalKeyboardKey(0x00000000030); + + /// Represents the logical "Digit 1" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey digit1 = LogicalKeyboardKey(0x00000000031); + + /// Represents the logical "Digit 2" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey digit2 = LogicalKeyboardKey(0x00000000032); + + /// Represents the logical "Digit 3" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey digit3 = LogicalKeyboardKey(0x00000000033); + + /// Represents the logical "Digit 4" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey digit4 = LogicalKeyboardKey(0x00000000034); + + /// Represents the logical "Digit 5" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey digit5 = LogicalKeyboardKey(0x00000000035); + + /// Represents the logical "Digit 6" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey digit6 = LogicalKeyboardKey(0x00000000036); + + /// Represents the logical "Digit 7" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey digit7 = LogicalKeyboardKey(0x00000000037); + + /// Represents the logical "Digit 8" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey digit8 = LogicalKeyboardKey(0x00000000038); + + /// Represents the logical "Digit 9" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey digit9 = LogicalKeyboardKey(0x00000000039); + + /// Represents the logical "Colon" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey colon = LogicalKeyboardKey(0x0000000003a); + + /// Represents the logical "Semicolon" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey semicolon = LogicalKeyboardKey(0x0000000003b); + + /// Represents the logical "Less" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey less = LogicalKeyboardKey(0x0000000003c); + + /// Represents the logical "Equal" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey equal = LogicalKeyboardKey(0x0000000003d); + + /// Represents the logical "Greater" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey greater = LogicalKeyboardKey(0x0000000003e); + + /// Represents the logical "Question" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey question = LogicalKeyboardKey(0x0000000003f); + + /// Represents the logical "At" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey at = LogicalKeyboardKey(0x00000000040); + + /// Represents the logical "Bracket Left" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey bracketLeft = LogicalKeyboardKey(0x0000000005b); + + /// Represents the logical "Backslash" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey backslash = LogicalKeyboardKey(0x0000000005c); + + /// Represents the logical "Bracket Right" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey bracketRight = LogicalKeyboardKey(0x0000000005d); + + /// Represents the logical "Caret" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey caret = LogicalKeyboardKey(0x0000000005e); + + /// Represents the logical "Underscore" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey underscore = LogicalKeyboardKey(0x0000000005f); + + /// Represents the logical "Backquote" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey backquote = LogicalKeyboardKey(0x00000000060); /// Represents the logical "Key A" key on the keyboard. /// @@ -566,1450 +692,2358 @@ class LogicalKeyboardKey extends KeyboardKey { /// See the function [RawKeyEvent.logicalKey] for more information. static const LogicalKeyboardKey keyZ = LogicalKeyboardKey(0x0000000007a); - /// Represents the logical "Digit 1" key on the keyboard. + /// Represents the logical "Brace Left" key on the keyboard. /// /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey digit1 = LogicalKeyboardKey(0x00000000031); + static const LogicalKeyboardKey braceLeft = LogicalKeyboardKey(0x0000000007b); - /// Represents the logical "Digit 2" key on the keyboard. + /// Represents the logical "Bar" key on the keyboard. /// /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey digit2 = LogicalKeyboardKey(0x00000000032); + static const LogicalKeyboardKey bar = LogicalKeyboardKey(0x0000000007c); - /// Represents the logical "Digit 3" key on the keyboard. + /// Represents the logical "Brace Right" key on the keyboard. /// /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey digit3 = LogicalKeyboardKey(0x00000000033); + static const LogicalKeyboardKey braceRight = LogicalKeyboardKey(0x0000000007d); - /// Represents the logical "Digit 4" key on the keyboard. + /// Represents the logical "Tilde" key on the keyboard. /// /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey digit4 = LogicalKeyboardKey(0x00000000034); + static const LogicalKeyboardKey tilde = LogicalKeyboardKey(0x0000000007e); - /// Represents the logical "Digit 5" key on the keyboard. + /// Represents the logical "Unidentified" key on the keyboard. /// /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey digit5 = LogicalKeyboardKey(0x00000000035); - - /// Represents the logical "Digit 6" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey digit6 = LogicalKeyboardKey(0x00000000036); - - /// Represents the logical "Digit 7" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey digit7 = LogicalKeyboardKey(0x00000000037); - - /// Represents the logical "Digit 8" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey digit8 = LogicalKeyboardKey(0x00000000038); - - /// Represents the logical "Digit 9" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey digit9 = LogicalKeyboardKey(0x00000000039); - - /// Represents the logical "Digit 0" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey digit0 = LogicalKeyboardKey(0x00000000030); - - /// Represents the logical "Enter" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey enter = LogicalKeyboardKey(0x00100070028); - - /// Represents the logical "Escape" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey escape = LogicalKeyboardKey(0x00100070029); + static const LogicalKeyboardKey unidentified = LogicalKeyboardKey(0x01000000001); /// Represents the logical "Backspace" key on the keyboard. /// /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey backspace = LogicalKeyboardKey(0x0010007002a); + static const LogicalKeyboardKey backspace = LogicalKeyboardKey(0x01000000008); /// Represents the logical "Tab" key on the keyboard. /// /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey tab = LogicalKeyboardKey(0x0010007002b); + static const LogicalKeyboardKey tab = LogicalKeyboardKey(0x01000000009); - /// Represents the logical "Space" key on the keyboard. + /// Represents the logical "Enter" key on the keyboard. /// /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey space = LogicalKeyboardKey(0x00000000020); + static const LogicalKeyboardKey enter = LogicalKeyboardKey(0x0100000000d); - /// Represents the logical "Minus" key on the keyboard. + /// Represents the logical "Escape" key on the keyboard. /// /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey minus = LogicalKeyboardKey(0x0000000002d); - - /// Represents the logical "Equal" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey equal = LogicalKeyboardKey(0x0000000003d); - - /// Represents the logical "Bracket Left" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey bracketLeft = LogicalKeyboardKey(0x0000000005b); - - /// Represents the logical "Bracket Right" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey bracketRight = LogicalKeyboardKey(0x0000000005d); - - /// Represents the logical "Backslash" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey backslash = LogicalKeyboardKey(0x0000000005c); - - /// Represents the logical "Semicolon" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey semicolon = LogicalKeyboardKey(0x0000000003b); - - /// Represents the logical "Quote" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey quote = LogicalKeyboardKey(0x00000000027); - - /// Represents the logical "Backquote" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey backquote = LogicalKeyboardKey(0x00000000060); - - /// Represents the logical "Comma" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey comma = LogicalKeyboardKey(0x0000000002c); - - /// Represents the logical "Period" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey period = LogicalKeyboardKey(0x0000000002e); - - /// Represents the logical "Slash" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey slash = LogicalKeyboardKey(0x0000000002f); - - /// Represents the logical "Caps Lock" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey capsLock = LogicalKeyboardKey(0x00100070039); - - /// Represents the logical "F1" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey f1 = LogicalKeyboardKey(0x0010007003a); - - /// Represents the logical "F2" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey f2 = LogicalKeyboardKey(0x0010007003b); - - /// Represents the logical "F3" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey f3 = LogicalKeyboardKey(0x0010007003c); - - /// Represents the logical "F4" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey f4 = LogicalKeyboardKey(0x0010007003d); - - /// Represents the logical "F5" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey f5 = LogicalKeyboardKey(0x0010007003e); - - /// Represents the logical "F6" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey f6 = LogicalKeyboardKey(0x0010007003f); - - /// Represents the logical "F7" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey f7 = LogicalKeyboardKey(0x00100070040); - - /// Represents the logical "F8" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey f8 = LogicalKeyboardKey(0x00100070041); - - /// Represents the logical "F9" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey f9 = LogicalKeyboardKey(0x00100070042); - - /// Represents the logical "F10" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey f10 = LogicalKeyboardKey(0x00100070043); - - /// Represents the logical "F11" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey f11 = LogicalKeyboardKey(0x00100070044); - - /// Represents the logical "F12" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey f12 = LogicalKeyboardKey(0x00100070045); - - /// Represents the logical "Print Screen" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey printScreen = LogicalKeyboardKey(0x00100070046); - - /// Represents the logical "Scroll Lock" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey scrollLock = LogicalKeyboardKey(0x00100070047); - - /// Represents the logical "Pause" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey pause = LogicalKeyboardKey(0x00100070048); - - /// Represents the logical "Insert" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey insert = LogicalKeyboardKey(0x00100070049); - - /// Represents the logical "Home" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey home = LogicalKeyboardKey(0x0010007004a); - - /// Represents the logical "Page Up" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey pageUp = LogicalKeyboardKey(0x0010007004b); + static const LogicalKeyboardKey escape = LogicalKeyboardKey(0x0100000001b); /// Represents the logical "Delete" key on the keyboard. /// /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey delete = LogicalKeyboardKey(0x0010007004c); + static const LogicalKeyboardKey delete = LogicalKeyboardKey(0x0100000007f); - /// Represents the logical "End" key on the keyboard. + /// Represents the logical "Accel" key on the keyboard. /// /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey end = LogicalKeyboardKey(0x0010007004d); + static const LogicalKeyboardKey accel = LogicalKeyboardKey(0x01000000101); - /// Represents the logical "Page Down" key on the keyboard. + /// Represents the logical "Alt Graph" key on the keyboard. /// /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey pageDown = LogicalKeyboardKey(0x0010007004e); + static const LogicalKeyboardKey altGraph = LogicalKeyboardKey(0x01000000103); - /// Represents the logical "Arrow Right" key on the keyboard. + /// Represents the logical "Caps Lock" key on the keyboard. /// /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey arrowRight = LogicalKeyboardKey(0x0010007004f); - - /// Represents the logical "Arrow Left" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey arrowLeft = LogicalKeyboardKey(0x00100070050); - - /// Represents the logical "Arrow Down" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey arrowDown = LogicalKeyboardKey(0x00100070051); - - /// Represents the logical "Arrow Up" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey arrowUp = LogicalKeyboardKey(0x00100070052); - - /// Represents the logical "Num Lock" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey numLock = LogicalKeyboardKey(0x00100070053); - - /// Represents the logical "Numpad Divide" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey numpadDivide = LogicalKeyboardKey(0x00100070054); - - /// Represents the logical "Numpad Multiply" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey numpadMultiply = LogicalKeyboardKey(0x00100070055); - - /// Represents the logical "Numpad Subtract" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey numpadSubtract = LogicalKeyboardKey(0x00100070056); - - /// Represents the logical "Numpad Add" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey numpadAdd = LogicalKeyboardKey(0x00100070057); - - /// Represents the logical "Numpad Enter" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey numpadEnter = LogicalKeyboardKey(0x00100070058); - - /// Represents the logical "Numpad 1" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey numpad1 = LogicalKeyboardKey(0x00100070059); - - /// Represents the logical "Numpad 2" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey numpad2 = LogicalKeyboardKey(0x0010007005a); - - /// Represents the logical "Numpad 3" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey numpad3 = LogicalKeyboardKey(0x0010007005b); - - /// Represents the logical "Numpad 4" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey numpad4 = LogicalKeyboardKey(0x0010007005c); - - /// Represents the logical "Numpad 5" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey numpad5 = LogicalKeyboardKey(0x0010007005d); - - /// Represents the logical "Numpad 6" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey numpad6 = LogicalKeyboardKey(0x0010007005e); - - /// Represents the logical "Numpad 7" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey numpad7 = LogicalKeyboardKey(0x0010007005f); - - /// Represents the logical "Numpad 8" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey numpad8 = LogicalKeyboardKey(0x00100070060); - - /// Represents the logical "Numpad 9" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey numpad9 = LogicalKeyboardKey(0x00100070061); - - /// Represents the logical "Numpad 0" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey numpad0 = LogicalKeyboardKey(0x00100070062); - - /// Represents the logical "Numpad Decimal" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey numpadDecimal = LogicalKeyboardKey(0x00100070063); - - /// Represents the logical "Intl Backslash" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey intlBackslash = LogicalKeyboardKey(0x00100070064); - - /// Represents the logical "Context Menu" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey contextMenu = LogicalKeyboardKey(0x00100070065); - - /// Represents the logical "Power" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey power = LogicalKeyboardKey(0x00100070066); - - /// Represents the logical "Numpad Equal" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey numpadEqual = LogicalKeyboardKey(0x00100070067); - - /// Represents the logical "F13" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey f13 = LogicalKeyboardKey(0x00100070068); - - /// Represents the logical "F14" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey f14 = LogicalKeyboardKey(0x00100070069); - - /// Represents the logical "F15" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey f15 = LogicalKeyboardKey(0x0010007006a); - - /// Represents the logical "F16" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey f16 = LogicalKeyboardKey(0x0010007006b); - - /// Represents the logical "F17" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey f17 = LogicalKeyboardKey(0x0010007006c); - - /// Represents the logical "F18" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey f18 = LogicalKeyboardKey(0x0010007006d); - - /// Represents the logical "F19" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey f19 = LogicalKeyboardKey(0x0010007006e); - - /// Represents the logical "F20" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey f20 = LogicalKeyboardKey(0x0010007006f); - - /// Represents the logical "F21" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey f21 = LogicalKeyboardKey(0x00100070070); - - /// Represents the logical "F22" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey f22 = LogicalKeyboardKey(0x00100070071); - - /// Represents the logical "F23" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey f23 = LogicalKeyboardKey(0x00100070072); - - /// Represents the logical "F24" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey f24 = LogicalKeyboardKey(0x00100070073); - - /// Represents the logical "Open" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey open = LogicalKeyboardKey(0x00100070074); - - /// Represents the logical "Help" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey help = LogicalKeyboardKey(0x00100070075); - - /// Represents the logical "Select" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey select = LogicalKeyboardKey(0x00100070077); - - /// Represents the logical "Again" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey again = LogicalKeyboardKey(0x00100070079); - - /// Represents the logical "Undo" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey undo = LogicalKeyboardKey(0x0010007007a); - - /// Represents the logical "Cut" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey cut = LogicalKeyboardKey(0x0010007007b); - - /// Represents the logical "Copy" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey copy = LogicalKeyboardKey(0x0010007007c); - - /// Represents the logical "Paste" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey paste = LogicalKeyboardKey(0x0010007007d); - - /// Represents the logical "Find" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey find = LogicalKeyboardKey(0x0010007007e); - - /// Represents the logical "Audio Volume Mute" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey audioVolumeMute = LogicalKeyboardKey(0x0010007007f); - - /// Represents the logical "Audio Volume Up" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey audioVolumeUp = LogicalKeyboardKey(0x00100070080); - - /// Represents the logical "Audio Volume Down" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey audioVolumeDown = LogicalKeyboardKey(0x00100070081); - - /// Represents the logical "Numpad Comma" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey numpadComma = LogicalKeyboardKey(0x00100070085); - - /// Represents the logical "Intl Ro" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey intlRo = LogicalKeyboardKey(0x00100070087); - - /// Represents the logical "Kana Mode" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey kanaMode = LogicalKeyboardKey(0x00100070088); - - /// Represents the logical "Intl Yen" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey intlYen = LogicalKeyboardKey(0x00100070089); - - /// Represents the logical "Convert" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey convert = LogicalKeyboardKey(0x0010007008a); - - /// Represents the logical "Non Convert" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey nonConvert = LogicalKeyboardKey(0x0010007008b); - - /// Represents the logical "Lang 1" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey lang1 = LogicalKeyboardKey(0x00100070090); - - /// Represents the logical "Lang 2" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey lang2 = LogicalKeyboardKey(0x00100070091); - - /// Represents the logical "Lang 3" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey lang3 = LogicalKeyboardKey(0x00100070092); - - /// Represents the logical "Lang 4" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey lang4 = LogicalKeyboardKey(0x00100070093); - - /// Represents the logical "Lang 5" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey lang5 = LogicalKeyboardKey(0x00100070094); - - /// Represents the logical "Abort" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey abort = LogicalKeyboardKey(0x0010007009b); - - /// Represents the logical "Props" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey props = LogicalKeyboardKey(0x001000700a3); - - /// Represents the logical "Numpad Paren Left" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey numpadParenLeft = LogicalKeyboardKey(0x001000700b6); - - /// Represents the logical "Numpad Paren Right" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey numpadParenRight = LogicalKeyboardKey(0x001000700b7); - - /// Represents the logical "Numpad Backspace" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey numpadBackspace = LogicalKeyboardKey(0x001000700bb); - - /// Represents the logical "Numpad Memory Store" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey numpadMemoryStore = LogicalKeyboardKey(0x001000700d0); - - /// Represents the logical "Numpad Memory Recall" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey numpadMemoryRecall = LogicalKeyboardKey(0x001000700d1); - - /// Represents the logical "Numpad Memory Clear" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey numpadMemoryClear = LogicalKeyboardKey(0x001000700d2); - - /// Represents the logical "Numpad Memory Add" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey numpadMemoryAdd = LogicalKeyboardKey(0x001000700d3); - - /// Represents the logical "Numpad Memory Subtract" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey numpadMemorySubtract = LogicalKeyboardKey(0x001000700d4); - - /// Represents the logical "Numpad Sign Change" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey numpadSignChange = LogicalKeyboardKey(0x001000700d7); - - /// Represents the logical "Numpad Clear" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey numpadClear = LogicalKeyboardKey(0x001000700d8); - - /// Represents the logical "Numpad Clear Entry" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey numpadClearEntry = LogicalKeyboardKey(0x001000700d9); - - /// Represents the logical "Control Left" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey controlLeft = LogicalKeyboardKey(0x001000700e0); - - /// Represents the logical "Shift Left" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey shiftLeft = LogicalKeyboardKey(0x001000700e1); - - /// Represents the logical "Alt Left" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey altLeft = LogicalKeyboardKey(0x001000700e2); - - /// Represents the logical "Meta Left" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey metaLeft = LogicalKeyboardKey(0x001000700e3); - - /// Represents the logical "Control Right" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey controlRight = LogicalKeyboardKey(0x001000700e4); - - /// Represents the logical "Shift Right" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey shiftRight = LogicalKeyboardKey(0x001000700e5); - - /// Represents the logical "Alt Right" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey altRight = LogicalKeyboardKey(0x001000700e6); - - /// Represents the logical "Meta Right" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey metaRight = LogicalKeyboardKey(0x001000700e7); - - /// Represents the logical "Info" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey info = LogicalKeyboardKey(0x001000c0060); - - /// Represents the logical "Closed Caption Toggle" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey closedCaptionToggle = LogicalKeyboardKey(0x001000c0061); - - /// Represents the logical "Brightness Up" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey brightnessUp = LogicalKeyboardKey(0x001000c006f); - - /// Represents the logical "Brightness Down" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey brightnessDown = LogicalKeyboardKey(0x001000c0070); - - /// Represents the logical "Brightness Toggle" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey brightnessToggle = LogicalKeyboardKey(0x001000c0072); - - /// Represents the logical "Brightness Minimum" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey brightnessMinimum = LogicalKeyboardKey(0x001000c0073); - - /// Represents the logical "Brightness Maximum" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey brightnessMaximum = LogicalKeyboardKey(0x001000c0074); - - /// Represents the logical "Brightness Auto" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey brightnessAuto = LogicalKeyboardKey(0x001000c0075); - - /// Represents the logical "Kbd Illum Up" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey kbdIllumUp = LogicalKeyboardKey(0x001000c0079); - - /// Represents the logical "Kbd Illum Down" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey kbdIllumDown = LogicalKeyboardKey(0x001000c007a); - - /// Represents the logical "Media Last" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey mediaLast = LogicalKeyboardKey(0x001000c0083); - - /// Represents the logical "Launch Phone" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey launchPhone = LogicalKeyboardKey(0x001000c008c); - - /// Represents the logical "Program Guide" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey programGuide = LogicalKeyboardKey(0x001000c008d); - - /// Represents the logical "Exit" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey exit = LogicalKeyboardKey(0x001000c0094); - - /// Represents the logical "Channel Up" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey channelUp = LogicalKeyboardKey(0x001000c009c); - - /// Represents the logical "Channel Down" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey channelDown = LogicalKeyboardKey(0x001000c009d); - - /// Represents the logical "Media Play" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey mediaPlay = LogicalKeyboardKey(0x001000c00b0); - - /// Represents the logical "Media Pause" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey mediaPause = LogicalKeyboardKey(0x001000c00b1); - - /// Represents the logical "Media Record" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey mediaRecord = LogicalKeyboardKey(0x001000c00b2); - - /// Represents the logical "Media Fast Forward" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey mediaFastForward = LogicalKeyboardKey(0x001000c00b3); - - /// Represents the logical "Media Rewind" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey mediaRewind = LogicalKeyboardKey(0x001000c00b4); - - /// Represents the logical "Media Track Next" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey mediaTrackNext = LogicalKeyboardKey(0x001000c00b5); - - /// Represents the logical "Media Track Previous" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey mediaTrackPrevious = LogicalKeyboardKey(0x001000c00b6); - - /// Represents the logical "Media Stop" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey mediaStop = LogicalKeyboardKey(0x001000c00b7); - - /// Represents the logical "Eject" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey eject = LogicalKeyboardKey(0x001000c00b8); - - /// Represents the logical "Media Play Pause" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey mediaPlayPause = LogicalKeyboardKey(0x001000c00cd); - - /// Represents the logical "Speech Input Toggle" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey speechInputToggle = LogicalKeyboardKey(0x001000c00cf); - - /// Represents the logical "Bass Boost" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey bassBoost = LogicalKeyboardKey(0x001000c00e5); - - /// Represents the logical "Media Select" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey mediaSelect = LogicalKeyboardKey(0x001000c0183); - - /// Represents the logical "Launch Word Processor" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey launchWordProcessor = LogicalKeyboardKey(0x001000c0184); - - /// Represents the logical "Launch Spreadsheet" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey launchSpreadsheet = LogicalKeyboardKey(0x001000c0186); - - /// Represents the logical "Launch Mail" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey launchMail = LogicalKeyboardKey(0x001000c018a); - - /// Represents the logical "Launch Contacts" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey launchContacts = LogicalKeyboardKey(0x001000c018d); - - /// Represents the logical "Launch Calendar" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey launchCalendar = LogicalKeyboardKey(0x001000c018e); - - /// Represents the logical "Launch App2" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey launchApp2 = LogicalKeyboardKey(0x001000c0192); - - /// Represents the logical "Launch App1" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey launchApp1 = LogicalKeyboardKey(0x001000c0194); - - /// Represents the logical "Launch Internet Browser" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey launchInternetBrowser = LogicalKeyboardKey(0x001000c0196); - - /// Represents the logical "Log Off" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey logOff = LogicalKeyboardKey(0x001000c019c); - - /// Represents the logical "Lock Screen" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey lockScreen = LogicalKeyboardKey(0x001000c019e); - - /// Represents the logical "Launch Control Panel" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey launchControlPanel = LogicalKeyboardKey(0x001000c019f); - - /// Represents the logical "Select Task" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey selectTask = LogicalKeyboardKey(0x001000c01a2); - - /// Represents the logical "Launch Documents" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey launchDocuments = LogicalKeyboardKey(0x001000c01a7); - - /// Represents the logical "Spell Check" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey spellCheck = LogicalKeyboardKey(0x001000c01ab); - - /// Represents the logical "Launch Keyboard Layout" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey launchKeyboardLayout = LogicalKeyboardKey(0x001000c01ae); - - /// Represents the logical "Launch Screen Saver" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey launchScreenSaver = LogicalKeyboardKey(0x001000c01b1); - - /// Represents the logical "Launch Assistant" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey launchAssistant = LogicalKeyboardKey(0x001000c01cb); - - /// Represents the logical "Launch Audio Browser" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey launchAudioBrowser = LogicalKeyboardKey(0x001000c01b7); - - /// Represents the logical "New Key" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey newKey = LogicalKeyboardKey(0x001000c0201); - - /// Represents the logical "Close" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey close = LogicalKeyboardKey(0x001000c0203); - - /// Represents the logical "Save" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey save = LogicalKeyboardKey(0x001000c0207); - - /// Represents the logical "Print" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey print = LogicalKeyboardKey(0x001000c0208); - - /// Represents the logical "Browser Search" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey browserSearch = LogicalKeyboardKey(0x001000c0221); - - /// Represents the logical "Browser Home" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey browserHome = LogicalKeyboardKey(0x001000c0223); - - /// Represents the logical "Browser Back" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey browserBack = LogicalKeyboardKey(0x001000c0224); - - /// Represents the logical "Browser Forward" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey browserForward = LogicalKeyboardKey(0x001000c0225); - - /// Represents the logical "Browser Stop" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey browserStop = LogicalKeyboardKey(0x001000c0226); - - /// Represents the logical "Browser Refresh" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey browserRefresh = LogicalKeyboardKey(0x001000c0227); - - /// Represents the logical "Browser Favorites" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey browserFavorites = LogicalKeyboardKey(0x001000c022a); - - /// Represents the logical "Zoom In" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey zoomIn = LogicalKeyboardKey(0x001000c022d); - - /// Represents the logical "Zoom Out" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey zoomOut = LogicalKeyboardKey(0x001000c022e); - - /// Represents the logical "Zoom Toggle" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey zoomToggle = LogicalKeyboardKey(0x001000c0232); - - /// Represents the logical "Redo" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey redo = LogicalKeyboardKey(0x001000c0279); - - /// Represents the logical "Mail Reply" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey mailReply = LogicalKeyboardKey(0x001000c0289); - - /// Represents the logical "Mail Forward" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey mailForward = LogicalKeyboardKey(0x001000c028b); - - /// Represents the logical "Mail Send" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey mailSend = LogicalKeyboardKey(0x001000c028c); - - /// Represents the logical "Keyboard Layout Select" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey keyboardLayoutSelect = LogicalKeyboardKey(0x001000c029d); - - /// Represents the logical "Show All Windows" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey showAllWindows = LogicalKeyboardKey(0x001000c029f); - - /// Represents the logical "Game Button 1" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey gameButton1 = LogicalKeyboardKey(0x0010005ff01); - - /// Represents the logical "Game Button 2" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey gameButton2 = LogicalKeyboardKey(0x0010005ff02); - - /// Represents the logical "Game Button 3" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey gameButton3 = LogicalKeyboardKey(0x0010005ff03); - - /// Represents the logical "Game Button 4" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey gameButton4 = LogicalKeyboardKey(0x0010005ff04); - - /// Represents the logical "Game Button 5" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey gameButton5 = LogicalKeyboardKey(0x0010005ff05); - - /// Represents the logical "Game Button 6" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey gameButton6 = LogicalKeyboardKey(0x0010005ff06); - - /// Represents the logical "Game Button 7" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey gameButton7 = LogicalKeyboardKey(0x0010005ff07); - - /// Represents the logical "Game Button 8" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey gameButton8 = LogicalKeyboardKey(0x0010005ff08); - - /// Represents the logical "Game Button 9" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey gameButton9 = LogicalKeyboardKey(0x0010005ff09); - - /// Represents the logical "Game Button 10" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey gameButton10 = LogicalKeyboardKey(0x0010005ff0a); - - /// Represents the logical "Game Button 11" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey gameButton11 = LogicalKeyboardKey(0x0010005ff0b); - - /// Represents the logical "Game Button 12" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey gameButton12 = LogicalKeyboardKey(0x0010005ff0c); - - /// Represents the logical "Game Button 13" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey gameButton13 = LogicalKeyboardKey(0x0010005ff0d); - - /// Represents the logical "Game Button 14" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey gameButton14 = LogicalKeyboardKey(0x0010005ff0e); - - /// Represents the logical "Game Button 15" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey gameButton15 = LogicalKeyboardKey(0x0010005ff0f); - - /// Represents the logical "Game Button 16" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey gameButton16 = LogicalKeyboardKey(0x0010005ff10); - - /// Represents the logical "Game Button A" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey gameButtonA = LogicalKeyboardKey(0x0010005ff11); - - /// Represents the logical "Game Button B" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey gameButtonB = LogicalKeyboardKey(0x0010005ff12); - - /// Represents the logical "Game Button C" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey gameButtonC = LogicalKeyboardKey(0x0010005ff13); - - /// Represents the logical "Game Button Left 1" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey gameButtonLeft1 = LogicalKeyboardKey(0x0010005ff14); - - /// Represents the logical "Game Button Left 2" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey gameButtonLeft2 = LogicalKeyboardKey(0x0010005ff15); - - /// Represents the logical "Game Button Mode" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey gameButtonMode = LogicalKeyboardKey(0x0010005ff16); - - /// Represents the logical "Game Button Right 1" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey gameButtonRight1 = LogicalKeyboardKey(0x0010005ff17); - - /// Represents the logical "Game Button Right 2" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey gameButtonRight2 = LogicalKeyboardKey(0x0010005ff18); - - /// Represents the logical "Game Button Select" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey gameButtonSelect = LogicalKeyboardKey(0x0010005ff19); - - /// Represents the logical "Game Button Start" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey gameButtonStart = LogicalKeyboardKey(0x0010005ff1a); - - /// Represents the logical "Game Button Thumb Left" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey gameButtonThumbLeft = LogicalKeyboardKey(0x0010005ff1b); - - /// Represents the logical "Game Button Thumb Right" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey gameButtonThumbRight = LogicalKeyboardKey(0x0010005ff1c); - - /// Represents the logical "Game Button X" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey gameButtonX = LogicalKeyboardKey(0x0010005ff1d); - - /// Represents the logical "Game Button Y" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey gameButtonY = LogicalKeyboardKey(0x0010005ff1e); - - /// Represents the logical "Game Button Z" key on the keyboard. - /// - /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey gameButtonZ = LogicalKeyboardKey(0x0010005ff1f); + static const LogicalKeyboardKey capsLock = LogicalKeyboardKey(0x01000000104); /// Represents the logical "Fn" key on the keyboard. /// /// See the function [RawKeyEvent.logicalKey] for more information. - static const LogicalKeyboardKey fn = LogicalKeyboardKey(0x00100000012); + static const LogicalKeyboardKey fn = LogicalKeyboardKey(0x01000000106); + + /// Represents the logical "Fn Lock" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey fnLock = LogicalKeyboardKey(0x01000000107); + + /// Represents the logical "Hyper" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey hyper = LogicalKeyboardKey(0x01000000108); + + /// Represents the logical "Num Lock" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey numLock = LogicalKeyboardKey(0x0100000010a); + + /// Represents the logical "Scroll Lock" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey scrollLock = LogicalKeyboardKey(0x0100000010c); + + /// Represents the logical "Super" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey superKey = LogicalKeyboardKey(0x0100000010e); + + /// Represents the logical "Symbol" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey symbol = LogicalKeyboardKey(0x0100000010f); + + /// Represents the logical "Symbol Lock" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey symbolLock = LogicalKeyboardKey(0x01000000110); + + /// Represents the logical "Shift Level 5" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey shiftLevel5 = LogicalKeyboardKey(0x01000000111); + + /// Represents the logical "Arrow Down" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey arrowDown = LogicalKeyboardKey(0x01000000301); + + /// Represents the logical "Arrow Left" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey arrowLeft = LogicalKeyboardKey(0x01000000302); + + /// Represents the logical "Arrow Right" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey arrowRight = LogicalKeyboardKey(0x01000000303); + + /// Represents the logical "Arrow Up" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey arrowUp = LogicalKeyboardKey(0x01000000304); + + /// Represents the logical "End" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey end = LogicalKeyboardKey(0x01000000305); + + /// Represents the logical "Home" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey home = LogicalKeyboardKey(0x01000000306); + + /// Represents the logical "Page Down" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey pageDown = LogicalKeyboardKey(0x01000000307); + + /// Represents the logical "Page Up" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey pageUp = LogicalKeyboardKey(0x01000000308); + + /// Represents the logical "Clear" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey clear = LogicalKeyboardKey(0x01000000401); + + /// Represents the logical "Copy" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey copy = LogicalKeyboardKey(0x01000000402); + + /// Represents the logical "Cr Sel" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey crSel = LogicalKeyboardKey(0x01000000403); + + /// Represents the logical "Cut" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey cut = LogicalKeyboardKey(0x01000000404); + + /// Represents the logical "Erase Eof" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey eraseEof = LogicalKeyboardKey(0x01000000405); + + /// Represents the logical "Ex Sel" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey exSel = LogicalKeyboardKey(0x01000000406); + + /// Represents the logical "Insert" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey insert = LogicalKeyboardKey(0x01000000407); + + /// Represents the logical "Paste" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey paste = LogicalKeyboardKey(0x01000000408); + + /// Represents the logical "Redo" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey redo = LogicalKeyboardKey(0x01000000409); + + /// Represents the logical "Undo" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey undo = LogicalKeyboardKey(0x0100000040a); + + /// Represents the logical "Accept" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey accept = LogicalKeyboardKey(0x01000000501); + + /// Represents the logical "Again" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey again = LogicalKeyboardKey(0x01000000502); + + /// Represents the logical "Attn" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey attn = LogicalKeyboardKey(0x01000000503); + + /// Represents the logical "Cancel" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey cancel = LogicalKeyboardKey(0x01000000504); + + /// Represents the logical "Context Menu" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey contextMenu = LogicalKeyboardKey(0x01000000505); + + /// Represents the logical "Execute" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey execute = LogicalKeyboardKey(0x01000000506); + + /// Represents the logical "Find" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey find = LogicalKeyboardKey(0x01000000507); + + /// Represents the logical "Help" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey help = LogicalKeyboardKey(0x01000000508); + + /// Represents the logical "Pause" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey pause = LogicalKeyboardKey(0x01000000509); + + /// Represents the logical "Play" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey play = LogicalKeyboardKey(0x0100000050a); + + /// Represents the logical "Props" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey props = LogicalKeyboardKey(0x0100000050b); + + /// Represents the logical "Select" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey select = LogicalKeyboardKey(0x0100000050c); + + /// Represents the logical "Zoom In" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey zoomIn = LogicalKeyboardKey(0x0100000050d); + + /// Represents the logical "Zoom Out" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey zoomOut = LogicalKeyboardKey(0x0100000050e); + + /// Represents the logical "Brightness Down" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey brightnessDown = LogicalKeyboardKey(0x01000000601); + + /// Represents the logical "Brightness Up" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey brightnessUp = LogicalKeyboardKey(0x01000000602); + + /// Represents the logical "Camera" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey camera = LogicalKeyboardKey(0x01000000603); + + /// Represents the logical "Eject" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey eject = LogicalKeyboardKey(0x01000000604); + + /// Represents the logical "Log Off" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey logOff = LogicalKeyboardKey(0x01000000605); + + /// Represents the logical "Power" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey power = LogicalKeyboardKey(0x01000000606); + + /// Represents the logical "Power Off" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey powerOff = LogicalKeyboardKey(0x01000000607); + + /// Represents the logical "Print Screen" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey printScreen = LogicalKeyboardKey(0x01000000608); + + /// Represents the logical "Hibernate" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey hibernate = LogicalKeyboardKey(0x01000000609); + + /// Represents the logical "Standby" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey standby = LogicalKeyboardKey(0x0100000060a); + + /// Represents the logical "Wake Up" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey wakeUp = LogicalKeyboardKey(0x0100000060b); + + /// Represents the logical "All Candidates" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey allCandidates = LogicalKeyboardKey(0x01000000701); + + /// Represents the logical "Alphanumeric" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey alphanumeric = LogicalKeyboardKey(0x01000000702); + + /// Represents the logical "Code Input" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey codeInput = LogicalKeyboardKey(0x01000000703); + + /// Represents the logical "Compose" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey compose = LogicalKeyboardKey(0x01000000704); + + /// Represents the logical "Convert" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey convert = LogicalKeyboardKey(0x01000000705); + + /// Represents the logical "Final Mode" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey finalMode = LogicalKeyboardKey(0x01000000706); + + /// Represents the logical "Group First" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey groupFirst = LogicalKeyboardKey(0x01000000707); + + /// Represents the logical "Group Last" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey groupLast = LogicalKeyboardKey(0x01000000708); + + /// Represents the logical "Group Next" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey groupNext = LogicalKeyboardKey(0x01000000709); + + /// Represents the logical "Group Previous" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey groupPrevious = LogicalKeyboardKey(0x0100000070a); + + /// Represents the logical "Mode Change" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey modeChange = LogicalKeyboardKey(0x0100000070b); + + /// Represents the logical "Next Candidate" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey nextCandidate = LogicalKeyboardKey(0x0100000070c); + + /// Represents the logical "Non Convert" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey nonConvert = LogicalKeyboardKey(0x0100000070d); + + /// Represents the logical "Previous Candidate" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey previousCandidate = LogicalKeyboardKey(0x0100000070e); + + /// Represents the logical "Process" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey process = LogicalKeyboardKey(0x0100000070f); + + /// Represents the logical "Single Candidate" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey singleCandidate = LogicalKeyboardKey(0x01000000710); + + /// Represents the logical "Hangul Mode" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey hangulMode = LogicalKeyboardKey(0x01000000711); + + /// Represents the logical "Hanja Mode" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey hanjaMode = LogicalKeyboardKey(0x01000000712); + + /// Represents the logical "Junja Mode" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey junjaMode = LogicalKeyboardKey(0x01000000713); + + /// Represents the logical "Eisu" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey eisu = LogicalKeyboardKey(0x01000000714); + + /// Represents the logical "Hankaku" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey hankaku = LogicalKeyboardKey(0x01000000715); + + /// Represents the logical "Hiragana" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey hiragana = LogicalKeyboardKey(0x01000000716); + + /// Represents the logical "Hiragana Katakana" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey hiraganaKatakana = LogicalKeyboardKey(0x01000000717); + + /// Represents the logical "Kana Mode" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey kanaMode = LogicalKeyboardKey(0x01000000718); + + /// Represents the logical "Kanji Mode" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey kanjiMode = LogicalKeyboardKey(0x01000000719); + + /// Represents the logical "Katakana" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey katakana = LogicalKeyboardKey(0x0100000071a); + + /// Represents the logical "Romaji" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey romaji = LogicalKeyboardKey(0x0100000071b); + + /// Represents the logical "Zenkaku" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey zenkaku = LogicalKeyboardKey(0x0100000071c); + + /// Represents the logical "Zenkaku Hankaku" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey zenkakuHankaku = LogicalKeyboardKey(0x0100000071d); + + /// Represents the logical "F1" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey f1 = LogicalKeyboardKey(0x01000000801); + + /// Represents the logical "F2" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey f2 = LogicalKeyboardKey(0x01000000802); + + /// Represents the logical "F3" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey f3 = LogicalKeyboardKey(0x01000000803); + + /// Represents the logical "F4" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey f4 = LogicalKeyboardKey(0x01000000804); + + /// Represents the logical "F5" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey f5 = LogicalKeyboardKey(0x01000000805); + + /// Represents the logical "F6" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey f6 = LogicalKeyboardKey(0x01000000806); + + /// Represents the logical "F7" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey f7 = LogicalKeyboardKey(0x01000000807); + + /// Represents the logical "F8" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey f8 = LogicalKeyboardKey(0x01000000808); + + /// Represents the logical "F9" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey f9 = LogicalKeyboardKey(0x01000000809); + + /// Represents the logical "F10" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey f10 = LogicalKeyboardKey(0x0100000080a); + + /// Represents the logical "F11" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey f11 = LogicalKeyboardKey(0x0100000080b); + + /// Represents the logical "F12" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey f12 = LogicalKeyboardKey(0x0100000080c); + + /// Represents the logical "F13" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey f13 = LogicalKeyboardKey(0x0100000080d); + + /// Represents the logical "F14" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey f14 = LogicalKeyboardKey(0x0100000080e); + + /// Represents the logical "F15" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey f15 = LogicalKeyboardKey(0x0100000080f); + + /// Represents the logical "F16" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey f16 = LogicalKeyboardKey(0x01000000810); + + /// Represents the logical "F17" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey f17 = LogicalKeyboardKey(0x01000000811); + + /// Represents the logical "F18" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey f18 = LogicalKeyboardKey(0x01000000812); + + /// Represents the logical "F19" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey f19 = LogicalKeyboardKey(0x01000000813); + + /// Represents the logical "F20" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey f20 = LogicalKeyboardKey(0x01000000814); + + /// Represents the logical "F21" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey f21 = LogicalKeyboardKey(0x01000000815); + + /// Represents the logical "F22" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey f22 = LogicalKeyboardKey(0x01000000816); + + /// Represents the logical "F23" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey f23 = LogicalKeyboardKey(0x01000000817); + + /// Represents the logical "F24" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey f24 = LogicalKeyboardKey(0x01000000818); + + /// Represents the logical "Soft 1" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey soft1 = LogicalKeyboardKey(0x01000000901); + + /// Represents the logical "Soft 2" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey soft2 = LogicalKeyboardKey(0x01000000902); + + /// Represents the logical "Soft 3" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey soft3 = LogicalKeyboardKey(0x01000000903); + + /// Represents the logical "Soft 4" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey soft4 = LogicalKeyboardKey(0x01000000904); + + /// Represents the logical "Soft 5" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey soft5 = LogicalKeyboardKey(0x01000000905); + + /// Represents the logical "Soft 6" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey soft6 = LogicalKeyboardKey(0x01000000906); + + /// Represents the logical "Soft 7" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey soft7 = LogicalKeyboardKey(0x01000000907); + + /// Represents the logical "Soft 8" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey soft8 = LogicalKeyboardKey(0x01000000908); + + /// Represents the logical "Close" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey close = LogicalKeyboardKey(0x01000000a01); + + /// Represents the logical "Mail Forward" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey mailForward = LogicalKeyboardKey(0x01000000a02); + + /// Represents the logical "Mail Reply" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey mailReply = LogicalKeyboardKey(0x01000000a03); + + /// Represents the logical "Mail Send" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey mailSend = LogicalKeyboardKey(0x01000000a04); + + /// Represents the logical "Media Play Pause" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey mediaPlayPause = LogicalKeyboardKey(0x01000000a05); + + /// Represents the logical "Media Stop" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey mediaStop = LogicalKeyboardKey(0x01000000a07); + + /// Represents the logical "Media Track Next" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey mediaTrackNext = LogicalKeyboardKey(0x01000000a08); + + /// Represents the logical "Media Track Previous" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey mediaTrackPrevious = LogicalKeyboardKey(0x01000000a09); + + /// Represents the logical "New" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey newKey = LogicalKeyboardKey(0x01000000a0a); + + /// Represents the logical "Open" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey open = LogicalKeyboardKey(0x01000000a0b); + + /// Represents the logical "Print" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey print = LogicalKeyboardKey(0x01000000a0c); + + /// Represents the logical "Save" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey save = LogicalKeyboardKey(0x01000000a0d); + + /// Represents the logical "Spell Check" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey spellCheck = LogicalKeyboardKey(0x01000000a0e); + + /// Represents the logical "Audio Volume Down" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey audioVolumeDown = LogicalKeyboardKey(0x01000000a0f); + + /// Represents the logical "Audio Volume Up" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey audioVolumeUp = LogicalKeyboardKey(0x01000000a10); + + /// Represents the logical "Audio Volume Mute" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey audioVolumeMute = LogicalKeyboardKey(0x01000000a11); + + /// Represents the logical "Launch Application 2" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey launchApplication2 = LogicalKeyboardKey(0x01000000b01); + + /// Represents the logical "Launch Calendar" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey launchCalendar = LogicalKeyboardKey(0x01000000b02); + + /// Represents the logical "Launch Mail" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey launchMail = LogicalKeyboardKey(0x01000000b03); + + /// Represents the logical "Launch Media Player" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey launchMediaPlayer = LogicalKeyboardKey(0x01000000b04); + + /// Represents the logical "Launch Music Player" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey launchMusicPlayer = LogicalKeyboardKey(0x01000000b05); + + /// Represents the logical "Launch Application 1" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey launchApplication1 = LogicalKeyboardKey(0x01000000b06); + + /// Represents the logical "Launch Screen Saver" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey launchScreenSaver = LogicalKeyboardKey(0x01000000b07); + + /// Represents the logical "Launch Spreadsheet" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey launchSpreadsheet = LogicalKeyboardKey(0x01000000b08); + + /// Represents the logical "Launch Web Browser" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey launchWebBrowser = LogicalKeyboardKey(0x01000000b09); + + /// Represents the logical "Launch Web Cam" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey launchWebCam = LogicalKeyboardKey(0x01000000b0a); + + /// Represents the logical "Launch Word Processor" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey launchWordProcessor = LogicalKeyboardKey(0x01000000b0b); + + /// Represents the logical "Launch Contacts" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey launchContacts = LogicalKeyboardKey(0x01000000b0c); + + /// Represents the logical "Launch Phone" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey launchPhone = LogicalKeyboardKey(0x01000000b0d); + + /// Represents the logical "Launch Assistant" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey launchAssistant = LogicalKeyboardKey(0x01000000b0e); + + /// Represents the logical "Launch Control Panel" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey launchControlPanel = LogicalKeyboardKey(0x01000000b0f); + + /// Represents the logical "Browser Back" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey browserBack = LogicalKeyboardKey(0x01000000c01); + + /// Represents the logical "Browser Favorites" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey browserFavorites = LogicalKeyboardKey(0x01000000c02); + + /// Represents the logical "Browser Forward" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey browserForward = LogicalKeyboardKey(0x01000000c03); + + /// Represents the logical "Browser Home" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey browserHome = LogicalKeyboardKey(0x01000000c04); + + /// Represents the logical "Browser Refresh" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey browserRefresh = LogicalKeyboardKey(0x01000000c05); + + /// Represents the logical "Browser Search" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey browserSearch = LogicalKeyboardKey(0x01000000c06); + + /// Represents the logical "Browser Stop" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey browserStop = LogicalKeyboardKey(0x01000000c07); + + /// Represents the logical "Audio Balance Left" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey audioBalanceLeft = LogicalKeyboardKey(0x01000000d01); + + /// Represents the logical "Audio Balance Right" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey audioBalanceRight = LogicalKeyboardKey(0x01000000d02); + + /// Represents the logical "Audio Bass Boost Down" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey audioBassBoostDown = LogicalKeyboardKey(0x01000000d03); + + /// Represents the logical "Audio Bass Boost Up" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey audioBassBoostUp = LogicalKeyboardKey(0x01000000d04); + + /// Represents the logical "Audio Fader Front" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey audioFaderFront = LogicalKeyboardKey(0x01000000d05); + + /// Represents the logical "Audio Fader Rear" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey audioFaderRear = LogicalKeyboardKey(0x01000000d06); + + /// Represents the logical "Audio Surround Mode Next" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey audioSurroundModeNext = LogicalKeyboardKey(0x01000000d07); + + /// Represents the logical "AVR Input" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey avrInput = LogicalKeyboardKey(0x01000000d08); + + /// Represents the logical "AVR Power" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey avrPower = LogicalKeyboardKey(0x01000000d09); + + /// Represents the logical "Channel Down" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey channelDown = LogicalKeyboardKey(0x01000000d0a); + + /// Represents the logical "Channel Up" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey channelUp = LogicalKeyboardKey(0x01000000d0b); + + /// Represents the logical "Color F0 Red" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey colorF0Red = LogicalKeyboardKey(0x01000000d0c); + + /// Represents the logical "Color F1 Green" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey colorF1Green = LogicalKeyboardKey(0x01000000d0d); + + /// Represents the logical "Color F2 Yellow" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey colorF2Yellow = LogicalKeyboardKey(0x01000000d0e); + + /// Represents the logical "Color F3 Blue" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey colorF3Blue = LogicalKeyboardKey(0x01000000d0f); + + /// Represents the logical "Color F4 Grey" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey colorF4Grey = LogicalKeyboardKey(0x01000000d10); + + /// Represents the logical "Color F5 Brown" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey colorF5Brown = LogicalKeyboardKey(0x01000000d11); + + /// Represents the logical "Closed Caption Toggle" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey closedCaptionToggle = LogicalKeyboardKey(0x01000000d12); + + /// Represents the logical "Dimmer" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey dimmer = LogicalKeyboardKey(0x01000000d13); + + /// Represents the logical "Display Swap" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey displaySwap = LogicalKeyboardKey(0x01000000d14); + + /// Represents the logical "Exit" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey exit = LogicalKeyboardKey(0x01000000d15); + + /// Represents the logical "Favorite Clear 0" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey favoriteClear0 = LogicalKeyboardKey(0x01000000d16); + + /// Represents the logical "Favorite Clear 1" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey favoriteClear1 = LogicalKeyboardKey(0x01000000d17); + + /// Represents the logical "Favorite Clear 2" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey favoriteClear2 = LogicalKeyboardKey(0x01000000d18); + + /// Represents the logical "Favorite Clear 3" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey favoriteClear3 = LogicalKeyboardKey(0x01000000d19); + + /// Represents the logical "Favorite Recall 0" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey favoriteRecall0 = LogicalKeyboardKey(0x01000000d1a); + + /// Represents the logical "Favorite Recall 1" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey favoriteRecall1 = LogicalKeyboardKey(0x01000000d1b); + + /// Represents the logical "Favorite Recall 2" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey favoriteRecall2 = LogicalKeyboardKey(0x01000000d1c); + + /// Represents the logical "Favorite Recall 3" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey favoriteRecall3 = LogicalKeyboardKey(0x01000000d1d); + + /// Represents the logical "Favorite Store 0" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey favoriteStore0 = LogicalKeyboardKey(0x01000000d1e); + + /// Represents the logical "Favorite Store 1" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey favoriteStore1 = LogicalKeyboardKey(0x01000000d1f); + + /// Represents the logical "Favorite Store 2" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey favoriteStore2 = LogicalKeyboardKey(0x01000000d20); + + /// Represents the logical "Favorite Store 3" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey favoriteStore3 = LogicalKeyboardKey(0x01000000d21); + + /// Represents the logical "Guide" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey guide = LogicalKeyboardKey(0x01000000d22); + + /// Represents the logical "Guide Next Day" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey guideNextDay = LogicalKeyboardKey(0x01000000d23); + + /// Represents the logical "Guide Previous Day" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey guidePreviousDay = LogicalKeyboardKey(0x01000000d24); + + /// Represents the logical "Info" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey info = LogicalKeyboardKey(0x01000000d25); + + /// Represents the logical "Instant Replay" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey instantReplay = LogicalKeyboardKey(0x01000000d26); + + /// Represents the logical "Link" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey link = LogicalKeyboardKey(0x01000000d27); + + /// Represents the logical "List Program" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey listProgram = LogicalKeyboardKey(0x01000000d28); + + /// Represents the logical "Live Content" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey liveContent = LogicalKeyboardKey(0x01000000d29); + + /// Represents the logical "Lock" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey lock = LogicalKeyboardKey(0x01000000d2a); + + /// Represents the logical "Media Apps" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey mediaApps = LogicalKeyboardKey(0x01000000d2b); + + /// Represents the logical "Media Fast Forward" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey mediaFastForward = LogicalKeyboardKey(0x01000000d2c); + + /// Represents the logical "Media Last" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey mediaLast = LogicalKeyboardKey(0x01000000d2d); + + /// Represents the logical "Media Pause" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey mediaPause = LogicalKeyboardKey(0x01000000d2e); + + /// Represents the logical "Media Play" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey mediaPlay = LogicalKeyboardKey(0x01000000d2f); + + /// Represents the logical "Media Record" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey mediaRecord = LogicalKeyboardKey(0x01000000d30); + + /// Represents the logical "Media Rewind" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey mediaRewind = LogicalKeyboardKey(0x01000000d31); + + /// Represents the logical "Media Skip" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey mediaSkip = LogicalKeyboardKey(0x01000000d32); + + /// Represents the logical "Next Favorite Channel" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey nextFavoriteChannel = LogicalKeyboardKey(0x01000000d33); + + /// Represents the logical "Next User Profile" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey nextUserProfile = LogicalKeyboardKey(0x01000000d34); + + /// Represents the logical "On Demand" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey onDemand = LogicalKeyboardKey(0x01000000d35); + + /// Represents the logical "P In P Down" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey pInPDown = LogicalKeyboardKey(0x01000000d36); + + /// Represents the logical "P In P Move" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey pInPMove = LogicalKeyboardKey(0x01000000d37); + + /// Represents the logical "P In P Toggle" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey pInPToggle = LogicalKeyboardKey(0x01000000d38); + + /// Represents the logical "P In P Up" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey pInPUp = LogicalKeyboardKey(0x01000000d39); + + /// Represents the logical "Play Speed Down" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey playSpeedDown = LogicalKeyboardKey(0x01000000d3a); + + /// Represents the logical "Play Speed Reset" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey playSpeedReset = LogicalKeyboardKey(0x01000000d3b); + + /// Represents the logical "Play Speed Up" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey playSpeedUp = LogicalKeyboardKey(0x01000000d3c); + + /// Represents the logical "Random Toggle" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey randomToggle = LogicalKeyboardKey(0x01000000d3d); + + /// Represents the logical "Rc Low Battery" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey rcLowBattery = LogicalKeyboardKey(0x01000000d3e); + + /// Represents the logical "Record Speed Next" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey recordSpeedNext = LogicalKeyboardKey(0x01000000d3f); + + /// Represents the logical "Rf Bypass" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey rfBypass = LogicalKeyboardKey(0x01000000d40); + + /// Represents the logical "Scan Channels Toggle" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey scanChannelsToggle = LogicalKeyboardKey(0x01000000d41); + + /// Represents the logical "Screen Mode Next" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey screenModeNext = LogicalKeyboardKey(0x01000000d42); + + /// Represents the logical "Settings" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey settings = LogicalKeyboardKey(0x01000000d43); + + /// Represents the logical "Split Screen Toggle" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey splitScreenToggle = LogicalKeyboardKey(0x01000000d44); + + /// Represents the logical "STB Input" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey stbInput = LogicalKeyboardKey(0x01000000d45); + + /// Represents the logical "STB Power" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey stbPower = LogicalKeyboardKey(0x01000000d46); + + /// Represents the logical "Subtitle" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey subtitle = LogicalKeyboardKey(0x01000000d47); + + /// Represents the logical "Teletext" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey teletext = LogicalKeyboardKey(0x01000000d48); + + /// Represents the logical "TV" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey tv = LogicalKeyboardKey(0x01000000d49); + + /// Represents the logical "TV Input" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey tvInput = LogicalKeyboardKey(0x01000000d4a); + + /// Represents the logical "TV Power" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey tvPower = LogicalKeyboardKey(0x01000000d4b); + + /// Represents the logical "Video Mode Next" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey videoModeNext = LogicalKeyboardKey(0x01000000d4c); + + /// Represents the logical "Wink" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey wink = LogicalKeyboardKey(0x01000000d4d); + + /// Represents the logical "Zoom Toggle" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey zoomToggle = LogicalKeyboardKey(0x01000000d4e); + + /// Represents the logical "DVR" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey dvr = LogicalKeyboardKey(0x01000000d4f); + + /// Represents the logical "Media Audio Track" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey mediaAudioTrack = LogicalKeyboardKey(0x01000000d50); + + /// Represents the logical "Media Skip Backward" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey mediaSkipBackward = LogicalKeyboardKey(0x01000000d51); + + /// Represents the logical "Media Skip Forward" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey mediaSkipForward = LogicalKeyboardKey(0x01000000d52); + + /// Represents the logical "Media Step Backward" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey mediaStepBackward = LogicalKeyboardKey(0x01000000d53); + + /// Represents the logical "Media Step Forward" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey mediaStepForward = LogicalKeyboardKey(0x01000000d54); + + /// Represents the logical "Media Top Menu" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey mediaTopMenu = LogicalKeyboardKey(0x01000000d55); + + /// Represents the logical "Navigate In" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey navigateIn = LogicalKeyboardKey(0x01000000d56); + + /// Represents the logical "Navigate Next" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey navigateNext = LogicalKeyboardKey(0x01000000d57); + + /// Represents the logical "Navigate Out" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey navigateOut = LogicalKeyboardKey(0x01000000d58); + + /// Represents the logical "Navigate Previous" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey navigatePrevious = LogicalKeyboardKey(0x01000000d59); + + /// Represents the logical "Pairing" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey pairing = LogicalKeyboardKey(0x01000000d5a); + + /// Represents the logical "Media Close" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey mediaClose = LogicalKeyboardKey(0x01000000d5b); + + /// Represents the logical "Audio Bass Boost Toggle" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey audioBassBoostToggle = LogicalKeyboardKey(0x01000000e02); + + /// Represents the logical "Audio Treble Down" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey audioTrebleDown = LogicalKeyboardKey(0x01000000e04); + + /// Represents the logical "Audio Treble Up" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey audioTrebleUp = LogicalKeyboardKey(0x01000000e05); + + /// Represents the logical "Microphone Toggle" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey microphoneToggle = LogicalKeyboardKey(0x01000000e06); + + /// Represents the logical "Microphone Volume Down" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey microphoneVolumeDown = LogicalKeyboardKey(0x01000000e07); + + /// Represents the logical "Microphone Volume Up" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey microphoneVolumeUp = LogicalKeyboardKey(0x01000000e08); + + /// Represents the logical "Microphone Volume Mute" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey microphoneVolumeMute = LogicalKeyboardKey(0x01000000e09); + + /// Represents the logical "Speech Correction List" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey speechCorrectionList = LogicalKeyboardKey(0x01000000f01); + + /// Represents the logical "Speech Input Toggle" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey speechInputToggle = LogicalKeyboardKey(0x01000000f02); + + /// Represents the logical "App Switch" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey appSwitch = LogicalKeyboardKey(0x01000001001); + + /// Represents the logical "Call" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey call = LogicalKeyboardKey(0x01000001002); + + /// Represents the logical "Camera Focus" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey cameraFocus = LogicalKeyboardKey(0x01000001003); + + /// Represents the logical "End Call" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey endCall = LogicalKeyboardKey(0x01000001004); + + /// Represents the logical "Go Back" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey goBack = LogicalKeyboardKey(0x01000001005); + + /// Represents the logical "Go Home" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey goHome = LogicalKeyboardKey(0x01000001006); + + /// Represents the logical "Headset Hook" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey headsetHook = LogicalKeyboardKey(0x01000001007); + + /// Represents the logical "Last Number Redial" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey lastNumberRedial = LogicalKeyboardKey(0x01000001008); + + /// Represents the logical "Notification" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey notification = LogicalKeyboardKey(0x01000001009); + + /// Represents the logical "Manner Mode" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey mannerMode = LogicalKeyboardKey(0x0100000100a); + + /// Represents the logical "Voice Dial" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey voiceDial = LogicalKeyboardKey(0x0100000100b); + + /// Represents the logical "TV 3 D Mode" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey tv3DMode = LogicalKeyboardKey(0x01000001101); + + /// Represents the logical "TV Antenna Cable" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey tvAntennaCable = LogicalKeyboardKey(0x01000001102); + + /// Represents the logical "TV Audio Description" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey tvAudioDescription = LogicalKeyboardKey(0x01000001103); + + /// Represents the logical "TV Audio Description Mix Down" key on the + /// keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey tvAudioDescriptionMixDown = LogicalKeyboardKey(0x01000001104); + + /// Represents the logical "TV Audio Description Mix Up" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey tvAudioDescriptionMixUp = LogicalKeyboardKey(0x01000001105); + + /// Represents the logical "TV Contents Menu" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey tvContentsMenu = LogicalKeyboardKey(0x01000001106); + + /// Represents the logical "TV Data Service" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey tvDataService = LogicalKeyboardKey(0x01000001107); + + /// Represents the logical "TV Input Component 1" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey tvInputComponent1 = LogicalKeyboardKey(0x01000001108); + + /// Represents the logical "TV Input Component 2" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey tvInputComponent2 = LogicalKeyboardKey(0x01000001109); + + /// Represents the logical "TV Input Composite 1" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey tvInputComposite1 = LogicalKeyboardKey(0x0100000110a); + + /// Represents the logical "TV Input Composite 2" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey tvInputComposite2 = LogicalKeyboardKey(0x0100000110b); + + /// Represents the logical "TV Input HDMI 1" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey tvInputHDMI1 = LogicalKeyboardKey(0x0100000110c); + + /// Represents the logical "TV Input HDMI 2" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey tvInputHDMI2 = LogicalKeyboardKey(0x0100000110d); + + /// Represents the logical "TV Input HDMI 3" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey tvInputHDMI3 = LogicalKeyboardKey(0x0100000110e); + + /// Represents the logical "TV Input HDMI 4" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey tvInputHDMI4 = LogicalKeyboardKey(0x0100000110f); + + /// Represents the logical "TV Input VGA 1" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey tvInputVGA1 = LogicalKeyboardKey(0x01000001110); + + /// Represents the logical "TV Media Context" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey tvMediaContext = LogicalKeyboardKey(0x01000001111); + + /// Represents the logical "TV Network" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey tvNetwork = LogicalKeyboardKey(0x01000001112); + + /// Represents the logical "TV Number Entry" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey tvNumberEntry = LogicalKeyboardKey(0x01000001113); + + /// Represents the logical "TV Radio Service" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey tvRadioService = LogicalKeyboardKey(0x01000001114); + + /// Represents the logical "TV Satellite" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey tvSatellite = LogicalKeyboardKey(0x01000001115); + + /// Represents the logical "TV Satellite BS" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey tvSatelliteBS = LogicalKeyboardKey(0x01000001116); + + /// Represents the logical "TV Satellite CS" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey tvSatelliteCS = LogicalKeyboardKey(0x01000001117); + + /// Represents the logical "TV Satellite Toggle" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey tvSatelliteToggle = LogicalKeyboardKey(0x01000001118); + + /// Represents the logical "TV Terrestrial Analog" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey tvTerrestrialAnalog = LogicalKeyboardKey(0x01000001119); + + /// Represents the logical "TV Terrestrial Digital" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey tvTerrestrialDigital = LogicalKeyboardKey(0x0100000111a); + + /// Represents the logical "TV Timer" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey tvTimer = LogicalKeyboardKey(0x0100000111b); + + /// Represents the logical "Key 11" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey key11 = LogicalKeyboardKey(0x01000001201); + + /// Represents the logical "Key 12" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey key12 = LogicalKeyboardKey(0x01000001202); + + /// Represents the logical "Game Button 1" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey gameButton1 = LogicalKeyboardKey(0x0100005ff01); + + /// Represents the logical "Game Button 2" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey gameButton2 = LogicalKeyboardKey(0x0100005ff02); + + /// Represents the logical "Game Button 3" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey gameButton3 = LogicalKeyboardKey(0x0100005ff03); + + /// Represents the logical "Game Button 4" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey gameButton4 = LogicalKeyboardKey(0x0100005ff04); + + /// Represents the logical "Game Button 5" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey gameButton5 = LogicalKeyboardKey(0x0100005ff05); + + /// Represents the logical "Game Button 6" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey gameButton6 = LogicalKeyboardKey(0x0100005ff06); + + /// Represents the logical "Game Button 7" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey gameButton7 = LogicalKeyboardKey(0x0100005ff07); + + /// Represents the logical "Game Button 8" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey gameButton8 = LogicalKeyboardKey(0x0100005ff08); + + /// Represents the logical "Game Button 9" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey gameButton9 = LogicalKeyboardKey(0x0100005ff09); + + /// Represents the logical "Game Button 10" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey gameButton10 = LogicalKeyboardKey(0x0100005ff0a); + + /// Represents the logical "Game Button 11" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey gameButton11 = LogicalKeyboardKey(0x0100005ff0b); + + /// Represents the logical "Game Button 12" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey gameButton12 = LogicalKeyboardKey(0x0100005ff0c); + + /// Represents the logical "Game Button 13" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey gameButton13 = LogicalKeyboardKey(0x0100005ff0d); + + /// Represents the logical "Game Button 14" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey gameButton14 = LogicalKeyboardKey(0x0100005ff0e); + + /// Represents the logical "Game Button 15" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey gameButton15 = LogicalKeyboardKey(0x0100005ff0f); + + /// Represents the logical "Game Button 16" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey gameButton16 = LogicalKeyboardKey(0x0100005ff10); + + /// Represents the logical "Game Button A" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey gameButtonA = LogicalKeyboardKey(0x0100005ff11); + + /// Represents the logical "Game Button B" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey gameButtonB = LogicalKeyboardKey(0x0100005ff12); + + /// Represents the logical "Game Button C" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey gameButtonC = LogicalKeyboardKey(0x0100005ff13); + + /// Represents the logical "Game Button Left 1" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey gameButtonLeft1 = LogicalKeyboardKey(0x0100005ff14); + + /// Represents the logical "Game Button Left 2" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey gameButtonLeft2 = LogicalKeyboardKey(0x0100005ff15); + + /// Represents the logical "Game Button Mode" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey gameButtonMode = LogicalKeyboardKey(0x0100005ff16); + + /// Represents the logical "Game Button Right 1" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey gameButtonRight1 = LogicalKeyboardKey(0x0100005ff17); + + /// Represents the logical "Game Button Right 2" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey gameButtonRight2 = LogicalKeyboardKey(0x0100005ff18); + + /// Represents the logical "Game Button Select" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey gameButtonSelect = LogicalKeyboardKey(0x0100005ff19); + + /// Represents the logical "Game Button Start" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey gameButtonStart = LogicalKeyboardKey(0x0100005ff1a); + + /// Represents the logical "Game Button Thumb Left" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey gameButtonThumbLeft = LogicalKeyboardKey(0x0100005ff1b); + + /// Represents the logical "Game Button Thumb Right" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey gameButtonThumbRight = LogicalKeyboardKey(0x0100005ff1c); + + /// Represents the logical "Game Button X" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey gameButtonX = LogicalKeyboardKey(0x0100005ff1d); + + /// Represents the logical "Game Button Y" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey gameButtonY = LogicalKeyboardKey(0x0100005ff1e); + + /// Represents the logical "Game Button Z" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey gameButtonZ = LogicalKeyboardKey(0x0100005ff1f); + + /// Represents the logical "Suspend" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey suspend = LogicalKeyboardKey(0x01100000014); + + /// Represents the logical "Resume" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey resume = LogicalKeyboardKey(0x01100000015); + + /// Represents the logical "Sleep" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey sleep = LogicalKeyboardKey(0x01100010082); + + /// Represents the logical "Intl Backslash" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey intlBackslash = LogicalKeyboardKey(0x01100070064); + + /// Represents the logical "Intl Ro" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey intlRo = LogicalKeyboardKey(0x01100070087); + + /// Represents the logical "Intl Yen" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey intlYen = LogicalKeyboardKey(0x01100070089); + + /// Represents the logical "Lang 1" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey lang1 = LogicalKeyboardKey(0x01100070090); + + /// Represents the logical "Lang 2" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey lang2 = LogicalKeyboardKey(0x01100070091); + + /// Represents the logical "Lang 3" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey lang3 = LogicalKeyboardKey(0x01100070092); + + /// Represents the logical "Lang 4" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey lang4 = LogicalKeyboardKey(0x01100070093); + + /// Represents the logical "Lang 5" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey lang5 = LogicalKeyboardKey(0x01100070094); + + /// Represents the logical "Abort" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey abort = LogicalKeyboardKey(0x0110007009b); + + /// Represents the logical "Alt Left" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey altLeft = LogicalKeyboardKey(0x30000000102); + + /// Represents the logical "Control Left" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey controlLeft = LogicalKeyboardKey(0x30000000105); + + /// Represents the logical "Meta Left" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey metaLeft = LogicalKeyboardKey(0x30000000109); + + /// Represents the logical "Shift Left" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey shiftLeft = LogicalKeyboardKey(0x3000000010d); + + /// Represents the logical "Alt Right" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey altRight = LogicalKeyboardKey(0x40000000102); + + /// Represents the logical "Control Right" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey controlRight = LogicalKeyboardKey(0x40000000105); + + /// Represents the logical "Meta Right" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey metaRight = LogicalKeyboardKey(0x40000000109); + + /// Represents the logical "Shift Right" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey shiftRight = LogicalKeyboardKey(0x4000000010d); + + /// Represents the logical "Numpad Enter" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey numpadEnter = LogicalKeyboardKey(0x5000000000d); + + /// Represents the logical "Numpad Paren Left" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey numpadParenLeft = LogicalKeyboardKey(0x50000000028); + + /// Represents the logical "Numpad Paren Right" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey numpadParenRight = LogicalKeyboardKey(0x50000000029); + + /// Represents the logical "Numpad Multiply" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey numpadMultiply = LogicalKeyboardKey(0x5000000002a); + + /// Represents the logical "Numpad Add" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey numpadAdd = LogicalKeyboardKey(0x5000000002b); + + /// Represents the logical "Numpad Comma" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey numpadComma = LogicalKeyboardKey(0x5000000002c); + + /// Represents the logical "Numpad Subtract" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey numpadSubtract = LogicalKeyboardKey(0x5000000002d); + + /// Represents the logical "Numpad Decimal" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey numpadDecimal = LogicalKeyboardKey(0x5000000002e); + + /// Represents the logical "Numpad Divide" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey numpadDivide = LogicalKeyboardKey(0x5000000002f); + + /// Represents the logical "Numpad 0" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey numpad0 = LogicalKeyboardKey(0x50000000030); + + /// Represents the logical "Numpad 1" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey numpad1 = LogicalKeyboardKey(0x50000000031); + + /// Represents the logical "Numpad 2" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey numpad2 = LogicalKeyboardKey(0x50000000032); + + /// Represents the logical "Numpad 3" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey numpad3 = LogicalKeyboardKey(0x50000000033); + + /// Represents the logical "Numpad 4" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey numpad4 = LogicalKeyboardKey(0x50000000034); + + /// Represents the logical "Numpad 5" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey numpad5 = LogicalKeyboardKey(0x50000000035); + + /// Represents the logical "Numpad 6" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey numpad6 = LogicalKeyboardKey(0x50000000036); + + /// Represents the logical "Numpad 7" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey numpad7 = LogicalKeyboardKey(0x50000000037); + + /// Represents the logical "Numpad 8" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey numpad8 = LogicalKeyboardKey(0x50000000038); + + /// Represents the logical "Numpad 9" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey numpad9 = LogicalKeyboardKey(0x50000000039); + + /// Represents the logical "Numpad Equal" key on the keyboard. + /// + /// See the function [RawKeyEvent.logicalKey] for more information. + static const LogicalKeyboardKey numpadEqual = LogicalKeyboardKey(0x5000000003d); /// Represents the logical "Shift" key on the keyboard. /// /// This key represents the union of the keys {shiftLeft, shiftRight} when /// comparing keys. This key will never be generated directly, its main use is /// in defining key maps. - static const LogicalKeyboardKey shift = LogicalKeyboardKey(0x201000700e1); + static const LogicalKeyboardKey shift = LogicalKeyboardKey(0x2000000010d); /// Represents the logical "Meta" key on the keyboard. /// /// This key represents the union of the keys {metaLeft, metaRight} when /// comparing keys. This key will never be generated directly, its main use is /// in defining key maps. - static const LogicalKeyboardKey meta = LogicalKeyboardKey(0x201000700e3); + static const LogicalKeyboardKey meta = LogicalKeyboardKey(0x20000000109); /// Represents the logical "Alt" key on the keyboard. /// /// This key represents the union of the keys {altLeft, altRight} when /// comparing keys. This key will never be generated directly, its main use is /// in defining key maps. - static const LogicalKeyboardKey alt = LogicalKeyboardKey(0x201000700e2); + static const LogicalKeyboardKey alt = LogicalKeyboardKey(0x20000000102); /// Represents the logical "Control" key on the keyboard. /// /// This key represents the union of the keys {controlLeft, controlRight} when /// comparing keys. This key will never be generated directly, its main use is /// in defining key maps. - static const LogicalKeyboardKey control = LogicalKeyboardKey(0x201000700e0); + static const LogicalKeyboardKey control = LogicalKeyboardKey(0x20000000105); // A list of all predefined constant LogicalKeyboardKeys so they can be // searched. static const Map _knownLogicalKeys = { - 0x0100000000: none, - 0x0100000010: hyper, - 0x0100000011: superKey, - 0x0100000013: fnLock, - 0x0100000014: suspend, - 0x0100000015: resume, - 0x0100000016: turbo, - 0x0100000017: privacyScreenToggle, - 0x0100010082: sleep, - 0x0100010083: wakeUp, - 0x01000100b5: displayToggleIntExt, - 0x0100070000: usbReserved, - 0x0100070001: usbErrorRollOver, - 0x0100070002: usbPostFail, - 0x0100070003: usbErrorUndefined, - 0x0000000061: keyA, - 0x0000000062: keyB, - 0x0000000063: keyC, - 0x0000000064: keyD, - 0x0000000065: keyE, - 0x0000000066: keyF, - 0x0000000067: keyG, - 0x0000000068: keyH, - 0x0000000069: keyI, - 0x000000006a: keyJ, - 0x000000006b: keyK, - 0x000000006c: keyL, - 0x000000006d: keyM, - 0x000000006e: keyN, - 0x000000006f: keyO, - 0x0000000070: keyP, - 0x0000000071: keyQ, - 0x0000000072: keyR, - 0x0000000073: keyS, - 0x0000000074: keyT, - 0x0000000075: keyU, - 0x0000000076: keyV, - 0x0000000077: keyW, - 0x0000000078: keyX, - 0x0000000079: keyY, - 0x000000007a: keyZ, - 0x0000000031: digit1, - 0x0000000032: digit2, - 0x0000000033: digit3, - 0x0000000034: digit4, - 0x0000000035: digit5, - 0x0000000036: digit6, - 0x0000000037: digit7, - 0x0000000038: digit8, - 0x0000000039: digit9, - 0x0000000030: digit0, - 0x0100070028: enter, - 0x0100070029: escape, - 0x010007002a: backspace, - 0x010007002b: tab, - 0x0000000020: space, - 0x000000002d: minus, - 0x000000003d: equal, - 0x000000005b: bracketLeft, - 0x000000005d: bracketRight, - 0x000000005c: backslash, - 0x000000003b: semicolon, - 0x0000000027: quote, - 0x0000000060: backquote, - 0x000000002c: comma, - 0x000000002e: period, - 0x000000002f: slash, - 0x0100070039: capsLock, - 0x010007003a: f1, - 0x010007003b: f2, - 0x010007003c: f3, - 0x010007003d: f4, - 0x010007003e: f5, - 0x010007003f: f6, - 0x0100070040: f7, - 0x0100070041: f8, - 0x0100070042: f9, - 0x0100070043: f10, - 0x0100070044: f11, - 0x0100070045: f12, - 0x0100070046: printScreen, - 0x0100070047: scrollLock, - 0x0100070048: pause, - 0x0100070049: insert, - 0x010007004a: home, - 0x010007004b: pageUp, - 0x010007004c: delete, - 0x010007004d: end, - 0x010007004e: pageDown, - 0x010007004f: arrowRight, - 0x0100070050: arrowLeft, - 0x0100070051: arrowDown, - 0x0100070052: arrowUp, - 0x0100070053: numLock, - 0x0100070054: numpadDivide, - 0x0100070055: numpadMultiply, - 0x0100070056: numpadSubtract, - 0x0100070057: numpadAdd, - 0x0100070058: numpadEnter, - 0x0100070059: numpad1, - 0x010007005a: numpad2, - 0x010007005b: numpad3, - 0x010007005c: numpad4, - 0x010007005d: numpad5, - 0x010007005e: numpad6, - 0x010007005f: numpad7, - 0x0100070060: numpad8, - 0x0100070061: numpad9, - 0x0100070062: numpad0, - 0x0100070063: numpadDecimal, - 0x0100070064: intlBackslash, - 0x0100070065: contextMenu, - 0x0100070066: power, - 0x0100070067: numpadEqual, - 0x0100070068: f13, - 0x0100070069: f14, - 0x010007006a: f15, - 0x010007006b: f16, - 0x010007006c: f17, - 0x010007006d: f18, - 0x010007006e: f19, - 0x010007006f: f20, - 0x0100070070: f21, - 0x0100070071: f22, - 0x0100070072: f23, - 0x0100070073: f24, - 0x0100070074: open, - 0x0100070075: help, - 0x0100070077: select, - 0x0100070079: again, - 0x010007007a: undo, - 0x010007007b: cut, - 0x010007007c: copy, - 0x010007007d: paste, - 0x010007007e: find, - 0x010007007f: audioVolumeMute, - 0x0100070080: audioVolumeUp, - 0x0100070081: audioVolumeDown, - 0x0100070085: numpadComma, - 0x0100070087: intlRo, - 0x0100070088: kanaMode, - 0x0100070089: intlYen, - 0x010007008a: convert, - 0x010007008b: nonConvert, - 0x0100070090: lang1, - 0x0100070091: lang2, - 0x0100070092: lang3, - 0x0100070093: lang4, - 0x0100070094: lang5, - 0x010007009b: abort, - 0x01000700a3: props, - 0x01000700b6: numpadParenLeft, - 0x01000700b7: numpadParenRight, - 0x01000700bb: numpadBackspace, - 0x01000700d0: numpadMemoryStore, - 0x01000700d1: numpadMemoryRecall, - 0x01000700d2: numpadMemoryClear, - 0x01000700d3: numpadMemoryAdd, - 0x01000700d4: numpadMemorySubtract, - 0x01000700d7: numpadSignChange, - 0x01000700d8: numpadClear, - 0x01000700d9: numpadClearEntry, - 0x01000700e0: controlLeft, - 0x01000700e1: shiftLeft, - 0x01000700e2: altLeft, - 0x01000700e3: metaLeft, - 0x01000700e4: controlRight, - 0x01000700e5: shiftRight, - 0x01000700e6: altRight, - 0x01000700e7: metaRight, - 0x01000c0060: info, - 0x01000c0061: closedCaptionToggle, - 0x01000c006f: brightnessUp, - 0x01000c0070: brightnessDown, - 0x01000c0072: brightnessToggle, - 0x01000c0073: brightnessMinimum, - 0x01000c0074: brightnessMaximum, - 0x01000c0075: brightnessAuto, - 0x01000c0079: kbdIllumUp, - 0x01000c007a: kbdIllumDown, - 0x01000c0083: mediaLast, - 0x01000c008c: launchPhone, - 0x01000c008d: programGuide, - 0x01000c0094: exit, - 0x01000c009c: channelUp, - 0x01000c009d: channelDown, - 0x01000c00b0: mediaPlay, - 0x01000c00b1: mediaPause, - 0x01000c00b2: mediaRecord, - 0x01000c00b3: mediaFastForward, - 0x01000c00b4: mediaRewind, - 0x01000c00b5: mediaTrackNext, - 0x01000c00b6: mediaTrackPrevious, - 0x01000c00b7: mediaStop, - 0x01000c00b8: eject, - 0x01000c00cd: mediaPlayPause, - 0x01000c00cf: speechInputToggle, - 0x01000c00e5: bassBoost, - 0x01000c0183: mediaSelect, - 0x01000c0184: launchWordProcessor, - 0x01000c0186: launchSpreadsheet, - 0x01000c018a: launchMail, - 0x01000c018d: launchContacts, - 0x01000c018e: launchCalendar, - 0x01000c0192: launchApp2, - 0x01000c0194: launchApp1, - 0x01000c0196: launchInternetBrowser, - 0x01000c019c: logOff, - 0x01000c019e: lockScreen, - 0x01000c019f: launchControlPanel, - 0x01000c01a2: selectTask, - 0x01000c01a7: launchDocuments, - 0x01000c01ab: spellCheck, - 0x01000c01ae: launchKeyboardLayout, - 0x01000c01b1: launchScreenSaver, - 0x01000c01cb: launchAssistant, - 0x01000c01b7: launchAudioBrowser, - 0x01000c0201: newKey, - 0x01000c0203: close, - 0x01000c0207: save, - 0x01000c0208: print, - 0x01000c0221: browserSearch, - 0x01000c0223: browserHome, - 0x01000c0224: browserBack, - 0x01000c0225: browserForward, - 0x01000c0226: browserStop, - 0x01000c0227: browserRefresh, - 0x01000c022a: browserFavorites, - 0x01000c022d: zoomIn, - 0x01000c022e: zoomOut, - 0x01000c0232: zoomToggle, - 0x01000c0279: redo, - 0x01000c0289: mailReply, - 0x01000c028b: mailForward, - 0x01000c028c: mailSend, - 0x01000c029d: keyboardLayoutSelect, - 0x01000c029f: showAllWindows, - 0x010005ff01: gameButton1, - 0x010005ff02: gameButton2, - 0x010005ff03: gameButton3, - 0x010005ff04: gameButton4, - 0x010005ff05: gameButton5, - 0x010005ff06: gameButton6, - 0x010005ff07: gameButton7, - 0x010005ff08: gameButton8, - 0x010005ff09: gameButton9, - 0x010005ff0a: gameButton10, - 0x010005ff0b: gameButton11, - 0x010005ff0c: gameButton12, - 0x010005ff0d: gameButton13, - 0x010005ff0e: gameButton14, - 0x010005ff0f: gameButton15, - 0x010005ff10: gameButton16, - 0x010005ff11: gameButtonA, - 0x010005ff12: gameButtonB, - 0x010005ff13: gameButtonC, - 0x010005ff14: gameButtonLeft1, - 0x010005ff15: gameButtonLeft2, - 0x010005ff16: gameButtonMode, - 0x010005ff17: gameButtonRight1, - 0x010005ff18: gameButtonRight2, - 0x010005ff19: gameButtonSelect, - 0x010005ff1a: gameButtonStart, - 0x010005ff1b: gameButtonThumbLeft, - 0x010005ff1c: gameButtonThumbRight, - 0x010005ff1d: gameButtonX, - 0x010005ff1e: gameButtonY, - 0x010005ff1f: gameButtonZ, - 0x0100000012: fn, - 0x201000700e1: shift, - 0x201000700e3: meta, - 0x201000700e2: alt, - 0x201000700e0: control, + 0x00000000000: none, + 0x00000000020: space, + 0x00000000021: exclamation, + 0x00000000022: quote, + 0x00000000023: numberSign, + 0x00000000024: dollar, + 0x00000000025: percent, + 0x00000000026: ampersand, + 0x00000000027: quoteSingle, + 0x00000000028: parenthesisLeft, + 0x00000000029: parenthesisRight, + 0x0000000002a: asterisk, + 0x0000000002b: add, + 0x0000000002c: comma, + 0x0000000002d: minus, + 0x0000000002e: period, + 0x0000000002f: slash, + 0x00000000030: digit0, + 0x00000000031: digit1, + 0x00000000032: digit2, + 0x00000000033: digit3, + 0x00000000034: digit4, + 0x00000000035: digit5, + 0x00000000036: digit6, + 0x00000000037: digit7, + 0x00000000038: digit8, + 0x00000000039: digit9, + 0x0000000003a: colon, + 0x0000000003b: semicolon, + 0x0000000003c: less, + 0x0000000003d: equal, + 0x0000000003e: greater, + 0x0000000003f: question, + 0x00000000040: at, + 0x0000000005b: bracketLeft, + 0x0000000005c: backslash, + 0x0000000005d: bracketRight, + 0x0000000005e: caret, + 0x0000000005f: underscore, + 0x00000000060: backquote, + 0x00000000061: keyA, + 0x00000000062: keyB, + 0x00000000063: keyC, + 0x00000000064: keyD, + 0x00000000065: keyE, + 0x00000000066: keyF, + 0x00000000067: keyG, + 0x00000000068: keyH, + 0x00000000069: keyI, + 0x0000000006a: keyJ, + 0x0000000006b: keyK, + 0x0000000006c: keyL, + 0x0000000006d: keyM, + 0x0000000006e: keyN, + 0x0000000006f: keyO, + 0x00000000070: keyP, + 0x00000000071: keyQ, + 0x00000000072: keyR, + 0x00000000073: keyS, + 0x00000000074: keyT, + 0x00000000075: keyU, + 0x00000000076: keyV, + 0x00000000077: keyW, + 0x00000000078: keyX, + 0x00000000079: keyY, + 0x0000000007a: keyZ, + 0x0000000007b: braceLeft, + 0x0000000007c: bar, + 0x0000000007d: braceRight, + 0x0000000007e: tilde, + 0x01000000001: unidentified, + 0x01000000008: backspace, + 0x01000000009: tab, + 0x0100000000d: enter, + 0x0100000001b: escape, + 0x0100000007f: delete, + 0x01000000101: accel, + 0x01000000103: altGraph, + 0x01000000104: capsLock, + 0x01000000106: fn, + 0x01000000107: fnLock, + 0x01000000108: hyper, + 0x0100000010a: numLock, + 0x0100000010c: scrollLock, + 0x0100000010e: superKey, + 0x0100000010f: symbol, + 0x01000000110: symbolLock, + 0x01000000111: shiftLevel5, + 0x01000000301: arrowDown, + 0x01000000302: arrowLeft, + 0x01000000303: arrowRight, + 0x01000000304: arrowUp, + 0x01000000305: end, + 0x01000000306: home, + 0x01000000307: pageDown, + 0x01000000308: pageUp, + 0x01000000401: clear, + 0x01000000402: copy, + 0x01000000403: crSel, + 0x01000000404: cut, + 0x01000000405: eraseEof, + 0x01000000406: exSel, + 0x01000000407: insert, + 0x01000000408: paste, + 0x01000000409: redo, + 0x0100000040a: undo, + 0x01000000501: accept, + 0x01000000502: again, + 0x01000000503: attn, + 0x01000000504: cancel, + 0x01000000505: contextMenu, + 0x01000000506: execute, + 0x01000000507: find, + 0x01000000508: help, + 0x01000000509: pause, + 0x0100000050a: play, + 0x0100000050b: props, + 0x0100000050c: select, + 0x0100000050d: zoomIn, + 0x0100000050e: zoomOut, + 0x01000000601: brightnessDown, + 0x01000000602: brightnessUp, + 0x01000000603: camera, + 0x01000000604: eject, + 0x01000000605: logOff, + 0x01000000606: power, + 0x01000000607: powerOff, + 0x01000000608: printScreen, + 0x01000000609: hibernate, + 0x0100000060a: standby, + 0x0100000060b: wakeUp, + 0x01000000701: allCandidates, + 0x01000000702: alphanumeric, + 0x01000000703: codeInput, + 0x01000000704: compose, + 0x01000000705: convert, + 0x01000000706: finalMode, + 0x01000000707: groupFirst, + 0x01000000708: groupLast, + 0x01000000709: groupNext, + 0x0100000070a: groupPrevious, + 0x0100000070b: modeChange, + 0x0100000070c: nextCandidate, + 0x0100000070d: nonConvert, + 0x0100000070e: previousCandidate, + 0x0100000070f: process, + 0x01000000710: singleCandidate, + 0x01000000711: hangulMode, + 0x01000000712: hanjaMode, + 0x01000000713: junjaMode, + 0x01000000714: eisu, + 0x01000000715: hankaku, + 0x01000000716: hiragana, + 0x01000000717: hiraganaKatakana, + 0x01000000718: kanaMode, + 0x01000000719: kanjiMode, + 0x0100000071a: katakana, + 0x0100000071b: romaji, + 0x0100000071c: zenkaku, + 0x0100000071d: zenkakuHankaku, + 0x01000000801: f1, + 0x01000000802: f2, + 0x01000000803: f3, + 0x01000000804: f4, + 0x01000000805: f5, + 0x01000000806: f6, + 0x01000000807: f7, + 0x01000000808: f8, + 0x01000000809: f9, + 0x0100000080a: f10, + 0x0100000080b: f11, + 0x0100000080c: f12, + 0x0100000080d: f13, + 0x0100000080e: f14, + 0x0100000080f: f15, + 0x01000000810: f16, + 0x01000000811: f17, + 0x01000000812: f18, + 0x01000000813: f19, + 0x01000000814: f20, + 0x01000000815: f21, + 0x01000000816: f22, + 0x01000000817: f23, + 0x01000000818: f24, + 0x01000000901: soft1, + 0x01000000902: soft2, + 0x01000000903: soft3, + 0x01000000904: soft4, + 0x01000000905: soft5, + 0x01000000906: soft6, + 0x01000000907: soft7, + 0x01000000908: soft8, + 0x01000000a01: close, + 0x01000000a02: mailForward, + 0x01000000a03: mailReply, + 0x01000000a04: mailSend, + 0x01000000a05: mediaPlayPause, + 0x01000000a07: mediaStop, + 0x01000000a08: mediaTrackNext, + 0x01000000a09: mediaTrackPrevious, + 0x01000000a0a: newKey, + 0x01000000a0b: open, + 0x01000000a0c: print, + 0x01000000a0d: save, + 0x01000000a0e: spellCheck, + 0x01000000a0f: audioVolumeDown, + 0x01000000a10: audioVolumeUp, + 0x01000000a11: audioVolumeMute, + 0x01000000b01: launchApplication2, + 0x01000000b02: launchCalendar, + 0x01000000b03: launchMail, + 0x01000000b04: launchMediaPlayer, + 0x01000000b05: launchMusicPlayer, + 0x01000000b06: launchApplication1, + 0x01000000b07: launchScreenSaver, + 0x01000000b08: launchSpreadsheet, + 0x01000000b09: launchWebBrowser, + 0x01000000b0a: launchWebCam, + 0x01000000b0b: launchWordProcessor, + 0x01000000b0c: launchContacts, + 0x01000000b0d: launchPhone, + 0x01000000b0e: launchAssistant, + 0x01000000b0f: launchControlPanel, + 0x01000000c01: browserBack, + 0x01000000c02: browserFavorites, + 0x01000000c03: browserForward, + 0x01000000c04: browserHome, + 0x01000000c05: browserRefresh, + 0x01000000c06: browserSearch, + 0x01000000c07: browserStop, + 0x01000000d01: audioBalanceLeft, + 0x01000000d02: audioBalanceRight, + 0x01000000d03: audioBassBoostDown, + 0x01000000d04: audioBassBoostUp, + 0x01000000d05: audioFaderFront, + 0x01000000d06: audioFaderRear, + 0x01000000d07: audioSurroundModeNext, + 0x01000000d08: avrInput, + 0x01000000d09: avrPower, + 0x01000000d0a: channelDown, + 0x01000000d0b: channelUp, + 0x01000000d0c: colorF0Red, + 0x01000000d0d: colorF1Green, + 0x01000000d0e: colorF2Yellow, + 0x01000000d0f: colorF3Blue, + 0x01000000d10: colorF4Grey, + 0x01000000d11: colorF5Brown, + 0x01000000d12: closedCaptionToggle, + 0x01000000d13: dimmer, + 0x01000000d14: displaySwap, + 0x01000000d15: exit, + 0x01000000d16: favoriteClear0, + 0x01000000d17: favoriteClear1, + 0x01000000d18: favoriteClear2, + 0x01000000d19: favoriteClear3, + 0x01000000d1a: favoriteRecall0, + 0x01000000d1b: favoriteRecall1, + 0x01000000d1c: favoriteRecall2, + 0x01000000d1d: favoriteRecall3, + 0x01000000d1e: favoriteStore0, + 0x01000000d1f: favoriteStore1, + 0x01000000d20: favoriteStore2, + 0x01000000d21: favoriteStore3, + 0x01000000d22: guide, + 0x01000000d23: guideNextDay, + 0x01000000d24: guidePreviousDay, + 0x01000000d25: info, + 0x01000000d26: instantReplay, + 0x01000000d27: link, + 0x01000000d28: listProgram, + 0x01000000d29: liveContent, + 0x01000000d2a: lock, + 0x01000000d2b: mediaApps, + 0x01000000d2c: mediaFastForward, + 0x01000000d2d: mediaLast, + 0x01000000d2e: mediaPause, + 0x01000000d2f: mediaPlay, + 0x01000000d30: mediaRecord, + 0x01000000d31: mediaRewind, + 0x01000000d32: mediaSkip, + 0x01000000d33: nextFavoriteChannel, + 0x01000000d34: nextUserProfile, + 0x01000000d35: onDemand, + 0x01000000d36: pInPDown, + 0x01000000d37: pInPMove, + 0x01000000d38: pInPToggle, + 0x01000000d39: pInPUp, + 0x01000000d3a: playSpeedDown, + 0x01000000d3b: playSpeedReset, + 0x01000000d3c: playSpeedUp, + 0x01000000d3d: randomToggle, + 0x01000000d3e: rcLowBattery, + 0x01000000d3f: recordSpeedNext, + 0x01000000d40: rfBypass, + 0x01000000d41: scanChannelsToggle, + 0x01000000d42: screenModeNext, + 0x01000000d43: settings, + 0x01000000d44: splitScreenToggle, + 0x01000000d45: stbInput, + 0x01000000d46: stbPower, + 0x01000000d47: subtitle, + 0x01000000d48: teletext, + 0x01000000d49: tv, + 0x01000000d4a: tvInput, + 0x01000000d4b: tvPower, + 0x01000000d4c: videoModeNext, + 0x01000000d4d: wink, + 0x01000000d4e: zoomToggle, + 0x01000000d4f: dvr, + 0x01000000d50: mediaAudioTrack, + 0x01000000d51: mediaSkipBackward, + 0x01000000d52: mediaSkipForward, + 0x01000000d53: mediaStepBackward, + 0x01000000d54: mediaStepForward, + 0x01000000d55: mediaTopMenu, + 0x01000000d56: navigateIn, + 0x01000000d57: navigateNext, + 0x01000000d58: navigateOut, + 0x01000000d59: navigatePrevious, + 0x01000000d5a: pairing, + 0x01000000d5b: mediaClose, + 0x01000000e02: audioBassBoostToggle, + 0x01000000e04: audioTrebleDown, + 0x01000000e05: audioTrebleUp, + 0x01000000e06: microphoneToggle, + 0x01000000e07: microphoneVolumeDown, + 0x01000000e08: microphoneVolumeUp, + 0x01000000e09: microphoneVolumeMute, + 0x01000000f01: speechCorrectionList, + 0x01000000f02: speechInputToggle, + 0x01000001001: appSwitch, + 0x01000001002: call, + 0x01000001003: cameraFocus, + 0x01000001004: endCall, + 0x01000001005: goBack, + 0x01000001006: goHome, + 0x01000001007: headsetHook, + 0x01000001008: lastNumberRedial, + 0x01000001009: notification, + 0x0100000100a: mannerMode, + 0x0100000100b: voiceDial, + 0x01000001101: tv3DMode, + 0x01000001102: tvAntennaCable, + 0x01000001103: tvAudioDescription, + 0x01000001104: tvAudioDescriptionMixDown, + 0x01000001105: tvAudioDescriptionMixUp, + 0x01000001106: tvContentsMenu, + 0x01000001107: tvDataService, + 0x01000001108: tvInputComponent1, + 0x01000001109: tvInputComponent2, + 0x0100000110a: tvInputComposite1, + 0x0100000110b: tvInputComposite2, + 0x0100000110c: tvInputHDMI1, + 0x0100000110d: tvInputHDMI2, + 0x0100000110e: tvInputHDMI3, + 0x0100000110f: tvInputHDMI4, + 0x01000001110: tvInputVGA1, + 0x01000001111: tvMediaContext, + 0x01000001112: tvNetwork, + 0x01000001113: tvNumberEntry, + 0x01000001114: tvRadioService, + 0x01000001115: tvSatellite, + 0x01000001116: tvSatelliteBS, + 0x01000001117: tvSatelliteCS, + 0x01000001118: tvSatelliteToggle, + 0x01000001119: tvTerrestrialAnalog, + 0x0100000111a: tvTerrestrialDigital, + 0x0100000111b: tvTimer, + 0x01000001201: key11, + 0x01000001202: key12, + 0x0100005ff01: gameButton1, + 0x0100005ff02: gameButton2, + 0x0100005ff03: gameButton3, + 0x0100005ff04: gameButton4, + 0x0100005ff05: gameButton5, + 0x0100005ff06: gameButton6, + 0x0100005ff07: gameButton7, + 0x0100005ff08: gameButton8, + 0x0100005ff09: gameButton9, + 0x0100005ff0a: gameButton10, + 0x0100005ff0b: gameButton11, + 0x0100005ff0c: gameButton12, + 0x0100005ff0d: gameButton13, + 0x0100005ff0e: gameButton14, + 0x0100005ff0f: gameButton15, + 0x0100005ff10: gameButton16, + 0x0100005ff11: gameButtonA, + 0x0100005ff12: gameButtonB, + 0x0100005ff13: gameButtonC, + 0x0100005ff14: gameButtonLeft1, + 0x0100005ff15: gameButtonLeft2, + 0x0100005ff16: gameButtonMode, + 0x0100005ff17: gameButtonRight1, + 0x0100005ff18: gameButtonRight2, + 0x0100005ff19: gameButtonSelect, + 0x0100005ff1a: gameButtonStart, + 0x0100005ff1b: gameButtonThumbLeft, + 0x0100005ff1c: gameButtonThumbRight, + 0x0100005ff1d: gameButtonX, + 0x0100005ff1e: gameButtonY, + 0x0100005ff1f: gameButtonZ, + 0x01100000014: suspend, + 0x01100000015: resume, + 0x01100010082: sleep, + 0x01100070064: intlBackslash, + 0x01100070087: intlRo, + 0x01100070089: intlYen, + 0x01100070090: lang1, + 0x01100070091: lang2, + 0x01100070092: lang3, + 0x01100070093: lang4, + 0x01100070094: lang5, + 0x0110007009b: abort, + 0x30000000102: altLeft, + 0x30000000105: controlLeft, + 0x30000000109: metaLeft, + 0x3000000010d: shiftLeft, + 0x40000000102: altRight, + 0x40000000105: controlRight, + 0x40000000109: metaRight, + 0x4000000010d: shiftRight, + 0x5000000000d: numpadEnter, + 0x50000000028: numpadParenLeft, + 0x50000000029: numpadParenRight, + 0x5000000002a: numpadMultiply, + 0x5000000002b: numpadAdd, + 0x5000000002c: numpadComma, + 0x5000000002d: numpadSubtract, + 0x5000000002e: numpadDecimal, + 0x5000000002f: numpadDivide, + 0x50000000030: numpad0, + 0x50000000031: numpad1, + 0x50000000032: numpad2, + 0x50000000033: numpad3, + 0x50000000034: numpad4, + 0x50000000035: numpad5, + 0x50000000036: numpad6, + 0x50000000037: numpad7, + 0x50000000038: numpad8, + 0x50000000039: numpad9, + 0x5000000003d: numpadEqual, + 0x2000000010d: shift, + 0x20000000109: meta, + 0x20000000102: alt, + 0x20000000105: control, }; // A map of keys to the pseudo-key synonym for that key. Used by getSynonyms. @@ -2025,21 +3059,46 @@ class LogicalKeyboardKey extends KeyboardKey { }; static const Map _keyLabels = { - 0x00100000000: 'None', - 0x00100000010: 'Hyper', - 0x00100000011: 'Super Key', - 0x00100000013: 'Fn Lock', - 0x00100000014: 'Suspend', - 0x00100000015: 'Resume', - 0x00100000016: 'Turbo', - 0x00100000017: 'Privacy Screen Toggle', - 0x00100010082: 'Sleep', - 0x00100010083: 'Wake Up', - 0x001000100b5: 'Display Toggle Int Ext', - 0x00100070000: 'Usb Reserved', - 0x00100070001: 'Usb Error Roll Over', - 0x00100070002: 'Usb Post Fail', - 0x00100070003: 'Usb Error Undefined', + 0x00000000000: 'None', + 0x00000000020: 'Space', + 0x00000000021: 'Exclamation', + 0x00000000022: 'Quote', + 0x00000000023: 'Number Sign', + 0x00000000024: 'Dollar', + 0x00000000025: 'Percent', + 0x00000000026: 'Ampersand', + 0x00000000027: 'Quote Single', + 0x00000000028: 'Parenthesis Left', + 0x00000000029: 'Parenthesis Right', + 0x0000000002a: 'Asterisk', + 0x0000000002b: 'Add', + 0x0000000002c: 'Comma', + 0x0000000002d: 'Minus', + 0x0000000002e: 'Period', + 0x0000000002f: 'Slash', + 0x00000000030: 'Digit 0', + 0x00000000031: 'Digit 1', + 0x00000000032: 'Digit 2', + 0x00000000033: 'Digit 3', + 0x00000000034: 'Digit 4', + 0x00000000035: 'Digit 5', + 0x00000000036: 'Digit 6', + 0x00000000037: 'Digit 7', + 0x00000000038: 'Digit 8', + 0x00000000039: 'Digit 9', + 0x0000000003a: 'Colon', + 0x0000000003b: 'Semicolon', + 0x0000000003c: 'Less', + 0x0000000003d: 'Equal', + 0x0000000003e: 'Greater', + 0x0000000003f: 'Question', + 0x00000000040: 'At', + 0x0000000005b: 'Bracket Left', + 0x0000000005c: 'Backslash', + 0x0000000005d: 'Bracket Right', + 0x0000000005e: 'Caret', + 0x0000000005f: 'Underscore', + 0x00000000060: 'Backquote', 0x00000000061: 'Key A', 0x00000000062: 'Key B', 0x00000000063: 'Key C', @@ -2066,238 +3125,385 @@ class LogicalKeyboardKey extends KeyboardKey { 0x00000000078: 'Key X', 0x00000000079: 'Key Y', 0x0000000007a: 'Key Z', - 0x00000000031: 'Digit 1', - 0x00000000032: 'Digit 2', - 0x00000000033: 'Digit 3', - 0x00000000034: 'Digit 4', - 0x00000000035: 'Digit 5', - 0x00000000036: 'Digit 6', - 0x00000000037: 'Digit 7', - 0x00000000038: 'Digit 8', - 0x00000000039: 'Digit 9', - 0x00000000030: 'Digit 0', - 0x00100070028: 'Enter', - 0x00100070029: 'Escape', - 0x0010007002a: 'Backspace', - 0x0010007002b: 'Tab', - 0x00000000020: 'Space', - 0x0000000002d: 'Minus', - 0x0000000003d: 'Equal', - 0x0000000005b: 'Bracket Left', - 0x0000000005d: 'Bracket Right', - 0x0000000005c: 'Backslash', - 0x0000000003b: 'Semicolon', - 0x00000000027: 'Quote', - 0x00000000060: 'Backquote', - 0x0000000002c: 'Comma', - 0x0000000002e: 'Period', - 0x0000000002f: 'Slash', - 0x00100070039: 'Caps Lock', - 0x0010007003a: 'F1', - 0x0010007003b: 'F2', - 0x0010007003c: 'F3', - 0x0010007003d: 'F4', - 0x0010007003e: 'F5', - 0x0010007003f: 'F6', - 0x00100070040: 'F7', - 0x00100070041: 'F8', - 0x00100070042: 'F9', - 0x00100070043: 'F10', - 0x00100070044: 'F11', - 0x00100070045: 'F12', - 0x00100070046: 'Print Screen', - 0x00100070047: 'Scroll Lock', - 0x00100070048: 'Pause', - 0x00100070049: 'Insert', - 0x0010007004a: 'Home', - 0x0010007004b: 'Page Up', - 0x0010007004c: 'Delete', - 0x0010007004d: 'End', - 0x0010007004e: 'Page Down', - 0x0010007004f: 'Arrow Right', - 0x00100070050: 'Arrow Left', - 0x00100070051: 'Arrow Down', - 0x00100070052: 'Arrow Up', - 0x00100070053: 'Num Lock', - 0x00100070054: 'Numpad Divide', - 0x00100070055: 'Numpad Multiply', - 0x00100070056: 'Numpad Subtract', - 0x00100070057: 'Numpad Add', - 0x00100070058: 'Numpad Enter', - 0x00100070059: 'Numpad 1', - 0x0010007005a: 'Numpad 2', - 0x0010007005b: 'Numpad 3', - 0x0010007005c: 'Numpad 4', - 0x0010007005d: 'Numpad 5', - 0x0010007005e: 'Numpad 6', - 0x0010007005f: 'Numpad 7', - 0x00100070060: 'Numpad 8', - 0x00100070061: 'Numpad 9', - 0x00100070062: 'Numpad 0', - 0x00100070063: 'Numpad Decimal', - 0x00100070064: 'Intl Backslash', - 0x00100070065: 'Context Menu', - 0x00100070066: 'Power', - 0x00100070067: 'Numpad Equal', - 0x00100070068: 'F13', - 0x00100070069: 'F14', - 0x0010007006a: 'F15', - 0x0010007006b: 'F16', - 0x0010007006c: 'F17', - 0x0010007006d: 'F18', - 0x0010007006e: 'F19', - 0x0010007006f: 'F20', - 0x00100070070: 'F21', - 0x00100070071: 'F22', - 0x00100070072: 'F23', - 0x00100070073: 'F24', - 0x00100070074: 'Open', - 0x00100070075: 'Help', - 0x00100070077: 'Select', - 0x00100070079: 'Again', - 0x0010007007a: 'Undo', - 0x0010007007b: 'Cut', - 0x0010007007c: 'Copy', - 0x0010007007d: 'Paste', - 0x0010007007e: 'Find', - 0x0010007007f: 'Audio Volume Mute', - 0x00100070080: 'Audio Volume Up', - 0x00100070081: 'Audio Volume Down', - 0x00100070085: 'Numpad Comma', - 0x00100070087: 'Intl Ro', - 0x00100070088: 'Kana Mode', - 0x00100070089: 'Intl Yen', - 0x0010007008a: 'Convert', - 0x0010007008b: 'Non Convert', - 0x00100070090: 'Lang 1', - 0x00100070091: 'Lang 2', - 0x00100070092: 'Lang 3', - 0x00100070093: 'Lang 4', - 0x00100070094: 'Lang 5', - 0x0010007009b: 'Abort', - 0x001000700a3: 'Props', - 0x001000700b6: 'Numpad Paren Left', - 0x001000700b7: 'Numpad Paren Right', - 0x001000700bb: 'Numpad Backspace', - 0x001000700d0: 'Numpad Memory Store', - 0x001000700d1: 'Numpad Memory Recall', - 0x001000700d2: 'Numpad Memory Clear', - 0x001000700d3: 'Numpad Memory Add', - 0x001000700d4: 'Numpad Memory Subtract', - 0x001000700d7: 'Numpad Sign Change', - 0x001000700d8: 'Numpad Clear', - 0x001000700d9: 'Numpad Clear Entry', - 0x001000700e0: 'Control Left', - 0x001000700e1: 'Shift Left', - 0x001000700e2: 'Alt Left', - 0x001000700e3: 'Meta Left', - 0x001000700e4: 'Control Right', - 0x001000700e5: 'Shift Right', - 0x001000700e6: 'Alt Right', - 0x001000700e7: 'Meta Right', - 0x001000c0060: 'Info', - 0x001000c0061: 'Closed Caption Toggle', - 0x001000c006f: 'Brightness Up', - 0x001000c0070: 'Brightness Down', - 0x001000c0072: 'Brightness Toggle', - 0x001000c0073: 'Brightness Minimum', - 0x001000c0074: 'Brightness Maximum', - 0x001000c0075: 'Brightness Auto', - 0x001000c0079: 'Kbd Illum Up', - 0x001000c007a: 'Kbd Illum Down', - 0x001000c0083: 'Media Last', - 0x001000c008c: 'Launch Phone', - 0x001000c008d: 'Program Guide', - 0x001000c0094: 'Exit', - 0x001000c009c: 'Channel Up', - 0x001000c009d: 'Channel Down', - 0x001000c00b0: 'Media Play', - 0x001000c00b1: 'Media Pause', - 0x001000c00b2: 'Media Record', - 0x001000c00b3: 'Media Fast Forward', - 0x001000c00b4: 'Media Rewind', - 0x001000c00b5: 'Media Track Next', - 0x001000c00b6: 'Media Track Previous', - 0x001000c00b7: 'Media Stop', - 0x001000c00b8: 'Eject', - 0x001000c00cd: 'Media Play Pause', - 0x001000c00cf: 'Speech Input Toggle', - 0x001000c00e5: 'Bass Boost', - 0x001000c0183: 'Media Select', - 0x001000c0184: 'Launch Word Processor', - 0x001000c0186: 'Launch Spreadsheet', - 0x001000c018a: 'Launch Mail', - 0x001000c018d: 'Launch Contacts', - 0x001000c018e: 'Launch Calendar', - 0x001000c0192: 'Launch App2', - 0x001000c0194: 'Launch App1', - 0x001000c0196: 'Launch Internet Browser', - 0x001000c019c: 'Log Off', - 0x001000c019e: 'Lock Screen', - 0x001000c019f: 'Launch Control Panel', - 0x001000c01a2: 'Select Task', - 0x001000c01a7: 'Launch Documents', - 0x001000c01ab: 'Spell Check', - 0x001000c01ae: 'Launch Keyboard Layout', - 0x001000c01b1: 'Launch Screen Saver', - 0x001000c01cb: 'Launch Assistant', - 0x001000c01b7: 'Launch Audio Browser', - 0x001000c0201: 'New Key', - 0x001000c0203: 'Close', - 0x001000c0207: 'Save', - 0x001000c0208: 'Print', - 0x001000c0221: 'Browser Search', - 0x001000c0223: 'Browser Home', - 0x001000c0224: 'Browser Back', - 0x001000c0225: 'Browser Forward', - 0x001000c0226: 'Browser Stop', - 0x001000c0227: 'Browser Refresh', - 0x001000c022a: 'Browser Favorites', - 0x001000c022d: 'Zoom In', - 0x001000c022e: 'Zoom Out', - 0x001000c0232: 'Zoom Toggle', - 0x001000c0279: 'Redo', - 0x001000c0289: 'Mail Reply', - 0x001000c028b: 'Mail Forward', - 0x001000c028c: 'Mail Send', - 0x001000c029d: 'Keyboard Layout Select', - 0x001000c029f: 'Show All Windows', - 0x0010005ff01: 'Game Button 1', - 0x0010005ff02: 'Game Button 2', - 0x0010005ff03: 'Game Button 3', - 0x0010005ff04: 'Game Button 4', - 0x0010005ff05: 'Game Button 5', - 0x0010005ff06: 'Game Button 6', - 0x0010005ff07: 'Game Button 7', - 0x0010005ff08: 'Game Button 8', - 0x0010005ff09: 'Game Button 9', - 0x0010005ff0a: 'Game Button 10', - 0x0010005ff0b: 'Game Button 11', - 0x0010005ff0c: 'Game Button 12', - 0x0010005ff0d: 'Game Button 13', - 0x0010005ff0e: 'Game Button 14', - 0x0010005ff0f: 'Game Button 15', - 0x0010005ff10: 'Game Button 16', - 0x0010005ff11: 'Game Button A', - 0x0010005ff12: 'Game Button B', - 0x0010005ff13: 'Game Button C', - 0x0010005ff14: 'Game Button Left 1', - 0x0010005ff15: 'Game Button Left 2', - 0x0010005ff16: 'Game Button Mode', - 0x0010005ff17: 'Game Button Right 1', - 0x0010005ff18: 'Game Button Right 2', - 0x0010005ff19: 'Game Button Select', - 0x0010005ff1a: 'Game Button Start', - 0x0010005ff1b: 'Game Button Thumb Left', - 0x0010005ff1c: 'Game Button Thumb Right', - 0x0010005ff1d: 'Game Button X', - 0x0010005ff1e: 'Game Button Y', - 0x0010005ff1f: 'Game Button Z', - 0x00100000012: 'Fn', - 0x201000700e1: 'Shift', - 0x201000700e3: 'Meta', - 0x201000700e2: 'Alt', - 0x201000700e0: 'Control', + 0x0000000007b: 'Brace Left', + 0x0000000007c: 'Bar', + 0x0000000007d: 'Brace Right', + 0x0000000007e: 'Tilde', + 0x01000000001: 'Unidentified', + 0x01000000008: 'Backspace', + 0x01000000009: 'Tab', + 0x0100000000d: 'Enter', + 0x0100000001b: 'Escape', + 0x0100000007f: 'Delete', + 0x01000000101: 'Accel', + 0x01000000103: 'Alt Graph', + 0x01000000104: 'Caps Lock', + 0x01000000106: 'Fn', + 0x01000000107: 'Fn Lock', + 0x01000000108: 'Hyper', + 0x0100000010a: 'Num Lock', + 0x0100000010c: 'Scroll Lock', + 0x0100000010e: 'Super', + 0x0100000010f: 'Symbol', + 0x01000000110: 'Symbol Lock', + 0x01000000111: 'Shift Level 5', + 0x01000000301: 'Arrow Down', + 0x01000000302: 'Arrow Left', + 0x01000000303: 'Arrow Right', + 0x01000000304: 'Arrow Up', + 0x01000000305: 'End', + 0x01000000306: 'Home', + 0x01000000307: 'Page Down', + 0x01000000308: 'Page Up', + 0x01000000401: 'Clear', + 0x01000000402: 'Copy', + 0x01000000403: 'Cr Sel', + 0x01000000404: 'Cut', + 0x01000000405: 'Erase Eof', + 0x01000000406: 'Ex Sel', + 0x01000000407: 'Insert', + 0x01000000408: 'Paste', + 0x01000000409: 'Redo', + 0x0100000040a: 'Undo', + 0x01000000501: 'Accept', + 0x01000000502: 'Again', + 0x01000000503: 'Attn', + 0x01000000504: 'Cancel', + 0x01000000505: 'Context Menu', + 0x01000000506: 'Execute', + 0x01000000507: 'Find', + 0x01000000508: 'Help', + 0x01000000509: 'Pause', + 0x0100000050a: 'Play', + 0x0100000050b: 'Props', + 0x0100000050c: 'Select', + 0x0100000050d: 'Zoom In', + 0x0100000050e: 'Zoom Out', + 0x01000000601: 'Brightness Down', + 0x01000000602: 'Brightness Up', + 0x01000000603: 'Camera', + 0x01000000604: 'Eject', + 0x01000000605: 'Log Off', + 0x01000000606: 'Power', + 0x01000000607: 'Power Off', + 0x01000000608: 'Print Screen', + 0x01000000609: 'Hibernate', + 0x0100000060a: 'Standby', + 0x0100000060b: 'Wake Up', + 0x01000000701: 'All Candidates', + 0x01000000702: 'Alphanumeric', + 0x01000000703: 'Code Input', + 0x01000000704: 'Compose', + 0x01000000705: 'Convert', + 0x01000000706: 'Final Mode', + 0x01000000707: 'Group First', + 0x01000000708: 'Group Last', + 0x01000000709: 'Group Next', + 0x0100000070a: 'Group Previous', + 0x0100000070b: 'Mode Change', + 0x0100000070c: 'Next Candidate', + 0x0100000070d: 'Non Convert', + 0x0100000070e: 'Previous Candidate', + 0x0100000070f: 'Process', + 0x01000000710: 'Single Candidate', + 0x01000000711: 'Hangul Mode', + 0x01000000712: 'Hanja Mode', + 0x01000000713: 'Junja Mode', + 0x01000000714: 'Eisu', + 0x01000000715: 'Hankaku', + 0x01000000716: 'Hiragana', + 0x01000000717: 'Hiragana Katakana', + 0x01000000718: 'Kana Mode', + 0x01000000719: 'Kanji Mode', + 0x0100000071a: 'Katakana', + 0x0100000071b: 'Romaji', + 0x0100000071c: 'Zenkaku', + 0x0100000071d: 'Zenkaku Hankaku', + 0x01000000801: 'F1', + 0x01000000802: 'F2', + 0x01000000803: 'F3', + 0x01000000804: 'F4', + 0x01000000805: 'F5', + 0x01000000806: 'F6', + 0x01000000807: 'F7', + 0x01000000808: 'F8', + 0x01000000809: 'F9', + 0x0100000080a: 'F10', + 0x0100000080b: 'F11', + 0x0100000080c: 'F12', + 0x0100000080d: 'F13', + 0x0100000080e: 'F14', + 0x0100000080f: 'F15', + 0x01000000810: 'F16', + 0x01000000811: 'F17', + 0x01000000812: 'F18', + 0x01000000813: 'F19', + 0x01000000814: 'F20', + 0x01000000815: 'F21', + 0x01000000816: 'F22', + 0x01000000817: 'F23', + 0x01000000818: 'F24', + 0x01000000901: 'Soft 1', + 0x01000000902: 'Soft 2', + 0x01000000903: 'Soft 3', + 0x01000000904: 'Soft 4', + 0x01000000905: 'Soft 5', + 0x01000000906: 'Soft 6', + 0x01000000907: 'Soft 7', + 0x01000000908: 'Soft 8', + 0x01000000a01: 'Close', + 0x01000000a02: 'Mail Forward', + 0x01000000a03: 'Mail Reply', + 0x01000000a04: 'Mail Send', + 0x01000000a05: 'Media Play Pause', + 0x01000000a07: 'Media Stop', + 0x01000000a08: 'Media Track Next', + 0x01000000a09: 'Media Track Previous', + 0x01000000a0a: 'New', + 0x01000000a0b: 'Open', + 0x01000000a0c: 'Print', + 0x01000000a0d: 'Save', + 0x01000000a0e: 'Spell Check', + 0x01000000a0f: 'Audio Volume Down', + 0x01000000a10: 'Audio Volume Up', + 0x01000000a11: 'Audio Volume Mute', + 0x01000000b01: 'Launch Application 2', + 0x01000000b02: 'Launch Calendar', + 0x01000000b03: 'Launch Mail', + 0x01000000b04: 'Launch Media Player', + 0x01000000b05: 'Launch Music Player', + 0x01000000b06: 'Launch Application 1', + 0x01000000b07: 'Launch Screen Saver', + 0x01000000b08: 'Launch Spreadsheet', + 0x01000000b09: 'Launch Web Browser', + 0x01000000b0a: 'Launch Web Cam', + 0x01000000b0b: 'Launch Word Processor', + 0x01000000b0c: 'Launch Contacts', + 0x01000000b0d: 'Launch Phone', + 0x01000000b0e: 'Launch Assistant', + 0x01000000b0f: 'Launch Control Panel', + 0x01000000c01: 'Browser Back', + 0x01000000c02: 'Browser Favorites', + 0x01000000c03: 'Browser Forward', + 0x01000000c04: 'Browser Home', + 0x01000000c05: 'Browser Refresh', + 0x01000000c06: 'Browser Search', + 0x01000000c07: 'Browser Stop', + 0x01000000d01: 'Audio Balance Left', + 0x01000000d02: 'Audio Balance Right', + 0x01000000d03: 'Audio Bass Boost Down', + 0x01000000d04: 'Audio Bass Boost Up', + 0x01000000d05: 'Audio Fader Front', + 0x01000000d06: 'Audio Fader Rear', + 0x01000000d07: 'Audio Surround Mode Next', + 0x01000000d08: 'AVR Input', + 0x01000000d09: 'AVR Power', + 0x01000000d0a: 'Channel Down', + 0x01000000d0b: 'Channel Up', + 0x01000000d0c: 'Color F0 Red', + 0x01000000d0d: 'Color F1 Green', + 0x01000000d0e: 'Color F2 Yellow', + 0x01000000d0f: 'Color F3 Blue', + 0x01000000d10: 'Color F4 Grey', + 0x01000000d11: 'Color F5 Brown', + 0x01000000d12: 'Closed Caption Toggle', + 0x01000000d13: 'Dimmer', + 0x01000000d14: 'Display Swap', + 0x01000000d15: 'Exit', + 0x01000000d16: 'Favorite Clear 0', + 0x01000000d17: 'Favorite Clear 1', + 0x01000000d18: 'Favorite Clear 2', + 0x01000000d19: 'Favorite Clear 3', + 0x01000000d1a: 'Favorite Recall 0', + 0x01000000d1b: 'Favorite Recall 1', + 0x01000000d1c: 'Favorite Recall 2', + 0x01000000d1d: 'Favorite Recall 3', + 0x01000000d1e: 'Favorite Store 0', + 0x01000000d1f: 'Favorite Store 1', + 0x01000000d20: 'Favorite Store 2', + 0x01000000d21: 'Favorite Store 3', + 0x01000000d22: 'Guide', + 0x01000000d23: 'Guide Next Day', + 0x01000000d24: 'Guide Previous Day', + 0x01000000d25: 'Info', + 0x01000000d26: 'Instant Replay', + 0x01000000d27: 'Link', + 0x01000000d28: 'List Program', + 0x01000000d29: 'Live Content', + 0x01000000d2a: 'Lock', + 0x01000000d2b: 'Media Apps', + 0x01000000d2c: 'Media Fast Forward', + 0x01000000d2d: 'Media Last', + 0x01000000d2e: 'Media Pause', + 0x01000000d2f: 'Media Play', + 0x01000000d30: 'Media Record', + 0x01000000d31: 'Media Rewind', + 0x01000000d32: 'Media Skip', + 0x01000000d33: 'Next Favorite Channel', + 0x01000000d34: 'Next User Profile', + 0x01000000d35: 'On Demand', + 0x01000000d36: 'P In P Down', + 0x01000000d37: 'P In P Move', + 0x01000000d38: 'P In P Toggle', + 0x01000000d39: 'P In P Up', + 0x01000000d3a: 'Play Speed Down', + 0x01000000d3b: 'Play Speed Reset', + 0x01000000d3c: 'Play Speed Up', + 0x01000000d3d: 'Random Toggle', + 0x01000000d3e: 'Rc Low Battery', + 0x01000000d3f: 'Record Speed Next', + 0x01000000d40: 'Rf Bypass', + 0x01000000d41: 'Scan Channels Toggle', + 0x01000000d42: 'Screen Mode Next', + 0x01000000d43: 'Settings', + 0x01000000d44: 'Split Screen Toggle', + 0x01000000d45: 'STB Input', + 0x01000000d46: 'STB Power', + 0x01000000d47: 'Subtitle', + 0x01000000d48: 'Teletext', + 0x01000000d49: 'TV', + 0x01000000d4a: 'TV Input', + 0x01000000d4b: 'TV Power', + 0x01000000d4c: 'Video Mode Next', + 0x01000000d4d: 'Wink', + 0x01000000d4e: 'Zoom Toggle', + 0x01000000d4f: 'DVR', + 0x01000000d50: 'Media Audio Track', + 0x01000000d51: 'Media Skip Backward', + 0x01000000d52: 'Media Skip Forward', + 0x01000000d53: 'Media Step Backward', + 0x01000000d54: 'Media Step Forward', + 0x01000000d55: 'Media Top Menu', + 0x01000000d56: 'Navigate In', + 0x01000000d57: 'Navigate Next', + 0x01000000d58: 'Navigate Out', + 0x01000000d59: 'Navigate Previous', + 0x01000000d5a: 'Pairing', + 0x01000000d5b: 'Media Close', + 0x01000000e02: 'Audio Bass Boost Toggle', + 0x01000000e04: 'Audio Treble Down', + 0x01000000e05: 'Audio Treble Up', + 0x01000000e06: 'Microphone Toggle', + 0x01000000e07: 'Microphone Volume Down', + 0x01000000e08: 'Microphone Volume Up', + 0x01000000e09: 'Microphone Volume Mute', + 0x01000000f01: 'Speech Correction List', + 0x01000000f02: 'Speech Input Toggle', + 0x01000001001: 'App Switch', + 0x01000001002: 'Call', + 0x01000001003: 'Camera Focus', + 0x01000001004: 'End Call', + 0x01000001005: 'Go Back', + 0x01000001006: 'Go Home', + 0x01000001007: 'Headset Hook', + 0x01000001008: 'Last Number Redial', + 0x01000001009: 'Notification', + 0x0100000100a: 'Manner Mode', + 0x0100000100b: 'Voice Dial', + 0x01000001101: 'TV 3 D Mode', + 0x01000001102: 'TV Antenna Cable', + 0x01000001103: 'TV Audio Description', + 0x01000001104: 'TV Audio Description Mix Down', + 0x01000001105: 'TV Audio Description Mix Up', + 0x01000001106: 'TV Contents Menu', + 0x01000001107: 'TV Data Service', + 0x01000001108: 'TV Input Component 1', + 0x01000001109: 'TV Input Component 2', + 0x0100000110a: 'TV Input Composite 1', + 0x0100000110b: 'TV Input Composite 2', + 0x0100000110c: 'TV Input HDMI 1', + 0x0100000110d: 'TV Input HDMI 2', + 0x0100000110e: 'TV Input HDMI 3', + 0x0100000110f: 'TV Input HDMI 4', + 0x01000001110: 'TV Input VGA 1', + 0x01000001111: 'TV Media Context', + 0x01000001112: 'TV Network', + 0x01000001113: 'TV Number Entry', + 0x01000001114: 'TV Radio Service', + 0x01000001115: 'TV Satellite', + 0x01000001116: 'TV Satellite BS', + 0x01000001117: 'TV Satellite CS', + 0x01000001118: 'TV Satellite Toggle', + 0x01000001119: 'TV Terrestrial Analog', + 0x0100000111a: 'TV Terrestrial Digital', + 0x0100000111b: 'TV Timer', + 0x01000001201: 'Key 11', + 0x01000001202: 'Key 12', + 0x0100005ff01: 'Game Button 1', + 0x0100005ff02: 'Game Button 2', + 0x0100005ff03: 'Game Button 3', + 0x0100005ff04: 'Game Button 4', + 0x0100005ff05: 'Game Button 5', + 0x0100005ff06: 'Game Button 6', + 0x0100005ff07: 'Game Button 7', + 0x0100005ff08: 'Game Button 8', + 0x0100005ff09: 'Game Button 9', + 0x0100005ff0a: 'Game Button 10', + 0x0100005ff0b: 'Game Button 11', + 0x0100005ff0c: 'Game Button 12', + 0x0100005ff0d: 'Game Button 13', + 0x0100005ff0e: 'Game Button 14', + 0x0100005ff0f: 'Game Button 15', + 0x0100005ff10: 'Game Button 16', + 0x0100005ff11: 'Game Button A', + 0x0100005ff12: 'Game Button B', + 0x0100005ff13: 'Game Button C', + 0x0100005ff14: 'Game Button Left 1', + 0x0100005ff15: 'Game Button Left 2', + 0x0100005ff16: 'Game Button Mode', + 0x0100005ff17: 'Game Button Right 1', + 0x0100005ff18: 'Game Button Right 2', + 0x0100005ff19: 'Game Button Select', + 0x0100005ff1a: 'Game Button Start', + 0x0100005ff1b: 'Game Button Thumb Left', + 0x0100005ff1c: 'Game Button Thumb Right', + 0x0100005ff1d: 'Game Button X', + 0x0100005ff1e: 'Game Button Y', + 0x0100005ff1f: 'Game Button Z', + 0x01100000014: 'Suspend', + 0x01100000015: 'Resume', + 0x01100010082: 'Sleep', + 0x01100070064: 'Intl Backslash', + 0x01100070087: 'Intl Ro', + 0x01100070089: 'Intl Yen', + 0x01100070090: 'Lang 1', + 0x01100070091: 'Lang 2', + 0x01100070092: 'Lang 3', + 0x01100070093: 'Lang 4', + 0x01100070094: 'Lang 5', + 0x0110007009b: 'Abort', + 0x30000000102: 'Alt Left', + 0x30000000105: 'Control Left', + 0x30000000109: 'Meta Left', + 0x3000000010d: 'Shift Left', + 0x40000000102: 'Alt Right', + 0x40000000105: 'Control Right', + 0x40000000109: 'Meta Right', + 0x4000000010d: 'Shift Right', + 0x5000000000d: 'Numpad Enter', + 0x50000000028: 'Numpad Paren Left', + 0x50000000029: 'Numpad Paren Right', + 0x5000000002a: 'Numpad Multiply', + 0x5000000002b: 'Numpad Add', + 0x5000000002c: 'Numpad Comma', + 0x5000000002d: 'Numpad Subtract', + 0x5000000002e: 'Numpad Decimal', + 0x5000000002f: 'Numpad Divide', + 0x50000000030: 'Numpad 0', + 0x50000000031: 'Numpad 1', + 0x50000000032: 'Numpad 2', + 0x50000000033: 'Numpad 3', + 0x50000000034: 'Numpad 4', + 0x50000000035: 'Numpad 5', + 0x50000000036: 'Numpad 6', + 0x50000000037: 'Numpad 7', + 0x50000000038: 'Numpad 8', + 0x50000000039: 'Numpad 9', + 0x5000000003d: 'Numpad Equal', + 0x2000000010d: 'Shift', + 0x20000000109: 'Meta', + 0x20000000102: 'Alt', + 0x20000000105: 'Control', }; } @@ -2461,6 +3667,11 @@ class PhysicalKeyboardKey extends KeyboardKey { /// See the function [RawKeyEvent.physicalKey] for more information. static const PhysicalKeyboardKey superKey = PhysicalKeyboardKey(0x00000011); + /// Represents the location of the "Fn" key on a generalized keyboard. + /// + /// See the function [RawKeyEvent.physicalKey] for more information. + static const PhysicalKeyboardKey fn = PhysicalKeyboardKey(0x00000012); + /// Represents the location of the "Fn Lock" key on a generalized keyboard. /// /// See the function [RawKeyEvent.physicalKey] for more information. @@ -2503,6 +3714,192 @@ class PhysicalKeyboardKey extends KeyboardKey { /// See the function [RawKeyEvent.physicalKey] for more information. static const PhysicalKeyboardKey displayToggleIntExt = PhysicalKeyboardKey(0x000100b5); + /// Represents the location of the "Game Button 1" key on a generalized + /// keyboard. + /// + /// See the function [RawKeyEvent.physicalKey] for more information. + static const PhysicalKeyboardKey gameButton1 = PhysicalKeyboardKey(0x0005ff01); + + /// Represents the location of the "Game Button 2" key on a generalized + /// keyboard. + /// + /// See the function [RawKeyEvent.physicalKey] for more information. + static const PhysicalKeyboardKey gameButton2 = PhysicalKeyboardKey(0x0005ff02); + + /// Represents the location of the "Game Button 3" key on a generalized + /// keyboard. + /// + /// See the function [RawKeyEvent.physicalKey] for more information. + static const PhysicalKeyboardKey gameButton3 = PhysicalKeyboardKey(0x0005ff03); + + /// Represents the location of the "Game Button 4" key on a generalized + /// keyboard. + /// + /// See the function [RawKeyEvent.physicalKey] for more information. + static const PhysicalKeyboardKey gameButton4 = PhysicalKeyboardKey(0x0005ff04); + + /// Represents the location of the "Game Button 5" key on a generalized + /// keyboard. + /// + /// See the function [RawKeyEvent.physicalKey] for more information. + static const PhysicalKeyboardKey gameButton5 = PhysicalKeyboardKey(0x0005ff05); + + /// Represents the location of the "Game Button 6" key on a generalized + /// keyboard. + /// + /// See the function [RawKeyEvent.physicalKey] for more information. + static const PhysicalKeyboardKey gameButton6 = PhysicalKeyboardKey(0x0005ff06); + + /// Represents the location of the "Game Button 7" key on a generalized + /// keyboard. + /// + /// See the function [RawKeyEvent.physicalKey] for more information. + static const PhysicalKeyboardKey gameButton7 = PhysicalKeyboardKey(0x0005ff07); + + /// Represents the location of the "Game Button 8" key on a generalized + /// keyboard. + /// + /// See the function [RawKeyEvent.physicalKey] for more information. + static const PhysicalKeyboardKey gameButton8 = PhysicalKeyboardKey(0x0005ff08); + + /// Represents the location of the "Game Button 9" key on a generalized + /// keyboard. + /// + /// See the function [RawKeyEvent.physicalKey] for more information. + static const PhysicalKeyboardKey gameButton9 = PhysicalKeyboardKey(0x0005ff09); + + /// Represents the location of the "Game Button 10" key on a generalized + /// keyboard. + /// + /// See the function [RawKeyEvent.physicalKey] for more information. + static const PhysicalKeyboardKey gameButton10 = PhysicalKeyboardKey(0x0005ff0a); + + /// Represents the location of the "Game Button 11" key on a generalized + /// keyboard. + /// + /// See the function [RawKeyEvent.physicalKey] for more information. + static const PhysicalKeyboardKey gameButton11 = PhysicalKeyboardKey(0x0005ff0b); + + /// Represents the location of the "Game Button 12" key on a generalized + /// keyboard. + /// + /// See the function [RawKeyEvent.physicalKey] for more information. + static const PhysicalKeyboardKey gameButton12 = PhysicalKeyboardKey(0x0005ff0c); + + /// Represents the location of the "Game Button 13" key on a generalized + /// keyboard. + /// + /// See the function [RawKeyEvent.physicalKey] for more information. + static const PhysicalKeyboardKey gameButton13 = PhysicalKeyboardKey(0x0005ff0d); + + /// Represents the location of the "Game Button 14" key on a generalized + /// keyboard. + /// + /// See the function [RawKeyEvent.physicalKey] for more information. + static const PhysicalKeyboardKey gameButton14 = PhysicalKeyboardKey(0x0005ff0e); + + /// Represents the location of the "Game Button 15" key on a generalized + /// keyboard. + /// + /// See the function [RawKeyEvent.physicalKey] for more information. + static const PhysicalKeyboardKey gameButton15 = PhysicalKeyboardKey(0x0005ff0f); + + /// Represents the location of the "Game Button 16" key on a generalized + /// keyboard. + /// + /// See the function [RawKeyEvent.physicalKey] for more information. + static const PhysicalKeyboardKey gameButton16 = PhysicalKeyboardKey(0x0005ff10); + + /// Represents the location of the "Game Button A" key on a generalized + /// keyboard. + /// + /// See the function [RawKeyEvent.physicalKey] for more information. + static const PhysicalKeyboardKey gameButtonA = PhysicalKeyboardKey(0x0005ff11); + + /// Represents the location of the "Game Button B" key on a generalized + /// keyboard. + /// + /// See the function [RawKeyEvent.physicalKey] for more information. + static const PhysicalKeyboardKey gameButtonB = PhysicalKeyboardKey(0x0005ff12); + + /// Represents the location of the "Game Button C" key on a generalized + /// keyboard. + /// + /// See the function [RawKeyEvent.physicalKey] for more information. + static const PhysicalKeyboardKey gameButtonC = PhysicalKeyboardKey(0x0005ff13); + + /// Represents the location of the "Game Button Left 1" key on a generalized + /// keyboard. + /// + /// See the function [RawKeyEvent.physicalKey] for more information. + static const PhysicalKeyboardKey gameButtonLeft1 = PhysicalKeyboardKey(0x0005ff14); + + /// Represents the location of the "Game Button Left 2" key on a generalized + /// keyboard. + /// + /// See the function [RawKeyEvent.physicalKey] for more information. + static const PhysicalKeyboardKey gameButtonLeft2 = PhysicalKeyboardKey(0x0005ff15); + + /// Represents the location of the "Game Button Mode" key on a generalized + /// keyboard. + /// + /// See the function [RawKeyEvent.physicalKey] for more information. + static const PhysicalKeyboardKey gameButtonMode = PhysicalKeyboardKey(0x0005ff16); + + /// Represents the location of the "Game Button Right 1" key on a generalized + /// keyboard. + /// + /// See the function [RawKeyEvent.physicalKey] for more information. + static const PhysicalKeyboardKey gameButtonRight1 = PhysicalKeyboardKey(0x0005ff17); + + /// Represents the location of the "Game Button Right 2" key on a generalized + /// keyboard. + /// + /// See the function [RawKeyEvent.physicalKey] for more information. + static const PhysicalKeyboardKey gameButtonRight2 = PhysicalKeyboardKey(0x0005ff18); + + /// Represents the location of the "Game Button Select" key on a generalized + /// keyboard. + /// + /// See the function [RawKeyEvent.physicalKey] for more information. + static const PhysicalKeyboardKey gameButtonSelect = PhysicalKeyboardKey(0x0005ff19); + + /// Represents the location of the "Game Button Start" key on a generalized + /// keyboard. + /// + /// See the function [RawKeyEvent.physicalKey] for more information. + static const PhysicalKeyboardKey gameButtonStart = PhysicalKeyboardKey(0x0005ff1a); + + /// Represents the location of the "Game Button Thumb Left" key on a + /// generalized keyboard. + /// + /// See the function [RawKeyEvent.physicalKey] for more information. + static const PhysicalKeyboardKey gameButtonThumbLeft = PhysicalKeyboardKey(0x0005ff1b); + + /// Represents the location of the "Game Button Thumb Right" key on a + /// generalized keyboard. + /// + /// See the function [RawKeyEvent.physicalKey] for more information. + static const PhysicalKeyboardKey gameButtonThumbRight = PhysicalKeyboardKey(0x0005ff1c); + + /// Represents the location of the "Game Button X" key on a generalized + /// keyboard. + /// + /// See the function [RawKeyEvent.physicalKey] for more information. + static const PhysicalKeyboardKey gameButtonX = PhysicalKeyboardKey(0x0005ff1d); + + /// Represents the location of the "Game Button Y" key on a generalized + /// keyboard. + /// + /// See the function [RawKeyEvent.physicalKey] for more information. + static const PhysicalKeyboardKey gameButtonY = PhysicalKeyboardKey(0x0005ff1e); + + /// Represents the location of the "Game Button Z" key on a generalized + /// keyboard. + /// + /// See the function [RawKeyEvent.physicalKey] for more information. + static const PhysicalKeyboardKey gameButtonZ = PhysicalKeyboardKey(0x0005ff1f); + /// Represents the location of the "Usb Reserved" key on a generalized /// keyboard. /// @@ -3595,18 +4992,18 @@ class PhysicalKeyboardKey extends KeyboardKey { /// See the function [RawKeyEvent.physicalKey] for more information. static const PhysicalKeyboardKey launchScreenSaver = PhysicalKeyboardKey(0x000c01b1); - /// Represents the location of the "Launch Assistant" key on a generalized - /// keyboard. - /// - /// See the function [RawKeyEvent.physicalKey] for more information. - static const PhysicalKeyboardKey launchAssistant = PhysicalKeyboardKey(0x000c01cb); - /// Represents the location of the "Launch Audio Browser" key on a generalized /// keyboard. /// /// See the function [RawKeyEvent.physicalKey] for more information. static const PhysicalKeyboardKey launchAudioBrowser = PhysicalKeyboardKey(0x000c01b7); + /// Represents the location of the "Launch Assistant" key on a generalized + /// keyboard. + /// + /// See the function [RawKeyEvent.physicalKey] for more information. + static const PhysicalKeyboardKey launchAssistant = PhysicalKeyboardKey(0x000c01cb); + /// Represents the location of the "New Key" key on a generalized keyboard. /// /// See the function [RawKeyEvent.physicalKey] for more information. @@ -3718,203 +5115,13 @@ class PhysicalKeyboardKey extends KeyboardKey { /// See the function [RawKeyEvent.physicalKey] for more information. static const PhysicalKeyboardKey showAllWindows = PhysicalKeyboardKey(0x000c029f); - /// Represents the location of the "Game Button 1" key on a generalized - /// keyboard. - /// - /// See the function [RawKeyEvent.physicalKey] for more information. - static const PhysicalKeyboardKey gameButton1 = PhysicalKeyboardKey(0x0005ff01); - - /// Represents the location of the "Game Button 2" key on a generalized - /// keyboard. - /// - /// See the function [RawKeyEvent.physicalKey] for more information. - static const PhysicalKeyboardKey gameButton2 = PhysicalKeyboardKey(0x0005ff02); - - /// Represents the location of the "Game Button 3" key on a generalized - /// keyboard. - /// - /// See the function [RawKeyEvent.physicalKey] for more information. - static const PhysicalKeyboardKey gameButton3 = PhysicalKeyboardKey(0x0005ff03); - - /// Represents the location of the "Game Button 4" key on a generalized - /// keyboard. - /// - /// See the function [RawKeyEvent.physicalKey] for more information. - static const PhysicalKeyboardKey gameButton4 = PhysicalKeyboardKey(0x0005ff04); - - /// Represents the location of the "Game Button 5" key on a generalized - /// keyboard. - /// - /// See the function [RawKeyEvent.physicalKey] for more information. - static const PhysicalKeyboardKey gameButton5 = PhysicalKeyboardKey(0x0005ff05); - - /// Represents the location of the "Game Button 6" key on a generalized - /// keyboard. - /// - /// See the function [RawKeyEvent.physicalKey] for more information. - static const PhysicalKeyboardKey gameButton6 = PhysicalKeyboardKey(0x0005ff06); - - /// Represents the location of the "Game Button 7" key on a generalized - /// keyboard. - /// - /// See the function [RawKeyEvent.physicalKey] for more information. - static const PhysicalKeyboardKey gameButton7 = PhysicalKeyboardKey(0x0005ff07); - - /// Represents the location of the "Game Button 8" key on a generalized - /// keyboard. - /// - /// See the function [RawKeyEvent.physicalKey] for more information. - static const PhysicalKeyboardKey gameButton8 = PhysicalKeyboardKey(0x0005ff08); - - /// Represents the location of the "Game Button 9" key on a generalized - /// keyboard. - /// - /// See the function [RawKeyEvent.physicalKey] for more information. - static const PhysicalKeyboardKey gameButton9 = PhysicalKeyboardKey(0x0005ff09); - - /// Represents the location of the "Game Button 10" key on a generalized - /// keyboard. - /// - /// See the function [RawKeyEvent.physicalKey] for more information. - static const PhysicalKeyboardKey gameButton10 = PhysicalKeyboardKey(0x0005ff0a); - - /// Represents the location of the "Game Button 11" key on a generalized - /// keyboard. - /// - /// See the function [RawKeyEvent.physicalKey] for more information. - static const PhysicalKeyboardKey gameButton11 = PhysicalKeyboardKey(0x0005ff0b); - - /// Represents the location of the "Game Button 12" key on a generalized - /// keyboard. - /// - /// See the function [RawKeyEvent.physicalKey] for more information. - static const PhysicalKeyboardKey gameButton12 = PhysicalKeyboardKey(0x0005ff0c); - - /// Represents the location of the "Game Button 13" key on a generalized - /// keyboard. - /// - /// See the function [RawKeyEvent.physicalKey] for more information. - static const PhysicalKeyboardKey gameButton13 = PhysicalKeyboardKey(0x0005ff0d); - - /// Represents the location of the "Game Button 14" key on a generalized - /// keyboard. - /// - /// See the function [RawKeyEvent.physicalKey] for more information. - static const PhysicalKeyboardKey gameButton14 = PhysicalKeyboardKey(0x0005ff0e); - - /// Represents the location of the "Game Button 15" key on a generalized - /// keyboard. - /// - /// See the function [RawKeyEvent.physicalKey] for more information. - static const PhysicalKeyboardKey gameButton15 = PhysicalKeyboardKey(0x0005ff0f); - - /// Represents the location of the "Game Button 16" key on a generalized - /// keyboard. - /// - /// See the function [RawKeyEvent.physicalKey] for more information. - static const PhysicalKeyboardKey gameButton16 = PhysicalKeyboardKey(0x0005ff10); - - /// Represents the location of the "Game Button A" key on a generalized - /// keyboard. - /// - /// See the function [RawKeyEvent.physicalKey] for more information. - static const PhysicalKeyboardKey gameButtonA = PhysicalKeyboardKey(0x0005ff11); - - /// Represents the location of the "Game Button B" key on a generalized - /// keyboard. - /// - /// See the function [RawKeyEvent.physicalKey] for more information. - static const PhysicalKeyboardKey gameButtonB = PhysicalKeyboardKey(0x0005ff12); - - /// Represents the location of the "Game Button C" key on a generalized - /// keyboard. - /// - /// See the function [RawKeyEvent.physicalKey] for more information. - static const PhysicalKeyboardKey gameButtonC = PhysicalKeyboardKey(0x0005ff13); - - /// Represents the location of the "Game Button Left 1" key on a generalized - /// keyboard. - /// - /// See the function [RawKeyEvent.physicalKey] for more information. - static const PhysicalKeyboardKey gameButtonLeft1 = PhysicalKeyboardKey(0x0005ff14); - - /// Represents the location of the "Game Button Left 2" key on a generalized - /// keyboard. - /// - /// See the function [RawKeyEvent.physicalKey] for more information. - static const PhysicalKeyboardKey gameButtonLeft2 = PhysicalKeyboardKey(0x0005ff15); - - /// Represents the location of the "Game Button Mode" key on a generalized - /// keyboard. - /// - /// See the function [RawKeyEvent.physicalKey] for more information. - static const PhysicalKeyboardKey gameButtonMode = PhysicalKeyboardKey(0x0005ff16); - - /// Represents the location of the "Game Button Right 1" key on a generalized - /// keyboard. - /// - /// See the function [RawKeyEvent.physicalKey] for more information. - static const PhysicalKeyboardKey gameButtonRight1 = PhysicalKeyboardKey(0x0005ff17); - - /// Represents the location of the "Game Button Right 2" key on a generalized - /// keyboard. - /// - /// See the function [RawKeyEvent.physicalKey] for more information. - static const PhysicalKeyboardKey gameButtonRight2 = PhysicalKeyboardKey(0x0005ff18); - - /// Represents the location of the "Game Button Select" key on a generalized - /// keyboard. - /// - /// See the function [RawKeyEvent.physicalKey] for more information. - static const PhysicalKeyboardKey gameButtonSelect = PhysicalKeyboardKey(0x0005ff19); - - /// Represents the location of the "Game Button Start" key on a generalized - /// keyboard. - /// - /// See the function [RawKeyEvent.physicalKey] for more information. - static const PhysicalKeyboardKey gameButtonStart = PhysicalKeyboardKey(0x0005ff1a); - - /// Represents the location of the "Game Button Thumb Left" key on a - /// generalized keyboard. - /// - /// See the function [RawKeyEvent.physicalKey] for more information. - static const PhysicalKeyboardKey gameButtonThumbLeft = PhysicalKeyboardKey(0x0005ff1b); - - /// Represents the location of the "Game Button Thumb Right" key on a - /// generalized keyboard. - /// - /// See the function [RawKeyEvent.physicalKey] for more information. - static const PhysicalKeyboardKey gameButtonThumbRight = PhysicalKeyboardKey(0x0005ff1c); - - /// Represents the location of the "Game Button X" key on a generalized - /// keyboard. - /// - /// See the function [RawKeyEvent.physicalKey] for more information. - static const PhysicalKeyboardKey gameButtonX = PhysicalKeyboardKey(0x0005ff1d); - - /// Represents the location of the "Game Button Y" key on a generalized - /// keyboard. - /// - /// See the function [RawKeyEvent.physicalKey] for more information. - static const PhysicalKeyboardKey gameButtonY = PhysicalKeyboardKey(0x0005ff1e); - - /// Represents the location of the "Game Button Z" key on a generalized - /// keyboard. - /// - /// See the function [RawKeyEvent.physicalKey] for more information. - static const PhysicalKeyboardKey gameButtonZ = PhysicalKeyboardKey(0x0005ff1f); - - /// Represents the location of the "Fn" key on a generalized keyboard. - /// - /// See the function [RawKeyEvent.physicalKey] for more information. - static const PhysicalKeyboardKey fn = PhysicalKeyboardKey(0x00000012); - // A list of all the predefined constant PhysicalKeyboardKeys so that they // can be searched. static const Map _knownPhysicalKeys = { 0x00000000: none, 0x00000010: hyper, 0x00000011: superKey, + 0x00000012: fn, 0x00000013: fnLock, 0x00000014: suspend, 0x00000015: resume, @@ -3923,6 +5130,37 @@ class PhysicalKeyboardKey extends KeyboardKey { 0x00010082: sleep, 0x00010083: wakeUp, 0x000100b5: displayToggleIntExt, + 0x0005ff01: gameButton1, + 0x0005ff02: gameButton2, + 0x0005ff03: gameButton3, + 0x0005ff04: gameButton4, + 0x0005ff05: gameButton5, + 0x0005ff06: gameButton6, + 0x0005ff07: gameButton7, + 0x0005ff08: gameButton8, + 0x0005ff09: gameButton9, + 0x0005ff0a: gameButton10, + 0x0005ff0b: gameButton11, + 0x0005ff0c: gameButton12, + 0x0005ff0d: gameButton13, + 0x0005ff0e: gameButton14, + 0x0005ff0f: gameButton15, + 0x0005ff10: gameButton16, + 0x0005ff11: gameButtonA, + 0x0005ff12: gameButtonB, + 0x0005ff13: gameButtonC, + 0x0005ff14: gameButtonLeft1, + 0x0005ff15: gameButtonLeft2, + 0x0005ff16: gameButtonMode, + 0x0005ff17: gameButtonRight1, + 0x0005ff18: gameButtonRight2, + 0x0005ff19: gameButtonSelect, + 0x0005ff1a: gameButtonStart, + 0x0005ff1b: gameButtonThumbLeft, + 0x0005ff1c: gameButtonThumbRight, + 0x0005ff1d: gameButtonX, + 0x0005ff1e: gameButtonY, + 0x0005ff1f: gameButtonZ, 0x00070000: usbReserved, 0x00070001: usbErrorRollOver, 0x00070002: usbPostFail, @@ -4127,8 +5365,8 @@ class PhysicalKeyboardKey extends KeyboardKey { 0x000c01ab: spellCheck, 0x000c01ae: launchKeyboardLayout, 0x000c01b1: launchScreenSaver, - 0x000c01cb: launchAssistant, 0x000c01b7: launchAudioBrowser, + 0x000c01cb: launchAssistant, 0x000c0201: newKey, 0x000c0203: close, 0x000c0207: save, @@ -4149,38 +5387,6 @@ class PhysicalKeyboardKey extends KeyboardKey { 0x000c028c: mailSend, 0x000c029d: keyboardLayoutSelect, 0x000c029f: showAllWindows, - 0x0005ff01: gameButton1, - 0x0005ff02: gameButton2, - 0x0005ff03: gameButton3, - 0x0005ff04: gameButton4, - 0x0005ff05: gameButton5, - 0x0005ff06: gameButton6, - 0x0005ff07: gameButton7, - 0x0005ff08: gameButton8, - 0x0005ff09: gameButton9, - 0x0005ff0a: gameButton10, - 0x0005ff0b: gameButton11, - 0x0005ff0c: gameButton12, - 0x0005ff0d: gameButton13, - 0x0005ff0e: gameButton14, - 0x0005ff0f: gameButton15, - 0x0005ff10: gameButton16, - 0x0005ff11: gameButtonA, - 0x0005ff12: gameButtonB, - 0x0005ff13: gameButtonC, - 0x0005ff14: gameButtonLeft1, - 0x0005ff15: gameButtonLeft2, - 0x0005ff16: gameButtonMode, - 0x0005ff17: gameButtonRight1, - 0x0005ff18: gameButtonRight2, - 0x0005ff19: gameButtonSelect, - 0x0005ff1a: gameButtonStart, - 0x0005ff1b: gameButtonThumbLeft, - 0x0005ff1c: gameButtonThumbRight, - 0x0005ff1d: gameButtonX, - 0x0005ff1e: gameButtonY, - 0x0005ff1f: gameButtonZ, - 0x00000012: fn, }; static const Map _debugNames = kReleaseMode ? @@ -4189,6 +5395,7 @@ class PhysicalKeyboardKey extends KeyboardKey { 0x00000000: 'None', 0x00000010: 'Hyper', 0x00000011: 'Super Key', + 0x00000012: 'Fn', 0x00000013: 'Fn Lock', 0x00000014: 'Suspend', 0x00000015: 'Resume', @@ -4197,6 +5404,37 @@ class PhysicalKeyboardKey extends KeyboardKey { 0x00010082: 'Sleep', 0x00010083: 'Wake Up', 0x000100b5: 'Display Toggle Int Ext', + 0x0005ff01: 'Game Button 1', + 0x0005ff02: 'Game Button 2', + 0x0005ff03: 'Game Button 3', + 0x0005ff04: 'Game Button 4', + 0x0005ff05: 'Game Button 5', + 0x0005ff06: 'Game Button 6', + 0x0005ff07: 'Game Button 7', + 0x0005ff08: 'Game Button 8', + 0x0005ff09: 'Game Button 9', + 0x0005ff0a: 'Game Button 10', + 0x0005ff0b: 'Game Button 11', + 0x0005ff0c: 'Game Button 12', + 0x0005ff0d: 'Game Button 13', + 0x0005ff0e: 'Game Button 14', + 0x0005ff0f: 'Game Button 15', + 0x0005ff10: 'Game Button 16', + 0x0005ff11: 'Game Button A', + 0x0005ff12: 'Game Button B', + 0x0005ff13: 'Game Button C', + 0x0005ff14: 'Game Button Left 1', + 0x0005ff15: 'Game Button Left 2', + 0x0005ff16: 'Game Button Mode', + 0x0005ff17: 'Game Button Right 1', + 0x0005ff18: 'Game Button Right 2', + 0x0005ff19: 'Game Button Select', + 0x0005ff1a: 'Game Button Start', + 0x0005ff1b: 'Game Button Thumb Left', + 0x0005ff1c: 'Game Button Thumb Right', + 0x0005ff1d: 'Game Button X', + 0x0005ff1e: 'Game Button Y', + 0x0005ff1f: 'Game Button Z', 0x00070000: 'Usb Reserved', 0x00070001: 'Usb Error Roll Over', 0x00070002: 'Usb Post Fail', @@ -4401,8 +5639,8 @@ class PhysicalKeyboardKey extends KeyboardKey { 0x000c01ab: 'Spell Check', 0x000c01ae: 'Launch Keyboard Layout', 0x000c01b1: 'Launch Screen Saver', - 0x000c01cb: 'Launch Assistant', 0x000c01b7: 'Launch Audio Browser', + 0x000c01cb: 'Launch Assistant', 0x000c0201: 'New Key', 0x000c0203: 'Close', 0x000c0207: 'Save', @@ -4423,37 +5661,5 @@ class PhysicalKeyboardKey extends KeyboardKey { 0x000c028c: 'Mail Send', 0x000c029d: 'Keyboard Layout Select', 0x000c029f: 'Show All Windows', - 0x0005ff01: 'Game Button 1', - 0x0005ff02: 'Game Button 2', - 0x0005ff03: 'Game Button 3', - 0x0005ff04: 'Game Button 4', - 0x0005ff05: 'Game Button 5', - 0x0005ff06: 'Game Button 6', - 0x0005ff07: 'Game Button 7', - 0x0005ff08: 'Game Button 8', - 0x0005ff09: 'Game Button 9', - 0x0005ff0a: 'Game Button 10', - 0x0005ff0b: 'Game Button 11', - 0x0005ff0c: 'Game Button 12', - 0x0005ff0d: 'Game Button 13', - 0x0005ff0e: 'Game Button 14', - 0x0005ff0f: 'Game Button 15', - 0x0005ff10: 'Game Button 16', - 0x0005ff11: 'Game Button A', - 0x0005ff12: 'Game Button B', - 0x0005ff13: 'Game Button C', - 0x0005ff14: 'Game Button Left 1', - 0x0005ff15: 'Game Button Left 2', - 0x0005ff16: 'Game Button Mode', - 0x0005ff17: 'Game Button Right 1', - 0x0005ff18: 'Game Button Right 2', - 0x0005ff19: 'Game Button Select', - 0x0005ff1a: 'Game Button Start', - 0x0005ff1b: 'Game Button Thumb Left', - 0x0005ff1c: 'Game Button Thumb Right', - 0x0005ff1d: 'Game Button X', - 0x0005ff1e: 'Game Button Y', - 0x0005ff1f: 'Game Button Z', - 0x00000012: 'Fn', }; } diff --git a/packages/flutter/lib/src/services/keyboard_maps.dart b/packages/flutter/lib/src/services/keyboard_maps.dart index 5739e6e4a1..c7c5f9b387 100644 --- a/packages/flutter/lib/src/services/keyboard_maps.dart +++ b/packages/flutter/lib/src/services/keyboard_maps.dart @@ -14,8 +14,30 @@ import 'keyboard_key.dart'; /// Maps Android-specific key codes to the matching [LogicalKeyboardKey]. const Map kAndroidToLogicalKey = { 0: LogicalKeyboardKey.none, - 223: LogicalKeyboardKey.sleep, - 224: LogicalKeyboardKey.wakeUp, + 3: LogicalKeyboardKey.goHome, + 4: LogicalKeyboardKey.goBack, + 5: LogicalKeyboardKey.call, + 6: LogicalKeyboardKey.endCall, + 7: LogicalKeyboardKey.digit0, + 8: LogicalKeyboardKey.digit1, + 9: LogicalKeyboardKey.digit2, + 10: LogicalKeyboardKey.digit3, + 11: LogicalKeyboardKey.digit4, + 12: LogicalKeyboardKey.digit5, + 13: LogicalKeyboardKey.digit6, + 14: LogicalKeyboardKey.digit7, + 15: LogicalKeyboardKey.digit8, + 16: LogicalKeyboardKey.digit9, + 19: LogicalKeyboardKey.arrowUp, + 20: LogicalKeyboardKey.arrowDown, + 21: LogicalKeyboardKey.arrowLeft, + 22: LogicalKeyboardKey.arrowRight, + 23: LogicalKeyboardKey.select, + 24: LogicalKeyboardKey.audioVolumeUp, + 25: LogicalKeyboardKey.audioVolumeDown, + 26: LogicalKeyboardKey.power, + 27: LogicalKeyboardKey.camera, + 28: LogicalKeyboardKey.clear, 29: LogicalKeyboardKey.keyA, 30: LogicalKeyboardKey.keyB, 31: LogicalKeyboardKey.keyC, @@ -42,21 +64,20 @@ const Map kAndroidToLogicalKey = kAndroidToLogicalKey = kAndroidToLogicalKey = kAndroidToLogicalKey = kAndroidToLogicalKey = kAndroidToPhysicalKey = { + 464: PhysicalKeyboardKey.fn, 205: PhysicalKeyboardKey.suspend, 142: PhysicalKeyboardKey.sleep, 143: PhysicalKeyboardKey.wakeUp, + 256: PhysicalKeyboardKey.gameButton1, + 288: PhysicalKeyboardKey.gameButton1, + 257: PhysicalKeyboardKey.gameButton2, + 289: PhysicalKeyboardKey.gameButton2, + 258: PhysicalKeyboardKey.gameButton3, + 290: PhysicalKeyboardKey.gameButton3, + 259: PhysicalKeyboardKey.gameButton4, + 291: PhysicalKeyboardKey.gameButton4, + 260: PhysicalKeyboardKey.gameButton5, + 292: PhysicalKeyboardKey.gameButton5, + 261: PhysicalKeyboardKey.gameButton6, + 293: PhysicalKeyboardKey.gameButton6, + 262: PhysicalKeyboardKey.gameButton7, + 294: PhysicalKeyboardKey.gameButton7, + 263: PhysicalKeyboardKey.gameButton8, + 295: PhysicalKeyboardKey.gameButton8, + 264: PhysicalKeyboardKey.gameButton9, + 296: PhysicalKeyboardKey.gameButton9, + 265: PhysicalKeyboardKey.gameButton10, + 297: PhysicalKeyboardKey.gameButton10, + 266: PhysicalKeyboardKey.gameButton11, + 298: PhysicalKeyboardKey.gameButton11, + 267: PhysicalKeyboardKey.gameButton12, + 299: PhysicalKeyboardKey.gameButton12, + 268: PhysicalKeyboardKey.gameButton13, + 300: PhysicalKeyboardKey.gameButton13, + 269: PhysicalKeyboardKey.gameButton14, + 301: PhysicalKeyboardKey.gameButton14, + 270: PhysicalKeyboardKey.gameButton15, + 302: PhysicalKeyboardKey.gameButton15, + 271: PhysicalKeyboardKey.gameButton16, + 303: PhysicalKeyboardKey.gameButton16, + 304: PhysicalKeyboardKey.gameButtonA, + 305: PhysicalKeyboardKey.gameButtonB, + 306: PhysicalKeyboardKey.gameButtonC, + 310: PhysicalKeyboardKey.gameButtonLeft1, + 312: PhysicalKeyboardKey.gameButtonLeft2, + 316: PhysicalKeyboardKey.gameButtonMode, + 311: PhysicalKeyboardKey.gameButtonRight1, + 313: PhysicalKeyboardKey.gameButtonRight2, + 314: PhysicalKeyboardKey.gameButtonSelect, + 315: PhysicalKeyboardKey.gameButtonStart, + 317: PhysicalKeyboardKey.gameButtonThumbLeft, + 318: PhysicalKeyboardKey.gameButtonThumbRight, + 307: PhysicalKeyboardKey.gameButtonX, + 308: PhysicalKeyboardKey.gameButtonY, + 309: PhysicalKeyboardKey.gameButtonZ, 30: PhysicalKeyboardKey.keyA, 48: PhysicalKeyboardKey.keyB, 46: PhysicalKeyboardKey.keyC, @@ -332,6 +455,8 @@ const Map kAndroidToPhysicalKey = kAndroidToPhysicalKey = kAndroidToPhysicalKey = kAndroidNumPadMap = { - 154: LogicalKeyboardKey.numpadDivide, - 155: LogicalKeyboardKey.numpadMultiply, - 156: LogicalKeyboardKey.numpadSubtract, - 157: LogicalKeyboardKey.numpadAdd, + 144: LogicalKeyboardKey.numpad0, 145: LogicalKeyboardKey.numpad1, 146: LogicalKeyboardKey.numpad2, 147: LogicalKeyboardKey.numpad3, @@ -449,83 +522,111 @@ const Map kAndroidNumPadMap = 151: LogicalKeyboardKey.numpad7, 152: LogicalKeyboardKey.numpad8, 153: LogicalKeyboardKey.numpad9, - 144: LogicalKeyboardKey.numpad0, + 154: LogicalKeyboardKey.numpadDivide, + 155: LogicalKeyboardKey.numpadMultiply, + 156: LogicalKeyboardKey.numpadSubtract, + 157: LogicalKeyboardKey.numpadAdd, 158: LogicalKeyboardKey.numpadDecimal, - 161: LogicalKeyboardKey.numpadEqual, 159: LogicalKeyboardKey.numpadComma, + 161: LogicalKeyboardKey.numpadEqual, 162: LogicalKeyboardKey.numpadParenLeft, 163: LogicalKeyboardKey.numpadParenRight, }; /// Maps Fuchsia-specific IDs to the matching [LogicalKeyboardKey]. const Map kFuchsiaToLogicalKey = { - 0x100000000: LogicalKeyboardKey.none, + 0x00000000: LogicalKeyboardKey.none, 0x100000010: LogicalKeyboardKey.hyper, 0x100000011: LogicalKeyboardKey.superKey, + 0x100000012: LogicalKeyboardKey.fn, 0x100000013: LogicalKeyboardKey.fnLock, 0x100000014: LogicalKeyboardKey.suspend, 0x100000015: LogicalKeyboardKey.resume, - 0x100000016: LogicalKeyboardKey.turbo, - 0x100000017: LogicalKeyboardKey.privacyScreenToggle, 0x100010082: LogicalKeyboardKey.sleep, 0x100010083: LogicalKeyboardKey.wakeUp, - 0x1000100b5: LogicalKeyboardKey.displayToggleIntExt, - 0x100070000: LogicalKeyboardKey.usbReserved, - 0x100070001: LogicalKeyboardKey.usbErrorRollOver, - 0x100070002: LogicalKeyboardKey.usbPostFail, - 0x100070003: LogicalKeyboardKey.usbErrorUndefined, - 0x00000061: LogicalKeyboardKey.keyA, - 0x00000062: LogicalKeyboardKey.keyB, - 0x00000063: LogicalKeyboardKey.keyC, - 0x00000064: LogicalKeyboardKey.keyD, - 0x00000065: LogicalKeyboardKey.keyE, - 0x00000066: LogicalKeyboardKey.keyF, - 0x00000067: LogicalKeyboardKey.keyG, - 0x00000068: LogicalKeyboardKey.keyH, - 0x00000069: LogicalKeyboardKey.keyI, - 0x0000006a: LogicalKeyboardKey.keyJ, - 0x0000006b: LogicalKeyboardKey.keyK, - 0x0000006c: LogicalKeyboardKey.keyL, - 0x0000006d: LogicalKeyboardKey.keyM, - 0x0000006e: LogicalKeyboardKey.keyN, - 0x0000006f: LogicalKeyboardKey.keyO, - 0x00000070: LogicalKeyboardKey.keyP, - 0x00000071: LogicalKeyboardKey.keyQ, - 0x00000072: LogicalKeyboardKey.keyR, - 0x00000073: LogicalKeyboardKey.keyS, - 0x00000074: LogicalKeyboardKey.keyT, - 0x00000075: LogicalKeyboardKey.keyU, - 0x00000076: LogicalKeyboardKey.keyV, - 0x00000077: LogicalKeyboardKey.keyW, - 0x00000078: LogicalKeyboardKey.keyX, - 0x00000079: LogicalKeyboardKey.keyY, - 0x0000007a: LogicalKeyboardKey.keyZ, - 0x00000031: LogicalKeyboardKey.digit1, - 0x00000032: LogicalKeyboardKey.digit2, - 0x00000033: LogicalKeyboardKey.digit3, - 0x00000034: LogicalKeyboardKey.digit4, - 0x00000035: LogicalKeyboardKey.digit5, - 0x00000036: LogicalKeyboardKey.digit6, - 0x00000037: LogicalKeyboardKey.digit7, - 0x00000038: LogicalKeyboardKey.digit8, - 0x00000039: LogicalKeyboardKey.digit9, - 0x00000030: LogicalKeyboardKey.digit0, + 0x10005ff01: LogicalKeyboardKey.gameButton1, + 0x10005ff02: LogicalKeyboardKey.gameButton2, + 0x10005ff03: LogicalKeyboardKey.gameButton3, + 0x10005ff04: LogicalKeyboardKey.gameButton4, + 0x10005ff05: LogicalKeyboardKey.gameButton5, + 0x10005ff06: LogicalKeyboardKey.gameButton6, + 0x10005ff07: LogicalKeyboardKey.gameButton7, + 0x10005ff08: LogicalKeyboardKey.gameButton8, + 0x10005ff09: LogicalKeyboardKey.gameButton9, + 0x10005ff0a: LogicalKeyboardKey.gameButton10, + 0x10005ff0b: LogicalKeyboardKey.gameButton11, + 0x10005ff0c: LogicalKeyboardKey.gameButton12, + 0x10005ff0d: LogicalKeyboardKey.gameButton13, + 0x10005ff0e: LogicalKeyboardKey.gameButton14, + 0x10005ff0f: LogicalKeyboardKey.gameButton15, + 0x10005ff10: LogicalKeyboardKey.gameButton16, + 0x10005ff11: LogicalKeyboardKey.gameButtonA, + 0x10005ff12: LogicalKeyboardKey.gameButtonB, + 0x10005ff13: LogicalKeyboardKey.gameButtonC, + 0x10005ff14: LogicalKeyboardKey.gameButtonLeft1, + 0x10005ff15: LogicalKeyboardKey.gameButtonLeft2, + 0x10005ff16: LogicalKeyboardKey.gameButtonMode, + 0x10005ff17: LogicalKeyboardKey.gameButtonRight1, + 0x10005ff18: LogicalKeyboardKey.gameButtonRight2, + 0x10005ff19: LogicalKeyboardKey.gameButtonSelect, + 0x10005ff1a: LogicalKeyboardKey.gameButtonStart, + 0x10005ff1b: LogicalKeyboardKey.gameButtonThumbLeft, + 0x10005ff1c: LogicalKeyboardKey.gameButtonThumbRight, + 0x10005ff1d: LogicalKeyboardKey.gameButtonX, + 0x10005ff1e: LogicalKeyboardKey.gameButtonY, + 0x10005ff1f: LogicalKeyboardKey.gameButtonZ, + 0x100070004: LogicalKeyboardKey.keyA, + 0x100070005: LogicalKeyboardKey.keyB, + 0x100070006: LogicalKeyboardKey.keyC, + 0x100070007: LogicalKeyboardKey.keyD, + 0x100070008: LogicalKeyboardKey.keyE, + 0x100070009: LogicalKeyboardKey.keyF, + 0x10007000a: LogicalKeyboardKey.keyG, + 0x10007000b: LogicalKeyboardKey.keyH, + 0x10007000c: LogicalKeyboardKey.keyI, + 0x10007000d: LogicalKeyboardKey.keyJ, + 0x10007000e: LogicalKeyboardKey.keyK, + 0x10007000f: LogicalKeyboardKey.keyL, + 0x100070010: LogicalKeyboardKey.keyM, + 0x100070011: LogicalKeyboardKey.keyN, + 0x100070012: LogicalKeyboardKey.keyO, + 0x100070013: LogicalKeyboardKey.keyP, + 0x100070014: LogicalKeyboardKey.keyQ, + 0x100070015: LogicalKeyboardKey.keyR, + 0x100070016: LogicalKeyboardKey.keyS, + 0x100070017: LogicalKeyboardKey.keyT, + 0x100070018: LogicalKeyboardKey.keyU, + 0x100070019: LogicalKeyboardKey.keyV, + 0x10007001a: LogicalKeyboardKey.keyW, + 0x10007001b: LogicalKeyboardKey.keyX, + 0x10007001c: LogicalKeyboardKey.keyY, + 0x10007001d: LogicalKeyboardKey.keyZ, + 0x10007001e: LogicalKeyboardKey.digit1, + 0x10007001f: LogicalKeyboardKey.digit2, + 0x100070020: LogicalKeyboardKey.digit3, + 0x100070021: LogicalKeyboardKey.digit4, + 0x100070022: LogicalKeyboardKey.digit5, + 0x100070023: LogicalKeyboardKey.digit6, + 0x100070024: LogicalKeyboardKey.digit7, + 0x100070025: LogicalKeyboardKey.digit8, + 0x100070026: LogicalKeyboardKey.digit9, + 0x100070027: LogicalKeyboardKey.digit0, 0x100070028: LogicalKeyboardKey.enter, 0x100070029: LogicalKeyboardKey.escape, 0x10007002a: LogicalKeyboardKey.backspace, 0x10007002b: LogicalKeyboardKey.tab, - 0x00000020: LogicalKeyboardKey.space, - 0x0000002d: LogicalKeyboardKey.minus, - 0x0000003d: LogicalKeyboardKey.equal, - 0x0000005b: LogicalKeyboardKey.bracketLeft, - 0x0000005d: LogicalKeyboardKey.bracketRight, - 0x0000005c: LogicalKeyboardKey.backslash, - 0x0000003b: LogicalKeyboardKey.semicolon, - 0x00000027: LogicalKeyboardKey.quote, - 0x00000060: LogicalKeyboardKey.backquote, - 0x0000002c: LogicalKeyboardKey.comma, - 0x0000002e: LogicalKeyboardKey.period, - 0x0000002f: LogicalKeyboardKey.slash, + 0x10007002c: LogicalKeyboardKey.space, + 0x10007002d: LogicalKeyboardKey.minus, + 0x10007002e: LogicalKeyboardKey.equal, + 0x10007002f: LogicalKeyboardKey.bracketLeft, + 0x100070030: LogicalKeyboardKey.bracketRight, + 0x100070031: LogicalKeyboardKey.backslash, + 0x100070033: LogicalKeyboardKey.semicolon, + 0x100070034: LogicalKeyboardKey.quote, + 0x100070035: LogicalKeyboardKey.backquote, + 0x100070036: LogicalKeyboardKey.comma, + 0x100070037: LogicalKeyboardKey.period, + 0x100070038: LogicalKeyboardKey.slash, 0x100070039: LogicalKeyboardKey.capsLock, 0x10007003a: LogicalKeyboardKey.f1, 0x10007003b: LogicalKeyboardKey.f2, @@ -612,15 +713,6 @@ const Map kFuchsiaToLogicalKey = kFuchsiaToLogicalKey = kFuchsiaToLogicalKey = kFuchsiaToLogicalKey = kFuchsiaToPhysicalKey = kFuchsiaToPhysicalKey = kFuchsiaToPhysicalKey = kFuchsiaToPhysicalKey = kMacOsToPhysicalKey = { + 0x0000003f: PhysicalKeyboardKey.fn, 0x00000000: PhysicalKeyboardKey.keyA, 0x0000000b: PhysicalKeyboardKey.keyB, 0x00000008: PhysicalKeyboardKey.keyC, @@ -1127,7 +1169,6 @@ const Map kMacOsToPhysicalKey = kMacOsFunctionKeyMap = kMacOsToLogicalKey = { + 51: LogicalKeyboardKey.backspace, + 53: LogicalKeyboardKey.escape, + 54: LogicalKeyboardKey.metaRight, + 55: LogicalKeyboardKey.metaLeft, + 56: LogicalKeyboardKey.shiftLeft, + 57: LogicalKeyboardKey.capsLock, + 58: LogicalKeyboardKey.altLeft, + 59: LogicalKeyboardKey.controlLeft, + 60: LogicalKeyboardKey.shiftRight, + 61: LogicalKeyboardKey.altRight, + 62: LogicalKeyboardKey.controlRight, + 63: LogicalKeyboardKey.fn, + 64: LogicalKeyboardKey.f17, + 65: LogicalKeyboardKey.numpadDecimal, + 67: LogicalKeyboardKey.numpadMultiply, + 69: LogicalKeyboardKey.numpadAdd, + 71: LogicalKeyboardKey.numLock, + 72: LogicalKeyboardKey.audioVolumeUp, + 73: LogicalKeyboardKey.audioVolumeDown, + 74: LogicalKeyboardKey.audioVolumeMute, + 75: LogicalKeyboardKey.numpadDivide, + 76: LogicalKeyboardKey.numpadEnter, + 78: LogicalKeyboardKey.numpadSubtract, + 79: LogicalKeyboardKey.f18, + 80: LogicalKeyboardKey.f19, + 81: LogicalKeyboardKey.numpadEqual, + 82: LogicalKeyboardKey.numpad0, + 83: LogicalKeyboardKey.numpad1, + 84: LogicalKeyboardKey.numpad2, + 85: LogicalKeyboardKey.numpad3, + 86: LogicalKeyboardKey.numpad4, + 87: LogicalKeyboardKey.numpad5, + 88: LogicalKeyboardKey.numpad6, + 89: LogicalKeyboardKey.numpad7, + 90: LogicalKeyboardKey.f20, + 91: LogicalKeyboardKey.numpad8, + 92: LogicalKeyboardKey.numpad9, + 93: LogicalKeyboardKey.intlYen, + 94: LogicalKeyboardKey.intlRo, + 95: LogicalKeyboardKey.numpadComma, + 96: LogicalKeyboardKey.f5, + 97: LogicalKeyboardKey.f6, + 98: LogicalKeyboardKey.f7, + 99: LogicalKeyboardKey.f3, + 100: LogicalKeyboardKey.f8, + 101: LogicalKeyboardKey.f9, + 102: LogicalKeyboardKey.lang2, + 103: LogicalKeyboardKey.f11, + 104: LogicalKeyboardKey.lang1, + 105: LogicalKeyboardKey.f13, + 106: LogicalKeyboardKey.f16, + 107: LogicalKeyboardKey.f14, + 109: LogicalKeyboardKey.f10, + 110: LogicalKeyboardKey.contextMenu, + 111: LogicalKeyboardKey.f12, + 113: LogicalKeyboardKey.f15, + 114: LogicalKeyboardKey.insert, + 115: LogicalKeyboardKey.home, + 116: LogicalKeyboardKey.pageUp, + 117: LogicalKeyboardKey.delete, + 118: LogicalKeyboardKey.f4, + 119: LogicalKeyboardKey.end, + 120: LogicalKeyboardKey.f2, + 121: LogicalKeyboardKey.pageDown, + 122: LogicalKeyboardKey.f1, + 123: LogicalKeyboardKey.arrowLeft, + 124: LogicalKeyboardKey.arrowRight, + 125: LogicalKeyboardKey.arrowDown, + 126: LogicalKeyboardKey.arrowUp, +}; + /// Maps iOS-specific key code values representing [PhysicalKeyboardKey]. /// /// iOS doesn't provide a scan code, but a virtual keycode to represent a physical key. @@ -1368,6 +1487,86 @@ const Map kIosNumPadMap = { 0x000000b7: LogicalKeyboardKey.numpadParenRight, }; +/// A map of iOS key codes presenting [LogicalKeyboardKey]. +/// +/// Logical key codes are not available in iOS key events. Most of the logical keys +/// are derived from its `characterIgnoringModifiers`, but those keys that don't +/// have a character representation will be derived from their key codes using +/// this map. +const Map kIosToLogicalKey = { + 41: LogicalKeyboardKey.escape, + 42: LogicalKeyboardKey.backspace, + 57: LogicalKeyboardKey.capsLock, + 58: LogicalKeyboardKey.f1, + 59: LogicalKeyboardKey.f2, + 60: LogicalKeyboardKey.f3, + 61: LogicalKeyboardKey.f4, + 62: LogicalKeyboardKey.f5, + 63: LogicalKeyboardKey.f6, + 64: LogicalKeyboardKey.f7, + 65: LogicalKeyboardKey.f8, + 66: LogicalKeyboardKey.f9, + 67: LogicalKeyboardKey.f10, + 68: LogicalKeyboardKey.f11, + 69: LogicalKeyboardKey.f12, + 73: LogicalKeyboardKey.insert, + 74: LogicalKeyboardKey.home, + 75: LogicalKeyboardKey.pageUp, + 76: LogicalKeyboardKey.delete, + 77: LogicalKeyboardKey.end, + 78: LogicalKeyboardKey.pageDown, + 79: LogicalKeyboardKey.arrowRight, + 80: LogicalKeyboardKey.arrowLeft, + 81: LogicalKeyboardKey.arrowDown, + 82: LogicalKeyboardKey.arrowUp, + 83: LogicalKeyboardKey.numLock, + 84: LogicalKeyboardKey.numpadDivide, + 85: LogicalKeyboardKey.numpadMultiply, + 86: LogicalKeyboardKey.numpadSubtract, + 87: LogicalKeyboardKey.numpadAdd, + 88: LogicalKeyboardKey.numpadEnter, + 89: LogicalKeyboardKey.numpad1, + 90: LogicalKeyboardKey.numpad2, + 91: LogicalKeyboardKey.numpad3, + 92: LogicalKeyboardKey.numpad4, + 93: LogicalKeyboardKey.numpad5, + 94: LogicalKeyboardKey.numpad6, + 95: LogicalKeyboardKey.numpad7, + 96: LogicalKeyboardKey.numpad8, + 97: LogicalKeyboardKey.numpad9, + 98: LogicalKeyboardKey.numpad0, + 99: LogicalKeyboardKey.numpadDecimal, + 101: LogicalKeyboardKey.contextMenu, + 103: LogicalKeyboardKey.numpadEqual, + 104: LogicalKeyboardKey.f13, + 105: LogicalKeyboardKey.f14, + 106: LogicalKeyboardKey.f15, + 107: LogicalKeyboardKey.f16, + 108: LogicalKeyboardKey.f17, + 109: LogicalKeyboardKey.f18, + 110: LogicalKeyboardKey.f19, + 111: LogicalKeyboardKey.f20, + 127: LogicalKeyboardKey.audioVolumeMute, + 128: LogicalKeyboardKey.audioVolumeUp, + 129: LogicalKeyboardKey.audioVolumeDown, + 133: LogicalKeyboardKey.numpadComma, + 135: LogicalKeyboardKey.intlRo, + 137: LogicalKeyboardKey.intlYen, + 144: LogicalKeyboardKey.lang1, + 145: LogicalKeyboardKey.lang2, + 146: LogicalKeyboardKey.lang3, + 147: LogicalKeyboardKey.lang4, + 148: LogicalKeyboardKey.lang5, + 224: LogicalKeyboardKey.controlLeft, + 225: LogicalKeyboardKey.shiftLeft, + 226: LogicalKeyboardKey.altLeft, + 227: LogicalKeyboardKey.metaLeft, + 228: LogicalKeyboardKey.controlRight, + 229: LogicalKeyboardKey.shiftRight, + 230: LogicalKeyboardKey.altRight, + 231: LogicalKeyboardKey.metaRight, +}; + /// Maps GLFW-specific key codes to the matching [LogicalKeyboardKey]. const Map kGlfwToLogicalKey = { 65: LogicalKeyboardKey.keyA, @@ -1509,115 +1708,85 @@ const Map kGlfwNumpadMap = { /// Maps GTK-specific key codes to the matching [LogicalKeyboardKey]. const Map kGtkToLogicalKey = { - 65517: LogicalKeyboardKey.hyper, - 65518: LogicalKeyboardKey.hyper, - 65515: LogicalKeyboardKey.superKey, - 65516: LogicalKeyboardKey.superKey, - 269025191: LogicalKeyboardKey.suspend, - 269025071: LogicalKeyboardKey.sleep, - 269025067: LogicalKeyboardKey.wakeUp, - 65: LogicalKeyboardKey.keyA, - 66: LogicalKeyboardKey.keyB, - 67: LogicalKeyboardKey.keyC, - 68: LogicalKeyboardKey.keyD, - 69: LogicalKeyboardKey.keyE, - 70: LogicalKeyboardKey.keyF, - 71: LogicalKeyboardKey.keyG, - 72: LogicalKeyboardKey.keyH, - 73: LogicalKeyboardKey.keyI, - 74: LogicalKeyboardKey.keyJ, - 75: LogicalKeyboardKey.keyK, - 76: LogicalKeyboardKey.keyL, - 77: LogicalKeyboardKey.keyM, - 78: LogicalKeyboardKey.keyN, - 79: LogicalKeyboardKey.keyO, - 80: LogicalKeyboardKey.keyP, - 81: LogicalKeyboardKey.keyQ, - 82: LogicalKeyboardKey.keyR, - 83: LogicalKeyboardKey.keyS, - 84: LogicalKeyboardKey.keyT, - 85: LogicalKeyboardKey.keyU, - 86: LogicalKeyboardKey.keyV, - 87: LogicalKeyboardKey.keyW, - 88: LogicalKeyboardKey.keyX, - 89: LogicalKeyboardKey.keyY, - 90: LogicalKeyboardKey.keyZ, - 49: LogicalKeyboardKey.digit1, - 50: LogicalKeyboardKey.digit2, - 51: LogicalKeyboardKey.digit3, - 52: LogicalKeyboardKey.digit4, - 53: LogicalKeyboardKey.digit5, - 54: LogicalKeyboardKey.digit6, - 55: LogicalKeyboardKey.digit7, - 56: LogicalKeyboardKey.digit8, - 57: LogicalKeyboardKey.digit9, - 48: LogicalKeyboardKey.digit0, - 65293: LogicalKeyboardKey.enter, + 165: LogicalKeyboardKey.intlYen, + 64774: LogicalKeyboardKey.eraseEof, + 64782: LogicalKeyboardKey.attn, + 64789: LogicalKeyboardKey.copy, + 64790: LogicalKeyboardKey.mediaPlay, + 64795: LogicalKeyboardKey.exSel, + 64797: LogicalKeyboardKey.printScreen, + 64798: LogicalKeyboardKey.enter, + 65027: LogicalKeyboardKey.altRight, + 65032: LogicalKeyboardKey.groupNext, + 65034: LogicalKeyboardKey.groupPrevious, + 65036: LogicalKeyboardKey.groupFirst, + 65038: LogicalKeyboardKey.groupLast, + 65056: LogicalKeyboardKey.tab, 65076: LogicalKeyboardKey.enter, - 65307: LogicalKeyboardKey.escape, 65288: LogicalKeyboardKey.backspace, 65289: LogicalKeyboardKey.tab, - 65417: LogicalKeyboardKey.tab, - 65056: LogicalKeyboardKey.tab, - 32: LogicalKeyboardKey.space, - 65408: LogicalKeyboardKey.space, - 45: LogicalKeyboardKey.minus, - 61: LogicalKeyboardKey.equal, - 91: LogicalKeyboardKey.bracketLeft, - 93: LogicalKeyboardKey.bracketRight, - 92: LogicalKeyboardKey.backslash, - 59: LogicalKeyboardKey.semicolon, - 39: LogicalKeyboardKey.quote, - 96: LogicalKeyboardKey.backquote, - 44: LogicalKeyboardKey.comma, - 46: LogicalKeyboardKey.period, - 47: LogicalKeyboardKey.slash, - 65509: LogicalKeyboardKey.capsLock, - 65470: LogicalKeyboardKey.f1, - 65425: LogicalKeyboardKey.f1, - 65471: LogicalKeyboardKey.f2, - 65426: LogicalKeyboardKey.f2, - 65472: LogicalKeyboardKey.f3, - 65427: LogicalKeyboardKey.f3, - 65473: LogicalKeyboardKey.f4, - 65428: LogicalKeyboardKey.f4, - 65474: LogicalKeyboardKey.f5, - 65475: LogicalKeyboardKey.f6, - 65476: LogicalKeyboardKey.f7, - 65477: LogicalKeyboardKey.f8, - 65478: LogicalKeyboardKey.f9, - 65479: LogicalKeyboardKey.f10, - 65480: LogicalKeyboardKey.f11, - 65481: LogicalKeyboardKey.f12, - 64797: LogicalKeyboardKey.printScreen, - 65300: LogicalKeyboardKey.scrollLock, + 65291: LogicalKeyboardKey.clear, + 65293: LogicalKeyboardKey.enter, 65299: LogicalKeyboardKey.pause, - 65379: LogicalKeyboardKey.insert, - 65438: LogicalKeyboardKey.insert, + 65300: LogicalKeyboardKey.scrollLock, + 65307: LogicalKeyboardKey.escape, + 65313: LogicalKeyboardKey.kanjiMode, + 65316: LogicalKeyboardKey.romaji, + 65317: LogicalKeyboardKey.hiragana, + 65318: LogicalKeyboardKey.katakana, + 65319: LogicalKeyboardKey.hiraganaKatakana, + 65320: LogicalKeyboardKey.zenkaku, + 65321: LogicalKeyboardKey.hankaku, + 65322: LogicalKeyboardKey.zenkakuHankaku, + 65327: LogicalKeyboardKey.eisu, + 65329: LogicalKeyboardKey.hangulMode, + 65332: LogicalKeyboardKey.hanjaMode, + 65335: LogicalKeyboardKey.codeInput, + 65340: LogicalKeyboardKey.singleCandidate, + 65342: LogicalKeyboardKey.previousCandidate, 65360: LogicalKeyboardKey.home, - 65429: LogicalKeyboardKey.home, - 65365: LogicalKeyboardKey.pageUp, - 65434: LogicalKeyboardKey.pageUp, - 65535: LogicalKeyboardKey.delete, - 65439: LogicalKeyboardKey.delete, - 65367: LogicalKeyboardKey.end, - 65436: LogicalKeyboardKey.end, - 65366: LogicalKeyboardKey.pageDown, - 65435: LogicalKeyboardKey.pageDown, - 65363: LogicalKeyboardKey.arrowRight, - 65432: LogicalKeyboardKey.arrowRight, 65361: LogicalKeyboardKey.arrowLeft, - 65430: LogicalKeyboardKey.arrowLeft, - 65364: LogicalKeyboardKey.arrowDown, - 65433: LogicalKeyboardKey.arrowDown, 65362: LogicalKeyboardKey.arrowUp, - 65431: LogicalKeyboardKey.arrowUp, + 65363: LogicalKeyboardKey.arrowRight, + 65364: LogicalKeyboardKey.arrowDown, + 65365: LogicalKeyboardKey.pageUp, + 65366: LogicalKeyboardKey.pageDown, + 65367: LogicalKeyboardKey.end, + 65376: LogicalKeyboardKey.select, + 65377: LogicalKeyboardKey.print, + 65378: LogicalKeyboardKey.execute, + 65379: LogicalKeyboardKey.insert, + 65381: LogicalKeyboardKey.undo, + 65382: LogicalKeyboardKey.redo, + 65383: LogicalKeyboardKey.contextMenu, + 65384: LogicalKeyboardKey.find, + 65385: LogicalKeyboardKey.cancel, + 65386: LogicalKeyboardKey.help, + 65406: LogicalKeyboardKey.modeChange, 65407: LogicalKeyboardKey.numLock, - 65455: LogicalKeyboardKey.numpadDivide, - 65450: LogicalKeyboardKey.numpadMultiply, - 65453: LogicalKeyboardKey.numpadSubtract, - 65451: LogicalKeyboardKey.numpadAdd, + 65408: LogicalKeyboardKey.space, + 65417: LogicalKeyboardKey.tab, 65421: LogicalKeyboardKey.numpadEnter, + 65425: LogicalKeyboardKey.f1, + 65426: LogicalKeyboardKey.f2, + 65427: LogicalKeyboardKey.f3, + 65428: LogicalKeyboardKey.f4, + 65429: LogicalKeyboardKey.numpad7, + 65430: LogicalKeyboardKey.numpad4, + 65431: LogicalKeyboardKey.numpad8, + 65432: LogicalKeyboardKey.numpad6, + 65433: LogicalKeyboardKey.numpad2, + 65434: LogicalKeyboardKey.numpad9, + 65435: LogicalKeyboardKey.numpad3, + 65436: LogicalKeyboardKey.numpad1, + 65438: LogicalKeyboardKey.numpad0, + 65439: LogicalKeyboardKey.numpadDecimal, + 65450: LogicalKeyboardKey.numpadMultiply, + 65451: LogicalKeyboardKey.numpadAdd, + 65453: LogicalKeyboardKey.numpadSubtract, + 65454: LogicalKeyboardKey.period, + 65455: LogicalKeyboardKey.numpadDivide, + 65456: LogicalKeyboardKey.numpad0, 65457: LogicalKeyboardKey.numpad1, 65458: LogicalKeyboardKey.numpad2, 65459: LogicalKeyboardKey.numpad3, @@ -1627,11 +1796,19 @@ const Map kGtkToLogicalKey = { 65463: LogicalKeyboardKey.numpad7, 65464: LogicalKeyboardKey.numpad8, 65465: LogicalKeyboardKey.numpad9, - 65456: LogicalKeyboardKey.numpad0, - 65454: LogicalKeyboardKey.numpadDecimal, - 65383: LogicalKeyboardKey.contextMenu, - 269025066: LogicalKeyboardKey.power, 65469: LogicalKeyboardKey.numpadEqual, + 65470: LogicalKeyboardKey.f1, + 65471: LogicalKeyboardKey.f2, + 65472: LogicalKeyboardKey.f3, + 65473: LogicalKeyboardKey.f4, + 65474: LogicalKeyboardKey.f5, + 65475: LogicalKeyboardKey.f6, + 65476: LogicalKeyboardKey.f7, + 65477: LogicalKeyboardKey.f8, + 65478: LogicalKeyboardKey.f9, + 65479: LogicalKeyboardKey.f10, + 65480: LogicalKeyboardKey.f11, + 65481: LogicalKeyboardKey.f12, 65482: LogicalKeyboardKey.f13, 65483: LogicalKeyboardKey.f14, 65484: LogicalKeyboardKey.f15, @@ -1644,77 +1821,85 @@ const Map kGtkToLogicalKey = { 65491: LogicalKeyboardKey.f22, 65492: LogicalKeyboardKey.f23, 65493: LogicalKeyboardKey.f24, - 269025131: LogicalKeyboardKey.open, - 65386: LogicalKeyboardKey.help, - 65376: LogicalKeyboardKey.select, - 65381: LogicalKeyboardKey.undo, - 269025111: LogicalKeyboardKey.copy, - 64789: LogicalKeyboardKey.copy, - 269025133: LogicalKeyboardKey.paste, - 65384: LogicalKeyboardKey.find, - 269025042: LogicalKeyboardKey.audioVolumeMute, - 269025043: LogicalKeyboardKey.audioVolumeUp, - 269025041: LogicalKeyboardKey.audioVolumeDown, - 65406: LogicalKeyboardKey.kanaMode, - 165: LogicalKeyboardKey.intlYen, - 65507: LogicalKeyboardKey.controlLeft, 65505: LogicalKeyboardKey.shiftLeft, - 65513: LogicalKeyboardKey.altLeft, - 65511: LogicalKeyboardKey.metaLeft, - 65508: LogicalKeyboardKey.controlRight, 65506: LogicalKeyboardKey.shiftRight, - 65514: LogicalKeyboardKey.altRight, - 65027: LogicalKeyboardKey.altRight, + 65507: LogicalKeyboardKey.controlLeft, + 65508: LogicalKeyboardKey.controlRight, + 65509: LogicalKeyboardKey.capsLock, + 65511: LogicalKeyboardKey.metaLeft, 65512: LogicalKeyboardKey.metaRight, + 65513: LogicalKeyboardKey.altLeft, + 65514: LogicalKeyboardKey.altRight, + 65515: LogicalKeyboardKey.superKey, + 65516: LogicalKeyboardKey.superKey, + 65517: LogicalKeyboardKey.hyper, + 65518: LogicalKeyboardKey.hyper, + 65535: LogicalKeyboardKey.delete, 269025026: LogicalKeyboardKey.brightnessUp, 269025027: LogicalKeyboardKey.brightnessDown, - 269025029: LogicalKeyboardKey.kbdIllumUp, - 269025030: LogicalKeyboardKey.kbdIllumDown, - 269025134: LogicalKeyboardKey.launchPhone, + 269025040: LogicalKeyboardKey.standby, + 269025041: LogicalKeyboardKey.audioVolumeDown, + 269025042: LogicalKeyboardKey.audioVolumeMute, + 269025043: LogicalKeyboardKey.audioVolumeUp, 269025044: LogicalKeyboardKey.mediaPlay, - 64790: LogicalKeyboardKey.mediaPlay, - 269025073: LogicalKeyboardKey.mediaPause, - 269025052: LogicalKeyboardKey.mediaRecord, - 269025175: LogicalKeyboardKey.mediaFastForward, - 269025086: LogicalKeyboardKey.mediaRewind, - 269025047: LogicalKeyboardKey.mediaTrackNext, - 269025046: LogicalKeyboardKey.mediaTrackPrevious, 269025045: LogicalKeyboardKey.mediaStop, - 269025068: LogicalKeyboardKey.eject, - 269025049: LogicalKeyboardKey.launchMail, - 269025056: LogicalKeyboardKey.launchCalendar, - 269025070: LogicalKeyboardKey.launchInternetBrowser, - 269025121: LogicalKeyboardKey.logOff, - 269025148: LogicalKeyboardKey.spellCheck, - 269025069: LogicalKeyboardKey.launchScreenSaver, - 269025170: LogicalKeyboardKey.launchAudioBrowser, - 269025128: LogicalKeyboardKey.newKey, - 269025110: LogicalKeyboardKey.close, - 269025143: LogicalKeyboardKey.save, - 65377: LogicalKeyboardKey.print, - 269025051: LogicalKeyboardKey.browserSearch, + 269025046: LogicalKeyboardKey.mediaTrackPrevious, + 269025047: LogicalKeyboardKey.mediaTrackNext, 269025048: LogicalKeyboardKey.browserHome, + 269025049: LogicalKeyboardKey.launchMail, + 269025051: LogicalKeyboardKey.browserSearch, + 269025052: LogicalKeyboardKey.mediaRecord, + 269025056: LogicalKeyboardKey.launchCalendar, 269025062: LogicalKeyboardKey.browserBack, 269025063: LogicalKeyboardKey.browserForward, 269025064: LogicalKeyboardKey.browserStop, 269025065: LogicalKeyboardKey.browserRefresh, + 269025066: LogicalKeyboardKey.powerOff, + 269025067: LogicalKeyboardKey.wakeUp, + 269025068: LogicalKeyboardKey.eject, + 269025069: LogicalKeyboardKey.launchScreenSaver, + 269025071: LogicalKeyboardKey.sleep, 269025072: LogicalKeyboardKey.browserFavorites, + 269025073: LogicalKeyboardKey.mediaPause, + 269025086: LogicalKeyboardKey.mediaRewind, + 269025110: LogicalKeyboardKey.close, + 269025111: LogicalKeyboardKey.copy, + 269025112: LogicalKeyboardKey.cut, + 269025121: LogicalKeyboardKey.logOff, + 269025128: LogicalKeyboardKey.newKey, + 269025131: LogicalKeyboardKey.open, + 269025133: LogicalKeyboardKey.paste, + 269025134: LogicalKeyboardKey.launchPhone, + 269025138: LogicalKeyboardKey.mailReply, + 269025143: LogicalKeyboardKey.save, + 269025147: LogicalKeyboardKey.mailSend, + 269025148: LogicalKeyboardKey.spellCheck, 269025163: LogicalKeyboardKey.zoomIn, 269025164: LogicalKeyboardKey.zoomOut, - 65382: LogicalKeyboardKey.redo, - 269025138: LogicalKeyboardKey.mailReply, 269025168: LogicalKeyboardKey.mailForward, - 269025147: LogicalKeyboardKey.mailSend, + 269025175: LogicalKeyboardKey.mediaFastForward, + 269025191: LogicalKeyboardKey.suspend, }; /// A map of GTK key codes which have printable representations, but appear /// on the number pad. Used to provide different key objects for keys like /// KEY_EQUALS and NUMPAD_EQUALS. const Map kGtkNumpadMap = { - 65455: LogicalKeyboardKey.numpadDivide, + 65429: LogicalKeyboardKey.numpad7, + 65430: LogicalKeyboardKey.numpad4, + 65431: LogicalKeyboardKey.numpad8, + 65432: LogicalKeyboardKey.numpad6, + 65433: LogicalKeyboardKey.numpad2, + 65434: LogicalKeyboardKey.numpad9, + 65435: LogicalKeyboardKey.numpad3, + 65436: LogicalKeyboardKey.numpad1, + 65438: LogicalKeyboardKey.numpad0, + 65439: LogicalKeyboardKey.numpadDecimal, 65450: LogicalKeyboardKey.numpadMultiply, - 65453: LogicalKeyboardKey.numpadSubtract, 65451: LogicalKeyboardKey.numpadAdd, + 65453: LogicalKeyboardKey.numpadSubtract, + 65455: LogicalKeyboardKey.numpadDivide, + 65456: LogicalKeyboardKey.numpad0, 65457: LogicalKeyboardKey.numpad1, 65458: LogicalKeyboardKey.numpad2, 65459: LogicalKeyboardKey.numpad3, @@ -1724,8 +1909,6 @@ const Map kGtkNumpadMap = { 65463: LogicalKeyboardKey.numpad7, 65464: LogicalKeyboardKey.numpad8, 65465: LogicalKeyboardKey.numpad9, - 65456: LogicalKeyboardKey.numpad0, - 65454: LogicalKeyboardKey.numpadDecimal, 65469: LogicalKeyboardKey.numpadEqual, }; @@ -1925,8 +2108,8 @@ const Map kLinuxToPhysicalKey = kLinuxToPhysicalKey = kWebToLogicalKey = { - 'None': LogicalKeyboardKey.none, - 'Hyper': LogicalKeyboardKey.hyper, - 'Super': LogicalKeyboardKey.superKey, + 'AVRInput': LogicalKeyboardKey.avrInput, + 'AVRPower': LogicalKeyboardKey.avrPower, + 'Abort': LogicalKeyboardKey.abort, + 'Accel': LogicalKeyboardKey.accel, + 'Accept': LogicalKeyboardKey.accept, + 'Add': LogicalKeyboardKey.add, + 'Again': LogicalKeyboardKey.again, + 'AllCandidates': LogicalKeyboardKey.allCandidates, + 'Alphanumeric': LogicalKeyboardKey.alphanumeric, + 'AltGraph': LogicalKeyboardKey.altGraph, + 'AltLeft': LogicalKeyboardKey.altLeft, + 'AltRight': LogicalKeyboardKey.altRight, + 'Ampersand': LogicalKeyboardKey.ampersand, + 'AppSwitch': LogicalKeyboardKey.appSwitch, + 'ArrowDown': LogicalKeyboardKey.arrowDown, + 'ArrowLeft': LogicalKeyboardKey.arrowLeft, + 'ArrowRight': LogicalKeyboardKey.arrowRight, + 'ArrowUp': LogicalKeyboardKey.arrowUp, + 'Asterisk': LogicalKeyboardKey.asterisk, + 'At': LogicalKeyboardKey.at, + 'Attn': LogicalKeyboardKey.attn, + 'AudioBalanceLeft': LogicalKeyboardKey.audioBalanceLeft, + 'AudioBalanceRight': LogicalKeyboardKey.audioBalanceRight, + 'AudioBassBoostDown': LogicalKeyboardKey.audioBassBoostDown, + 'AudioBassBoostToggle': LogicalKeyboardKey.audioBassBoostToggle, + 'AudioBassBoostUp': LogicalKeyboardKey.audioBassBoostUp, + 'AudioFaderFront': LogicalKeyboardKey.audioFaderFront, + 'AudioFaderRear': LogicalKeyboardKey.audioFaderRear, + 'AudioSurroundModeNext': LogicalKeyboardKey.audioSurroundModeNext, + 'AudioTrebleDown': LogicalKeyboardKey.audioTrebleDown, + 'AudioTrebleUp': LogicalKeyboardKey.audioTrebleUp, + 'AudioVolumeDown': LogicalKeyboardKey.audioVolumeDown, + 'AudioVolumeMute': LogicalKeyboardKey.audioVolumeMute, + 'AudioVolumeUp': LogicalKeyboardKey.audioVolumeUp, + 'Backquote': LogicalKeyboardKey.backquote, + 'Backslash': LogicalKeyboardKey.backslash, + 'Backspace': LogicalKeyboardKey.backspace, + 'Bar': LogicalKeyboardKey.bar, + 'BraceLeft': LogicalKeyboardKey.braceLeft, + 'BraceRight': LogicalKeyboardKey.braceRight, + 'BracketLeft': LogicalKeyboardKey.bracketLeft, + 'BracketRight': LogicalKeyboardKey.bracketRight, + 'BrightnessDown': LogicalKeyboardKey.brightnessDown, + 'BrightnessUp': LogicalKeyboardKey.brightnessUp, + 'BrowserBack': LogicalKeyboardKey.browserBack, + 'BrowserFavorites': LogicalKeyboardKey.browserFavorites, + 'BrowserForward': LogicalKeyboardKey.browserForward, + 'BrowserHome': LogicalKeyboardKey.browserHome, + 'BrowserRefresh': LogicalKeyboardKey.browserRefresh, + 'BrowserSearch': LogicalKeyboardKey.browserSearch, + 'BrowserStop': LogicalKeyboardKey.browserStop, + 'Call': LogicalKeyboardKey.call, + 'Camera': LogicalKeyboardKey.camera, + 'CameraFocus': LogicalKeyboardKey.cameraFocus, + 'Cancel': LogicalKeyboardKey.cancel, + 'CapsLock': LogicalKeyboardKey.capsLock, + 'Caret': LogicalKeyboardKey.caret, + 'ChannelDown': LogicalKeyboardKey.channelDown, + 'ChannelUp': LogicalKeyboardKey.channelUp, + 'Clear': LogicalKeyboardKey.clear, + 'Close': LogicalKeyboardKey.close, + 'ClosedCaptionToggle': LogicalKeyboardKey.closedCaptionToggle, + 'CodeInput': LogicalKeyboardKey.codeInput, + 'Colon': LogicalKeyboardKey.colon, + 'ColorF0Red': LogicalKeyboardKey.colorF0Red, + 'ColorF1Green': LogicalKeyboardKey.colorF1Green, + 'ColorF2Yellow': LogicalKeyboardKey.colorF2Yellow, + 'ColorF3Blue': LogicalKeyboardKey.colorF3Blue, + 'ColorF4Grey': LogicalKeyboardKey.colorF4Grey, + 'ColorF5Brown': LogicalKeyboardKey.colorF5Brown, + 'Comma': LogicalKeyboardKey.comma, + 'Compose': LogicalKeyboardKey.compose, + 'ContextMenu': LogicalKeyboardKey.contextMenu, + 'ControlLeft': LogicalKeyboardKey.controlLeft, + 'ControlRight': LogicalKeyboardKey.controlRight, + 'Convert': LogicalKeyboardKey.convert, + 'Copy': LogicalKeyboardKey.copy, + 'CrSel': LogicalKeyboardKey.crSel, + 'Cut': LogicalKeyboardKey.cut, + 'DVR': LogicalKeyboardKey.dvr, + 'Delete': LogicalKeyboardKey.delete, + 'Digit0': LogicalKeyboardKey.digit0, + 'Digit1': LogicalKeyboardKey.digit1, + 'Digit2': LogicalKeyboardKey.digit2, + 'Digit3': LogicalKeyboardKey.digit3, + 'Digit4': LogicalKeyboardKey.digit4, + 'Digit5': LogicalKeyboardKey.digit5, + 'Digit6': LogicalKeyboardKey.digit6, + 'Digit7': LogicalKeyboardKey.digit7, + 'Digit8': LogicalKeyboardKey.digit8, + 'Digit9': LogicalKeyboardKey.digit9, + 'Dimmer': LogicalKeyboardKey.dimmer, + 'DisplaySwap': LogicalKeyboardKey.displaySwap, + 'Dollar': LogicalKeyboardKey.dollar, + 'Eisu': LogicalKeyboardKey.eisu, + 'Eject': LogicalKeyboardKey.eject, + 'End': LogicalKeyboardKey.end, + 'EndCall': LogicalKeyboardKey.endCall, + 'Enter': LogicalKeyboardKey.enter, + 'Equal': LogicalKeyboardKey.equal, + 'EraseEof': LogicalKeyboardKey.eraseEof, + 'Escape': LogicalKeyboardKey.escape, + 'ExSel': LogicalKeyboardKey.exSel, + 'Exclamation': LogicalKeyboardKey.exclamation, + 'Execute': LogicalKeyboardKey.execute, + 'Exit': LogicalKeyboardKey.exit, + 'F1': LogicalKeyboardKey.f1, + 'F10': LogicalKeyboardKey.f10, + 'F11': LogicalKeyboardKey.f11, + 'F12': LogicalKeyboardKey.f12, + 'F13': LogicalKeyboardKey.f13, + 'F14': LogicalKeyboardKey.f14, + 'F15': LogicalKeyboardKey.f15, + 'F16': LogicalKeyboardKey.f16, + 'F17': LogicalKeyboardKey.f17, + 'F18': LogicalKeyboardKey.f18, + 'F19': LogicalKeyboardKey.f19, + 'F2': LogicalKeyboardKey.f2, + 'F20': LogicalKeyboardKey.f20, + 'F21': LogicalKeyboardKey.f21, + 'F22': LogicalKeyboardKey.f22, + 'F23': LogicalKeyboardKey.f23, + 'F24': LogicalKeyboardKey.f24, + 'F3': LogicalKeyboardKey.f3, + 'F4': LogicalKeyboardKey.f4, + 'F5': LogicalKeyboardKey.f5, + 'F6': LogicalKeyboardKey.f6, + 'F7': LogicalKeyboardKey.f7, + 'F8': LogicalKeyboardKey.f8, + 'F9': LogicalKeyboardKey.f9, + 'FavoriteClear0': LogicalKeyboardKey.favoriteClear0, + 'FavoriteClear1': LogicalKeyboardKey.favoriteClear1, + 'FavoriteClear2': LogicalKeyboardKey.favoriteClear2, + 'FavoriteClear3': LogicalKeyboardKey.favoriteClear3, + 'FavoriteRecall0': LogicalKeyboardKey.favoriteRecall0, + 'FavoriteRecall1': LogicalKeyboardKey.favoriteRecall1, + 'FavoriteRecall2': LogicalKeyboardKey.favoriteRecall2, + 'FavoriteRecall3': LogicalKeyboardKey.favoriteRecall3, + 'FavoriteStore0': LogicalKeyboardKey.favoriteStore0, + 'FavoriteStore1': LogicalKeyboardKey.favoriteStore1, + 'FavoriteStore2': LogicalKeyboardKey.favoriteStore2, + 'FavoriteStore3': LogicalKeyboardKey.favoriteStore3, + 'FinalMode': LogicalKeyboardKey.finalMode, + 'Find': LogicalKeyboardKey.find, + 'Fn': LogicalKeyboardKey.fn, 'FnLock': LogicalKeyboardKey.fnLock, - 'Suspend': LogicalKeyboardKey.suspend, - 'Resume': LogicalKeyboardKey.resume, - 'Turbo': LogicalKeyboardKey.turbo, - 'PrivacyScreenToggle': LogicalKeyboardKey.privacyScreenToggle, - 'Sleep': LogicalKeyboardKey.sleep, - 'WakeUp': LogicalKeyboardKey.wakeUp, - 'DisplayToggleIntExt': LogicalKeyboardKey.displayToggleIntExt, + 'GameButton1': LogicalKeyboardKey.gameButton1, + 'GameButton10': LogicalKeyboardKey.gameButton10, + 'GameButton11': LogicalKeyboardKey.gameButton11, + 'GameButton12': LogicalKeyboardKey.gameButton12, + 'GameButton13': LogicalKeyboardKey.gameButton13, + 'GameButton14': LogicalKeyboardKey.gameButton14, + 'GameButton15': LogicalKeyboardKey.gameButton15, + 'GameButton16': LogicalKeyboardKey.gameButton16, + 'GameButton2': LogicalKeyboardKey.gameButton2, + 'GameButton3': LogicalKeyboardKey.gameButton3, + 'GameButton4': LogicalKeyboardKey.gameButton4, + 'GameButton5': LogicalKeyboardKey.gameButton5, + 'GameButton6': LogicalKeyboardKey.gameButton6, + 'GameButton7': LogicalKeyboardKey.gameButton7, + 'GameButton8': LogicalKeyboardKey.gameButton8, + 'GameButton9': LogicalKeyboardKey.gameButton9, + 'GameButtonA': LogicalKeyboardKey.gameButtonA, + 'GameButtonB': LogicalKeyboardKey.gameButtonB, + 'GameButtonC': LogicalKeyboardKey.gameButtonC, + 'GameButtonLeft1': LogicalKeyboardKey.gameButtonLeft1, + 'GameButtonLeft2': LogicalKeyboardKey.gameButtonLeft2, + 'GameButtonMode': LogicalKeyboardKey.gameButtonMode, + 'GameButtonRight1': LogicalKeyboardKey.gameButtonRight1, + 'GameButtonRight2': LogicalKeyboardKey.gameButtonRight2, + 'GameButtonSelect': LogicalKeyboardKey.gameButtonSelect, + 'GameButtonStart': LogicalKeyboardKey.gameButtonStart, + 'GameButtonThumbLeft': LogicalKeyboardKey.gameButtonThumbLeft, + 'GameButtonThumbRight': LogicalKeyboardKey.gameButtonThumbRight, + 'GameButtonX': LogicalKeyboardKey.gameButtonX, + 'GameButtonY': LogicalKeyboardKey.gameButtonY, + 'GameButtonZ': LogicalKeyboardKey.gameButtonZ, + 'GoBack': LogicalKeyboardKey.goBack, + 'GoHome': LogicalKeyboardKey.goHome, + 'Greater': LogicalKeyboardKey.greater, + 'GroupFirst': LogicalKeyboardKey.groupFirst, + 'GroupLast': LogicalKeyboardKey.groupLast, + 'GroupNext': LogicalKeyboardKey.groupNext, + 'GroupPrevious': LogicalKeyboardKey.groupPrevious, + 'Guide': LogicalKeyboardKey.guide, + 'GuideNextDay': LogicalKeyboardKey.guideNextDay, + 'GuidePreviousDay': LogicalKeyboardKey.guidePreviousDay, + 'HangulMode': LogicalKeyboardKey.hangulMode, + 'HanjaMode': LogicalKeyboardKey.hanjaMode, + 'Hankaku': LogicalKeyboardKey.hankaku, + 'HeadsetHook': LogicalKeyboardKey.headsetHook, + 'Help': LogicalKeyboardKey.help, + 'Hibernate': LogicalKeyboardKey.hibernate, + 'Hiragana': LogicalKeyboardKey.hiragana, + 'HiraganaKatakana': LogicalKeyboardKey.hiraganaKatakana, + 'Home': LogicalKeyboardKey.home, + 'Hyper': LogicalKeyboardKey.hyper, + 'Info': LogicalKeyboardKey.info, + 'Insert': LogicalKeyboardKey.insert, + 'InstantReplay': LogicalKeyboardKey.instantReplay, + 'IntlBackslash': LogicalKeyboardKey.intlBackslash, + 'IntlRo': LogicalKeyboardKey.intlRo, + 'IntlYen': LogicalKeyboardKey.intlYen, + 'JunjaMode': LogicalKeyboardKey.junjaMode, + 'KanaMode': LogicalKeyboardKey.kanaMode, + 'KanjiMode': LogicalKeyboardKey.kanjiMode, + 'Katakana': LogicalKeyboardKey.katakana, + 'Key11': LogicalKeyboardKey.key11, + 'Key12': LogicalKeyboardKey.key12, 'KeyA': LogicalKeyboardKey.keyA, 'KeyB': LogicalKeyboardKey.keyB, 'KeyC': LogicalKeyboardKey.keyC, @@ -1988,64 +2369,78 @@ const Map kWebToLogicalKey = kWebToLogicalKey = kWebToPhysicalKey = kWebToPhysicalKey = kWebToPhysicalKey = kWebToPhysicalKey = kWebToPhysicalKey = kWebToPhysicalKey = kWebNumPadMap = { - 'NumpadDivide': LogicalKeyboardKey.numpadDivide, + 'NumpadParenLeft': LogicalKeyboardKey.numpadParenLeft, + 'NumpadParenRight': LogicalKeyboardKey.numpadParenRight, 'NumpadMultiply': LogicalKeyboardKey.numpadMultiply, - 'NumpadSubtract': LogicalKeyboardKey.numpadSubtract, 'NumpadAdd': LogicalKeyboardKey.numpadAdd, + 'NumpadComma': LogicalKeyboardKey.numpadComma, + 'NumpadSubtract': LogicalKeyboardKey.numpadSubtract, + 'NumpadDecimal': LogicalKeyboardKey.numpadDecimal, + 'NumpadDivide': LogicalKeyboardKey.numpadDivide, + 'Numpad0': LogicalKeyboardKey.numpad0, 'Numpad1': LogicalKeyboardKey.numpad1, 'Numpad2': LogicalKeyboardKey.numpad2, 'Numpad3': LogicalKeyboardKey.numpad3, @@ -2434,17 +2872,80 @@ const Map kWebNumPadMap = > kWebLocationMap = >{ + '0': [LogicalKeyboardKey.digit0, null, null, LogicalKeyboardKey.numpad0], + '1': [LogicalKeyboardKey.digit1, null, null, LogicalKeyboardKey.numpad1], + '2': [LogicalKeyboardKey.digit2, null, null, LogicalKeyboardKey.numpad2], + '3': [LogicalKeyboardKey.digit3, null, null, LogicalKeyboardKey.numpad3], + '4': [LogicalKeyboardKey.digit4, null, null, LogicalKeyboardKey.numpad4], + '5': [LogicalKeyboardKey.digit5, null, null, LogicalKeyboardKey.numpad5], + '6': [LogicalKeyboardKey.digit6, null, null, LogicalKeyboardKey.numpad6], + '7': [LogicalKeyboardKey.digit7, null, null, LogicalKeyboardKey.numpad7], + '8': [LogicalKeyboardKey.digit8, null, null, LogicalKeyboardKey.numpad8], + '9': [LogicalKeyboardKey.digit9, null, null, LogicalKeyboardKey.numpad9], + '.': [LogicalKeyboardKey.period, null, null, LogicalKeyboardKey.numpadDecimal], + 'Insert': [LogicalKeyboardKey.insert, null, null, LogicalKeyboardKey.numpad0], + 'End': [LogicalKeyboardKey.end, null, null, LogicalKeyboardKey.numpad1], + 'ArrowDown': [LogicalKeyboardKey.arrowDown, null, null, LogicalKeyboardKey.numpad2], + 'PageDown': [LogicalKeyboardKey.pageDown, null, null, LogicalKeyboardKey.numpad3], + 'ArrowLeft': [LogicalKeyboardKey.arrowLeft, null, null, LogicalKeyboardKey.numpad4], + 'Clear': [LogicalKeyboardKey.clear, null, null, LogicalKeyboardKey.numpad5], + 'ArrowRight': [LogicalKeyboardKey.arrowRight, null, null, LogicalKeyboardKey.numpad6], + 'Home': [LogicalKeyboardKey.home, null, null, LogicalKeyboardKey.numpad7], + 'ArrowUp': [LogicalKeyboardKey.arrowUp, null, null, LogicalKeyboardKey.numpad8], + 'PageUp': [LogicalKeyboardKey.pageUp, null, null, LogicalKeyboardKey.numpad9], + 'Delete': [LogicalKeyboardKey.delete, null, null, LogicalKeyboardKey.numpadDecimal], + '/': [LogicalKeyboardKey.slash, null, null, LogicalKeyboardKey.numpadDivide], + '*': [LogicalKeyboardKey.asterisk, null, null, LogicalKeyboardKey.numpadMultiply], + '-': [LogicalKeyboardKey.minus, null, null, LogicalKeyboardKey.numpadSubtract], + '+': [LogicalKeyboardKey.add, null, null, LogicalKeyboardKey.numpadAdd], + 'Enter': [LogicalKeyboardKey.enter, null, null, LogicalKeyboardKey.numpadEnter], + 'Shift': [null, LogicalKeyboardKey.shiftLeft, LogicalKeyboardKey.shiftRight, null], + 'Control': [null, LogicalKeyboardKey.controlLeft, LogicalKeyboardKey.controlRight, null], + 'Alt': [null, LogicalKeyboardKey.altLeft, LogicalKeyboardKey.altRight, null], + 'Meta': [null, LogicalKeyboardKey.metaLeft, LogicalKeyboardKey.metaRight, null], }; /// Maps Windows KeyboardEvent codes to the matching [LogicalKeyboardKey]. const Map kWindowsToLogicalKey = { - 95: LogicalKeyboardKey.sleep, + 3: LogicalKeyboardKey.cancel, + 8: LogicalKeyboardKey.backspace, + 9: LogicalKeyboardKey.tab, + 12: LogicalKeyboardKey.clear, + 13: LogicalKeyboardKey.enter, + 16: LogicalKeyboardKey.shiftLeft, + 17: LogicalKeyboardKey.controlLeft, + 19: LogicalKeyboardKey.pause, + 20: LogicalKeyboardKey.capsLock, + 21: LogicalKeyboardKey.lang1, + 23: LogicalKeyboardKey.junjaMode, + 24: LogicalKeyboardKey.finalMode, + 25: LogicalKeyboardKey.kanjiMode, + 27: LogicalKeyboardKey.escape, + 28: LogicalKeyboardKey.convert, + 30: LogicalKeyboardKey.accept, + 31: LogicalKeyboardKey.modeChange, + 32: LogicalKeyboardKey.space, + 33: LogicalKeyboardKey.pageUp, + 34: LogicalKeyboardKey.pageDown, + 35: LogicalKeyboardKey.end, + 36: LogicalKeyboardKey.home, + 37: LogicalKeyboardKey.arrowLeft, + 38: LogicalKeyboardKey.arrowUp, + 39: LogicalKeyboardKey.arrowRight, + 40: LogicalKeyboardKey.arrowDown, + 41: LogicalKeyboardKey.select, + 42: LogicalKeyboardKey.print, + 43: LogicalKeyboardKey.execute, + 45: LogicalKeyboardKey.insert, + 46: LogicalKeyboardKey.delete, + 47: LogicalKeyboardKey.help, 65: LogicalKeyboardKey.keyA, 66: LogicalKeyboardKey.keyB, 67: LogicalKeyboardKey.keyC, @@ -2471,23 +2972,25 @@ const Map kWindowsToLogicalKey = kWindowsToLogicalKey = kWindowsToLogicalKey = kWindowsToPhysicalKey = kWindowsNumPadMap = { - 111: LogicalKeyboardKey.numpadDivide, - 106: LogicalKeyboardKey.numpadMultiply, - 109: LogicalKeyboardKey.numpadSubtract, - 107: LogicalKeyboardKey.numpadAdd, + 96: LogicalKeyboardKey.numpad0, 97: LogicalKeyboardKey.numpad1, 98: LogicalKeyboardKey.numpad2, 99: LogicalKeyboardKey.numpad3, @@ -2741,7 +3236,10 @@ const Map kWindowsNumPadMap = 103: LogicalKeyboardKey.numpad7, 104: LogicalKeyboardKey.numpad8, 105: LogicalKeyboardKey.numpad9, - 96: LogicalKeyboardKey.numpad0, + 106: LogicalKeyboardKey.numpadMultiply, + 107: LogicalKeyboardKey.numpadAdd, + 109: LogicalKeyboardKey.numpadSubtract, 110: LogicalKeyboardKey.numpadDecimal, + 111: LogicalKeyboardKey.numpadDivide, 146: LogicalKeyboardKey.numpadEqual, }; diff --git a/packages/flutter/lib/src/services/raw_keyboard_ios.dart b/packages/flutter/lib/src/services/raw_keyboard_ios.dart index cc14ac6f23..bbf64012d7 100644 --- a/packages/flutter/lib/src/services/raw_keyboard_ios.dart +++ b/packages/flutter/lib/src/services/raw_keyboard_ios.dart @@ -107,6 +107,14 @@ class RawKeyEventDataIos extends RawKeyEventData { if (newKey != null) { return newKey; } + + // Keys that can't be derived with characterIgnoringModifiers will be + // derived from their key codes using this map. + final LogicalKeyboardKey? knownKey = kIosToLogicalKey[keyCode]; + if (knownKey != null) { + return knownKey; + } + // If this key is printable, generate the LogicalKeyboardKey from its // Unicode value. Control keys such as ESC, CRTL, and SHIFT are not // printable. HOME, DEL, arrow keys, and function keys are considered diff --git a/packages/flutter/lib/src/services/raw_keyboard_macos.dart b/packages/flutter/lib/src/services/raw_keyboard_macos.dart index 7ee7806795..ed6b7bf3c0 100644 --- a/packages/flutter/lib/src/services/raw_keyboard_macos.dart +++ b/packages/flutter/lib/src/services/raw_keyboard_macos.dart @@ -76,6 +76,14 @@ class RawKeyEventDataMacOs extends RawKeyEventData { if (numPadKey != null) { return numPadKey; } + + // Keys that can't be derived with characterIgnoringModifiers will be + // derived from their key codes using this map. + final LogicalKeyboardKey? knownKey = kMacOsToLogicalKey[keyCode]; + if (knownKey != null) { + return knownKey; + } + // If this key is printable, generate the LogicalKeyboardKey from its // Unicode value. Control keys such as ESC, CRTL, and SHIFT are not // printable. HOME, DEL, arrow keys, and function keys are considered diff --git a/packages/flutter/test/services/keyboard_key_test.dart b/packages/flutter/test/services/keyboard_key_test.dart index daca18f1f1..0c49dc9ab9 100644 --- a/packages/flutter/test/services/keyboard_key_test.dart +++ b/packages/flutter/test/services/keyboard_key_test.dart @@ -29,11 +29,11 @@ void main() { group(LogicalKeyboardKey, () { test('Various classes of keys can be looked up by code', () async { // Check a letter key - expect(LogicalKeyboardKey.findKeyByKeyId(0x0000000061), equals(LogicalKeyboardKey.keyA)); + expect(LogicalKeyboardKey.findKeyByKeyId(LogicalKeyboardKey.keyA.keyId), equals(LogicalKeyboardKey.keyA)); // Check a control key - expect(LogicalKeyboardKey.findKeyByKeyId(0x0100070029), equals(LogicalKeyboardKey.escape)); + expect(LogicalKeyboardKey.findKeyByKeyId(LogicalKeyboardKey.escape.keyId), equals(LogicalKeyboardKey.escape)); // Check a modifier key - expect(LogicalKeyboardKey.findKeyByKeyId(0x01000700e1), equals(LogicalKeyboardKey.shiftLeft)); + expect(LogicalKeyboardKey.findKeyByKeyId(LogicalKeyboardKey.shiftLeft.keyId), equals(LogicalKeyboardKey.shiftLeft)); }); test('Control characters are recognized as such', () async { // Check some common control characters