Commit bbbb2f0af96dbf6706c90209ebb16dc5b87d32e1
1 parent
e32664fb
Fix Caps lock and Num lock handling
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3209 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
26 additions
and
3 deletions
hw/slavio_serial.c
| @@ -95,7 +95,7 @@ typedef struct ChannelState { | @@ -95,7 +95,7 @@ typedef struct ChannelState { | ||
| 95 | uint8_t rx, tx, wregs[16], rregs[16]; | 95 | uint8_t rx, tx, wregs[16], rregs[16]; |
| 96 | SERIOQueue queue; | 96 | SERIOQueue queue; |
| 97 | CharDriverState *chr; | 97 | CharDriverState *chr; |
| 98 | - int e0_mode, led_mode; | 98 | + int e0_mode, led_mode, caps_lock_mode, num_lock_mode; |
| 99 | } ChannelState; | 99 | } ChannelState; |
| 100 | 100 | ||
| 101 | struct SerialState { | 101 | struct SerialState { |
| @@ -195,7 +195,7 @@ static void slavio_serial_reset_chn(ChannelState *s) | @@ -195,7 +195,7 @@ static void slavio_serial_reset_chn(ChannelState *s) | ||
| 195 | s->rx = s->tx = 0; | 195 | s->rx = s->tx = 0; |
| 196 | s->rxint = s->txint = 0; | 196 | s->rxint = s->txint = 0; |
| 197 | s->rxint_under_svc = s->txint_under_svc = 0; | 197 | s->rxint_under_svc = s->txint_under_svc = 0; |
| 198 | - s->e0_mode = s->led_mode = 0; | 198 | + s->e0_mode = s->led_mode = s->caps_lock_mode = s->num_lock_mode = 0; |
| 199 | clear_queue(s); | 199 | clear_queue(s); |
| 200 | } | 200 | } |
| 201 | 201 | ||
| @@ -651,9 +651,32 @@ static void sunkbd_event(void *opaque, int ch) | @@ -651,9 +651,32 @@ static void sunkbd_event(void *opaque, int ch) | ||
| 651 | int release = ch & 0x80; | 651 | int release = ch & 0x80; |
| 652 | 652 | ||
| 653 | KBD_DPRINTF("Untranslated keycode %2.2x (%s)\n", ch, release? "release" : "press"); | 653 | KBD_DPRINTF("Untranslated keycode %2.2x (%s)\n", ch, release? "release" : "press"); |
| 654 | - if (ch == 0xe0) { | 654 | + switch (ch) { |
| 655 | + case 58: // Caps lock press | ||
| 656 | + s->caps_lock_mode ^= 1; | ||
| 657 | + if (s->caps_lock_mode == 2) | ||
| 658 | + return; // Drop second press | ||
| 659 | + break; | ||
| 660 | + case 69: // Num lock press | ||
| 661 | + s->num_lock_mode ^= 1; | ||
| 662 | + if (s->num_lock_mode == 2) | ||
| 663 | + return; // Drop second press | ||
| 664 | + break; | ||
| 665 | + case 186: // Caps lock release | ||
| 666 | + s->caps_lock_mode ^= 2; | ||
| 667 | + if (s->caps_lock_mode == 3) | ||
| 668 | + return; // Drop first release | ||
| 669 | + break; | ||
| 670 | + case 197: // Num lock release | ||
| 671 | + s->num_lock_mode ^= 2; | ||
| 672 | + if (s->num_lock_mode == 3) | ||
| 673 | + return; // Drop first release | ||
| 674 | + break; | ||
| 675 | + case 0xe0: | ||
| 655 | s->e0_mode = 1; | 676 | s->e0_mode = 1; |
| 656 | return; | 677 | return; |
| 678 | + default: | ||
| 679 | + break; | ||
| 657 | } | 680 | } |
| 658 | if (s->e0_mode) { | 681 | if (s->e0_mode) { |
| 659 | s->e0_mode = 0; | 682 | s->e0_mode = 0; |