Update API, first step: make it build gsoc2009_IME
authorJiang Jiang <gzjjgod@gmail.com>
Thu, 06 Aug 2009 08:56:48 +0000
branchgsoc2009_IME
changeset 3135 f4e553ec6a62
parent 3134 f896821736fb
child 3136 962357f325e1
Update API, first step: make it build
include/SDL_video.h
src/video/SDL_sysvideo.h
src/video/SDL_video.c
src/video/cocoa/SDL_cocoakeyboard.h
src/video/cocoa/SDL_cocoakeyboard.m
src/video/cocoa/SDL_cocoavideo.m
--- a/include/SDL_video.h	Thu Aug 06 08:53:00 2009 +0000
+++ b/include/SDL_video.h	Thu Aug 06 08:56:48 2009 +0000
@@ -1468,11 +1468,32 @@
 extern DECLSPEC void SDLCALL SDL_GL_DeleteContext(SDL_GLContext context);
 
 /**
- * \fn void SDL_StartTextInput(SDL_rect *rect)
+ * \fn void SDL_StartTextInput(SDL_WindowID windowID)
+ *
+ * \brief Start accepting Unicode text input events in given window.
+ *
+ * \sa SDL_StopTextInput()
+ * \sa SDL_SetTextInputRect()
+ */
+extern DECLSPEC void SDLCALL SDL_StartTextInput(SDL_WindowID windowID);
+
+/**
+ * \fn void SDL_StopTextInput(void)
  *
- * \brief Start Unicode text input within the given rectangle.
+ * \brief Stop receiving any text input events.
+ *
+ * \sa SDL_StartTextInput()
  */
-extern DECLSPEC void SDLCALL SDL_StartTextInput(SDL_Rect *rect);
+extern DECLSPEC void SDLCALL SDL_StopTextInput(void);
+
+/**
+ * \fn void SDL_SetTextInputRect(SDL_Rect *rect)
+ *
+ * \brief Set the rectangle used to type Unicode text inputs.
+ *
+ * \sa SDL_StartTextInput()
+ */
+extern DECLSPEC void SDLCALL SDL_SetTextInputRect(SDL_Rect *rect);
 
 /* Ends C function definitions when using C++ */
 #ifdef __cplusplus
--- a/src/video/SDL_sysvideo.h	Thu Aug 06 08:53:00 2009 +0000
+++ b/src/video/SDL_sysvideo.h	Thu Aug 06 08:56:48 2009 +0000
@@ -278,7 +278,9 @@
     void (*SuspendScreenSaver) (_THIS);
 
     /* Text input */
-    void (*StartTextInput) (_THIS, SDL_Rect *rect);
+    void (*StartTextInput) (_THIS, SDL_Window *window);
+    void (*StopTextInput) (_THIS);
+    void (*SetTextInputRect) (_THIS, SDL_Rect *rect);
 
     /* * * */
     /* Data common to all drivers */
--- a/src/video/SDL_video.c	Thu Aug 06 08:53:00 2009 +0000
+++ b/src/video/SDL_video.c	Thu Aug 06 08:56:48 2009 +0000
@@ -3068,10 +3068,28 @@
 }
 
 void
-SDL_StartTextInput(SDL_Rect *rect)
+SDL_StartTextInput(SDL_WindowID windowID)
 {
+    SDL_Window *window = SDL_GetWindowFromID(windowID);
+
     if (_this->StartTextInput) {
-        _this->StartTextInput(_this, rect);
+        _this->StartTextInput(_this, window);
+    }
+}
+
+void
+SDL_StopTextInput(void)
+{
+    if (_this->StopTextInput) {
+        _this->StopTextInput(_this);
+    }
+}
+
+void
+SDL_SetTextInputRect(SDL_Rect *rect)
+{
+    if (_this->SetTextInputRect) {
+        _this->SetTextInputRect(_this, rect);
     }
 }
 
--- a/src/video/cocoa/SDL_cocoakeyboard.h	Thu Aug 06 08:53:00 2009 +0000
+++ b/src/video/cocoa/SDL_cocoakeyboard.h	Thu Aug 06 08:56:48 2009 +0000
@@ -28,7 +28,9 @@
 extern void Cocoa_HandleKeyEvent(_THIS, NSEvent * event);
 extern void Cocoa_QuitKeyboard(_THIS);
 
-extern void Cocoa_StartTextInput(_THIS, SDL_Rect *rect);
+extern void Cocoa_StartTextInput(_THIS, SDL_Window *window);
+extern void Cocoa_StopTextInput(_THIS);
+extern void Cocoa_SetTextInputRect(_THIS, SDL_Rect *rect);
 
 #endif /* _SDL_cocoakeyboard_h */
 
--- a/src/video/cocoa/SDL_cocoakeyboard.m	Thu Aug 06 08:53:00 2009 +0000
+++ b/src/video/cocoa/SDL_cocoakeyboard.m	Thu Aug 06 08:56:48 2009 +0000
@@ -59,17 +59,24 @@
     NSString *_markedText;
     NSRange   _markedRange;
     NSRange   _selectedRange;
