summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Roundy <droundy@darcs.net>2007-09-20 17:52:37 +0200
committerDavid Roundy <droundy@darcs.net>2007-09-20 17:52:37 +0200
commit7fb3159ce65a49b2ec7666e663a90d1a5fc475e1 (patch)
treeb72dfa8760e5cec9ff86d96f5e15afdb2ad547fe
parent6ba134c9e54d42c189d60a924c27921739b7c197 (diff)
downloadmetatile-7fb3159ce65a49b2ec7666e663a90d1a5fc475e1.tar
metatile-7fb3159ce65a49b2ec7666e663a90d1a5fc475e1.zip
eliminate ugly OldLayout.
darcs-hash:20070920155237-72aca-af9e13a03fd7fb1e4c5b452c5d42817bd5060b0f
-rw-r--r--Config.hs6
-rw-r--r--Main.hs2
-rw-r--r--Operations.hs41
-rw-r--r--XMonad.hs10
4 files changed, 26 insertions, 33 deletions
diff --git a/Config.hs b/Config.hs
index 8c55961..d603889 100644
--- a/Config.hs
+++ b/Config.hs
@@ -94,14 +94,14 @@ borderWidth = 1
--
defaultLayouts :: [SomeLayout Window]
defaultLayouts = [ SomeLayout tiled
- , SomeLayout $ mirror tiled
- , SomeLayout full
+ , SomeLayout $ Mirror tiled
+ , SomeLayout Full
-- Extension-provided layouts
]
where
-- default tiling algorithm partitions the screen into two panes
- tiled = tall nmaster delta ratio
+ tiled = Tall nmaster delta ratio
-- The default number of windows in the master pane
nmaster = 1
diff --git a/Main.hs b/Main.hs
index 8ed3555..0435675 100644
--- a/Main.hs
+++ b/Main.hs
@@ -55,7 +55,7 @@ main = do
| otherwise = new workspaces $ zipWith SD xinesc gaps
gaps = take (length xinesc) $ defaultGaps ++ repeat (0,0,0,0)
- safeLayouts = case defaultLayouts of [] -> (SomeLayout full, []); (x:xs) -> (x,xs)
+ safeLayouts = case defaultLayouts of [] -> (SomeLayout Full, []); (x:xs) -> (x,xs)
cf = XConf
{ display = dpy
, theRoot = rootw
diff --git a/Operations.hs b/Operations.hs
index bc939ac..45a5c1d 100644
--- a/Operations.hs
+++ b/Operations.hs
@@ -138,7 +138,7 @@ windows f = do
-- just the tiled windows:
-- now tile the windows on this workspace, modified by the gap
- (rs, ml') <- runLayout l viewrect tiled `catchX` runLayout (SomeLayout full) viewrect tiled
+ (rs, ml') <- runLayout l viewrect tiled `catchX` runLayout (SomeLayout Full) viewrect tiled
mapM_ (uncurry tileWindow) rs
whenJust ml' $ \l' -> modify $ \ss ->
ss { layouts = M.adjust (first (const l')) n (layouts ss) }
@@ -351,34 +351,35 @@ instance Message IncMasterN
-- simple fullscreen mode, just render all windows fullscreen.
-- a plea for tuple sections: map . (,sc)
-full :: OldLayout a
-full = OldLayout { doLayout' = \sc (W.Stack f _ _) -> return ([(f, sc)],Nothing)
- , modifyLayout' = const (return Nothing) } -- no changes
-
+data Full a = Full
+instance Layout Full a where
+ doLayout Full sc (W.Stack f _ _) = return ([(f, sc)], Nothing)
+ modifyLayout Full _ = return Nothing -- no changes
--
-- The tiling mode of xmonad, and its operations.
--
-tall :: Int -> Rational -> Rational -> OldLayout a
-tall nmaster delta frac =
- OldLayout { doLayout' = \r -> return . (\x->(x,Nothing)) .
- ap zip (tile frac r nmaster . length) . W.integrate
- , modifyLayout' = \m -> return $ msum [fmap resize (fromMessage m)
- ,fmap incmastern (fromMessage m)] }
-
- where resize Shrink = tall nmaster delta (max 0 $ frac-delta)
- resize Expand = tall nmaster delta (min 1 $ frac+delta)
- incmastern (IncMasterN d) = tall (max 0 (nmaster+d)) delta frac
+data Tall a = Tall Int Rational Rational
+instance Layout Tall a where
+ doLayout (Tall nmaster _ frac) r =
+ return . (\x->(x,Nothing)) .
+ ap zip (tile frac r nmaster . length) . W.integrate
+ modifyLayout (Tall nmaster delta frac) m =
+ return $ msum [fmap resize (fromMessage m)
+ ,fmap incmastern (fromMessage m)]
+ where resize Shrink = Tall nmaster delta (max 0 $ frac-delta)
+ resize Expand = Tall nmaster delta (min 1 $ frac+delta)
+ incmastern (IncMasterN d) = Tall (max 0 (nmaster+d)) delta frac
-- | Mirror a rectangle
mirrorRect :: Rectangle -> Rectangle
mirrorRect (Rectangle rx ry rw rh) = (Rectangle ry rx rh rw)
-- | Mirror a layout, compute its 90 degree rotated form.
-mirror :: Layout l a => l a -> OldLayout a
-mirror l =
- OldLayout { doLayout' = \sc w -> do (wrs, ml') <- doLayout l (mirrorRect sc) w
- return (map (second mirrorRect) wrs, mirror `fmap` ml')
- , modifyLayout' = fmap (fmap mirror) . modifyLayout l }
+data Mirror a = forall l. Layout l a => Mirror (l a)
+instance Layout Mirror a where
+ doLayout (Mirror l) r s = do (wrs, ml') <- doLayout l (mirrorRect r) s
+ return (map (second mirrorRect) wrs, Mirror `fmap` ml')
+ modifyLayout (Mirror l) = fmap (fmap Mirror) . modifyLayout l
-- | tile. Compute the positions for windows using the default 2 pane tiling algorithm.
--
diff --git a/XMonad.hs b/XMonad.hs
index 97f4ee1..f46af7a 100644
--- a/XMonad.hs
+++ b/XMonad.hs
@@ -15,7 +15,7 @@
-----------------------------------------------------------------------------
module XMonad (
- X, WindowSet, WorkspaceId, ScreenId(..), ScreenDetail(..), XState(..), XConf(..), Layout(..), OldLayout(..), SomeLayout(..),
+ X, WindowSet, WorkspaceId, ScreenId(..), ScreenDetail(..), XState(..), XConf(..), Layout(..), SomeLayout(..),
Typeable, Message, SomeMessage(..), fromMessage, runLayout,
runX, catchX, io, catchIO, withDisplay, withWindowSet, isRoot, getAtom, spawn, restart, trace, whenJust, whenX,
atom_WM_STATE, atom_WM_PROTOCOLS, atom_WM_DELETE_WINDOW
@@ -131,20 +131,12 @@ atom_WM_STATE = getAtom "WM_STATE"
-- that message and the screen is not refreshed. Otherwise, 'modifyLayout'
-- returns an updated 'Layout' and the screen is refreshed.
--
-data OldLayout a =
- OldLayout { doLayout' :: Rectangle -> Stack a -> X ([(a, Rectangle)], Maybe (OldLayout a))
- , modifyLayout' :: SomeMessage -> X (Maybe (OldLayout a)) }
-
data SomeLayout a = forall l. Layout l a => SomeLayout (l a)
class Layout layout a where
doLayout :: layout a -> Rectangle -> Stack a -> X ([(a, Rectangle)], Maybe (layout a))
modifyLayout :: layout a -> SomeMessage -> X (Maybe (layout a))
-instance Layout OldLayout a where
- doLayout = doLayout'
- modifyLayout = modifyLayout'
-
instance Layout SomeLayout a where
doLayout (SomeLayout l) r s = do (ars, ml') <- doLayout l r s
return (ars, SomeLayout `fmap` ml' )