From e19a9a7931d3cdeeec5eccc88dc8522d22eea92e Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Wed, 18 May 2022 15:29:59 -0700
Subject: [PATCH] Fixed a message box getting the mouse capture state out of
sync
---
src/events/SDL_mouse.c | 3 ++-
src/video/SDL_sysvideo.h | 1 +
src/video/SDL_video.c | 19 +++++++++++++------
3 files changed, 16 insertions(+), 7 deletions(-)
diff --git a/src/events/SDL_mouse.c b/src/events/SDL_mouse.c
index 80da27aee8b..c7ea6a26dfa 100644
--- a/src/events/SDL_mouse.c
+++ b/src/events/SDL_mouse.c
@@ -1019,7 +1019,8 @@ SDL_UpdateMouseCapture(SDL_bool force_release)
}
if (!force_release) {
- if (mouse->capture_desired || (mouse->auto_capture && SDL_GetMouseState(NULL, NULL) != 0)) {
+ if (SDL_GetMessageBoxCount() == 0 &&
+ (mouse->capture_desired || (mouse->auto_capture && SDL_GetMouseState(NULL, NULL) != 0))) {
if (!mouse->relative_mode) {
capture_window = SDL_GetKeyboardFocus();
}
diff --git a/src/video/SDL_sysvideo.h b/src/video/SDL_sysvideo.h
index cea3f542c9c..70a49917862 100644
--- a/src/video/SDL_sysvideo.h
+++ b/src/video/SDL_sysvideo.h
@@ -474,6 +474,7 @@ extern SDL_VideoDisplay *SDL_GetDisplay(int displayIndex);
extern SDL_VideoDisplay *SDL_GetDisplayForWindow(SDL_Window *window);
extern void *SDL_GetDisplayDriverData( int displayIndex );
extern SDL_bool SDL_IsVideoContextExternal(void);
+extern int SDL_GetMessageBoxCount(void);
extern void SDL_GL_DeduceMaxSupportedESProfile(int* major, int* minor);
diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c
index d3ec5d0f69c..648fe6c188e 100644
--- a/src/video/SDL_video.c
+++ b/src/video/SDL_video.c
@@ -291,6 +291,7 @@ SDL_CreateWindowTexture(SDL_VideoDevice *_this, SDL_Window * window, Uint32 * fo
}
static SDL_VideoDevice *_this = NULL;
+static SDL_atomic_t SDL_messagebox_count;
static int
SDL_UpdateWindowTexture(SDL_VideoDevice *unused, SDL_Window * window, const SDL_Rect * rects, int numrects)
@@ -4271,6 +4272,12 @@ SDL_IsScreenKeyboardShown(SDL_Window *window)
return SDL_FALSE;
}
+int
+SDL_GetMessageBoxCount(void)
+{
+ return SDL_AtomicGet(&SDL_messagebox_count);
+}
+
#if SDL_VIDEO_DRIVER_ANDROID
#include "android/SDL_androidmessagebox.h"
#endif
@@ -4331,7 +4338,6 @@ SDL_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid)
int retval = -1;
SDL_bool relative_mode;
int show_cursor_prev;
- SDL_bool mouse_captured;
SDL_Window *current_window;
SDL_MessageBoxData mbdata;
@@ -4341,10 +4347,11 @@ SDL_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid)
return SDL_SetError("Invalid number of buttons");
}
+ SDL_AtomicIncRef(&SDL_messagebox_count);
+
current_window = SDL_GetKeyboardFocus();
- mouse_captured = current_window && ((SDL_GetWindowFlags(current_window) & SDL_WINDOW_MOUSE_CAPTURE) != 0);
relative_mode = SDL_GetRelativeMouseMode();
- SDL_CaptureMouse(SDL_FALSE);
+ SDL_UpdateMouseCapture(SDL_FALSE);
SDL_SetRelativeMouseMode(SDL_FALSE);
show_cursor_prev = SDL_ShowCursor(1);
SDL_ResetKeyboard();
@@ -4448,15 +4455,15 @@ SDL_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid)
}
}
+ SDL_AtomicDecRef(&SDL_messagebox_count);
+
if (current_window) {
SDL_RaiseWindow(current_window);
- if (mouse_captured) {
- SDL_CaptureMouse(SDL_TRUE);
- }
}
SDL_ShowCursor(show_cursor_prev);
SDL_SetRelativeMouseMode(relative_mode);
+ SDL_UpdateMouseCapture(SDL_FALSE);
return retval;
}