# HG changeset patch # User Sam Lantinga # Date 1271394866 25200 # Node ID 5c64052fb4761f2079f2c8098fbf32210d83742f # Parent 9fa97c6b001484cd4baa2f4cf11d01ceefb3ee46 changeset: 4433:25667ea797fa tag: tip user: Jiang Jiang date: Thu Apr 15 12:01:46 2010 +0800 summary: Add windowID to text editing event diff -r 9fa97c6b0014 -r 5c64052fb476 include/SDL_events.h --- a/include/SDL_events.h Thu Apr 15 21:27:32 2010 -0700 +++ b/include/SDL_events.h Thu Apr 15 22:14:26 2010 -0700 @@ -138,6 +138,7 @@ typedef struct SDL_TextEditingEvent { Uint32 type; /**< ::SDL_TEXTEDITING */ + Uint32 windowID; /**< The window with keyboard focus, if any */ char text[SDL_TEXTEDITINGEVENT_TEXT_SIZE]; /**< The editing text */ int start; /**< The start cursor of selected editing text */ int length; /**< The length of selected editing text */ diff -r 9fa97c6b0014 -r 5c64052fb476 src/events/SDL_keyboard.c --- a/src/events/SDL_keyboard.c Thu Apr 15 21:27:32 2010 -0700 +++ b/src/events/SDL_keyboard.c Thu Apr 15 22:14:26 2010 -0700 @@ -679,6 +679,8 @@ if (keyboard->focus) { SDL_SendWindowEvent(keyboard->focus, SDL_WINDOWEVENT_FOCUS_GAINED, 0, 0); + if (SDL_EventState(SDL_TEXTINPUT, SDL_QUERY)) + SDL_StartTextInput(); } } @@ -839,10 +841,14 @@ } int -SDL_SendEditingText(const char *text, int start, int length) +SDL_SendEditingText(int index, const char *text, int start, int length) { + SDL_Keyboard *keyboard = SDL_GetKeyboard(index); int posted; + if (!keyboard) + return 0; + /* Post the event, if desired */ posted = 0; if (SDL_GetEventState(SDL_TEXTEDITING) == SDL_ENABLE) { @@ -851,6 +857,7 @@ event.edit.start = start; event.edit.length = length; SDL_strlcpy(event.edit.text, text, SDL_arraysize(event.text.text)); + event.edit.windowID = keyboard->focus->id; posted = (SDL_PushEvent(&event) > 0); } return (posted); diff -r 9fa97c6b0014 -r 5c64052fb476 src/events/SDL_keyboard_c.h --- a/src/events/SDL_keyboard_c.h Thu Apr 15 21:27:32 2010 -0700 +++ b/src/events/SDL_keyboard_c.h Thu Apr 15 22:14:26 2010 -0700 @@ -82,7 +82,7 @@ extern int SDL_SendKeyboardText(int index, const char *text); /* Send editing text for selected range from start to end */ -extern int SDL_SendEditingText(const char *text, int start, int end); +extern int SDL_SendEditingText(int index, const char *text, int start, int end); /* Shutdown the keyboard subsystem */ extern void SDL_KeyboardQuit(void); diff -r 9fa97c6b0014 -r 5c64052fb476 src/video/cocoa/SDL_cocoakeyboard.m --- a/src/video/cocoa/SDL_cocoakeyboard.m Thu Apr 15 21:27:32 2010 -0700 +++ b/src/video/cocoa/SDL_cocoakeyboard.m Thu Apr 15 22:14:26 2010 -0700 @@ -140,7 +140,8 @@ _selectedRange = selRange; _markedRange = NSMakeRange(0, [aString length]); - SDL_SendEditingText([aString UTF8String], selRange.location, selRange.length); + SDL_SendEditingText(_keyboard, [aString UTF8String], + selRange.location, selRange.length); DEBUG_IME(@"setMarkedText: %@, (%d, %d)", _markedText, selRange.location, selRange.length); @@ -632,7 +633,15 @@ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSView *parentView = [[NSApp keyWindow] contentView]; - data->fieldEdit = [[SDLTranslatorResponder alloc] initWithFrame:NSMakeRect(0.0, 0.0, 0.0, 0.0)]; + /* We only keep one field editor per process, since only the front most + * window can receive text input events, so it make no sense to keep more + * than one copy. When we switched to another window and requesting for + * text input, simply remove the field editor from its superview then add + * it to the front most window's content view */ + if (! data->fieldEdit) + data->fieldEdit = + [[SDLTranslatorResponder alloc] initWithFrame: NSMakeRect(0.0, 0.0, 0.0, 0.0)]; + [data->fieldEdit setKeyboard: data->keyboard]; if (! [[data->fieldEdit superview] isEqual: parentView])