Fixed a message box getting the mouse capture state out of sync
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
diff --git a/src/events/SDL_mouse.c b/src/events/SDL_mouse.c
index 80da27a..c7ea6a2 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 cea3f54..70a4991 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 d3ec5d0..648fe6c 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;
}