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 ps2_keyboard_event(DeviceState *dev, QemuConsole *src, InputEvent *evt) { PS2KbdState *s = (PS2KbdState *)dev; InputKeyEvent *key = evt->u.key.data; int qcode; uint16_t keycode; qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER); assert(evt->type == INPUT_EVENT_KIND_KEY); qcode = qemu_input_key_value_to_qcode(key->key); if (s->scancode_set == 1) { if (qcode == Q_KEY_CODE_PAUSE) { if (key->down) { ps2_put_keycode(s, 0xe1); ps2_put_keycode(s, 0x1d); ps2_put_keycode(s, 0x45); ps2_put_keycode(s, 0x91); ps2_put_keycode(s, 0x9d); ps2_put_keycode(s, 0xc5); } } else if (qcode == Q_KEY_CODE_PRINT) { if (key->down) { ps2_put_keycode(s, 0xe0); ps2_put_keycode(s, 0x2a); ps2_put_keycode(s, 0xe0); ps2_put_keycode(s, 0x37); } else { ps2_put_keycode(s, 0xe0); ps2_put_keycode(s, 0xb7); ps2_put_keycode(s, 0xe0); ps2_put_keycode(s, 0xaa); } } else { keycode = qcode_to_keycode_set1[qcode]; if (keycode) { if (keycode & 0xff00) { ps2_put_keycode(s, keycode >> 8); } if (!key->down) { keycode |= 0x80; } ps2_put_keycode(s, keycode & 0xff); } else { qemu_log_mask(LOG_UNIMP, "ps2: ignoring key with qcode %d\n", qcode); } }
/* * Send a key event from the client to the guest OS * QEMU gives us a QCode. * We have to turn this into a Linux Input layer keycode. * * Wish we could just send scancodes straight to the guest which * already has code for dealing with this... */ static void xenfb_key_event(DeviceState *dev, QemuConsole *src, InputEvent *evt) { struct XenInput *xenfb = (struct XenInput *)dev; InputKeyEvent *key = evt->u.key.data; int qcode = qemu_input_key_value_to_qcode(key->key); int lnx; if (qcode < qemu_input_map_qcode_to_linux_len) { lnx = qemu_input_map_qcode_to_linux[qcode]; if (lnx) { trace_xenfb_key_event(xenfb, lnx, key->down); xenfb_send_key(xenfb, key->down, lnx); } } }