? parent.diff Index: openbox/frame.c =================================================================== RCS file: /cvs/cvsroot/openbox/openbox/frame.c,v retrieving revision 1.55 diff -p -u -r1.55 frame.c --- openbox/frame.c 22 Dec 2003 18:16:47 -0000 1.55 +++ openbox/frame.c 24 Feb 2004 17:34:32 -0000 @@ -505,26 +505,36 @@ void frame_grab_client(ObFrame *self, Ob void frame_release_client(ObFrame *self, ObClient *client) { XEvent ev; + gboolean reparent = TRUE; g_assert(self->client == client); /* check if the app has already reparented its window away */ if (XCheckTypedWindowEvent(ob_display, client->window, - ReparentNotify, &ev)) { - XPutBackEvent(ob_display, &ev); + ReparentNotify, &ev)) + { + /* This check makes sure we don't catch our own reparent action to + our frame window. This doesn't count as the app reparenting itself + away of course. */ + if (ev.xreparent.parent != self->plate) + reparent = FALSE; - /* re-map the window since the unmanaging process unmaps it */ + XPutBackEvent(ob_display, &ev); + + /* re-map the window since the unmanaging process unmaps it */ /* XXX ... um no it doesnt it unmaps its parent, the window itself retains its mapped state, no?! XXX XMapWindow(ob_display, client->window); */ - } else { - /* according to the ICCCM - if the client doesn't reparent itself, - then we will reparent the window to root for them */ - XReparentWindow(ob_display, client->window, + } + + if (reparent) { + /* according to the ICCCM - if the client doesn't reparent itself, + then we will reparent the window to root for them */ + XReparentWindow(ob_display, client->window, RootWindow(ob_display, ob_screen), - client->area.x, - client->area.y); + client->area.x, + client->area.y); } /* remove all the windows for the frame from the window_map */