#include "screen.h"
#include "obrender/theme.h"
#include "obt/display.h"
+#include "obt/xqueue.h"
#include "obt/prop.h"
#define FRAME_EVENTMASK (EnterWindowMask | LeaveWindowMask | \
ObFrame *self;
Visual *visual;
- self = g_new0(ObFrame, 1);
+ self = g_slice_new0(ObFrame);
self->client = client;
visual = check_32bit_client(client);
if (self->colormap)
XFreeColormap(obt_display, self->colormap);
- g_free(self);
+ g_slice_free(ObFrame, self);
}
void frame_show(ObFrame *self)
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)
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),
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;