From: Mikael Magnusson Date: Tue, 24 Feb 2004 20:11:36 +0000 (+0000) Subject: hopefully fix some stuff with kde tray icons X-Git-Url: https://git.dogcows.com/gitweb?a=commitdiff_plain;h=a5451fa6fa9b18c4125c832ab64be7f4357e7ba8;p=chaz%2Fopenbox hopefully fix some stuff with kde tray icons --- diff --git a/openbox/frame.c b/openbox/frame.c index c83f36df..74d5630e 100644 --- a/openbox/frame.c +++ b/openbox/frame.c @@ -505,26 +505,35 @@ void frame_grab_client(ObFrame *self, ObClient *client) 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); - - /* re-map the window since the unmanaging process unmaps it */ + 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. + + 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 */