Wow,

thanks, Guillermo, it’s working.

Uko

On 24 Jun 2014, at 12:49, Guillermo Polito <[email protected]> wrote:

> Actually in latest Pharo keyboard events are extended to get the pressed key:
> 
> key
>       ^Smalltalk os keyForValue: keyValue
> 
> I tested it in windows, mac and unix some time ago and it used to work :)
> 
> On Tue, Jun 24, 2014 at 10:18 AM, [email protected] <[email protected]> 
> wrote:
> On Tue, Jun 24, 2014 at 10:07 AM, Yuriy Tymchuk <[email protected]> wrote:
> Hi everyone,
> 
> sorry, if I’m annoying with this question, but is there a way to handle 
> keyboard events (on mac) in a normal way? Because keyUp and keyDown do not 
> have any information about the key itself. I know that it’s a long story also 
> related with vm but maybe someone made some hacks to solve this problem?
> 
> Cheers
> Uko
> 
> The logic is in sqSqueakOSXApplication+events.m
> 
> Now, I do not have the latest version but it is true that keyUp and keyDown 
> are not handled very nicely there.
> 
> KeyDown doesn't seem to have any code (but one could set something there as 
> the code is available). KeyUp has something.
> 
> I do not know why things are done this way. There may be side effects in the 
> VM if one changes the way things are...
> 
> Good luck.
> 
>  (void) recordCharEvent:(NSString *) unicodeString fromView: 
> (NSView<sqSqueakOSXView> *) mainView {
>       sqKeyboardEvent evt;
>       unichar unicode;
>       unsigned char macRomanCharacter;
>       NSInteger       i;
>       NSRange picker;
>       NSUInteger totaLength;
>       
>       evt.type = EventTypeKeyboard;
>       evt.timeStamp = (int) ioMSecs();
>       picker.location = 0;
>       picker.length = 1;
>       totaLength = [unicodeString length];
>       for (i=0;i < totaLength;i++) {
>               
>               
>               unicode = [unicodeString characterAtIndex: i];
>               
>               if ([mainView lastSeenKeyBoardStrokeDetails]) {
>                       evt.modifiers = [self 
> translateCocoaModifiersToSqueakModifiers: [[mainView 
> lastSeenKeyBoardStrokeDetails] modifierFlags]];
>                       evt.charCode = [[mainView 
> lastSeenKeyBoardStrokeDetails] keyCode];
>               } else {
>                       evt.modifiers = 0;
>                       evt.charCode = 0;
>               }
>               
>               if ((evt.modifiers & CommandKeyBit) && (evt.modifiers & 
> ShiftKeyBit)) {  /* command and shift */
>             if ((unicode >= 97) && (unicode <= 122)) {
>                               /* convert ascii code of command-shift-letter 
> to upper case */
>                               unicode = unicode - 32;
>             }
>               }
>               
>               NSString *lookupString = [[NSString alloc] initWithCharacters: 
> &unicode length: 1];
>               [lookupString getBytes: &macRomanCharacter maxLength: 1 
> usedLength: NULL encoding: NSMacOSRomanStringEncoding
>                                          options: 0 range: picker 
> remainingRange: NULL];
>               [lookupString release];
>               
>               evt.pressCode = EventKeyDown;
>               unsigned short keyCodeRemembered = evt.charCode;
>               evt.utf32Code = 0;
>               evt.reserved1 = 0;
>               evt.windowIndex = (int)[[mainView windowLogic] windowIndex];
>               [self pushEventToQueue: (sqInputEvent *)&evt];
>               
>               evt.charCode =  macRomanCharacter;
>               evt.pressCode = EventKeyChar;
>               evt.modifiers = evt.modifiers;          
>               evt.utf32Code = unicode;
>               
>               [self pushEventToQueue: (sqInputEvent *) &evt];
>               
>               if (i > 1 || ![mainView lastSeenKeyBoardStrokeDetails]) {
>                       evt.pressCode = EventKeyUp;
>                       evt.charCode = keyCodeRemembered;
>                       evt.utf32Code = 0;
>                       [self pushEventToQueue: (sqInputEvent *) &evt];
>               }
>       }
>       
>       
> interpreterProxy->signalSemaphoreWithIndex(gDelegateApp.squeakApplication.inputSemaphoreIndex);
> 
> } 
> 
> --Phil
> 
> 

Reply via email to