diff -r 1c4a634f364e include/SDL_video.h --- a/include/SDL_video.h Thu Apr 17 22:23:32 2014 -0700 +++ b/include/SDL_video.h Fri Apr 18 04:09:28 2014 -0500 @@ -108,7 +108,8 @@ SDL_WINDOW_MOUSE_FOCUS = 0x00000400, /**< window has mouse focus */ SDL_WINDOW_FULLSCREEN_DESKTOP = ( SDL_WINDOW_FULLSCREEN | 0x00001000 ), SDL_WINDOW_FOREIGN = 0x00000800, /**< window not created by SDL */ - SDL_WINDOW_ALLOW_HIGHDPI = 0x00002000 /**< window should be created in high-DPI mode if supported */ + SDL_WINDOW_ALLOW_HIGHDPI = 0x00002000, /**< window should be created in high-DPI mode if supported */ + SDL_WINDOW_CHILD = 0x00004000 /**< window is not toplevel and cannot be hidden */ } SDL_WindowFlags; /** diff -r 1c4a634f364e src/video/SDL_video.c --- a/src/video/SDL_video.c Thu Apr 17 22:23:32 2014 -0700 +++ b/src/video/SDL_video.c Fri Apr 18 04:09:28 2014 -0500 @@ -1359,6 +1359,12 @@ flags &= ~SDL_WINDOW_FOREIGN; } + if (window->flags & SDL_WINDOW_CHILD) { + flags |= SDL_WINDOW_CHILD; + } else { + flags &= ~SDL_WINDOW_CHILD; + } + /* Restore video mode, etc. */ SDL_HideWindow(window); @@ -1401,6 +1407,9 @@ if (flags & SDL_WINDOW_FOREIGN) { window->flags |= SDL_WINDOW_FOREIGN; } + if (flags & SDL_WINDOW_CHILD) { + window->flags |= SDL_WINDOW_CHILD; + } if (title) { SDL_SetWindowTitle(window, title); @@ -1802,7 +1811,7 @@ { CHECK_WINDOW_MAGIC(window, ); - if (!(window->flags & SDL_WINDOW_SHOWN)) { + if (!(window->flags & SDL_WINDOW_SHOWN) || (window->flags & SDL_WINDOW_CHILD)) { return; } diff -r 1c4a634f364e src/video/x11/SDL_x11sym.h --- a/src/video/x11/SDL_x11sym.h Thu Apr 17 22:23:32 2014 -0700 +++ b/src/video/x11/SDL_x11sym.h Fri Apr 18 04:09:28 2014 -0500 @@ -141,6 +141,7 @@ SDL_X11_SYM(Bool,XQueryExtension,(Display* a,_Xconst char* b,int* c,int* d,int* e),(a,b,c,d,e),return) SDL_X11_SYM(char *,XDisplayString,(Display* a),(a),return) SDL_X11_SYM(int,XGetErrorText,(Display* a,int b,char* c,int d),(a,b,c,d),return) +SDL_X11_SYM(Status,XQueryTree,(Display *a,Window b,Window *c,Window *d,Window **e,unsigned int *f),(a,b,c,d,e,f),return) SDL_X11_SYM(void,_XEatData,(Display* a,unsigned long b),(a,b),) SDL_X11_SYM(void,_XFlush,(Display* a),(a),) SDL_X11_SYM(void,_XFlushGCCache,(Display* a,GC b),(a,b),) diff -r 1c4a634f364e src/video/x11/SDL_x11video.c --- a/src/video/x11/SDL_x11video.c Thu Apr 17 22:23:32 2014 -0700 +++ b/src/video/x11/SDL_x11video.c Fri Apr 18 04:09:28 2014 -0500 @@ -607,6 +607,7 @@ GET_ATOM(_NET_WM_ICON); GET_ATOM(_NET_WM_PING); GET_ATOM(_NET_ACTIVE_WINDOW); + GET_ATOM(_NET_CLIENT_LIST); GET_ATOM(UTF8_STRING); GET_ATOM(PRIMARY); GET_ATOM(XdndEnter); diff -r 1c4a634f364e src/video/x11/SDL_x11video.h --- a/src/video/x11/SDL_x11video.h Thu Apr 17 22:23:32 2014 -0700 +++ b/src/video/x11/SDL_x11video.h Fri Apr 18 04:09:28 2014 -0500 @@ -100,6 +100,7 @@ Atom _NET_WM_ICON; Atom _NET_WM_PING; Atom _NET_ACTIVE_WINDOW; + Atom _NET_CLIENT_LIST; Atom UTF8_STRING; Atom PRIMARY; Atom XdndEnter; diff -r 1c4a634f364e src/video/x11/SDL_x11window.c --- a/src/video/x11/SDL_x11window.c Thu Apr 17 22:23:32 2014 -0700 +++ b/src/video/x11/SDL_x11window.c Fri Apr 18 04:09:28 2014 -0500 @@ -607,6 +607,44 @@ return 0; } +SDL_bool +X11_WindowIsChild(_THIS, Window w) +{ + SDL_bool ischild = SDL_FALSE; + SDL_VideoData *videodata = (SDL_VideoData *) _this->driverdata; + Display *display = videodata->display; + Window root, parent, *children; + unsigned int nchildren; + Atom clientlist = videodata->_NET_CLIENT_LIST; + Atom actualtype; + int format; + unsigned long numitems, bytesafter; + Uint32 *toplevels; + int status; + + X11_XQueryTree(display, w, &root, &parent, &children, &nchildren); + status = X11_XGetWindowProperty(display, root, clientlist, 0L, (~0L), + False, AnyPropertyType, &actualtype, &format, + &numitems, &bytesafter, (unsigned char**) &toplevels); + + if (status >= Success && numitems > 0) + { + int i; + for (i = numitems - 1; i >= 0; i--) { + if (toplevels[i] == w) { + ischild = SDL_FALSE; + break; + } else if (toplevels[i] == parent) { + ischild = SDL_TRUE; + break; + } + } + X11_XFree(toplevels); + } + + return ischild; +} + int X11_CreateWindowFrom(_THIS, SDL_Window * window, const void *data) { @@ -617,6 +655,9 @@ if (SetupWindowData(_this, window, w, SDL_FALSE) < 0) { return -1; } + if (X11_WindowIsChild(_this, w)) { + window->flags |= SDL_WINDOW_CHILD; + } return 0; }