MULTI_DEBUG_CHANNEL(qemu, virtio-kbd);
+VirtIOKeyboard *vkbd;
VirtQueueElement elem;
static void virtio_keyboard_handle(VirtIODevice *vdev, VirtQueue *vq)
while ((written_cnt--)) {
kbdevt = &vkbd->kbdqueue.kbdevent[vkbd->kbdqueue.rptr];
- if (((EmulKbdEvent*)(elem.in_sg[vkbd->kbdqueue.rptr].iov_base))->code != 0) {
- TRACE("FIXME: virtio queue is full.\n");
- }
+ if (((EmulKbdEvent*)(elem.in_sg[vkbd->kbdqueue.rptr].iov_base))->code != 0) {
+ TRACE("FIXME: virtio queue is full.\n");
+ }
/* Copy keyboard data into guest side. */
TRACE("copy: keycode %d, type %d, elem_index %d\n",
if (vkbd->kbdqueue.wptr > 0) {
vkbd->kbdqueue.wptr--;
- TRACE("written_cnt: %d, wptr: %d, qemu_index: %d\n", written_cnt, vkbd->kbdqueue.wptr, vkbd->kbdqueue.rptr);
+ TRACE("written_cnt: %d, wptr: %d, qemu_index: %d\n",
+ written_cnt, vkbd->kbdqueue.wptr, vkbd->kbdqueue.rptr);
}
vkbd->kbdqueue.rptr++;
TRACE("[Leave] virtqueue notifier.\n");
}
-static void virtio_keyboard_event(void *opaque, int keycode)
+void virtio_keyboard_event(int keycode)
{
EmulKbdEvent kbdevt = {0};
int *index = NULL;
- VirtIOKeyboard *vkbd = (VirtIOKeyboard *)opaque;
if (!vkbd) {
ERR("VirtIOKeyboard is NULL.\n");
static int virtio_keyboard_device_init(VirtIODevice *vdev)
{
- VirtIOKeyboard *vkbd;
DeviceState *qdev = DEVICE(vdev);
vkbd = VIRTIO_KEYBOARD(vdev);
/* bottom half */
vkbd->bh = qemu_bh_new(virtio_keyboard_bh, vkbd);
- /* register keyboard handler */
- vkbd->eh_entry = qemu_add_kbd_event_handler(virtio_keyboard_event, vkbd);
-
return 0;
}
INFO("destroy device\n");
- qemu_remove_kbd_event_handler(vkbd->eh_entry);
-
if (vkbd->bh) {
qemu_bh_delete(vkbd->bh);
}
static void virtio_keyboard_device_reset(VirtIODevice *vdev)
{
- VirtIOKeyboard *vkbd;
vkbd = VIRTIO_KEYBOARD(vdev);
INFO("reset keyboard device\n");
#endif
#include "qemu/thread.h"
-#include "ui/console.h"
#include "hw/virtio/virtio.h"
#define TYPE_VIRTIO_KEYBOARD "virtio-keyboard-device"
VirtIOKbdQueue kbdqueue;
QemuMutex event_mutex;
QEMUBH *bh;
- QEMUPutKbdEntry *eh_entry;
} VirtIOKeyboard;
VirtIODevice *virtio_keyboard_init(DeviceState *dev);
-
void virtio_keyboard_exit(VirtIODevice *vdev);
+void virtio_keyboard_event(int keycode);
void virtio_keyboard_notify(void *opaque);
#ifdef __cplusplus
#include "maruskin_keymap.h"
#include "emul_state.h"
-#include "ui/console.h"
#include "debug_ch.h"
MULTI_DEBUG_CHANNEL(qemu, skin_keymap);
num_lock = get_host_lock_key_state(HOST_NUMLOCK_KEY);
if (caps_lock != -1 && get_emul_caps_lock_state() != caps_lock) {
- kbd_put_keycode(58);
- kbd_put_keycode(58 | 0x80);
+ virtio_keyboard_event(58);
+ virtio_keyboard_event(58 | 0x80);
set_emul_caps_lock_state(get_emul_caps_lock_state() ^ 1);
INFO("qemu CapsLock state was synchronized with host key value (%d)\n",
get_emul_caps_lock_state());
}
if (num_lock != -1 && get_emul_num_lock_state() != num_lock) {
- kbd_put_keycode(69);
- kbd_put_keycode(69 | 0x80);
+ virtio_keyboard_event(69);
+ virtio_keyboard_event(69 | 0x80);
set_emul_num_lock_state(get_emul_num_lock_state() ^ 1);
INFO("qemu NumLock state was synchronized with host key value (%d)\n",
get_emul_num_lock_state());
if (java_keycode == JAVA_KEYCODE_BIT_CTRL) { /* ctrl key */
if (key_location == JAVA_KEYLOCATION_RIGHT) {
- kbd_put_keycode(224); //0xE0
+ virtio_keyboard_event(224); //0xE0
}
return 29;
} else if (java_keycode == JAVA_KEYCODE_BIT_SHIFT) { /* shift key */
return 42;
} else if (java_keycode == JAVA_KEYCODE_BIT_ALT) { /* alt key */
if (key_location == JAVA_KEYLOCATION_RIGHT) {
- kbd_put_keycode(224);
+ virtio_keyboard_event(224);
}
return 56;
} else {
switch(vk) {
case JAVA_KEY_ARROW_UP :
if (key_location != JAVA_KEYLOCATION_KEYPAD) {
- kbd_put_keycode(224);
+ virtio_keyboard_event(224);
}
vk = KEY_UP;
break;
case JAVA_KEY_ARROW_DOWN :
if (key_location != JAVA_KEYLOCATION_KEYPAD) {
- kbd_put_keycode(224);
+ virtio_keyboard_event(224);
}
vk = KEY_DOWN;
break;
case JAVA_KEY_ARROW_LEFT :
if (key_location != JAVA_KEYLOCATION_KEYPAD) {
- kbd_put_keycode(224);
+ virtio_keyboard_event(224);
}
vk = KEY_LEFT;
break;
case JAVA_KEY_ARROW_RIGHT :
if (key_location != JAVA_KEYLOCATION_KEYPAD) {
- kbd_put_keycode(224);
+ virtio_keyboard_event(224);
}
vk = KEY_RIGHT;
break;
case JAVA_KEY_PAGE_UP :
if (key_location != JAVA_KEYLOCATION_KEYPAD) {
- kbd_put_keycode(224);
+ virtio_keyboard_event(224);
}
return 73;
case JAVA_KEY_PAGE_DOWN :
if (key_location != JAVA_KEYLOCATION_KEYPAD) {
- kbd_put_keycode(224);
+ virtio_keyboard_event(224);
}
return 81;
case JAVA_KEY_HOME :
if (key_location != JAVA_KEYLOCATION_KEYPAD) {
- kbd_put_keycode(224);
+ virtio_keyboard_event(224);
}
return 71;
case JAVA_KEY_END :
if (key_location != JAVA_KEYLOCATION_KEYPAD) {
- kbd_put_keycode(224);
+ virtio_keyboard_event(224);
}
return 79;
case JAVA_KEY_INSERT :
if (key_location != JAVA_KEYLOCATION_KEYPAD) {
- kbd_put_keycode(224);
+ virtio_keyboard_event(224);
}
return 82;
case JAVA_KEY_KEYPAD_9 :
return 73;
case JAVA_KEY_KEYPAD_CR : /* KP_ENTER */
- kbd_put_keycode(224);
+ virtio_keyboard_event(224);
return 28;
case JAVA_KEY_SCROLL_LOCK :
return 70;
switch(vk) {
case JAVA_KEY_DELETE :
if (key_location != JAVA_KEYLOCATION_KEYPAD) {
- kbd_put_keycode(224);
+ virtio_keyboard_event(224);
}
break;
default :
#ifndef MARUSKIN_KEYMAP_H_
#define MARUSKIN_KEYMAP_H_
+#include "hw/maru_virtio_keyboard.h"
/* keep it consistent with emulator-skin(swt) virtual keycode */
#define JAVA_KEYCODE_BIT (1 << 24)
if (KEY_PRESSED == event_type) {
TRACE("key pressed: %d\n", scancode);
- kbd_put_keycode(scancode);
+ virtio_keyboard_event(scancode);
} else if (KEY_RELEASED == event_type) {
TRACE("key released: %d\n", scancode);
- kbd_put_keycode(scancode | 0x80);
+ virtio_keyboard_event(scancode | 0x80);
}
}