1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
-----------------------------------------------------------------------------
-- |
-- Module : XMonad.Layout.IfMax
-- Copyright : (c) 2013 Ilya Portnov
-- License : BSD3-style (see LICENSE)
--
-- Maintainer : Ilya Portnov <portnov84@rambler.ru>
-- Stability : unstable
-- Portability : unportable
--
-- Provides IfMax layout, which will run one layout if there are maximum N
-- windows on workspace, and another layout, when number of windows is greater
-- than N.
--
-----------------------------------------------------------------------------
{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}
module XMonad.Layout.IfMax
( -- * Usage
-- $usage
IfMax (..)
, ifMax
) where
import Data.Maybe
import XMonad
import qualified XMonad.StackSet as W
-- $usage
-- IfMax layout will run one layout if number of windows on workspace is as
-- maximum N, and else will run another layout.
--
-- You can use this module by adding folowing in your @xmonad.hs@:
--
-- > import XMonad.Layout.IfMax
--
-- Then add layouts to your layoutHook:
--
-- > myLayoutHook = IfMax 2 Full (Tall ...) ||| ...
--
-- In this example, if there are 1 or 2 windows, Full layout will be used;
-- otherwise, Tall layout will be used.
--
data IfMax l1 l2 w = IfMax Int (l1 w) (l2 w)
deriving (Read, Show)
instance (LayoutClass l1 a, LayoutClass l2 a) => LayoutClass (IfMax l1 l2) a where
runLayout (W.Workspace _ (IfMax n l1 l2) s) rect = arrange (W.integrate' s)
where
arrange [] = do l1' <- maybe l1 id `fmap` handleMessage l1 (SomeMessage ReleaseResources)
l2' <- maybe l2 id `fmap` handleMessage l2 (SomeMessage ReleaseResources)
return ([], Just $ IfMax n l1' l2')
arrange ws | length ws <= n = do
(wrs, ml1') <- runLayout (W.Workspace "" l1 s) rect
let l1' = fromMaybe l1 ml1'
return (wrs, Just $ IfMax n l1' l2)
| otherwise = do
(wrs, ml2') <- runLayout (W.Workspace "" l2 s) rect
let l2' = fromMaybe l2 ml2'
return (wrs, Just $ IfMax n l1 l2')
description (IfMax n l1 l2) = "If number of windows is <= " ++ show n ++ ", then " ++
description l1 ++ ", else " ++ description l2
-- | Layout itself
ifMax :: (LayoutClass l1 w, LayoutClass l2 w)
=> Int -- ^ Maximum number of windows for the first layout
-> l1 w -- ^ First layout
-> l2 w -- ^ Second layout
-> IfMax l1 l2 w
ifMax n l1 l2 = IfMax n l1 l2
|