Date: Sat, 14 Dec 2002 13:33:05 -0500
authorSam Lantinga <slouken@libsdl.org>
Sun, 15 Dec 2002 09:09:31 +0000
changeset 561 4bcf7dd06c47
parent 560 37c31c12eb70
child 562 cb40b26523a5
Date: Sat, 14 Dec 2002 13:33:05 -0500 From: Darrell Walisser Subject: Re: crash in SDL / OSX > Yes, compose keys and other "dead" keys should have unicode 0. > As a hack, if you get multiple composed characters, you can send the > sequence with a valid unicode and a keysym of 0. It's because of > things like this that I'm separating the key and char events in SDL 2.0 I've done this and here's the patch.
src/video/quartz/SDL_QuartzEvents.m
src/video/quartz/SDL_QuartzVideo.h
--- a/src/video/quartz/SDL_QuartzEvents.m	Fri Dec 13 21:09:52 2002 +0000
+++ b/src/video/quartz/SDL_QuartzEvents.m	Sun Dec 15 09:09:31 2002 +0000
@@ -206,25 +206,51 @@
 static void QZ_DoKey (_THIS, int state, NSEvent *event) {
 
     NSString *chars;
-    int i;
+    unsigned int numChars;
     SDL_keysym key;
-
+    
     /* 
-        An event can contain multiple characters
-        I'll ignore this fact for now, since there 
-        is only one virtual key code per event, so
-        no good way to handle this.
+        A key event can contain multiple characters,
+        or no characters at all. In most cases, it
+        will contain a single character. If it contains
+        0 characters, we'll use 0 as the unicode. If it
+        contains multiple characters, we'll use 0 as
+        the scancode/keysym.
     */
     chars = [ event characters ];
-    for (i =0; i < 1 /*[ chars length ] */; i++) {
+    numChars = [ chars length ];
+
+    if (numChars == 1) {
 
         key.scancode = [ event keyCode ];
-        key.sym         = keymap [ key.scancode ];
-        key.unicode     = [ chars characterAtIndex:i];
-        key.mod         = KMOD_NONE;
+        key.sym      = keymap [ key.scancode ];
+        key.unicode  = [ chars characterAtIndex:0 ];
+        key.mod      = KMOD_NONE;
+
+        SDL_PrivateKeyboard (state, &key);
+    }
+    else if (numChars == 0) {
+      
+        key.scancode = [ event keyCode ];
+        key.sym      = keymap [ key.scancode ];
+        key.unicode  = 0;
+        key.mod      = KMOD_NONE;
 
         SDL_PrivateKeyboard (state, &key);
     }
+    else /* (numChars > 1) */ {
+      
+        int i;
+        for (i = 0; i < numChars; i++) {
+
+            key.scancode = 0;
+            key.sym      = 0;
+            key.unicode  = [ chars characterAtIndex:i];
+            key.mod      = KMOD_NONE;
+
+            SDL_PrivateKeyboard (state, &key);
+        }
+    }
 }
 
 static void QZ_DoModifiers (_THIS, unsigned int newMods) {
--- a/src/video/quartz/SDL_QuartzVideo.h	Fri Dec 13 21:09:52 2002 +0000
+++ b/src/video/quartz/SDL_QuartzVideo.h	Sun Dec 15 09:09:31 2002 +0000
@@ -52,6 +52,7 @@
 #include <OpenGL/OpenGL.h>
 #include <Carbon/Carbon.h>
 #include <QuickTime/QuickTime.h>
+#include <IOKit/IOKitLib.h>	/* For powersave handling */
 
 #include "SDL_video.h"
 #include "SDL_error.h"
@@ -308,4 +309,4 @@
 
 /* YUV functions */
 static SDL_Overlay* QZ_CreateYUVOverlay (_THIS, int width, int height,
-                                         Uint32 format, SDL_Surface *display);
\ No newline at end of file
+                                         Uint32 format, SDL_Surface *display);