summaryrefslogtreecommitdiff
path: root/openbox
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2003-08-31 18:52:23 +0000
committerDana Jansens <danakj@orodu.net>2003-08-31 18:52:23 +0000
commit0745e2ee0aa6b8e7dbab1a4124e60ccb5b4e8441 (patch)
tree3fd9d46c4b0ec22967573cb3e0a0484d27eb3133 /openbox
parent0127812735b8c776c296063f18adf15026a32b98 (diff)
make focus cycling work when not interactive
add focus_directional_cycle
Diffstat (limited to 'openbox')
-rw-r--r--openbox/focus.c60
-rw-r--r--openbox/focus.h8
2 files changed, 59 insertions, 9 deletions
diff --git a/openbox/focus.c b/openbox/focus.c
index a15e1b16..6e738d4a 100644
--- a/openbox/focus.c
+++ b/openbox/focus.c
@@ -257,8 +257,8 @@ static void popup_cycle(ObClient *c, gboolean show)
}
}
-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;
@@ -271,10 +271,9 @@ ObClient *focus_cycle(gboolean forward, gboolean linear,
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;
}
@@ -314,11 +313,14 @@ ObClient *focus_cycle(gboolean forward, gboolean linear,
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;
@@ -327,7 +329,51 @@ done_cycle:
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)
diff --git a/openbox/focus.h b/openbox/focus.h
index cfaba39b..b12caf7b 100644
--- a/openbox/focus.h
+++ b/openbox/focus.h
@@ -1,6 +1,8 @@
#ifndef __focus_h
#define __focus_h
+#include "misc.h"
+
#include <X11/Xlib.h>
#include <glib.h>
@@ -31,8 +33,10 @@ void focus_fallback(ObFocusFallbackType type);
/*! 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);