Mercurial > sdl-ios-xcode
changeset 561:4bcf7dd06c47
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.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Sun, 15 Dec 2002 09:09:31 +0000 |
parents | 37c31c12eb70 |
children | cb40b26523a5 |
files | src/video/quartz/SDL_QuartzEvents.m src/video/quartz/SDL_QuartzVideo.h |
diffstat | 2 files changed, 38 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- 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);