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

@available(deprecated=10, note="Obsolete: scenic ignores these commands")
type Command = strict union {
    1: send_keyboard_input SendKeyboardInputCmd;
    2: send_pointer_input SendPointerInputCmd;
    3: set_hard_keyboard_delivery SetHardKeyboardDeliveryCmd;
    4: set_parallel_dispatch SetParallelDispatchCmd;
};

@available(deprecated=10, note="Obsolete: scenic ignores these commands")
type SendKeyboardInputCmd = struct {
    compositor_id uint32;
    keyboard_event KeyboardEvent;
};

@available(deprecated=10, note="Obsolete: scenic ignores these commands")
type SendPointerInputCmd = struct {
    compositor_id uint32;
    pointer_event PointerEvent;
};

@available(deprecated=10, note="Obsolete: scenic ignores these commands")
type SetHardKeyboardDeliveryCmd = struct {
    delivery_request bool;
};

@available(deprecated=10, note="Obsolete: scenic ignores these commands")
type SetParallelDispatchCmd = struct {
    parallel_dispatch bool;
};
