// Copyright 2020 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.input3;

/// Declares all the modifiers supported by Fuchsia's input subsystem.
///
/// Modifiers are special keys that modify the purpose or the function
/// of other keys when used in combination with them.  In the Modifiers type,
/// a bit is set if the specific modifier key is actuated (held down),
/// irrespective of whether the modifier has an associated lock state or not.
///
/// Somewhat specially, and as a convenience for the users, the modifiers that
/// have "left" and "right" flavors have special bit values which can be used
/// if the distinction between sides does not matter.
type Modifiers = flexible bits : uint64 {
    /// Applies when the `CAPS_LOCK` modifier is actuated.
    CAPS_LOCK = 0x1;
    /// Applies when the `NUM_LOCK` modifier is actuated.
    NUM_LOCK = 0x2;
    /// Applies when the `SCROLL_LOCK` modifier is actuated.
    SCROLL_LOCK = 0x4;
    /// Applies when the `FUNCTION` modifier is actuated.
    FUNCTION = 0x8;
    /// Applies when the `SYMBOL` modifier is actuated.
    SYMBOL = 0x10;
    /// Applies when the left SHIFT modifier is actuated.
    LEFT_SHIFT = 0x20;
    /// Applies when the right SHIFT modifier is actuated.
    RIGHT_SHIFT = 0x40;
    /// Applies when either `LEFT_SHIFT` or `RIGHT_SHIFT` modifier is actuated.
    ///
    /// This bit mask a convenience to test for either `LEFT_SHIFT`
    /// or `RIGHT_SHIFT`.
    SHIFT = 0x80;
    /// Applies when the left `ALT` modifier is actuated.
    LEFT_ALT = 0x100;
    /// Applies when the right `ALT` modifier is actuated.
    RIGHT_ALT = 0x200;
    /// Applies when either the left `ALT` or the right `ALT` modifier
    /// is actuated.
    ALT = 0x400;
    /// Applies when the `ALT_GRAPH` modifier is actuated.
    ALT_GRAPH = 0x800;
    /// Applies when the `LEFT_META` modifier is actuated.
    LEFT_META = 0x1000;
    /// Applies when the `RIGHT_META` modifier is actuated.
    RIGHT_META = 0x2000;
    /// Applies when either `LEFT_META` or `RIGHT_META` modifier is actuated.
    META = 0x4000;
    /// Applies when the `LEFT_CTRL` modifier is actuated.
    LEFT_CTRL = 0x8000;
    /// Applies when the `RIGHT_CTRL` modifier is actuated.
    RIGHT_CTRL = 0x10000;
    /// Applies when either `LEFT_CTRL` or `RIGHT_CTRL` modifier is actuated.
    CTRL = 0x20000;
};

/// A bit field of lock states which are currently active.
///
/// Lock state reports whether the lock is active for the keys which have a lock
/// state (need to be pressed once to activate, and one more time to deactivate).
/// A set bit denotes active lock state.
///
/// For example, when Caps Lock is active, i.e. pressing 'a' produces the effect
/// of 'A' appearing on the screen, the `CAPS_LOCK` bit will be active.
///
/// The bit values in `LockState` are chosen to correspond to the values in
/// `Modifiers`, to the extent that this is doable in the long run.
type LockState = flexible bits : uint64 {
    /// Applies when the `CAPS_LOCK` modifier is locked.
    ///
    /// Users should bear in mind that the effect of `CAPS_LOCK` is limited to
    /// alphabetic keys (not even *alphanumerics*) mainly.
    ///
    /// For example, pressing `a` on a US QWERTY keyboard while `CAPS_LOCK`
    /// state is locked results in the key meaning `A`, just as if the Shift modifier
    /// was used.  However, pressing `[` when `CAPS_LOCK` is locked gives `[`,
    /// even though Shift+`[` gives `{`.
    ///
    /// The position of alphabetic keys may vary depending on the keymap in
    /// current use too.
    CAPS_LOCK = 0x1;
    /// Applies when the `NUM_LOCK` modifier is locked.
    NUM_LOCK = 0x2;
    /// Applies when the `SCROLL_LOCK` modifier is locked.
    SCROLL_LOCK = 0x4;
    /// Applies when the `FUNCTION` modifier is locked.
    FUNCTION_LOCK = 0x8;
    /// Applies when the `SYMBOL` modifier is locked.
    SYMBOL_LOCK = 0x10;
};
