-----------------------------------------------------------------------------
-- |
-- Module : XMonadContrib.LayoutChoice
-- Copyright : (c) David Roundy
-- License : BSD-style (see xmonad/LICENSE)
--
-- Maintainer : email@address.com
-- Stability : unstable
-- Portability : unportable
--
-- A tabbed layout for the Xmonad Window Manager
--
-----------------------------------------------------------------------------
module XMonadContrib.LayoutChoice (
-- * Usage:
-- $usage
layoutChoice
, ChangeLayout(..)
) where
import Data.List ( partition )
import Data.Maybe ( fromMaybe )
import XMonad
import Operations ( tall, UnDoLayout(..) )
-- $usage
-- You can use this module to replace the default layout handling of
-- xmonad. See the docstring docs for example usage.
-- %import XMonadContrib.LayoutChoice
-- %layout , layoutChoice [("full", full),
-- %layout ("tall", tall 1 0.03 0.5)]
-- %keybind , ((modMask, xK_space), sendMessage NextLayout)
-- %keybind , ((modMask .|. shiftMask, xK_space), sendMessage PrevLayout)
-- %keybind , ((modMask, xK_f), sendMessage (JumpToLayout "full"))
data ChangeLayout = NextLayout | PrevLayout | JumpToLayout String
deriving ( Eq, Show, Typeable )
instance Message ChangeLayout
layoutChoice :: [(String, Layout a)] -> Layout a
layoutChoice [] = tall 1 0.03 0.5
layoutChoice ((n,l):ls) = Layout { doLayout = dolay
, modifyLayout = md }
where dolay r s = do (x,ml') <- doLayout l r s
return (x, (\l' -> layoutChoice ((n,l'):ls)) `fmap` ml')
md m | Just NextLayout <- fromMessage m = switchl rls
| Just PrevLayout <- fromMessage m = switchl rls'
| Just (JumpToLayout x) <- fromMessage m = switchl (j x)
| otherwise = do ml' <- modifyLayout l m
return $ (\l' -> layoutChoice ((n,l'):ls)) `fmap` ml'
rls (x:xs) = xs ++ [x]
rls [] = []
rls' = reverse . rls . reverse
j s zs = case partition (\z -> s == fst z) zs of
(xs,ys) -> xs++ys
switchl f = do ml' <- modifyLayout l (SomeMessage UnDoLayout)
return $ Just (layoutChoice $ f $ (n,fromMaybe l ml'):ls)