+void focus_nothing()
+{
+ /* Install our own colormap */
+ if (focus_client != NULL) {
+ screen_install_colormap(focus_client, FALSE);
+ screen_install_colormap(NULL, TRUE);
+ }
+
+ /* nothing is focused, update the colormap and _the root property_ */
+ focus_set_client(NULL);
+
+ /* if there is a grab going on, then we need to cancel it. if we move
+ focus during the grab, applications will get NotifyWhileGrabbed events
+ and ignore them !
+
+ actions should not rely on being able to move focus during an
+ interactive grab.
+ */
+ event_cancel_all_key_grabs();
+
+ /* when nothing will be focused, send focus to the backup target */
+ XSetInputFocus(ob_display, screen_support_win, RevertToPointerRoot,
+ event_curtime);
+}
+
+void focus_order_add_new(ObClient *c)
+{
+ if (c->iconic)
+ focus_order_to_top(c);
+ else {
+ g_assert(!g_list_find(focus_order, c));
+ /* if there are any iconic windows, put this above them in the order,
+ but if there are not, then put it under the currently focused one */
+ if (focus_order && ((ObClient*)focus_order->data)->iconic)
+ focus_order = g_list_insert(focus_order, c, 0);
+ else
+ focus_order = g_list_insert(focus_order, c, 1);
+ }
+
+ /* in the middle of cycling..? kill it. */
+ focus_cycle_stop(c);
+}
+
+void focus_order_remove(ObClient *c)
+{
+ focus_order = g_list_remove(focus_order, c);
+
+ /* in the middle of cycling..? kill it. */
+ focus_cycle_stop(c);
+}
+
+void focus_order_to_top(ObClient *c)
+{
+ focus_order = g_list_remove(focus_order, c);
+ if (!c->iconic) {
+ focus_order = g_list_prepend(focus_order, c);
+ } else {
+ GList *it;
+
+ /* insert before first iconic window */
+ for (it = focus_order;
+ it && !((ObClient*)it->data)->iconic; it = g_list_next(it));
+ focus_order = g_list_insert_before(focus_order, it, c);
+ }
+}
+
+void focus_order_to_bottom(ObClient *c)
+{
+ focus_order = g_list_remove(focus_order, c);
+ if (c->iconic) {
+ focus_order = g_list_append(focus_order, c);
+ } else {
+ GList *it;
+
+ /* insert before first iconic window */
+ for (it = focus_order;
+ it && !((ObClient*)it->data)->iconic; it = g_list_next(it));
+ focus_order = g_list_insert_before(focus_order, it, c);
+ }
+}
+
+ObClient *focus_order_find_first(guint desktop)