Usage

The first component is a ManageHook which recognizes these
windows and de-manages them, so that xmonad does not try to tile
them. To enable it:

manageHook = ... <+> manageDocks

The second component is a layout modifier that prevents windows
from overlapping these dock windows. It is intended to replace
xmonad's so-called "gap" support. First, you must add it to your
list of layouts:

The third component is an event hook that causes new docks to appear
immediately, instead of waiting for the next focus change.

handleEventHook = ... <+> docksEventHook

AvoidStruts also supports toggling the dock gaps; add a keybinding
similar to:

,((modm, xK_b ), sendMessage ToggleStruts)

If you have multiple docks, you can toggle their gaps individually.
For example, to toggle only the top gap:

,((modm .|. controlMask, xK_t), sendMessage $ ToggleStrut U)

Similarly, you can use D, L, and R to individually toggle
gaps on the bottom, left, or right.

If you want certain docks to be avoided but others to be covered by
default, you can manually specify the sides of the screen on which
docks should be avoided, using avoidStrutsOn. For example:

layoutHook = avoidStrutsOn [U,L] (tall ||| mirror tall ||| ...)

Important note: if you are switching from manual gaps
(defaultGaps in your config) to avoidStruts (recommended, since
manual gaps will probably be phased out soon), be sure to switch
off all your gaps (with mod-b) before reloading your config with
avoidStruts! Toggling struts with a ToggleStruts message will
not work unless your gaps are set to zero.