From 1b361b271f6095e3bbec099e37c4bd2c494d05e8 Mon Sep 17 00:00:00 2001 From: Holmes Futrell Date: Wed, 13 Aug 2008 23:14:36 +0000 Subject: [PATCH] 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. --- src/video/uikit/SDL_uikitkeyboard.h | 47 ----- src/video/uikit/SDL_uikitkeyboard.m | 263 ---------------------------- src/video/uikit/SDL_uikitview.h | 14 ++ src/video/uikit/SDL_uikitview.m | 243 ++++++++++++++++++++++++- 4 files changed, 256 insertions(+), 311 deletions(-) delete mode 100644 src/video/uikit/SDL_uikitkeyboard.h delete mode 100644 src/video/uikit/SDL_uikitkeyboard.m diff --git a/src/video/uikit/SDL_uikitkeyboard.h b/src/video/uikit/SDL_uikitkeyboard.h deleted file mode 100644 index a46487331..000000000 --- a/src/video/uikit/SDL_uikitkeyboard.h +++ /dev/null @@ -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 --git a/src/video/uikit/SDL_uikitkeyboard.m b/src/video/uikit/SDL_uikitkeyboard.m deleted file mode 100644 index b7b43c221..000000000 --- a/src/video/uikit/SDL_uikitkeyboard.m +++ /dev/null @@ -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 --git a/src/video/uikit/SDL_uikitview.h b/src/video/uikit/SDL_uikitview.h index 8e6444574..cac75c600 100644 --- a/src/video/uikit/SDL_uikitview.h +++ b/src/video/uikit/SDL_uikitview.h @@ -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 --git a/src/video/uikit/SDL_uikitview.m b/src/video/uikit/SDL_uikitview.m index 35b25fb95..d7920e391 100644 --- a/src/video/uikit/SDL_uikitview.m +++ b/src/video/uikit/SDL_uikitview.m @@ -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 @@ - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { } } +/* + ---- 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 + + + +/* 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