# HG changeset patch # User koda # Date 1262922764 0 # Node ID 174c94b8ea72d3c495984337ba1bc1189e2d294a # Parent 28b8330b8af1a35d751279cd49829c27ed2f1e1f move all sdl source files in a proper directory remove hackish code to get a window up, now it should be quite clean diff -r 28b8330b8af1 -r 174c94b8ea72 cocoaTouch/SDLOverrides/SDL_uikitappdelegate.h --- /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 diff -r 28b8330b8af1 -r 174c94b8ea72 cocoaTouch/SDLOverrides/SDL_uikitappdelegate.m --- /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 diff -r 28b8330b8af1 -r 174c94b8ea72 cocoaTouch/SDLOverrides/SDL_uikitview.h --- /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* */ diff -r 28b8330b8af1 -r 174c94b8ea72 cocoaTouch/SDLOverrides/SDL_uikitview.m --- /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 */ diff -r 28b8330b8af1 -r 174c94b8ea72 cocoaTouch/SDLOverrides/SDL_uikitwindow.h --- /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: */ diff -r 28b8330b8af1 -r 174c94b8ea72 cocoaTouch/SDLOverrides/SDL_uikitwindow.m --- /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: */ diff -r 28b8330b8af1 -r 174c94b8ea72 cocoaTouch/SDL_uikitappdelegate.h --- 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 diff -r 28b8330b8af1 -r 174c94b8ea72 cocoaTouch/SDL_uikitappdelegate.m --- 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 diff -r 28b8330b8af1 -r 174c94b8ea72 cocoaTouch/SDL_uikitview.h --- 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* */ diff -r 28b8330b8af1 -r 174c94b8ea72 cocoaTouch/SDL_uikitview.m --- 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 */ diff -r 28b8330b8af1 -r 174c94b8ea72 hedgewars/hwengine.pas --- 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; ///////////////////