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])