* Handle keyboard input. * @param value Combined keycode and modifier flags. * @return key value and modifier flags. (ASCII value or > 0x80) * @todo Most users seem to ignore the returned high byte, perhaps make it a * uint8 at some time in the future? */
| 589 | * uint8 at some time in the future? |
| 590 | */ |
| 591 | uint16 Input_Keyboard_HandleKeys(uint16 value) |
| 592 | { |
| 593 | uint16 keyFlags; |
| 594 | |
| 595 | keyFlags = value & 0xFF00; |
| 596 | value &= 0x00FF; |
| 597 | |
| 598 | if ((keyFlags & 0x8000) != 0 || (keyFlags & 0x800) != 0) { |
| 599 | return 0; /* return on key up */ |
| 600 | } |
| 601 | |
| 602 | if (value == 0x6E) { |
| 603 | return keyFlags | 0x1B; /* ESCAPE */ |
| 604 | } |
| 605 | |
| 606 | if (value < 0x3E) { /* Printables Chars */ |
| 607 | uint8 keySave = value & 0x3F; |
| 608 | uint16 asciiValue; |
| 609 | |
| 610 | if ((keyFlags & 0x100) != 0) { |
| 611 | asciiValue = s_keymapShift[keySave]; |
| 612 | } else { |
| 613 | asciiValue = s_keymapNormal[keySave]; |
| 614 | } |
| 615 | |
| 616 | if ((keyFlags & 0x200) != 0) { /* ALT */ |
| 617 | if ((s_keymapSpecialMask[keySave >> 3] & (1 << (keySave & 7))) != 0) { |
| 618 | asciiValue &= 0x1F; |
| 619 | } |
| 620 | } |
| 621 | return keyFlags | asciiValue; |
| 622 | } |
| 623 | |
| 624 | if (value < 0x4B) { |
| 625 | /* 0x3E - 0x4A : unused codes ? */ |
| 626 | if (value >= 0x41) { |
| 627 | return keyFlags | (value + 0x85); /* 0x41-0x4A => 0xC6-0xCF */ |
| 628 | } |
| 629 | return keyFlags | value | 0x80; /* 0x3E 0x3F 0x40 => 0xBE 0xBF 0xC0 */ |
| 630 | } |
| 631 | |
| 632 | if (value < 0x6E) { |
| 633 | /* 0x4B - 0x6D : Keypad + grey edit keys */ |
| 634 | if (value >= 0x5A) { |
| 635 | return s_keymapNumlock[value - 0x5A]; |
| 636 | } else { |
| 637 | /*return s_keymapNumpad[value - 0x4B]; CODE has been removed in 1b81370b006 */ |
| 638 | } |
| 639 | } |
| 640 | |
| 641 | if (value < 0x70 || value > 0x79) { |
| 642 | return keyFlags | value | 0x80; |
| 643 | } |
| 644 | value -= 0x70; /* F1-F10 Function keys */ |
| 645 | if ((keyFlags & 0x700) != 0) { |
| 646 | if ((keyFlags & 0x400) == 0) { /* ? */ |
| 647 | if ((keyFlags & 0x200) == 0) { /* ALT */ |
| 648 | return keyFlags | (0xAC - value); /* 0xA3 - 0xAC */ |
no outgoing calls
no test coverage detected