about summary refs log tree commit diff stats
diff options
context:
space:
mode:
author2015-08-19 21:11:16 +0200
committer2015-08-19 21:17:37 +0200
commit9d4b71ecadd5b3c2c777b273fa4d2c0cc0c3a464 (patch)
tree112dde67aad25aebae2a65c214ef70872782a794
parent5d0c5be1028c67f3b499017c5c39019f4b1d8c10 (diff)
downloadtabbed-9d4b71ecadd5b3c2c777b273fa4d2c0cc0c3a464.tar.gz
-rw-r--r--config.def.h2
-rw-r--r--tabbed.13
-rw-r--r--tabbed.c23
3 files changed, 24 insertions, 4 deletions
diff --git a/config.def.h b/config.def.h
index 55bec4c..41f39c3 100644
--- a/config.def.h
+++ b/config.def.h
@@ -12,6 +12,7 @@ static const char before[]      = "<";
 static const char after[]       = ">";
 static const int  tabwidth      = 200;
 static const Bool foreground    = True;
+static       Bool urgentswitch  = False;
 
 /*
  * Where to place a new tab when it is opened. When npisrelative is True,
@@ -56,6 +57,7 @@ static Key keys[] = { \
 	{ MODKEY,                       XK_q,      killclient,     { 0 } },
 
 	{ MODKEY,                       XK_u,      focusurgent,    { .v = NULL } },
+	{ MODKEY|ShiftMask,             XK_u,      toggle,         { .v = (void*) &urgentswitch } },
 
 	{ 0,                            XK_F11,    fullscreen,     { 0 } },
 };
diff --git a/tabbed.1 b/tabbed.1
index 05ac355..593847e 100644
--- a/tabbed.1
+++ b/tabbed.1
@@ -124,6 +124,9 @@ move selected tab one to the left
 .B Ctrl\-Shift\-k
 move selected tab one to the right
 .TP
+.B Ctrl\-Shift\-u
+toggle autofocus of urgent tabs
+.TP
 .B Ctrl\-Tab
 toggle between the selected and last selected tab
 .TP
diff --git a/tabbed.c b/tabbed.c
index 93c9d0f..ba69f21 100644
--- a/tabbed.c
+++ b/tabbed.c
@@ -129,6 +129,7 @@ static void setcmd(int argc, char *argv[], int);
 static void sigchld(int unused);
 static void spawn(const Arg *arg);
 static int textnw(const char *text, unsigned int len);
+static void toggle(const Arg *arg);
 static void unmanage(int c);
 static void updatenumlockmask(void);
 static void updatetitle(int c);
@@ -837,12 +838,21 @@ propertynotify(const XEvent *e) {
 			&& (c = getclient(ev->window)) > -1
 			&& (wmh = XGetWMHints(dpy, clients[c]->win))) {
 		if(wmh->flags & XUrgencyHint) {
+			XFree(wmh);
+			wmh = XGetWMHints(dpy, win);
 			if(c != sel) {
-				clients[c]->urgent = True;
-				drawbar();
+				if(urgentswitch && wmh && !(wmh->flags & XUrgencyHint)) {
+					/* only switch, if tabbed was focused since last urgency hint
+					 * if WMHints could not be received, default to no switch */
+					focus(c);
+				} else {
+					/* if no switch should be performed, mark tab as urgent */
+					clients[c]->urgent = True;
+					drawbar();
+				}
 			}
-			XFree(wmh);
-			if((wmh = XGetWMHints(dpy, win))) {
+			if(wmh && !(wmh->flags & XUrgencyHint)) {
+				/* update tabbed urgency hint if not set already */
 				wmh->flags |= XUrgencyHint;
 				XSetWMHints(dpy, win, wmh);
 			}
@@ -1094,6 +1104,11 @@ textnw(const char *text, unsigned int len) {
 }
 
 void
+toggle(const Arg *arg) {
+    *(Bool*) arg->v = !*(Bool*) arg->v;
+}
+
+void
 unmanage(int c) {
 	if(c < 0 || c >= nclients) {
 		drawbar();