From f0a204ad1e11b08242e17c7bbf6ec2485663e1c4 Mon Sep 17 00:00:00 2001 From: Holmes Futrell Date: Tue, 29 Jul 2008 17:21:49 +0000 Subject: [PATCH] SDL_uikitkeyboard extends SDL_uikitview to add keyboard support. It adds several methods to the SDL_uikitview class for keyboard initialization, showing, and hiding. SDL_uikitkeyboard.m contains the implementation of these methods as well as the implementation of some iPhone specific additions to SDL so that a programmer can access the functionality of hiding and showing the keyboard. --- src/video/uikit/SDL_uikitkeyboard.h | 47 +++++ src/video/uikit/SDL_uikitkeyboard.m | 263 ++++++++++++++++++++++++++++ 2 files changed, 310 insertions(+) create mode 100644 src/video/uikit/SDL_uikitkeyboard.h create mode 100644 src/video/uikit/SDL_uikitkeyboard.m diff --git a/src/video/uikit/SDL_uikitkeyboard.h b/src/video/uikit/SDL_uikitkeyboard.h new file mode 100644 index 000000000..a46487331 --- /dev/null +++ b/src/video/uikit/SDL_uikitkeyboard.h @@ -0,0 +1,47 @@ +/* + 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 new file mode 100644 index 000000000..b7b43c221 --- /dev/null +++ b/src/video/uikit/SDL_uikitkeyboard.m @@ -0,0 +1,263 @@ +/* + 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 */