1dcfda673SGerd Hoffmann #ifndef QEMU_HID_H 2dcfda673SGerd Hoffmann #define QEMU_HID_H 3dcfda673SGerd Hoffmann 4caf71f86SPaolo Bonzini #include "migration/vmstate.h" 5*1ff5eeddSGerd Hoffmann #include "ui/input.h" 6701a8f76SPaolo Bonzini 7dcfda673SGerd Hoffmann #define HID_MOUSE 1 8dcfda673SGerd Hoffmann #define HID_TABLET 2 9dcfda673SGerd Hoffmann #define HID_KEYBOARD 3 10dcfda673SGerd Hoffmann 11dcfda673SGerd Hoffmann typedef struct HIDPointerEvent { 12dcfda673SGerd Hoffmann int32_t xdx, ydy; /* relative iff it's a mouse, otherwise absolute */ 13dcfda673SGerd Hoffmann int32_t dz, buttons_state; 14dcfda673SGerd Hoffmann } HIDPointerEvent; 15dcfda673SGerd Hoffmann 16dcfda673SGerd Hoffmann #define QUEUE_LENGTH 16 /* should be enough for a triple-click */ 17dcfda673SGerd Hoffmann #define QUEUE_MASK (QUEUE_LENGTH-1u) 18dcfda673SGerd Hoffmann #define QUEUE_INCR(v) ((v)++, (v) &= QUEUE_MASK) 19dcfda673SGerd Hoffmann 20dcfda673SGerd Hoffmann typedef struct HIDState HIDState; 21dcfda673SGerd Hoffmann typedef void (*HIDEventFunc)(HIDState *s); 22dcfda673SGerd Hoffmann 23dcfda673SGerd Hoffmann typedef struct HIDMouseState { 24dcfda673SGerd Hoffmann HIDPointerEvent queue[QUEUE_LENGTH]; 25dcfda673SGerd Hoffmann int mouse_grabbed; 26dcfda673SGerd Hoffmann QEMUPutMouseEntry *eh_entry; 27dcfda673SGerd Hoffmann } HIDMouseState; 28dcfda673SGerd Hoffmann 29dcfda673SGerd Hoffmann typedef struct HIDKeyboardState { 30dcfda673SGerd Hoffmann uint32_t keycodes[QUEUE_LENGTH]; 31dcfda673SGerd Hoffmann uint16_t modifiers; 32dcfda673SGerd Hoffmann uint8_t leds; 33dcfda673SGerd Hoffmann uint8_t key[16]; 34dcfda673SGerd Hoffmann int32_t keys; 35dcfda673SGerd Hoffmann } HIDKeyboardState; 36dcfda673SGerd Hoffmann 37dcfda673SGerd Hoffmann struct HIDState { 38dcfda673SGerd Hoffmann union { 39dcfda673SGerd Hoffmann HIDMouseState ptr; 40dcfda673SGerd Hoffmann HIDKeyboardState kbd; 41dcfda673SGerd Hoffmann }; 42dcfda673SGerd Hoffmann uint32_t head; /* index into circular queue */ 43dcfda673SGerd Hoffmann uint32_t n; 44dcfda673SGerd Hoffmann int kind; 45b069d348SGerd Hoffmann int32_t protocol; 46b069d348SGerd Hoffmann uint8_t idle; 47027c03f7SHans de Goede bool idle_pending; 48027c03f7SHans de Goede QEMUTimer *idle_timer; 49dcfda673SGerd Hoffmann HIDEventFunc event; 50*1ff5eeddSGerd Hoffmann QemuInputHandlerState *s; 51dcfda673SGerd Hoffmann }; 52dcfda673SGerd Hoffmann 53dcfda673SGerd Hoffmann void hid_init(HIDState *hs, int kind, HIDEventFunc event); 54dcfda673SGerd Hoffmann void hid_reset(HIDState *hs); 55dcfda673SGerd Hoffmann void hid_free(HIDState *hs); 56dcfda673SGerd Hoffmann 57dcfda673SGerd Hoffmann bool hid_has_events(HIDState *hs); 58027c03f7SHans de Goede void hid_set_next_idle(HIDState *hs); 5921635e12SGerd Hoffmann void hid_pointer_activate(HIDState *hs); 60dcfda673SGerd Hoffmann int hid_pointer_poll(HIDState *hs, uint8_t *buf, int len); 61dcfda673SGerd Hoffmann int hid_keyboard_poll(HIDState *hs, uint8_t *buf, int len); 62dcfda673SGerd Hoffmann int hid_keyboard_write(HIDState *hs, uint8_t *buf, int len); 63dcfda673SGerd Hoffmann 64701a8f76SPaolo Bonzini extern const VMStateDescription vmstate_hid_keyboard_device; 65701a8f76SPaolo Bonzini 66701a8f76SPaolo Bonzini #define VMSTATE_HID_KEYBOARD_DEVICE(_field, _state) { \ 67701a8f76SPaolo Bonzini .name = (stringify(_field)), \ 68701a8f76SPaolo Bonzini .size = sizeof(HIDState), \ 69701a8f76SPaolo Bonzini .vmsd = &vmstate_hid_keyboard_device, \ 70701a8f76SPaolo Bonzini .flags = VMS_STRUCT, \ 71701a8f76SPaolo Bonzini .offset = vmstate_offset_value(_state, _field, HIDState), \ 72701a8f76SPaolo Bonzini } 73701a8f76SPaolo Bonzini 74701a8f76SPaolo Bonzini extern const VMStateDescription vmstate_hid_ptr_device; 75701a8f76SPaolo Bonzini 76701a8f76SPaolo Bonzini #define VMSTATE_HID_POINTER_DEVICE(_field, _state) { \ 77701a8f76SPaolo Bonzini .name = (stringify(_field)), \ 78701a8f76SPaolo Bonzini .size = sizeof(HIDState), \ 79701a8f76SPaolo Bonzini .vmsd = &vmstate_hid_ptr_device, \ 80701a8f76SPaolo Bonzini .flags = VMS_STRUCT, \ 81701a8f76SPaolo Bonzini .offset = vmstate_offset_value(_state, _field, HIDState), \ 82701a8f76SPaolo Bonzini } 83701a8f76SPaolo Bonzini 84701a8f76SPaolo Bonzini 85dcfda673SGerd Hoffmann #endif /* QEMU_HID_H */ 86