/* reparent the window out of the frame, and free the frame */
engine_frame_release_client(client->frame, client);
+ client->frame = NULL;
client_list = g_slist_remove(client_list, client);
stacking_list = g_list_remove(stacking_list, client);
/* unfocus the client (dispatchs the focus event) (we're out of the
transient lists already, so being modal doesn't matter) */
- if (client->focused)
+ if (client_focused(client))
client_unfocus(client);
if (ob_state != State_Exiting) {
self->title = self->icon_title = NULL;
self->res_name = self->res_class = self->role = NULL;
self->wmstate = NormalState;
- self->focused = FALSE;
self->transient = FALSE;
self->transients = NULL;
self->transient_for = NULL;
Client *c = it->data;
if (c == skip) continue; /* circular? */
if ((ret = search_focus_tree(c, skip))) return ret;
- if (c->focused) return c;
+ if (client_focused(c)) return c;
}
return NULL;
}
void client_fullscreen(Client *self, gboolean fs, gboolean savearea)
{
- static int saved_func, saved_decor;
int x, y, w, h;
if (!(self->functions & Func_Fullscreen) || /* can't */
if (fs) {
/* save the functions and remove them */
- saved_func = self->functions;
+ self->pre_fs_func = self->functions;
self->functions &= (Func_Close | Func_Fullscreen |
Func_Iconify);
/* save the decorations and remove them */
- saved_decor = self->decorations;
+ self->pre_fs_decor = self->decorations;
self->decorations = 0;
if (savearea) {
long dimensions[4];
} else {
long *dimensions;
- self->functions = saved_func;
- self->decorations = saved_decor;
+ self->functions = self->pre_fs_func;
+ self->decorations = self->pre_fs_decor;
if (PROP_GET32A(self->window, openbox_premax, cardinal,
dimensions, 4)) {
return FALSE;
}
}
-
+
+ if (client_focused(self))
+ return TRUE;
+
if (self->can_focus)
XSetInputFocus(ob_display, self->window, RevertToNone, CurrentTime);
XSendEvent(ob_display, self->window, FALSE, NoEventMask, &ce);
}
- /*XSync(ob_display, FALSE); XXX Why sync? */
+ client_set_focused(self, TRUE);
+
+ /* XSync(ob_display, FALSE); XXX Why sync? */
return TRUE;
}
void client_unfocus(Client *self)
{
g_assert(focus_client == self);
- focus_set_client(NULL);
+ client_set_focused(self, FALSE);
+}
+
+void client_set_focused(Client *self, gboolean focused)
+{
+ if (focused) {
+ if (focus_client != self) {
+ focus_set_client(self);
+
+ /* focus state can affect the stacking layer */
+ client_calc_layer(self);
+
+ engine_frame_adjust_focus(self->frame);
+ }
+ } else {
+ if (focus_client == self)
+ focus_set_client(NULL);
+
+ /* focus state can affect the stacking layer */
+ client_calc_layer(self);
+
+ if (self->frame != NULL) /* unfocus can happen while being unmanaged */
+ engine_frame_adjust_focus(self->frame);
+ }
+}
+
+gboolean client_focused(Client *self)
+{
+ return self == focus_client;
}