summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Creighton <jcreigh@gmail.com>2007-05-16 05:14:37 +0200
committerJason Creighton <jcreigh@gmail.com>2007-05-16 05:14:37 +0200
commit18d3fa1ae2c4023cbee535832c40a6cc4470d403 (patch)
treee598766453c94b3607a9d75b048d1da2a880a784
parentc819d0ecd11dac28536bb55b8e5226acff9f6757 (diff)
downloadmetatile-18d3fa1ae2c4023cbee535832c40a6cc4470d403.tar
metatile-18d3fa1ae2c4023cbee535832c40a6cc4470d403.zip
variable number of windows in master area
darcs-hash:20070516031437-b9aa7-03d82cb2565a45fa0e17a34c4c20740b51ff625c
-rw-r--r--Config.hs11
-rw-r--r--Operations.hs23
-rw-r--r--tests/Properties.hs4
3 files changed, 25 insertions, 13 deletions
diff --git a/Config.hs b/Config.hs
index 196515d..e6a9101 100644
--- a/Config.hs
+++ b/Config.hs
@@ -111,6 +111,10 @@ modMask = mod1Mask
defaultDelta :: Rational
defaultDelta = 3%100
+-- The default number of windows in the master area
+defaultWindowsInMaster :: Int
+defaultWindowsInMaster = 1
+
-- numlock handling:
--
-- The mask for the numlock key. You may need to change this on some systems.
@@ -135,7 +139,9 @@ borderWidth = 1
-- The default set of Layouts:
defaultLayouts :: [Layout]
-defaultLayouts = [ full, tall defaultDelta (1%2), wide defaultDelta (1%2) ]
+defaultLayouts = [ full,
+ tall defaultWindowsInMaster defaultDelta (1%2),
+ wide defaultWindowsInMaster defaultDelta (1%2) ]
--
-- The key bindings list.
@@ -157,6 +163,9 @@ keys = M.fromList $
, ((modMask, xK_h ), sendMessage Shrink)
, ((modMask, xK_l ), sendMessage Expand)
+ , ((modMask .|. shiftMask, xK_j ), sendMessage (IncMasterN 1))
+ , ((modMask .|. shiftMask, xK_k ), sendMessage (IncMasterN (-1)))
+
, ((modMask .|. shiftMask, xK_c ), kill)
, ((modMask .|. shiftMask, xK_q ), io $ exitWith ExitSuccess)
diff --git a/Operations.hs b/Operations.hs
index faf9aed..eb17c86 100644
--- a/Operations.hs
+++ b/Operations.hs
@@ -101,19 +101,22 @@ sendMessage a = layout $ \x@(l, ls) -> maybe x (flip (,) ls) (modifyLayout l (So
data Resize = Shrink | Expand deriving Typeable
instance Message Resize
+data IncMasterN = IncMasterN Int deriving Typeable
+instance Message IncMasterN
+
full :: Layout
full = Layout { doLayout = \sc ws -> return [ (w,sc) | w <- ws ]
, modifyLayout = const Nothing } -- no changes
-tall, wide :: Rational -> Rational -> Layout
-wide delta frac = mirrorLayout (tall delta frac)
+tall, wide :: Int -> Rational -> Rational -> Layout
+wide nmaster delta frac = mirrorLayout (tall nmaster delta frac)
-tall delta frac = Layout { doLayout = \r w -> return $ zip w $ tile frac r (length w)
- , modifyLayout = fmap handler . fromMessage }
+tall nmaster delta frac = Layout { doLayout = \r w -> return $ zip w $ tile frac r nmaster (length w)
+ , modifyLayout = \m -> fmap resize (fromMessage m) `mplus` fmap incmastern (fromMessage m) }
- where handler s = tall delta $ (case s of
- Shrink -> (-)
- Expand -> (+)) frac delta
+ where resize Shrink = tall nmaster delta (frac-delta)
+ resize Expand = tall nmaster delta (frac+delta)
+ incmastern (IncMasterN d) = tall (max 1 (nmaster+d)) delta frac
-- | Mirror a rectangle
mirrorRect :: Rectangle -> Rectangle
@@ -131,9 +134,9 @@ mirrorLayout (Layout { doLayout = dl, modifyLayout = ml }) =
-- * no windows overlap
-- * no gaps exist between windows.
--
-tile :: Rational -> Rectangle -> Int -> [Rectangle]
-tile _ d n | n < 2 = [d]
-tile f r n = r1 : splitVertically (n-1) r2
+tile :: Rational -> Rectangle -> Int -> Int -> [Rectangle]
+tile _ r nmaster n | n <= nmaster = splitVertically n r
+tile f r nmaster n = splitVertically nmaster r1 ++ splitVertically (n-nmaster) r2
where (r1,r2) = splitHorizontallyBy f r
splitVertically, splitHorizontally :: Int -> Rectangle -> [Rectangle]
diff --git a/tests/Properties.hs b/tests/Properties.hs
index d9f1fb5..01adc7d 100644
--- a/tests/Properties.hs
+++ b/tests/Properties.hs
@@ -265,10 +265,10 @@ prop_push_local (x :: T) i = not (member i x) ==> hidden x == hidden (push i x)
-- some properties for layouts:
-- 1 window should always be tiled fullscreen
-prop_tile_fullscreen rect = tile pct rect 1 == [rect]
+prop_tile_fullscreen rect = tile pct rect 1 1 == [rect]
-- multiple windows
-prop_tile_non_overlap rect windows = noOverlaps (tile pct rect windows)
+prop_tile_non_overlap rect windows nmaster = noOverlaps (tile pct rect nmaster windows)
where _ = rect :: Rectangle
pct = 3 % 100