xmonad-contrib/SimpleStacking.hs
David Roundy 10f20c432e add SimpleStacking module to make Combo and Tabbed work together.
WARNING! This change will break existing Tabbed configurations.  The
problem is that there is no way within a Layout's "doLayout" to safely
modify the layout itself.  This makes LayoutHooks fragile, and more to the
point, makes SimpleStacking fragile, so we can't safely define a

tabbed' = simpleStacking . tabbed

A workaround would have been to duplicate the tabbed code, but I'd rather
leave the ugliness and get this fixed.
2007-06-21 15:15:24 +00:00

51 lines
2.0 KiB
Haskell

{-# OPTIONS -fglasgow-exts #-}
-----------------------------------------------------------------------------
-- |
-- Module : XMonadContrib.SimpleStacking
-- Copyright : (c) David Roundy <droundy@darcs.net>
-- License : BSD-style (see LICENSE)
--
-- Maintainer : David Roundy <droundy@darcs.net>
-- Stability : unstable
-- Portability : unportable
--
-- A module to be used to obtain a simple "memory" of stacking order.
--
-----------------------------------------------------------------------------
module XMonadContrib.SimpleStacking (
-- * Usage
-- $usage
simpleStacking
) where
import Control.Monad.State ( modify )
import qualified Data.Map as M
import Data.Maybe ( catMaybes )
import Data.List ( nub, lookup )
import StackSet ( focus, tag, workspace, current, integrate )
import Graphics.X11.Xlib ( Window )
import XMonad
-- $usage
-- You can use this module for
-- See, for instance, "XMonadContrib.Tabbed"
simpleStacking :: Layout Window -> Layout Window
simpleStacking = simpleStacking' []
simpleStacking' :: [Window] -> Layout Window -> Layout Window
simpleStacking' st l = l { doLayout = dl
, modifyLayout = \m -> fmap (simpleStacking' st) `fmap` modifyLayout l m }
where dl r s = do modify $ \ state ->
state { layouts = M.adjust
(\(_,ss)->(simpleStacking'
(focus s:filter (`elem` integrate s) st) l,ss))
(tag.workspace.current.windowset $ state)
(layouts state) }
lo <- doLayout l r s
let m = map (\ (w,rr) -> (w,(w,rr))) lo
return $ catMaybes $ map ((flip lookup) m) $ nub (focus s : st ++ map fst lo)