From 9366cc936cc0e8c898be7eb5958925bd5f40cdb9 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 2384a64acc4..1b1d78b1aa6 100644
--- a/src/video/SDL_sysvideo.h
+++ b/src/video/SDL_sysvideo.h
@@ -472,6 +472,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 24091d4f617..c415fc29e87 100644
--- a/src/video/SDL_video.c
+++ b/src/video/SDL_video.c
@@ -288,6 +288,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)
@@ -4265,6 +4266,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
@@ -4325,7 +4332,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;
@@ -4335,10 +4341,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();
@@ -4442,15 +4449,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;
}