/* 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);
XSendEvent(ob_display, self->window, FALSE, NoEventMask, &ce);
}
+ 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)
/* Returns if the window is focused */
gboolean client_focused(Client *self);
+/*! Sets the client to a focused or unfocused state. This does not actually
+ change the input focus, but rather is used once focus has been moved to tell
+ the client that it is so. */
+void client_set_focused(Client *self, gboolean focused);
+
/*! Move and/or resize the window.
This also maintains things like the client's minsize, and size increments.
@param anchor The corner to keep in the same position when resizing.