    -----------------------------------------------------------------------------
    -- |
    -- Module      :  XMonad.Actions.UpdateFocus
    -- Copyright   :  (c) Daniel Schoepe
    -- License     :  BSD3-style (see LICENSE)
    --
    -- Maintainer  :  Daniel Schoepe <asgaroth_@gmx.de>
    -- Stability   :  unstable
    -- Portability :  unportable
    --
    -- Updates the focus on mouse move in unfocused windows.
    --
    -----------------------------------------------------------------------------

    module XMonad.Actions.UpdateFocus (
        -- * Usage
        -- $usage
        focusOnMouseMove,
        adjustEventInput
    ) where

    import XMonad
    import qualified XMonad.StackSet as W
    import Graphics.X11.Xlib.Extras
    import Control.Monad (when)
    import Data.Monoid

    -- $usage
    -- To make the focus update on mouse movement within an unfocused window, add the
    -- following to your @~\/.xmonad\/xmonad.hs@:
    --
    -- > import XMonad.Actions.UpdateFocus
    -- > xmonad $ defaultConfig {
    -- >   ..
    -- >   startupHook = adjustEventInput
    -- >   handleEventHook = focusOnMouseMove
    -- >   ..
    -- > }
    --
    -- This module is probably only useful when focusFollowsMouse is set to True(default).

    -- | Changes the focus if the mouse is moved within an unfocused window.
    focusOnMouseMove :: Event -> X All
    focusOnMouseMove (MotionEvent { ev_x = x, ev_y = y, ev_window = root }) = do
        -- check only every 15 px to avoid excessive calls to translateCoordinates
        when (x `mod` 15 == 0 || y `mod` 15 == 0) $ do
          dpy <- asks display
          Just foc <- withWindowSet $ return . W.peek
          -- get the window under the pointer:
          (_,_,_,w) <- io $ translateCoordinates dpy root root (fromIntegral x) (fromIntegral y)
          when (foc /= w) $ focus w
        return (All True)
    focusOnMouseMove _ = return (All True)

    -- | Adjusts the event mask to pick up pointer movements.
    adjustEventInput :: X ()
    adjustEventInput = withDisplay $ \dpy -> do
      rootw <- asks theRoot
      io $ selectInput dpy rootw $  substructureRedirectMask .|. substructureNotifyMask
                                    .|. enterWindowMask .|. leaveWindowMask .|. structureNotifyMask
                                    .|. buttonPressMask .|. pointerMotionMask