+
+ if (!first) first = focus_client;
+ if (!focus_cycle_target) focus_cycle_target = focus_client;
+
+ if ((ft = client_find_directional(focus_cycle_target, dir))) {
+ if (ft != focus_cycle_target) {/* prevents flicker */
+ if (focus_cycle_target)
+ frame_adjust_focus(focus_cycle_target->frame, FALSE);
+ focus_cycle_target = ft;
+ frame_adjust_focus(focus_cycle_target->frame, TRUE);
+ }
+ popup_cycle(ft, dialog);
+ }
+ if (dialog)
+ return;
+
+done_cycle:
+ if (done && focus_cycle_target)
+ client_activate(focus_cycle_target, FALSE);
+
+ first = NULL;
+ focus_cycle_target = NULL;
+
+ popup_cycle(ft, FALSE);
+
+ return;
+}
+
+void focus_order_add_new(ObClient *c)
+{
+ guint d, i;
+
+ if (c->iconic)
+ focus_order_to_top(c);
+ else {
+ d = c->desktop;
+ if (d == DESKTOP_ALL) {
+ for (i = 0; i < screen_num_desktops; ++i) {
+ 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)
+ focus_order[d] = g_list_insert(focus_order[d], c, 0);
+ else
+ focus_order[d] = g_list_insert(focus_order[d], c, 1);
+ }
+}
+
+void focus_order_remove(ObClient *c)
+{
+ guint d, i;
+
+ d = c->desktop;
+ if (d == DESKTOP_ALL) {
+ for (i = 0; i < screen_num_desktops; ++i)
+ focus_order[i] = g_list_remove(focus_order[i], c);
+ } else
+ focus_order[d] = g_list_remove(focus_order[d], c);
+}
+
+static void to_top(ObClient *c, guint d)
+{
+ focus_order[d] = g_list_remove(focus_order[d], c);
+ if (!c->iconic) {
+ focus_order[d] = g_list_prepend(focus_order[d], c);
+ } else {
+ GList *it;
+
+ /* insert before first iconic window */
+ for (it = focus_order[d];
+ it && !((ObClient*)it->data)->iconic; it = it->next);
+ g_list_insert_before(focus_order[d], it, c);
+ }
+}
+
+void focus_order_to_top(ObClient *c)
+{
+ guint d, i;
+
+ d = c->desktop;
+ if (d == DESKTOP_ALL) {
+ for (i = 0; i < screen_num_desktops; ++i)
+ to_top(c, i);
+ } else
+ to_top(c, d);
+}
+
+static void to_bottom(ObClient *c, guint d)
+{
+ focus_order[d] = g_list_remove(focus_order[d], c);
+ if (c->iconic) {
+ focus_order[d] = g_list_append(focus_order[d], c);
+ } else {
+ GList *it;
+
+ /* insert before first iconic window */
+ for (it = focus_order[d];
+ it && !((ObClient*)it->data)->iconic; it = it->next);
+ g_list_insert_before(focus_order[d], it, c);
+ }
+}
+
+void focus_order_to_bottom(ObClient *c)
+{
+ guint d, i;
+
+ d = c->desktop;
+ if (d == DESKTOP_ALL) {
+ for (i = 0; i < screen_num_desktops; ++i)
+ to_bottom(c, i);
+ } else
+ to_bottom(c, d);