#include <glib.h>
ObClient *focus_cycle_target = NULL;
+static gboolean focus_cycle_directional = FALSE;
static gboolean focus_cycle_iconic_windows;
static gboolean focus_cycle_all_desktops;
static gboolean focus_cycle_dock_windows;
if (reconfig) return;
}
-void focus_cycle_stop(ObClient *ifclient)
+void focus_cycle_add(ObClient *ifclient)
{
- /* stop focus cycling if the given client is a valid focus target,
- and so the cycling is being disrupted */
- if (focus_cycle_target && ifclient &&
- focus_valid_target(ifclient, TRUE,
+ if (!(focus_cycle_target && ifclient && !focus_cycle_directional))
+ return;
+
+ if (focus_valid_target(ifclient, TRUE,
focus_cycle_iconic_windows,
focus_cycle_all_desktops,
focus_cycle_dock_windows,
- focus_cycle_desktop_windows))
- {
- focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE);
- focus_directional_cycle(0, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE);
+ focus_cycle_desktop_windows,
+ FALSE))
+ focus_cycle_popup_refresh(focus_cycle_target,
+ focus_cycle_iconic_windows,
+ focus_cycle_all_desktops,
+ focus_cycle_dock_windows,
+ focus_cycle_desktop_windows);
+}
+
+void focus_cycle_remove(ObClient *ifclient)
+{
+ if (!(focus_cycle_target && ifclient))
+ return;
+
+ if (focus_cycle_directional) {
+ if (focus_cycle_target == ifclient) {
+ focus_directional_cycle(0, TRUE, TRUE, TRUE, TRUE,
+ TRUE, TRUE, TRUE);
+ }
+ }
+ else {
+ if (!focus_valid_target(ifclient, TRUE,
+ focus_cycle_iconic_windows,
+ focus_cycle_all_desktops,
+ focus_cycle_dock_windows,
+ focus_cycle_desktop_windows,
+ FALSE)) {
+ if (focus_cycle_target == ifclient) {
+ focus_cycle_target =
+ focus_cycle_popup_revert(focus_cycle_target);
+ focus_cycle_update_indicator(focus_cycle_target);
+ }
+ focus_cycle_popup_refresh(focus_cycle_target,
+ focus_cycle_iconic_windows,
+ focus_cycle_all_desktops,
+ focus_cycle_dock_windows,
+ focus_cycle_desktop_windows);
+ }
}
}
+void focus_cycle_reorder()
+{
+ if (focus_cycle_target && !focus_cycle_directional)
+ focus_cycle_popup_refresh(focus_cycle_target,
+ focus_cycle_iconic_windows,
+ focus_cycle_all_desktops,
+ focus_cycle_dock_windows,
+ focus_cycle_desktop_windows);
+}
+
ObClient* focus_cycle(gboolean forward, gboolean all_desktops,
gboolean dock_windows, gboolean desktop_windows,
gboolean linear, gboolean interactive,
- gboolean dialog, gboolean done, gboolean cancel)
+ gboolean showbar, gboolean dialog,
+ gboolean done, gboolean cancel)
{
- static ObClient *t = NULL;
static GList *order = NULL;
GList *it, *start, *list;
ObClient *ft = NULL;
if (interactive) {
if (cancel) {
focus_cycle_target = NULL;
+ focus_cycle_directional = FALSE;
goto done_cycle;
} else if (done)
goto done_cycle;
list = client_list;
}
-
if (focus_cycle_target == NULL) {
focus_cycle_iconic_windows = TRUE;
focus_cycle_all_desktops = all_desktops;
focus_cycle_iconic_windows,
focus_cycle_all_desktops,
focus_cycle_dock_windows,
- focus_cycle_desktop_windows))
+ focus_cycle_desktop_windows,
+ FALSE))
{
if (interactive) {
if (ft != focus_cycle_target) { /* prevents flicker */
focus_cycle_target = ft;
- focus_cycle_draw_indicator(ft);
+ focus_cycle_directional = FALSE;
+ focus_cycle_draw_indicator(showbar ? ft : NULL);
}
if (dialog)
/* same arguments as focus_target_valid */
return focus_cycle_target;
} else if (ft != focus_cycle_target) {
focus_cycle_target = ft;
+ focus_cycle_directional = FALSE;
done = TRUE;
break;
}
done_cycle:
if (done && !cancel) ret = focus_cycle_target;
- t = NULL;
focus_cycle_target = NULL;
+ focus_cycle_directional = FALSE;
g_list_free(order);
order = NULL;
if (cur == c)
continue;
if (!focus_valid_target(it->data, TRUE, FALSE, FALSE, dock_windows,
- desktop_windows))
+ desktop_windows, FALSE))
continue;
/* find the centre coords of this window, from the
ObClient* focus_directional_cycle(ObDirection dir, gboolean dock_windows,
gboolean desktop_windows,
gboolean interactive,
- gboolean dialog,
+ gboolean showbar, gboolean dialog,
gboolean done, gboolean cancel)
{
static ObClient *first = NULL;
if (cancel) {
focus_cycle_target = NULL;
+ focus_cycle_directional = FALSE;
goto done_cycle;
} else if (done && interactive)
goto done_cycle;
focus_cycle_iconic_windows,
focus_cycle_all_desktops,
focus_cycle_dock_windows,
- focus_cycle_desktop_windows))
+ focus_cycle_desktop_windows, FALSE))
ft = it->data;
}
if (ft && ft != focus_cycle_target) {/* prevents flicker */
focus_cycle_target = ft;
+ focus_cycle_directional = TRUE;
if (!interactive)
goto done_cycle;
- focus_cycle_draw_indicator(ft);
+ focus_cycle_draw_indicator(showbar ? ft : NULL);
}
if (focus_cycle_target && dialog)
/* same arguments as focus_target_valid */
first = NULL;
focus_cycle_target = NULL;
+ focus_cycle_directional = FALSE;
focus_cycle_draw_indicator(NULL);
focus_cycle_popup_single_hide();