+ /* Don't set focus_client to NULL here. It will be set to NULL when the
+ FocusOut event comes. Otherwise, if we focus nothing and then focus the
+ same window again, The focus code says nothing changed, but focus_client
+ ends up being NULL anyways.
+ focus_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.
+ */
+ if (keyboard_interactively_grabbed())
+ keyboard_interactive_cancel();
+
+ /* when nothing will be focused, send focus to the backup target */
+ XSetInputFocus(ob_display, screen_support_win, RevertToPointerRoot,
+ event_curtime);
+}
+
+void focus_order_remove(ObClient *c)
+{
+ focus_order = g_list_remove(focus_order, 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);