From 9f2a16d8682c2842b59ffdf3c9e182ec044f54de Mon Sep 17 00:00:00 2001 From: Jason Creighton Date: Wed, 16 May 2007 05:14:37 +0200 Subject: variable number of windows in master area darcs-hash:20070516031437-b9aa7-03d82cb2565a45fa0e17a34c4c20740b51ff625c.gz --- Config.hs | 11 ++++++++++- Operations.hs | 23 +++++++++++++---------- tests/Properties.hs | 4 ++-- 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 -- cgit v1.2.3