Navigation Menu

Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Commit

Permalink
SDL_uikitkeyboard extends SDL_uikitview to add keyboard support. It a…
Browse files Browse the repository at this point in the history
…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
Show file tree
Hide file tree
Showing 2 changed files with 310 additions and 0 deletions.
47 changes: 47 additions & 0 deletions 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 */
263 changes: 263 additions & 0 deletions 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 */

0 comments on commit f0a204a

Please sign in to comment.