2
0

input.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583
  1. #include "qemu/osdep.h"
  2. #include "hw/qdev.h"
  3. #include "sysemu/sysemu.h"
  4. #include "qapi-types.h"
  5. #include "qemu/error-report.h"
  6. #include "qmp-commands.h"
  7. #include "trace.h"
  8. #include "ui/input.h"
  9. #include "ui/console.h"
  10. #include "sysemu/replay.h"
  11. struct QemuInputHandlerState {
  12. DeviceState *dev;
  13. QemuInputHandler *handler;
  14. int id;
  15. int events;
  16. QemuConsole *con;
  17. QTAILQ_ENTRY(QemuInputHandlerState) node;
  18. };
  19. typedef struct QemuInputEventQueue QemuInputEventQueue;
  20. struct QemuInputEventQueue {
  21. enum {
  22. QEMU_INPUT_QUEUE_DELAY = 1,
  23. QEMU_INPUT_QUEUE_EVENT,
  24. QEMU_INPUT_QUEUE_SYNC,
  25. } type;
  26. QEMUTimer *timer;
  27. uint32_t delay_ms;
  28. QemuConsole *src;
  29. InputEvent *evt;
  30. QTAILQ_ENTRY(QemuInputEventQueue) node;
  31. };
  32. static QTAILQ_HEAD(, QemuInputHandlerState) handlers =
  33. QTAILQ_HEAD_INITIALIZER(handlers);
  34. static NotifierList mouse_mode_notifiers =
  35. NOTIFIER_LIST_INITIALIZER(mouse_mode_notifiers);
  36. static QTAILQ_HEAD(QemuInputEventQueueHead, QemuInputEventQueue) kbd_queue =
  37. QTAILQ_HEAD_INITIALIZER(kbd_queue);
  38. static QEMUTimer *kbd_timer;
  39. static uint32_t kbd_default_delay_ms = 10;
  40. static uint32_t queue_count;
  41. static uint32_t queue_limit = 1024;
  42. QemuInputHandlerState *qemu_input_handler_register(DeviceState *dev,
  43. QemuInputHandler *handler)
  44. {
  45. QemuInputHandlerState *s = g_new0(QemuInputHandlerState, 1);
  46. static int id = 1;
  47. s->dev = dev;
  48. s->handler = handler;
  49. s->id = id++;
  50. QTAILQ_INSERT_TAIL(&handlers, s, node);
  51. qemu_input_check_mode_change();
  52. return s;
  53. }
  54. void qemu_input_handler_activate(QemuInputHandlerState *s)
  55. {
  56. QTAILQ_REMOVE(&handlers, s, node);
  57. QTAILQ_INSERT_HEAD(&handlers, s, node);
  58. qemu_input_check_mode_change();
  59. }
  60. void qemu_input_handler_deactivate(QemuInputHandlerState *s)
  61. {
  62. QTAILQ_REMOVE(&handlers, s, node);
  63. QTAILQ_INSERT_TAIL(&handlers, s, node);
  64. qemu_input_check_mode_change();
  65. }
  66. void qemu_input_handler_unregister(QemuInputHandlerState *s)
  67. {
  68. QTAILQ_REMOVE(&handlers, s, node);
  69. g_free(s);
  70. qemu_input_check_mode_change();
  71. }
  72. void qemu_input_handler_bind(QemuInputHandlerState *s,
  73. const char *device_id, int head,
  74. Error **errp)
  75. {
  76. QemuConsole *con;
  77. Error *err = NULL;
  78. con = qemu_console_lookup_by_device_name(device_id, head, &err);
  79. if (err) {
  80. error_propagate(errp, err);
  81. return;
  82. }
  83. s->con = con;
  84. }
  85. static QemuInputHandlerState*
  86. qemu_input_find_handler(uint32_t mask, QemuConsole *con)
  87. {
  88. QemuInputHandlerState *s;
  89. QTAILQ_FOREACH(s, &handlers, node) {
  90. if (s->con == NULL || s->con != con) {
  91. continue;
  92. }
  93. if (mask & s->handler->mask) {
  94. return s;
  95. }
  96. }
  97. QTAILQ_FOREACH(s, &handlers, node) {
  98. if (s->con != NULL) {
  99. continue;
  100. }
  101. if (mask & s->handler->mask) {
  102. return s;
  103. }
  104. }
  105. return NULL;
  106. }
  107. void qmp_input_send_event(bool has_device, const char *device,
  108. bool has_head, int64_t head,
  109. InputEventList *events, Error **errp)
  110. {
  111. InputEventList *e;
  112. QemuConsole *con;
  113. Error *err = NULL;
  114. con = NULL;
  115. if (has_device) {
  116. if (!has_head) {
  117. head = 0;
  118. }
  119. con = qemu_console_lookup_by_device_name(device, head, &err);
  120. if (err) {
  121. error_propagate(errp, err);
  122. return;
  123. }
  124. }
  125. if (!runstate_is_running() && !runstate_check(RUN_STATE_SUSPENDED)) {
  126. error_setg(errp, "VM not running");
  127. return;
  128. }
  129. for (e = events; e != NULL; e = e->next) {
  130. InputEvent *event = e->value;
  131. if (!qemu_input_find_handler(1 << event->type, con)) {
  132. error_setg(errp, "Input handler not found for "
  133. "event type %s",
  134. InputEventKind_lookup[event->type]);
  135. return;
  136. }
  137. }
  138. for (e = events; e != NULL; e = e->next) {
  139. InputEvent *event = e->value;
  140. qemu_input_event_send(con, event);
  141. }
  142. qemu_input_event_sync();
  143. }
  144. static void qemu_input_transform_abs_rotate(InputEvent *evt)
  145. {
  146. InputMoveEvent *move = evt->u.abs.data;
  147. switch (graphic_rotate) {
  148. case 90:
  149. if (move->axis == INPUT_AXIS_X) {
  150. move->axis = INPUT_AXIS_Y;
  151. } else if (move->axis == INPUT_AXIS_Y) {
  152. move->axis = INPUT_AXIS_X;
  153. move->value = INPUT_EVENT_ABS_SIZE - 1 - move->value;
  154. }
  155. break;
  156. case 180:
  157. move->value = INPUT_EVENT_ABS_SIZE - 1 - move->value;
  158. break;
  159. case 270:
  160. if (move->axis == INPUT_AXIS_X) {
  161. move->axis = INPUT_AXIS_Y;
  162. move->value = INPUT_EVENT_ABS_SIZE - 1 - move->value;
  163. } else if (move->axis == INPUT_AXIS_Y) {
  164. move->axis = INPUT_AXIS_X;
  165. }
  166. break;
  167. }
  168. }
  169. static void qemu_input_event_trace(QemuConsole *src, InputEvent *evt)
  170. {
  171. const char *name;
  172. int qcode, idx = -1;
  173. InputKeyEvent *key;
  174. InputBtnEvent *btn;
  175. InputMoveEvent *move;
  176. if (src) {
  177. idx = qemu_console_get_index(src);
  178. }
  179. switch (evt->type) {
  180. case INPUT_EVENT_KIND_KEY:
  181. key = evt->u.key.data;
  182. switch (key->key->type) {
  183. case KEY_VALUE_KIND_NUMBER:
  184. qcode = qemu_input_key_number_to_qcode(key->key->u.number.data);
  185. name = QKeyCode_lookup[qcode];
  186. trace_input_event_key_number(idx, key->key->u.number.data,
  187. name, key->down);
  188. break;
  189. case KEY_VALUE_KIND_QCODE:
  190. name = QKeyCode_lookup[key->key->u.qcode.data];
  191. trace_input_event_key_qcode(idx, name, key->down);
  192. break;
  193. case KEY_VALUE_KIND__MAX:
  194. /* keep gcc happy */
  195. break;
  196. }
  197. break;
  198. case INPUT_EVENT_KIND_BTN:
  199. btn = evt->u.btn.data;
  200. name = InputButton_lookup[btn->button];
  201. trace_input_event_btn(idx, name, btn->down);
  202. break;
  203. case INPUT_EVENT_KIND_REL:
  204. move = evt->u.rel.data;
  205. name = InputAxis_lookup[move->axis];
  206. trace_input_event_rel(idx, name, move->value);
  207. break;
  208. case INPUT_EVENT_KIND_ABS:
  209. move = evt->u.abs.data;
  210. name = InputAxis_lookup[move->axis];
  211. trace_input_event_abs(idx, name, move->value);
  212. break;
  213. case INPUT_EVENT_KIND__MAX:
  214. /* keep gcc happy */
  215. break;
  216. }
  217. }
  218. static void qemu_input_queue_process(void *opaque)
  219. {
  220. struct QemuInputEventQueueHead *queue = opaque;
  221. QemuInputEventQueue *item;
  222. g_assert(!QTAILQ_EMPTY(queue));
  223. item = QTAILQ_FIRST(queue);
  224. g_assert(item->type == QEMU_INPUT_QUEUE_DELAY);
  225. QTAILQ_REMOVE(queue, item, node);
  226. queue_count--;
  227. g_free(item);
  228. while (!QTAILQ_EMPTY(queue)) {
  229. item = QTAILQ_FIRST(queue);
  230. switch (item->type) {
  231. case QEMU_INPUT_QUEUE_DELAY:
  232. timer_mod(item->timer, qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL)
  233. + item->delay_ms);
  234. return;
  235. case QEMU_INPUT_QUEUE_EVENT:
  236. qemu_input_event_send(item->src, item->evt);
  237. qapi_free_InputEvent(item->evt);
  238. break;
  239. case QEMU_INPUT_QUEUE_SYNC:
  240. qemu_input_event_sync();
  241. break;
  242. }
  243. QTAILQ_REMOVE(queue, item, node);
  244. queue_count--;
  245. g_free(item);
  246. }
  247. }
  248. static void qemu_input_queue_delay(struct QemuInputEventQueueHead *queue,
  249. QEMUTimer *timer, uint32_t delay_ms)
  250. {
  251. QemuInputEventQueue *item = g_new0(QemuInputEventQueue, 1);
  252. bool start_timer = QTAILQ_EMPTY(queue);
  253. item->type = QEMU_INPUT_QUEUE_DELAY;
  254. item->delay_ms = delay_ms;
  255. item->timer = timer;
  256. QTAILQ_INSERT_TAIL(queue, item, node);
  257. queue_count++;
  258. if (start_timer) {
  259. timer_mod(item->timer, qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL)
  260. + item->delay_ms);
  261. }
  262. }
  263. static void qemu_input_queue_event(struct QemuInputEventQueueHead *queue,
  264. QemuConsole *src, InputEvent *evt)
  265. {
  266. QemuInputEventQueue *item = g_new0(QemuInputEventQueue, 1);
  267. item->type = QEMU_INPUT_QUEUE_EVENT;
  268. item->src = src;
  269. item->evt = evt;
  270. QTAILQ_INSERT_TAIL(queue, item, node);
  271. queue_count++;
  272. }
  273. static void qemu_input_queue_sync(struct QemuInputEventQueueHead *queue)
  274. {
  275. QemuInputEventQueue *item = g_new0(QemuInputEventQueue, 1);
  276. item->type = QEMU_INPUT_QUEUE_SYNC;
  277. QTAILQ_INSERT_TAIL(queue, item, node);
  278. queue_count++;
  279. }
  280. void qemu_input_event_send_impl(QemuConsole *src, InputEvent *evt)
  281. {
  282. QemuInputHandlerState *s;
  283. qemu_input_event_trace(src, evt);
  284. /* pre processing */
  285. if (graphic_rotate && (evt->type == INPUT_EVENT_KIND_ABS)) {
  286. qemu_input_transform_abs_rotate(evt);
  287. }
  288. /* send event */
  289. s = qemu_input_find_handler(1 << evt->type, src);
  290. if (!s) {
  291. return;
  292. }
  293. s->handler->event(s->dev, src, evt);
  294. s->events++;
  295. }
  296. void qemu_input_event_send(QemuConsole *src, InputEvent *evt)
  297. {
  298. if (!runstate_is_running() && !runstate_check(RUN_STATE_SUSPENDED)) {
  299. return;
  300. }
  301. replay_input_event(src, evt);
  302. }
  303. void qemu_input_event_sync_impl(void)
  304. {
  305. QemuInputHandlerState *s;
  306. trace_input_event_sync();
  307. QTAILQ_FOREACH(s, &handlers, node) {
  308. if (!s->events) {
  309. continue;
  310. }
  311. if (s->handler->sync) {
  312. s->handler->sync(s->dev);
  313. }
  314. s->events = 0;
  315. }
  316. }
  317. void qemu_input_event_sync(void)
  318. {
  319. if (!runstate_is_running() && !runstate_check(RUN_STATE_SUSPENDED)) {
  320. return;
  321. }
  322. replay_input_sync_event();
  323. }
  324. InputEvent *qemu_input_event_new_key(KeyValue *key, bool down)
  325. {
  326. InputEvent *evt = g_new0(InputEvent, 1);
  327. evt->u.key.data = g_new0(InputKeyEvent, 1);
  328. evt->type = INPUT_EVENT_KIND_KEY;
  329. evt->u.key.data->key = key;
  330. evt->u.key.data->down = down;
  331. return evt;
  332. }
  333. void qemu_input_event_send_key(QemuConsole *src, KeyValue *key, bool down)
  334. {
  335. InputEvent *evt;
  336. evt = qemu_input_event_new_key(key, down);
  337. if (QTAILQ_EMPTY(&kbd_queue)) {
  338. qemu_input_event_send(src, evt);
  339. qemu_input_event_sync();
  340. qapi_free_InputEvent(evt);
  341. } else if (queue_count < queue_limit) {
  342. qemu_input_queue_event(&kbd_queue, src, evt);
  343. qemu_input_queue_sync(&kbd_queue);
  344. }
  345. }
  346. void qemu_input_event_send_key_number(QemuConsole *src, int num, bool down)
  347. {
  348. KeyValue *key = g_new0(KeyValue, 1);
  349. key->type = KEY_VALUE_KIND_NUMBER;
  350. key->u.number.data = num;
  351. qemu_input_event_send_key(src, key, down);
  352. }
  353. void qemu_input_event_send_key_qcode(QemuConsole *src, QKeyCode q, bool down)
  354. {
  355. KeyValue *key = g_new0(KeyValue, 1);
  356. key->type = KEY_VALUE_KIND_QCODE;
  357. key->u.qcode.data = q;
  358. qemu_input_event_send_key(src, key, down);
  359. }
  360. void qemu_input_event_send_key_delay(uint32_t delay_ms)
  361. {
  362. if (!kbd_timer) {
  363. kbd_timer = timer_new_ms(QEMU_CLOCK_VIRTUAL, qemu_input_queue_process,
  364. &kbd_queue);
  365. }
  366. if (queue_count < queue_limit) {
  367. qemu_input_queue_delay(&kbd_queue, kbd_timer,
  368. delay_ms ? delay_ms : kbd_default_delay_ms);
  369. }
  370. }
  371. InputEvent *qemu_input_event_new_btn(InputButton btn, bool down)
  372. {
  373. InputEvent *evt = g_new0(InputEvent, 1);
  374. evt->u.btn.data = g_new0(InputBtnEvent, 1);
  375. evt->type = INPUT_EVENT_KIND_BTN;
  376. evt->u.btn.data->button = btn;
  377. evt->u.btn.data->down = down;
  378. return evt;
  379. }
  380. void qemu_input_queue_btn(QemuConsole *src, InputButton btn, bool down)
  381. {
  382. InputEvent *evt;
  383. evt = qemu_input_event_new_btn(btn, down);
  384. qemu_input_event_send(src, evt);
  385. qapi_free_InputEvent(evt);
  386. }
  387. void qemu_input_update_buttons(QemuConsole *src, uint32_t *button_map,
  388. uint32_t button_old, uint32_t button_new)
  389. {
  390. InputButton btn;
  391. uint32_t mask;
  392. for (btn = 0; btn < INPUT_BUTTON__MAX; btn++) {
  393. mask = button_map[btn];
  394. if ((button_old & mask) == (button_new & mask)) {
  395. continue;
  396. }
  397. qemu_input_queue_btn(src, btn, button_new & mask);
  398. }
  399. }
  400. bool qemu_input_is_absolute(void)
  401. {
  402. QemuInputHandlerState *s;
  403. s = qemu_input_find_handler(INPUT_EVENT_MASK_REL | INPUT_EVENT_MASK_ABS,
  404. NULL);
  405. return (s != NULL) && (s->handler->mask & INPUT_EVENT_MASK_ABS);
  406. }
  407. int qemu_input_scale_axis(int value, int size_in, int size_out)
  408. {
  409. if (size_in < 2) {
  410. return size_out / 2;
  411. }
  412. return (int64_t)value * (size_out - 1) / (size_in - 1);
  413. }
  414. InputEvent *qemu_input_event_new_move(InputEventKind kind,
  415. InputAxis axis, int value)
  416. {
  417. InputEvent *evt = g_new0(InputEvent, 1);
  418. InputMoveEvent *move = g_new0(InputMoveEvent, 1);
  419. evt->type = kind;
  420. evt->u.rel.data = move; /* evt->u.rel is the same as evt->u.abs */
  421. move->axis = axis;
  422. move->value = value;
  423. return evt;
  424. }
  425. void qemu_input_queue_rel(QemuConsole *src, InputAxis axis, int value)
  426. {
  427. InputEvent *evt;
  428. evt = qemu_input_event_new_move(INPUT_EVENT_KIND_REL, axis, value);
  429. qemu_input_event_send(src, evt);
  430. qapi_free_InputEvent(evt);
  431. }
  432. void qemu_input_queue_abs(QemuConsole *src, InputAxis axis, int value, int size)
  433. {
  434. InputEvent *evt;
  435. int scaled = qemu_input_scale_axis(value, size, INPUT_EVENT_ABS_SIZE);
  436. evt = qemu_input_event_new_move(INPUT_EVENT_KIND_ABS, axis, scaled);
  437. qemu_input_event_send(src, evt);
  438. qapi_free_InputEvent(evt);
  439. }
  440. void qemu_input_check_mode_change(void)
  441. {
  442. static int current_is_absolute;
  443. int is_absolute;
  444. is_absolute = qemu_input_is_absolute();
  445. if (is_absolute != current_is_absolute) {
  446. trace_input_mouse_mode(is_absolute);
  447. notifier_list_notify(&mouse_mode_notifiers, NULL);
  448. }
  449. current_is_absolute = is_absolute;
  450. }
  451. void qemu_add_mouse_mode_change_notifier(Notifier *notify)
  452. {
  453. notifier_list_add(&mouse_mode_notifiers, notify);
  454. }
  455. void qemu_remove_mouse_mode_change_notifier(Notifier *notify)
  456. {
  457. notifier_remove(notify);
  458. }
  459. MouseInfoList *qmp_query_mice(Error **errp)
  460. {
  461. MouseInfoList *mice_list = NULL;
  462. MouseInfoList *info;
  463. QemuInputHandlerState *s;
  464. bool current = true;
  465. QTAILQ_FOREACH(s, &handlers, node) {
  466. if (!(s->handler->mask &
  467. (INPUT_EVENT_MASK_REL | INPUT_EVENT_MASK_ABS))) {
  468. continue;
  469. }
  470. info = g_new0(MouseInfoList, 1);
  471. info->value = g_new0(MouseInfo, 1);
  472. info->value->index = s->id;
  473. info->value->name = g_strdup(s->handler->name);
  474. info->value->absolute = s->handler->mask & INPUT_EVENT_MASK_ABS;
  475. info->value->current = current;
  476. current = false;
  477. info->next = mice_list;
  478. mice_list = info;
  479. }
  480. return mice_list;
  481. }
  482. void hmp_mouse_set(Monitor *mon, const QDict *qdict)
  483. {
  484. QemuInputHandlerState *s;
  485. int index = qdict_get_int(qdict, "index");
  486. int found = 0;
  487. QTAILQ_FOREACH(s, &handlers, node) {
  488. if (s->id != index) {
  489. continue;
  490. }
  491. if (!(s->handler->mask & (INPUT_EVENT_MASK_REL |
  492. INPUT_EVENT_MASK_ABS))) {
  493. error_report("Input device '%s' is not a mouse", s->handler->name);
  494. return;
  495. }
  496. found = 1;
  497. qemu_input_handler_activate(s);
  498. break;
  499. }
  500. if (!found) {
  501. error_report("Mouse at index '%d' not found", index);
  502. }
  503. qemu_input_check_mode_change();
  504. }