}
}
-ObClient *focus_cycle(gboolean forward, gboolean linear,
- gboolean dialog, 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;
}
frame_adjust_focus(focus_cycle_target->frame, TRUE);
}
popup_cycle(ft, dialog);
- return ft;
+ 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)
#ifndef __focus_h
#define __focus_h
+#include "misc.h"
+
#include <X11/Xlib.h>
#include <glib.h>
/*! Cycle focus amongst windows
Returns the _ObClient to which focus has been cycled, or NULL if none. */
-struct _ObClient *focus_cycle(gboolean forward, gboolean linear,
- gboolean dialog, gboolean done, gboolean cancel);
+void focus_cycle(gboolean forward, gboolean linear,
+ gboolean dialog, gboolean done, gboolean cancel);
+void focus_directional_cycle(ObDirection dir,
+ gboolean dialog, gboolean done, gboolean cancel);
/*! Add a new client into the focus order */
void focus_order_add_new(struct _ObClient *c);