blob: dd2faa527fc2a0c6a61cda4a8a3db69dba0c90e9 [file] [log] [blame]
//---------------------------------------------------------------------------------------------
// Copyright (c) 2022 Google LLC
// Licensed under the MIT License. See License.txt in the project root for license information.
//--------------------------------------------------------------------------------------------*/
import 'key_mappings.g.dart';
int? _characterToLogicalKey(String? key) {
// We have yet to find a case where length >= 2 is useful.
if (key == null || key.length >= 2) {
return null;
}
final int result = key.toLowerCase().codeUnitAt(0);
return result;
}
/// Maps locale-sensitive keys from KeyboardEvent properties to a logical key.
class LocaleKeymap {
/// Create a [LocaleKeymap] for Windows.
LocaleKeymap.win() : _mapping = getMappingDataWin();
/// Create a [LocaleKeymap] for Linux.
LocaleKeymap.linux() : _mapping = getMappingDataLinux();
/// Create a [LocaleKeymap] for Darwin.
LocaleKeymap.darwin() : _mapping = getMappingDataDarwin();
/// Return a logical key mapped from KeyboardEvent properties.
///
/// This method handles all printable characters, including letters, digits,
/// and symbols.
///
/// Before calling this method, the caller should have eliminated cases where
/// the event key is a "key name", such as "Shift" or "AudioVolumnDown".
///
/// If the return value is null, there's no way to derive a meaningful value
/// from the printable information of the event.
int? getLogicalKey(String? eventCode, String? eventKey, int eventKeyCode) {
final int? result = _mapping[eventCode]?[eventKey];
if (result == kUseKeyCode) {
return eventKeyCode;
}
if (result == null) {
final int? heuristicResult = heuristicMapper(eventCode ?? '', eventKey ?? '');
if (heuristicResult != null) {
return heuristicResult;
}
// Characters: map to unicode zone.
//
// While characters are usually resolved in the last step, this can happen
// in non-latin layouts when a non-latin character is on a symbol key (ru,
// Semicolon-ж) or on an alnum key that has been assigned elsewhere (hu,
// Digit0-Ö).
final int? characterLogicalKey = _characterToLogicalKey(eventKey);
if (characterLogicalKey != null) {
return characterLogicalKey;
}
}
return result;
}
final Map<String, Map<String, int>> _mapping;
}