This repository has been archived by the owner on Feb 11, 2021. It is now read-only.
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
SDL_uikitkeyboard extends SDL_uikitview to add keyboard support. It a…
…dds 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.
- Loading branch information
Holmes Futrell
committed
Jul 29, 2008
1 parent
88b2d16
commit f0a204a
Showing
2 changed files
with
310 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 */ |