<div id="__MailbirdStyleContent" style="font-size: 10pt;font-family: Arial;color: #000000;text-align: left" dir="ltr">
                                        Hi Dave,<div><br></div><div>thanks! Yay! I built something and somebody found a way to make it better. Collective code ownership. I like that. :-)</div><div><br></div><div>Best,</div><div>Marcel</div><div class="mb_sig"></div>
                                        <blockquote class="history_container" type="cite" style="border-left-style: solid;border-width: 1px;margin-top: 20px;margin-left: 0px;padding-left: 10px;min-width: 500px">
                        <p style="color: #AAAAAA; margin-top: 10px;">Am 23.06.2021 22:54:41 schrieb David T. Lewis <lewis@mail.msen.com>:</p><div style="font-family:Arial,Helvetica,sans-serif">Marcel,<br><br>I hope you don't mind me pushing this directly to trunk, but the changes<br>are straightforward and I verified that the resulting key map tables are<br>the same as in the prior version.<br><br>I noticed the issue when I updated an image that happened to be accidentally<br>set to use non-sista bytecodes.<br><br>Dave<br><br>On Wed, Jun 23, 2021 at 08:30:01PM +0000, commits@source.squeak.org wrote:<br>> David T. Lewis uploaded a new version of Kernel to project The Trunk:<br>> http://source.squeak.org/trunk/Kernel-dtl.1404.mcz<br>> <br>> ==================== Summary ====================<br>> <br>> Name: Kernel-dtl.1404<br>> Author: dtl<br>> Time: 23 June 2021, 4:29:59.090823 pm<br>> UUID: a04cdcaf-c50a-4edb-a2bf-4308d1e74f6a<br>> Ancestors: Kernel-mt.1403<br>> <br>> Rearrange the code in EventSensor virtual keys methods to reduce the number of literals in methods, allowing EventSensor class>>virtualKeysOnWindows to be compiled with the EncoderForV3PlusClosures bytecode set.<br>> <br>> =============== Diff against Kernel-mt.1403 ===============<br>> <br>> Item was changed:<br>>   ----- Method: EventSensor class>>installVirtualKeyTable (in category 'class initialization') -----<br>>   installVirtualKeyTable<br>>   <br>> +      VirtualKeyTable := Smalltalk windowSystemName<br>> -   VirtualKeyTable := Dictionary newFrom: (<br>> -                Smalltalk windowSystemName<br>>                        caseOf: {<br>>                                 ['Windows'] -> [self virtualKeysOnWindows].<br>>                            ['Win32' "older VMs"] -> [self virtualKeysOnWindows].<br>>                                ['Aqua'] -> [self virtualKeysOnMacOS].<br>>                                 ['X11'] -> [self virtualKeysOnX11].<br>> +                          ['RiscOS'] -> [Dictionary new].<br>> +                              ['Quartz'] -> [Dictionary new].<br>> +                      } otherwise: [Dictionary new].<br>> -                          ['RiscOS'] -> [{}].<br>> -                          ['Quartz'] -> [{}].<br>> -                  } otherwise: [{}]).<br>>       <br>>          "Shift 8 bits to not overwrite virtual-key mappings from above."<br>>        self mapControlKeysToCommandKeys ifTrue: [              <br>>                  VirtualKeyTable<br>>                           at: (2r0010 "ctrl" bitShift: 8)<br>>                         put: (2r1010 "cmd+ctrl").<br>>               VirtualKeyTable<br>>                           at: (2r0011 "ctrl+shift" bitShift: 8)<br>>                           put: (2r1011 "cmd+ctrl+shift")].<br>>                <br>>          self mapAltKeysToOptionKeys ifTrue: [<br>>             VirtualKeyTable<br>>                           at: (2r1000 "cmd/alt" bitShift: 8)<br>>                      put: (2r1100 "cmd/alt+opt").<br>>            VirtualKeyTable<br>>                           at: (2r1001 "cmd/alt+shift" bitShift: 8)<br>>                        put: (2r1101 "cmd/alt+opt+shift")].!<br>> <br>> Item was changed:<br>>   ----- Method: EventSensor class>>virtualKeysOnMacOS (in category 'virtual keys') -----<br>>   virtualKeysOnMacOS<br>>     "Based on Carbon's Events.h -- https://snipplr.com/view/42797"<br>>          <br>> +        ^ Dictionary newFromPairs: {<br>> +            16r00 . $A. "#'kVK_ANSI_A'"<br>> +           16r01 . $S. "#'kVK_ANSI_S'"<br>> +           16r02 . $D. "#'kVK_ANSI_D'"<br>> +           16r03 . $F. "#'kVK_ANSI_F'"<br>> +           16r04 . $H. "#'kVK_ANSI_H'"<br>> +           16r05 . $G. "#'kVK_ANSI_G'"<br>> +           16r06 . $Z. "#'kVK_ANSI_Z'"<br>> +           16r07 . $X. "#'kVK_ANSI_X'"<br>> +           16r08 . $C. "#'kVK_ANSI_C'"<br>> +           16r09 . $V. "#'kVK_ANSI_V'"<br>> +           16r0B . $B. "#'kVK_ANSI_B'"<br>> +           16r0C . $Q. "#'kVK_ANSI_Q'"<br>> +           16r0D . $W. "#'kVK_ANSI_W'"<br>> +           16r0E . $E. "#'kVK_ANSI_E'"<br>> +           16r0F . $R. "#'kVK_ANSI_R'"<br>> +           16r10 . $Y. "#'kVK_ANSI_Y'"<br>> +           16r11 . $T. "#'kVK_ANSI_T'"<br>> +           16r12 . $1. "#'kVK_ANSI_1'"<br>> +           16r13 . $2. "#'kVK_ANSI_2'"<br>> +           16r14 . $3. "#'kVK_ANSI_3'"<br>> +           16r15 . $4. "#'kVK_ANSI_4'"<br>> +           16r16 . $6. "#'kVK_ANSI_6'"<br>> +           16r17 . $5. "#'kVK_ANSI_5'"<br>> +           16r18 . (self simplifyVirtualKeyCodes ifTrue: [#squeak2] ifFalse: [#'kVK_ANSI_Equal']).<br>> +                 16r19 . $9. "#'kVK_ANSI_9'"<br>> +           16r1A . $7. "#'kVK_ANSI_7'"<br>> +           16r1B . (self simplifyVirtualKeyCodes ifTrue: [#squeak1] ifFalse: [#'kVK_ANSI_Minus']).<br>> +                 16r1C . $8. "#'kVK_ANSI_8'"<br>> +           16r1D . $0. "#'kVK_ANSI_0'"<br>> +           16r1E . (self simplifyVirtualKeyCodes ifTrue: [#squeak2] ifFalse: [#'kVK_ANSI_RightBracket']).<br>> +          16r1F . $O. "#'kVK_ANSI_O'"<br>> +           16r20 . $U. "#'kVK_ANSI_U'"<br>> +           16r21 . (self simplifyVirtualKeyCodes ifTrue: [#squeak1] ifFalse: [#'kVK_ANSI_LeftBracket']).<br>> +           16r22 . $I. "#'kVK_ANSI_I'"<br>> +           16r23 . $P. "#'kVK_ANSI_P'"<br>> +           16r25 . $L. "#'kVK_ANSI_L'"<br>> +           16r26 . $J. "#'kVK_ANSI_J'"<br>> +           16r27 . (self simplifyVirtualKeyCodes ifTrue: [#squeak3] ifFalse: [#'kVK_ANSI_Quote']).<br>> +                 16r28 . $K. "#'kVK_ANSI_K'"<br>> +           16r29 . (self simplifyVirtualKeyCodes ifTrue: [#squeak1] ifFalse: [#'kVK_ANSI_Semicolon']).<br>> +             16r2A . (self simplifyVirtualKeyCodes ifTrue: [#squeak1] ifFalse: [#'kVK_ANSI_Backslash']).<br>> +             16r2B . #squeakComma. "#'kVK_ANSI_Comma'"<br>> +             16r2C . (self simplifyVirtualKeyCodes ifTrue: [#squeak1] ifFalse: [#'kVK_ANSI_Slash']).<br>> +                 16r2D . $N. "#'kVK_ANSI_N'"<br>> +           16r2E . $M. "#'kVK_ANSI_M'"<br>> +           16r2F . #squeakPeriod. "#'kVK_ANSI_Period'"<br>> +           16r32 . (self simplifyVirtualKeyCodes ifTrue: [#squeak4] ifFalse: [#'kVK_ANSI_Grave']).<br>> +                 16r41 . #numDec. "#'kVK_ANSI_KeypadDecimal'"<br>> +          16r43 . #numMul. "#'kVK_ANSI_KeypadMultiply'"<br>> +                 16r45 . #numAdd. "#'kVK_ANSI_KeypadPlus'"<br>> +             16r47 . #numClr. "#'kVK_ANSI_KeypadClear'"<br>> +            16r4B . #numDiv. "#'kVK_ANSI_KeypadDivide'"<br>> +           16r4C . (self simplifyVirtualKeyCodes ifTrue: [Character return] ifFalse: [Character enter]). "#'kVK_ANSI_KeypadEnter'"<br>> +               16r4E . #numSub. "#'kVK_ANSI_KeypadMinus'"<br>> +            16r51 . #numEqu. "#'kVK_ANSI_KeypadEquals'"<br>> +           16r52 . #num0. "#'kVK_ANSI_Keypad0'"<br>> +          16r53 . #num1. "#'kVK_ANSI_Keypad1'"<br>> +          16r54 . #num2. "#'kVK_ANSI_Keypad2'"<br>> +          16r55 . #num3. "#'kVK_ANSI_Keypad3'"<br>> +          16r56 . #num4. "#'kVK_ANSI_Keypad4'"<br>> +          16r57 . #num5. "#'kVK_ANSI_Keypad5'"<br>> +          16r58 . #num6. "#'kVK_ANSI_Keypad6'"<br>> +          16r59 . #num7. "#'kVK_ANSI_Keypad7'"<br>> +          16r5B . #num8. "#'kVK_ANSI_Keypad8'"<br>> +          16r5C . #num9. "#'kVK_ANSI_Keypad9'"<br>> +          16r24 . Character return. "#'kVK_Return'"<br>> +             16r30 . Character tab. "#'kVK_Tab'"<br>> +           16r31 . Character space. "#'kVK_Space'"<br>> +               16r33 . Character backspace. "#'kVK_Delete'"<br>> +          16r35 . Character escape. "#'kVK_Escape'"<br>> +             16r36 . #command. "#'kVK_RightCommand'"<br>> +               16r37 . #command. "#'kVK_Command'"<br>> +            16r38 . #shift. "#'kVK_Shift'"<br>> +                16r39 . #capsLock. "#'kVK_CapsLock'"<br>> +          16r3A . #option. "#'kVK_Option'"<br>> +              16r3B . #control. "#'kVK_Control'"<br>> +            16r3C . #shift. "#'kVK_RightShift'"<br>> +           16r3D . #option. "#'kVK_RightOption'"<br>> +                 16r3E . #control. "#'kVK_RightControl'"<br>> +               16r3F . #'kVK_Function'.<br>> +                16r40 . #F17. "#'kVK_F17'"<br>> +            16r48 . #'kVK_VolumeUp'.<br>> +                16r49 . #'kVK_VolumeDown'.<br>> +              16r4A . #'kVK_Mute'.<br>> +            16r4F . #F18. "#'kVK_F18'"<br>> +            16r50 . #F19. "#'kVK_F19'"<br>> +            16r5A . #F20. "#'kVK_F20'"<br>> +            16r60 . #F5. "#'kVK_F5'"<br>> +              16r61 . #F6. "#'kVK_F6'"<br>> +              16r62 . #F7. "#'kVK_F7'"<br>> +              16r63 . #F3. "#'kVK_F3'"<br>> +              16r64 . #F8. "#'kVK_F8'"<br>> +              16r65 . #F9. "#'kVK_F9'"<br>> +              16r67 . #F11. "#'kVK_F11'"<br>> +            16r69 . #F13. "#'kVK_F13'"<br>> +            16r6A . #F16. "#'kVK_F16'"<br>> +            16r6B . #F14. "#'kVK_F14'"<br>> +            16r6D . #F10. "#'kVK_F10'"<br>> +            16r6F . #F12. "#'kVK_F12'"<br>> +            16r71 . #F15. "#'kVK_F15'"<br>> +            16r72 . #help. "#'kVK_Help'"<br>> +          16r73 . Character home. "#'kVK_Home'"<br>> +                 16r74 . Character pageUp. "#'kVK_PageUp'"<br>> +             16r75 . Character delete. "#'kVK_ForwardDelete'"<br>> +              16r76 . #F4. "#'kVK_F4'"<br>> +              16r77 . Character end. "#'kVK_End'"<br>> +           16r78 . #F2. "#'kVK_F2'"<br>> +              16r79 . Character pageDown. "#'kVK_PageDown'"<br>> +                 16r7A . #F1. "#'kVK_F1'"<br>> +              16r7B . Character arrowLeft. "#'kVK_LeftArrow'"<br>> +               16r7C . Character arrowRight. "#'kVK_RightArrow'"<br>> +             16r7D . Character arrowDown. "#'kVK_DownArrow'"<br>> +               16r7E . Character arrowUp. "#'kVK_UpArrow'"<br>> +           16r0A . (self simplifyVirtualKeyCodes ifTrue: [#squeak1] ifFalse: [#'kVK_ISO_Section']).<br>> +                16r5D . #'kVK_JIS_Yen'.<br>> +                 16r5E . #'kVK_JIS_Underscore'.<br>> +          16r5F . #'kVK_JIS_KeypadComma'.<br>> +                 16r66 . #'kVK_JIS_Eisu'.<br>> +                16r68 . #'kVK_JIS_Kana'.<br>> +        }<br>> + <br>> + !<br>> -    ^ {<br>> - 16r00 -> $A. "#'kVK_ANSI_A'"<br>> - 16r01 -> $S. "#'kVK_ANSI_S'"<br>> - 16r02 -> $D. "#'kVK_ANSI_D'"<br>> - 16r03 -> $F. "#'kVK_ANSI_F'"<br>> - 16r04 -> $H. "#'kVK_ANSI_H'"<br>> - 16r05 -> $G. "#'kVK_ANSI_G'"<br>> - 16r06 -> $Z. "#'kVK_ANSI_Z'"<br>> - 16r07 -> $X. "#'kVK_ANSI_X'"<br>> - 16r08 -> $C. "#'kVK_ANSI_C'"<br>> - 16r09 -> $V. "#'kVK_ANSI_V'"<br>> - 16r0B -> $B. "#'kVK_ANSI_B'"<br>> - 16r0C -> $Q. "#'kVK_ANSI_Q'"<br>> - 16r0D -> $W. "#'kVK_ANSI_W'"<br>> - 16r0E -> $E. "#'kVK_ANSI_E'"<br>> - 16r0F -> $R. "#'kVK_ANSI_R'"<br>> - 16r10 -> $Y. "#'kVK_ANSI_Y'"<br>> - 16r11 -> $T. "#'kVK_ANSI_T'"<br>> - 16r12 -> $1. "#'kVK_ANSI_1'"<br>> - 16r13 -> $2. "#'kVK_ANSI_2'"<br>> - 16r14 -> $3. "#'kVK_ANSI_3'"<br>> - 16r15 -> $4. "#'kVK_ANSI_4'"<br>> - 16r16 -> $6. "#'kVK_ANSI_6'"<br>> - 16r17 -> $5. "#'kVK_ANSI_5'"<br>> - 16r18 -> (self simplifyVirtualKeyCodes ifTrue: [#squeak2] ifFalse: [#'kVK_ANSI_Equal']).<br>> - 16r19 -> $9. "#'kVK_ANSI_9'"<br>> - 16r1A -> $7. "#'kVK_ANSI_7'"<br>> - 16r1B -> (self simplifyVirtualKeyCodes ifTrue: [#squeak1] ifFalse: [#'kVK_ANSI_Minus']).<br>> - 16r1C -> $8. "#'kVK_ANSI_8'"<br>> - 16r1D -> $0. "#'kVK_ANSI_0'"<br>> - 16r1E -> (self simplifyVirtualKeyCodes ifTrue: [#squeak2] ifFalse: [#'kVK_ANSI_RightBracket']).<br>> - 16r1F -> $O. "#'kVK_ANSI_O'"<br>> - 16r20 -> $U. "#'kVK_ANSI_U'"<br>> - 16r21 -> (self simplifyVirtualKeyCodes ifTrue: [#squeak1] ifFalse: [#'kVK_ANSI_LeftBracket']).<br>> - 16r22 -> $I. "#'kVK_ANSI_I'"<br>> - 16r23 -> $P. "#'kVK_ANSI_P'"<br>> - 16r25 -> $L. "#'kVK_ANSI_L'"<br>> - 16r26 -> $J. "#'kVK_ANSI_J'"<br>> - 16r27 -> (self simplifyVirtualKeyCodes ifTrue: [#squeak3] ifFalse: [#'kVK_ANSI_Quote']).<br>> - 16r28 -> $K. "#'kVK_ANSI_K'"<br>> - 16r29 -> (self simplifyVirtualKeyCodes ifTrue: [#squeak1] ifFalse: [#'kVK_ANSI_Semicolon']).<br>> - 16r2A -> (self simplifyVirtualKeyCodes ifTrue: [#squeak1] ifFalse: [#'kVK_ANSI_Backslash']).<br>> - 16r2B -> #squeakComma. "#'kVK_ANSI_Comma'"<br>> - 16r2C -> (self simplifyVirtualKeyCodes ifTrue: [#squeak1] ifFalse: [#'kVK_ANSI_Slash']).<br>> - 16r2D -> $N. "#'kVK_ANSI_N'"<br>> - 16r2E -> $M. "#'kVK_ANSI_M'"<br>> - 16r2F -> #squeakPeriod. "#'kVK_ANSI_Period'"<br>> - 16r32 -> (self simplifyVirtualKeyCodes ifTrue: [#squeak4] ifFalse: [#'kVK_ANSI_Grave']).<br>> - 16r41 -> #numDec. "#'kVK_ANSI_KeypadDecimal'"<br>> - 16r43 -> #numMul. "#'kVK_ANSI_KeypadMultiply'"<br>> - 16r45 -> #numAdd. "#'kVK_ANSI_KeypadPlus'"<br>> - 16r47 -> #numClr. "#'kVK_ANSI_KeypadClear'"<br>> - 16r4B -> #numDiv. "#'kVK_ANSI_KeypadDivide'"<br>> - 16r4C -> (self simplifyVirtualKeyCodes ifTrue: [Character return] ifFalse: [Character enter]). "#'kVK_ANSI_KeypadEnter'"<br>> - 16r4E -> #numSub. "#'kVK_ANSI_KeypadMinus'"<br>> - 16r51 -> #numEqu. "#'kVK_ANSI_KeypadEquals'"<br>> - 16r52 -> #num0. "#'kVK_ANSI_Keypad0'"<br>> - 16r53 -> #num1. "#'kVK_ANSI_Keypad1'"<br>> - 16r54 -> #num2. "#'kVK_ANSI_Keypad2'"<br>> - 16r55 -> #num3. "#'kVK_ANSI_Keypad3'"<br>> - 16r56 -> #num4. "#'kVK_ANSI_Keypad4'"<br>> - 16r57 -> #num5. "#'kVK_ANSI_Keypad5'"<br>> - 16r58 -> #num6. "#'kVK_ANSI_Keypad6'"<br>> - 16r59 -> #num7. "#'kVK_ANSI_Keypad7'"<br>> - 16r5B -> #num8. "#'kVK_ANSI_Keypad8'"<br>> - 16r5C -> #num9. "#'kVK_ANSI_Keypad9'"<br>> - 16r24 -> Character return. "#'kVK_Return'"<br>> - 16r30 -> Character tab. "#'kVK_Tab'"<br>> - 16r31 -> Character space. "#'kVK_Space'"<br>> - 16r33 -> Character backspace. "#'kVK_Delete'"<br>> - 16r35 -> Character escape. "#'kVK_Escape'"<br>> - 16r36 -> #command. "#'kVK_RightCommand'"<br>> - 16r37 -> #command. "#'kVK_Command'"<br>> - 16r38 -> #shift. "#'kVK_Shift'"<br>> - 16r39 -> #capsLock. "#'kVK_CapsLock'"<br>> - 16r3A -> #option. "#'kVK_Option'"<br>> - 16r3B -> #control. "#'kVK_Control'"<br>> - 16r3C -> #shift. "#'kVK_RightShift'"<br>> - 16r3D -> #option. "#'kVK_RightOption'"<br>> - 16r3E -> #control. "#'kVK_RightControl'"<br>> - 16r3F -> #'kVK_Function'.<br>> - 16r40 -> #F17. "#'kVK_F17'"<br>> - 16r48 -> #'kVK_VolumeUp'.<br>> - 16r49 -> #'kVK_VolumeDown'.<br>> - 16r4A -> #'kVK_Mute'.<br>> - 16r4F -> #F18. "#'kVK_F18'"<br>> - 16r50 -> #F19. "#'kVK_F19'"<br>> - 16r5A -> #F20. "#'kVK_F20'"<br>> - 16r60 -> #F5. "#'kVK_F5'"<br>> - 16r61 -> #F6. "#'kVK_F6'"<br>> - 16r62 -> #F7. "#'kVK_F7'"<br>> - 16r63 -> #F3. "#'kVK_F3'"<br>> - 16r64 -> #F8. "#'kVK_F8'"<br>> - 16r65 -> #F9. "#'kVK_F9'"<br>> - 16r67 -> #F11. "#'kVK_F11'"<br>> - 16r69 -> #F13. "#'kVK_F13'"<br>> - 16r6A -> #F16. "#'kVK_F16'"<br>> - 16r6B -> #F14. "#'kVK_F14'"<br>> - 16r6D -> #F10. "#'kVK_F10'"<br>> - 16r6F -> #F12. "#'kVK_F12'"<br>> - 16r71 -> #F15. "#'kVK_F15'"<br>> - 16r72 -> #help. "#'kVK_Help'"<br>> - 16r73 -> Character home. "#'kVK_Home'"<br>> - 16r74 -> Character pageUp. "#'kVK_PageUp'"<br>> - 16r75 -> Character delete. "#'kVK_ForwardDelete'"<br>> - 16r76 -> #F4. "#'kVK_F4'"<br>> - 16r77 -> Character end. "#'kVK_End'"<br>> - 16r78 -> #F2. "#'kVK_F2'"<br>> - 16r79 -> Character pageDown. "#'kVK_PageDown'"<br>> - 16r7A -> #F1. "#'kVK_F1'"<br>> - 16r7B -> Character arrowLeft. "#'kVK_LeftArrow'"<br>> - 16r7C -> Character arrowRight. "#'kVK_RightArrow'"<br>> - 16r7D -> Character arrowDown. "#'kVK_DownArrow'"<br>> - 16r7E -> Character arrowUp. "#'kVK_UpArrow'"<br>> - 16r0A -> (self simplifyVirtualKeyCodes ifTrue: [#squeak1] ifFalse: [#'kVK_ISO_Section']).<br>> - 16r5D -> #'kVK_JIS_Yen'.<br>> - 16r5E -> #'kVK_JIS_Underscore'.<br>> - 16r5F -> #'kVK_JIS_KeypadComma'.<br>> - 16r66 -> #'kVK_JIS_Eisu'.<br>> - 16r68 -> #'kVK_JIS_Kana'.<br>> - }!<br>> <br>> Item was changed:<br>>   ----- Method: EventSensor class>>virtualKeysOnWindows (in category 'virtual keys') -----<br>>   virtualKeysOnWindows<br>>       "https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes<br>>           <br>>          Tweaked to Windows 10 Version 20H2 (Build 19042.928)<br>>      Microsoft Surface Pro 6 (GERMAN)"<br>> -  <br>> -        ^ {<br>>   <br>> +    | table |<br>> +       table := Dictionary new.        <br>> +        {<br>> +               "16r01"       Character home. "#'VK_HOME'" "Overshadows #'VK_LBUTTON' --- Left mouse button"<br>> +              "16r02"       #'VK_RBUTTON'. "Right mouse button"<br>> +           "16r03"       #'VK_CANCEL'. "Control-break processing"<br>> +              "16r04"       Character end. "#'VK_END'" "Overshadows #'VK_MBUTTON' --- Middle mouse button"<br>> +              "16r05"       Character insert. "#'VK_INSERT'" "Overshadows #'VK_XBUTTON1' --- X1 mouse button"<br>> +           "16r06"       #'VK_XBUTTON2'. "X2 mouse button"<br>> +             "16r07"       nil.<br>> +            "16r08"       Character backspace. "#'VK_BACK'"<br>> +             "16r09"       Character tab. "#'VK_TAB'"<br>> +            "16r0A"       nil.<br>> +            "16r0B"       Character pageUp. "#'VK_PRIOR'" "PAGE UP key"<br>> +               "16r0C"       Character pageDown. "#'VK_NEXT'" "PAGE DOWN key --- overshadows #'VK_CLEAR'"<br>> +                "16r0D"       Character return. "#'VK_RETURN'" "ENTER key"<br>> +                "16r0E"       nil.<br>> +            "16r0F"       nil.<br>> +            "16r10"       #shift. "#'VK_SHIFT'"<br>> +                 "16r11"       (self mapControlKeysToCommandKeys ifTrue: [#command] ifFalse: [#control]). "#'VK_CONTROL'"<br>> +            "16r12"       (self mapAltKeysToOptionKeys ifTrue: [#option] ifFalse: [#command "aka. #alt"]). "#'VK_MENU'"<br>> +               "16r13"       #'VK_PAUSE'.<br>> +            "16r14"       #capsLock. "#'VK_CAPITAL'"<br>> +            "16r15"       #'VK_KANA'. "IME Kana/Hangul mode"<br>> +            "16r16"       #'VK_IME_ON'. "IME on"<br>> +                "16r17"       #'VK_JUNJA'. "IMA Junja mode"<br>> +                 "16r18"       #'VK_FINAL'. "IME final mode"<br>> +                 "16r19"       #'VK_KANJI'. "IME Kanji/Hanja mode"<br>> +           "16r1A"       #'VK_IME_OFF'. "IME off"<br>> +              "16r1B"       Character escape. "#'VK_ESCAPE'"<br>> +              "16r1C"       Character arrowLeft. "#'VK_LEFT'" "LEFT ARROW. Overshadows #'VK_CONVERT' --- IME convert"<br>> +           "16r1D"       Character arrowRight. "#'VK_RIGHT'" "RIGHT ARROW. Overshadows 'VK_NONCONVERT' --- IME nonconvert"<br>> +           "16r1E"       Character arrowUp. "#'VK_UP'" "UP ARROW. Overshadows #'VK_ACCEPT' --- IME accept"<br>> +           "16r1F"       Character arrowDown. "#'VK_DOWN'" "DOWN ARROW. Overshadows #'VK_MODECHANGE' --- IME mode change request"<br>> +            "16r20"       Character space. "#'VK_SPACE'" "SPACEBAR"<br>> +           "16r21"       #'VK_PRIOR'. "PAGE UP key. Not needed. See 16r0B"<br>> +             "16r22"       #'VK_NEXT'. "PAGE DOWN key. Not needed. See 16r0C"<br>> +            "16r23"       #'VK_END'. "Not needed. See 16r04"<br>> +            "16r24"       #'VK_HOME'. "Not needed. See 16r01"<br>> +           "16r25"       #'VK_LEFT'. "LEFT ARROW. Not needed. See 16r1C"<br>> +               "16r26"       #'VK_UP'. "UP ARROW. Not needed. See 16r1E"<br>> +           "16r27"       #'VK_RIGHT'. "RIGHT ARROW. Not needed. See 16r1D"<br>> +             "16r28"       #'VK_DOWN'. "DOWN ARROW. Not needed. See 16r1F"<br>> +               "16r29"       #'VK_SELECT'.<br>> +           "16r2A"       #'VK_PRINT'.<br>> +            "16r2B"       #'VK_EXECUTE'.<br>> +          "16r2C"       #'VK_SNAPSHOT'. "PRINT SCREEN key"<br>> +            "16r2D"       #'VK_INSERT'. "Not needed. See 16r05"<br>> +                 "16r2E"       #F16. "#'VK_F16' swapped with #'VK_DELETE'. See 16r7F"<br>> +                "16r2F"       #help. "#'VK_HELP'"<br>> +           "16r30"       $0.<br>> +             "16r31"       $1.<br>> +             "16r32"       $2.<br>> +             "16r33"       $3.<br>> +             "16r34"       $4.<br>> +             "16r35"       $5.<br>> +             "16r36"       $6.<br>> +             "16r37"       $7.<br>> +             "16r38"       $8.<br>> +             "16r39"       $9.<br>> +             "16r3A"       nil.<br>> +            "16r3B"       nil.<br>> +            "16r3C"       nil.<br>> +            "16r3D"       nil.<br>> +            "16r3E"       nil.<br>> +            "16r3F"       nil.<br>> +            "16r40"       nil.<br>> +            "16r41"       $A.<br>> +             "16r42"       $B.<br>> +             "16r43"       $C.<br>> +             "16r44"       $D.<br>> +             "16r45"       $E.<br>> +             "16r46"       $F.<br>> +             "16r47"       $G.<br>> +             "16r48"       $H.<br>> +             "16r49"       $I.<br>> +             "16r4A"       $J.<br>> +             "16r4B"       $K.<br>> +             "16r4C"       $L.<br>> +             "16r4D"       $M.<br>> +             "16r4E"       $N.<br>> +             "16r4F"       $O.<br>> +             "16r50"       $P.<br>> +             "16r51"       $Q.<br>> +             "16r52"       $R.<br>> +             "16r53"       $S.<br>> +             "16r54"       $T.<br>> +             "16r55"       $U.<br>> +             "16r56"       $V.<br>> +             "16r57"       $W.<br>> +             "16r58"       $X.<br>> +             "16r59"       $Y.<br>> +             "16r5A"       $Z.<br>> +             "16r5B"       #'VK_LWIN'. "Left Windows key"<br>> +                "16r5C"       #'VK_RWIN'. "Right windows key"<br>> +               "16r5D"       #'VK_APPS'. "Applications key"<br>> +                "16r5E"       nil.<br>> +            "16r5F"       #'VK_SLEEP'. "Computer Sleep Key"<br>> +             "16r60"       #num0. "#'VK_NUMPAD0'"<br>> +                "16r61"       #num1. "#'VK_NUMPAD1'"<br>> +                "16r62"       #num2. "#'VK_NUMPAD2'"<br>> +                "16r63"       #num3. "#'VK_NUMPAD3'"<br>> +                "16r64"       #num4. "#'VK_NUMPAD4'"<br>> +                "16r65"       #num5. "#'VK_NUMPAD5'"<br>> +                "16r66"       #num6. "#'VK_NUMPAD6'"<br>> +                "16r67"       #num7. "#'VK_NUMPAD7'"<br>> +                "16r68"       #num8. "#'VK_NUMPAD8'"<br>> +                "16r69"       #num9. "#'VK_NUMPAD9'"<br>> +                "16r6A"       #numMul. "#'VK_MULTIPLY'"<br>> +             "16r6B"       #numAdd. "#'VK_ADD'"<br>> +          "16r6C"       #'VK_SEPARATOR'.<br>> +                "16r6D"       #numSub. "#'VK_SUBTRACT'"<br>> +             "16r6E"       #numDec. "#'VK_DECIMAL'"<br>> +              "16r6F"       #numDiv. "#'VK_DIVIDE'"<br>> +               "16r70"       #F1. "#'VK_F1'"<br>> +               "16r71"       #F2. "#'VK_F2'"<br>> +               "16r72"       #F3. "#'VK_F3'"<br>> +               "16r73"       #F4. "#'VK_F4'"<br>> +               "16r74"       #F5. "#'VK_F5'"<br>> +               "16r75"       #F6. "#'VK_F6'"<br>> +               "16r76"       #F7. "#'VK_F7'"<br>> +               "16r77"       #F8. "#'VK_F8'"<br>> +               "16r78"       #F9. "#'VK_F9'"<br>> +               "16r79"       #F10. "#'VK_F10'"<br>> +             "16r7A"       #F11. "#'VK_F11'"<br>> +             "16r7B"       #F12. "#'VK_F12'"<br>> +             "16r7C"       #F13. "#'VK_F13'"<br>> +             "16r7D"       #F14. "#'VK_F14'"<br>> +             "16r7E"       #F15. "#'VK_F15'"<br>> +             "16r7F"       Character delete. "#'VK_DELETE' swapped with #'VK_F16'. See 16r2E"<br>> +            "16r80"       #F17. "#'VK_F17'"<br>> +             "16r81"       #F18. "#'VK_F18'"<br>> +             "16r82"       #F19. "#'VK_F19'"<br>> +             "16r83"       #F20. "#'VK_F20'"<br>> +             "16r84"       #F21. "#'VK_F21'"<br>> +             "16r85"       #F22. "#'VK_F22'"<br>> +             "16r86"       #F23. "#'VK_F23'"<br>> +             "16r87"       #F24. "#'VK_F24'"<br>> +             "16r88"       nil.<br>> +            "16r89"       nil.<br>> +            "16r8A"       nil.<br>> +            "16r8B"       nil.<br>> +            "16r8C"       nil.<br>> +            "16r8D"       nil.<br>> +            "16r8E"       nil.<br>> +            "16r8F"       nil.<br>> +            "16r90"       #'VK_NUMLOCK'.<br>> +          "16r91"       #'VK_SCROLL'.<br>> +           "16r92"       nil.<br>> +            "16r93"       nil.<br>> +            "16r94"       nil.<br>> +            "16r95"       nil.<br>> +            "16r96"       nil.<br>> +            "16r97"       nil.<br>> +            "16r98"       nil.<br>> +            "16r99"       nil.<br>> +            "16r9A"       nil.<br>> +            "16r9B"       nil.<br>> +            "16r9C"       nil.<br>> +            "16r9D"       nil.<br>> +            "16r9E"       nil.<br>> +            "16r9F"       nil.<br>> +            "16rA0"       #'VK_LSHIFT'.<br>> +           "16rA1"       #'VK_RSHIFT'.<br>> +           "16rA2"       #'VK_LCONTROL'.<br>> +                 "16rA3"       #'VK_RCONTROL'.<br>> +                 "16rA4"       #'VK_LMENU'.<br>> +            "16rA5"       #'VK_RMENU'.<br>> +            "16rA6"       #'VK_BROWSER_BACK'.<br>> +             "16rA7"       #'VK_BROWSER_FORWARD'.<br>> +          "16rA8"       #'VK_BROWSER_REFRESH'.<br>> +          "16rA9"       #'VK_BROWSER_STOP'.<br>> +             "16rAA"       #'VK_BROWSER_SEARCH'.<br>> +           "16rAB"       #'VK_BROWSER_FAVORITES'.<br>> +                "16rAC"       #'VK_BROWSER_HOME'.<br>> +             "16rAD"       #'VK_VOLUME_MUTE'.<br>> +              "16rAE"       #'VK_VOLUME_DOWN'.<br>> +              "16rAF"       #'VK_VOLUME_UP'.<br>> +                "16rB0"       #'VK_MEDIA_NEXT_TRACK'.<br>> +                 "16rB1"       #'VK_MEDIA_PREV_TRACK'.<br>> +                 "16rB2"       #'VK_MEDIA_STOP'.<br>> +               "16rB3"       #'VK_MEDIA_PLAY_PAUSE'.<br>> +                 "16rB4"       #'VK_LAUNCH_MAIL'.<br>> +              "16rB5"       #'VK_LAUNCH_MEDIA_SELECT'.<br>> +              "16rB6"       #'VK_LAUNCH_APP1'.<br>> +              "16rB7"       #'VK_LAUNCH_APP2'.<br>> +              "16rB8"       nil.<br>> +            "16rB9"       nil<br>> +     } withIndexDo: [ :val :i | table at: i put: val] .<br>> - 16r01 -> Character home. "#'VK_HOME'" "Overshadows #'VK_LBUTTON' --- Left mouse button"<br>> - 16r02 -> #'VK_RBUTTON'. "Right mouse button"<br>> - 16r03 -> #'VK_CANCEL'. "Control-break processing"<br>> - 16r04 -> Character end. "#'VK_END'" "Overshadows #'VK_MBUTTON' --- Middle mouse button"<br>> - 16r05 -> Character insert. "#'VK_INSERT'" "Overshadows #'VK_XBUTTON1' --- X1 mouse button"<br>> - 16r06 -> #'VK_XBUTTON2'. "X2 mouse button"<br>> - 16r07 -> nil.<br>> - 16r08 -> Character backspace. "#'VK_BACK'"<br>> - 16r09 -> Character tab. "#'VK_TAB'"<br>> - 16r0A -> nil.<br>> - 16r0B -> Character pageUp. "#'VK_PRIOR'" "PAGE UP key"<br>> - 16r0C -> Character pageDown. "#'VK_NEXT'" "PAGE DOWN key --- overshadows #'VK_CLEAR'"<br>> - 16r0D -> Character return. "#'VK_RETURN'" "ENTER key"<br>> - 16r0E -> nil.<br>> - 16r0F -> nil.<br>> - 16r10 -> #shift. "#'VK_SHIFT'"<br>> - 16r11 -> (self mapControlKeysToCommandKeys ifTrue: [#command] ifFalse: [#control]). "#'VK_CONTROL'"<br>> - 16r12 -> (self mapAltKeysToOptionKeys ifTrue: [#option] ifFalse: [#command "aka. #alt"]). "#'VK_MENU'"<br>> - 16r13 -> #'VK_PAUSE'.<br>> - 16r14 -> #capsLock. "#'VK_CAPITAL'"<br>> - 16r15 -> #'VK_KANA'. "IME Kana/Hangul mode"<br>> - 16r16 -> #'VK_IME_ON'. "IME on"<br>> - 16r17 -> #'VK_JUNJA'. "IMA Junja mode"<br>> - 16r18 -> #'VK_FINAL'. "IME final mode"<br>> - 16r19 -> #'VK_KANJI'. "IME Kanji/Hanja mode"<br>> - 16r1A -> #'VK_IME_OFF'. "IME off"<br>> - 16r1B -> Character escape. "#'VK_ESCAPE'"<br>> - 16r1C -> Character arrowLeft. "#'VK_LEFT'" "LEFT ARROW. Overshadows #'VK_CONVERT' --- IME convert"<br>> - 16r1D -> Character arrowRight. "#'VK_RIGHT'" "RIGHT ARROW. Overshadows 'VK_NONCONVERT' --- IME nonconvert"<br>> - 16r1E -> Character arrowUp. "#'VK_UP'" "UP ARROW. Overshadows #'VK_ACCEPT' --- IME accept"<br>> - 16r1F -> Character arrowDown. "#'VK_DOWN'" "DOWN ARROW. Overshadows #'VK_MODECHANGE' --- IME mode change request"<br>> - 16r20 -> Character space. "#'VK_SPACE'" "SPACEBAR"<br>> - 16r21 -> #'VK_PRIOR'. "PAGE UP key. Not needed. See 16r0B"<br>> - 16r22 -> #'VK_NEXT'. "PAGE DOWN key. Not needed. See 16r0C"<br>> - 16r23 -> #'VK_END'. "Not needed. See 16r04"<br>> - 16r24 -> #'VK_HOME'. "Not needed. See 16r01"<br>> - 16r25 -> #'VK_LEFT'. "LEFT ARROW. Not needed. See 16r1C"<br>> - 16r26 -> #'VK_UP'. "UP ARROW. Not needed. See 16r1E"<br>> - 16r27 -> #'VK_RIGHT'. "RIGHT ARROW. Not needed. See 16r1D"<br>> - 16r28 -> #'VK_DOWN'. "DOWN ARROW. Not needed. See 16r1F"<br>> - 16r29 -> #'VK_SELECT'.<br>> - 16r2A -> #'VK_PRINT'.<br>> - 16r2B -> #'VK_EXECUTE'.<br>> - 16r2C -> #'VK_SNAPSHOT'. "PRINT SCREEN key"<br>> - 16r2D -> #'VK_INSERT'. "Not needed. See 16r05"<br>> - 16r2E -> #F16. "#'VK_F16' swapped with #'VK_DELETE'. See 16r7F"<br>> - 16r2F -> #help. "#'VK_HELP'"<br>> - 16r30 -> $0.<br>> - 16r31 -> $1.<br>> - 16r32 -> $2.<br>> - 16r33 -> $3.<br>> - 16r34 -> $4.<br>> - 16r35 -> $5.<br>> - 16r36 -> $6.<br>> - 16r37 -> $7.<br>> - 16r38 -> $8.<br>> - 16r39 -> $9.<br>> - 16r3A -> nil.<br>> - 16r3B -> nil.<br>> - 16r3C -> nil.<br>> - 16r3D -> nil.<br>> - 16r3E -> nil.<br>> - 16r3F -> nil.<br>> - 16r40 -> nil.<br>> - 16r41 -> $A.<br>> - 16r42 -> $B.<br>> - 16r43 -> $C.<br>> - 16r44 -> $D.<br>> - 16r45 -> $E.<br>> - 16r46 -> $F.<br>> - 16r47 -> $G.<br>> - 16r48 -> $H.<br>> - 16r49 -> $I.<br>> - 16r4A -> $J.<br>> - 16r4B -> $K.<br>> - 16r4C -> $L.<br>> - 16r4D -> $M.<br>> - 16r4E -> $N.<br>> - 16r4F -> $O.<br>> - 16r50 -> $P.<br>> - 16r51 -> $Q.<br>> - 16r52 -> $R.<br>> - 16r53 -> $S.<br>> - 16r54 -> $T.<br>> - 16r55 -> $U.<br>> - 16r56 -> $V.<br>> - 16r57 -> $W.<br>> - 16r58 -> $X.<br>> - 16r59 -> $Y.<br>> - 16r5A -> $Z.<br>> - 16r5B -> #'VK_LWIN'. "Left Windows key"<br>> - 16r5C -> #'VK_RWIN'. "Right windows key"<br>> - 16r5D -> #'VK_APPS'. "Applications key"<br>> - 16r5E -> nil.<br>> - 16r5F -> #'VK_SLEEP'. "Computer Sleep Key"<br>> - 16r60 -> #num0. "#'VK_NUMPAD0'"<br>> - 16r61 -> #num1. "#'VK_NUMPAD1'"<br>> - 16r62 -> #num2. "#'VK_NUMPAD2'"<br>> - 16r63 -> #num3. "#'VK_NUMPAD3'"<br>> - 16r64 -> #num4. "#'VK_NUMPAD4'"<br>> - 16r65 -> #num5. "#'VK_NUMPAD5'"<br>> - 16r66 -> #num6. "#'VK_NUMPAD6'"<br>> - 16r67 -> #num7. "#'VK_NUMPAD7'"<br>> - 16r68 -> #num8. "#'VK_NUMPAD8'"<br>> - 16r69 -> #num9. "#'VK_NUMPAD9'"<br>> - 16r6A -> #numMul. "#'VK_MULTIPLY'"<br>> - 16r6B -> #numAdd. "#'VK_ADD'"<br>> - 16r6C -> #'VK_SEPARATOR'.<br>> - 16r6D -> #numSub. "#'VK_SUBTRACT'"<br>> - 16r6E -> #numDec. "#'VK_DECIMAL'"<br>> - 16r6F -> #numDiv. "#'VK_DIVIDE'"<br>> - 16r70 -> #F1. "#'VK_F1'"<br>> - 16r71 -> #F2. "#'VK_F2'"<br>> - 16r72 -> #F3. "#'VK_F3'"<br>> - 16r73 -> #F4. "#'VK_F4'"<br>> - 16r74 -> #F5. "#'VK_F5'"<br>> - 16r75 -> #F6. "#'VK_F6'"<br>> - 16r76 -> #F7. "#'VK_F7'"<br>> - 16r77 -> #F8. "#'VK_F8'"<br>> - 16r78 -> #F9. "#'VK_F9'"<br>> - 16r79 -> #F10. "#'VK_F10'"<br>> - 16r7A -> #F11. "#'VK_F11'"<br>> - 16r7B -> #F12. "#'VK_F12'"<br>> - 16r7C -> #F13. "#'VK_F13'"<br>> - 16r7D -> #F14. "#'VK_F14'"<br>> - 16r7E -> #F15. "#'VK_F15'"<br>> - 16r7F -> Character delete. "#'VK_DELETE' swapped with #'VK_F16'. See 16r2E"<br>> - 16r80 -> #F17. "#'VK_F17'"<br>> - 16r81 -> #F18. "#'VK_F18'"<br>> - 16r82 -> #F19. "#'VK_F19'"<br>> - 16r83 -> #F20. "#'VK_F20'"<br>> - 16r84 -> #F21. "#'VK_F21'"<br>> - 16r85 -> #F22. "#'VK_F22'"<br>> - 16r86 -> #F23. "#'VK_F23'"<br>> - 16r87 -> #F24. "#'VK_F24'"<br>> - 16r88 -> nil.<br>> - 16r89 -> nil.<br>> - 16r8A -> nil.<br>> - 16r8B -> nil.<br>> - 16r8C -> nil.<br>> - 16r8D -> nil.<br>> - 16r8E -> nil.<br>> - 16r8F -> nil.<br>> - 16r90 -> #'VK_NUMLOCK'.<br>> - 16r91 -> #'VK_SCROLL'.<br>> - 16r92 -> nil.<br>> - 16r93 -> nil.<br>> - 16r94 -> nil.<br>> - 16r95 -> nil.<br>> - 16r96 -> nil.<br>> - 16r97 -> nil.<br>> - 16r98 -> nil.<br>> - 16r99 -> nil.<br>> - 16r9A -> nil.<br>> - 16r9B -> nil.<br>> - 16r9C -> nil.<br>> - 16r9D -> nil.<br>> - 16r9E -> nil.<br>> - 16r9F -> nil.<br>> - 16rA0 -> #'VK_LSHIFT'.<br>> - 16rA1 -> #'VK_RSHIFT'.<br>> - 16rA2 -> #'VK_LCONTROL'.<br>> - 16rA3 -> #'VK_RCONTROL'.<br>> - 16rA4 -> #'VK_LMENU'.<br>> - 16rA5 -> #'VK_RMENU'.<br>> - 16rA6 -> #'VK_BROWSER_BACK'.<br>> - 16rA7 -> #'VK_BROWSER_FORWARD'.<br>> - 16rA8 -> #'VK_BROWSER_REFRESH'.<br>> - 16rA9 -> #'VK_BROWSER_STOP'.<br>> - 16rAA -> #'VK_BROWSER_SEARCH'.<br>> - 16rAB -> #'VK_BROWSER_FAVORITES'.<br>> - 16rAC -> #'VK_BROWSER_HOME'.<br>> - 16rAD -> #'VK_VOLUME_MUTE'.<br>> - 16rAE -> #'VK_VOLUME_DOWN'.<br>> - 16rAF -> #'VK_VOLUME_UP'.<br>> - 16rB0 -> #'VK_MEDIA_NEXT_TRACK'.<br>> - 16rB1 -> #'VK_MEDIA_PREV_TRACK'.<br>> - 16rB2 -> #'VK_MEDIA_STOP'.<br>> - 16rB3 -> #'VK_MEDIA_PLAY_PAUSE'.<br>> - 16rB4 -> #'VK_LAUNCH_MAIL'.<br>> - 16rB5 -> #'VK_LAUNCH_MEDIA_SELECT'.<br>> - 16rB6 -> #'VK_LAUNCH_APP1'.<br>> - 16rB7 -> #'VK_LAUNCH_APP2'.<br>> - 16rB8 -> nil.<br>> - 16rB9 -> nil.<br>>   <br>> +        {<br>> +               16rBA . (self simplifyVirtualKeyCodes ifTrue: [#squeak1] ifFalse: [#'VK_OEM_1']).<br>> +               "Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the ;: key"<br>> +        <br>> +                16rBB . (self simplifyVirtualKeyCodes ifTrue: [#squeak2] ifFalse: [#'VK_OEM_PLUS']).<br>> +            "For any country/region, the + key -- mt. Haha. You wish."<br>> +    <br>> +                16rBC . #squeakComma. "#'VK_OEM_COMMA'" "For any country/region, the , key"<br>> +         <br>> +                16rBD .  (self simplifyVirtualKeyCodes ifTrue: [#squeak1] ifFalse: [#'VK_OEM_MINUS']).<br>> +          "For any country/region, the - key"<br>> +   <br>> +                16rBE . #squeakPeriod. "#'VK_OEM_PERIOD'" "For any country/region, the . key"<br>> +       <br>> +                16rBF . (self simplifyVirtualKeyCodes ifTrue: [#squeak1] ifFalse: [#'VK_OEM_2']).<br>> +               "Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the /? key"<br>> +        <br>> +                16rC0 . (self simplifyVirtualKeyCodes ifTrue: [#squeak1] ifFalse: [#'VK_OEM_3']).<br>> +               "Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the `~ key'"<br>> +       } pairsDo: [ :i :val | table at: i put: val] .<br>> - 16rBA -> (self simplifyVirtualKeyCodes ifTrue: [#squeak1] ifFalse: [#'VK_OEM_1']).<br>> - "Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the ;: key"<br>>   <br>> +  16rC1   to: 16rDA<br>> +               do: [ :e | table at: e put: nil ].<br>> - 16rBB -> (self simplifyVirtualKeyCodes ifTrue: [#squeak2] ifFalse: [#'VK_OEM_PLUS']).<br>> - "For any country/region, the + key -- mt. Haha. You wish."<br>>   <br>> +       {       <br>> +        <br>> +                16rDB . (self simplifyVirtualKeyCodes ifTrue: [#squeak1] ifFalse: [#'VK_OEM_4']).<br>> +               "Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the [{ key"<br>> +        <br>> +                16rDC . (self simplifyVirtualKeyCodes ifTrue: [#squeak1] ifFalse: [#'VK_OEM_5']).<br>> +               "Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the \| key"<br>> +        <br>> +                16rDD . (self simplifyVirtualKeyCodes ifTrue: [#squeak2] ifFalse: [#'VK_OEM_6']).<br>> +               "Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the ]} key"<br>> +        <br>> +                16rDE . (self simplifyVirtualKeyCodes ifTrue: [#squeak3] ifFalse: [#'VK_OEM_7']).<br>> +               "Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the single-quote/double-quote key"<br>> +         <br>> +                16rDF . #'VK_OEM_8'.<br>> +            "Used for miscellaneous characters; it can vary by keyboard."<br>> +         <br>> +                16rE0 . nil.<br>> +            16rE1 . nil.<br>> +    <br>> +                16rE2 . (self simplifyVirtualKeyCodes ifTrue: [#squeak4] ifFalse: [#'VK_OEM_102']). <br>> +            "Either the angle bracket key or the backslash key on the RT 102-key keyboard"<br>> +        <br>> +                16rE3 . nil.<br>> +            16rE4 . nil.<br>> +            16rE5 . #'VK_PROCESSKEY'. "IME PROCESS key"<br>> +           16rE6 . nil.<br>> +            16rE7 . #'VK_PACKET'. "Used to pass Unicode characters as if they were keystrokes. The VK_PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods."<br>> +      } pairsDo: [ :i :val | table at: i put: val] .<br>> - 16rBC -> #squeakComma. "#'VK_OEM_COMMA'" "For any country/region, the , key"<br>>   <br>> +     16rE8   to: 16rF5<br>> +               do: [ :e | table at: e put: nil ].<br>> - 16rBD -> (self simplifyVirtualKeyCodes ifTrue: [#squeak1] ifFalse: [#'VK_OEM_MINUS']).<br>> - "For any country/region, the - key"<br>>   <br>> +     {<br>> +               16rF6 . #'VK_ATTN'.<br>> +             16rF7 . #'VK_CRSEL'.<br>> +            16rF8 . #'VK_EXSEL'.<br>> +            16rF9 . #'VK_EREOF'. "Erase EOF key"<br>> +          16rFA . #'VK_PLAY'.<br>> +             16rFB . #'VK_ZOOM'.<br>> +             16rFC . #'VK_NONAME'. "Reserved"<br>> +              16rFD . #'VK_PA1'.<br>> +              16rFE . #'VK_OEM_CLEAR'. "Clear key"<br>> +  <br>> +        } pairsDo: [ :i :val | table at: i put: val] .<br>> - 16rBE -> #squeakPeriod. "#'VK_OEM_PERIOD'" "For any country/region, the . key"<br>>   <br>> +   ^table<br>> - 16rBF -> (self simplifyVirtualKeyCodes ifTrue: [#squeak1] ifFalse: [#'VK_OEM_2']).<br>> - "Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the /? key"<br>>   <br>> + !<br>> - 16rC0 -> (self simplifyVirtualKeyCodes ifTrue: [#squeak1] ifFalse: [#'VK_OEM_3']).<br>> - "Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the `~ key'"<br>> - <br>> - 16rC1 -> nil.<br>> - 16rC2 -> nil.<br>> - 16rC3 -> nil.<br>> - 16rC4 -> nil.<br>> - 16rC5 -> nil.<br>> - 16rC6 -> nil.<br>> - 16rC7 -> nil.<br>> - 16rC8 -> nil.<br>> - 16rC9 -> nil.<br>> - 16rCA -> nil.<br>> - 16rCB -> nil.<br>> - 16rCC -> nil.<br>> - 16rCD -> nil.<br>> - 16rCE -> nil.<br>> - 16rCF -> nil.<br>> - 16rD0 -> nil.<br>> - 16rD1 -> nil.<br>> - 16rD2 -> nil.<br>> - 16rD3 -> nil.<br>> - 16rD4 -> nil.<br>> - 16rD5 -> nil.<br>> - 16rD6 -> nil.<br>> - 16rD7 -> nil.<br>> - 16rD8 -> nil.<br>> - 16rD9 -> nil.<br>> - 16rDA -> nil.<br>> - <br>> - 16rDB -> (self simplifyVirtualKeyCodes ifTrue: [#squeak1] ifFalse: [#'VK_OEM_4']).<br>> - "Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the [{ key"<br>> - <br>> - 16rDC -> (self simplifyVirtualKeyCodes ifTrue: [#squeak1] ifFalse: [#'VK_OEM_5']).<br>> - "Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the \| key"<br>> - <br>> - 16rDD -> (self simplifyVirtualKeyCodes ifTrue: [#squeak2] ifFalse: [#'VK_OEM_6']).<br>> - "Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the ]} key"<br>> - <br>> - 16rDE -> (self simplifyVirtualKeyCodes ifTrue: [#squeak3] ifFalse: [#'VK_OEM_7']).<br>> - "Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the single-quote/double-quote key"<br>> - <br>> - 16rDF -> #'VK_OEM_8'.<br>> - "Used for miscellaneous characters; it can vary by keyboard."<br>> - <br>> - 16rE0 -> nil.<br>> - 16rE1 -> nil.<br>> - <br>> - 16rE2 -> (self simplifyVirtualKeyCodes ifTrue: [#squeak4] ifFalse: [#'VK_OEM_102']). <br>> - "Either the angle bracket key or the backslash key on the RT 102-key keyboard"<br>> - <br>> - 16rE3 -> nil.<br>> - 16rE4 -> nil.<br>> - 16rE5 -> #'VK_PROCESSKEY'. "IME PROCESS key"<br>> - 16rE6 -> nil.<br>> - 16rE7 -> #'VK_PACKET'. "Used to pass Unicode characters as if they were keystrokes. The VK_PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods."<br>> - 16rE8 -> nil.<br>> - 16rE9 -> nil.<br>> - 16rEA -> nil.<br>> - 16rEB -> nil.<br>> - 16rEC -> nil.<br>> - 16rED -> nil.<br>> - 16rEE -> nil.<br>> - 16rEF -> nil.<br>> - 16rF0 -> nil.<br>> - 16rF1 -> nil.<br>> - 16rF2 -> nil.<br>> - 16rF3 -> nil.<br>> - 16rF4 -> nil.<br>> - 16rF5 -> nil.<br>> - 16rF6 -> #'VK_ATTN'.<br>> - 16rF7 -> #'VK_CRSEL'.<br>> - 16rF8 -> #'VK_EXSEL'.<br>> - 16rF9 -> #'VK_EREOF'. "Erase EOF key"<br>> - 16rFA -> #'VK_PLAY'.<br>> - 16rFB -> #'VK_ZOOM'.<br>> - 16rFC -> #'VK_NONAME'. "Reserved"<br>> - 16rFD -> #'VK_PA1'.<br>> - 16rFE -> #'VK_OEM_CLEAR'. "Clear key"<br>> - <br>> - }!<br>> <br>> Item was changed:<br>>   ----- Method: EventSensor class>>virtualKeysOnX11 (in category 'virtual keys') -----<br>>   virtualKeysOnX11<br>>        "Based on the OSVM X11 code as of 202104182333"<br>>         "https://code.woboq.org/kde/include/X11/keysymdef.h.html"<br>>   <br>>      "!!!!!! There are non-printable control keys for keyDown events on X11. Sigh."<br>>          self flag: #todo. "Linux VM is broken. We need scancodes but we get actual character codes. It is really hard to determine physical keys from that."<br>> -  ^ {<br>>   <br>> +    ^ Dictionary newFromPairs: {<br>> +            "Regular ASCII"<br>> +               16r41 . $A.<br>> +             16r42 . $B.<br>> +             16r43 . $C.<br>> +             16r44 . $D.<br>> +             16r45 . $E.<br>> +             16r46 . $F.<br>> +             16r47 . $G.<br>> +             16r48 . $H.<br>> +             16r49 . $I.<br>> +             16r4A . $J.<br>> +             16r4B . $K.<br>> +             16r4C . $L.<br>> +             16r4D . $M.<br>> +             16r4E . $N.<br>> +             16r4F . $O.<br>> +             16r50 . $P.<br>> +             16r51 . $Q.<br>> +             16r52 . $R.<br>> +             16r53 . $S.<br>> +             16r54 . $T.<br>> +             16r55 . $U.<br>> +             16r56 . $V.<br>> +             16r57 . $W.<br>> +             16r58 . $X.<br>> +             16r59 . $Y.<br>> +             16r5A . $Z.<br>> - "Regular ASCII"<br>> - 16r41 -> $A.<br>> - 16r42 -> $B.<br>> - 16r43 -> $C.<br>> - 16r44 -> $D.<br>> - 16r45 -> $E.<br>> - 16r46 -> $F.<br>> - 16r47 -> $G.<br>> - 16r48 -> $H.<br>> - 16r49 -> $I.<br>> - 16r4A -> $J.<br>> - 16r4B -> $K.<br>> - 16r4C -> $L.<br>> - 16r4D -> $M.<br>> - 16r4E -> $N.<br>> - 16r4F -> $O.<br>> - 16r50 -> $P.<br>> - 16r51 -> $Q.<br>> - 16r52 -> $R.<br>> - 16r53 -> $S.<br>> - 16r54 -> $T.<br>> - 16r55 -> $U.<br>> - 16r56 -> $V.<br>> - 16r57 -> $W.<br>> - 16r58 -> $X.<br>> - 16r59 -> $Y.<br>> - 16r5A -> $Z.<br>>   <br>> +          "Regular ASCII - numbers"<br>> +             16r30 . $0.<br>> +             16r31 . $1.<br>> +             16r32 . $2.<br>> +             16r33 . $3.<br>> +             16r34 . $4.<br>> +             16r35 . $5.<br>> +             16r36 . $6.<br>> +             16r37 . $7.<br>> +             16r38 . $8.<br>> +             16r39 . $9.<br>> - "Regular ASCII - numbers"<br>> - 16r30 -> $0.<br>> - 16r31 -> $1.<br>> - 16r32 -> $2.<br>> - 16r33 -> $3.<br>> - 16r34 -> $4.<br>> - 16r35 -> $5.<br>> - 16r36 -> $6.<br>> - 16r37 -> $7.<br>> - 16r38 -> $8.<br>> - 16r39 -> $9.<br>>   <br>> +                "Mapped to uppercase when SHIFT is pressed ... sigh ..."<br>> +              16r61 . $A.<br>> +             16r62 . $B.<br>> +             16r63 . $C.<br>> +             16r64 . $D.<br>> +             16r65 . $E.<br>> +             16r66 . $F.<br>> +             16r67 . $G.<br>> +             16r68 . $H.<br>> +             16r69 . $I.<br>> +             16r6A . $J.<br>> +             16r6B . $K.<br>> +             16r6C . $L.<br>> +             16r6D . $M.<br>> +             16r6E . $N.<br>> +             16r6F . $O.<br>> +             16r70 . $P.<br>> +             16r71 . $Q.<br>> +             16r72 . $R.<br>> +             16r73 . $S.<br>> +             16r74 . $T.<br>> +             16r75 . $U.<br>> +             16r76 . $V.<br>> +             16r77 . $W.<br>> +             16r78 . $X.<br>> +             16r79 . $Y.<br>> +             16r7A . $Z.<br>> - "Mapped to uppercase when SHIFT is pressed ... sigh ..."<br>> - 16r61 -> $A.<br>> - 16r62 -> $B.<br>> - 16r63 -> $C.<br>> - 16r64 -> $D.<br>> - 16r65 -> $E.<br>> - 16r66 -> $F.<br>> - 16r67 -> $G.<br>> - 16r68 -> $H.<br>> - 16r69 -> $I.<br>> - 16r6A -> $J.<br>> - 16r6B -> $K.<br>> - 16r6C -> $L.<br>> - 16r6D -> $M.<br>> - 16r6E -> $N.<br>> - 16r6F -> $O.<br>> - 16r70 -> $P.<br>> - 16r71 -> $Q.<br>> - 16r72 -> $R.<br>> - 16r73 -> $S.<br>> - 16r74 -> $T.<br>> - 16r75 -> $U.<br>> - 16r76 -> $V.<br>> - 16r77 -> $W.<br>> - 16r78 -> $X.<br>> - 16r79 -> $Y.<br>> - 16r7A -> $Z.<br>>   <br>> +                 "most common non-printable control characters"<br>> +                16r01 . Character home.<br>> +                 16r03 . Character enter.<br>> +                16r04 . Character end.<br>> +          16r05 . Character insert.<br>> +               16r08 . Character backspace.<br>> +            16r09 . Character tab.<br>> +          16r0B . Character pageUp.<br>> +               16r0C . Character pageDown.<br>> +             16r0D . Character return.<br>> +               16r1B . Character escape.<br>> +               16r1C . Character arrowLeft.<br>> +            16r1D . Character arrowRight.<br>> +           16r1E . Character arrowUp.<br>> +              16r1F . Character arrowDown.<br>> +            16r20 . Character space.<br>> - "most common non-printable control characters"<br>> - 16r01 -> Character home.<br>> - 16r03 -> Character enter.<br>> - 16r04 -> Character end.<br>> - 16r05 -> Character insert.<br>> - 16r08 -> Character backspace.<br>> - 16r09 -> Character tab.<br>> - 16r0B -> Character pageUp.<br>> - 16r0C -> Character pageDown.<br>> - 16r0D -> Character return.<br>> - 16r1B -> Character escape.<br>> - 16r1C -> Character arrowLeft.<br>> - 16r1D -> Character arrowRight.<br>> - 16r1E -> Character arrowUp.<br>> - 16r1F -> Character arrowDown.<br>> - 16r20 -> Character space.<br>>   <br>> +              16r7F . Character delete.<br>> - 16r7F -> Character delete.<br>>   <br>> +                "Physical modifier keys"<br>> +              16rF7 . (self mapAltKeysToOptionKeys ifTrue: [#option] ifFalse: [#command "aka. #alt"]). "#'XK_Alt_L'"<br>> +              16rFE . #shift. "#'XK_Shift_R'"<br>> +               16rFF . #shift. "#'XK_Shift_L'."<br>> +              16rFA .  (self mapControlKeysToCommandKeys ifTrue: [#command] ifFalse: [#control]). "#'XK_Control_R'"<br>> +                 16rFB .  (self mapControlKeysToCommandKeys ifTrue: [#command] ifFalse: [#control]). "#'XK_Control_L'."<br>> +                16rFD . #capsLock. "#'XK_Caps_Lock'."<br>> - "Physical modifier keys"<br>> - 16rF7 -> (self mapAltKeysToOptionKeys ifTrue: [#option] ifFalse: [#command "aka. #alt"]). "#'XK_Alt_L'"<br>> - 16rFE -> #shift. "#'XK_Shift_R'"<br>> - 16rFF -> #shift. "#'XK_Shift_L'."<br>> - 16rFA ->  (self mapControlKeysToCommandKeys ifTrue: [#command] ifFalse: [#control]). "#'XK_Control_R'"<br>> - 16rFB ->  (self mapControlKeysToCommandKeys ifTrue: [#command] ifFalse: [#control]). "#'XK_Control_L'."<br>> - 16rFD -> #capsLock. "#'XK_Caps_Lock'."<br>>   <br>> +            "Try to make sense of some other key characters. Hmpf."<br>> +               16r22 . #squeak1.<br>> +               16r23 . #squeak1.<br>> +               16r27 . #squeak1.<br>> +               16r2D . #squeak1.<br>> +               16r2F . #squeak1.<br>> +               16r3A . #squeak1.<br>> +               16r3B . #squeak1.<br>> +               16r3C . #squeak1.<br>> +               16r3E . #squeak1.<br>> +               16r3F . #squeak1.<br>> +               16r5B . #squeak1.<br>> +               16r5C . #squeak1.<br>> +               16r5E . #squeak1.<br>> +               16r5F . #squeak1.<br>> +               16r60 . #squeak1.<br>> +               16r7B . #squeak1.<br>> +               16r7C . #squeak1.<br>> +               16r7E . #squeak1.<br>> +               16rC2 . #squeak1.<br>> +               16rC3 . #squeak1.<br>> - "Try to make sense of some other key characters. Hmpf."<br>> - 16r22 -> #squeak1.<br>> - 16r23 -> #squeak1.<br>> - 16r27 -> #squeak1.<br>> - 16r2D -> #squeak1.<br>> - 16r2F -> #squeak1.<br>> - 16r3A -> #squeak1.<br>> - 16r3B -> #squeak1.<br>> - 16r3C -> #squeak1.<br>> - 16r3E -> #squeak1.<br>> - 16r3F -> #squeak1.<br>> - 16r5B -> #squeak1.<br>> - 16r5C -> #squeak1.<br>> - 16r5E -> #squeak1.<br>> - 16r5F -> #squeak1.<br>> - 16r60 -> #squeak1.<br>> - 16r7B -> #squeak1.<br>> - 16r7C -> #squeak1.<br>> - 16r7E -> #squeak1.<br>> - 16rC2 -> #squeak1.<br>> - 16rC3 -> #squeak1.<br>>   <br>> +            16r2A . #squeak2.<br>> +               16r2B . #squeak2.<br>> +               16r3D . #squeak2.<br>> +               16r5D . #squeak2.<br>> +               16r7D . #squeak2.<br>> - 16r2A -> #squeak2.<br>> - 16r2B -> #squeak2.<br>> - 16r3D -> #squeak2.<br>> - 16r5D -> #squeak2.<br>> - 16r7D -> #squeak2.<br>>   <br>> +                16r2C . #squeakComma.<br>> +           16r2E . #squeakPeriod.<br>> +  }<br>> - 16r2C -> #squeakComma.<br>> - 16r2E -> #squeakPeriod.<br>>   <br>> + !<br>> -       }!<br>> <br>> <br><br><br></div></blockquote></div>