10d09e41aSPaolo Bonzini #ifndef QEMU_HID_H 20d09e41aSPaolo Bonzini #define QEMU_HID_H 30d09e41aSPaolo Bonzini 4*1ff5eeddSGerd Hoffmann #include "ui/input.h" 50d09e41aSPaolo Bonzini 60d09e41aSPaolo Bonzini #define HID_MOUSE 1 70d09e41aSPaolo Bonzini #define HID_TABLET 2 80d09e41aSPaolo Bonzini #define HID_KEYBOARD 3 90d09e41aSPaolo Bonzini 100d09e41aSPaolo Bonzini typedef struct HIDPointerEvent { 110d09e41aSPaolo Bonzini int32_t xdx, ydy; /* relative iff it's a mouse, otherwise absolute */ 120d09e41aSPaolo Bonzini int32_t dz, buttons_state; 130d09e41aSPaolo Bonzini } HIDPointerEvent; 140d09e41aSPaolo Bonzini 150d09e41aSPaolo Bonzini #define QUEUE_LENGTH 16 /* should be enough for a triple-click */ 160d09e41aSPaolo Bonzini #define QUEUE_MASK (QUEUE_LENGTH-1u) 170d09e41aSPaolo Bonzini #define QUEUE_INCR(v) ((v)++, (v) &= QUEUE_MASK) 180d09e41aSPaolo Bonzini 190d09e41aSPaolo Bonzini typedef struct HIDState HIDState; 200d09e41aSPaolo Bonzini typedef void (*HIDEventFunc)(HIDState *s); 210d09e41aSPaolo Bonzini 220d09e41aSPaolo Bonzini typedef struct HIDMouseState { 230d09e41aSPaolo Bonzini HIDPointerEvent queue[QUEUE_LENGTH]; 240d09e41aSPaolo Bonzini int mouse_grabbed; 250d09e41aSPaolo Bonzini } HIDMouseState; 260d09e41aSPaolo Bonzini 270d09e41aSPaolo Bonzini typedef struct HIDKeyboardState { 280d09e41aSPaolo Bonzini uint32_t keycodes[QUEUE_LENGTH]; 290d09e41aSPaolo Bonzini uint16_t modifiers; 300d09e41aSPaolo Bonzini uint8_t leds; 310d09e41aSPaolo Bonzini uint8_t key[16]; 320d09e41aSPaolo Bonzini int32_t keys; 330d09e41aSPaolo Bonzini } HIDKeyboardState; 340d09e41aSPaolo Bonzini 350d09e41aSPaolo Bonzini struct HIDState { 360d09e41aSPaolo Bonzini union { 370d09e41aSPaolo Bonzini HIDMouseState ptr; 380d09e41aSPaolo Bonzini HIDKeyboardState kbd; 390d09e41aSPaolo Bonzini }; 400d09e41aSPaolo Bonzini uint32_t head; /* index into circular queue */ 410d09e41aSPaolo Bonzini uint32_t n; 420d09e41aSPaolo Bonzini int kind; 430d09e41aSPaolo Bonzini int32_t protocol; 440d09e41aSPaolo Bonzini uint8_t idle; 450d09e41aSPaolo Bonzini bool idle_pending; 460d09e41aSPaolo Bonzini QEMUTimer *idle_timer; 470d09e41aSPaolo Bonzini HIDEventFunc event; 48*1ff5eeddSGerd Hoffmann QemuInputHandlerState *s; 490d09e41aSPaolo Bonzini }; 500d09e41aSPaolo Bonzini 510d09e41aSPaolo Bonzini void hid_init(HIDState *hs, int kind, HIDEventFunc event); 520d09e41aSPaolo Bonzini void hid_reset(HIDState *hs); 530d09e41aSPaolo Bonzini void hid_free(HIDState *hs); 540d09e41aSPaolo Bonzini 550d09e41aSPaolo Bonzini bool hid_has_events(HIDState *hs); 560d09e41aSPaolo Bonzini void hid_set_next_idle(HIDState *hs); 570d09e41aSPaolo Bonzini void hid_pointer_activate(HIDState *hs); 580d09e41aSPaolo Bonzini int hid_pointer_poll(HIDState *hs, uint8_t *buf, int len); 590d09e41aSPaolo Bonzini int hid_keyboard_poll(HIDState *hs, uint8_t *buf, int len); 600d09e41aSPaolo Bonzini int hid_keyboard_write(HIDState *hs, uint8_t *buf, int len); 610d09e41aSPaolo Bonzini 620d09e41aSPaolo Bonzini extern const VMStateDescription vmstate_hid_keyboard_device; 630d09e41aSPaolo Bonzini 640d09e41aSPaolo Bonzini #define VMSTATE_HID_KEYBOARD_DEVICE(_field, _state) { \ 650d09e41aSPaolo Bonzini .name = (stringify(_field)), \ 660d09e41aSPaolo Bonzini .size = sizeof(HIDState), \ 670d09e41aSPaolo Bonzini .vmsd = &vmstate_hid_keyboard_device, \ 680d09e41aSPaolo Bonzini .flags = VMS_STRUCT, \ 690d09e41aSPaolo Bonzini .offset = vmstate_offset_value(_state, _field, HIDState), \ 700d09e41aSPaolo Bonzini } 710d09e41aSPaolo Bonzini 720d09e41aSPaolo Bonzini extern const VMStateDescription vmstate_hid_ptr_device; 730d09e41aSPaolo Bonzini 740d09e41aSPaolo Bonzini #define VMSTATE_HID_POINTER_DEVICE(_field, _state) { \ 750d09e41aSPaolo Bonzini .name = (stringify(_field)), \ 760d09e41aSPaolo Bonzini .size = sizeof(HIDState), \ 770d09e41aSPaolo Bonzini .vmsd = &vmstate_hid_ptr_device, \ 780d09e41aSPaolo Bonzini .flags = VMS_STRUCT, \ 790d09e41aSPaolo Bonzini .offset = vmstate_offset_value(_state, _field, HIDState), \ 800d09e41aSPaolo Bonzini } 810d09e41aSPaolo Bonzini 820d09e41aSPaolo Bonzini 830d09e41aSPaolo Bonzini #endif /* QEMU_HID_H */ 84