X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fframe.c;h=6c3ee6f948c6ce0ca95a3a6b7c8f8a510e7046d6;hb=3fd74abb3c2969f170d727154245cde3ef8a4b87;hp=f4a29289dc9b204f1a089061a263349e3e0b330e;hpb=34178097d559ef522ea0984091489c209f4e9e0e;p=chaz%2Fopenbox diff --git a/openbox/frame.c b/openbox/frame.c index f4a29289..6c3ee6f9 100644 --- a/openbox/frame.c +++ b/openbox/frame.c @@ -30,6 +30,7 @@ #include "screen.h" #include "obrender/theme.h" #include "obt/display.h" +#include "obt/xqueue.h" #include "obt/prop.h" #define FRAME_EVENTMASK (EnterWindowMask | LeaveWindowMask | \ @@ -1042,34 +1043,24 @@ void frame_grab_client(ObFrame *self) window_add(&self->rgripbottom, CLIENT_AS_WINDOW(self->client)); } -void frame_release_client(ObFrame *self) +static gboolean find_reparent(XEvent *e, gpointer data) { - XEvent ev; - gboolean reparent = TRUE; + const ObFrame *self = data; + + /* Find ReparentNotify events for the window that aren't being reparented into the + frame, thus the client reparenting itself off the frame. */ + return e->type == ReparentNotify && e->xreparent.window == self->client->window && + e->xreparent.parent != self->window; +} +void frame_release_client(ObFrame *self) +{ /* if there was any animation going on, kill it */ obt_main_loop_timeout_remove_data(ob_main_loop, frame_animate_iconify, self, FALSE); /* check if the app has already reparented its window away */ - while (XCheckTypedWindowEvent(obt_display, self->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->window) { - reparent = FALSE; - XPutBackEvent(obt_display, &ev); - break; - } - } - - if (reparent) { + if (!xqueue_exists_local(find_reparent, self)) { /* according to the ICCCM - if the client doesn't reparent itself, then we will reparent the window to root for them */ XReparentWindow(obt_display, self->client->window, obt_root(ob_screen),