/* in the middle of cycling..? kill it. */
if (focus_cycle_target)
- focus_cycle(TRUE, TRUE, TRUE, TRUE);
+ focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE);
old = focus_client;
focus_client = client;
}
}
-ObClient *focus_cycle(gboolean forward, gboolean linear, gboolean done,
- gboolean cancel)
+void focus_cycle(gboolean forward, gboolean linear,
+ gboolean dialog, gboolean done, gboolean cancel)
{
static ObClient *first = NULL;
static ObClient *t = NULL;
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) {
- if (focus_cycle_target)
- client_activate(focus_cycle_target, FALSE);
+ } else if (done && dialog) {
goto done_cycle;
}
focus_cycle_target = ft;
frame_adjust_focus(focus_cycle_target->frame, TRUE);
}
- popup_cycle(ft, config_focus_popup);
- return ft;
+ popup_cycle(ft, dialog);
+ return;
}
} while (it != start);
done_cycle:
+ if (done && focus_cycle_target)
+ client_activate(focus_cycle_target, FALSE);
+
t = NULL;
first = NULL;
focus_cycle_target = NULL;
popup_cycle(ft, FALSE);
- return NULL;
+ 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;
}
void focus_order_add_new(ObClient *c)