#include "client.h"
#include "openbox.h"
#include "grab.h"
+#include "debug.h"
#include "config.h"
#include "framerender.h"
#include "focus_cycle.h"
#include "focus_cycle_indicator.h"
#include "moveresize.h"
#include "screen.h"
-#include "render/theme.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)
self->max_vert = self->client->max_vert;
self->shaded = self->client->shaded;
- if (self->decorations & OB_FRAME_DECOR_BORDER ||
- (self->client->undecorated && config_theme_keepborder))
+ if (self->decorations & OB_FRAME_DECOR_BORDER)
self->bwidth = ob_rr_theme->fbwidth;
else
self->bwidth = 0;
- if (self->decorations & OB_FRAME_DECOR_BORDER) {
+ if (self->decorations & OB_FRAME_DECOR_BORDER &&
+ !self->client->undecorated)
+ {
self->cbwidth_l = self->cbwidth_r = ob_rr_theme->cbwidthx;
self->cbwidth_t = self->cbwidth_b = ob_rr_theme->cbwidthy;
} else
STRUT_SET(self->size,
self->cbwidth_l + (!self->max_horz ? self->bwidth : 0),
- self->cbwidth_t +
- (!self->max_horz || !self->max_vert ||
- !self->client->undecorated ? self->bwidth : 0),
+ self->cbwidth_t + self->bwidth,
self->cbwidth_r + (!self->max_horz ? self->bwidth : 0),
self->cbwidth_b +
(!self->max_horz || !self->max_vert ? self->bwidth : 0));
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)
void frame_adjust_focus(ObFrame *self, gboolean hilite)
{
+ ob_debug_type(OB_DEBUG_FOCUS,
+ "Frame for 0x%x has focus: %d\n",
+ self->client->window, hilite);
self->focused = hilite;
self->need_render = TRUE;
framerender_frame(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;