blob: b8ec32873804dbc2143e96d5ec5bdce9c14ad758 [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.shortcut;
using fuchsia.input;
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 MAX_REQUIRED_KEYS uint64 = 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(resource struct {
view_ref fuchsia.ui.views.ViewRef;
listener client_end: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(struct {
shortcut Shortcut;
}) -> ();
};
/// Shortcut descriptor.
type Shortcut = table {
/// Client-generated identifier, to distinguish activated shortcuts.
1: id uint32;
// Was used for input2 modifiers field.
2: reserved;
// Was used for input2 key field.
3: reserved;
/// 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: use_priority bool;
/// 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: key3 fuchsia.input.Key;
/// 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: keys_required vector<fuchsia.input.Key>:MAX_REQUIRED_KEYS;
};
/// Shortcut activation variations.
/// Enumerates keyboard interaction options for shortcuts' activations.
type Trigger = strict enum {
/// 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(struct {
id uint32;
}) -> (struct {
handled bool;
});
};