iOS: Also do the Dictation crash workaround before executing the animation callback.
authorAlex Szpakowski <slime73@gmail.com>
Sat, 02 Apr 2016 13:21:01 -0300
changeset 10141 fe9cf7c678f4
parent 10140 6dd5f49e4a77
child 10142 bc8ac6c0cd98
iOS: Also do the Dictation crash workaround before executing the animation callback.
src/video/uikit/SDL_uikitevents.m
src/video/uikit/SDL_uikitopengles.h
src/video/uikit/SDL_uikitopengles.m
src/video/uikit/SDL_uikitviewcontroller.m
--- a/src/video/uikit/SDL_uikitevents.m	Sat Apr 02 11:54:05 2016 -0300
+++ b/src/video/uikit/SDL_uikitevents.m	Sat Apr 02 13:21:01 2016 -0300
@@ -26,6 +26,7 @@
 
 #include "SDL_uikitvideo.h"
 #include "SDL_uikitevents.h"
+#include "SDL_uikitopengles.h"
 
 #import <Foundation/Foundation.h>
 
@@ -63,19 +64,8 @@
         result = CFRunLoopRunInMode((CFStringRef)UITrackingRunLoopMode, seconds, TRUE);
     } while(result == kCFRunLoopRunHandledSource);
 
-    @autoreleasepool {
-        /* Some iOS system functionality (such as Dictation on the on-screen
-           keyboard) uses its own OpenGL ES context but doesn't restore the
-           previous one when it's done. This is a workaround to make sure the
-           expected SDL-created OpenGL ES context is active after the OS is
-           finished running its own code for the frame. If this isn't done, the
-           app may crash or have other nasty symptoms when Dictation is used.
-         */
-        EAGLContext *context = (__bridge EAGLContext *) SDL_GL_GetCurrentContext();
-        if (context != NULL && [EAGLContext currentContext] != context) {
-            [EAGLContext setCurrentContext:context];
-        }
-    }
+    /* See the comment in the function definition. */
+    UIKit_GL_RestoreCurrentContext();
 }
 
 #endif /* SDL_VIDEO_DRIVER_UIKIT */
--- a/src/video/uikit/SDL_uikitopengles.h	Sat Apr 02 11:54:05 2016 -0300
+++ b/src/video/uikit/SDL_uikitopengles.h	Sat Apr 02 13:21:01 2016 -0300
@@ -33,6 +33,8 @@
 extern void *UIKit_GL_GetProcAddress(_THIS, const char *proc);
 extern int UIKit_GL_LoadLibrary(_THIS, const char *path);
 
+extern void UIKit_GL_RestoreCurrentContext();
+
 #endif
 
 /* vi: set ts=4 sw=4 expandtab: */
--- a/src/video/uikit/SDL_uikitopengles.m	Sat Apr 02 11:54:05 2016 -0300
+++ b/src/video/uikit/SDL_uikitopengles.m	Sat Apr 02 13:21:01 2016 -0300
@@ -217,6 +217,24 @@
     }
 }
 
+void
+UIKit_GL_RestoreCurrentContext()
+{
+    @autoreleasepool {
+        /* Some iOS system functionality (such as Dictation on the on-screen
+         keyboard) uses its own OpenGL ES context but doesn't restore the
+         previous one when it's done. This is a workaround to make sure the
+         expected SDL-created OpenGL ES context is active after the OS is
+         finished running its own code for the frame. If this isn't done, the
+         app may crash or have other nasty symptoms when Dictation is used.
+         */
+        EAGLContext *context = (__bridge EAGLContext *) SDL_GL_GetCurrentContext();
+        if (context != NULL && [EAGLContext currentContext] != context) {
+            [EAGLContext setCurrentContext:context];
+        }
+    }
+}
+
 #endif /* SDL_VIDEO_DRIVER_UIKIT */
 
 /* vi: set ts=4 sw=4 expandtab: */
--- a/src/video/uikit/SDL_uikitviewcontroller.m	Sat Apr 02 11:54:05 2016 -0300
+++ b/src/video/uikit/SDL_uikitviewcontroller.m	Sat Apr 02 13:21:01 2016 -0300
@@ -33,6 +33,7 @@
 #include "SDL_uikitvideo.h"
 #include "SDL_uikitmodes.h"
 #include "SDL_uikitwindow.h"
+#include "SDL_uikitopengles.h"
 
 #if SDL_IPHONE_KEYBOARD
 #include "keyinfotable.h"
@@ -102,6 +103,9 @@
 {
     /* Don't run the game loop while a messagebox is up */
     if (!UIKit_ShowingMessageBox()) {
+        /* See the comment in the function definition. */
+        UIKit_GL_RestoreCurrentContext();
+
         animationCallback(animationCallbackParam);
     }
 }