+ return;
+}
+
+void focus_directional_cycle(ObDirection dir,
+ gboolean dialog, gboolean done, gboolean cancel)
+{
+ static ObClient *first = NULL;
+ ObClient *ft;
+
+ if (cancel) {
+ if (focus_cycle_target)
+ frame_adjust_focus(focus_cycle_target->frame, FALSE);
+ if (focus_client)
+ frame_adjust_focus(focus_client->frame, TRUE);
+ focus_cycle_target = NULL;
+ goto done_cycle;
+ } else if (done && dialog) {
+ goto done_cycle;
+ }
+
+ 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;