diff -u /Users/phil/Downloads/SDL2-2.0.1/src/video/uikit/SDL_uikitvideo.m ./SDL_uikitvideo.m --- /Users/phil/Downloads/SDL2-2.0.1/src/video/uikit/SDL_uikitvideo.m 2013-10-23 22:05:30.000000000 -0600 +++ ./SDL_uikitvideo.m 2013-11-11 10:37:20.000000000 -0700 @@ -89,6 +89,7 @@ device->ShowScreenKeyboard = UIKit_ShowScreenKeyboard; device->HideScreenKeyboard = UIKit_HideScreenKeyboard; device->IsScreenKeyboardShown = UIKit_IsScreenKeyboardShown; + device->SetTextInputRect = UIKit_SetTextInputRect; #endif /* OpenGL (ES) functions */ diff -u /Users/phil/Downloads/SDL2-2.0.1/src/video/uikit/SDL_uikitview.h ./SDL_uikitview.h --- /Users/phil/Downloads/SDL2-2.0.1/src/video/uikit/SDL_uikitview.h 2013-10-23 22:05:30.000000000 -0600 +++ ./SDL_uikitview.h 2013-11-11 09:39:03.000000000 -0700 @@ -45,6 +45,8 @@ #if SDL_IPHONE_KEYBOARD UITextField *textField; BOOL keyboardVisible; + SDL_Rect textInputRect; + int keyboardHeight; #endif @public @@ -60,11 +62,14 @@ - (void)hideKeyboard; - (void)initializeKeyboard; @property (readonly) BOOL keyboardVisible; +@property (nonatomic,assign) SDL_Rect textInputRect; +@property (nonatomic,assign) int keyboardHeight; SDL_bool UIKit_HasScreenKeyboardSupport(_THIS); void UIKit_ShowScreenKeyboard(_THIS, SDL_Window *window); void UIKit_HideScreenKeyboard(_THIS, SDL_Window *window); SDL_bool UIKit_IsScreenKeyboardShown(_THIS, SDL_Window *window); +void UIKit_SetTextInputRect(_THIS, SDL_Rect *rect); #endif diff -u /Users/phil/Downloads/SDL2-2.0.1/src/video/uikit/SDL_uikitview.m ./SDL_uikitview.m --- /Users/phil/Downloads/SDL2-2.0.1/src/video/uikit/SDL_uikitview.m 2013-10-23 22:05:30.000000000 -0600 +++ ./SDL_uikitview.m 2013-11-11 09:40:52.000000000 -0700 @@ -35,6 +35,8 @@ #include "SDL_uikitmodes.h" #include "SDL_uikitwindow.h" +void _uikit_keyboard_init() ; + @implementation SDL_uikitview - (void)dealloc @@ -197,6 +199,9 @@ */ #if SDL_IPHONE_KEYBOARD +@synthesize textInputRect = textInputRect; +@synthesize keyboardHeight = keyboardHeight; + /* Is the iPhone virtual keyboard visible onscreen? */ - (BOOL)keyboardVisible { @@ -225,6 +230,8 @@ /* add the UITextField (hidden) to our view */ [self addSubview: textField]; [textField release]; + + _uikit_keyboard_init(); } /* reveal onscreen virtual keyboard */ @@ -352,6 +359,103 @@ return view.keyboardVisible; } + +void _uikit_keyboard_update() { + SDL_Window *window = SDL_GetFocusWindow(); + if (!window) { return; } + SDL_WindowData *data = (SDL_WindowData *)window->driverdata; + if (!data) { return; } + SDL_uikitview *view = data->view; + if (!view) { return; } + + SDL_Rect r = view.textInputRect; + int height = view.keyboardHeight; + int offsetx = 0; + int offsety = 0; + if (height) { + int sw,sh; + SDL_GetWindowSize(window,&sw,&sh); + int bottom = (r.y + r.h); + int kbottom = sh - height; + if (kbottom < bottom) { + offsety = kbottom-bottom; + } + } + UIInterfaceOrientation ui_orient = [[UIApplication sharedApplication] statusBarOrientation]; + if (ui_orient == UIInterfaceOrientationLandscapeLeft) { + int tmp = offsetx; offsetx = offsety; offsety = tmp; + } + if (ui_orient == UIInterfaceOrientationLandscapeRight) { + offsety = -offsety; + int tmp = offsetx; offsetx = offsety; offsety = tmp; + } + if (ui_orient == UIInterfaceOrientationPortraitUpsideDown) { + offsety = -offsety; + } + if ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)]) { + float scale = [UIScreen mainScreen].scale; + offsetx /= scale; + offsety /= scale; + } + view.frame = CGRectMake(offsetx,offsety,view.frame.size.width,view.frame.size.height); +} + +void _uikit_keyboard_set_height(int height) { + SDL_uikitview *view = getWindowView(SDL_GetFocusWindow()); + if (view == nil) { + return ; + } + + view.keyboardHeight = height; + _uikit_keyboard_update(); +} + +void _uikit_keyboard_init() { + NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; + NSOperationQueue *queue = [NSOperationQueue mainQueue]; + [center addObserverForName:UIKeyboardWillShowNotification + object:nil + queue:queue + usingBlock:^(NSNotification *notification) { + int height = 0; + CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; + height = keyboardSize.height; + UIInterfaceOrientation ui_orient = [[UIApplication sharedApplication] statusBarOrientation]; + if (ui_orient == UIInterfaceOrientationLandscapeRight || ui_orient == UIInterfaceOrientationLandscapeLeft) { + height = keyboardSize.width; + } + if ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)]) { + height *= [UIScreen mainScreen].scale; + } + _uikit_keyboard_set_height(height); + } + ]; + [center addObserverForName:UIKeyboardDidHideNotification + object:nil + queue:queue + usingBlock:^(NSNotification *notification) { + _uikit_keyboard_set_height(0); + } + ]; +} + +void +UIKit_SetTextInputRect(_THIS, SDL_Rect *rect) +{ + if (!rect) { + SDL_InvalidParamError("rect"); + return; + } + + SDL_uikitview *view = getWindowView(SDL_GetFocusWindow()); + if (view == nil) { + return ; + } + + view.textInputRect = *rect; +} + + #endif /* SDL_IPHONE_KEYBOARD */ #endif /* SDL_VIDEO_DRIVER_UIKIT */