#endif
/* focus state can affect the stacking layer */
client_calc_layer(client);
- frame_adjust_focus(client->frame);
+ frame_adjust_focus(client->frame, e->type == FocusIn);
break;
case EnterNotify:
if (client_normal(client)) {
Window focus_backup = None;
-static gboolean noreorder = 0;
+static Client *focus_cycle_target = NULL;
void focus_startup()
{
XSync(ob_display, FALSE);
}
+ /* in the middle of cycling..? kill it. */
+ if (focus_cycle_target)
+ focus_cycle(TRUE, TRUE, TRUE, TRUE);
+
old = focus_client;
focus_client = client;
/* move to the top of the list */
- if (noreorder)
- --noreorder;
- else if (client != NULL)
+ if (client != NULL)
push_to_top(client);
/* set the NET_ACTIVE_WINDOW hint */
}
Client *focus_cycle(gboolean forward, gboolean linear, gboolean done,
- gboolean cancel)
+ gboolean cancel)
{
static Client *first = NULL;
static Client *t = NULL;
Client *ft;
if (cancel) {
- if (first) client_focus(first);
+ /*if (first) client_focus(first); XXX*/
+ if (focus_cycle_target)
+ frame_adjust_focus(focus_cycle_target->frame, FALSE);
+ if (focus_client)
+ frame_adjust_focus(focus_client->frame, TRUE);
goto done_cycle;
} else if (done) {
- if (focus_client) {
- push_to_top(focus_client); /* move to top of focus_order */
- stacking_raise(focus_client);
+ if (focus_cycle_target) {
+ client_focus(focus_cycle_target);
+ stacking_raise(focus_cycle_target);
}
goto done_cycle;
}
if (!first) first = focus_client;
+ if (!focus_cycle_target) focus_cycle_target = focus_client;
if (linear) list = client_list;
else list = focus_order[screen_desktop];
- start = it = g_list_find(list, focus_client);
+ start = it = g_list_find(list, focus_cycle_target);
if (!start) /* switched desktops or something? */
start = it = forward ? g_list_last(list) : g_list_first(list);
if (!start) goto done_cycle;
if (it == NULL) it = g_list_last(list);
}
ft = client_focus_target(it->data);
- if (ft == it->data && focus_client != ft && client_normal(ft) &&
- client_focus(ft)) {
- noreorder++; /* avoid reordering the focus_order */
+ if (ft == it->data && client_normal(ft) && client_focusable(ft)) {
+ if (focus_cycle_target)
+ frame_adjust_focus(focus_cycle_target->frame, FALSE);
+ else if (focus_client)
+ frame_adjust_focus(focus_client->frame, FALSE);
+ focus_cycle_target = ft;
+ frame_adjust_focus(focus_cycle_target->frame, TRUE);
return ft;
}
} while (it != start);
done_cycle:
t = NULL;
first = NULL;
+ focus_cycle_target = NULL;
g_list_free(order);
order = NULL;
return NULL;
attrib.cursor = ob_cursors.br;
self->rgrip = createWindow(self->handle, mask, &attrib);
+ self->focused = FALSE;
+
/* the other stuff is shown based on decor settings */
XMapWindow(ob_display, self->plate);
XMapWindow(ob_display, self->lgrip);
framerender_frame(self);
}
-void frame_adjust_focus(Frame *self)
+void frame_adjust_focus(Frame *self, gboolean hilite)
{
+ self->focused = hilite;
framerender_frame(self);
}
gboolean desk_press;
gboolean shade_press;
gboolean iconify_press;
+
+ gboolean focused;
} Frame;
void frame_startup();
void frame_adjust_shape(Frame *self);
void frame_adjust_area(Frame *self, gboolean moved, gboolean resized);
void frame_adjust_state(Frame *self);
-void frame_adjust_focus(Frame *self);
+void frame_adjust_focus(Frame *self, gboolean hilite);
void frame_adjust_title(Frame *self);
void frame_adjust_icon(Frame *self);
void frame_grab_client(Frame *self, Client *client);
void framerender_frame(Frame *self)
{
- if (client_focused(self->client)) {
+ if (self->focused)
XSetWindowBorder(ob_display, self->plate,
theme_cb_focused_color->pixel);
- } else {
+ else
XSetWindowBorder(ob_display, self->plate,
theme_cb_unfocused_color->pixel);
- }
if (self->client->decorations & Decor_Titlebar) {
Appearance *t, *l, *m, *n, *i, *d, *s, *c;
- t = (client_focused(self->client) ?
+ t = (self->focused ?
self->a_focused_title : self->a_unfocused_title);
- l = (client_focused(self->client) ?
+ l = (self->focused ?
self->a_focused_label : self->a_unfocused_label);
- m = (client_focused(self->client) ?
+ m = (self->focused ?
(self->client->max_vert || self->client->max_horz ?
theme_a_focused_pressed_set_max :
(self->max_press ?
theme_a_unfocused_pressed_max :
theme_a_unfocused_unpressed_max)));
n = self->a_icon;
- i = (client_focused(self->client) ?
+ i = (self->focused ?
(self->iconify_press ?
theme_a_focused_pressed_iconify :
theme_a_focused_unpressed_iconify) :
(self->iconify_press ?
theme_a_unfocused_pressed_iconify :
theme_a_unfocused_unpressed_iconify));
- d = (client_focused(self->client) ?
+ d = (self->focused ?
(self->client->desktop == DESKTOP_ALL ?
theme_a_focused_pressed_set_desk :
(self->desk_press ?
(self->desk_press ?
theme_a_unfocused_pressed_desk :
theme_a_unfocused_unpressed_desk)));
- s = (client_focused(self->client) ?
+ s = (self->focused ?
(self->client->shaded ?
theme_a_focused_pressed_set_shade :
(self->shade_press ?
(self->shade_press ?
theme_a_unfocused_pressed_shade :
theme_a_unfocused_unpressed_shade)));
- c = (client_focused(self->client) ?
+ c = (self->focused ?
(self->close_press ?
theme_a_focused_pressed_close :
theme_a_focused_unpressed_close) :
if (self->client->decorations & Decor_Handle) {
Appearance *h, *g;
- h = (client_focused(self->client) ?
+ h = (self->focused ?
self->a_focused_handle : self->a_unfocused_handle);
- g = (client_focused(self->client) ?
+ g = (self->focused ?
theme_a_focused_grip : theme_a_unfocused_grip);
if (g->surface.data.planar.grad == Background_ParentRelative) {