Fixed bug 3015 - grab mouse inconsistent state Martin Gerhardy Not sure - but I think there might be a logic flaw in SDL_SetWindowGrab. The problem here is that this modifies the window flags and e.g. sets SDL_WINDOW_INPUT_GRABBED - but the _this->grabbed_window pointer is not yet set. Then in SDL_UpdateWindowGrab the _this->grabbed_window pointer is only set if the function pointer _this->SetWindowGrab is not NULL. But if this is NULL, the _this->grabbed_window pointer is never set, but every future call to any of the grab functions include an assert for: SDL_assert(!_this->grabbed_window || ((_this->grabbed_window->flags & SDL_WINDOW_INPUT_GRABBED) != 0)); That means the first call works, the second always fails and triggers the assert.
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
diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c
index 2e168de..22e08cc 100644
--- a/src/video/SDL_video.c
+++ b/src/video/SDL_video.c
@@ -2122,28 +2122,30 @@ SDL_GetWindowGammaRamp(SDL_Window * window, Uint16 * red,
void
SDL_UpdateWindowGrab(SDL_Window * window)
{
- if (_this->SetWindowGrab) {
- SDL_Window *grabbed_window;
- SDL_bool grabbed;
- if ((SDL_GetMouse()->relative_mode || (window->flags & SDL_WINDOW_INPUT_GRABBED)) &&
- (window->flags & SDL_WINDOW_INPUT_FOCUS)) {
- grabbed = SDL_TRUE;
- } else {
- grabbed = SDL_FALSE;
- }
+ SDL_Window *grabbed_window;
+ SDL_bool grabbed;
+ if ((SDL_GetMouse()->relative_mode || (window->flags & SDL_WINDOW_INPUT_GRABBED)) &&
+ (window->flags & SDL_WINDOW_INPUT_FOCUS)) {
+ grabbed = SDL_TRUE;
+ } else {
+ grabbed = SDL_FALSE;
+ }
- grabbed_window = _this->grabbed_window;
- if (grabbed) {
- if (grabbed_window && (grabbed_window != window)) {
- /* stealing a grab from another window! */
- grabbed_window->flags &= ~SDL_WINDOW_INPUT_GRABBED;
+ grabbed_window = _this->grabbed_window;
+ if (grabbed) {
+ if (grabbed_window && (grabbed_window != window)) {
+ /* stealing a grab from another window! */
+ grabbed_window->flags &= ~SDL_WINDOW_INPUT_GRABBED;
+ if (_this->SetWindowGrab) {
_this->SetWindowGrab(_this, grabbed_window, SDL_FALSE);
}
- _this->grabbed_window = window;
- } else if (grabbed_window == window) {
- _this->grabbed_window = NULL; /* ungrabbing. */
}
+ _this->grabbed_window = window;
+ } else if (grabbed_window == window) {
+ _this->grabbed_window = NULL; /* ungrabbing. */
+ }
+ if (_this->SetWindowGrab) {
_this->SetWindowGrab(_this, window, grabbed);
}
}