Skip to content
This repository has been archived by the owner. It is now read-only.
Permalink
Browse files
Originally keyboard support was in the form of a category of the clas…
…s 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.
  • Loading branch information
Holmes Futrell committed Aug 13, 2008
1 parent 9a124f4 commit 1b361b271f6095e3bbec099e37c4bd2c494d05e8

File 4 of 4 in 1b361b2

@@ -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 */

0 comments on commit 1b361b2

Please sign in to comment.