input.c 15 KB

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