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. |
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 ======================================================================== === |
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 - |
Free forum by Nabble | Edit this page |