소스 검색

emscripten: Prevent fullscreen transitions while one is already in progress.

Fixes #14533.
Ryan C. Gordon 3 달 전
부모
커밋
737be31c63
3개의 변경된 파일16개의 추가작업 그리고 0개의 파일을 삭제
  1. 2 0
      src/video/emscripten/SDL_emscriptenevents.c
  2. 13 0
      src/video/emscripten/SDL_emscriptenvideo.c
  3. 1 0
      src/video/emscripten/SDL_emscriptenvideo.h

+ 2 - 0
src/video/emscripten/SDL_emscriptenevents.c

@@ -480,6 +480,8 @@ static EM_BOOL Emscripten_HandleFullscreenChange(int eventType, const Emscripten
 {
     SDL_WindowData *window_data = userData;
 
+    window_data->fullscreen_change_in_progress = false;
+
     if (fullscreenChangeEvent->isFullscreen) {
         SDL_SendWindowEvent(window_data->window, SDL_EVENT_WINDOW_ENTER_FULLSCREEN, 0, 0);
         window_data->fullscreen_mode_flags = 0;

+ 13 - 0
src/video/emscripten/SDL_emscriptenvideo.c

@@ -674,6 +674,17 @@ static SDL_FullscreenResult Emscripten_SetWindowFullscreen(SDL_VideoDevice *_thi
     if (window->internal) {
         data = window->internal;
 
+        if (data->fullscreen_change_in_progress) {
+            return SDL_FULLSCREEN_FAILED;;
+        }
+
+        EmscriptenFullscreenChangeEvent fsevent;
+        if (emscripten_get_fullscreen_status(&fsevent) == EMSCRIPTEN_RESULT_SUCCESS) {
+            if ((fullscreen == SDL_FULLSCREEN_OP_ENTER) == fsevent.isFullscreen) {
+                return SDL_FULLSCREEN_SUCCEEDED;  // already there.
+            }
+        }
+
         if (fullscreen) {
             EmscriptenFullscreenStrategy strategy;
             bool is_fullscreen_desktop = !window->fullscreen_exclusive;
@@ -704,8 +715,10 @@ static SDL_FullscreenResult Emscripten_SetWindowFullscreen(SDL_VideoDevice *_thi
     }
 
     if (res == EMSCRIPTEN_RESULT_SUCCESS) {
+        data->fullscreen_change_in_progress = true;   // even on success, this might animate to the new state.
         return SDL_FULLSCREEN_SUCCEEDED;
     } else if (res == EMSCRIPTEN_RESULT_DEFERRED) {
+        data->fullscreen_change_in_progress = true;
         return SDL_FULLSCREEN_PENDING;
     } else {
         return SDL_FULLSCREEN_FAILED;

+ 1 - 0
src/video/emscripten/SDL_emscriptenvideo.h

@@ -46,6 +46,7 @@ struct SDL_WindowData
 
     Uint32 fullscreen_mode_flags;
     bool fullscreen_resize;
+    bool fullscreen_change_in_progress;
 
     bool has_pointer_lock;