// 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.shortcut;

using fuchsia.input;
using fuchsia.ui.input2;
using fuchsia.ui.views;

/// The maximum number of shortcut keys, excluding the trigger key, that is required
/// to activate a shortcut.
/// Currently a low bound based on current use-cases.
const uint64 MAX_REQUIRED_KEYS = 2;

/// Components may request this service from their namespace to
/// register and be notified of shortcuts.
/// Registry supports multiple registrations simultaneously.
[Discoverable]
protocol Registry {
    /// Set shortcut activation listener.
    SetView(fuchsia.ui.views.ViewRef view_ref, Listener listener);

    /// Register new shortcut. Upon activation, `Listener` is invoked.
    /// Only focused ViewRefs will be notified of matching shortcut activations.
    /// For the full disambiguation procedure, see package-level documentation.
    RegisterShortcut(Shortcut shortcut) -> ();
};

/// Shortcut descriptor.
table Shortcut {
    /// Client-generated identifier, to distinguish activated shortcuts.
    1: uint32 id;

    /// Modifier keys to be enabled for the shortcut activation.
    /// @deprecated
    2: fuchsia.ui.input2.Modifiers modifiers;

    /// Optional: Key to be pressed to activate the shortcut.
    /// If not set, shortcut is interpreted as a modifiers-only shortcut.
    /// @deprecated
    3: fuchsia.ui.input2.Key key;

    /// Optional: When set to true, parent's shortcuts take priority
    /// and are matched before those of its children.
    /// When use_priority is not set, shortcut uses use_priority == false.
    4: bool use_priority;

    /// Optional: Shortcut activation trigger.
    /// When trigger is not set, shortcuts are activated on Trigger.KEY_PRESSED.
    /// Activating a shortcut on one trigger (e.g. Trigger.KEY_PRESSED) will disable
    /// matching keys used for it for other Trigger options for other shortcuts.
    ///
    /// Example:
    ///   Shortcuts registered for:
    ///     1. Key.LEFT_META + Key.Q with with Trigger.KEY_PRESSED
    ///     2. Key.LEFT_META with Trigger.KEY_PRESSED_AND_RELEASED
    ///   In this case, pressing Left Meta + Q will activate only shortcut (1), while
    ///   pressing and releasing Meta key alone will activate shortcut (2).
    5: Trigger trigger;

    /// Key to be pressed to activate the shortcut.
    6: fuchsia.input.Key key3;

    /// Keys that should be pressed to activate the shortcut.
    ///
    /// Example:
    ///  `Shift` + `Alt` + `Tab`:
    ///    Setup:
    ///     - `Shift` and `Alt` are the prerequisite for the shortcut activation,
    ///       therefore `keys_required = [ Key.LEFT_SHIFT, Key.LEFT_ALT ]`
    ///     - `Tab` is the trigger key, therefore `key3 = Key.TAB`
    ///    Result:
    ///     Shortcut is activated on Tab key press if Left Alt and Left Shift are held down.
    7: vector<fuchsia.input.Key>:MAX_REQUIRED_KEYS keys_required;
};

/// Shortcut activation variations.
/// Enumerates keyboard interaction options for shortcuts' activations.
enum Trigger {
    /// Activate shortcut on key press.
    KEY_PRESSED = 1;

    /// Activate shortcut on key release which is preceded by a key press.
    KEY_PRESSED_AND_RELEASED = 2;

    // TODO: add later when needed
    // KEY_LONG_PRESSED = 3;
    // KEY_PRESSED_REPEATEDLY = 4;
};

/// Client should implement this protocol to get notified of shortcut activation.
/// Only focused ViewRefs will be notified of matching shortcut activations.
/// For the full disambiguation procedure, see package-level documentation.
protocol Listener {
    OnShortcut(uint32 id) -> (bool handled);
};
