Mercurial > sdl-ios-xcode
changeset 4434:5c64052fb476
changeset: 4433:25667ea797fa
tag: tip
user: Jiang Jiang <gzjjgod@gmail.com>
date: Thu Apr 15 12:01:46 2010 +0800
summary: Add windowID to text editing event
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Thu, 15 Apr 2010 22:14:26 -0700 |
parents | 9fa97c6b0014 |
children | e953700da4ca |
files | include/SDL_events.h src/events/SDL_keyboard.c src/events/SDL_keyboard_c.h src/video/cocoa/SDL_cocoakeyboard.m |
diffstat | 4 files changed, 21 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- 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 */
--- 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);
--- 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);
--- 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])