diff options
| author | Mikael Magnusson <mikachu@comhem.se> | 2004-02-24 20:11:36 +0000 |
|---|---|---|
| committer | Mikael Magnusson <mikachu@comhem.se> | 2004-02-24 20:11:36 +0000 |
| commit | a5451fa6fa9b18c4125c832ab64be7f4357e7ba8 (patch) | |
| tree | c8e0e350b1c7c5cefa34472e2e17d99f5d0ea667 /openbox | |
| parent | 2342c6224c2d7771e85ece4241fa45a67d43ca1e (diff) | |
hopefully fix some stuff with kde tray icons
Diffstat (limited to 'openbox')
| -rw-r--r-- | openbox/frame.c | 37 |
1 files changed, 23 insertions, 14 deletions
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 */ |
