// Copyright 2018 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.input;

union Command {
    /// Commands for conveying input events to a `Session`.
    /// Structs defined in input_events.fidl.
    1: SendKeyboardInputCmd send_keyboard_input;
    2: SendPointerInputCmd send_pointer_input;

    /// Command to enable/disable delivery of hard keyboard events.
    3: SetHardKeyboardDeliveryCmd set_hard_keyboard_delivery;

    /// Command to enable/disable parallel delivery of input events.
    4: SetParallelDispatchCmd set_parallel_dispatch;
};

struct SendKeyboardInputCmd {
    uint32 compositor_id;
    KeyboardEvent keyboard_event; // Defined in input_events.fidl
};

struct SendPointerInputCmd {
    uint32 compositor_id;
    PointerEvent pointer_event; // Defined in input_events.fidl
};

/// Typically, clients should receive text inputs from an IME.
///
/// For cases where no IME mediation is desired (such as a game application),
/// this command requests Scenic to deliver hard keyboard events to the client.
///
/// By default, Scenic will *not* deliver hard keyboard events to a client.
struct SetHardKeyboardDeliveryCmd {
    bool delivery_request;
};

/// Typically, clients that participate in the hit test should receive input
/// events in parallel. This behavior is required for gesture disambiguation.
///
/// This command, typically set by the root presenter, allows disabling parallel
/// dispatch; it is part of the input v2 transition work.
// TODO(SCN-1047): Remove after gesture disambiguation is implemented.
struct SetParallelDispatchCmd {
    bool parallel_dispatch;
};
