Просмотр исходного кода

cocoa: Run the CFRunLoop for 20ms during SDL_Quit().

This lets the OS remove windows that were destroyed in cases where we aren't
terminating the process right after calling SDL_Quit(). Otherwise, they'll
stay on the screen, unresponsive.

Apparently there is some animation state that needs to complete, and that is
handled via the runloop.

Fixes #10081.
Ryan C. Gordon 3 недель назад
Родитель
Сommit
4f477c807c
1 измененных файлов с 8 добавлено и 0 удалено
  1. 8 0
      src/video/cocoa/SDL_cocoavideo.m

+ 8 - 0
src/video/cocoa/SDL_cocoavideo.m

@@ -235,6 +235,14 @@ void Cocoa_VideoQuit(SDL_VideoDevice *_this)
 {
     @autoreleasepool {
         SDL_CocoaVideoData *data = (__bridge SDL_CocoaVideoData *)_this->internal;
+
+        // Run the CFRunLoop a little, so last-minute window animations can run, etc, but we hopefully don't change any significant state.
+        // This needs to run multiple times over a time period, it's not enough to give it a longer timeout and use "false" for returnAfterSourceHandled.
+        const Uint64 start = SDL_GetTicks();
+        do {
+            CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.0, false);
+        } while ((SDL_GetTicks() - start) <= 20);
+
         Cocoa_QuitModes(_this);
         Cocoa_QuitKeyboard(_this);
         Cocoa_QuitGCMouse();