Key values in Tweak platform-dependend?

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Key values in Tweak platform-dependend?

Stefan-53
Hi folks,

We are 3 students trying to implement a lil' game in Tweak. In doing so,
we have to catch keyboard events using a method like:

onKeyDown: event
    | keyValue |
    <on: keyDown>
    keyValue := event keyValue.
   
Thereby the value of keyValue differs in dependency of the underlying
OS. On Windows the keyValue equals the ASCII-values ('A' = 65). On Mac
OS we get completely different values, e.g., an 'A' results in 0.

Currently we work around that problem by checking Smalltalk
platformName. Does someone know another (and better ;) ) way to resolve it?

Thanks for your help.

Reply | Threaded
Open this post in threaded view
|

Re: Key values in Tweak platform-dependend?

johnmci
Well the VM's generate key down, key char and key up.  with repeating  
doing some odd dance according to what Windows thinks should be done.

Morphic considers a certain event and pulls data from it to  
distribute the keyboard events, you've likely noted which events  
morphic triggers on for keyboard input
is different from Tweak which considers a different set of events.

The macintosh carbon VM based on wishes from the tweak developers  
many years back resolved to.

        /* Put the sqKeyboardEvent for KeyDown */
                enterKeystroke ( EventTypeKeyboard, macKeyCode, EventKeyDown, 0,  
modifierBits);

Where macKeyCode is the magic number that matches to a key on the  
keyboard. Windows VM's I understand use a different magic number  
signalling the "A" key
was pressed.
For windows look at the virtual key codes http://msdn2.microsoft.com/ 
en-us/library/ms645540.aspx
For macintosh look at http://developer.apple.com/documentation/mac/ 
Text/Text-571.html#MARKER-9-18
               
         /* generate extra character event */
                enterKeystroke ( EventTypeKeyboard, macRomanCode, EventKeyChar,  
modifiedUniChar, modifierBits);

The mac vm for historical reasons returns a mapped MacRoman value as  
the key down, plus the Unicode value. It's possible that the MacRoman  
value will be zero.
I believe the windows vm also returns the macRomanCode for historical  
reasons to preserve the logic for high ascii mapping in 1996...

     /* Put the sqKeyboardEvent for KeyUp */
                if (!ISawRawKeyRepeat && (uniCharCount> 1 || (keyIndex < 0)))
                        enterKeystroke ( EventTypeKeyboard, macKeyCode, EventKeyUp, 0,  
modifierBits);



I had wanted to supply the unicode value for keyDown and keyUp  
because on some combinations of dead keys in Europe it is possible  
not to be able to determine
exactly what the key code is/was, or should be. However the tweak vm  
developers said it was impossible for Windows to provide that  
information at key up/down time so no changes were done. However  
users in Europe will find it's impossible to enter some clever  
keystroke combination via a Windows VM...


In Sophie we have a lookup table based on platform to provide the  
mapping to ascii

macintosh>>cursorKeys
        "Answer the default cursor keys to be used on this platform"
        ^self macVirtualKeycodes
                ifFalse: [super cursorKeys]
                ifTrue: [#(
                        ((123) moveCursorLeft)
                        ((124) moveCursorRight)
                        ((126) moveLineUp)
                        ((125) moveLineDown)
                        ((115) moveLineStart)
                        ((119) moveLineEnd)
                        ((116) movePageUp)
                        ((121) movePageDown)
                        ((shift 123) selectCursorLeft)
                        ((shift 124) selectCursorRight)
                        ((shift 126) selectLineUp)
                        ((shift 125) selectLineDown)
                        ((shift 115) selectLineStart)
                        ((shift 119) selectLineEnd)
                        ((opt 123) moveWordLeft)
                        ((opt 124) moveWordRight)
                        ((ctrl 123) moveWordLeft)
                        ((ctrl 124) moveWordRight)
                        ((cmd 123) moveWordLeft) "should be move line start?"
                        ((cmd 124) moveWordRight) "should be move line end?"
                        ((ctrl 126) scrollLineUp)
                        ((ctrl 125) scrollLineDown)
                        ((cmd 115) moveTextStart)
                        ((cmd 119) moveTextEnd)
                        ((ctrl 115) moveTextStart)
                        ((ctrl 119) moveTextEnd)
                        ((opt 115) moveTextStart)
                        ((opt 119) moveTextEnd)
                        ((cmd shift 123) selectWordLeft)
                        ((cmd shift 124) selectWordRight)
                        ((opt shift 123) selectWordLeft)
                        ((opt shift 124) selectWordRight)
                        ((cmd shift 115) selectTextStart)
                        ((cmd shift 119) selectTextEnd)
                        ((opt shift 115) selectTextStart)
                        ((opt shift 119) selectTextEnd)
                        ((ctrl shift 115) selectTextStart)
                        ((ctrl shift 119) selectTextEnd)
        ).]



