From e344bc095a0506d578072cb7e08aba5ed3fe2e31 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sat, 17 Oct 2009 07:36:45 +0000 Subject: [PATCH] iPhone interruption patch / SDL 1.3 Eric Wing to Sam I've been sitting on this too long. I need to push. It's untested because of the unrelated crashing bug I've been experiencing. Also have a fix for SIZEOF_VOIDP in the config for both iPhone and Mac. --- include/SDL_config_iphoneos.h | 6 ++++++ include/SDL_config_macosx.h | 7 ++++++- include/SDL_video.h | 3 ++- src/video/cocoa/SDL_cocoawindow.h | 8 +++++++- src/video/uikit/SDL_uikitappdelegate.h | 2 ++ src/video/uikit/SDL_uikitappdelegate.m | 16 ++++++++++++++++ src/video/uikit/SDL_uikitwindow.m | 6 +++++- 7 files changed, 44 insertions(+), 4 deletions(-) diff --git a/include/SDL_config_iphoneos.h b/include/SDL_config_iphoneos.h index 88744e579..0c3c763d7 100644 --- a/include/SDL_config_iphoneos.h +++ b/include/SDL_config_iphoneos.h @@ -35,6 +35,12 @@ typedef unsigned int uint32_t; typedef unsigned long uintptr_t; #endif /* !_STDINT_H_ && !HAVE_STDINT_H */ +#ifdef __LP64__ +#define SIZEOF_VOIDP 8 +#else +#define SIZEOF_VOIDP 4 +#endif + #define SDL_HAS_64BIT_TYPE 1 #define HAVE_ALLOCA_H 1 diff --git a/include/SDL_config_macosx.h b/include/SDL_config_macosx.h index 8e2b56570..120246b3b 100644 --- a/include/SDL_config_macosx.h +++ b/include/SDL_config_macosx.h @@ -30,7 +30,12 @@ /* This is a set of defines to configure the SDL features */ -#define SIZEOF_VOIDP 4 +#ifdef __LP64__ + #define SIZEOF_VOIDP 8 +#else + #define SIZEOF_VOIDP 4 +#endif + #define SDL_HAS_64BIT_TYPE 1 /* Useful headers */ diff --git a/include/SDL_video.h b/include/SDL_video.h index 48aba0792..7ed789f4f 100644 --- a/include/SDL_video.h +++ b/include/SDL_video.h @@ -414,8 +414,9 @@ extern DECLSPEC int SDLCALL SDL_GetDesktopDisplayMode(SDL_DisplayMode * mode); */ extern DECLSPEC int SDLCALL SDL_GetCurrentDisplayMode(SDL_DisplayMode * mode); + /** - * \fn SDL_DisplayMode *SDL_GetClosestDisplayMode(const SDL_DisplayMode *mode, SDL_DisplayMode *closest) + * \fn SDL_DisplayMode SDL_GetClosestDisplayMode(const SDL_DisplayMode mode, SDL_DisplayMode closest) * * \brief Get the closest match to the requested display mode. * diff --git a/src/video/cocoa/SDL_cocoawindow.h b/src/video/cocoa/SDL_cocoawindow.h index 80d968527..834af0fff 100644 --- a/src/video/cocoa/SDL_cocoawindow.h +++ b/src/video/cocoa/SDL_cocoawindow.h @@ -24,10 +24,16 @@ #ifndef _SDL_cocoawindow_h #define _SDL_cocoawindow_h +#import + typedef struct SDL_WindowData SDL_WindowData; /* *INDENT-OFF* */ -@interface Cocoa_WindowListener:NSResponder { +#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6 +@interface Cocoa_WindowListener : NSResponder { +#else +@interface Cocoa_WindowListener : NSResponder { +#endif SDL_WindowData *_data; } diff --git a/src/video/uikit/SDL_uikitappdelegate.h b/src/video/uikit/SDL_uikitappdelegate.h index a92486ca2..704b7f81f 100644 --- a/src/video/uikit/SDL_uikitappdelegate.h +++ b/src/video/uikit/SDL_uikitappdelegate.h @@ -26,9 +26,11 @@ /* *INDENT-OFF* */ @interface SDLUIKitDelegate:NSObject { UIWindow *window; + SDL_WindowID windowID; } @property (readwrite, retain) UIWindow *window; +@property (readwrite, assign) SDL_WindowID windowID; +(SDLUIKitDelegate *)sharedAppDelegate; diff --git a/src/video/uikit/SDL_uikitappdelegate.m b/src/video/uikit/SDL_uikitappdelegate.m index 80682eb0c..8d9f67315 100644 --- a/src/video/uikit/SDL_uikitappdelegate.m +++ b/src/video/uikit/SDL_uikitappdelegate.m @@ -56,6 +56,7 @@ int main(int argc, char **argv) { @implementation SDLUIKitDelegate @synthesize window; +@synthesize windowID; /* convenience method */ +(SDLUIKitDelegate *)sharedAppDelegate { @@ -66,6 +67,7 @@ +(SDLUIKitDelegate *)sharedAppDelegate { - (id)init { self = [super init]; window = nil; + windowID = 0; return self; } @@ -97,6 +99,20 @@ - (void)applicationWillTerminate:(UIApplication *)application { } +- (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); +} + + + -(void)dealloc { [window release]; [super dealloc]; diff --git a/src/video/uikit/SDL_uikitwindow.m b/src/video/uikit/SDL_uikitwindow.m index 6cd646beb..71d22023e 100644 --- a/src/video/uikit/SDL_uikitwindow.m +++ b/src/video/uikit/SDL_uikitwindow.m @@ -82,7 +82,7 @@ static int SetupWindowData(_THIS, SDL_Window *window, UIWindow *uiwindow, SDL_bo int UIKit_CreateWindow(_THIS, SDL_Window *window) { - /* iPhone applications are single window only */ + /* 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; @@ -96,7 +96,10 @@ int UIKit_CreateWindow(_THIS, SDL_Window *window) { 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].window = uiwindow; + [SDLUIKitDelegate sharedAppDelegate].windowID = window->id; [uiwindow release]; /* release the window (the app delegate has retained it) */ return 1; @@ -113,6 +116,7 @@ void UIKit_DestroyWindow(_THIS, SDL_Window * window) { /* this will also destroy the window */ [SDLUIKitDelegate sharedAppDelegate].window = nil; + [SDLUIKitDelegate sharedAppDelegate].windowID = 0; }