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 > >
