changeset 2419:ab89ff6e97af gsoc2008_iphone

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.
author Holmes Futrell <hfutrell@umail.ucsb.edu>
date Wed, 13 Aug 2008 23:14:36 +0000
parents 9aac7992ed85
children e759e6f98343
files src/video/uikit/SDL_uikitkeyboard.h src/video/uikit/SDL_uikitkeyboard.m src/video/uikit/SDL_uikitview.h src/video/uikit/SDL_uikitview.m
diffstat 4 files changed, 257 insertions(+), 312 deletions(-) [+]
line wrap: on
line diff
--- a/src/video/uikit/SDL_uikitkeyboard.h	Wed Aug 13 23:12:00 2008 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -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 */
--- a/src/video/uikit/SDL_uikitkeyboard.m	Wed Aug 13 23:12:00 2008 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -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 */
--- a/src/video/uikit/SDL_uikitview.h	Wed Aug 13 23:12:00 2008 +0000
+++ b/src/video/uikit/SDL_uikitview.h	Wed Aug 13 23:14:36 2008 +0000
@@ -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
--- a/src/video/uikit/SDL_uikitview.m	Wed Aug 13 23:12:00 2008 +0000
+++ b/src/video/uikit/SDL_uikitview.m	Wed Aug 13 23:14:36 2008 +0000
@@ -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 @@
 	}
 }
 
+/*
+	---- 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
+
 
 
-@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