Usage

To wire this up, first add:

import XMonad.Hooks.UrgencyHook

to your import list in your config file. Now, you have a decision to make:
When a window deems itself urgent, do you want to pop up a temporary dzen
bar telling you so, or do you have an existing dzen wherein you would like to
highlight urgent workspaces?

Pop up a temporary dzen

Enable your urgency hook by wrapping your config record in a call to
withUrgencyHook. For example:

This will pop up a dzen bar for five seconds telling you you've got an
urgent window.

Highlight in existing dzen

In order for xmonad to track urgent windows, you must install an urgency hook.
You can use the above dzenUrgencyHook, or if you're not interested in the
extra popup, install NoUrgencyHook, as so:

main = xmonad $ withUrgencyHook NoUrgencyHook
$ defaultConfig

Now, your XMonad.Hooks.DynamicLog must be set up to display the urgent
windows. If you're using the dzen or dzenPP functions from that module,
then you should be good. Otherwise, you want to figure out how to set
ppUrgent.

Useful keybinding

You can set up a keybinding to jump to the window that was recently marked
urgent. See an example at focusUrgent.

Note

Note: UrgencyHook installs itself as a LayoutModifier, so if you modify your
urgency hook and restart xmonad, you may need to rejigger your layout by
hitting mod-shift-space.

Troubleshooting

There are three steps to get right:

The X client must set the UrgencyHint flag. How to configure this
depends on the application. If you're using a terminal app, this is in
two parts:

The console app must send a ^G (bell). In bash, a helpful trick is
sleep 1; echo -e '\a'.

The terminal must convert the bell into UrgencyHint.

XMonad must be configured to notice UrgencyHints. If you've added
withUrgencyHook, you may need to hit mod-shift-space to reset the layout.

The dzen must run when told. Run dzen2 -help and make sure that it
supports all of the arguments you told DzenUrgencyHook to pass it. Also,
set up a keybinding to the dzen action in XMonad.Util.Dzen to test
if that works.

As best you can, try to isolate which one(s) of those is failing.

Example: Setting up irssi + rxvt-unicode

This is a commonly asked example. By default, the window doesn't get flagged
urgent when somebody messages you in irssi. You will have to configure some
things. If you're using different tools than this, your mileage will almost
certainly vary. (For example, in Xchat2, it's just a simple checkbox.)

Configuring irssi

Irssi is not an X11 app, so it can't set the UrgencyHint flag on XWMHints.
However, on all console applications is bestown the greatest of all notification
systems: the bell. That's right, Ctrl+G, ASCII code 7, echo -e '\a', your
friend, the bell. To configure irssi to send a bell when you receive a message:

/set beep_msg_level MSGS NOTICES INVITES DCC DCCMSGS HILIGHT

Consult your local irssi documentation for more detail.

Configuring screen

A common way to run irssi is within the lovable giant, screen. Some distros
(e.g. Ubuntu) like to configure screen to trample on your poor console
applications -- in particular, to turn bell characters into evil, smelly
"visual bells." To turn this off, add:

vbell off # or remove the existing 'vbell on' line

to your .screenrc, or hit C-a C-g within a running screen session for an
immediate but temporary fix.

Configuring rxvt-unicode

Rubber, meet road. Urxvt is the gateway between console apps and X11. To tell
urxvt to set an UrgencyHint when it receives a bell character, first, have
an urxvt version 8.3 or newer, and second, set the following in your
.Xdefaults:

urxvt.urgentOnBell: true

Depending on your setup, you may need to xrdb that.

Configuring xmonad

Hopefully you already read the section on how to configure xmonad. If not,
hopefully you know where to find it.

A set of choices as to when you want to be re-notified of an urgent
window. Perhaps you focused on something and you miss the dzen popup bar. Or
you're AFK. Or you feel the need to be more distracted. I don't care.

A hook that sets the border color of an urgent window. The color
will remain until the next time the window gains or loses focus, at
which point the standard border color from the XConfig will be applied.
You may want to use suppressWhen = Never with this: