// 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;
};
