summary refs log tree commit diff
diff options
context:
space:
mode:
authoroga <oga>2008-05-19 15:17:50 +0000
committeroga <oga>2008-05-19 15:17:50 +0000
commit43d6e147c2e0998f3e256fd2b90d85fd079429f4 (patch)
tree898746d31201c327b5ff30c322990f396c889277
parent7957a470fd60e9d50057989595dd3b36010211e2 (diff)
downloadcwm-43d6e147c2e0998f3e256fd2b90d85fd079429f4.tar.gz
cwm-43d6e147c2e0998f3e256fd2b90d85fd079429f4.tar.xz
cwm-43d6e147c2e0998f3e256fd2b90d85fd079429f4.zip
Use the XGrabKeyboard hack in for alt-tabbing as well. This stops the
mru getting the order messed up when gvim/xpdf et all steal key events.

While i'm here, change the logic in client_cyclenext() to use break instead
of goto, it's nicer that way.

Thirdly, instead of two different kbfuncs, just use the one and a flag.

"put your cycle diff in so I can pkg_delete gvim" okan@
-rw-r--r--calmwm.h3
-rw-r--r--client.c4
-rw-r--r--conf.c4
-rw-r--r--kbfunc.c12
4 files changed, 13 insertions, 10 deletions
diff --git a/calmwm.h b/calmwm.h
index f420f6d..ea16589 100644
--- a/calmwm.h
+++ b/calmwm.h
@@ -221,6 +221,9 @@ TAILQ_HEAD(winmatch_q, winmatch);
 /* for cwm_exec */
 #define	CWM_EXEC_PROGRAM	0x1
 #define	CWM_EXEC_WM		0x2
+/* For alt-tab */
+#define CWM_CYCLE		0x0
+#define CWM_RCYCLE		0x1
 
 #define KBFLAG_NEEDCLIENT 0x01
 
diff --git a/client.c b/client.c
index dd50601..649ee32 100644
--- a/client.c
+++ b/client.c
@@ -620,10 +620,10 @@ client_cyclenext(int reverse)
 			if (again)
 				return (NULL);	/* No windows visible. */
 
-			goto done;
+			break;
 		}
 	}
-done:
+
 	/* reset when alt is released. XXX I hate this hack */
 	sc->altpersist = 1;
 	client_ptrsave(oldcc);
diff --git a/conf.c b/conf.c
index ff5d29c..9bf690f 100644
--- a/conf.c
+++ b/conf.c
@@ -209,8 +209,8 @@ struct {
 	{ "search", kbfunc_client_search, 0, 0 },
 	{ "menusearch", kbfunc_menu_search, 0, 0 },
 	{ "hide", kbfunc_client_hide, KBFLAG_NEEDCLIENT, 0 },
-	{ "cycle", kbfunc_client_cycle, 0, 0 },
-	{ "rcycle", kbfunc_client_rcycle, 0, 0 },
+	{ "cycle", kbfunc_client_cycle, 0, (void *)CWM_CYCLE },
+	{ "rcycle", kbfunc_client_cycle, 0, (void *)CWM_RCYCLE },
 	{ "label", kbfunc_client_label, KBFLAG_NEEDCLIENT, 0 },
 	{ "delete", kbfunc_client_delete, KBFLAG_NEEDCLIENT, 0 },
 	{ "group1", kbfunc_client_group, 0, (void *)1 },
diff --git a/kbfunc.c b/kbfunc.c
index a55402a..11f2262 100644
--- a/kbfunc.c
+++ b/kbfunc.c
@@ -176,13 +176,13 @@ kbfunc_menu_search(struct client_ctx *scratch, void *arg)
 void
 kbfunc_client_cycle(struct client_ctx *scratch, void *arg)
 {
-	client_cyclenext(0);
-}
+	struct screen_ctx	*sc = screen_current();
 
-void
-kbfunc_client_rcycle(struct client_ctx *scratch, void *arg)
-{
-	client_cyclenext(1);
+	/* XXX for X apps that ignore events */
+	XGrabKeyboard(X_Dpy, sc->rootwin, True,
+	    GrabModeAsync, GrabModeAsync, CurrentTime);
+
+	client_cyclenext((int)arg);
 }
 
 void