Basic text input API gsoc2009_IME
authorJiang Jiang <gzjjgod@gmail.com>
Fri, 26 Jun 2009 10:37:57 +0000
branchgsoc2009_IME
changeset 3130 fef1a835af43
parent 3129 e42873b9c6f1
child 3131 009bd8f81947
Basic text input API
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.h
src/video/cocoa/SDL_cocoavideo.m
--- a/include/SDL_video.h	Sun May 31 16:57:29 2009 +0000
+++ b/include/SDL_video.h	Fri Jun 26 10:37:57 2009 +0000
@@ -1467,6 +1467,12 @@
  */
 extern DECLSPEC void SDLCALL SDL_GL_DeleteContext(SDL_GLContext context);
 
+/**
+ * \fn void SDL_StartTextInput(SDL_rect *rect)
+ *
+ * \brief Start Unicode text input within the given rectangle.
+ */
+extern DECLSPEC void SDLCALL SDL_StartTextInput(SDL_Rect *rect);
 
 /* Ends C function definitions when using C++ */
 #ifdef __cplusplus
--- a/src/video/SDL_sysvideo.h	Sun May 31 16:57:29 2009 +0000
+++ b/src/video/SDL_sysvideo.h	Fri Jun 26 10:37:57 2009 +0000
@@ -277,6 +277,9 @@
     /* Suspend the screensaver */
     void (*SuspendScreenSaver) (_THIS);
 
+    /* Text input */
+    void (*StartTextInput) (_THIS, SDL_Rect *rect);
+
     /* * * */
     /* Data common to all drivers */
     SDL_bool suspend_screensaver;
--- a/src/video/SDL_video.c	Sun May 31 16:57:29 2009 +0000
+++ b/src/video/SDL_video.c	Fri Jun 26 10:37:57 2009 +0000
@@ -3067,4 +3067,12 @@
     return (_this->GetWindowWMInfo(_this, window, info));
 }
 
+void
+SDL_StartTextInput(SDL_Rect *rect)
+{
+    if (_this->StartTextInput) {
+        _this->StartTextInput(_this, rect);
+    }
+}
+
 /* vi: set ts=4 sw=4 expandtab: */
--- a/src/video/cocoa/SDL_cocoakeyboard.h	Sun May 31 16:57:29 2009 +0000
+++ b/src/video/cocoa/SDL_cocoakeyboard.h	Fri Jun 26 10:37:57 2009 +0000
@@ -28,6 +28,8 @@
 extern void Cocoa_HandleKeyEvent(_THIS, NSEvent * event);
 extern void Cocoa_QuitKeyboard(_THIS);
 
+extern void Cocoa_StartTextInput(_THIS, SDL_Rect *rect);
+
 #endif /* _SDL_cocoakeyboard_h */
 
 /* vi: set ts=4 sw=4 expandtab: */
--- a/src/video/cocoa/SDL_cocoakeyboard.m	Sun May 31 16:57:29 2009 +0000
+++ b/src/video/cocoa/SDL_cocoakeyboard.m	Fri Jun 26 10:37:57 2009 +0000
@@ -59,12 +59,19 @@
     NSString *_markedText;
     NSRange   _markedRange;
     NSRange   _selectedRange;
+    SDL_Rect inputRect;
 }
 - (void) doCommandBySelector:(SEL)myselector;
+- (void) setInputRect:(SDL_Rect *) rect;
 @end
 
 @implementation SDLTranslatorResponder
 
+- (void) setInputRect:(SDL_Rect *) rect
+{
+    inputRect = *rect;
+}
+
 - (void) insertText:(id) aString
 {
     const char *str;
@@ -135,11 +142,20 @@
 
 - (NSRect) firstRectForCharacterRange: (NSRange) theRange
 {
-    return NSMakeRect(0, 0, 0, 0);
+    float windowHeight = [[self window] frame].size.height;
+    NSRect rect = NSMakeRect(inputRect.x, windowHeight - inputRect.y, inputRect.w, inputRect.h);
+
+    NSLog(@"firstRectForCharacterRange: (%d, %d): windowHeight = %g, rect = %@",
+            theRange.location, theRange.length, windowHeight,
+            NSStringFromRect(rect));
+    rect.origin = [[self window] convertBaseToScreen: rect.origin];
+
+    return rect;
 }
 
 - (NSAttributedString *) attributedSubstringFromRange: (NSRange) theRange
 {
+    NSLog(@"attributedSubstringFromRange: (%d, %d)", theRange.location, theRange.length);
     return nil;
 }
 
@@ -152,6 +168,7 @@
 // nearest to thePoint.  thPoint is in screen coordinate system.
 - (NSUInteger) characterIndexForPoint:(NSPoint) thePoint
 {
+    NSLog(@"characterIndexForPoint: (%g, %g)", thePoint.x, thePoint.y);
     return 0;
 }
 
@@ -578,6 +595,15 @@
 }
 
 void
+Cocoa_StartTextInput(_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_HandleKeyEvent(_THIS, NSEvent *event)
 {
     SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
--- a/src/video/cocoa/SDL_cocoavideo.h	Sun May 31 16:57:29 2009 +0000
+++ b/src/video/cocoa/SDL_cocoavideo.h	Fri Jun 26 10:37:57 2009 +0000
@@ -41,6 +41,8 @@
 
 /* Private display data */
 
+@class SDLTranslatorResponder;
+
 typedef struct SDL_VideoData
 {
     SInt32 osversion;
@@ -48,7 +50,7 @@
     int mouse;
     int keyboard;
     void *key_layout;
-    NSText *fieldEdit;
+    SDLTranslatorResponder *fieldEdit;
     Uint32 screensaver_activity;
 } SDL_VideoData;
 
--- a/src/video/cocoa/SDL_cocoavideo.m	Sun May 31 16:57:29 2009 +0000
+++ b/src/video/cocoa/SDL_cocoavideo.m	Fri Jun 26 10:37:57 2009 +0000
@@ -102,6 +102,8 @@
     device->GL_DeleteContext = Cocoa_GL_DeleteContext;
 #endif
 
+    device->StartTextInput = Cocoa_StartTextInput;
+
     device->free = Cocoa_DeleteDevice;
 
     return device;