windows>>cursorKeys
        "The standard cursor keys"   "HAH I wonder if all the keystrokes are  
here,   "
        ^#(
                        ((28) moveCursorLeft)
                        ((29) moveCursorRight)
                        ((30) moveLineUp)
                        ((31) moveLineDown)
                        ((1) moveLineStart)
                        ((4) moveLineEnd)
                        ((11) movePageUp)
                        ((12) movePageDown)
                        ((shift 28) selectCursorLeft)
                        ((shift 29) selectCursorRight)
                        ((shift 30) selectLineUp)
                        ((shift 31) selectLineDown)
                        ((shift 1) selectLineStart)
                        ((shift 4) selectLineEnd)
                        ((ctrl 28) moveWordLeft)
                        ((ctrl 29) moveWordRight)
                        ((ctrl 30) scrollLineUp)
                        ((ctrl 31) scrollLineDown)
                        ((ctrl 1) moveTextStart)
                        ((ctrl 4) moveTextEnd)
                        ((ctrl shift 28) selectWordLeft)
                        ((ctrl shift 29) selectWordRight)
                        "((ctrl shift 30) ---)
                        ((ctrl shift 31) ---)"
                        ((ctrl shift 1) selectTextStart)
                        ((ctrl shift 4) selectTextEnd)
        ).



On Jan 21, 2007, at 7:58 AM, Stefan wrote:

> Hi folks,
>
> We are 3 students trying to implement a lil' game in Tweak. In  
> doing so, we have to catch keyboard events using a method like:
>
> onKeyDown: event
>    | keyValue |
>    <on: keyDown>
>    keyValue := event keyValue.
>    Thereby the value of keyValue differs in dependency of the  
> underlying OS. On Windows the keyValue equals the ASCII-values ('A'  
> = 65). On Mac OS we get completely different values, e.g., an 'A'  
> results in 0.
>
> Currently we work around that problem by checking Smalltalk  
> platformName. Does someone know another (and better ;) ) way to  
> resolve it?
>
> Thanks for your help.
>

--
========================================================================
===
John M. McIntosh <[hidden email]>
Corporate Smalltalk Consulting Ltd.  http://www.smalltalkconsulting.com
========================================================================
===



Reply | Threaded
Open this post in threaded view
|

Re: Key values in Tweak platform-dependend?

Bert Freudenberg
In reply to this post by Stefan-53
Am Jan 21, 2007 um 16:58  schrieb Stefan:

> Hi folks,
>
> We are 3 students trying to implement a lil' game in Tweak. In  
> doing so, we have to catch keyboard events using a method like:
>
> onKeyDown: event
>    | keyValue |
>    <on: keyDown>
>    keyValue := event keyValue.
>    Thereby the value of keyValue differs in dependency of the  
> underlying OS. On Windows the keyValue equals the ASCII-values ('A'  
> = 65). On Mac OS we get completely different values, e.g., an 'A'  
> results in 0.
>
> Currently we work around that problem by checking Smalltalk  
> platformName. Does someone know another (and better ;) ) way to  
> resolve it?

Sure. See class CPlatform and subclasses. Just add your own keymaps  
there.

- Bert -