X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fframe.c;h=6c3ee6f948c6ce0ca95a3a6b7c8f8a510e7046d6;hb=55b84316bb699fa530efe78d75ae8e1d57c1b57f;hp=8835c6326b15836e499b39b3fc5046437d92ec9f;hpb=6014a41760a107d817422aa5412ccf0ce3fc6e92;p=chaz%2Fopenbox diff --git a/openbox/frame.c b/openbox/frame.c index 8835c632..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 | \ @@ -89,7 +90,7 @@ ObFrame *frame_new(ObClient *client) ObFrame *self; Visual *visual; - self = g_new0(ObFrame, 1); + self = g_slice_new0(ObFrame); self->client = client; visual = check_32bit_client(client); @@ -229,7 +230,7 @@ void frame_free(ObFrame *self) if (self->colormap) XFreeColormap(obt_display, self->colormap); - g_free(self); + g_slice_free(ObFrame, self); } void frame_show(ObFrame *self) @@ -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), @@ -1677,12 +1668,12 @@ static gboolean frame_animate_iconify(gpointer p) if (self->client->icon_geometry.width == 0) { /* there is no icon geometry set so just go straight down */ - Rect *a = screen_physical_area_monitor - (screen_find_monitor(&self->area)); + const Rect *a; + + a = screen_physical_area_monitor(screen_find_monitor(&self->area)); iconx = self->area.x + self->area.width / 2 + 32; icony = a->y + a->width; iconw = 64; - g_free(a); } else { iconx = self->client->icon_geometry.x; icony = self->client->icon_geometry.y;