#ifndef QEMU_HID_H
#define QEMU_HID_H

#include "ui/input.h"

#define HID_MOUSE     1
#define HID_TABLET    2
#define HID_KEYBOARD  3

typedef struct HIDPointerEvent {
    int32_t xdx, ydy; /* relative iff it's a mouse, otherwise absolute */
    int32_t dz, buttons_state;
} HIDPointerEvent;

#define QUEUE_LENGTH    16 /* should be enough for a triple-click */
#define QUEUE_MASK      (QUEUE_LENGTH-1u)
#define QUEUE_INCR(v)   ((v)++, (v) &= QUEUE_MASK)

typedef struct HIDState HIDState;
typedef void (*HIDEventFunc)(HIDState *s);

typedef struct HIDMouseState {
    HIDPointerEvent queue[QUEUE_LENGTH];
    int mouse_grabbed;
} HIDMouseState;

typedef struct HIDKeyboardState {
    uint32_t keycodes[QUEUE_LENGTH];
    uint16_t modifiers;
    uint8_t leds;
    uint8_t key[16];
    int32_t keys;
} HIDKeyboardState;

struct HIDState {
    union {
        HIDMouseState ptr;
        HIDKeyboardState kbd;
    };
    uint32_t head; /* index into circular queue */
    uint32_t n;
    int kind;
    int32_t protocol;
    uint8_t idle;
    bool idle_pending;
    QEMUTimer *idle_timer;
    HIDEventFunc event;
    QemuInputHandlerState *s;
};

void hid_init(HIDState *hs, int kind, HIDEventFunc event);
void hid_reset(HIDState *hs);
void hid_free(HIDState *hs);

bool hid_has_events(HIDState *hs);
void hid_set_next_idle(HIDState *hs);
void hid_pointer_activate(HIDState *hs);
int hid_pointer_poll(HIDState *hs, uint8_t *buf, int len);
int hid_keyboard_poll(HIDState *hs, uint8_t *buf, int len);
int hid_keyboard_write(HIDState *hs, uint8_t *buf, int len);

extern const VMStateDescription vmstate_hid_keyboard_device;

#define VMSTATE_HID_KEYBOARD_DEVICE(_field, _state) {                \
    .name       = (stringify(_field)),                               \
    .size       = sizeof(HIDState),                                  \
    .vmsd       = &vmstate_hid_keyboard_device,                      \
    .flags      = VMS_STRUCT,                                        \
    .offset     = vmstate_offset_value(_state, _field, HIDState),    \
}

extern const VMStateDescription vmstate_hid_ptr_device;

#define VMSTATE_HID_POINTER_DEVICE(_field, _state) {                 \
    .name       = (stringify(_field)),                               \
    .size       = sizeof(HIDState),                                  \
    .vmsd       = &vmstate_hid_ptr_device,                           \
    .flags      = VMS_STRUCT,                                        \
    .offset     = vmstate_offset_value(_state, _field, HIDState),    \
}


#endif /* QEMU_HID_H */
