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.
--- 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);