    module XMonad.Util.NoTaskbar (-- * Usage
                                  -- $usage
                                  noTaskbar
                                 ,markNoTaskbar) where

    import XMonad.Core
    import XMonad.ManageHook
    import Graphics.X11.Xlib (Window)
    import Graphics.X11.Xlib.Atom (aTOM)
    import Graphics.X11.Xlib.Extras (changeProperty32
                                    ,propModePrepend)
    import Control.Monad.Reader (ask)

    -- $usage
    -- Utility functions to hide windows from pagers and taskbars. Mostly useful
    -- when EWMH doesn't do what you intend (e.g. for 'NamedScratchpad' windows you
    -- probably don't want to be dumped into the 'NSP' workspace).

    -- | A 'ManageHook' to mark a window to not be shown in pagers or taskbars.
    noTaskbar :: ManageHook
    noTaskbar = ask >>= (>> idHook) . liftX . markNoTaskbar

    -- | An 'X' action to mark a window to not be shown in pagers or taskbars.
    markNoTaskbar :: Window -> X ()
    markNoTaskbar w = withDisplay $ \d -> do
                        ws <- getAtom "_NET_WM_STATE"
                        ntb <- getAtom "_NET_WM_STATE_SKIP_TASKBAR"
                        npg <- getAtom "_NET_WM_STATE_SKIP_PAGER"
                        io $ changeProperty32 d w ws aTOM propModePrepend [fi ntb,fi npg]

    -- sigh
    fi :: (Integral i, Num n) => i -> n
    fi = fromIntegral