content: -----------------------------------------------------------------------------
  -- |
  -- Module      :  XMonad.Prompt.Layout
  -- Copyright   :  (C) 2007 Andrea Rossato, David Roundy
  -- License     :  BSD3
  --
  -- Maintainer  :
  -- Stability   :  unstable
  -- Portability :  unportable
  --
  -- A layout-selection prompt for XMonad
  --
  -----------------------------------------------------------------------------
  
  module XMonad.Prompt.Layout (
                               -- * Usage
                               -- $usage
                               layoutPrompt
                              ) where
  
  import Data.List ( sort, nub )
  import XMonad hiding ( workspaces )
  import XMonad.Prompt
  import XMonad.Prompt.Workspace ( Wor(..) )
  import XMonad.StackSet ( workspaces, layout )
  import XMonad.Layout.LayoutCombinators ( JumpToLayout(..) )
  
  -- $usage
  -- You can use this module with the following in your @~\/.xmonad\/xmonad.hs@:
  --
  -- > import XMonad.Prompt
  -- > import XMonad.Prompt.Layout
  --
  -- >   , ((modm .|. shiftMask, xK_m     ), layoutPrompt def)
  --
  -- For detailed instruction on editing the key binding see
  -- "XMonad.Doc.Extending#Editing_key_bindings".
  --
  -- WARNING: This prompt won't display all possible layouts, because the
  -- code to enable this was rejected from xmonad core.  It only displays
  -- layouts that are actually in use.  Also, you can only select layouts if
  -- you are using NewSelect, rather than the Select defined in xmonad core
  -- (which doesn't have this feature).  So all in all, this module is really
  -- more a proof-of-principle than something you can actually use
  -- productively.
  
  layoutPrompt :: XPConfig -> X ()
  layoutPrompt c = do ls <- gets (map (description . layout) . workspaces . windowset)
                      mkXPrompt (Wor "") c (mkComplFunFromList' $ sort $ nub ls) (sendMessage . JumpToLayout)
  