summaryrefslogtreecommitdiff
path: root/openbox/frame.c
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2010-04-28 12:57:51 -0400
committerDana Jansens <danakj@orodu.net>2010-04-28 12:58:42 -0400
commit55b84316bb699fa530efe78d75ae8e1d57c1b57f (patch)
tree4991974287c7adfdea0680b5d96d42a01c40a97a /openbox/frame.c
parent029628087fa0090e7c3b1598786a1bf1712e0db9 (diff)
make an event queue for X events. the queue's min size is 16 XEvents (~3k)
Diffstat (limited to 'openbox/frame.c')
-rw-r--r--openbox/frame.c32
1 files changed, 12 insertions, 20 deletions
diff --git a/openbox/frame.c b/openbox/frame.c
index 5e1351de..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,33 +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;
- 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),