# HG changeset patch # User Holmes Futrell # Date 1218669276 0 # Node ID ab89ff6e97afba08d20062f8a5fab4423ed661c5 # Parent 9aac7992ed8537c137584d8e96642241c6e85afa Originally keyboard support was in the form of a category of the class SDL_uikitview. It turns out this can cause problems with compilation where the code is not actually included and doesn't fail until dynamic dispatch. This is just awful, so I've moved to the code into the SDL_uikitview class itself. diff -r 9aac7992ed85 -r ab89ff6e97af src/video/uikit/SDL_uikitkeyboard.h --- a/src/video/uikit/SDL_uikitkeyboard.h Wed Aug 13 23:12:00 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,47 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org - */ - -#ifndef _SDL_uikitkeyboard_h -#define _SDL_uikitkeyboard_h - -#if SDL_IPHONE_KEYBOARD - -#import "SDL_uikitview.h" - -@interface SDL_uikitview (keyboardMethods) - -- (void)showKeyboard; -- (void)hideKeyboard; -- (void)initializeKeyboard; - -@property (readonly) BOOL keyboardVisible; - -@end - -#endif /* SDL_IPHONE_KEYBOARD */ - -extern DECLSPEC int SDLCALL SDL_iPhoneKeyboardShow(SDL_WindowID windowID); -extern DECLSPEC int SDLCALL SDL_iPhoneKeyboardHide(SDL_WindowID windowID); -extern DECLSPEC SDL_bool SDLCALL SDL_iPhoneKeyboardIsShown(SDL_WindowID windowID); -extern DECLSPEC int SDLCALL SDL_iPhoneKeyboardToggle(SDL_WindowID windowID); - -#endif /* _SDL_uikitkeyboard_h */ diff -r 9aac7992ed85 -r ab89ff6e97af src/video/uikit/SDL_uikitkeyboard.m --- a/src/video/uikit/SDL_uikitkeyboard.m Wed Aug 13 23:12:00 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,263 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org - */ - -#include "SDL_video.h" - -#if SDL_IPHONE_KEYBOARD - -#import "SDL_uikitkeyboard.h" -#import "SDL_uikitview.h" -#import "SDL_keyboard_c.h" -#import "keyinfotable.h" -#import "SDL_uikitappdelegate.h" -#import "SDL_uikitwindow.h" - -@implementation SDL_uikitview (keyboardMethods) - -- (BOOL)keyboardVisible { - return keyboardVisible; -} - -/* UITextFieldDelegate related methods */ -- (void)initializeKeyboard { - - NSLog(@"Text field init"); - - textField = [[UITextField alloc] initWithFrame: CGRectZero]; - textField.delegate = self; - /* placeholder so there is something to delete! */ - textField.text = @" "; - - /* set UITextInputTrait properties, mostly to defaults */ - textField.autocapitalizationType = UITextAutocapitalizationTypeNone; - textField.autocorrectionType = UITextAutocorrectionTypeNo; - textField.enablesReturnKeyAutomatically = NO; - textField.keyboardAppearance = UIKeyboardAppearanceDefault; - textField.keyboardType = UIKeyboardTypeDefault; - textField.returnKeyType = UIReturnKeyDefault; - textField.secureTextEntry = NO; - - textField.hidden = YES; - keyboardVisible = NO; - [self addSubview: textField]; - - /* - SDL makes a copy of our keyboard. - */ - - SDL_Keyboard keyboard; - SDL_zero(keyboard); - //data->keyboard = SDL_AddKeyboard(&keyboard, -1); - /* - We'll need to delete this keyboard ... - */ - SDL_AddKeyboard(&keyboard, 0); - SDLKey keymap[SDL_NUM_SCANCODES]; - SDL_GetDefaultKeymap(keymap); - SDL_SetKeymap(0, 0, keymap, SDL_NUM_SCANCODES); - -} - -- (void)showKeyboard { - keyboardVisible = YES; - [textField becomeFirstResponder]; -} - -- (void)hideKeyboard { - keyboardVisible = NO; - [textField resignFirstResponder]; -} - -- (BOOL)textField:(UITextField *)_textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { - - if ([string length] == 0) { - /* it wants to replace text with nothing, ie a delete */ - SDL_SendKeyboardKey( 0, SDL_PRESSED, SDL_SCANCODE_DELETE); - SDL_SendKeyboardKey( 0, SDL_RELEASED, SDL_SCANCODE_DELETE); - } - else { - - int i; - for (i=0; i<[string length]; i++) { - - unichar c = [string characterAtIndex: i]; - - Uint16 mod = 0; - SDL_scancode code; - - if (0 <= c && c < 127) { - code = unicharToUIKeyInfoTable[c].code; - mod = unicharToUIKeyInfoTable[c].mod; - } - else { - code = SDL_SCANCODE_UNKNOWN; - mod = 0; - } - - if (mod & KMOD_SHIFT) { - SDL_SendKeyboardKey( 0, SDL_PRESSED, SDL_SCANCODE_LSHIFT); - } - SDL_SendKeyboardKey( 0, SDL_PRESSED, code); - SDL_SendKeyboardKey( 0, SDL_RELEASED, code); - if (mod & KMOD_SHIFT) { - SDL_SendKeyboardKey( 0, SDL_RELEASED, SDL_SCANCODE_LSHIFT); - } - - } - - } - return NO; /* don't allow the edit(!) */ -} - -/* Terminates the editing session */ -- (BOOL)textFieldShouldReturn:(UITextField*)_textField { - [self hideKeyboard]; - return YES; -} - -@end - -/* iPhone keyboard addition functions */ - -int SDL_iPhoneKeyboardShow(SDL_WindowID windowID) { - - SDL_Window *window = SDL_GetWindowFromID(windowID); - SDL_WindowData *data; - SDL_uikitview *view; - - if (NULL == window) { - SDL_SetError("Window does not exist"); - return -1; - } - - data = (SDL_WindowData *)window->driverdata; - view = data->view; - - if (nil == view) { - SDL_SetError("Window has no view"); - return -1; - } - else { - [view showKeyboard]; - return 0; - } -} - -int SDL_iPhoneKeyboardHide(SDL_WindowID windowID) { - - SDL_Window *window = SDL_GetWindowFromID(windowID); - SDL_WindowData *data; - SDL_uikitview *view; - - if (NULL == window) { - SDL_SetError("Window does not exist"); - return -1; - } - - data = (SDL_WindowData *)window->driverdata; - view = data->view; - - if (NULL == view) { - SDL_SetError("Window has no view"); - return -1; - } - else { - [view hideKeyboard]; - return 0; - } -} - -SDL_bool SDL_iPhoneKeyboardIsShown(SDL_WindowID windowID) { - - SDL_Window *window = SDL_GetWindowFromID(windowID); - SDL_WindowData *data; - SDL_uikitview *view; - - if (NULL == window) { - SDL_SetError("Window does not exist"); - return -1; - } - - data = (SDL_WindowData *)window->driverdata; - view = data->view; - - if (NULL == view) { - SDL_SetError("Window has no view"); - return 0; - } - else { - return view.keyboardVisible; - } -} - -int SDL_iPhoneKeyboardToggle(SDL_WindowID windowID) { - - SDL_Window *window = SDL_GetWindowFromID(windowID); - SDL_WindowData *data; - SDL_uikitview *view; - - if (NULL == window) { - SDL_SetError("Window does not exist"); - return -1; - } - - data = (SDL_WindowData *)window->driverdata; - view = data->view; - - if (NULL == view) { - SDL_SetError("Window has no view"); - return -1; - } - else { - if (SDL_iPhoneKeyboardIsShown(windowID)) { - SDL_iPhoneKeyboardHide(windowID); - } - else { - SDL_iPhoneKeyboardShow(windowID); - } - return 0; - } -} - -#else - -int SDL_iPhoneKeyboardShow(SDL_WindowID windowID) { - SDL_SetError("Not compiled with keyboard support"); - return -1; -} - -int SDL_iPhoneKeyboardHide(SDL_WindowID windowID) { - SDL_SetError("Not compiled with keyboard support"); - return -1; -} - -SDL_bool SDL_iPhoneKeyboardIsShown(SDL_WindowID windowID) { - return 0; -} - -int SDL_iPhoneKeyboardToggle(SDL_WindowID windowID) { - SDL_SetError("Not compiled with keyboard support"); - return -1; -} - - -#endif /* SDL_IPHONE_KEYBOARD */ diff -r 9aac7992ed85 -r ab89ff6e97af src/video/uikit/SDL_uikitview.h --- a/src/video/uikit/SDL_uikitview.h Wed Aug 13 23:12:00 2008 +0000 +++ b/src/video/uikit/SDL_uikitview.h Wed Aug 13 23:14:36 2008 +0000 @@ -42,4 +42,18 @@ - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; +#if SDL_IPHONE_KEYBOARD +- (void)showKeyboard; +- (void)hideKeyboard; +- (void)initializeKeyboard; +@property (readonly) BOOL keyboardVisible; +#endif + @end + +#if SDL_IPHONE_KEYBOARD +extern DECLSPEC int SDLCALL SDL_iPhoneKeyboardShow(SDL_WindowID windowID); +extern DECLSPEC int SDLCALL SDL_iPhoneKeyboardHide(SDL_WindowID windowID); +extern DECLSPEC SDL_bool SDLCALL SDL_iPhoneKeyboardIsShown(SDL_WindowID windowID); +extern DECLSPEC int SDLCALL SDL_iPhoneKeyboardToggle(SDL_WindowID windowID); +#endif diff -r 9aac7992ed85 -r ab89ff6e97af src/video/uikit/SDL_uikitview.m --- a/src/video/uikit/SDL_uikitview.m Wed Aug 13 23:12:00 2008 +0000 +++ b/src/video/uikit/SDL_uikitview.m Wed Aug 13 23:14:36 2008 +0000 @@ -21,7 +21,13 @@ */ #import "SDL_uikitview.h" -#import "SDL_uikitkeyboard.h" + +#if SDL_IPHONE_KEYBOARD +#import "SDL_keyboard_c.h" +#import "keyinfotable.h" +#import "SDL_uikitappdelegate.h" +#import "SDL_uikitwindow.h" +#endif @implementation SDL_uikitview @@ -127,6 +133,241 @@ } } +/* + ---- Keyboard related functionality below this line ---- +*/ +#if SDL_IPHONE_KEYBOARD + +- (BOOL)keyboardVisible { + return keyboardVisible; +} + +/* UITextFieldDelegate related methods */ +- (void)initializeKeyboard { + + NSLog(@"Text field init"); + + textField = [[UITextField alloc] initWithFrame: CGRectZero]; + textField.delegate = self; + /* placeholder so there is something to delete! */ + textField.text = @" "; + + /* set UITextInputTrait properties, mostly to defaults */ + textField.autocapitalizationType = UITextAutocapitalizationTypeNone; + textField.autocorrectionType = UITextAutocorrectionTypeNo; + textField.enablesReturnKeyAutomatically = NO; + textField.keyboardAppearance = UIKeyboardAppearanceDefault; + textField.keyboardType = UIKeyboardTypeDefault; + textField.returnKeyType = UIReturnKeyDefault; + textField.secureTextEntry = NO; + + textField.hidden = YES; + keyboardVisible = NO; + [self addSubview: textField]; + + /* + SDL makes a copy of our keyboard. + */ + + SDL_Keyboard keyboard; + SDL_zero(keyboard); + //data->keyboard = SDL_AddKeyboard(&keyboard, -1); + /* + We'll need to delete this keyboard ... + */ + SDL_AddKeyboard(&keyboard, 0); + SDLKey keymap[SDL_NUM_SCANCODES]; + SDL_GetDefaultKeymap(keymap); + SDL_SetKeymap(0, 0, keymap, SDL_NUM_SCANCODES); + +} + +- (void)showKeyboard { + keyboardVisible = YES; + [textField becomeFirstResponder]; +} + +- (void)hideKeyboard { + keyboardVisible = NO; + [textField resignFirstResponder]; +} + +- (BOOL)textField:(UITextField *)_textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { + + if ([string length] == 0) { + /* it wants to replace text with nothing, ie a delete */ + SDL_SendKeyboardKey( 0, SDL_PRESSED, SDL_SCANCODE_DELETE); + SDL_SendKeyboardKey( 0, SDL_RELEASED, SDL_SCANCODE_DELETE); + } + else { + + int i; + for (i=0; i<[string length]; i++) { + + unichar c = [string characterAtIndex: i]; + + Uint16 mod = 0; + SDL_scancode code; + + if (c < 127) { + code = unicharToUIKeyInfoTable[c].code; + mod = unicharToUIKeyInfoTable[c].mod; + } + else { + code = SDL_SCANCODE_UNKNOWN; + mod = 0; + } + + if (mod & KMOD_SHIFT) { + SDL_SendKeyboardKey( 0, SDL_PRESSED, SDL_SCANCODE_LSHIFT); + } + SDL_SendKeyboardKey( 0, SDL_PRESSED, code); + SDL_SendKeyboardKey( 0, SDL_RELEASED, code); + if (mod & KMOD_SHIFT) { + SDL_SendKeyboardKey( 0, SDL_RELEASED, SDL_SCANCODE_LSHIFT); + } + + } + + } + return NO; /* don't allow the edit(!) */ +} + +/* Terminates the editing session */ +- (BOOL)textFieldShouldReturn:(UITextField*)_textField { + [self hideKeyboard]; + return YES; +} + +#endif + +@end + -@end +/* iPhone keyboard addition functions */ +#if SDL_IPHONE_KEYBOARD + +int SDL_iPhoneKeyboardShow(SDL_WindowID windowID) { + + SDL_Window *window = SDL_GetWindowFromID(windowID); + SDL_WindowData *data; + SDL_uikitview *view; + + if (NULL == window) { + SDL_SetError("Window does not exist"); + return -1; + } + + data = (SDL_WindowData *)window->driverdata; + view = data->view; + + if (nil == view) { + SDL_SetError("Window has no view"); + return -1; + } + else { + [view showKeyboard]; + return 0; + } +} + +int SDL_iPhoneKeyboardHide(SDL_WindowID windowID) { + + SDL_Window *window = SDL_GetWindowFromID(windowID); + SDL_WindowData *data; + SDL_uikitview *view; + + if (NULL == window) { + SDL_SetError("Window does not exist"); + return -1; + } + + data = (SDL_WindowData *)window->driverdata; + view = data->view; + + if (NULL == view) { + SDL_SetError("Window has no view"); + return -1; + } + else { + [view hideKeyboard]; + return 0; + } +} + +SDL_bool SDL_iPhoneKeyboardIsShown(SDL_WindowID windowID) { + + SDL_Window *window = SDL_GetWindowFromID(windowID); + SDL_WindowData *data; + SDL_uikitview *view; + + if (NULL == window) { + SDL_SetError("Window does not exist"); + return -1; + } + + data = (SDL_WindowData *)window->driverdata; + view = data->view; + + if (NULL == view) { + SDL_SetError("Window has no view"); + return 0; + } + else { + return view.keyboardVisible; + } +} + +int SDL_iPhoneKeyboardToggle(SDL_WindowID windowID) { + + SDL_Window *window = SDL_GetWindowFromID(windowID); + SDL_WindowData *data; + SDL_uikitview *view; + + if (NULL == window) { + SDL_SetError("Window does not exist"); + return -1; + } + + data = (SDL_WindowData *)window->driverdata; + view = data->view; + + if (NULL == view) { + SDL_SetError("Window has no view"); + return -1; + } + else { + if (SDL_iPhoneKeyboardIsShown(windowID)) { + SDL_iPhoneKeyboardHide(windowID); + } + else { + SDL_iPhoneKeyboardShow(windowID); + } + return 0; + } +} + +#else + +int SDL_iPhoneKeyboardShow(SDL_WindowID windowID) { + SDL_SetError("Not compiled with keyboard support"); + return -1; +} + +int SDL_iPhoneKeyboardHide(SDL_WindowID windowID) { + SDL_SetError("Not compiled with keyboard support"); + return -1; +} + +SDL_bool SDL_iPhoneKeyboardIsShown(SDL_WindowID windowID) { + return 0; +} + +int SDL_iPhoneKeyboardToggle(SDL_WindowID windowID) { + SDL_SetError("Not compiled with keyboard support"); + return -1; +} + + +#endif /* SDL_IPHONE_KEYBOARD */ \ No newline at end of file