#ifndef QEMU_HID_H #define QEMU_HID_H #include "vmstate.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; QEMUPutMouseEntry *eh_entry; } 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; int64_t next_idle_clock; HIDEventFunc event; }; 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, int64_t curtime); 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 */