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 Dovgalyukvoid 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 DovgalyukInputEvent *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 Dovgalyukvoid 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 Dovgalyukvoid 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