diff options
author | Damien Plisson <damien.plisson@yahoo.fr> | 2009-10-26 11:43:24 +0300 |
---|---|---|
committer | Damien Plisson <damien.plisson@yahoo.fr> | 2009-10-26 11:43:24 +0300 |
commit | 21757e1161441f58726bd8ba8d67010fbcfcfe7d (patch) | |
tree | 448eadf3ec5a1bc6a87662c68758c0962ea9ed7b /intern/ghost | |
parent | 538697719ac296738a0349a4fd75d18930d81744 (diff) |
Cocoa / Mac:
- use Cocoa function to convert keys character value to isoLatin-1 encoding instead of the translation table. Works better with international keyboards
- enable stereo GL option
- fix source/creator CMake file to remove unneeded folders in the app bundle (the __MACOSX stuff). (Thx jensverwiebe)
Diffstat (limited to 'intern/ghost')
-rw-r--r-- | intern/ghost/intern/GHOST_SystemCocoa.mm | 152 | ||||
-rw-r--r-- | intern/ghost/intern/GHOST_WindowCocoa.mm | 31 |
2 files changed, 37 insertions, 146 deletions
diff --git a/intern/ghost/intern/GHOST_SystemCocoa.mm b/intern/ghost/intern/GHOST_SystemCocoa.mm index 20b190cc41f..03a617ebdd7 100644 --- a/intern/ghost/intern/GHOST_SystemCocoa.mm +++ b/intern/ghost/intern/GHOST_SystemCocoa.mm @@ -372,133 +372,6 @@ static GHOST_TKey convertKey(int rawCode, unichar recvChar) return GHOST_kKeyUnknown; } -/* MacOSX returns a Roman charset with kEventParamKeyMacCharCodes - * as defined here: http://developer.apple.com/documentation/mac/Text/Text-516.html - * I am not sure how international this works... - * For cross-platform convention, we'll use the Latin ascii set instead. - * As defined at: http://www.ramsch.org/martin/uni/fmi-hp/iso8859-1.html - * - */ -static unsigned char convertRomanToLatin(unsigned char ascii) -{ - - if(ascii<128) return ascii; - - switch(ascii) { - case 128: return 142; - case 129: return 143; - case 130: return 128; - case 131: return 201; - case 132: return 209; - case 133: return 214; - case 134: return 220; - case 135: return 225; - case 136: return 224; - case 137: return 226; - case 138: return 228; - case 139: return 227; - case 140: return 229; - case 141: return 231; - case 142: return 233; - case 143: return 232; - case 144: return 234; - case 145: return 235; - case 146: return 237; - case 147: return 236; - case 148: return 238; - case 149: return 239; - case 150: return 241; - case 151: return 243; - case 152: return 242; - case 153: return 244; - case 154: return 246; - case 155: return 245; - case 156: return 250; - case 157: return 249; - case 158: return 251; - case 159: return 252; - case 160: return 0; - case 161: return 176; - case 162: return 162; - case 163: return 163; - case 164: return 167; - case 165: return 183; - case 166: return 182; - case 167: return 223; - case 168: return 174; - case 169: return 169; - case 170: return 174; - case 171: return 180; - case 172: return 168; - case 173: return 0; - case 174: return 198; - case 175: return 216; - case 176: return 0; - case 177: return 177; - case 178: return 0; - case 179: return 0; - case 180: return 165; - case 181: return 181; - case 182: return 0; - case 183: return 0; - case 184: return 215; - case 185: return 0; - case 186: return 0; - case 187: return 170; - case 188: return 186; - case 189: return 0; - case 190: return 230; - case 191: return 248; - case 192: return 191; - case 193: return 161; - case 194: return 172; - case 195: return 0; - case 196: return 0; - case 197: return 0; - case 198: return 0; - case 199: return 171; - case 200: return 187; - case 201: return 201; - case 202: return 0; - case 203: return 192; - case 204: return 195; - case 205: return 213; - case 206: return 0; - case 207: return 0; - case 208: return 0; - case 209: return 0; - case 210: return 0; - - case 214: return 247; - - case 229: return 194; - case 230: return 202; - case 231: return 193; - case 232: return 203; - case 233: return 200; - case 234: return 205; - case 235: return 206; - case 236: return 207; - case 237: return 204; - case 238: return 211; - case 239: return 212; - case 240: return 0; - case 241: return 210; - case 242: return 218; - case 243: return 219; - case 244: return 217; - case 245: return 0; - case 246: return 0; - case 247: return 0; - case 248: return 0; - case 249: return 0; - case 250: return 0; - - - default: return 0; - } - -} #define FIRSTFILEBUFLG 512 static bool g_hasFirstFile = false; @@ -1255,8 +1128,10 @@ GHOST_TSuccess GHOST_SystemCocoa::handleKeyEvent(void *eventPtr) GHOST_IWindow* window = m_windowManager->getActiveWindow(); unsigned int modifiers; NSString *characters; + NSData *convertedCharacters; GHOST_TKey keyCode; unsigned char ascii; + NSString* charsIgnoringModifiers; /* Can happen, very rarely - seems to only be when command-H makes * the window go away and we still get an HKey up. @@ -1269,16 +1144,25 @@ GHOST_TSuccess GHOST_SystemCocoa::handleKeyEvent(void *eventPtr) switch ([event type]) { case NSKeyDown: case NSKeyUp: - characters = [event characters]; - if ([characters length]) { //Check for dead keys + charsIgnoringModifiers = [event charactersIgnoringModifiers]; + if ([charsIgnoringModifiers length]>0) keyCode = convertKey([event keyCode], - [[event charactersIgnoringModifiers] characterAtIndex:0]); - ascii= convertRomanToLatin((char)[characters characterAtIndex:0]); - } else { + [charsIgnoringModifiers characterAtIndex:0]); + else keyCode = convertKey([event keyCode],0); - ascii= 0; + + + characters = [event characters]; + if ([characters length]>0) { //Check for dead keys + //Convert characters to iso latin 1 encoding + convertedCharacters = [characters dataUsingEncoding:NSISOLatin1StringEncoding]; + if ([convertedCharacters length]>0) + ascii =((char*)[convertedCharacters bytes])[0]; + else + ascii = 0; //Character not available in iso latin 1 encoding } - + else + ascii= 0; if ((keyCode == GHOST_kKeyQ) && (m_modifierMask & NSCommandKeyMask)) break; //Cmd-Q is directly handled by Cocoa diff --git a/intern/ghost/intern/GHOST_WindowCocoa.mm b/intern/ghost/intern/GHOST_WindowCocoa.mm index 0090d8e1038..42d7de3f2df 100644 --- a/intern/ghost/intern/GHOST_WindowCocoa.mm +++ b/intern/ghost/intern/GHOST_WindowCocoa.mm @@ -43,16 +43,6 @@ #include "GHOST_Debug.h" -// Pixel Format Attributes for the windowed NSOpenGLContext -static NSOpenGLPixelFormatAttribute pixelFormatAttrsWindow[] = -{ - NSOpenGLPFADoubleBuffer, - NSOpenGLPFAAccelerated, - //NSOpenGLPFAAllowOfflineRenderers, // Removed to allow 10.4 builds, and 2 GPUs rendering is not used anyway - NSOpenGLPFADepthSize, (NSOpenGLPixelFormatAttribute) 32, - (NSOpenGLPixelFormatAttribute) 0 -}; - #pragma mark Cocoa window delegate object /* live resize ugly patch extern "C" { @@ -191,9 +181,12 @@ GHOST_WindowCocoa::GHOST_WindowCocoa( GHOST_TDrawingContextType type, const bool stereoVisual ) : - GHOST_Window(title, left, top, width, height, state, GHOST_kDrawingContextTypeNone), + GHOST_Window(title, left, top, width, height, state, type,stereoVisual), m_customCursor(0) { + NSOpenGLPixelFormatAttribute pixelFormatAttrsWindow[40]; + int i; + m_systemCocoa = systemCocoa; m_fullScreen = false; @@ -224,7 +217,21 @@ GHOST_WindowCocoa::GHOST_WindowCocoa( setTitle(title); - + + // Pixel Format Attributes for the windowed NSOpenGLContext + i=0; + pixelFormatAttrsWindow[i++] = NSOpenGLPFADoubleBuffer; + pixelFormatAttrsWindow[i++] = NSOpenGLPFAAccelerated; + //pixelFormatAttrsWindow[i++] = NSOpenGLPFAAllowOfflineRenderers,; // Removed to allow 10.4 builds, and 2 GPUs rendering is not used anyway + + pixelFormatAttrsWindow[i++] = NSOpenGLPFADepthSize; + pixelFormatAttrsWindow[i++] = (NSOpenGLPixelFormatAttribute) 32; + + if (stereoVisual) pixelFormatAttrsWindow[i++] = NSOpenGLPFAStereo; + + pixelFormatAttrsWindow[i] = (NSOpenGLPixelFormatAttribute) 0; + + //Creates the OpenGL View inside the window NSOpenGLPixelFormat *pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:pixelFormatAttrsWindow]; |