# HG changeset patch # User Sam Lantinga # Date 1184140392 0 # Node ID 60f67763028298c1496e09e6bfa5fd074f327db7 # Parent 3e380b8247aa287e4b3c50f68fc04c9edac47c5f Added key composition support, courtesy of Kuon diff -r 3e380b8247aa -r 60f677630282 src/video/quartz/SDL_QuartzEvents.m --- a/src/video/quartz/SDL_QuartzEvents.m Wed Jul 11 07:47:47 2007 +0000 +++ b/src/video/quartz/SDL_QuartzEvents.m Wed Jul 11 07:53:12 2007 +0000 @@ -254,7 +254,7 @@ static void QZ_DoKey (_THIS, int state, NSEvent *event) { NSString *chars; - unsigned int numChars; + unsigned int i, numChars; SDL_keysym key; /* @@ -265,7 +265,8 @@ contains multiple characters, we'll use 0 as the scancode/keysym. */ - if (SDL_TranslateUNICODE) { + if (SDL_TranslateUNICODE && state == SDL_PRESSED) { + [field_edit interpretKeyEvents:[NSArray arrayWithObject:event]]; chars = [ event characters ]; numChars = [ chars length ]; } else { @@ -281,7 +282,7 @@ SDL_PrivateKeyboard (state, &key); } - else if (numChars == 1) { + else if (numChars >= 1) { key.scancode = [ event keyCode ]; key.sym = keymap [ key.scancode ]; @@ -289,11 +290,8 @@ key.mod = KMOD_NONE; SDL_PrivateKeyboard (state, &key); - } - else /* (numChars > 1) */ { - int i; - for (i = 0; i < numChars; i++) { + for (i = 1; i < numChars; i++) { key.scancode = 0; key.sym = 0; diff -r 3e380b8247aa -r 60f677630282 src/video/quartz/SDL_QuartzVideo.h --- a/src/video/quartz/SDL_QuartzVideo.h Wed Jul 11 07:47:47 2007 +0000 +++ b/src/video/quartz/SDL_QuartzVideo.h Wed Jul 11 07:53:12 2007 +0000 @@ -99,6 +99,7 @@ SDL_Rect **client_mode_list; /* resolution list to pass back to client */ SDLKey keymap[256]; /* Mac OS X to SDL key mapping */ Uint32 current_mods; /* current keyboard modifiers, to track modifier state */ + NSText *field_edit; /* a field editor for keyboard composition processing */ Uint32 last_virtual_button;/* last virtual mouse button pressed */ io_connect_t power_connection; /* used with IOKit to detect wake from sleep */ Uint8 expect_mouse_up; /* used to determine when to send mouse up events */ @@ -146,6 +147,7 @@ #define client_mode_list (this->hidden->client_mode_list) #define keymap (this->hidden->keymap) #define current_mods (this->hidden->current_mods) +#define field_edit (this->hidden->field_edit) #define last_virtual_button (this->hidden->last_virtual_button) #define power_connection (this->hidden->power_connection) #define expect_mouse_up (this->hidden->expect_mouse_up) diff -r 3e380b8247aa -r 60f677630282 src/video/quartz/SDL_QuartzVideo.m --- a/src/video/quartz/SDL_QuartzVideo.m Wed Jul 11 07:47:47 2007 +0000 +++ b/src/video/quartz/SDL_QuartzVideo.m Wed Jul 11 07:53:12 2007 +0000 @@ -169,6 +169,7 @@ static int QZ_VideoInit (_THIS, SDL_PixelFormat *video_format) { + NSRect r = NSMakeRect(0.0, 0.0, 0.0, 0.0); const char *env = NULL; /* Initialize the video settings; this data persists between mode switches */ @@ -202,6 +203,7 @@ cursor_should_be_visible = YES; cursor_visible = YES; current_mods = 0; + field_edit = [[NSTextView alloc] initWithFrame:r]; if ( Gestalt(gestaltSystemVersion, &system_version) != noErr ) system_version = 0; @@ -1456,6 +1458,11 @@ opengl_library = NULL; } this->gl_config.driver_loaded = 0; + + if (field_edit) { + [field_edit release]; + field_edit = NULL; + } } #if 0 /* Not used (apparently, it's really slow) */