mirror of
https://github.com/Relintai/sdl2_frt.git
synced 2024-12-20 22:16:49 +01:00
Android: concurrency issue for Android_SetWindowFullscreen()
It accesses data->native_window, which can be changed by onNativeSurfacedChanged(). Currently, Android_SetWindowFullscreen() may access data->native_window after it has been released, and before a new reference is acquired. (can be reproduced by adding some SDL_Delay() in onNativeSurfacedChanged and Android_SetWindowFullscreen() ).
This commit is contained in:
parent
59df6d6b13
commit
1803944bb2
@ -116,36 +116,45 @@ Android_SetWindowTitle(_THIS, SDL_Window *window)
|
|||||||
void
|
void
|
||||||
Android_SetWindowFullscreen(_THIS, SDL_Window *window, SDL_VideoDisplay *display, SDL_bool fullscreen)
|
Android_SetWindowFullscreen(_THIS, SDL_Window *window, SDL_VideoDisplay *display, SDL_bool fullscreen)
|
||||||
{
|
{
|
||||||
/* If the window is being destroyed don't change visible state */
|
SDL_LockMutex(Android_ActivityMutex);
|
||||||
if (!window->is_destroying) {
|
|
||||||
Android_JNI_SetWindowStyle(fullscreen);
|
if (window == Android_Window) {
|
||||||
|
|
||||||
|
/* If the window is being destroyed don't change visible state */
|
||||||
|
if (!window->is_destroying) {
|
||||||
|
Android_JNI_SetWindowStyle(fullscreen);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Ensure our size matches reality after we've executed the window style change.
|
||||||
|
*
|
||||||
|
* It is possible that we've set width and height to the full-size display, but on
|
||||||
|
* Samsung DeX or Chromebooks or other windowed Android environemtns, our window may
|
||||||
|
* still not be the full display size.
|
||||||
|
*/
|
||||||
|
if (!SDL_IsDeXMode() && !SDL_IsChromebook()) {
|
||||||
|
goto endfunction;
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_WindowData *data = (SDL_WindowData *)window->driverdata;
|
||||||
|
|
||||||
|
if (!data || !data->native_window) {
|
||||||
|
goto endfunction;
|
||||||
|
}
|
||||||
|
|
||||||
|
int old_w = window->w;
|
||||||
|
int old_h = window->h;
|
||||||
|
|
||||||
|
int new_w = ANativeWindow_getWidth(data->native_window);
|
||||||
|
int new_h = ANativeWindow_getHeight(data->native_window);
|
||||||
|
|
||||||
|
if (old_w != new_w || old_h != new_h) {
|
||||||
|
SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESIZED, new_w, new_h);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Ensure our size matches reality after we've executed the window style change.
|
endfunction:
|
||||||
*
|
|
||||||
* It is possible that we've set width and height to the full-size display, but on
|
|
||||||
* Samsung DeX or Chromebooks or other windowed Android environemtns, our window may
|
|
||||||
* still not be the full display size.
|
|
||||||
*/
|
|
||||||
if (!SDL_IsDeXMode() && !SDL_IsChromebook()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_WindowData *data = (SDL_WindowData *)window->driverdata;
|
SDL_UnlockMutex(Android_ActivityMutex);
|
||||||
|
|
||||||
if (!data || !data->native_window) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int old_w = window->w;
|
|
||||||
int old_h = window->h;
|
|
||||||
|
|
||||||
int new_w = ANativeWindow_getWidth(data->native_window);
|
|
||||||
int new_h = ANativeWindow_getHeight(data->native_window);
|
|
||||||
|
|
||||||
if (old_w != new_w || old_h != new_h) {
|
|
||||||
SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESIZED, new_w, new_h);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
Loading…
Reference in New Issue
Block a user