From c701387366d09f346356a76fe157c205127d8289 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Sun, 21 Aug 2011 11:27:37 -0400 Subject: [PATCH] Ignore old ConfigureNotify events during X11 window resize. Fixes Bugzilla #1049. Thanks to Andrew Church for the patch! --- src/video/x11/SDL_x11events.c | 16 ++++++++++++++++ src/video/x11/SDL_x11events_c.h | 5 +++++ src/video/x11/SDL_x11video.c | 2 ++ 3 files changed, 23 insertions(+) diff --git a/src/video/x11/SDL_x11events.c b/src/video/x11/SDL_x11events.c index d24a6b7d6..8d7fecdfb 100644 --- a/src/video/x11/SDL_x11events.c +++ b/src/video/x11/SDL_x11events.c @@ -57,6 +57,12 @@ static SDLKey ODD_keymap[256]; static SDLKey MISC_keymap[256]; SDLKey X11_TranslateKeycode(Display *display, KeyCode kc); +/* + Pending resize target for ConfigureNotify (so outdated events don't + cause inappropriate resize events) +*/ +int X11_PendingConfigureNotifyWidth = -1; +int X11_PendingConfigureNotifyHeight = -1; #ifdef X_HAVE_UTF8_STRING Uint32 Utf8ToUcs4(const Uint8 *utf8) @@ -819,6 +825,16 @@ printf("MapNotify!\n"); #ifdef DEBUG_XEVENTS printf("ConfigureNotify! (resize: %dx%d)\n", xevent.xconfigure.width, xevent.xconfigure.height); #endif + if ((X11_PendingConfigureNotifyWidth != -1) && + (X11_PendingConfigureNotifyHeight != -1)) { + if ((xevent.xconfigure.width != X11_PendingConfigureNotifyWidth) && + (xevent.xconfigure.height != X11_PendingConfigureNotifyHeight)) { + /* Event is from before the resize, so ignore. */ + break; + } + X11_PendingConfigureNotifyWidth = -1; + X11_PendingConfigureNotifyHeight = -1; + } if ( SDL_VideoSurface ) { if ((xevent.xconfigure.width != SDL_VideoSurface->w) || (xevent.xconfigure.height != SDL_VideoSurface->h)) { diff --git a/src/video/x11/SDL_x11events_c.h b/src/video/x11/SDL_x11events_c.h index d3ae9efff..e3c67d252 100644 --- a/src/video/x11/SDL_x11events_c.h +++ b/src/video/x11/SDL_x11events_c.h @@ -27,3 +27,8 @@ extern void X11_InitOSKeymap(_THIS); extern void X11_PumpEvents(_THIS); extern void X11_SetKeyboardState(Display *display, const char *key_vec); + +/* Variables to be exported */ +extern int X11_PendingConfigureNotifyWidth; +extern int X11_PendingConfigureNotifyHeight; + diff --git a/src/video/x11/SDL_x11video.c b/src/video/x11/SDL_x11video.c index 703c6f045..51f89ed22 100644 --- a/src/video/x11/SDL_x11video.c +++ b/src/video/x11/SDL_x11video.c @@ -1161,6 +1161,8 @@ SDL_Surface *X11_SetVideoMode(_THIS, SDL_Surface *current, current = NULL; goto done; } + X11_PendingConfigureNotifyWidth = width; + X11_PendingConfigureNotifyHeight = height; } else { if (X11_CreateWindow(this,current,width,height,bpp,flags) < 0) { current = NULL;