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();
|