vnc: improve numpad support for qemu console.

Reorganize qemu console emulation code.  Make it look at the numlock
state and interpret numpad keys as arrow+friends (numlock off) or
digits (numlock on).  While being at it also wind up the other numpad
keys.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
Gerd Hoffmann 2009-06-11 11:32:14 +02:00 committed by Anthony Liguori
parent 5c5dafdc5e
commit bb0a18e110
1 changed files with 52 additions and 9 deletions

61
vnc.c
View File

@ -1361,6 +1361,7 @@ static void do_key_event(VncState *vs, int down, int keycode, int sym)
} else { } else {
/* QEMU console emulation */ /* QEMU console emulation */
if (down) { if (down) {
int numlock = vs->modifiers_state[0x45];
switch (keycode) { switch (keycode) {
case 0x2a: /* Left Shift */ case 0x2a: /* Left Shift */
case 0x36: /* Right 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 */ case 0xb8: /* Right ALT */
break; break;
case 0xc8: case 0xc8:
case 0x48:
kbd_put_keysym(QEMU_KEY_UP); kbd_put_keysym(QEMU_KEY_UP);
break; break;
case 0xd0: case 0xd0:
case 0x50:
kbd_put_keysym(QEMU_KEY_DOWN); kbd_put_keysym(QEMU_KEY_DOWN);
break; break;
case 0xcb: case 0xcb:
case 0x4b:
kbd_put_keysym(QEMU_KEY_LEFT); kbd_put_keysym(QEMU_KEY_LEFT);
break; break;
case 0xcd: case 0xcd:
case 0x4d:
kbd_put_keysym(QEMU_KEY_RIGHT); kbd_put_keysym(QEMU_KEY_RIGHT);
break; break;
case 0xd3: case 0xd3:
case 0x53:
kbd_put_keysym(QEMU_KEY_DELETE); kbd_put_keysym(QEMU_KEY_DELETE);
break; break;
case 0xc7: case 0xc7:
case 0x47:
kbd_put_keysym(QEMU_KEY_HOME); kbd_put_keysym(QEMU_KEY_HOME);
break; break;
case 0xcf: case 0xcf:
case 0x4f:
kbd_put_keysym(QEMU_KEY_END); kbd_put_keysym(QEMU_KEY_END);
break; break;
case 0xc9: case 0xc9:
case 0x49:
kbd_put_keysym(QEMU_KEY_PAGEUP); kbd_put_keysym(QEMU_KEY_PAGEUP);
break; break;
case 0xd1: case 0xd1:
case 0x51:
kbd_put_keysym(QEMU_KEY_PAGEDOWN); kbd_put_keysym(QEMU_KEY_PAGEDOWN);
break; 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: default:
kbd_put_keysym(sym); kbd_put_keysym(sym);
break; break;