/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
focus.c for the Openbox window manager
+ Copyright (c) 2004 Mikael Magnusson
Copyright (c) 2003 Ben Jansens
This program is free software; you can redistribute it and/or modify
{
/* end cycling if the target disappears */
if (focus_cycle_target == client)
- focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE);
+ focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE);
}
static Window createWindow(Window parent, gulong mask,
- XSetWindowAttributes *attrib)
+ XSetWindowAttributes *attrib)
{
return XCreateWindow(ob_display, parent, 0, 0, 1, 1, 0,
- RrDepth(ob_rr_inst), InputOutput,
+ RrDepth(ob_rr_inst), InputOutput,
RrVisual(ob_rr_inst), mask, attrib);
}
/* in the middle of cycling..? kill it. */
if (focus_cycle_target)
- focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE);
+ focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE);
old = focus_client;
focus_client = client;
GSList *it;
ObClient *ret;
- for (it = c->transients; it; it = it->next) {
+ for (it = c->transients; it; it = g_slist_next(it)) {
if (it->data == top) return NULL;
ret = find_transient_recursive(it->data, top, skip);
if (ret && ret != skip && client_normal(ret)) return ret;
if (old->transient_for) {
gboolean trans = FALSE;
- if (!config_focus_follow)
+ if (!config_focus_follow || config_focus_last)
trans = TRUE;
else {
if ((target = client_under_pointer()) &&
/* try for transient relations */
if (trans) {
if (old->transient_for == OB_TRAN_GROUP) {
- for (it = focus_order[screen_desktop]; it; it = it->next) {
+ for (it = focus_order[screen_desktop]; it;
+ it = g_list_next(it))
+ {
GSList *sit;
- for (sit = old->group->members; sit; sit = sit->next)
+ for (sit = old->group->members; sit;
+ sit = g_slist_next(sit))
+ {
if (sit->data == it->data)
if ((target =
focus_fallback_transient(sit->data, old)))
return target;
+ }
}
} else {
if ((target =
}
}
- if (config_focus_follow) {
+ if (config_focus_follow && !config_focus_last) {
if ((target = client_under_pointer()))
if (client_normal(target) && client_can_focus(target))
return target;
if (old->group) {
GSList *sit;
- for (it = focus_order[screen_desktop]; it != NULL; it = it->next)
- for (sit = old->group->members; sit; sit = sit->next)
+ for (it = focus_order[screen_desktop]; it; it = g_list_next(it))
+ for (sit = old->group->members; sit; sit = g_slist_next(sit))
if (sit->data == it->data)
if (sit->data != old && client_normal(sit->data))
if (client_can_focus(sit->data))
}
#endif
- for (it = focus_order[screen_desktop]; it != NULL; it = it->next)
+ for (it = focus_order[screen_desktop]; it; it = g_list_next(it))
if (type != OB_FOCUS_FALLBACK_UNFOCUSING || it->data != old)
if (client_normal(it->data) && client_can_focus(it->data))
return it->data;
void focus_fallback(ObFocusFallbackType type)
{
- ObClient *new;
+ ObClient *new = focus_fallback_target(type);
/* unfocus any focused clients.. they can be focused by Pointer events
and such, and then when I try focus them, I won't get a FocusIn event
*/
focus_set_client(NULL);
- if ((new = focus_fallback_target(type)))
+ if (new)
client_focus(new);
}
} else {
Rect *a;
ObClient *p = c;
- gchar *title;
+ gchar *title = NULL;
a = screen_physical_area_monitor(0);
icon_popup_position(focus_cycle_popup, CenterGravity,
while (p->transient_for && p->transient_for != OB_TRAN_GROUP)
p = p->transient_for;
- if (p == c)
- title = NULL;
- else
- title = g_strconcat((c->iconic ? c->icon_title : c->title),
+ if (p != c && !strcmp("", (c->iconic ? c->icon_title : c->title)))
+ title = g_strdup(p->iconic ? p->icon_title : p->title);
+ /*title = g_strconcat((c->iconic ? c->icon_title : c->title),
" - ",
(p->iconic ? p->icon_title : p->title),
NULL);
-
+ */
icon_popup_show(focus_cycle_popup,
(title ? title :
(c->iconic ? c->icon_title : c->title)),
return FALSE;
}
-void focus_cycle(gboolean forward, gboolean linear,
+void focus_cycle(gboolean forward, gboolean linear, gboolean interactive,
gboolean dialog, gboolean done, gboolean cancel)
{
static ObClient *first = NULL;
GList *it, *start, *list;
ObClient *ft = NULL;
- if (cancel) {
- focus_cycle_target = NULL;
- goto done_cycle;
- } else if (done)
- goto done_cycle;
+ if (interactive) {
+ if (cancel) {
+ focus_cycle_target = NULL;
+ goto done_cycle;
+ } else if (done)
+ goto done_cycle;
- if (!focus_order[screen_desktop])
- goto done_cycle;
+ if (!focus_order[screen_desktop])
+ goto done_cycle;
- if (!first) first = focus_client;
- if (!focus_cycle_target) focus_cycle_target = focus_client;
+ if (!first) first = focus_client;
- if (linear) list = client_list;
- else list = focus_order[screen_desktop];
+ if (linear) list = client_list;
+ else list = focus_order[screen_desktop];
+ } else {
+ if (!focus_order[screen_desktop])
+ goto done_cycle;
+ list = client_list;
+ }
+ if (!focus_cycle_target) focus_cycle_target = focus_client;
start = it = g_list_find(list, focus_cycle_target);
if (!start) /* switched desktops or something? */
}
ft = it->data;
if (valid_focus_target(ft)) {
- if (ft != focus_cycle_target) { /* prevents flicker */
+ if (interactive) {
+ if (ft != focus_cycle_target) { /* prevents flicker */
+ focus_cycle_target = ft;
+ focus_cycle_draw_indicator();
+ }
+ popup_cycle(ft, dialog);
+ return;
+ } else if (ft != focus_cycle_target) {
focus_cycle_target = ft;
- focus_cycle_draw_indicator();
+ done = TRUE;
+ break;
}
- popup_cycle(ft, dialog);
- return;
}
} while (it != start);
g_list_free(order);
order = NULL;
- focus_cycle_draw_indicator();
- popup_cycle(ft, FALSE);
+ if (interactive) {
+ focus_cycle_draw_indicator();
+ popup_cycle(ft, FALSE);
+ }
return;
}
-void focus_directional_cycle(ObDirection dir,
+void focus_directional_cycle(ObDirection dir, gboolean interactive,
gboolean dialog, gboolean done, gboolean cancel)
{
static ObClient *first = NULL;
ObClient *ft = NULL;
+ if (!interactive)
+ return;
+
if (cancel) {
focus_cycle_target = NULL;
goto done_cycle;
/* insert before first iconic window */
for (it = focus_order[d];
- it && !((ObClient*)it->data)->iconic; it = it->next);
+ it && !((ObClient*)it->data)->iconic; it = g_list_next(it));
focus_order[d] = g_list_insert_before(focus_order[d], it, c);
}
}
/* insert before first iconic window */
for (it = focus_order[d];
- it && !((ObClient*)it->data)->iconic; it = it->next);
+ it && !((ObClient*)it->data)->iconic; it = g_list_next(it));
g_list_insert_before(focus_order[d], it, c);
}
}