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