replay-input.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. /*
  2. * replay-input.c
  3. *
  4. * Copyright (c) 2010-2015 Institute for System Programming
  5. * of the Russian Academy of Sciences.
  6. *
  7. * This work is licensed under the terms of the GNU GPL, version 2 or later.
  8. * See the COPYING file in the top-level directory.
  9. *
  10. */
  11. #include "qemu/osdep.h"
  12. #include "qemu-common.h"
  13. #include "sysemu/replay.h"
  14. #include "replay-internal.h"
  15. #include "qemu/notify.h"
  16. #include "ui/input.h"
  17. #include "qapi/qmp-output-visitor.h"
  18. #include "qapi/qmp-input-visitor.h"
  19. #include "qapi-visit.h"
  20. static InputEvent *qapi_clone_InputEvent(InputEvent *src)
  21. {
  22. QmpOutputVisitor *qov;
  23. QmpInputVisitor *qiv;
  24. Visitor *ov, *iv;
  25. QObject *obj;
  26. InputEvent *dst = NULL;
  27. qov = qmp_output_visitor_new();
  28. ov = qmp_output_get_visitor(qov);
  29. visit_type_InputEvent(ov, &src, NULL, &error_abort);
  30. obj = qmp_output_get_qobject(qov);
  31. qmp_output_visitor_cleanup(qov);
  32. if (!obj) {
  33. return NULL;
  34. }
  35. qiv = qmp_input_visitor_new(obj);
  36. iv = qmp_input_get_visitor(qiv);
  37. visit_type_InputEvent(iv, &dst, NULL, &error_abort);
  38. qmp_input_visitor_cleanup(qiv);
  39. qobject_decref(obj);
  40. return dst;
  41. }
  42. void replay_save_input_event(InputEvent *evt)
  43. {
  44. replay_put_dword(evt->type);
  45. switch (evt->type) {
  46. case INPUT_EVENT_KIND_KEY:
  47. replay_put_dword(evt->u.key->key->type);
  48. switch (evt->u.key->key->type) {
  49. case KEY_VALUE_KIND_NUMBER:
  50. replay_put_qword(evt->u.key->key->u.number);
  51. replay_put_byte(evt->u.key->down);
  52. break;
  53. case KEY_VALUE_KIND_QCODE:
  54. replay_put_dword(evt->u.key->key->u.qcode);
  55. replay_put_byte(evt->u.key->down);
  56. break;
  57. case KEY_VALUE_KIND__MAX:
  58. /* keep gcc happy */
  59. break;
  60. }
  61. break;
  62. case INPUT_EVENT_KIND_BTN:
  63. replay_put_dword(evt->u.btn->button);
  64. replay_put_byte(evt->u.btn->down);
  65. break;
  66. case INPUT_EVENT_KIND_REL:
  67. replay_put_dword(evt->u.rel->axis);
  68. replay_put_qword(evt->u.rel->value);
  69. break;
  70. case INPUT_EVENT_KIND_ABS:
  71. replay_put_dword(evt->u.abs->axis);
  72. replay_put_qword(evt->u.abs->value);
  73. break;
  74. case INPUT_EVENT_KIND__MAX:
  75. /* keep gcc happy */
  76. break;
  77. }
  78. }
  79. InputEvent *replay_read_input_event(void)
  80. {
  81. InputEvent evt;
  82. KeyValue keyValue;
  83. InputKeyEvent key;
  84. key.key = &keyValue;
  85. InputBtnEvent btn;
  86. InputMoveEvent rel;
  87. InputMoveEvent abs;
  88. evt.type = replay_get_dword();
  89. switch (evt.type) {
  90. case INPUT_EVENT_KIND_KEY:
  91. evt.u.key = &key;
  92. evt.u.key->key->type = replay_get_dword();
  93. switch (evt.u.key->key->type) {
  94. case KEY_VALUE_KIND_NUMBER:
  95. evt.u.key->key->u.number = replay_get_qword();
  96. evt.u.key->down = replay_get_byte();
  97. break;
  98. case KEY_VALUE_KIND_QCODE:
  99. evt.u.key->key->u.qcode = (QKeyCode)replay_get_dword();
  100. evt.u.key->down = replay_get_byte();
  101. break;
  102. case KEY_VALUE_KIND__MAX:
  103. /* keep gcc happy */
  104. break;
  105. }
  106. break;
  107. case INPUT_EVENT_KIND_BTN:
  108. evt.u.btn = &btn;
  109. evt.u.btn->button = (InputButton)replay_get_dword();
  110. evt.u.btn->down = replay_get_byte();
  111. break;
  112. case INPUT_EVENT_KIND_REL:
  113. evt.u.rel = &rel;
  114. evt.u.rel->axis = (InputAxis)replay_get_dword();
  115. evt.u.rel->value = replay_get_qword();
  116. break;
  117. case INPUT_EVENT_KIND_ABS:
  118. evt.u.abs = &abs;
  119. evt.u.abs->axis = (InputAxis)replay_get_dword();
  120. evt.u.abs->value = replay_get_qword();
  121. break;
  122. case INPUT_EVENT_KIND__MAX:
  123. /* keep gcc happy */
  124. break;
  125. }
  126. return qapi_clone_InputEvent(&evt);
  127. }
  128. void replay_input_event(QemuConsole *src, InputEvent *evt)
  129. {
  130. if (replay_mode == REPLAY_MODE_PLAY) {
  131. /* Nothing */
  132. } else if (replay_mode == REPLAY_MODE_RECORD) {
  133. replay_add_input_event(qapi_clone_InputEvent(evt));
  134. } else {
  135. qemu_input_event_send_impl(src, evt);
  136. }
  137. }
  138. void replay_input_sync_event(void)
  139. {
  140. if (replay_mode == REPLAY_MODE_PLAY) {
  141. /* Nothing */
  142. } else if (replay_mode == REPLAY_MODE_RECORD) {
  143. replay_add_input_sync_event();
  144. } else {
  145. qemu_input_event_sync_impl();
  146. }
  147. }