diff options
| author | Dana Jansens <danakj@orodu.net> | 2003-03-21 10:26:26 +0000 |
|---|---|---|
| committer | Dana Jansens <danakj@orodu.net> | 2003-03-21 10:26:26 +0000 |
| commit | 9a4ccc919c0e877f2c6e66b540f86169fac18dc1 (patch) | |
| tree | 7d366858cbbabbb1507dc726042eecf47671c7e3 /openbox | |
| parent | 5034073da7013210ef80f93eaa2cfefdd471f127 (diff) | |
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.
Diffstat (limited to 'openbox')
| -rw-r--r-- | openbox/client.c | 28 | ||||
| -rw-r--r-- | openbox/client.h | 5 |
2 files changed, 32 insertions, 1 deletions
diff --git a/openbox/client.c b/openbox/client.c index 3ef71e92..c44fe343 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -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) diff --git a/openbox/client.h b/openbox/client.h index 6f303fff..c7acf7b8 100644 --- a/openbox/client.h +++ b/openbox/client.h @@ -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. |
