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

    /// Obsolete. This command is a no-op.
    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;
};

/// Obsolete. This command is a no-op.
struct SetParallelDispatchCmd {
    bool parallel_dispatch;
};
