[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27524] trunk/blender/intern/ghost/intern/ GHOST_SystemCocoa.mm: Fix [#20419] OSX Cocoa physical punctuation keys retrieval fix

Damien Plisson damien.plisson at yahoo.fr
Mon Mar 15 21:38:04 CET 2010


Revision: 27524
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27524
Author:   damien78
Date:     2010-03-15 21:38:04 +0100 (Mon, 15 Mar 2010)

Log Message:
-----------
Fix [#20419] OSX Cocoa physical punctuation keys retrieval fix

Cocoa charactersIgnoringModifiers API still takes the Shift key into account. Fix is to use Apple new 10.5 Carbon(!) API that is 64bit compatible to take into account the international keyboard layout when retrieving the physical key pressed/released.
Needed to use an even older API for 10.4 builds.

Modified Paths:
--------------
    trunk/blender/intern/ghost/intern/GHOST_SystemCocoa.mm

Modified: trunk/blender/intern/ghost/intern/GHOST_SystemCocoa.mm
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_SystemCocoa.mm	2010-03-15 20:28:13 UTC (rev 27523)
+++ trunk/blender/intern/ghost/intern/GHOST_SystemCocoa.mm	2010-03-15 20:38:04 UTC (rev 27524)
@@ -29,6 +29,9 @@
 
 #import <Cocoa/Cocoa.h>
 
+/*For the currently not ported to Cocoa keyboard layout functions (64bit & 10.6 compatible)*/
+#include <Carbon/Carbon.h>
+
 #include <sys/time.h>
 #include <sys/types.h>
 #include <sys/sysctl.h>
@@ -53,9 +56,8 @@
 #include "AssertMacros.h"
 
 #pragma mark KeyMap, mouse converters
-
-
-/* Keycodes from Carbon include file */
+#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4
+/* Keycodes not defined in Tiger */
 /*  
  *  Summary:
  *    Virtual keycodes
@@ -203,8 +205,8 @@
 	kVK_JIS_Eisu                  = 0x66,
 	kVK_JIS_Kana                  = 0x68
 };
+#endif
 
-
 static GHOST_TButtonMask convertButton(int button)
 {
 	switch (button) {
@@ -230,7 +232,7 @@
  * @param recvChar the character ignoring modifiers (except for shift)
  * @return Ghost key code
  */
-static GHOST_TKey convertKey(int rawCode, unichar recvChar) 
+static GHOST_TKey convertKey(int rawCode, unichar recvChar, UInt16 keyAction) 
 {	
 	
 	//printf("\nrecvchar %c 0x%x",recvChar,recvChar);
@@ -350,26 +352,68 @@
 			return GHOST_kKeyUnknown;
 			
 		default:
-			/*Then detect on character value for "remappable" keys in int'l keyboards*/
+			/* alphanumerical or punctuation key that is remappable in int'l keyboards */
 			if ((recvChar >= 'A') && (recvChar <= 'Z')) {
 				return (GHOST_TKey) (recvChar - 'A' + GHOST_kKeyA);
 			} else if ((recvChar >= 'a') && (recvChar <= 'z')) {
 				return (GHOST_TKey) (recvChar - 'a' + GHOST_kKeyA);
-			} else
-			switch (recvChar) {
-				case '-': 	return GHOST_kKeyMinus;
-				case '=': 	return GHOST_kKeyEqual;
-				case ',': 	return GHOST_kKeyComma;
-				case '.': 	return GHOST_kKeyPeriod;
-				case '/': 	return GHOST_kKeySlash;
-				case ';': 	return GHOST_kKeySemicolon;
-				case '\'': 	return GHOST_kKeyQuote;
-				case '\\': 	return GHOST_kKeyBackslash;
-				case '[': 	return GHOST_kKeyLeftBracket;
-				case ']': 	return GHOST_kKeyRightBracket;
-				case '`': 	return GHOST_kKeyAccentGrave;
-				default:
-					return GHOST_kKeyUnknown;
+			} else {
+#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4
+				KeyboardLayoutRef keyLayout;
+				UCKeyboardLayout *uchrData;
+				
+				KLGetCurrentKeyboardLayout(&keyLayout);
+				KLGetKeyboardLayoutProperty(keyLayout, kKLuchrData, (const void **)
+											&uchrData);
+				/*get actual character value of the "remappable" keys in int'l keyboards,
+				 if keyboard layout is not correctly reported (e.g. some non Apple keyboards in Tiger),
+				 then fallback on using the received charactersIgnoringModifiers */
+				if (uchrData)
+				{
+					UInt32 deadKeyState=0;
+					UniCharCount actualStrLength=0;
+					
+					UCKeyTranslate(uchrData, rawCode, keyAction, 0,
+								   LMGetKbdType(), kUCKeyTranslateNoDeadKeysBit, &deadKeyState, 1, &actualStrLength, &recvChar);
+					
+				}				
+#else
+				/* Leopard and Snow Leopard 64bit compatible API*/
+				CFDataRef uchrHandle; /*the keyboard layout*/
+				TISInputSourceRef kbdTISHandle;
+				
+				kbdTISHandle = TISCopyCurrentKeyboardLayoutInputSource();
+				uchrHandle = (CFDataRef)TISGetInputSourceProperty(kbdTISHandle,kTISPropertyUnicodeKeyLayoutData);
+				CFRelease(kbdTISHandle);
+				
+				/*get actual character value of the "remappable" keys in int'l keyboards,
+				 if keyboard layout is not correctly reported (e.g. some non Apple keyboards in Tiger),
+				 then fallback on using the received charactersIgnoringModifiers */
+				if (uchrHandle)
+				{
+					UInt32 deadKeyState=0;
+					UniCharCount actualStrLength=0;
+					
+					UCKeyTranslate((UCKeyboardLayout*)CFDataGetBytePtr(uchrHandle), rawCode, keyAction, 0,
+								   LMGetKbdType(), kUCKeyTranslateNoDeadKeysBit, &deadKeyState, 1, &actualStrLength, &recvChar);
+					
+				}
+#endif
+				switch (recvChar) {
+					case '-': 	return GHOST_kKeyMinus;
+					case '=': 	return GHOST_kKeyEqual;
+					case ',': 	return GHOST_kKeyComma;
+					case '.': 	return GHOST_kKeyPeriod;
+					case '/': 	return GHOST_kKeySlash;
+					case ';': 	return GHOST_kKeySemicolon;
+					case '\'': 	return GHOST_kKeyQuote;
+					case '\\': 	return GHOST_kKeyBackslash;
+					case '[': 	return GHOST_kKeyLeftBracket;
+					case ']': 	return GHOST_kKeyRightBracket;
+					case '`': 	return GHOST_kKeyAccentGrave;
+					default:
+						return GHOST_kKeyUnknown;
+				}
 			}
 	}
 	return GHOST_kKeyUnknown;
@@ -1573,9 +1617,11 @@
 			charsIgnoringModifiers = [event charactersIgnoringModifiers];
 			if ([charsIgnoringModifiers length]>0)
 				keyCode = convertKey([event keyCode],
-									 [charsIgnoringModifiers characterAtIndex:0]);
+									 [charsIgnoringModifiers characterAtIndex:0],
+									 [event type] == NSKeyDown?kUCKeyActionDown:kUCKeyActionUp);
 			else
-				keyCode = convertKey([event keyCode],0);
+				keyCode = convertKey([event keyCode],0,
+									 [event type] == NSKeyDown?kUCKeyActionDown:kUCKeyActionUp);
 
 				
 			characters = [event characters];
@@ -1595,9 +1641,10 @@
 
 			if ([event type] == NSKeyDown) {
 				pushEvent( new GHOST_EventKey([event timestamp]*1000, GHOST_kEventKeyDown, window, keyCode, ascii) );
-				//printf("\nKey pressed keyCode=%u ascii=%i %c",keyCode,ascii,ascii);
+				//printf("\nKey down rawCode=0x%x charsIgnoringModifiers=%c keyCode=%u ascii=%i %c",[event keyCode],[charsIgnoringModifiers length]>0?[charsIgnoringModifiers characterAtIndex:0]:' ',keyCode,ascii,ascii);
 			} else {
 				pushEvent( new GHOST_EventKey([event timestamp]*1000, GHOST_kEventKeyUp, window, keyCode, ascii) );
+				//printf("\nKey up rawCode=0x%x charsIgnoringModifiers=%c keyCode=%u ascii=%i %c",[event keyCode],[charsIgnoringModifiers length]>0?[charsIgnoringModifiers characterAtIndex:0]:' ',keyCode,ascii,ascii);
 			}
 			break;
 	





More information about the Bf-blender-cvs mailing list