content: {-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}
  ----------------------------------------------------------------------------
  -- |
  -- Module      :  XMonad.Layout.ButtonDecoration
  -- Copyright   :  (c) Jan Vornberger 2009
  -- License     :  BSD3-style (see LICENSE)
  --
  -- Maintainer  :  jan.vornberger@informatik.uni-oldenburg.de
  -- Stability   :  unstable
  -- Portability :  not portable
  --
  -- A decoration that includes small buttons on both ends which invoke
  -- various actions when clicked on: Show a window menu (see
  -- "XMonad.Actions.WindowMenu"), minimize, maximize or close the window.
  --
  -- Note: For maximizing and minimizing to actually work, you will need
  -- to integrate "XMonad.Layout.Maximize" and "XMonad.Layout.Minimize" into your
  -- setup.  See the documentation of those modules for more information.
  --
  -----------------------------------------------------------------------------
  
  module XMonad.Layout.ButtonDecoration
      ( -- * Usage:
        -- $usage
        buttonDeco,
        ButtonDecoration,
      ) where
  
  import XMonad
  import XMonad.Layout.Decoration
  import XMonad.Layout.DecorationAddons
  
  -- $usage
  -- You can use this module with the following in your
  -- @~\/.xmonad\/xmonad.hs@:
  --
  -- > import XMonad.Layout.DecorationAddons
  -- > import XMonad.Layout.ButtonDecoration
  --
  -- Then edit your @layoutHook@ by adding the ButtonDecoration to
  -- your layout:
  --
  -- > myL = buttonDeco shrinkText defaultThemeWithButtons (layoutHook def)
  -- > main = xmonad def { layoutHook = myL }
  --
  
  buttonDeco :: (Eq a, Shrinker s) => s -> Theme
             -> l a -> ModifiedLayout (Decoration ButtonDecoration s) l a
  buttonDeco s c = decoration s c $ NFD True
  
  data ButtonDecoration a = NFD Bool deriving (Show, Read)
  
  instance Eq a => DecorationStyle ButtonDecoration a where
      describeDeco _ = "ButtonDeco"
      decorationCatchClicksHook _ mainw dFL dFR = titleBarButtonHandler mainw dFL dFR
      decorationAfterDraggingHook _ (mainw, _) decoWin = focus mainw >> handleScreenCrossing mainw decoWin >> return ()
  