blob: 5fc474e29af63b3c69989d3388f7b5e2ca12883f [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
library fuchsia.ui.input2;
const uint64 MAX_ENTRIES_PER_MAP = 1024;
const uint64 MAX_MAPS_PER_LAYOUT = 64;
/// Input method editors should implement this protocol to populate
/// `KeyEvent.symbol` field based on current key layout.
[Discoverable]
protocol KeyboardLayoutState {
/// Get current key layout. Returns immediately on first call;
/// subsequent calls return when the value changes.
Watch() -> (KeyboardLayout layout);
};
/// Collection of key maps.
///
/// A physical key is first converted to key using `key_map`.
/// The key is then used to populate `symbol` using `symbol_map`.
/// Maps in `KeySymbolMap` should be searched for the key mapping in the order
/// they are included.
/// First key mapping found in an applicable map should be used.
/// Only maps with matching modifiers should be used.
/// See `KeySymbolMap` for modifiers matching criteria and examples.
table KeyboardLayout {
1: PhysicalKeyMap key_map;
2: vector<SemanticKeyMap>:MAX_MAPS_PER_LAYOUT semantic_key_map;
};
/// Key map describes a conversion of a physical key to a key.
/// Physical keys not included here are translated directly into keys.
table PhysicalKeyMap {
/// Collection of keys that should be explicitly mapped.
1: vector<PhysicalKeyMapEntry>:MAX_ENTRIES_PER_MAP entries;
};
/// A mapping of a physical key to a key.
struct PhysicalKeyMapEntry {
/// Physical key that's being mapped.
PhysicalKey physical_key;
/// A key to which the physical key is mapped to.
Key key;
};
/// Key map describes a conversion of a key to symbol representation.
///
/// The map should be validated using key event modifier states.
/// Map is applied if every modifier in the 'modifiers' list is active,
/// and all other active modifiers are members of the 'optional_modifiers' list.
/// If a modifier is enabled and not listed in neither `modifiers` nor
/// `optional_modifiers`, the map should be ignored.
///
/// Example:
/// Keyboard has NumLock and CapsLock enabled, and user presses Shift + Key.A
///
/// Map1:
/// modifiers: "CapsLock"
/// optional_modifiers: "NumLock"
/// Map2:
/// modifiers: "Shift",
/// optional_modifiers: "NumLock", "CapsLock", "ScrollLock"
/// Map3:
/// modifiers: None
/// optional_modifiers: "Shift", "CapsLock"
///
/// Map1 should be ignored, since "Shift" is pressed but is not included in
/// `modifiers` or `optional_modifiers`.
///
/// Map2 should be searched, since required "Shift" is enabled, and all other
/// enabled modifiers are included in `optional_modifiers`.
///
/// Map3 should be ignored, since "NumLock" is enabled but not included in
/// `modifiers` or `optional_modifiers`.
table SemanticKeyMap {
/// Combination of modifiers required for this map to be applied.
/// E.g. if CAPS_LOCK bit is set for this map, the map will be
/// applied if the Caps Lock state is ON.
/// Otherwise this map will be ignored if Caps Lock is off.
1: Modifiers modifiers;
/// Combination of modifiers that may be enabled for this map to be applied.
/// E.g. if CAPS_LOCK bit is set for this map, the map will be
/// applied if Caps Lock state is ON.
/// Also it may be applied if Caps Lock is off.
2: Modifiers optional_modifiers;
/// Collection of key to semantic meaning mappings.
3: vector<SemanticKeyMapEntry>:MAX_ENTRIES_PER_MAP entries;
};
/// A mapping of a key to the semantic meaning.
struct SemanticKeyMapEntry {
/// Key that's being mapped.
Key key;
/// Semantic key corresponding to the key.
SemanticKey semantic_key;
};