static void virtio_input_handle_event(DeviceState *dev, QemuConsole *src, InputEvent *evt) { VirtIOInput *vinput = VIRTIO_INPUT(dev); virtio_input_event event; int qcode; InputKeyEvent *key; InputMoveEvent *move; InputBtnEvent *btn; switch (evt->type) { case INPUT_EVENT_KIND_KEY: key = evt->u.key; qcode = qemu_input_key_value_to_qcode(key->key); if (qcode && keymap_qcode[qcode]) { event.type = cpu_to_le16(EV_KEY); event.code = cpu_to_le16(keymap_qcode[qcode]); event.value = cpu_to_le32(key->down ? 1 : 0); virtio_input_send(vinput, &event); } else { if (key->down) { fprintf(stderr, "%s: unmapped key: %d [%s]\n", __func__, qcode, QKeyCode_lookup[qcode]); } } break; case INPUT_EVENT_KIND_BTN: btn = evt->u.btn; if (keymap_button[btn->button]) { event.type = cpu_to_le16(EV_KEY); event.code = cpu_to_le16(keymap_button[btn->button]); event.value = cpu_to_le32(btn->down ? 1 : 0); virtio_input_send(vinput, &event); } else { if (btn->down) { fprintf(stderr, "%s: unmapped button: %d [%s]\n", __func__, btn->button, InputButton_lookup[btn->button]); } } break; case INPUT_EVENT_KIND_REL: move = evt->u.rel; event.type = cpu_to_le16(EV_REL); event.code = cpu_to_le16(axismap_rel[move->axis]); event.value = cpu_to_le32(move->value); virtio_input_send(vinput, &event); break; case INPUT_EVENT_KIND_ABS: move = evt->u.abs; event.type = cpu_to_le16(EV_ABS); event.code = cpu_to_le16(axismap_abs[move->axis]); event.value = cpu_to_le32(move->value); virtio_input_send(vinput, &event); break; default: /* keep gcc happy */ break; } }
static void virtio_input_handle_sync(DeviceState *dev) { VirtIOInput *vinput = VIRTIO_INPUT(dev); virtio_input_event event = { .type = cpu_to_le16(EV_SYN), .code = cpu_to_le16(SYN_REPORT), .value = 0, }; virtio_input_send(vinput, &event); } static void virtio_input_hid_realize(DeviceState *dev, Error **errp) { VirtIOInputHID *vhid = VIRTIO_INPUT_HID(dev); vhid->hs = qemu_input_handler_register(dev, vhid->handler); if (vhid->display && vhid->hs) { qemu_input_handler_bind(vhid->hs, vhid->display, vhid->head, NULL); } }