aboutsummaryrefslogblamecommitdiffstats
path: root/LayoutChoice.hs
blob: 1127f667ab805db9c1da1d2251af58c7a01dc3dc (plain) (tree)




























































                                                                                     
-----------------------------------------------------------------------------
-- |
-- 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)