} focus_indicator;
RrAppearance *a_focus_indicator;
-RrColor *color_black;
RrColor *color_white;
static ObIconPopup *focus_cycle_popup;
focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE);
}
-static Window createWindow(Window parent, unsigned long mask,
+static Window createWindow(Window parent, gulong mask,
XSetWindowAttributes *attrib)
{
return XCreateWindow(ob_display, parent, 0, 0, 1, 1, 0,
focus_indicator.right.obwin.type = Window_Internal;
focus_indicator.bottom.obwin.type = Window_Internal;
+ attr.save_under = True;
attr.override_redirect = True;
attr.background_pixel = BlackPixel(ob_display, ob_screen);
focus_indicator.top.win =
createWindow(RootWindow(ob_display, ob_screen),
- CWOverrideRedirect | CWBackPixel, &attr);
+ CWOverrideRedirect | CWBackPixel | CWSaveUnder,
+ &attr);
focus_indicator.left.win =
createWindow(RootWindow(ob_display, ob_screen),
- CWOverrideRedirect | CWBackPixel, &attr);
+ CWOverrideRedirect | CWBackPixel | CWSaveUnder,
+ &attr);
focus_indicator.right.win =
createWindow(RootWindow(ob_display, ob_screen),
- CWOverrideRedirect | CWBackPixel, &attr);
+ CWOverrideRedirect | CWBackPixel | CWSaveUnder,
+ &attr);
focus_indicator.bottom.win =
createWindow(RootWindow(ob_display, ob_screen),
- CWOverrideRedirect | CWBackPixel, &attr);
+ CWOverrideRedirect | CWBackPixel | CWSaveUnder,
+ &attr);
stacking_add(INTERNAL_AS_WINDOW(&focus_indicator.top));
stacking_add(INTERNAL_AS_WINDOW(&focus_indicator.left));
stacking_add(INTERNAL_AS_WINDOW(&focus_indicator.right));
stacking_add(INTERNAL_AS_WINDOW(&focus_indicator.bottom));
- color_black = RrColorNew(ob_rr_inst, 0, 0, 0);
color_white = RrColorNew(ob_rr_inst, 0xff, 0xff, 0xff);
a_focus_indicator = RrAppearanceNew(ob_rr_inst, 4);
/* reset focus to root */
XSetInputFocus(ob_display, PointerRoot, RevertToNone, event_lasttime);
- RrColorFree(color_black);
RrColorFree(color_white);
RrAppearanceFree(a_focus_indicator);
/* finds the first transient that isn't 'skip' and ensure's that client_normal
is true for it */
-static ObClient *find_transient_recursive(ObClient *c, ObClient *top, ObClient *skip)
+static ObClient *find_transient_recursive(ObClient *c, ObClient *top,
+ ObClient *skip)
{
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;
/* 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 (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;
} else {
Rect *a;
ObClient *p = c;
- char *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
+/*
+ if (p != c)
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 :
frame_adjust_focus(focus_cycle_target->frame, FALSE);
frame_adjust_focus(focus_cycle_target->frame, TRUE);
*/
- int x, y, w, h;
- int wt, wl, wr, wb;
+ gint x, y, w, h;
+ gint wt, wl, wr, wb;
wt = wl = wr = wb = MAX(3,
ob_rr_theme->handle_height +
focus an iconic window, but we want to be able to, so we just check
if the focus flags on the window allow it, and its on the current
desktop */
- return ((ft->type == OB_CLIENT_TYPE_NORMAL ||
- ft->type == OB_CLIENT_TYPE_DIALOG ||
- (!client_has_group_siblings(ft) &&
- (ft->type == OB_CLIENT_TYPE_TOOLBAR ||
- ft->type == OB_CLIENT_TYPE_MENU ||
- ft->type == OB_CLIENT_TYPE_UTILITY))) &&
- !ft->transients &&
- ((ft->can_focus || ft->focus_notify) &&
- !ft->skip_taskbar &&
- (ft->desktop == screen_desktop || ft->desktop == DESKTOP_ALL)));
+ if ((ft->type == OB_CLIENT_TYPE_NORMAL ||
+ ft->type == OB_CLIENT_TYPE_DIALOG ||
+ (!client_has_group_siblings(ft) &&
+ (ft->type == OB_CLIENT_TYPE_TOOLBAR ||
+ ft->type == OB_CLIENT_TYPE_MENU ||
+ ft->type == OB_CLIENT_TYPE_UTILITY))) &&
+ ((ft->can_focus || ft->focus_notify) &&
+ !ft->skip_taskbar &&
+ (ft->desktop == screen_desktop || ft->desktop == DESKTOP_ALL)) &&
+ ft == client_focus_target(ft))
+ return TRUE;
+/*
+ {
+ GSList *it;
+
+ for (it = ft->transients; it; it = g_slist_next(it)) {
+ ObClient *c = it->data;
+
+ if (c->frame->visible)
+ return FALSE;
+ }
+ return TRUE;
+ }
+*/
+
+ return FALSE;
}
void focus_cycle(gboolean forward, gboolean linear,
if (cancel) {
focus_cycle_target = NULL;
goto done_cycle;
- } else if (done && dialog) {
+ } else if (done)
goto done_cycle;
- }
if (!focus_order[screen_desktop])
goto done_cycle;
if (cancel) {
focus_cycle_target = NULL;
goto done_cycle;
- } else if (done && dialog) {
+ } else if (done)
goto done_cycle;
- }
if (!focus_order[screen_desktop])
goto done_cycle;
d = c->desktop;
if (d == DESKTOP_ALL) {
for (i = 0; i < screen_num_desktops; ++i) {
+ g_assert(!g_list_find(focus_order[i], c));
if (focus_order[i] && ((ObClient*)focus_order[i]->data)->iconic)
focus_order[i] = g_list_insert(focus_order[i], c, 0);
else
focus_order[i] = g_list_insert(focus_order[i], c, 1);
}
- } else
- if (focus_order[d] && ((ObClient*)focus_order[d]->data)->iconic)
+ } else {
+ g_assert(!g_list_find(focus_order[d], c));
+ if (focus_order[d] && ((ObClient*)focus_order[d]->data)->iconic)
focus_order[d] = g_list_insert(focus_order[d], c, 0);
else
focus_order[d] = g_list_insert(focus_order[d], c, 1);
+ }
}
}
/* 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);
}
}