xref: /qemu/replay/replay-input.c (revision 60f782b6b78211c125970768be726c9f380dbd61)
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  
12  #include "qemu/osdep.h"
13  #include "sysemu/replay.h"
14  #include "replay-internal.h"
15  #include "qemu/notify.h"
16  #include "ui/input.h"
17  #include "qapi/clone-visitor.h"
18  #include "qapi/qapi-visit-ui.h"
19  
20  void replay_save_input_event(InputEvent *evt)
21  {
22      InputKeyEvent *key;
23      InputBtnEvent *btn;
24      InputMoveEvent *move;
25      InputMultiTouchEvent *mtt;
26      replay_put_dword(evt->type);
27  
28      switch (evt->type) {
29      case INPUT_EVENT_KIND_KEY:
30          key = evt->u.key.data;
31          replay_put_dword(key->key->type);
32  
33          switch (key->key->type) {
34          case KEY_VALUE_KIND_NUMBER:
35              replay_put_qword(key->key->u.number.data);
36              replay_put_byte(key->down);
37              break;
38          case KEY_VALUE_KIND_QCODE:
39              replay_put_dword(key->key->u.qcode.data);
40              replay_put_byte(key->down);
41              break;
42          case KEY_VALUE_KIND__MAX:
43              /* keep gcc happy */
44              break;
45          }
46          break;
47      case INPUT_EVENT_KIND_BTN:
48          btn = evt->u.btn.data;
49          replay_put_dword(btn->button);
50          replay_put_byte(btn->down);
51          break;
52      case INPUT_EVENT_KIND_REL:
53          move = evt->u.rel.data;
54          replay_put_dword(move->axis);
55          replay_put_qword(move->value);
56          break;
57      case INPUT_EVENT_KIND_ABS:
58          move = evt->u.abs.data;
59          replay_put_dword(move->axis);
60          replay_put_qword(move->value);
61          break;
62      case INPUT_EVENT_KIND_MTT:
63          mtt = evt->u.mtt.data;
64          replay_put_dword(mtt->type);
65          replay_put_qword(mtt->slot);
66          replay_put_qword(mtt->tracking_id);
67          replay_put_dword(mtt->axis);
68          replay_put_qword(mtt->value);
69          break;
70      case INPUT_EVENT_KIND__MAX:
71          /* keep gcc happy */
72          break;
73      }
74  }
75  
76  InputEvent *replay_read_input_event(void)
77  {
78      InputEvent evt;
79      KeyValue keyValue;
80      InputKeyEvent key;
81      key.key = &keyValue;
82      InputBtnEvent btn;
83      InputMoveEvent rel;
84      InputMoveEvent abs;
85      InputMultiTouchEvent mtt;
86  
87      evt.type = replay_get_dword();
88      switch (evt.type) {
89      case INPUT_EVENT_KIND_KEY:
90          evt.u.key.data = &key;
91          evt.u.key.data->key->type = replay_get_dword();
92  
93          switch (evt.u.key.data->key->type) {
94          case KEY_VALUE_KIND_NUMBER:
95              evt.u.key.data->key->u.number.data = replay_get_qword();
96              evt.u.key.data->down = replay_get_byte();
97              break;
98          case KEY_VALUE_KIND_QCODE:
99              evt.u.key.data->key->u.qcode.data = (QKeyCode)replay_get_dword();
100              evt.u.key.data->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.data = &btn;
109          evt.u.btn.data->button = (InputButton)replay_get_dword();
110          evt.u.btn.data->down = replay_get_byte();
111          break;
112      case INPUT_EVENT_KIND_REL:
113          evt.u.rel.data = &rel;
114          evt.u.rel.data->axis = (InputAxis)replay_get_dword();
115          evt.u.rel.data->value = replay_get_qword();
116          break;
117      case INPUT_EVENT_KIND_ABS:
118          evt.u.abs.data = &abs;
119          evt.u.abs.data->axis = (InputAxis)replay_get_dword();
120          evt.u.abs.data->value = replay_get_qword();
121          break;
122      case INPUT_EVENT_KIND_MTT:
123          evt.u.mtt.data = &mtt;
124          evt.u.mtt.data->type = (InputMultiTouchType)replay_get_dword();
125          evt.u.mtt.data->slot = replay_get_qword();
126          evt.u.mtt.data->tracking_id = replay_get_qword();
127          evt.u.mtt.data->axis = (InputAxis)replay_get_dword();
128          evt.u.mtt.data->value = replay_get_qword();
129          break;
130      case INPUT_EVENT_KIND__MAX:
131          /* keep gcc happy */
132          break;
133      }
134  
135      return QAPI_CLONE(InputEvent, &evt);
136  }
137  
138  void replay_input_event(QemuConsole *src, InputEvent *evt)
139  {
140      if (replay_mode == REPLAY_MODE_PLAY) {
141          /* Nothing */
142      } else if (replay_mode == REPLAY_MODE_RECORD) {
143          replay_add_input_event(QAPI_CLONE(InputEvent, evt));
144      } else {
145          qemu_input_event_send_impl(src, evt);
146      }
147  }
148  
149  void replay_input_sync_event(void)
150  {
151      if (replay_mode == REPLAY_MODE_PLAY) {
152          /* Nothing */
153      } else if (replay_mode == REPLAY_MODE_RECORD) {
154          replay_add_input_sync_event();
155      } else {
156          qemu_input_event_sync_impl();
157      }
158  }
159