xref: /openbmc/qemu/replay/replay-input.c (revision 57b93c0f8ea3901661990de74aef15b44aea5556)
1ee312992SPavel Dovgalyuk /*
2ee312992SPavel Dovgalyuk  * replay-input.c
3ee312992SPavel Dovgalyuk  *
4ee312992SPavel Dovgalyuk  * Copyright (c) 2010-2015 Institute for System Programming
5ee312992SPavel Dovgalyuk  *                         of the Russian Academy of Sciences.
6ee312992SPavel Dovgalyuk  *
7ee312992SPavel Dovgalyuk  * This work is licensed under the terms of the GNU GPL, version 2 or later.
8ee312992SPavel Dovgalyuk  * See the COPYING file in the top-level directory.
9ee312992SPavel Dovgalyuk  *
10ee312992SPavel Dovgalyuk  */
11ee312992SPavel Dovgalyuk 
12d38ea87aSPeter Maydell #include "qemu/osdep.h"
13ee312992SPavel Dovgalyuk #include "sysemu/replay.h"
14ee312992SPavel Dovgalyuk #include "replay-internal.h"
15ee312992SPavel Dovgalyuk #include "qemu/notify.h"
16ee312992SPavel Dovgalyuk #include "ui/input.h"
17b6954712SEric Blake #include "qapi/clone-visitor.h"
189af23989SMarkus Armbruster #include "qapi/qapi-visit-ui.h"
19ee312992SPavel Dovgalyuk 
replay_save_input_event(InputEvent * evt)20ee312992SPavel Dovgalyuk void replay_save_input_event(InputEvent *evt)
21ee312992SPavel Dovgalyuk {
22b5a1b443SEric Blake     InputKeyEvent *key;
23b5a1b443SEric Blake     InputBtnEvent *btn;
24b5a1b443SEric Blake     InputMoveEvent *move;
25*2bfb10dfSSergio Lopez     InputMultiTouchEvent *mtt;
26ee312992SPavel Dovgalyuk     replay_put_dword(evt->type);
27ee312992SPavel Dovgalyuk 
28ee312992SPavel Dovgalyuk     switch (evt->type) {
29ee312992SPavel Dovgalyuk     case INPUT_EVENT_KIND_KEY:
3032bafa8fSEric Blake         key = evt->u.key.data;
31b5a1b443SEric Blake         replay_put_dword(key->key->type);
32ee312992SPavel Dovgalyuk 
33b5a1b443SEric Blake         switch (key->key->type) {
34ee312992SPavel Dovgalyuk         case KEY_VALUE_KIND_NUMBER:
3532bafa8fSEric Blake             replay_put_qword(key->key->u.number.data);
36b5a1b443SEric Blake             replay_put_byte(key->down);
37ee312992SPavel Dovgalyuk             break;
38ee312992SPavel Dovgalyuk         case KEY_VALUE_KIND_QCODE:
3932bafa8fSEric Blake             replay_put_dword(key->key->u.qcode.data);
40b5a1b443SEric Blake             replay_put_byte(key->down);
41ee312992SPavel Dovgalyuk             break;
427fb1cf16SEric Blake         case KEY_VALUE_KIND__MAX:
43ee312992SPavel Dovgalyuk             /* keep gcc happy */
44ee312992SPavel Dovgalyuk             break;
45ee312992SPavel Dovgalyuk         }
46ee312992SPavel Dovgalyuk         break;
47ee312992SPavel Dovgalyuk     case INPUT_EVENT_KIND_BTN:
4832bafa8fSEric Blake         btn = evt->u.btn.data;
49b5a1b443SEric Blake         replay_put_dword(btn->button);
50b5a1b443SEric Blake         replay_put_byte(btn->down);
51ee312992SPavel Dovgalyuk         break;
52ee312992SPavel Dovgalyuk     case INPUT_EVENT_KIND_REL:
5332bafa8fSEric Blake         move = evt->u.rel.data;
54b5a1b443SEric Blake         replay_put_dword(move->axis);
55b5a1b443SEric Blake         replay_put_qword(move->value);
56ee312992SPavel Dovgalyuk         break;
57ee312992SPavel Dovgalyuk     case INPUT_EVENT_KIND_ABS:
5832bafa8fSEric Blake         move = evt->u.abs.data;
59b5a1b443SEric Blake         replay_put_dword(move->axis);
60b5a1b443SEric Blake         replay_put_qword(move->value);
61ee312992SPavel Dovgalyuk         break;
62*2bfb10dfSSergio Lopez     case INPUT_EVENT_KIND_MTT:
63*2bfb10dfSSergio Lopez         mtt = evt->u.mtt.data;
64*2bfb10dfSSergio Lopez         replay_put_dword(mtt->type);
65*2bfb10dfSSergio Lopez         replay_put_qword(mtt->slot);
66*2bfb10dfSSergio Lopez         replay_put_qword(mtt->tracking_id);
67*2bfb10dfSSergio Lopez         replay_put_dword(mtt->axis);
68*2bfb10dfSSergio Lopez         replay_put_qword(mtt->value);
69*2bfb10dfSSergio Lopez         break;
707fb1cf16SEric Blake     case INPUT_EVENT_KIND__MAX:
71ee312992SPavel Dovgalyuk         /* keep gcc happy */
72ee312992SPavel Dovgalyuk         break;
73ee312992SPavel Dovgalyuk     }
74ee312992SPavel Dovgalyuk }
75ee312992SPavel Dovgalyuk 
replay_read_input_event(void)76ee312992SPavel Dovgalyuk InputEvent *replay_read_input_event(void)
77ee312992SPavel Dovgalyuk {
78ee312992SPavel Dovgalyuk     InputEvent evt;
79ee312992SPavel Dovgalyuk     KeyValue keyValue;
80ee312992SPavel Dovgalyuk     InputKeyEvent key;
81ee312992SPavel Dovgalyuk     key.key = &keyValue;
82ee312992SPavel Dovgalyuk     InputBtnEvent btn;
83ee312992SPavel Dovgalyuk     InputMoveEvent rel;
84ee312992SPavel Dovgalyuk     InputMoveEvent abs;
85*2bfb10dfSSergio Lopez     InputMultiTouchEvent mtt;
86ee312992SPavel Dovgalyuk 
87ee312992SPavel Dovgalyuk     evt.type = replay_get_dword();
88ee312992SPavel Dovgalyuk     switch (evt.type) {
89ee312992SPavel Dovgalyuk     case INPUT_EVENT_KIND_KEY:
9032bafa8fSEric Blake         evt.u.key.data = &key;
9132bafa8fSEric Blake         evt.u.key.data->key->type = replay_get_dword();
92ee312992SPavel Dovgalyuk 
9332bafa8fSEric Blake         switch (evt.u.key.data->key->type) {
94ee312992SPavel Dovgalyuk         case KEY_VALUE_KIND_NUMBER:
9532bafa8fSEric Blake             evt.u.key.data->key->u.number.data = replay_get_qword();
9632bafa8fSEric Blake             evt.u.key.data->down = replay_get_byte();
97ee312992SPavel Dovgalyuk             break;
98ee312992SPavel Dovgalyuk         case KEY_VALUE_KIND_QCODE:
9932bafa8fSEric Blake             evt.u.key.data->key->u.qcode.data = (QKeyCode)replay_get_dword();
10032bafa8fSEric Blake             evt.u.key.data->down = replay_get_byte();
101ee312992SPavel Dovgalyuk             break;
1027fb1cf16SEric Blake         case KEY_VALUE_KIND__MAX:
103ee312992SPavel Dovgalyuk             /* keep gcc happy */
104ee312992SPavel Dovgalyuk             break;
105ee312992SPavel Dovgalyuk         }
106ee312992SPavel Dovgalyuk         break;
107ee312992SPavel Dovgalyuk     case INPUT_EVENT_KIND_BTN:
10832bafa8fSEric Blake         evt.u.btn.data = &btn;
10932bafa8fSEric Blake         evt.u.btn.data->button = (InputButton)replay_get_dword();
11032bafa8fSEric Blake         evt.u.btn.data->down = replay_get_byte();
111ee312992SPavel Dovgalyuk         break;
112ee312992SPavel Dovgalyuk     case INPUT_EVENT_KIND_REL:
11332bafa8fSEric Blake         evt.u.rel.data = &rel;
11432bafa8fSEric Blake         evt.u.rel.data->axis = (InputAxis)replay_get_dword();
11532bafa8fSEric Blake         evt.u.rel.data->value = replay_get_qword();
116ee312992SPavel Dovgalyuk         break;
117ee312992SPavel Dovgalyuk     case INPUT_EVENT_KIND_ABS:
11832bafa8fSEric Blake         evt.u.abs.data = &abs;
11932bafa8fSEric Blake         evt.u.abs.data->axis = (InputAxis)replay_get_dword();
12032bafa8fSEric Blake         evt.u.abs.data->value = replay_get_qword();
121ee312992SPavel Dovgalyuk         break;
122*2bfb10dfSSergio Lopez     case INPUT_EVENT_KIND_MTT:
123*2bfb10dfSSergio Lopez         evt.u.mtt.data = &mtt;
124*2bfb10dfSSergio Lopez         evt.u.mtt.data->type = (InputMultiTouchType)replay_get_dword();
125*2bfb10dfSSergio Lopez         evt.u.mtt.data->slot = replay_get_qword();
126*2bfb10dfSSergio Lopez         evt.u.mtt.data->tracking_id = replay_get_qword();
127*2bfb10dfSSergio Lopez         evt.u.mtt.data->axis = (InputAxis)replay_get_dword();
128*2bfb10dfSSergio Lopez         evt.u.mtt.data->value = replay_get_qword();
129*2bfb10dfSSergio Lopez         break;
1307fb1cf16SEric Blake     case INPUT_EVENT_KIND__MAX:
131ee312992SPavel Dovgalyuk         /* keep gcc happy */
132ee312992SPavel Dovgalyuk         break;
133ee312992SPavel Dovgalyuk     }
134ee312992SPavel Dovgalyuk 
135b6954712SEric Blake     return QAPI_CLONE(InputEvent, &evt);
136ee312992SPavel Dovgalyuk }
137ee312992SPavel Dovgalyuk 
replay_input_event(QemuConsole * src,InputEvent * evt)138ee312992SPavel Dovgalyuk void replay_input_event(QemuConsole *src, InputEvent *evt)
139ee312992SPavel Dovgalyuk {
140ee312992SPavel Dovgalyuk     if (replay_mode == REPLAY_MODE_PLAY) {
141ee312992SPavel Dovgalyuk         /* Nothing */
142ee312992SPavel Dovgalyuk     } else if (replay_mode == REPLAY_MODE_RECORD) {
143b6954712SEric Blake         replay_add_input_event(QAPI_CLONE(InputEvent, evt));
144ee312992SPavel Dovgalyuk     } else {
145ee312992SPavel Dovgalyuk         qemu_input_event_send_impl(src, evt);
146ee312992SPavel Dovgalyuk     }
147ee312992SPavel Dovgalyuk }
148ee312992SPavel Dovgalyuk 
replay_input_sync_event(void)149ee312992SPavel Dovgalyuk void replay_input_sync_event(void)
150ee312992SPavel Dovgalyuk {
151ee312992SPavel Dovgalyuk     if (replay_mode == REPLAY_MODE_PLAY) {
152ee312992SPavel Dovgalyuk         /* Nothing */
153ee312992SPavel Dovgalyuk     } else if (replay_mode == REPLAY_MODE_RECORD) {
154ee312992SPavel Dovgalyuk         replay_add_input_sync_event();
155ee312992SPavel Dovgalyuk     } else {
156ee312992SPavel Dovgalyuk         qemu_input_event_sync_impl();
157ee312992SPavel Dovgalyuk     }
158ee312992SPavel Dovgalyuk }
159