From 5d64984c7057f5788ea50c50b1722e12e96b247f Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Thu, 21 Jun 2012 09:58:22 -0400 Subject: [PATCH] Fixed issue with tiling window managers (bug 1246) Patch contributed by Driedfruit - thanks! --- src/video/x11/SDL_x11sym.h | 1 + src/video/x11/SDL_x11window.c | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/video/x11/SDL_x11sym.h b/src/video/x11/SDL_x11sym.h index 1e2a6f223..197a62dfc 100755 --- a/src/video/x11/SDL_x11sym.h +++ b/src/video/x11/SDL_x11sym.h @@ -59,6 +59,7 @@ SDL_X11_SYM(Status,XGetWindowAttributes,(Display* a,Window b,XWindowAttributes* SDL_X11_SYM(int,XGetWindowProperty,(Display* a,Window b,Atom c,long d,long e,Bool f,Atom g,Atom* h,int* i,unsigned long* j,unsigned long *k,unsigned char **l),(a,b,c,d,e,f,g,h,i,j,k,l),return) SDL_X11_SYM(XWMHints*,XGetWMHints,(Display* a,Window b),(a,b),return) SDL_X11_SYM(Status,XGetWMNormalHints,(Display *a,Window b, XSizeHints *c, long *d),(a,b,c,d),return) +SDL_X11_SYM(int,XIfEvent,(Display* a,XEvent *b,Bool (*c)(Display*,XEvent*,XPointer),XPointer d),(a,b,c,d),return) SDL_X11_SYM(int,XGrabKeyboard,(Display* a,Window b,Bool c,int d,int e,Time f),(a,b,c,d,e,f),return) SDL_X11_SYM(int,XGrabPointer,(Display* a,Window b,Bool c,unsigned int d,int e,int f,Window g,Cursor h,Time i),(a,b,c,d,e,f,g,h,i),return) SDL_X11_SYM(int,XGrabServer,(Display* a),(a),return) diff --git a/src/video/x11/SDL_x11window.c b/src/video/x11/SDL_x11window.c index 4d03771a1..539219e53 100755 --- a/src/video/x11/SDL_x11window.c +++ b/src/video/x11/SDL_x11window.c @@ -765,13 +765,27 @@ X11_SetWindowSize(_THIS, SDL_Window * window) XFlush(display); } +static Bool isMapNotify(Display *dpy, XEvent *ev, XPointer win) +{ + return ev->type == MapNotify && ev->xmap.window == *((Window*)win); +} +static Bool isUnmapNotify(Display *dpy, XEvent *ev, XPointer win) +{ + return ev->type == UnmapNotify && ev->xunmap.window == *((Window*)win); +} + void X11_ShowWindow(_THIS, SDL_Window * window) { SDL_WindowData *data = (SDL_WindowData *) window->driverdata; Display *display = data->videodata->display; + XEvent event; XMapRaised(display, data->xwindow); + /* Blocking wait for "MapNotify" event. + * We use XIfEvent because XWindowEvent takes a mask rather than a type, + * and XCheckTypedWindowEvent doesn't block */ + XIfEvent(display, &event, &isMapNotify, (XPointer)&data->xwindow); XFlush(display); } @@ -780,8 +794,11 @@ X11_HideWindow(_THIS, SDL_Window * window) { SDL_WindowData *data = (SDL_WindowData *) window->driverdata; Display *display = data->videodata->display; + XEvent event; XUnmapWindow(display, data->xwindow); + /* Blocking wait for "UnmapNotify" event */ + XIfEvent(display, &event, &isUnmapNotify, (XPointer)&data->xwindow); XFlush(display); }