diff --git a/vnc.c b/vnc.c index 2006280ff2..de0ff872d4 100644 --- a/vnc.c +++ b/vnc.c @@ -1361,6 +1361,7 @@ static void do_key_event(VncState *vs, int down, int keycode, int sym) } else { /* QEMU console emulation */ if (down) { + int numlock = vs->modifiers_state[0x45]; switch (keycode) { case 0x2a: /* Left Shift */ case 0x36: /* Right Shift */ @@ -1370,41 +1371,83 @@ static void do_key_event(VncState *vs, int down, int keycode, int sym) case 0xb8: /* Right ALT */ break; case 0xc8: - case 0x48: kbd_put_keysym(QEMU_KEY_UP); break; case 0xd0: - case 0x50: kbd_put_keysym(QEMU_KEY_DOWN); break; case 0xcb: - case 0x4b: kbd_put_keysym(QEMU_KEY_LEFT); break; case 0xcd: - case 0x4d: kbd_put_keysym(QEMU_KEY_RIGHT); break; case 0xd3: - case 0x53: kbd_put_keysym(QEMU_KEY_DELETE); break; case 0xc7: - case 0x47: kbd_put_keysym(QEMU_KEY_HOME); break; case 0xcf: - case 0x4f: kbd_put_keysym(QEMU_KEY_END); break; case 0xc9: - case 0x49: kbd_put_keysym(QEMU_KEY_PAGEUP); break; case 0xd1: - case 0x51: kbd_put_keysym(QEMU_KEY_PAGEDOWN); break; + + case 0x47: + kbd_put_keysym(numlock ? '7' : QEMU_KEY_HOME); + break; + case 0x48: + kbd_put_keysym(numlock ? '8' : QEMU_KEY_UP); + break; + case 0x49: + kbd_put_keysym(numlock ? '9' : QEMU_KEY_PAGEUP); + break; + case 0x4b: + kbd_put_keysym(numlock ? '4' : QEMU_KEY_LEFT); + break; + case 0x4c: + kbd_put_keysym('5'); + break; + case 0x4d: + kbd_put_keysym(numlock ? '6' : QEMU_KEY_RIGHT); + break; + case 0x4f: + kbd_put_keysym(numlock ? '1' : QEMU_KEY_END); + break; + case 0x50: + kbd_put_keysym(numlock ? '2' : QEMU_KEY_DOWN); + break; + case 0x51: + kbd_put_keysym(numlock ? '3' : QEMU_KEY_PAGEDOWN); + break; + case 0x52: + kbd_put_keysym('0'); + break; + case 0x53: + kbd_put_keysym(numlock ? '.' : QEMU_KEY_DELETE); + break; + + case 0xb5: + kbd_put_keysym('/'); + break; + case 0x37: + kbd_put_keysym('*'); + break; + case 0x4a: + kbd_put_keysym('-'); + break; + case 0x4e: + kbd_put_keysym('+'); + break; + case 0x9c: + kbd_put_keysym('\n'); + break; + default: kbd_put_keysym(sym); break;