From c1e71e0428221693822bf07c24acb2e1e5df48da Mon Sep 17 00:00:00 2001 From: Kees Bakker Date: Tue, 18 Oct 2011 21:32:54 +0200 Subject: [PATCH 1/2] Eliminate UIScreenMode parameter from UIKit_AddDisplay --- src/video/uikit/SDL_uikitvideo.m | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/video/uikit/SDL_uikitvideo.m b/src/video/uikit/SDL_uikitvideo.m index cf504f66b..ed79ad273 100644 --- a/src/video/uikit/SDL_uikitvideo.m +++ b/src/video/uikit/SDL_uikitvideo.m @@ -166,7 +166,7 @@ static void UIKit_DeleteDevice(SDL_VideoDevice * device) static void -UIKit_AddDisplay(UIScreen *uiscreen, UIScreenMode *uimode, int w, int h) +UIKit_AddDisplay(UIScreen *uiscreen, int w, int h) { SDL_VideoDisplay display; SDL_DisplayMode mode; @@ -176,9 +176,14 @@ static void UIKit_DeleteDevice(SDL_VideoDevice * device) mode.h = h; mode.refresh_rate = 0; - [uimode retain]; // once for the desktop_mode - [uimode retain]; // once for the current_mode - mode.driverdata = uimode; + // UIScreenMode showed up in 3.2 (the iPad and later). We're + // misusing this supports_multiple_displays flag here for that. + if (!SDL_UIKit_supports_multiple_displays) { + UIScreenMode *uimode = [uiscreen currentMode]; + [uimode retain]; // once for the desktop_mode + [uimode retain]; // once for the current_mode + mode.driverdata = uimode; + } SDL_zero(display); display.desktop_mode = mode; @@ -202,9 +207,8 @@ static void UIKit_DeleteDevice(SDL_VideoDevice * device) // Add the main screen. UIScreen *uiscreen = [UIScreen mainScreen]; - UIScreenMode *uiscreenmode = [uiscreen currentMode]; const CGSize size = [uiscreen bounds].size; - UIKit_AddDisplay(uiscreen, uiscreenmode, (int)size.width, (int)size.height); + UIKit_AddDisplay(uiscreen, (int)size.width, (int)size.height); // If this is iPhoneOS < 3.2, all devices are one screen, 320x480 pixels. // The iPad added both a larger main screen and the ability to use @@ -213,9 +217,8 @@ static void UIKit_DeleteDevice(SDL_VideoDevice * device) for (UIScreen *uiscreen in [UIScreen screens]) { // Only add the other screens if (uiscreen != [UIScreen mainScreen]) { - UIScreenMode *uiscreenmode = [uiscreen currentMode]; const CGSize size = [uiscreen bounds].size; - UIKit_AddDisplay(uiscreen, uiscreenmode, (int)size.width, (int)size.height); + UIKit_AddDisplay(uiscreen, (int)size.width, (int)size.height); } } } From 68666d645d0bd2fda9f428d1348822bdf01d1d4e Mon Sep 17 00:00:00 2001 From: Kees Bakker Date: Tue, 18 Oct 2011 21:36:28 +0200 Subject: [PATCH 2/2] Use a small function to release UIScreenMode after checking it is supported --- src/video/uikit/SDL_uikitvideo.m | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/video/uikit/SDL_uikitvideo.m b/src/video/uikit/SDL_uikitvideo.m index ed79ad273..6a5cf5cd0 100644 --- a/src/video/uikit/SDL_uikitvideo.m +++ b/src/video/uikit/SDL_uikitvideo.m @@ -242,6 +242,19 @@ static void UIKit_DeleteDevice(SDL_VideoDevice * device) return 0; } +static void +UIKit_ReleaseUIScreenMode(SDL_DisplayMode * mode) +{ + if (!SDL_UIKit_supports_multiple_displays) { + // Not on at least iPhoneOS 3.2 (versions prior to iPad). + SDL_assert(mode->driverdata == NULL); + } else { + UIScreenMode *uimode = (UIScreenMode *) mode->driverdata; + [uimode release]; + mode->driverdata = NULL; + } +} + void UIKit_VideoQuit(_THIS) { @@ -252,14 +265,11 @@ static void UIKit_DeleteDevice(SDL_VideoDevice * device) UIScreen *uiscreen = (UIScreen *) display->driverdata; [uiscreen release]; display->driverdata = NULL; - [((UIScreenMode *) display->desktop_mode.driverdata) release]; - display->desktop_mode.driverdata = NULL; - [((UIScreenMode *) display->current_mode.driverdata) release]; - display->current_mode.driverdata = NULL; + UIKit_ReleaseUIScreenMode(&display->desktop_mode); + UIKit_ReleaseUIScreenMode(&display->current_mode); for (j = 0; j < display->num_display_modes; j++) { SDL_DisplayMode *mode = &display->display_modes[j]; - [((UIScreenMode *) mode->driverdata) release]; - mode->driverdata = NULL; + UIKit_ReleaseUIScreenMode(mode); } } }