+ if (type == OB_FOCUS_FALLBACK_UNFOCUSING && old) {
+ /* try for transient relations */
+ if (old->transient_for) {
+ if (old->transient_for == OB_TRAN_GROUP) {
+ for (it = focus_order[screen_desktop]; it; it = it->next) {
+ GSList *sit;
+
+ for (sit = old->group->members; sit; sit = sit->next)
+ if (sit->data == it->data)
+ if (focus_fallback_transient(sit->data, old))
+ return;
+ }
+ } else {
+ if (focus_fallback_transient(old->transient_for, old))
+ return;
+ }
+ }
+
+ /* try for group relations */
+ 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)
+ if (sit->data == it->data)
+ if (sit->data != old && client_normal(sit->data))
+ if (client_can_focus(sit->data)) {
+ gboolean r = client_focus(sit->data);
+ assert(r);
+ return;
+ }
+ }
+ }
+
+ for (it = focus_order[screen_desktop]; it != NULL; it = it->next)
+ if (type != OB_FOCUS_FALLBACK_UNFOCUSING || it->data != old)
+ if (client_normal(it->data) &&
+ /* dont fall back to 'anonymous' fullscreen windows. theres no
+ checks for this is in transient/group fallbacks, so they can
+ be fallback targets there. */
+ !((ObClient*)it->data)->fullscreen &&
+ client_can_focus(it->data)) {
+ gboolean r = client_focus(it->data);
+ assert(r);
+ return;
+ }
+
+ /* nothing to focus, and already set it to none above */
+}
+
+static void popup_cycle(ObClient *c, gboolean show)
+{
+ if (!show) {
+ popup_hide(focus_cycle_popup);
+ } else {
+ Rect *a;
+ ObClient *p = c;
+ char *title;
+
+ a = screen_physical_area_monitor(0);
+ popup_position(focus_cycle_popup, CenterGravity,
+ a->x + a->width / 2, a->y + a->height / 2);
+/* popup_size(focus_cycle_popup, a->height/2, a->height/16);
+ popup_show(focus_cycle_popup, c->title,
+ client_icon(c, a->height/16, a->height/16));
+*/
+ /* XXX the size and the font extents need to be related on some level
+ */
+ popup_size(focus_cycle_popup, 320, 48);
+
+ /* use the transient's parent's title/icon */
+ 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),
+ " - ",
+ (p->iconic ? p->icon_title : p->title),
+ NULL);
+
+ popup_show(focus_cycle_popup,
+ (title ? title : (c->iconic ? c->icon_title : c->title)),
+ client_icon(p, 48, 48));
+ g_free(title);