-    SDL_Rect inputRect;
+    SDL_Rect  _inputRect;
+    int       _keyboard;
 }
 - (void) doCommandBySelector:(SEL)myselector;
 - (void) setInputRect:(SDL_Rect *) rect;
+- (void) setKeyboard:(int) keyboard;
 @end
 
 @implementation SDLTranslatorResponder
 
+- (void) setKeyboard:(int) keyboard
+{
+    _keyboard = keyboard;
+}
+
 - (void) setInputRect:(SDL_Rect *) rect
 {
-    inputRect = *rect;
+    _inputRect = *rect;
 }
 
 - (void) insertText:(id) aString
@@ -85,7 +92,7 @@
     else
         str = [aString UTF8String];
 
-    SDL_SendKeyboardText(0, str);
+    SDL_SendKeyboardText(_keyboard, str);
 }
 
 - (void) doCommandBySelector:(SEL) myselector
@@ -145,7 +152,7 @@
 - (NSRect) firstRectForCharacterRange: (NSRange) theRange
 {
     float windowHeight = [[self window] frame].size.height;
-    NSRect rect = NSMakeRect(inputRect.x, windowHeight - inputRect.y, inputRect.w, inputRect.h);
+    NSRect rect = NSMakeRect(_inputRect.x, windowHeight - _inputRect.y, _inputRect.w, _inputRect.h);
 
     NSLog(@"firstRectForCharacterRange: (%d, %d): windowHeight = %g, rect = %@",
             theRange.location, theRange.length, windowHeight,
@@ -585,6 +592,7 @@
     
     SDL_zero(keyboard);
     data->keyboard = SDL_AddKeyboard(&keyboard, -1);
+    [data->fieldEdit setKeyboard: data->keyboard];
     UpdateKeymap(data);
     
     /* Set our own names for the platform-dependent but layout-independent keys */
@@ -597,15 +605,43 @@
 }
 
 void
-Cocoa_StartTextInput(_THIS, SDL_Rect *rect)
+Cocoa_StartTextInput(_THIS, SDL_Window *window)
+{
+    SDL_VideoData *videoData = (SDL_VideoData *) _this->driverdata;
+    SDL_WindowData *windowData = (SDL_WindowData *) window->driverdata;
+    NSView *parentView = [windowData->window contentView];
+
+    if (! [[videoData->fieldEdit superview] isEqual: parentView])
+    {
+        NSLog(@"add fieldEdit to window contentView");
+        [videoData->fieldEdit removeFromSuperview];
+        [parentView addSubview: videoData->fieldEdit];
+        [windowData->window makeFirstResponder: videoData->fieldEdit];
+    }
+
+    SDL_EventState(SDL_TEXTINPUT, SDL_ENABLE);
+    SDL_EventState(SDL_TEXTEDITING, SDL_ENABLE);
+}
+
+void
+Cocoa_SetTextInputRect(_THIS, SDL_Rect *rect)
 {
     SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
 
-    NSLog(@"StartTextInput: (%d, %d) (w=%d, h=%d)", rect->x, rect->y, rect->w, rect->h);
     [data->fieldEdit setInputRect: rect];
 }
 
 void
+Cocoa_StopTextInput(_THIS)
+{
+    SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
+
+    [data->fieldEdit removeFromSuperview];
+    SDL_EventState(SDL_TEXTINPUT, SDL_IGNORE);
+    SDL_EventState(SDL_TEXTEDITING, SDL_IGNORE);
+}
+
+void
 Cocoa_HandleKeyEvent(_THIS, NSEvent *event)
 {
     SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
@@ -641,13 +677,6 @@
         if (SDL_EventState(SDL_TEXTINPUT, SDL_QUERY)) {
             /* FIXME CW 2007-08-16: only send those events to the field editor for which we actually want text events, not e.g. esc or function keys. Arrow keys in particular seem to produce crashes sometimes. */
             NSLog(@"interpretKeyEvents");
-            if (! [[data->fieldEdit superview] isEqual: [[event window] contentView]])
-            {
-                NSLog(@"add fieldEdit to window contentView");
-                [data->fieldEdit removeFromSuperview];
-                [[[event window] contentView] addSubview: data->fieldEdit];
-                [[event window] makeFirstResponder: data->fieldEdit];
-            }
             [data->fieldEdit interpretKeyEvents:[NSArray arrayWithObject:event]];
 #if 0
             text = [[event characters] UTF8String];
--- a/src/video/cocoa/SDL_cocoavideo.m	Thu Aug 06 08:53:00 2009 +0000
+++ b/src/video/cocoa/SDL_cocoavideo.m	Thu Aug 06 08:56:48 2009 +0000
@@ -103,6 +103,8 @@
 #endif
 
     device->StartTextInput = Cocoa_StartTextInput;
+    device->StopTextInput = Cocoa_StopTextInput;
+    device->SetTextInputRect = Cocoa_SetTextInputRect;
 
     device->free = Cocoa_DeleteDevice;