Handling keyboard events…

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

Handling keyboard events…

Uko2
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
Reply | Threaded
Open this post in threaded view
|

Re: Handling keyboard events…

philippeback
On Tue, Jun 24, 2014 at 10:07 AM, Yuriy Tymchuk <[hidden email]> 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 | Threaded
Open this post in threaded view
|

Re: Handling keyboard events…

Guillermo Polito
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, [hidden email] <[hidden email]> wrote:
On Tue, Jun 24, 2014 at 10:07 AM, Yuriy Tymchuk <[hidden email]> 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 | Threaded
Open this post in threaded view
|

Re: Handling keyboard events…

Uko2
Wow,

thanks, Guillermo, it’s working.

Uko

On 24 Jun 2014, at 12:49, Guillermo Polito <[hidden email]> 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, [hidden email] <[hidden email]> wrote:
On Tue, Jun 24, 2014 at 10:07 AM, Yuriy Tymchuk <[hidden email]> 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 | Threaded
Open this post in threaded view
|

Re: Handling keyboard events…

Stephan Eggermont-3
In reply to this post by Uko2
This pull request might be relevant:

https://github.com/pharo-project/pharo-vm/pull/49