move all sdl source files in a proper directory
authorkoda
Fri, 08 Jan 2010 03:52:44 +0000
changeset 2688 174c94b8ea72
parent 2687 28b8330b8af1
child 2689 dfda97c153a4
move all sdl source files in a proper directory remove hackish code to get a window up, now it should be quite clean
cocoaTouch/SDLOverrides/SDL_uikitappdelegate.h
cocoaTouch/SDLOverrides/SDL_uikitappdelegate.m
cocoaTouch/SDLOverrides/SDL_uikitview.h
cocoaTouch/SDLOverrides/SDL_uikitview.m
cocoaTouch/SDLOverrides/SDL_uikitwindow.h
cocoaTouch/SDLOverrides/SDL_uikitwindow.m
cocoaTouch/SDL_uikitappdelegate.h
cocoaTouch/SDL_uikitappdelegate.m
cocoaTouch/SDL_uikitview.h
cocoaTouch/SDL_uikitview.m
hedgewars/hwengine.pas
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cocoaTouch/SDLOverrides/SDL_uikitappdelegate.h	Fri Jan 08 03:52:44 2010 +0000
@@ -0,0 +1,40 @@
+/*
+    SDL - Simple DirectMedia Layer
+    Copyright (C) 1997-2009 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, mods for Hedgewars by Vittorio Giovara
+    slouken@libsdl.org, vittorio.giovara@gmail.com
+*/
+
+#import <UIKit/UIKit.h>
+#import "SDL_video.h"
+
+@interface SDLUIKitDelegate:NSObject<UIApplicationDelegate> {
+    UIWindow *window;
+	SDL_WindowID windowID;
+	UITabBarController *controller;
+}
+
+// the outlets are set in MainWindow.xib
+@property (readwrite, retain) IBOutlet UIWindow *window;
+@property (readwrite, assign) SDL_WindowID windowID;
+@property (nonatomic, retain) IBOutlet UITabBarController *controller;
+
++(SDLUIKitDelegate *)sharedAppDelegate;
+-(void) startSDLgame;
+
+@end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cocoaTouch/SDLOverrides/SDL_uikitappdelegate.m	Fri Jan 08 03:52:44 2010 +0000
@@ -0,0 +1,129 @@
+/*
+ SDL - Simple DirectMedia Layer
+ Copyright (C) 1997-2009 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, mods for Hedgewars by Vittorio Giovara
+ slouken@libsdl.org, vittorio.giovara@gmail.com
+*/
+
+#import "SDL_uikitappdelegate.h"
+#import "SDL_uikitopenglview.h"
+#import "SDL_events_c.h"
+#import "jumphack.h"
+#import "SDL_video.h"
+
+#ifdef main
+#undef main
+#endif
+
+extern int SDL_main(int argc, char *argv[]);
+static int forward_argc;
+static char **forward_argv;
+
+int main (int argc, char **argv) {
+	int i;
+	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+	
+	/* store arguments */
+	forward_argc = argc;
+	forward_argv = (char **)malloc(argc * sizeof(char *));
+	for (i = 0; i < argc; i++) {
+		forward_argv[i] = malloc( (strlen(argv[i])+1) * sizeof(char));
+		strcpy(forward_argv[i], argv[i]);
+	}
+
+	/* Give over control to run loop, SDLUIKitDelegate will handle most things from here */
+	UIApplicationMain(argc, argv, NULL, @"SDLUIKitDelegate");
+	
+	[pool release];
+}
+
+@implementation SDLUIKitDelegate
+
+@synthesize window, windowID, controller;
+
+/* convenience method */
++(SDLUIKitDelegate *)sharedAppDelegate {
+	/* the delegate is set in UIApplicationMain(), which is garaunteed to be called before this method */
+	return (SDLUIKitDelegate *)[[UIApplication sharedApplication] delegate];
+}
+
+- (void) startSDLgame {
+
+	/* run the user's application, passing argc and argv */
+	NSLog(@"Game is launching");
+	SDL_main(forward_argc, forward_argv);
+	// can't reach here yet
+	NSLog(@"Game exited");
+
+	//[self performSelector:@selector(makeNewView) withObject:nil afterDelay:0.0];
+	/* exit, passing the return status from the user's application */
+	//exit(exit_status);
+}
+
+// override the direct execution of SDL_main to allow us to implement the frontend (even using a nib)
+-(void) applicationDidFinishLaunching:(UIApplication *)application {
+	[application setStatusBarHidden:YES animated:NO];
+
+	/* Set working directory to resource path */
+	[[NSFileManager defaultManager] changeCurrentDirectoryPath: [[NSBundle mainBundle] resourcePath]];
+	
+	[window addSubview:controller.view];
+	[window makeKeyAndVisible];
+}
+
+-(void) applicationWillTerminate:(UIApplication *)application {
+	/* free the memory we used to hold copies of argc and argv */
+	int i;
+	for (i=0; i < forward_argc; i++) {
+		free(forward_argv[i]);
+	}
+	free(forward_argv);	
+	SDL_SendQuit();
+	 /* hack to prevent automatic termination.  See SDL_uikitevents.m for details */
+	// have to remove this otherwise game goes on when pushing the home button
+	//longjmp(*(jump_env()), 1);
+	
+	NSLog(@"Closing App...");
+}
+
+-(void) applicationWillResignActive:(UIApplication*)application
+{
+//	NSLog(@"%@", NSStringFromSelector(_cmd));
+	SDL_SendWindowEvent(self.windowID, SDL_WINDOWEVENT_MINIMIZED, 0, 0);
+}
+
+-(void) applicationDidBecomeActive:(UIApplication*)application
+{
+//	NSLog(@"%@", NSStringFromSelector(_cmd));
+	SDL_SendWindowEvent(self.windowID, SDL_WINDOWEVENT_RESTORED, 0, 0);
+}
+
+/*
+-(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation {
+	NSLog(@"Rotating...");
+	return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
+}
+*/
+
+-(void) dealloc {
+	[controller release];
+	[window release];
+	[super dealloc];
+}
+
+@end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cocoaTouch/SDLOverrides/SDL_uikitview.h	Fri Jan 08 03:52:44 2010 +0000
@@ -0,0 +1,77 @@
+/*
+ SDL - Simple DirectMedia Layer
+ Copyright (C) 1997-2009 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, mods for Hedgewars by Vittorio Giovara
+ slouken@libsdl.org, vittorio.giovara@gmail.com
+ */
+
+#import <UIKit/UIKit.h>
+#include "SDL_stdinc.h"
+#include "SDL_mouse.h"
+#include "SDL_mouse_c.h"
+#include "SDL_events.h"
+
+#import "CGPointUtils.h"
+
+#if SDL_IPHONE_MULTIPLE_MICE
+#define MAX_SIMULTANEOUS_TOUCHES 5
+#else
+#define MAX_SIMULTANEOUS_TOUCHES 1
+#endif
+
+// constants for telling which input has been received
+#define kMinimumPinchDelta		100
+#define kMinimumGestureLength	20
+#define kMaximumVariance		4
+
+/* *INDENT-OFF* */
+//#if SDL_IPHONE_KEYBOARD
+//@interface SDL_uikitview : UIView<UITextFieldDelegate> {
+//#else
+@interface SDL_uikitview : UIView {
+//#endif
+	SDL_Mouse mice[MAX_SIMULTANEOUS_TOUCHES];
+	CGFloat initialDistance;
+	CGPoint gestureStartPoint;
+
+#if SDL_IPHONE_KEYBOARD
+	UITextField *textField;
+	BOOL keyboardVisible;
+#endif
+}
+
+-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
+-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
+-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
+
+// see initWithFrame for why "+"
++(void) attackButtonPressed;
++(void) attackButtonReleased;
+
+@property CGFloat initialDistance;
+@property CGPoint gestureStartPoint;
+
+#if SDL_IPHONE_KEYBOARD
+- (void)showKeyboard;
+- (void)hideKeyboard;
+- (void)initializeKeyboard;
+@property (readonly) BOOL keyboardVisible;
+#endif 
+
+@end
+/* *INDENT-ON* */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cocoaTouch/SDLOverrides/SDL_uikitview.m	Fri Jan 08 03:52:44 2010 +0000
@@ -0,0 +1,494 @@
+/*
+ SDL - Simple DirectMedia Layer
+ Copyright (C) 1997-2009 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, mods for Hedgewars by Vittorio Giovara
+ slouken@libsdl.org, vittorio.giovara@gmail.com
+ */
+
+#include "PascalImports.h"
+#import "SDL_uikitview.h"
+#import "SDL_uikitappdelegate.h"
+
+#if SDL_IPHONE_KEYBOARD
+#import "SDL_keyboard_c.h"
+#import "keyinfotable.h"
+#import "SDL_uikitwindow.h"
+#endif
+
+@implementation SDL_uikitview
+
+@synthesize initialDistance, gestureStartPoint;
+
+- (void)dealloc {
+#if SDL_IPHONE_KEYBOARD
+	SDL_DelKeyboard(0);
+	[textField release];
+#endif
+	[super dealloc];
+}
+
+- (id)initWithFrame:(CGRect)frame {
+
+	self = [super initWithFrame: frame];
+	
+#if SDL_IPHONE_KEYBOARD
+	[self initializeKeyboard];
+#endif	
+
+	int i;
+	for (i=0; i<MAX_SIMULTANEOUS_TOUCHES; i++) {
+        mice[i].id = i;
+		mice[i].driverdata = NULL;
+		SDL_AddMouse(&mice[i], "Mouse", 0, 0, 1);
+	}
+	
+	UIButton *attackButton;
+
+	attackButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 90,60)];
+	[attackButton setBackgroundImage:[UIImage imageNamed:@"Default.png"] forState:UIControlStateNormal];
+	// this object is inherited by SDL_openglesview.m which is the one allocated by SDL.
+	// We select this class with [self superclass] and call the selectors with "+" because
+	// they are superclass methods 
+	[attackButton addTarget:[self superclass] action:@selector(attackButtonPressed) forControlEvents:UIControlEventTouchDown];
+	[attackButton addTarget:[self superclass] action:@selector(attackButtonReleased) forControlEvents:UIControlEventTouchUpInside|UIControlEventTouchUpOutside];
+	[self insertSubview:attackButton atIndex:10];
+	[attackButton release];
+
+	self.multipleTouchEnabled = YES;
+			
+	return self;
+}
+
+#pragma mark -
+#pragma mark Superclass methods
++(void) attackButtonPressed {
+	HW_shoot();
+}
+
++(void) attackButtonReleased {
+	HW_allKeysUp();
+}
+
+#pragma mark -
+#pragma mark Custom SDL_UIView input handling
+
+// we override default touch input to implement our own gestures
+- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
+	/*NSEnumerator *enumerator = [touches objectEnumerator];
+	UITouch *touch =(UITouch*)[enumerator nextObject];
+	
+	/* associate touches with mice, so long as we have slots 
+	int i;
+	int found = 0;
+	for(i=0; touch && i < MAX_SIMULTANEOUS_TOUCHES; i++) {
+	
+		/* check if this mouse is already tracking a touch 
+		if (mice[i].driverdata != NULL) {
+			continue;
+		}
+		/*	
+			mouse not associated with anything right now,
+			associate the touch with this mouse
+		
+		found = 1;
+		
+		/* save old mouse so we can switch back 
+		int oldMouse = SDL_SelectMouse(-1);
+		
+		/* select this slot's mouse 
+		SDL_SelectMouse(i);
+		CGPoint locationInView = [touch locationInView: self];
+		
+		/* set driver data to touch object, we'll use touch object later 
+		mice[i].driverdata = [touch retain];
+		
+		/* send moved event 
+		SDL_SendMouseMotion(i, 0, locationInView.x, locationInView.y, 0);
+		
+		/* send mouse down event 
+		SDL_SendMouseButton(i, SDL_PRESSED, SDL_BUTTON_LEFT);
+		
+		/* re-calibrate relative mouse motion 
+		SDL_GetRelativeMouseState(i, NULL, NULL);
+		
+		/* grab next touch 
+		touch = (UITouch*)[enumerator nextObject]; 
+		
+		/* switch back to our old mouse 
+		SDL_SelectMouse(oldMouse);
+		
+	}	*/
+	
+	UITouch *touch = [touches anyObject];
+	gestureStartPoint = [touch locationInView:self];
+
+	// one tap - single click
+	if (1 == [touch tapCount] ) {
+		//SDL_WarpMouseInWindow([SDLUIKitDelegate sharedAppDelegate].windowID, gestureStartPoint.x, gestureStartPoint.y);
+		HW_click();
+	}
+	
+	// two taps - right click
+	if (2 == [touch tapCount] ) {
+		HW_ammoMenu();
+	}
+	
+	// two taps with two fingers - middle click
+	if (2 == [touch tapCount] && 2 == [touches count]) {
+		HW_zoomReset();
+	}
+	
+	// two fingers - begin pinching
+	if (2 == [touches count]) {
+		NSArray *twoTouches = [touches allObjects];
+		UITouch *first = [twoTouches objectAtIndex:0];
+		UITouch *second = [twoTouches objectAtIndex:1];
+		initialDistance = distanceBetweenPoints([first locationInView:self], [second locationInView:self]);
+	}
+}
+
+- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
+	initialDistance = 0;
+//	NSLog(@"touches ended, sigh");
+	
+	HW_allKeysUp();
+	/*NSEnumerator *enumerator = [touches objectEnumerator];
+	UITouch *touch=nil;
+	
+	while(touch = (UITouch *)[enumerator nextObject]) {
+		/* search for the mouse slot associated with this touch 
+		int i, found = NO;
+		for (i=0; i<MAX_SIMULTANEOUS_TOUCHES && !found; i++) {
+			if (mice[i].driverdata == touch) {
+				/* found the mouse associate with the touch 
+				[(UITouch*)(mice[i].driverdata) release];
+				mice[i].driverdata = NULL;
+				/* send mouse up 
+				SDL_SendMouseButton(i, SDL_RELEASED, SDL_BUTTON_LEFT);
+				/* discontinue search for this touch 
+				found = YES;
+			}
+		}
+	}*/
+}
+
+- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
+	/*
+		this can happen if the user puts more than 5 touches on the screen
+		at once, or perhaps in other circumstances.  Usually (it seems)
+		all active touches are canceled.
+	*/
+	[self touchesEnded: touches withEvent: event];
+}
+
+- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
+	UITouch *touch = [touches anyObject];
+	CGPoint currentPosition = [touch locationInView:self];
+	
+	CGFloat Xdiff = gestureStartPoint.x - currentPosition.x;
+	CGFloat Ydiff = gestureStartPoint.y - currentPosition.y;
+	CGFloat deltaX = fabsf(Xdiff);
+    CGFloat deltaY = fabsf(Ydiff);
+    
+	if (deltaX >= kMinimumGestureLength && deltaY <= kMaximumVariance) {
+		NSLog(@"Horizontal swipe detected, begX:%f curX:%f", gestureStartPoint.x, currentPosition.x);
+		if (Xdiff > 0) HW_walkLeft();
+		else HW_walkRight();
+    }
+    else if (deltaY >= kMinimumGestureLength && deltaX <= kMaximumVariance){
+		NSLog(@"Vertical swipe detected, begY:%f curY:%f", gestureStartPoint.y, currentPosition.y);
+		if (Ydiff > 0) HW_aimUp();
+		else HW_aimDown();
+	}
+	
+	// end pinch detection
+	if (2 == [touches count]) {
+		NSArray *twoTouches = [touches allObjects];
+		UITouch *first = [twoTouches objectAtIndex:0];
+		UITouch *second = [twoTouches objectAtIndex:1];
+		CGFloat currentDistance = distanceBetweenPoints([first locationInView:self], [second locationInView:self]);
+	
+		if (0 == initialDistance) 
+			initialDistance = currentDistance;
+		else if (currentDistance - initialDistance > kMinimumPinchDelta) {
+			NSLog(@"Outward pinch detected");
+			HW_zoomOut();
+		}
+		else if (initialDistance - currentDistance > kMinimumPinchDelta) {
+			NSLog(@"Inward pinch detected");
+			HW_zoomIn();
+		}
+	}
+	
+	/*NSEnumerator *enumerator = [touches objectEnumerator];
+	 UITouch *touch=nil;while(touch = (UITouch *)[enumerator nextObject]) {
+		// try to find the mouse associated with this touch 
+		int i, found = NO;
+		for (i=0; i<MAX_SIMULTANEOUS_TOUCHES && !found; i++) {
+			if (mice[i].driverdata == touch) {
+				// found proper mouse 
+				CGPoint locationInView = [touch locationInView: self];
+				// send moved event 
+				SDL_SendMouseMotion(i, 0, locationInView.x, locationInView.y, 0);
+				// discontinue search 
+				found = YES;
+			}
+		}
+	}*/
+}
+
+#pragma mark -
+#pragma mark default routines
+/*
+	---- Keyboard related functionality below this line ----
+*/
+#if SDL_IPHONE_KEYBOARD
+
+/* Is the iPhone virtual keyboard visible onscreen? */
+- (BOOL)keyboardVisible {
+	return keyboardVisible;
+}
+
+/* Set ourselves up as a UITextFieldDelegate */
+- (void)initializeKeyboard {
+		
+	textField = [[[UITextField alloc] initWithFrame: CGRectZero] autorelease];
+	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;
+	/* add the UITextField (hidden) to our view */
+	[self addSubview: textField];
+	
+	/* create our SDL_Keyboard */
+	SDL_Keyboard keyboard;
+	SDL_zero(keyboard);
+	SDL_AddKeyboard(&keyboard, 0);
+	SDLKey keymap[SDL_NUM_SCANCODES];
+	SDL_GetDefaultKeymap(keymap);
+	SDL_SetKeymap(0, 0, keymap, SDL_NUM_SCANCODES);
+	
+}
+
+/* reveal onscreen virtual keyboard */
+- (void)showKeyboard {
+	keyboardVisible = YES;
+	[textField becomeFirstResponder];
+}
+
+/* hide onscreen virtual keyboard */
+- (void)hideKeyboard {
+	keyboardVisible = NO;
+	[textField resignFirstResponder];
+}
+
+/* UITextFieldDelegate method.  Invoked when user types something. */
+- (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 {
+		/* go through all the characters in the string we've been sent
+		   and convert them to key presses */
+		int i;
+		for (i=0; i<[string length]; i++) {
+			
+			unichar c = [string characterAtIndex: i];
+			
+			Uint16 mod = 0;
+			SDL_scancode code;
+			
+			if (c < 127) {
+				/* figure out the SDL_scancode and SDL_keymod for this unichar */
+				code = unicharToUIKeyInfoTable[c].code;
+				mod  = unicharToUIKeyInfoTable[c].mod;
+			}
+			else {
+				/* we only deal with ASCII right now */
+				code = SDL_SCANCODE_UNKNOWN;
+				mod = 0;
+			}
+			
+			if (mod & KMOD_SHIFT) {
+				/* If character uses shift, press shift down */
+				SDL_SendKeyboardKey( 0, SDL_PRESSED, SDL_SCANCODE_LSHIFT);
+			}
+			/* send a keydown and keyup even for the character */
+			SDL_SendKeyboardKey( 0, SDL_PRESSED, code);
+			SDL_SendKeyboardKey( 0, SDL_RELEASED, code);
+			if (mod & KMOD_SHIFT) {
+				/* If character uses shift, press shift back up */
+				SDL_SendKeyboardKey( 0, SDL_RELEASED, SDL_SCANCODE_LSHIFT);
+			}			
+		}
+	}
+	return NO; /* don't allow the edit! (keep placeholder text there) */
+}
+
+/* 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
+
+/* stubs, used if compiled without keyboard support */
+
+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 */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cocoaTouch/SDLOverrides/SDL_uikitwindow.h	Fri Jan 08 03:52:44 2010 +0000
@@ -0,0 +1,47 @@
+/*
+ SDL - Simple DirectMedia Layer
+ Copyright (C) 1997-2009 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, mods for Hedgewars by Vittorio Giovara
+ slouken@libsdl.org, vittorio.giovara@gmail.com
+ */
+#include "SDL_config.h"
+
+#ifndef _SDL_uikitwindow_h
+#define _SDL_uikitwindow_h
+
+#include "../SDL_sysvideo.h"
+#import "SDL_uikitopenglview.h"
+
+typedef struct SDL_WindowData SDL_WindowData;
+
+extern int UIKit_CreateWindow(_THIS, SDL_Window * window);
+extern void UIKit_DestroyWindow(_THIS, SDL_Window * window);
+
+@class UIWindow;
+
+struct SDL_WindowData
+{
+    SDL_WindowID windowID;
+    UIWindow *uiwindow;
+    SDL_uikitopenglview *view;
+};
+
+
+#endif /* _SDL_uikitwindow_h */
+
+/* vi: set ts=4 sw=4 expandtab: */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cocoaTouch/SDLOverrides/SDL_uikitwindow.m	Fri Jan 08 03:52:44 2010 +0000
@@ -0,0 +1,124 @@
+/*
+ SDL - Simple DirectMedia Layer
+ Copyright (C) 1997-2009 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, mods for Hedgewars by Vittorio Giovara
+ slouken@libsdl.org, vittorio.giovara@gmail.com
+ */
+#include "SDL_config.h"
+
+#include "SDL_video.h"
+#include "SDL_mouse.h"
+#include "../SDL_sysvideo.h"
+#include "../SDL_pixels_c.h"
+#include "../../events/SDL_events_c.h"
+
+#include "SDL_uikitvideo.h"
+#include "SDL_uikitevents.h"
+#include "SDL_uikitwindow.h"
+#import "SDL_uikitappdelegate.h"
+
+#import "SDL_uikitopenglview.h"
+#import "SDL_renderer_sw.h"
+
+#include <UIKit/UIKit.h>
+#include <Foundation/Foundation.h>
+
+static int SetupWindowData(_THIS, SDL_Window *window, UIWindow *uiwindow, SDL_bool created) {
+
+    SDL_WindowData *data;
+		
+    /* Allocate the window data */
+    data = (SDL_WindowData *)SDL_malloc(sizeof(*data));
+    if (!data) {
+        SDL_OutOfMemory();
+        return -1;
+    }
+    data->windowID = window->id;
+    data->uiwindow = uiwindow;
+	data->view = nil;
+		
+    /* Fill in the SDL window with the window data */
+	{
+        window->x = 0;
+        window->y = 0;
+        window->w = (int)uiwindow.frame.size.width;
+        window->h = (int)uiwindow.frame.size.height;
+    }
+	
+	window->driverdata = data;
+	
+	window->flags &= ~SDL_WINDOW_RESIZABLE;		/* window is NEVER resizeable */
+	window->flags |= SDL_WINDOW_OPENGL;			/* window is always OpenGL */
+	window->flags |= SDL_WINDOW_FULLSCREEN;		/* window is always fullscreen */
+	window->flags |= SDL_WINDOW_SHOWN;			/* only one window on iPod touch, always shown */
+	window->flags |= SDL_WINDOW_INPUT_FOCUS;	/* always has input focus */	
+
+	/* SDL_WINDOW_BORDERLESS controls whether status bar is hidden */
+	if (window->flags & SDL_WINDOW_BORDERLESS) {
+		[UIApplication sharedApplication].statusBarHidden = YES;
+	}
+	else {
+		[UIApplication sharedApplication].statusBarHidden = NO;
+	}
+	
+    return 0;
+	
+}
+
+int UIKit_CreateWindow(_THIS, SDL_Window *window) {
+	/* We currently only handle single window applications on iPhone 
+	if (nil != [SDLUIKitDelegate sharedAppDelegate].window) {
+		SDL_SetError("Window already exists, no multi-window support.");
+		return -1;
+	}
+	
+	// ignore the size user requested, and make a fullscreen window 
+	UIWindow *uiwindow = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];*/
+	
+	// since we handle the window with a NIB, we don't need the initialization above
+	if (SetupWindowData(_this, window, [SDLUIKitDelegate sharedAppDelegate].window, SDL_TRUE) < 0) {
+		SDL_SetError("SetupWindowData() failed");
+        return -1;
+    }	
+	
+	// This saves the main window in the app delegate so event callbacks can do stuff on the window.
+	// This assumes a single window application design and needs to be fixed for multiple windows.
+	[SDLUIKitDelegate sharedAppDelegate].windowID = window->id;
+
+/*	[SDLUIKitDelegate sharedAppDelegate].window = uiwindow;
+	[uiwindow release]; /* release the window (the app delegate has retained it) */
+	
+	return 1;
+	
+}
+
+void UIKit_DestroyWindow(_THIS, SDL_Window * window) {
+	/* don't worry, the delegate will automatically release the window */
+	
+	SDL_WindowData *data = (SDL_WindowData *)window->driverdata;
+	if (data) {
+		SDL_free( window->driverdata );
+	}
+
+	/* this will also destroy the window */
+	//[SDLUIKitDelegate sharedAppDelegate].window = nil;
+	[SDLUIKitDelegate sharedAppDelegate].windowID = 0;
+
+}
+
+/* vi: set ts=4 sw=4 expandtab: */
--- a/cocoaTouch/SDL_uikitappdelegate.h	Fri Jan 08 03:38:01 2010 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-/*
-    SDL - Simple DirectMedia Layer
-    Copyright (C) 1997-2009 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, mods for Hedgewars by Vittorio Giovara
-    slouken@libsdl.org, vittorio.giovara@gmail.com
-*/
-
-#import <UIKit/UIKit.h>
-#import "SDL_video.h"
-
-@interface SDLUIKitDelegate:NSObject<UIApplicationDelegate> {
-    UIWindow *window;
-	SDL_WindowID windowID;
-	UITabBarController *controller;
-}
-
-// the outlets are set in MainWindow.xib
-@property (readwrite, retain) IBOutlet UIWindow *window;
-@property (readwrite, assign) SDL_WindowID windowID;
-@property (nonatomic, retain) IBOutlet UITabBarController *controller;
-
-+(SDLUIKitDelegate *)sharedAppDelegate;
--(void) startSDLgame;
-
-@end
--- a/cocoaTouch/SDL_uikitappdelegate.m	Fri Jan 08 03:38:01 2010 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,140 +0,0 @@
-/*
- SDL - Simple DirectMedia Layer
- Copyright (C) 1997-2009 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, mods for Hedgewars by Vittorio Giovara
- slouken@libsdl.org, vittorio.giovara@gmail.com
-*/
-
-#import "SDL_uikitappdelegate.h"
-#import "SDL_uikitopenglview.h"
-#import "SDL_events_c.h"
-#import "jumphack.h"
-#import "SDL_video.h"
-
-#ifdef main
-#undef main
-#endif
-
-extern int SDL_main(int argc, char *argv[]);
-static int forward_argc;
-static char **forward_argv;
-
-int main (int argc, char **argv) {
-	int i;
-	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
-	
-	/* store arguments */
-	forward_argc = argc;
-	forward_argv = (char **)malloc(argc * sizeof(char *));
-	for (i = 0; i < argc; i++) {
-		forward_argv[i] = malloc( (strlen(argv[i])+1) * sizeof(char));
-		strcpy(forward_argv[i], argv[i]);
-	}
-
-	/* Give over control to run loop, SDLUIKitDelegate will handle most things from here */
-	UIApplicationMain(argc, argv, NULL, @"SDLUIKitDelegate");
-	
-	[pool release];
-}
-
-@implementation SDLUIKitDelegate
-
-@synthesize window, windowID, controller;
-
-/* convenience method */
-+(SDLUIKitDelegate *)sharedAppDelegate {
-	/* the delegate is set in UIApplicationMain(), which is garaunteed to be called before this method */
-	return (SDLUIKitDelegate *)[[UIApplication sharedApplication] delegate];
-}
-
-/*- (id)init {
-	self = [super init];
-	window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] ;
-	windowID = 0;
-	return self;
-}*/
-
-- (void) startSDLgame {
-	// HACK: remove the current window and let SDL create a new one
-	[self.window release];
-	if (nil != self.window)
-		self.window = nil;
-	
-	/* run the user's application, passing argc and argv */
-	NSLog(@"Game is launching");
-	SDL_main(forward_argc, forward_argv);
-	// can't reach here yet
-	NSLog(@"Game exited");
-
-	//[self performSelector:@selector(makeNewView) withObject:nil afterDelay:0.0];
-	/* exit, passing the return status from the user's application */
-	//exit(exit_status);
-}
-
-// override the direct execution of SDL_main to allow us to implement the frontend (even using a nib)
--(void) applicationDidFinishLaunching:(UIApplication *)application {
-	[application setStatusBarHidden:YES animated:NO];
-
-	/* Set working directory to resource path */
-	[[NSFileManager defaultManager] changeCurrentDirectoryPath: [[NSBundle mainBundle] resourcePath]];
-	
-	[window addSubview:controller.view];
-	[window makeKeyAndVisible];
-}
-
--(void) applicationWillTerminate:(UIApplication *)application {
-	/* free the memory we used to hold copies of argc and argv */
-	int i;
-	for (i=0; i < forward_argc; i++) {
-		free(forward_argv[i]);
-	}
-	free(forward_argv);	
-	SDL_SendQuit();
-	 /* hack to prevent automatic termination.  See SDL_uikitevents.m for details */
-	// have to remove this otherwise game goes on when pushing the home button
-	//longjmp(*(jump_env()), 1);
-	
-	NSLog(@"Closing App...");
-}
-
--(void) applicationWillResignActive:(UIApplication*)application
-{
-//	NSLog(@"%@", NSStringFromSelector(_cmd));
-	SDL_SendWindowEvent(self.windowID, SDL_WINDOWEVENT_MINIMIZED, 0, 0);
-}
-
--(void) applicationDidBecomeActive:(UIApplication*)application
-{
-//	NSLog(@"%@", NSStringFromSelector(_cmd));
-	SDL_SendWindowEvent(self.windowID, SDL_WINDOWEVENT_RESTORED, 0, 0);
-}
-
-/*
--(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation {
-	NSLog(@"Rotating...");
-	return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
-}
-*/
-
--(void) dealloc {
-	[controller release];
-	[window release];
-	[super dealloc];
-}
-
-@end
--- a/cocoaTouch/SDL_uikitview.h	Fri Jan 08 03:38:01 2010 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,77 +0,0 @@
-/*
- SDL - Simple DirectMedia Layer
- Copyright (C) 1997-2009 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, mods for Hedgewars by Vittorio Giovara
- slouken@libsdl.org, vittorio.giovara@gmail.com
- */
-
-#import <UIKit/UIKit.h>
-#include "SDL_stdinc.h"
-#include "SDL_mouse.h"
-#include "SDL_mouse_c.h"
-#include "SDL_events.h"
-
-#import "CGPointUtils.h"
-
-#if SDL_IPHONE_MULTIPLE_MICE
-#define MAX_SIMULTANEOUS_TOUCHES 5
-#else
-#define MAX_SIMULTANEOUS_TOUCHES 1
-#endif
-
-// constants for telling which input has been received
-#define kMinimumPinchDelta		100
-#define kMinimumGestureLength	20
-#define kMaximumVariance		4
-
-/* *INDENT-OFF* */
-//#if SDL_IPHONE_KEYBOARD
-//@interface SDL_uikitview : UIView<UITextFieldDelegate> {
-//#else
-@interface SDL_uikitview : UIView {
-//#endif
-	SDL_Mouse mice[MAX_SIMULTANEOUS_TOUCHES];
-	CGFloat initialDistance;
-	CGPoint gestureStartPoint;
-
-#if SDL_IPHONE_KEYBOARD
-	UITextField *textField;
-	BOOL keyboardVisible;
-#endif
-}
-
--(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
--(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
--(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
-
-// see initWithFrame for why "+"
-+(void) attackButtonPressed;
-+(void) attackButtonReleased;
-
-@property CGFloat initialDistance;
-@property CGPoint gestureStartPoint;
-
-#if SDL_IPHONE_KEYBOARD
-- (void)showKeyboard;
-- (void)hideKeyboard;
-- (void)initializeKeyboard;
-@property (readonly) BOOL keyboardVisible;
-#endif 
-
-@end
-/* *INDENT-ON* */
--- a/cocoaTouch/SDL_uikitview.m	Fri Jan 08 03:38:01 2010 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,494 +0,0 @@
-/*
- SDL - Simple DirectMedia Layer
- Copyright (C) 1997-2009 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, mods for Hedgewars by Vittorio Giovara
- slouken@libsdl.org, vittorio.giovara@gmail.com
- */
-
-#include "PascalImports.h"
-#import "SDL_uikitview.h"
-#import "SDL_uikitappdelegate.h"
-
-#if SDL_IPHONE_KEYBOARD
-#import "SDL_keyboard_c.h"
-#import "keyinfotable.h"
-#import "SDL_uikitwindow.h"
-#endif
-
-@implementation SDL_uikitview
-
-@synthesize initialDistance, gestureStartPoint;
-
-- (void)dealloc {
-#if SDL_IPHONE_KEYBOARD
-	SDL_DelKeyboard(0);
-	[textField release];
-#endif
-	[super dealloc];
-}
-
-- (id)initWithFrame:(CGRect)frame {
-
-	self = [super initWithFrame: frame];
-	
-#if SDL_IPHONE_KEYBOARD
-	[self initializeKeyboard];
-#endif	
-
-	int i;
-	for (i=0; i<MAX_SIMULTANEOUS_TOUCHES; i++) {
-        mice[i].id = i;
-		mice[i].driverdata = NULL;
-		SDL_AddMouse(&mice[i], "Mouse", 0, 0, 1);
-	}
-	
-	UIButton *attackButton;
-
-	attackButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 90,60)];
-	[attackButton setBackgroundImage:[UIImage imageNamed:@"Default.png"] forState:UIControlStateNormal];
-	// this object is inherited by SDL_openglesview.m which is the one allocated by SDL.
-	// We select this class with [self superclass] and call the selectors with "+" because
-	// they are superclass methods 
-	[attackButton addTarget:[self superclass] action:@selector(attackButtonPressed) forControlEvents:UIControlEventTouchDown];
-	[attackButton addTarget:[self superclass] action:@selector(attackButtonReleased) forControlEvents:UIControlEventTouchUpInside|UIControlEventTouchUpOutside];
-	[self insertSubview:attackButton atIndex:10];
-	[attackButton release];
-
-	self.multipleTouchEnabled = YES;
-			
-	return self;
-}
-
-#pragma mark -
-#pragma mark Superclass methods
-+(void) attackButtonPressed {
-	HW_shoot();
-}
-
-+(void) attackButtonReleased {
-	HW_allKeysUp();
-}
-
-#pragma mark -
-#pragma mark Custom SDL_UIView input handling
-
-// we override default touch input to implement our own gestures
-- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
-	/*NSEnumerator *enumerator = [touches objectEnumerator];
-	UITouch *touch =(UITouch*)[enumerator nextObject];
-	
-	/* associate touches with mice, so long as we have slots 
-	int i;
-	int found = 0;
-	for(i=0; touch && i < MAX_SIMULTANEOUS_TOUCHES; i++) {
-	
-		/* check if this mouse is already tracking a touch 
-		if (mice[i].driverdata != NULL) {
-			continue;
-		}
-		/*	
-			mouse not associated with anything right now,
-			associate the touch with this mouse
-		
-		found = 1;
-		
-		/* save old mouse so we can switch back 
-		int oldMouse = SDL_SelectMouse(-1);
-		
-		/* select this slot's mouse 
-		SDL_SelectMouse(i);
-		CGPoint locationInView = [touch locationInView: self];
-		
-		/* set driver data to touch object, we'll use touch object later 
-		mice[i].driverdata = [touch retain];
-		
-		/* send moved event 
-		SDL_SendMouseMotion(i, 0, locationInView.x, locationInView.y, 0);
-		
-		/* send mouse down event 
-		SDL_SendMouseButton(i, SDL_PRESSED, SDL_BUTTON_LEFT);
-		
-		/* re-calibrate relative mouse motion 
-		SDL_GetRelativeMouseState(i, NULL, NULL);
-		
-		/* grab next touch 
-		touch = (UITouch*)[enumerator nextObject]; 
-		
-		/* switch back to our old mouse 
-		SDL_SelectMouse(oldMouse);
-		
-	}	*/
-	
-	UITouch *touch = [touches anyObject];
-	gestureStartPoint = [touch locationInView:self];
-
-	// one tap - single click
-	if (1 == [touch tapCount] ) {
-		//SDL_WarpMouseInWindow([SDLUIKitDelegate sharedAppDelegate].windowID, gestureStartPoint.x, gestureStartPoint.y);
-		HW_click();
-	}
-	
-	// two taps - right click
-	if (2 == [touch tapCount] ) {
-		HW_ammoMenu();
-	}
-	
-	// two taps with two fingers - middle click
-	if (2 == [touch tapCount] && 2 == [touches count]) {
-		HW_zoomReset();
-	}
-	
-	// two fingers - begin pinching
-	if (2 == [touches count]) {
-		NSArray *twoTouches = [touches allObjects];
-		UITouch *first = [twoTouches objectAtIndex:0];
-		UITouch *second = [twoTouches objectAtIndex:1];
-		initialDistance = distanceBetweenPoints([first locationInView:self], [second locationInView:self]);
-	}
-}
-
-- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
-	initialDistance = 0;
-//	NSLog(@"touches ended, sigh");
-	
-	HW_allKeysUp();
-	/*NSEnumerator *enumerator = [touches objectEnumerator];
-	UITouch *touch=nil;
-	
-	while(touch = (UITouch *)[enumerator nextObject]) {
-		/* search for the mouse slot associated with this touch 
-		int i, found = NO;
-		for (i=0; i<MAX_SIMULTANEOUS_TOUCHES && !found; i++) {
-			if (mice[i].driverdata == touch) {
-				/* found the mouse associate with the touch 
-				[(UITouch*)(mice[i].driverdata) release];
-				mice[i].driverdata = NULL;
-				/* send mouse up 
-				SDL_SendMouseButton(i, SDL_RELEASED, SDL_BUTTON_LEFT);
-				/* discontinue search for this touch 
-				found = YES;
-			}
-		}
-	}*/
-}
-
-- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
-	/*
-		this can happen if the user puts more than 5 touches on the screen
-		at once, or perhaps in other circumstances.  Usually (it seems)
-		all active touches are canceled.
-	*/
-	[self touchesEnded: touches withEvent: event];
-}
-
-- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
-	UITouch *touch = [touches anyObject];
-	CGPoint currentPosition = [touch locationInView:self];
-	
-	CGFloat Xdiff = gestureStartPoint.x - currentPosition.x;
-	CGFloat Ydiff = gestureStartPoint.y - currentPosition.y;
-	CGFloat deltaX = fabsf(Xdiff);
-    CGFloat deltaY = fabsf(Ydiff);
-    
-	if (deltaX >= kMinimumGestureLength && deltaY <= kMaximumVariance) {
-		NSLog(@"Horizontal swipe detected, begX:%f curX:%f", gestureStartPoint.x, currentPosition.x);
-		if (Xdiff > 0) HW_walkLeft();
-		else HW_walkRight();
-    }
-    else if (deltaY >= kMinimumGestureLength && deltaX <= kMaximumVariance){
-		NSLog(@"Vertical swipe detected, begY:%f curY:%f", gestureStartPoint.y, currentPosition.y);
-		if (Ydiff > 0) HW_aimUp();
-		else HW_aimDown();
-	}
-	
-	// end pinch detection
-	if (2 == [touches count]) {
-		NSArray *twoTouches = [touches allObjects];
-		UITouch *first = [twoTouches objectAtIndex:0];
-		UITouch *second = [twoTouches objectAtIndex:1];
-		CGFloat currentDistance = distanceBetweenPoints([first locationInView:self], [second locationInView:self]);
-	
-		if (0 == initialDistance) 
-			initialDistance = currentDistance;
-		else if (currentDistance - initialDistance > kMinimumPinchDelta) {
-			NSLog(@"Outward pinch detected");
-			HW_zoomOut();
-		}
-		else if (initialDistance - currentDistance > kMinimumPinchDelta) {
-			NSLog(@"Inward pinch detected");
-			HW_zoomIn();
-		}
-	}
-	
-	/*NSEnumerator *enumerator = [touches objectEnumerator];
-	 UITouch *touch=nil;while(touch = (UITouch *)[enumerator nextObject]) {
-		// try to find the mouse associated with this touch 
-		int i, found = NO;
-		for (i=0; i<MAX_SIMULTANEOUS_TOUCHES && !found; i++) {
-			if (mice[i].driverdata == touch) {
-				// found proper mouse 
-				CGPoint locationInView = [touch locationInView: self];
-				// send moved event 
-				SDL_SendMouseMotion(i, 0, locationInView.x, locationInView.y, 0);
-				// discontinue search 
-				found = YES;
-			}
-		}
-	}*/
-}
-
-#pragma mark -
-#pragma mark default routines
-/*
-	---- Keyboard related functionality below this line ----
-*/
-#if SDL_IPHONE_KEYBOARD
-
-/* Is the iPhone virtual keyboard visible onscreen? */
-- (BOOL)keyboardVisible {
-	return keyboardVisible;
-}
-
-/* Set ourselves up as a UITextFieldDelegate */
-- (void)initializeKeyboard {
-		
-	textField = [[[UITextField alloc] initWithFrame: CGRectZero] autorelease];
-	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;
-	/* add the UITextField (hidden) to our view */
-	[self addSubview: textField];
-	
-	/* create our SDL_Keyboard */
-	SDL_Keyboard keyboard;
-	SDL_zero(keyboard);
-	SDL_AddKeyboard(&keyboard, 0);
-	SDLKey keymap[SDL_NUM_SCANCODES];
-	SDL_GetDefaultKeymap(keymap);
-	SDL_SetKeymap(0, 0, keymap, SDL_NUM_SCANCODES);
-	
-}
-
-/* reveal onscreen virtual keyboard */
-- (void)showKeyboard {
-	keyboardVisible = YES;
-	[textField becomeFirstResponder];
-}
-
-/* hide onscreen virtual keyboard */
-- (void)hideKeyboard {
-	keyboardVisible = NO;
-	[textField resignFirstResponder];
-}
-
-/* UITextFieldDelegate method.  Invoked when user types something. */
-- (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 {
-		/* go through all the characters in the string we've been sent
-		   and convert them to key presses */
-		int i;
-		for (i=0; i<[string length]; i++) {
-			
-			unichar c = [string characterAtIndex: i];
-			
-			Uint16 mod = 0;
-			SDL_scancode code;
-			
-			if (c < 127) {
-				/* figure out the SDL_scancode and SDL_keymod for this unichar */
-				code = unicharToUIKeyInfoTable[c].code;
-				mod  = unicharToUIKeyInfoTable[c].mod;
-			}
-			else {
-				/* we only deal with ASCII right now */
-				code = SDL_SCANCODE_UNKNOWN;
-				mod = 0;
-			}
-			
-			if (mod & KMOD_SHIFT) {
-				/* If character uses shift, press shift down */
-				SDL_SendKeyboardKey( 0, SDL_PRESSED, SDL_SCANCODE_LSHIFT);
-			}
-			/* send a keydown and keyup even for the character */
-			SDL_SendKeyboardKey( 0, SDL_PRESSED, code);
-			SDL_SendKeyboardKey( 0, SDL_RELEASED, code);
-			if (mod & KMOD_SHIFT) {
-				/* If character uses shift, press shift back up */
-				SDL_SendKeyboardKey( 0, SDL_RELEASED, SDL_SCANCODE_LSHIFT);
-			}			
-		}
-	}
-	return NO; /* don't allow the edit! (keep placeholder text there) */
-}
-
-/* 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
-
-/* stubs, used if compiled without keyboard support */
-
-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/hedgewars/hwengine.pas	Fri Jan 08 03:38:01 2010 +0000
+++ b/hedgewars/hwengine.pas	Fri Jan 08 03:52:44 2010 +0000
@@ -144,14 +144,17 @@
 procedure OnDestroy;
 begin
 {$IFDEF DEBUGFILE}AddFileLog('Freeing resources...');{$ENDIF}
-if isSoundEnabled then ReleaseSound;
-StoreRelease;
-FreeLand;
-SendKB;
-CloseIPC;
-TTF_Quit;
-SDL_Quit;
-halt
+	if isSoundEnabled then ReleaseSound();
+	StoreRelease();
+	FreeLand();
+	SendKB();
+	CloseIPC();
+	TTF_Quit();
+//{$IFNDEF IPHONEOS}
+	// TODO: don't halt and don't clean, return to the previous view
+	SDL_Quit();
+	halt();
+//{$ENDIF}
 end;
 
 ///////////////////