add the client_set_focused function.

make focus state be changed internally immediately after calling the X functions to make it so, basically, assume their success. this elimiates races all over the place with our state vs the server's state.
This commit is contained in:
Dana Jansens 2003-03-21 10:26:26 +00:00
parent 5034073da7
commit 9a4ccc919c
2 changed files with 32 additions and 1 deletions

View file

@ -245,6 +245,7 @@ void client_unmanage(Client *client)
/* 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);
@ -1919,6 +1920,8 @@ gboolean client_focus(Client *self)
XSendEvent(ob_display, self->window, FALSE, NoEventMask, &ce);
}
client_set_focused(self, TRUE);
/* XSync(ob_display, FALSE); XXX Why sync? */
return TRUE;
}
@ -1926,7 +1929,30 @@ gboolean client_focus(Client *self)
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)

View file

@ -320,6 +320,11 @@ gboolean client_normal(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.