// 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.
    SendKeyboardInputCmd send_keyboard_input;
    SendPointerInputCmd send_pointer_input;

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

    // Command to enable/disable parallel delivery of input events.
    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;
};
