all repos — openbox @ a5451fa6fa9b18c4125c832ab64be7f4357e7ba8

openbox fork - make it a bit more like ryudo

hopefully fix some stuff with kde tray icons
Mikael Magnusson mikachu@comhem.se
commit

a5451fa6fa9b18c4125c832ab64be7f4357e7ba8

parent

2342c6224c2d7771e85ece4241fa45a67d43ca1e

1 files changed, 22 insertions(+), 13 deletions(-)

jump to
M openbox/frame.copenbox/frame.c

@@ -505,26 +505,35 @@

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); + while (XCheckTypedWindowEvent(ob_display, client->window, + 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. - /* re-map the window since the unmanaging process unmaps it */ + Reparent events that are generated by us are just discarded here. + They are of no consequence to us anyhow. + */ + if (ev.xreparent.parent != self->plate) { + reparent = FALSE; + XPutBackEvent(ob_display, &ev); + break; + } + } - /* 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 */