Commit bb0a18e11056c3b8c32e65b97340ca8ae84ba855

Authored by Gerd Hoffmann
Committed by Anthony Liguori
1 parent 5c5dafdc

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>
Showing 1 changed file with 52 additions and 9 deletions
... ... @@ -1361,6 +1361,7 @@ static void do_key_event(VncState *vs, int down, int keycode, int sym)
1361 1361 } else {
1362 1362 /* QEMU console emulation */
1363 1363 if (down) {
  1364 + int numlock = vs->modifiers_state[0x45];
1364 1365 switch (keycode) {
1365 1366 case 0x2a: /* Left Shift */
1366 1367 case 0x36: /* Right Shift */
... ... @@ -1370,41 +1371,83 @@ static void do_key_event(VncState *vs, int down, int keycode, int sym)
1370 1371 case 0xb8: /* Right ALT */
1371 1372 break;
1372 1373 case 0xc8:
1373   - case 0x48:
1374 1374 kbd_put_keysym(QEMU_KEY_UP);
1375 1375 break;
1376 1376 case 0xd0:
1377   - case 0x50:
1378 1377 kbd_put_keysym(QEMU_KEY_DOWN);
1379 1378 break;
1380 1379 case 0xcb:
1381   - case 0x4b:
1382 1380 kbd_put_keysym(QEMU_KEY_LEFT);
1383 1381 break;
1384 1382 case 0xcd:
1385   - case 0x4d:
1386 1383 kbd_put_keysym(QEMU_KEY_RIGHT);
1387 1384 break;
1388 1385 case 0xd3:
1389   - case 0x53:
1390 1386 kbd_put_keysym(QEMU_KEY_DELETE);
1391 1387 break;
1392 1388 case 0xc7:
1393   - case 0x47:
1394 1389 kbd_put_keysym(QEMU_KEY_HOME);
1395 1390 break;
1396 1391 case 0xcf:
1397   - case 0x4f:
1398 1392 kbd_put_keysym(QEMU_KEY_END);
1399 1393 break;
1400 1394 case 0xc9:
1401   - case 0x49:
1402 1395 kbd_put_keysym(QEMU_KEY_PAGEUP);
1403 1396 break;
1404 1397 case 0xd1:
1405   - case 0x51:
1406 1398 kbd_put_keysym(QEMU_KEY_PAGEDOWN);
1407 1399 break;
  1400 +
  1401 + case 0x47:
  1402 + kbd_put_keysym(numlock ? '7' : QEMU_KEY_HOME);
  1403 + break;
  1404 + case 0x48:
  1405 + kbd_put_keysym(numlock ? '8' : QEMU_KEY_UP);
  1406 + break;
  1407 + case 0x49:
  1408 + kbd_put_keysym(numlock ? '9' : QEMU_KEY_PAGEUP);
  1409 + break;
  1410 + case 0x4b:
  1411 + kbd_put_keysym(numlock ? '4' : QEMU_KEY_LEFT);
  1412 + break;
  1413 + case 0x4c:
  1414 + kbd_put_keysym('5');
  1415 + break;
  1416 + case 0x4d:
  1417 + kbd_put_keysym(numlock ? '6' : QEMU_KEY_RIGHT);
  1418 + break;
  1419 + case 0x4f:
  1420 + kbd_put_keysym(numlock ? '1' : QEMU_KEY_END);
  1421 + break;
  1422 + case 0x50:
  1423 + kbd_put_keysym(numlock ? '2' : QEMU_KEY_DOWN);
  1424 + break;
  1425 + case 0x51:
  1426 + kbd_put_keysym(numlock ? '3' : QEMU_KEY_PAGEDOWN);
  1427 + break;
  1428 + case 0x52:
  1429 + kbd_put_keysym('0');
  1430 + break;
  1431 + case 0x53:
  1432 + kbd_put_keysym(numlock ? '.' : QEMU_KEY_DELETE);
  1433 + break;
  1434 +
  1435 + case 0xb5:
  1436 + kbd_put_keysym('/');
  1437 + break;
  1438 + case 0x37:
  1439 + kbd_put_keysym('*');
  1440 + break;
  1441 + case 0x4a:
  1442 + kbd_put_keysym('-');
  1443 + break;
  1444 + case 0x4e:
  1445 + kbd_put_keysym('+');
  1446 + break;
  1447 + case 0x9c:
  1448 + kbd_put_keysym('\n');
  1449 + break;
  1450 +
1408 1451 default:
1409 1452 kbd_put_keysym(sym);
1410 1453 break;
... ...