From b671394fd51181a07b894e120f5b7053c4ded358 Mon Sep 17 00:00:00 2001 From: Cimarron Mittelsteadt Date: Thu, 21 Mar 2013 20:12:32 -0700 Subject: [PATCH 1/3] Added modifier key event handling for the macosx backend and cleaned up key event handler. --- src/_macosx.m | 118 +++++++++++++++++++++++++++----------------------- 1 file changed, 65 insertions(+), 53 deletions(-) diff --git a/src/_macosx.m b/src/_macosx.m index 7fd5f9afa4aa..f5aac22816cd 100644 --- a/src/_macosx.m +++ b/src/_macosx.m @@ -391,7 +391,7 @@ - (const char*)convertKeyEvent:(NSEvent*)event; - (void)keyDown:(NSEvent*)event; - (void)keyUp:(NSEvent*)event; - (void)scrollWheel:(NSEvent *)event; -- (void)flagsChanged:(NSEvent*)event; +//- (void)flagsChanged:(NSEvent*)event; @end @interface ScrollableButton : NSButton @@ -5439,66 +5439,75 @@ - (void)removeRubberband rubberband = NSZeroRect; } + + - (const char*)convertKeyEvent:(NSEvent*)event { - NSString* text = [event charactersIgnoringModifiers]; - unichar uc = [text characterAtIndex:0]; - int i = (int)uc; - if ([event modifierFlags] & NSNumericPadKeyMask) - { - if (i > 256) - { - if (uc==NSLeftArrowFunctionKey) return "left"; - else if (uc==NSUpArrowFunctionKey) return "up"; - else if (uc==NSRightArrowFunctionKey) return "right"; - else if (uc==NSDownArrowFunctionKey) return "down"; - else if (uc==NSF1FunctionKey) return "f1"; - else if (uc==NSF2FunctionKey) return "f2"; - else if (uc==NSF3FunctionKey) return "f3"; - else if (uc==NSF4FunctionKey) return "f4"; - else if (uc==NSF5FunctionKey) return "f5"; - else if (uc==NSF6FunctionKey) return "f6"; - else if (uc==NSF7FunctionKey) return "f7"; - else if (uc==NSF8FunctionKey) return "f8"; - else if (uc==NSF9FunctionKey) return "f9"; - else if (uc==NSF10FunctionKey) return "f10"; - else if (uc==NSF11FunctionKey) return "f11"; - else if (uc==NSF12FunctionKey) return "f12"; - else if (uc==NSScrollLockFunctionKey) return "scroll_lock"; - else if (uc==NSBreakFunctionKey) return "break"; - else if (uc==NSInsertFunctionKey) return "insert"; - else if (uc==NSDeleteFunctionKey) return "delete"; - else if (uc==NSHomeFunctionKey) return "home"; - else if (uc==NSEndFunctionKey) return "end"; - else if (uc==NSPageUpFunctionKey) return "pageup"; - else if (uc==NSPageDownFunctionKey) return "pagedown"; - } - else if ((char)uc == '.') return "dec"; - } - - switch (i) - { - case 127: return "backspace"; - case 13: return "enter"; - case 3: return "enter"; - case 27: return "escape"; - default: - { - static char s[2]; - s[0] = (char)uc; - s[1] = '\0'; - return (const char*)s; - } - } + NSDictionary* specialkeymappings = @{ + @(NSLeftArrowFunctionKey): @"left", + @(NSRightArrowFunctionKey): @"right", + @(NSUpArrowFunctionKey): @"up", + @(NSDownArrowFunctionKey): @"down", + @(NSF1FunctionKey): @"f1", + @(NSF2FunctionKey): @"f2", + @(NSF3FunctionKey): @"f3", + @(NSF4FunctionKey): @"f4", + @(NSF5FunctionKey): @"f5", + @(NSF6FunctionKey): @"f6", + @(NSF7FunctionKey): @"f7", + @(NSF8FunctionKey): @"f8", + @(NSF9FunctionKey): @"f9", + @(NSF10FunctionKey): @"f10", + @(NSF11FunctionKey): @"f11", + @(NSF12FunctionKey): @"f12", + @(NSF13FunctionKey): @"f13", + @(NSF14FunctionKey): @"f14", + @(NSF15FunctionKey): @"f15", + @(NSF16FunctionKey): @"f16", + @(NSF17FunctionKey): @"f17", + @(NSF18FunctionKey): @"f18", + @(NSF19FunctionKey): @"f19", + @(NSScrollLockFunctionKey): @"scroll_lock", + @(NSBreakFunctionKey): @"break", + @(NSInsertFunctionKey): @"insert", + @(NSDeleteFunctionKey): @"delete", + @(NSHomeFunctionKey): @"home", + @(NSEndFunctionKey): @"end", + @(NSPageDownFunctionKey): @"pagedown", + @(NSPageUpFunctionKey): @"pageup", + @(NSDeleteCharacter): @"backspace", + @(NSEnterCharacter): @"enter", + @(NSTabCharacter): @"tab", + @(NSCarriageReturnCharacter): @"enter", + @(NSBackTabCharacter): @"backtab", + @27: @"escape" + }; + + NSMutableString* returnkey = [NSMutableString string]; + if ([event modifierFlags] & NSControlKeyMask) + [returnkey appendString:@"ctrl+" ]; + if ([event modifierFlags] & NSAlternateKeyMask) + [returnkey appendString:@"alt+" ]; + if ([event modifierFlags] & NSCommandKeyMask) + [returnkey appendString:@"cmd+" ]; + if ([event modifierFlags] & NSShiftKeyMask) + [returnkey appendString:@"shift+" ]; + + unichar uc = [[event charactersIgnoringModifiers] characterAtIndex:0]; + NSString* specialchar = [specialkeymappings objectForKey:@(uc)]; + // NSString* specialchar = specialkeymappings[@(uc)]; + if (specialchar) + [returnkey appendString:specialchar]; + else + [returnkey appendString:[event charactersIgnoringModifiers]]; - return NULL; + return [returnkey UTF8String]; } - (void)keyDown:(NSEvent*)event { PyObject* result; const char* s = [self convertKeyEvent: event]; - /* TODO: Handle ctrl, alt, super modifiers. qt4 has implemented these. */ PyGILState_STATE gstate = PyGILState_Ensure(); if (s==NULL) { @@ -5520,7 +5529,6 @@ - (void)keyUp:(NSEvent*)event { PyObject* result; const char* s = [self convertKeyEvent: event]; - /* TODO: Handle ctrl, alt, super modifiers. qt4 has implemented these. */ PyGILState_STATE gstate = PyGILState_Ensure(); if (s==NULL) { @@ -5561,6 +5569,9 @@ - (void)scrollWheel:(NSEvent*)event PyGILState_Release(gstate); } +/* This is all wrong. Address of pointer is being passed instead of pointer, keynames don't + match up with what the front-end and does the front-end even handle modifier keys by themselves? + - (void)flagsChanged:(NSEvent*)event { const char *s = NULL; @@ -5580,6 +5591,7 @@ - (void)flagsChanged:(NSEvent*)event PyGILState_Release(gstate); } + */ @end @implementation ScrollableButton From 5de4ed715d8902a425b628e2d3233a633ca66682 Mon Sep 17 00:00:00 2001 From: Cimarron Mittelsteadt Date: Mon, 25 Mar 2013 20:54:54 -0700 Subject: [PATCH 2/3] Updated to not use NSDictionary literals for pre-obj2.0 compiler support. --- src/_macosx.m | 82 +++++++++++++++++++++++++-------------------------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/src/_macosx.m b/src/_macosx.m index f5aac22816cd..0319a52c9d0b 100644 --- a/src/_macosx.m +++ b/src/_macosx.m @@ -5443,45 +5443,46 @@ - (void)removeRubberband - (const char*)convertKeyEvent:(NSEvent*)event { - NSDictionary* specialkeymappings = @{ - @(NSLeftArrowFunctionKey): @"left", - @(NSRightArrowFunctionKey): @"right", - @(NSUpArrowFunctionKey): @"up", - @(NSDownArrowFunctionKey): @"down", - @(NSF1FunctionKey): @"f1", - @(NSF2FunctionKey): @"f2", - @(NSF3FunctionKey): @"f3", - @(NSF4FunctionKey): @"f4", - @(NSF5FunctionKey): @"f5", - @(NSF6FunctionKey): @"f6", - @(NSF7FunctionKey): @"f7", - @(NSF8FunctionKey): @"f8", - @(NSF9FunctionKey): @"f9", - @(NSF10FunctionKey): @"f10", - @(NSF11FunctionKey): @"f11", - @(NSF12FunctionKey): @"f12", - @(NSF13FunctionKey): @"f13", - @(NSF14FunctionKey): @"f14", - @(NSF15FunctionKey): @"f15", - @(NSF16FunctionKey): @"f16", - @(NSF17FunctionKey): @"f17", - @(NSF18FunctionKey): @"f18", - @(NSF19FunctionKey): @"f19", - @(NSScrollLockFunctionKey): @"scroll_lock", - @(NSBreakFunctionKey): @"break", - @(NSInsertFunctionKey): @"insert", - @(NSDeleteFunctionKey): @"delete", - @(NSHomeFunctionKey): @"home", - @(NSEndFunctionKey): @"end", - @(NSPageDownFunctionKey): @"pagedown", - @(NSPageUpFunctionKey): @"pageup", - @(NSDeleteCharacter): @"backspace", - @(NSEnterCharacter): @"enter", - @(NSTabCharacter): @"tab", - @(NSCarriageReturnCharacter): @"enter", - @(NSBackTabCharacter): @"backtab", - @27: @"escape" - }; + NSDictionary* specialkeymappings = [NSDictionary dictionaryWithObjectsAndKeys: + @"left", [NSNumber numberWithUnsignedLong:NSLeftArrowFunctionKey], + @"right", [NSNumber numberWithUnsignedLong:NSRightArrowFunctionKey], + @"up", [NSNumber numberWithUnsignedLong:NSUpArrowFunctionKey], + @"down", [NSNumber numberWithUnsignedLong:NSDownArrowFunctionKey], + @"f1", [NSNumber numberWithUnsignedLong:NSF1FunctionKey], + @"f2", [NSNumber numberWithUnsignedLong:NSF2FunctionKey], + @"f3", [NSNumber numberWithUnsignedLong:NSF3FunctionKey], + @"f4", [NSNumber numberWithUnsignedLong:NSF4FunctionKey], + @"f5", [NSNumber numberWithUnsignedLong:NSF5FunctionKey], + @"f6", [NSNumber numberWithUnsignedLong:NSF6FunctionKey], + @"f7", [NSNumber numberWithUnsignedLong:NSF7FunctionKey], + @"f8", [NSNumber numberWithUnsignedLong:NSF8FunctionKey], + @"f9", [NSNumber numberWithUnsignedLong:NSF9FunctionKey], + @"f10", [NSNumber numberWithUnsignedLong:NSF10FunctionKey], + @"f11", [NSNumber numberWithUnsignedLong:NSF11FunctionKey], + @"f12", [NSNumber numberWithUnsignedLong:NSF12FunctionKey], + @"f13", [NSNumber numberWithUnsignedLong:NSF13FunctionKey], + @"f14", [NSNumber numberWithUnsignedLong:NSF14FunctionKey], + @"f15", [NSNumber numberWithUnsignedLong:NSF15FunctionKey], + @"f16", [NSNumber numberWithUnsignedLong:NSF16FunctionKey], + @"f17", [NSNumber numberWithUnsignedLong:NSF17FunctionKey], + @"f18", [NSNumber numberWithUnsignedLong:NSF18FunctionKey], + @"f19", [NSNumber numberWithUnsignedLong:NSF19FunctionKey], + @"scroll_lock", [NSNumber numberWithUnsignedLong:NSScrollLockFunctionKey], + @"break", [NSNumber numberWithUnsignedLong:NSBreakFunctionKey], + @"insert", [NSNumber numberWithUnsignedLong:NSInsertFunctionKey], + @"delete", [NSNumber numberWithUnsignedLong:NSDeleteFunctionKey], + @"home", [NSNumber numberWithUnsignedLong:NSHomeFunctionKey], + @"end", [NSNumber numberWithUnsignedLong:NSEndFunctionKey], + @"pagedown", [NSNumber numberWithUnsignedLong:NSPageDownFunctionKey], + @"pageup", [NSNumber numberWithUnsignedLong:NSPageUpFunctionKey], + @"backspace", [NSNumber numberWithUnsignedLong:NSDeleteCharacter], + @"enter", [NSNumber numberWithUnsignedLong:NSEnterCharacter], + @"tab", [NSNumber numberWithUnsignedLong:NSTabCharacter], + @"enter", [NSNumber numberWithUnsignedLong:NSCarriageReturnCharacter], + @"backtab", [NSNumber numberWithUnsignedLong:NSBackTabCharacter], + @"escape", [NSNumber numberWithUnsignedLong:27], + nil + ]; NSMutableString* returnkey = [NSMutableString string]; if ([event modifierFlags] & NSControlKeyMask) @@ -5494,8 +5495,7 @@ - (const char*)convertKeyEvent:(NSEvent*)event [returnkey appendString:@"shift+" ]; unichar uc = [[event charactersIgnoringModifiers] characterAtIndex:0]; - NSString* specialchar = [specialkeymappings objectForKey:@(uc)]; - // NSString* specialchar = specialkeymappings[@(uc)]; + NSString* specialchar = [specialkeymappings objectForKey:[NSNumber numberWithUnsignedLong:uc]]; if (specialchar) [returnkey appendString:specialchar]; else From 7574ed43203756498adc211c9dec9b1ce4506e06 Mon Sep 17 00:00:00 2001 From: Cimarron Mittelsteadt Date: Tue, 26 Mar 2013 16:54:17 -0700 Subject: [PATCH 3/3] Removed shift from modifier flags as the character returned already includes shift operation --- src/_macosx.m | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/_macosx.m b/src/_macosx.m index 0319a52c9d0b..12c41cdb205e 100644 --- a/src/_macosx.m +++ b/src/_macosx.m @@ -5491,8 +5491,6 @@ - (const char*)convertKeyEvent:(NSEvent*)event [returnkey appendString:@"alt+" ]; if ([event modifierFlags] & NSCommandKeyMask) [returnkey appendString:@"cmd+" ]; - if ([event modifierFlags] & NSShiftKeyMask) - [returnkey appendString:@"shift+" ]; unichar uc = [[event charactersIgnoringModifiers] characterAtIndex:0]; NSString* specialchar = [specialkeymappings objectForKey:[NSNumber numberWithUnsignedLong:uc]];