input.c 17 KB

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