+ } while (it != start);
+
+done_cycle:
+ t = NULL;
+ first = NULL;
+ focus_cycle_target = NULL;
+ g_list_free(order);
+ order = NULL;
+
+ popup_cycle(ft, FALSE);
+ grab_pointer(FALSE, None);
+
+ return NULL;
+}
+
+void focus_order_add_new(Client *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] && ((Client*)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] && ((Client*)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(Client *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(Client *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 && !((Client*)it->data)->iconic; it = it->next);
+ g_list_insert_before(focus_order[d], it, c);
+ }
+}
+
+void focus_order_to_top(Client *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(Client *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 && !((Client*)it->data)->iconic; it = it->next);
+ g_list_insert_before(focus_order[d], it, c);