move all sdl source files in a proper directory
remove hackish code to get a window up, now it should be quite clean
--- /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;
///////////////////