From 2bfa2037ca4cabf3a7cac0dc44f55b72e9a2bb66 Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Sun, 18 Dec 2016 12:28:28 -0400 Subject: [PATCH] =?UTF-8?q?iOS=20bug=20#3377:=20work=20around=20bugs=20in?= =?UTF-8?q?=20some=20third=20party=20iOS=20libraries=20(e.g.=20Google=20ad?= =?UTF-8?q?mob)=20where=20they=20assume=20the=20optional=20UIApplicationDe?= =?UTF-8?q?legate=20=E2=80=98window=E2=80=99=20property=20always=20exists?= =?UTF-8?q?=20and=20will=20crash=20if=20it=20doesn=E2=80=99t.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/video/uikit/SDL_uikitappdelegate.h | 6 ++++++ src/video/uikit/SDL_uikitappdelegate.m | 22 +++++++++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/video/uikit/SDL_uikitappdelegate.h b/src/video/uikit/SDL_uikitappdelegate.h index edf09f50f..880cccc52 100644 --- a/src/video/uikit/SDL_uikitappdelegate.h +++ b/src/video/uikit/SDL_uikitappdelegate.h @@ -36,6 +36,12 @@ - (void)hideLaunchScreen; +/* This property is marked as optional, and is only intended to be used when + * the app's UI is storyboard-based. SDL is not storyboard-based, however + * several major third-party ad APIs (e.g. Google admob) incorrectly assume this + * property always exists, and will crash if it doesn't. */ +@property (nonatomic) UIWindow *window; + @end /* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/video/uikit/SDL_uikitappdelegate.m b/src/video/uikit/SDL_uikitappdelegate.m index c94c78a41..fa37faa1e 100644 --- a/src/video/uikit/SDL_uikitappdelegate.m +++ b/src/video/uikit/SDL_uikitappdelegate.m @@ -422,6 +422,26 @@ SDL_LoadLaunchImageNamed(NSString *name, int screenh) return YES; } +- (UIWindow *)window +{ + SDL_VideoDevice *_this = SDL_GetVideoDevice(); + if (_this) { + SDL_Window *window = NULL; + for (window = _this->windows; window != NULL; window = window->next) { + SDL_WindowData *data = (__bridge SDL_WindowData *) window->driverdata; + if (data != nil) { + return data.uiwindow; + } + } + } + return nil; +} + +- (void)setWindow:(UIWindow *)window +{ + /* Do nothing. */ +} + - (void)applicationWillTerminate:(UIApplication *)application { SDL_SendAppEvent(SDL_APP_TERMINATING); @@ -467,7 +487,7 @@ SDL_LoadLaunchImageNamed(NSString *name, int screenh) SDL_VideoDevice *_this = SDL_GetVideoDevice(); if (_this) { SDL_Window *window; - for (window = _this->windows; window != nil; window = window->next) { + for (window = _this->windows; window != NULL; window = window->next) { SDL_SendWindowEvent(window, SDL_WINDOWEVENT_FOCUS_LOST, 0, 0); SDL_SendWindowEvent(window, SDL_WINDOWEVENT_MINIMIZED, 0, 0); }