On Tue, Jun 24, 2014 at 10:07 AM, Yuriy Tymchuk <yuriy.tymc...@me.com> 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