summaryrefslogtreecommitdiff
path: root/openbox/focus_cycle.c
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2010-01-11 15:13:55 -0500
committerDana Jansens <danakj@orodu.net>2010-01-11 15:13:55 -0500
commit14180a6b0dee05e73fd193db28fd94b4ef3046d1 (patch)
treebcf5f976a2d598827378d12a1b801532971824aa /openbox/focus_cycle.c
parent358056b102f633cb63ac7b9aa0cfdd25af77ddf3 (diff)
More work on refreshing the focus cycle dialog when windows are added/removed from the valid focus order
Diffstat (limited to 'openbox/focus_cycle.c')
-rw-r--r--openbox/focus_cycle.c118
1 files changed, 51 insertions, 67 deletions
diff --git a/openbox/focus_cycle.c b/openbox/focus_cycle.c
index 07cc2e83..40436683 100644
--- a/openbox/focus_cycle.c
+++ b/openbox/focus_cycle.c
@@ -30,8 +30,14 @@
#include <X11/Xlib.h>
#include <glib.h>
+typedef enum {
+ OB_CYCLE_NONE = 0,
+ OB_CYCLE_NORMAL,
+ OB_CYCLE_DIRECTIONAL
+} ObCycleType;
+
ObClient *focus_cycle_target = NULL;
-static gboolean focus_cycle_directional = FALSE;
+static ObCycleType focus_cycle_type = OB_CYCLE_NONE;
static gboolean focus_cycle_iconic_windows;
static gboolean focus_cycle_all_desktops;
static gboolean focus_cycle_dock_windows;
@@ -52,64 +58,43 @@ void focus_cycle_shutdown(gboolean reconfig)
if (reconfig) return;
}
-void focus_cycle_add(ObClient *ifclient)
-{
- 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,
- 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)
+void focus_cycle_addremove(ObClient *c, gboolean redraw)
{
- if (!(focus_cycle_target && ifclient))
+ if (!focus_cycle_type)
return;
- if (focus_cycle_directional) {
- if (focus_cycle_target == ifclient) {
+ if (focus_cycle_type == OB_CYCLE_DIRECTIONAL) {
+ if (c && focus_cycle_target == c) {
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);
+ else if (c && redraw) {
+ gboolean v, s;
+
+ v = focus_cycle_valid(c);
+ s = focus_cycle_popup_is_showing(c);
+
+ if (v != s) {
+ focus_cycle_target =
+ focus_cycle_popup_refresh(focus_cycle_target, redraw);
}
}
+ else if (redraw) {
+ focus_cycle_reorder();
+ }
}
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);
+ if (focus_cycle_type == OB_CYCLE_NORMAL) {
+ focus_cycle_target = focus_cycle_popup_refresh(focus_cycle_target,
+ TRUE);
+ focus_cycle_update_indicator(focus_cycle_target);
+ if (!focus_cycle_target)
+ focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE,
+ TRUE, TRUE, TRUE, TRUE, TRUE);
+ }
}
ObClient* focus_cycle(gboolean forward, gboolean all_desktops,
@@ -126,7 +111,6 @@ ObClient* focus_cycle(gboolean forward, gboolean all_desktops,
if (interactive) {
if (cancel) {
focus_cycle_target = NULL;
- focus_cycle_directional = FALSE;
goto done_cycle;
} else if (done)
goto done_cycle;
@@ -164,17 +148,11 @@ ObClient* focus_cycle(gboolean forward, gboolean all_desktops,
if (it == NULL) it = g_list_last(list);
}
ft = it->data;
- if (focus_valid_target(ft, TRUE,
- focus_cycle_iconic_windows,
- focus_cycle_all_desktops,
- focus_cycle_dock_windows,
- focus_cycle_desktop_windows,
- FALSE))
- {
+ if (focus_cycle_valid(ft)) {
if (interactive) {
if (ft != focus_cycle_target) { /* prevents flicker */
focus_cycle_target = ft;
- focus_cycle_directional = FALSE;
+ focus_cycle_type = OB_CYCLE_NORMAL;
focus_cycle_draw_indicator(showbar ? ft : NULL);
}
if (dialog)
@@ -187,7 +165,7 @@ ObClient* focus_cycle(gboolean forward, gboolean all_desktops,
return focus_cycle_target;
} else if (ft != focus_cycle_target) {
focus_cycle_target = ft;
- focus_cycle_directional = FALSE;
+ focus_cycle_type = OB_CYCLE_NORMAL;
done = TRUE;
break;
}
@@ -198,7 +176,7 @@ done_cycle:
if (done && !cancel) ret = focus_cycle_target;
focus_cycle_target = NULL;
- focus_cycle_directional = FALSE;
+ focus_cycle_type = OB_CYCLE_NONE;
g_list_free(order);
order = NULL;
@@ -238,8 +216,7 @@ static ObClient *focus_find_directional(ObClient *c, ObDirection dir,
/* the currently selected window isn't interesting */
if (cur == c)
continue;
- if (!focus_valid_target(it->data, TRUE, FALSE, FALSE, dock_windows,
- desktop_windows, FALSE))
+ if (!focus_cycle_valid(it->data))
continue;
/* find the centre coords of this window, from the
@@ -318,7 +295,6 @@ ObClient* focus_directional_cycle(ObDirection dir, gboolean dock_windows,
if (cancel) {
focus_cycle_target = NULL;
- focus_cycle_directional = FALSE;
goto done_cycle;
} else if (done && interactive)
goto done_cycle;
@@ -344,17 +320,15 @@ ObClient* focus_directional_cycle(ObDirection dir, gboolean dock_windows,
GList *it;
for (it = focus_order; it; it = g_list_next(it))
- if (focus_valid_target(it->data, TRUE,
- focus_cycle_iconic_windows,
- focus_cycle_all_desktops,
- focus_cycle_dock_windows,
- focus_cycle_desktop_windows, FALSE))
+ if (focus_cycle_valid(it->data)) {
ft = it->data;
+ break;
+ }
}
if (ft && ft != focus_cycle_target) {/* prevents flicker */
focus_cycle_target = ft;
- focus_cycle_directional = TRUE;
+ focus_cycle_type = OB_CYCLE_DIRECTIONAL;
if (!interactive)
goto done_cycle;
focus_cycle_draw_indicator(showbar ? ft : NULL);
@@ -373,10 +347,20 @@ done_cycle:
first = NULL;
focus_cycle_target = NULL;
- focus_cycle_directional = FALSE;
+ focus_cycle_type = OB_CYCLE_NONE;
focus_cycle_draw_indicator(NULL);
focus_cycle_popup_single_hide();
return ret;
}
+
+gboolean focus_cycle_valid(struct _ObClient *client)
+{
+ return focus_valid_target(client, TRUE,
+ focus_cycle_iconic_windows,
+ focus_cycle_all_desktops,
+ focus_cycle_dock_windows,
+ focus_cycle_desktop_windows,
+ FALSE);
+}