]> Dogcows Code - chaz/openbox/blobdiff - openbox/frame.c
make an event queue for X events. the queue's min size is 16 XEvents (~3k)
[chaz/openbox] / openbox / frame.c
index 084f3f6accd60c6040f6a6adf6bcf7044de93b1e..6c3ee6f948c6ce0ca95a3a6b7c8f8a510e7046d6 100644 (file)
@@ -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)
@@ -861,10 +862,12 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
         if (focus_cycle_target == self->client)
             focus_cycle_update_indicator(self->client);
     }
-    if (resized && (self->decorations & OB_FRAME_DECOR_TITLEBAR))
+    if (resized && (self->decorations & OB_FRAME_DECOR_TITLEBAR) &&
+        self->label_width)
+    {
         XResizeWindow(obt_display, self->label, self->label_width,
                       ob_rr_theme->label_height);
-
+    }
 }
 
 static void frame_adjust_cursors(ObFrame *self)
@@ -1040,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),
@@ -1675,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;
This page took 0.02238 seconds and 4 git commands to generate.