1 | #ifndef QEMU_HID_H |
2 | #define QEMU_HID_H |
3 | |
4 | #include "ui/input.h" |
5 | |
6 | #define HID_MOUSE 1 |
7 | #define HID_TABLET 2 |
8 | #define HID_KEYBOARD 3 |
9 | |
10 | typedef struct HIDPointerEvent { |
11 | int32_t xdx, ydy; /* relative iff it's a mouse, otherwise absolute */ |
12 | int32_t dz, buttons_state; |
13 | } HIDPointerEvent; |
14 | |
15 | #define QUEUE_LENGTH 16 /* should be enough for a triple-click */ |
16 | #define QUEUE_MASK (QUEUE_LENGTH-1u) |
17 | #define QUEUE_INCR(v) ((v)++, (v) &= QUEUE_MASK) |
18 | |
19 | typedef struct HIDState HIDState; |
20 | typedef void (*HIDEventFunc)(HIDState *s); |
21 | |
22 | typedef struct HIDMouseState { |
23 | HIDPointerEvent queue[QUEUE_LENGTH]; |
24 | int mouse_grabbed; |
25 | } HIDMouseState; |
26 | |
27 | typedef struct HIDKeyboardState { |
28 | uint32_t keycodes[QUEUE_LENGTH]; |
29 | uint16_t modifiers; |
30 | uint8_t leds; |
31 | uint8_t key[16]; |
32 | int32_t keys; |
33 | } HIDKeyboardState; |
34 | |
35 | struct HIDState { |
36 | union { |
37 | HIDMouseState ptr; |
38 | HIDKeyboardState kbd; |
39 | }; |
40 | uint32_t head; /* index into circular queue */ |
41 | uint32_t n; |
42 | int kind; |
43 | int32_t protocol; |
44 | uint8_t idle; |
45 | bool idle_pending; |
46 | QEMUTimer *idle_timer; |
47 | HIDEventFunc event; |
48 | QemuInputHandlerState *s; |
49 | }; |
50 | |
51 | void hid_init(HIDState *hs, int kind, HIDEventFunc event); |
52 | void hid_reset(HIDState *hs); |
53 | void hid_free(HIDState *hs); |
54 | |
55 | bool hid_has_events(HIDState *hs); |
56 | void hid_set_next_idle(HIDState *hs); |
57 | void hid_pointer_activate(HIDState *hs); |
58 | int hid_pointer_poll(HIDState *hs, uint8_t *buf, int len); |
59 | int hid_keyboard_poll(HIDState *hs, uint8_t *buf, int len); |
60 | int hid_keyboard_write(HIDState *hs, uint8_t *buf, int len); |
61 | |
62 | extern const VMStateDescription vmstate_hid_keyboard_device; |
63 | |
64 | #define VMSTATE_HID_KEYBOARD_DEVICE(_field, _state) { \ |
65 | .name = (stringify(_field)), \ |
66 | .size = sizeof(HIDState), \ |
67 | .vmsd = &vmstate_hid_keyboard_device, \ |
68 | .flags = VMS_STRUCT, \ |
69 | .offset = vmstate_offset_value(_state, _field, HIDState), \ |
70 | } |
71 | |
72 | extern const VMStateDescription vmstate_hid_ptr_device; |
73 | |
74 | #define VMSTATE_HID_POINTER_DEVICE(_field, _state) { \ |
75 | .name = (stringify(_field)), \ |
76 | .size = sizeof(HIDState), \ |
77 | .vmsd = &vmstate_hid_ptr_device, \ |
78 | .flags = VMS_STRUCT, \ |
79 | .offset = vmstate_offset_value(_state, _field, HIDState), \ |
80 | } |
81 | |
82 | |
83 | #endif /* QEMU_HID_H */ |
84 | |