module XMonad.Layout.Minimize (
minimize,
MinimizeMsg(..)
) where
import XMonad
import qualified XMonad.StackSet as W
import XMonad.Layout.LayoutModifier
import XMonad.Layout.BoringWindows as BW
import Data.List
data Minimize a = Minimize [Window] deriving ( Read, Show )
minimize :: LayoutClass l Window => l Window -> ModifiedLayout Minimize l Window
minimize = ModifiedLayout $ Minimize []
data MinimizeMsg = MinimizeWin Window
| RestoreMinimizedWin Window
| RestoreNextMinimizedWin
deriving (Typeable, Eq)
instance Message MinimizeMsg
instance LayoutModifier Minimize Window where
modifierDescription (Minimize _) = "Minimize"
modifyLayout (Minimize minimized) wksp rect = do
let stack = W.stack wksp
filtStack = stack >>=W.filter (\w -> not (w `elem` minimized))
runLayout (wksp {W.stack = filtStack}) rect
handleMess (Minimize minimized) m = case fromMessage m of
Just (MinimizeWin w)
| not (w `elem` minimized) -> do
BW.focusDown
return $ Just $ Minimize (w:minimized)
| otherwise -> return Nothing
Just (RestoreMinimizedWin w) ->
return $ Just $ Minimize (minimized \\ [w])
Just (RestoreNextMinimizedWin)
| not (null minimized) -> do
focus (head minimized)
return $ Just $ Minimize (tail minimized)
| otherwise -> return Nothing
_ -> return Nothing