
New patches:

[change MultiToggle interface; add docs
Lukas Mai <l.mai@web.de>**20071106141729] 
<
> {
hunk ./XMonad/Layout/MultiToggle.hs 12
 -- Maintainer  :  <l.mai@web.de>
 -- Stability   :  unstable
 -- Portability :  unportable
+--
+-- Dynamically apply and unapply transformers to your window layout. This can
+-- be used to rotate your window layout by 90 degrees, or to make the
+-- currently focused window occupy the whole screen (\"zoom in\") then undo
+-- the transformation (\"zoom out\").
 
 
 module XMonad.Layout.MultiToggle (
hunk ./XMonad/Layout/MultiToggle.hs 20
-    EL(..),
-    unEL,
-    LayoutTransformer(..),
+    -- * Usage
+    -- $usage
+    Transformer(..),
     Toggle(..),
hunk ./XMonad/Layout/MultiToggle.hs 24
-    (.*.),
-    HNil(..),
+    (??),
+    EOT(..),
     mkToggle
 ) where
 
hunk ./XMonad/Layout/MultiToggle.hs 29
-
 import XMonad
 
 import Control.Arrow
hunk ./XMonad/Layout/MultiToggle.hs 35
 import Data.Typeable
 import Data.Maybe
 
+-- $usage
+-- The basic idea is to have a base layout and a set of layout transformers,
+-- of which at most one is active at any time. Enabling another transformer
+-- first disables any currently active transformer; i.e. it works like a
+-- group of radio buttons.
+--
+-- A side effect of this meta-layout is that layout transformers no longer
+-- receive any messages; any message not handled by SwitchTrans itself will
+-- undo the current layout transformer, pass the message on to the base
+-- layout, then reapply the transformer.
+--
+-- To use this module, you first have to define the transformers that you
+-- want to be handled by @MultiToggle@. For example, if the transformer is
+-- 'XMonad.Layouts.Mirror':
+--
+-- > data MIRROR = MIRROR deriving (Read, Show, Eq, Typeable)
+-- > instance Transformer MIRROR Window where
+-- >     transform _ x k = k (Mirror x)
+--
+-- @MIRROR@ can be any identifier (it has to start with an uppercase letter,
+-- of course); I've chosen an all-uppercase version of the transforming
+-- function's name here. You need to put @{-\# OPTIONS_GHC -fglasgow-exts \#-}@
+-- at the beginning of your file to be able to derive "Data.Typeable".
+--
+-- Somewhere else in your file you probably have a definition of @layout@;
+-- the default looks like this:
+--
+-- > layout = tiled ||| Mirror tiled ||| Full
+--
+-- After changing this to
+--
+-- > layout = mkToggle (MIRROR ?? EOT) (tiled ||| Full)
+--
+-- you can now dynamically apply the 'XMonad.Layouts.Mirror' transformation:
+--
+-- > ...
+-- >   , ((modMask,               xK_x     ), sendMessage $ Toggle MIRROR)
+-- > ...
+--
+-- (That should be part of your key bindings.) When you press @mod-x@, the
+-- active layout is mirrored. Another @mod-x@ and it's back to normal.
+--
+-- It's also possible to stack @MultiToggle@s. Let's define a few more
+-- transformers ('XMonad.Layout.NoBorders.noBorders' is in
+-- "XMonad.Layout.NoBorders"):
+--
+-- > data NOBORDERS = NOBORDERS deriving (Read, Show, Eq, Typeable)
+-- > instance Transformer NOBORDERS Window where
+-- >     transform _ x k = k (noBorders x)
+-- > 
+-- > data FULL = FULL deriving (Read, Show, Eq, Typeable)
+-- > instance Transformer FULL Window where
+-- >     transform _ x k = k Full
+--
+-- @
+-- layout = id
+--     . 'XMonad.Layout.NoBorders.smartBorders'
+--     . mkToggle (NOBORDERS ?? FULL ?? EOT)
+--     . mkToggle (MIRROR ?? EOT)
+--     $ tiled ||| 'XMonad.Layout.Grid.Grid' ||| 'XMonad.Layout.Circle.Circle'
+-- @
+--
+-- By binding a key to @(sendMessage $ Toggle FULL)@ you can temporarily
+-- maximize windows, in addition to being able to rotate layouts and remove
+-- window borders.
+
+-- | A class to identify custom transformers (and look up transforming
+-- functions by type).
+class (Eq t, Typeable t) => Transformer t a | t -> a where
+    transform :: (LayoutClass l a) => t -> l a -> (forall l'. (LayoutClass l' a) => l' a -> b) -> b
+
 data EL a = forall l. (LayoutClass l a) => EL (l a)
 
 unEL :: EL a -> (forall l. (LayoutClass l a) => l a -> b) -> b
hunk ./XMonad/Layout/MultiToggle.hs 111
 unEL (EL x) k = k x
 
-class (Eq t, Typeable t) => LayoutTransformer t a | t -> a where
-    transform :: t -> EL a -> EL a
+transform' :: (Transformer t a) => t -> EL a -> EL a
+transform' t el = el `unEL` \l -> transform t l EL
 
hunk ./XMonad/Layout/MultiToggle.hs 114
-data Toggle a = forall t. (LayoutTransformer t a) => Toggle t
+-- | Toggle the specified layout transformer.
+data Toggle a = forall t. (Transformer t a) => Toggle t
     deriving (Typeable)
 
 instance (Typeable a) => Message (Toggle a)
hunk ./XMonad/Layout/MultiToggle.hs 135
 expand (MultiToggleS b i ts) =
     resolve ts (fromMaybe (-1) i) id
         (\x mt ->
-            let g = transform x in
+            let g = transform' x in
             mt{
                 currLayout = g . EL $ baseLayout mt,
                 currTrans = g
hunk ./XMonad/Layout/MultiToggle.hs 152
 instance (Show ts, Show (l a)) => Show (MultiToggle ts l a) where
     showsPrec p = showsPrec p . collapse
 
+-- | Construct a @MultiToggle@ layout from a transformer table and a base
+-- layout.
 mkToggle :: (LayoutClass l a) => ts -> l a -> MultiToggle ts l a
 mkToggle ts l = MultiToggle l (EL l) Nothing id ts
 
hunk ./XMonad/Layout/MultiToggle.hs 157
-data HNil = HNil deriving (Read, Show)
+-- | Marks the end of a transformer list.
+data EOT = EOT deriving (Read, Show)
 data HCons a b = HCons a b deriving (Read, Show)
 
hunk ./XMonad/Layout/MultiToggle.hs 161
-infixr 0 .*.
-(.*.) :: (HList b w) => a -> b -> HCons a b
-(.*.) = HCons
+infixr 0 ??
+-- | Prepend an element to a heterogenuous list. Used to build transformer
+-- tables for 'mkToggle'.
+(??) :: (HList b w) => a -> b -> HCons a b
+(??) = HCons
 
 class HList c a where
hunk ./XMonad/Layout/MultiToggle.hs 168
-    find :: (LayoutTransformer t a) => c -> t -> Maybe Int
-    resolve :: c -> Int -> b -> (forall t. (LayoutTransformer t a) => t -> b) -> b
+    find :: (Transformer t a) => c -> t -> Maybe Int
+    resolve :: c -> Int -> b -> (forall t. (Transformer t a) => t -> b) -> b
 
hunk ./XMonad/Layout/MultiToggle.hs 171
-instance HList HNil w where
-    find HNil _ = Nothing
-    resolve HNil _ d _ = d
+instance HList EOT w where
+    find EOT _ = Nothing
+    resolve EOT _ d _ = d
 
hunk ./XMonad/Layout/MultiToggle.hs 175
-instance (LayoutTransformer a w, HList b w) => HList (HCons a b) w where
+instance (Transformer a w, HList b w) => HList (HCons a b) w where
     find (HCons x xs) t
         | t `geq` x = Just 0
         | otherwise = fmap succ (find xs t)
hunk ./XMonad/Layout/MultiToggle.hs 213
                         }
                 else do
                     handleMessage l (SomeMessage ReleaseResources)
-                    let f = transform t
+                    let f = transform' t
                     return . Just $
                         mt{
                             currLayout = f . EL $ baseLayout mt,
}
[make Setup haddock work again
Lukas Mai <l.mai@web.de>**20071106141829] 
<
> {
hunk ./XMonad/Layout/ToggleLayouts.hs 35
 -- > layoutHook = Layout $ toggleLayouts (noBorders Full) $ Select layouts
 --
 -- and a key binding like
+--
 -- >    , ((modMask .|. controlMask, xK_space), sendMessage ToggleLayout)
 --
 -- or a key binding like
hunk ./XMonad/Layout/ToggleLayouts.hs 39
+--
 -- >    , ((modMask .|. controlMask, xK_space), sendMessage (Toggle "Full"))
 
 data ToggleLayouts lt lf a = ToggleLayouts Bool (lt a) (lf a) deriving (Read,Show)
hunk ./XMonad/Util/Dzen.hs 32
 
 -- | @dzen str timeout@ pipes @str@ to dzen2 for @timeout@ microseconds.
 -- Example usage:
+--
 -- > dzen "Hi, mom!" (5 `seconds`)
 dzen :: String -> Int -> X ()
 dzen str timeout = dzenWithArgs str [] timeout
hunk ./XMonad/Util/Dzen.hs 39
 
 -- | @dzen str args timeout@ pipes @str@ to dzen2 for @timeout@ seconds, passing @args@ to dzen.
 -- Example usage:
+--
 -- > dzenWithArgs "Hi, dons!" ["-ta", "r"] (5 `seconds`)
 dzenWithArgs :: String -> [String] -> Int -> X ()
 dzenWithArgs str args timeout = io $ runProcessWithInputAndWait "dzen2" args (unchomp str) timeout
hunk ./XMonad/Util/Dzen.hs 57
 
 -- | Flashes when a window requests your attention and you can't see it. For use with
 -- XMonadContrib.UrgencyHook. Usage:
+--
 -- > urgencyHook = dzenUrgencyHook (5 `seconds`)
 dzenUrgencyHook :: Int -> Window -> X ()
 dzenUrgencyHook = dzenUrgencyHookWithArgs []
hunk ./XMonad/Util/Dzen.hs 64
 
 -- | Flashes when a window requests your attention and you can't see it. For use with
 -- XMonadContrib.UrgencyHook. Usage:
+--
 -- > urgencyHook = dzenUrgencyHookWithArgs ["-bg", "darkgreen"] (5 `seconds`)
 dzenUrgencyHookWithArgs :: [String] -> Int -> Window -> X ()
 dzenUrgencyHookWithArgs args duration w = do
hunk ./XMonad/Util/Run.hs 13
 --
 -- This modules provides several commands to run an external process.
 -- It is composed of functions formerly defined in XMonad.Util.Dmenu (by
--- Spenver Jannsen), XMonad.Util.Dzen (by glasser@mit.edu) and
+-- Spenver Jannsen), XMonad.Util.Dzen (by glasser\@mit.edu) and
 -- XMonad.Util.RunInXTerm (by Andrea Rossato).
 --
 -----------------------------------------------------------------------------
hunk ./XMonad/Util/Run.hs 84
 
 {- | Multiplies by ONE MILLION, for use with runProcessWithInputAndWait.
      Use like:
+
      > (5.5 `seconds`)
 -}
 seconds :: Rational -> Int
hunk ./XMonad/Util/Run.hs 97
    as to bypass the shell and be certain the program will receive the string as you typed it.
    unsafeSpawn is an alias for XMonad's 'spawn', to remind one that use of it can be, well, unsafe.
    Examples:
+
    >     , ((modMask,               xK_Print ), unsafeSpawn "import -window root png:$HOME/xwd-$(date +%s)$$.png")
    >     , ((modMask,               xK_d     ), safeSpawn "firefox" "")
 
hunk ./XMonad/Util/XSelection.hs 26
                                  safePromptSelection,
                                  putSelection) where
 
-import Graphics.X11.Xlib.Extras (Graphics.X11.Xlib.Extras.Event(ev_event_display,
+import Graphics.X11.Xlib.Extras (Event(ev_event_display,
 							       ev_time, ev_property, ev_target, ev_selection,
 							       ev_requestor, ev_event_type),
 				xConvertSelection, xGetSelectionOwner, xSetSelectionOwner, getEvent,
hunk ./XMonad/Util/XSelection.hs 40
 import Control.Monad(Monad (return, (>>)), Functor(..), liftM, join)
 import Data.Char (chr, ord)
 import Data.Maybe (fromMaybe)
-import Foreign(Word8, Data.Bits.Bits (shiftL, (.&.), (.|.)))
+import Foreign (Word8)
+import Data.Bits (shiftL, (.&.), (.|.))
 import XMonad.Util.Run (safeSpawn, unsafeSpawn)
 import XMonad (X, io)
 
}

Context:

[Remove SwitchTrans
Spencer Janssen <sjanssen@cse.unl.edu>**20071106065933] 
[Remove MetaModule
Spencer Janssen <sjanssen@cse.unl.edu>**20071106023713] 
[Expose LayoutCombinators
Spencer Janssen <sjanssen@cse.unl.edu>**20071106021611] 
[Add LANGUAGE pragmas for ManageDocks
Spencer Janssen <sjanssen@cse.unl.edu>**20071106021507] 
[Combo builds now
Spencer Janssen <sjanssen@cse.unl.edu>**20071106021341] 
[Make Combo build on GHC 6.8
Spencer Janssen <sjanssen@cse.unl.edu>**20071106021126] 
[Stupid mistake
Spencer Janssen <sjanssen@cse.unl.edu>**20071105101052] 
[-Werror
Spencer Janssen <sjanssen@cse.unl.edu>**20071105060223] 
[add serializable SwitchTrans (a.k.a. MultiToggle)
Lukas Mai <l.mai@web.de>**20071106005819] 
[make TilePrime compile again
l.mai@web.de**20071105233218] 
[add LayoutHints to MetaModule
l.mai@web.de**20071105233143] 
[make LayoutHints compile again
l.mai@web.de**20071105233020] 
[fix Config.Droundy to compile again.
David Roundy <droundy@darcs.net>**20071105205339] 
[-Wall police
Spencer Janssen <sjanssen@cse.unl.edu>**20071105060036] 
[Minor updates to Sjanssen.hs
Spencer Janssen <sjanssen@cse.unl.edu>**20071105055022] 
[Use configurations
Spencer Janssen <sjanssen@cse.unl.edu>**20071105034109] 
[-Wall is on
Don Stewart <dons@galois.com>**20071105031815] 
[Revert ghc-options changes
Spencer Janssen <sjanssen@cse.unl.edu>**20071105030327] 
[forgot to add my config file
Don Stewart <dons@galois.com>**20071105025856] 
[build with optimisations on as usual, fix a few compile errors
Don Stewart <dons@galois.com>**20071105024858] 
[Add XMonad.Config.Sjanssen
Spencer Janssen <sjanssen@cse.unl.edu>**20071105005832] 
[Move configs/droundy.hs to an actual library module
Spencer Janssen <sjanssen@cse.unl.edu>**20071104202957] 
[fix warnings in Combo.
David Roundy <droundy@darcs.net>**20071101214504] 
[Hierarchify
Spencer Janssen <sjanssen@cse.unl.edu>**20071101201059] 
[Improve test hook.
Spencer Janssen <sjanssen@cse.unl.edu>**20071104202919
 --disable-optimizations makes testing much faster.
 --user allows Cabal to satisfy dependencies from the user package database.
] 
[make WorkspaceDir always store absolute pathnames.
David Roundy <droundy@darcs.net>**20071101214401] 
[add new off-center layout combinators.
David Roundy <droundy@darcs.net>**20071101214216] 
[add configs demo directory
David Roundy <droundy@darcs.net>**20071101203720] 
[Add Cabal stuff
Spencer Janssen <sjanssen@cse.unl.edu>**20071101202041] 
[make Hierarchical LayoutCombinators.
David Roundy <droundy@darcs.net>**20071101185418] 
[fix selectWorkspace to work with new config.
David Roundy <droundy@darcs.net>**20071101183546] 
[Use hierarchical module names from the core
Spencer Janssen <sjanssen@cse.unl.edu>**20071101182824] 
[code to define a strut-avoiding layout.
David Roundy <droundy@darcs.net>**20071023220025] 
[reenable JumpToLayout in NewSelect.
David Roundy <droundy@darcs.net>**20071101181128] 
[-Wall police in Run.
David Roundy <droundy@darcs.net>**20071101152028] 
[port Combo (dropping combo).
David Roundy <droundy@darcs.net>**20071101152915] 
[Port ToggleLayouts
Spencer Janssen <sjanssen@cse.unl.edu>**20071101091853] 
[Port WorkspacePrompt
Spencer Janssen <sjanssen@cse.unl.edu>**20071101090425] 
[Port Accordion
Spencer Janssen <sjanssen@cse.unl.edu>**20071101090341] 
[Port Dishes
Spencer Janssen <sjanssen@cse.unl.edu>**20071101090312] 
[Dishes: tabs
Spencer Janssen <sjanssen@cse.unl.edu>**20071101090237] 
[Port DragPane
Spencer Janssen <sjanssen@cse.unl.edu>**20071101085733] 
[Port MosaicAlt
Spencer Janssen <sjanssen@cse.unl.edu>**20071101085524] 
[Port ResizableTile
Spencer Janssen <sjanssen@cse.unl.edu>**20071101085500] 
[Port Roledex
Spencer Janssen <sjanssen@cse.unl.edu>**20071101085430] 
[Port Spiral
Spencer Janssen <sjanssen@cse.unl.edu>**20071101085402] 
[Port TagWindows
Spencer Janssen <sjanssen@cse.unl.edu>**20071101085335] 
[Port ThreeColumns
Spencer Janssen <sjanssen@cse.unl.edu>**20071101085229] 
[Port TwoPane
Spencer Janssen <sjanssen@cse.unl.edu>**20071101085151] 
[Port XMonadPrompt
Spencer Janssen <sjanssen@cse.unl.edu>**20071101085037] 
[XMonadPrompt: tabs
Spencer Janssen <sjanssen@cse.unl.edu>**20071101084939] 
[Port WindowNavigation
Spencer Janssen <sjanssen@cse.unl.edu>**20071101084852] 
[Port Submap
Spencer Janssen <sjanssen@cse.unl.edu>**20071101084744] 
[Port CycleWS
Spencer Janssen <sjanssen@cse.unl.edu>**20071101084431] 
[NO TABS
Spencer Janssen <sjanssen@cse.unl.edu>**20071101083954] 
[Port Commands
Spencer Janssen <sjanssen@cse.unl.edu>**20071101083236] 
[XPrompt: don't import XMonad.config
Spencer Janssen <sjanssen@cse.unl.edu>**20071101074149] 
[More porting
Spencer Janssen <sjanssen@cse.unl.edu>**20071101073506] 
[Port DynamicLog
Spencer Janssen <sjanssen@cse.unl.edu>**20071101072606] 
[Port NoBorders
Spencer Janssen <sjanssen@cse.unl.edu>**20071101070859] 
[LayoutModifier: LayoutMessages have moved
Spencer Janssen <sjanssen@cse.unl.edu>**20071101070724] 
[Remove Config import from Run
Spencer Janssen <sjanssen@cse.unl.edu>**20071101070408] 
[Remove 'descriptions' stuff from NewSelect.  I think we can do this without make LayoutClass larger
Spencer Janssen <sjanssen@cse.unl.edu>**20071101033844] 
[add NewSelect layout combinator.
David Roundy <droundy@darcs.net>**20071024152648
 This patch adds a selection layout combinator ||| which
 replaces Select, and makes the Layout data type unnecessary.
 This combinator isn't yet feature-complete, as I didn't implement
 backwards rotation (PrevLayout), but that's obviously doable.  This
 patch requires the descriptions function be added to LayoutClass in
 core.
] 
[ManPrompt.hs: auto-complete explicit paths (those with `/')
"Valery V. Vorotyntsev" <valery.vv@gmail.com>**20071104202056
 Bash's compgen is used for this (like in ShellPrompt.hs).
 
 Enable all GHC warnings.
 
 Improve documentation (slightly).
] 
[clean up destroyed windows from urgents list
Devin Mullins <me@twifkak.com>**20071103150358] 
[add focusUrgent action, for those too lazy to read
Devin Mullins <me@twifkak.com>**20071103055458] 
[changed urgent state from Set to list
Devin Mullins <me@twifkak.com>**20071103055143] 
[fix examples
Devin Mullins <me@twifkak.com>**20071103022011] 
[add haddock for top-level Dzen bindings
Devin Mullins <me@twifkak.com>**20071103021705] 
[expose dzenWithArgs, dzenUrgencyHookWithArgs (for colors!)
Devin Mullins <me@twifkak.com>**20071030072455] 
[use a global IORef to keep list of urgent windows
Devin Mullins <me@twifkak.com>**20071027064810] 
[fix parse error in pattern match
Brent Yorgey <byorgey@gmail.com>**20071029174150] 
[allow use of multiple toggles in ToggleLayouts.
David Roundy <droundy@darcs.net>**20071026210643] 
[WindowNavigation.hs: documentation fix (navigateBorder -> navigateColor)
Brent Yorgey <byorgey@gmail.com>**20071029155731] 
[MetaModule.hs: add ManPrompt, remove ViewPrev
"Valery V. Vorotyntsev" <valery.vv@gmail.com>**20071029075621] 
[XMonadPrompt: use a single blank
Andrea Rossato <andrea.rossato@unibz.it>**20071029091618] 
[Added xmonadPromptC
cardboard42@gmail.com**20071027014811
 
 I added xmonadPromptC which takes a user defined list of commands as in Command.runCommand
 
] 
[Factor out some of dzenPP's goodies
Spencer Janssen <sjanssen@cse.unl.edu>**20071029015556] 
[Don't reverse sjanssenPP
Spencer Janssen <sjanssen@cse.unl.edu>**20071028224843] 
[MetaModule.hs: someone forgot the (), so GHC was giving a warning. Small fix to quiet the warning.
gwern0@gmail.com**20071027150847] 
[ViewPrev.hs: deleted
"Valery V. Vorotyntsev" <valery.vv@gmail.com>**20071027090937
 Its functionality is now part of CycleWS module.
 CycleWS.hs: Nelson Elhage added to authors.
] 
[add more details on using smartBorders
Don Stewart <dons@galois.com>**20071026224510] 
[add dynamicLogDzen, a dwm status bar, using dzen colour codes
Don Stewart <dons@galois.com>**20071026221944] 
[XPrompt: removed unneeded parenteses
Andrea Rossato <andrea.rossato@unibz.it>**20071026221505] 
[XPrompt.hs: use a single blank
"Valery V. Vorotyntsev" <valery.vv@gmail.com>**20071022192310
 Excessive blanks in prompts originate from here. Eliminate. :)
 Rewrite `getLastWord' and `skipLastWord' in pointfree style.
] 
[ShellPrompt.hs (showXPrompt): use a single blank
"Valery V. Vorotyntsev" <valery.vv@gmail.com>**20071022191741] 
[ShellPrompt: remove harcoded path when calling bash
Andrea Rossato <andrea.rossato@unibz.it>**20071026212334] 
[ShellPrompt: reformat the comments to complay with the module style
Andrea Rossato <andrea.rossato@unibz.it>**20071026211956] 
[XPrompt: catch exceptions when running the completion function
Andrea Rossato <andrea.rossato@unibz.it>**20071026211859] 
[CycleWS: StackSet.findIndex is now findTag
Andrea Rossato <andrea.rossato@unibz.it>**20071026211802] 
[Dzen.hs: replace 'findIndex' by 'findTag' to match renaming in core.
Brent Yorgey <byorgey@gmail.com>**20071022204335] 
[XPrompt.hs: add sensible bindings for Home and End
gwern0@gmail.com**20071026035026] 
[XPrompt.hs: add a pasteString function and keybinding
gwern0@gmail.com**20071026034920] 
[Run.hs: documentation fix
"Valery V. Vorotyntsev" <valery.vv@gmail.com>**20071024144244] 
[XPrompt.hs (uniqSort): new function
"Valery V. Vorotyntsev" <valery.vv@gmail.com>**20071024142241
 Moved from ShellPrompt. There are at least three happy users
 of this function -- ShellPrompt, SshPrompt, and ManPrompt.
] 
[SshPrompt.hs: use `uniqSort' from XPrompt.hs
"Valery V. Vorotyntsev" <valery.vv@gmail.com>**20071024144128
 Remove excessive import lists.
] 
[SshPrompt.hs (showXPrompt): use a single blank
"Valery V. Vorotyntsev" <valery.vv@gmail.com>**20071022192037
 Delete trailing whitespace. Fix documentation typo.
] 
[ShellPrompt.hs: move `uniqSort' to XPrompt.hs
"Valery V. Vorotyntsev" <valery.vv@gmail.com>**20071024143820] 
[ManPrompt.hs: use `uniqSort' from XPrompt.hs
"Valery V. Vorotyntsev" <valery.vv@gmail.com>**20071024143905
 TODO list extended.
] 
[TilePrime.hs: Handle nmaster = 0 reasonably
Eric Mertens <emertens@galois.com>**20071025001750] 
[oops, add period
Devin Mullins <me@twifkak.com>**20071024125448] 
[expand Invisible comments
Devin Mullins <me@twifkak.com>**20071024125213] 
[Remove excessive import lists from ShellPrompt
Spencer Janssen <sjanssen@cse.unl.edu>**20071024113106] 
[Use new terminal config option
Spencer Janssen <sjanssen@cse.unl.edu>**20071024110219] 
[Run.hs: do my usual segregation into safe and unsafe runInTerms
gwern0@gmail.com**20071024003911] 
[Run.hs: specialize runInXTerm to use runInTerm per my mailing list suggestion
gwern0@gmail.com**20071024001856] 
[Run.hs: +my suggested runInTerm general function
gwern0@gmail.com**20071024001628] 
[Run.hs, SshPrompt.hs, ShellPrompt.hs: mv runInXTerm back into Run.hs per suggestions
gwern0@gmail.com**20071024001341] 
[Comments for ConstrainedResize
Dougal Stanton <dougal@dougalstanton.net>**20071020092509] 
[Add ConstrainedResize module
Dougal Stanton <dougal@dougalstanton.net>**20071019173508
 Constrain the aspect ratio of floated windows by holding down shift
] 
[fix stupid dzenUrgencyHook bug
Devin Mullins <me@twifkak.com>**20071021061308] 
[CycleWS.hs (toggleWS): new function
"Valery V. Vorotyntsev" <valery.vv@gmail.com>**20071019205323
 This is a pointfree adaptation of ViewPrev.viewPrev;
 after this patch is applied, it may be a good idea to merge
 ViewPrev.hs into CycleWS.hs.
] 
[XPrompt.hs: fix vertical alignment of completions.
Dmitry Kurochkin <dmitry.kurochkin@gmail.com>**20071023183129] 
[fix bug in DragPane (where we forgot that r was mirrored).
David Roundy <droundy@darcs.net>**20071023152448] 
[ManPrompt.hs: a manual page prompt (new module)
"Valery V. Vorotyntsev" <valery.vv@gmail.com>**20071022191443] 
[STRUT aware gap toggling (clean patch)
mail@joachim-breitner.de**20071022220132
 
 Without this patch, ManageDocks would only set the gap according to a window���s
 STRUT when the window is first mapped. This information would then get lost when
 the user toggle the gap.
    
 Now, when the user toggles the Gap, all present windows are scanned for STRUT
 settings, and the gap is set accordingly. No need to manually configure the gap
 anymore.
 
 This is the same patch as before, but independant of the Hooks patches, and with
 more documentation.
] 
[add new LayoutCombinators module.
David Roundy <droundy@darcs.net>**20071023135638] 
[export DragPane type.
David Roundy <droundy@darcs.net>**20071023134933] 
[make DragPane work with any type (not just Windows).
David Roundy <droundy@darcs.net>**20071023134911] 
[SshPrompt.hs: while I'm here, replace nub with the faster Set trick
gwern0@gmail.com**20071019181514] 
[ShellPrompt.hs: fmt imports and update
gwern0@gmail.com**20071019181317] 
[SshPrompt.hs: fmt imports and update
gwern0@gmail.com**20071019181255] 
[XSelection.hs: fmt imports and sigs
gwern0@gmail.com**20071019181232] 
[XSelection.hs: +2 functions, safePromptSelection and unsafePromptSelection
gwern0@gmail.com**20071019181137
 Analogous to Run.hs patch; these use safeSpawn and unsafeSpawn respectively.
] 
[Run.hs: +2 functions, safeSpawn & unsafeSpawn
gwern0@gmail.com**20071019181009
 See their documentation. This is part of a re-organization of various 'run' commands; this two
 make it easier to go through the shell or not, and will be re-used elsewhere.
] 
[Run.hs: fmt
gwern0@gmail.com**20071019180953] 
[Run.hs, ShellPrompt.sh: mv runInXTerm to ShellPrompt.hs
gwern0@gmail.com**20071019180900] 
[XSelection.hs: documentation format changes.
gwern0@gmail.com**20071019010057] 
[XSelection.hs: +type signature for auxiliary function
gwern0@gmail.com**20071019010034] 
[XSelection.hs: simplify creation of window
gwern0@gmail.com**20071019010013
 While spelunking in the xclip source code, I noticed it had much the same call to createSimpleWindow but with a simpler geometry - just 1x1 pixels, not the odd 200x100 of the original code. It seems to work the same and looks better and less mysterious, so unless arossato had a specific reason for those particular two numbers...
] 
[XPrompt.hs (keyPressHandle): Ctrl-g and Ctrl-c added to quit keystrokes
"Valery V. Vorotyntsev" <valery.vv@gmail.com>**20071020170936
 Obvious comments removed.
] 
[XPrompt.hs: trailing whitespace cleaned
"Valery V. Vorotyntsev" <valery.vv@gmail.com>**20071020170719] 
[Fix pragmas in XMonadContrib
Shachaf Ben-Kiki <shachaf@gmail.com>**20071022011738] 
[test_XPrompt.hs: there is no ShellPrompt.rmPath
"Valery V. Vorotyntsev" <valery.vv@gmail.com>**20071019205830] 
[introduce new combineTwo layout combinator.
David Roundy <droundy@darcs.net>**20071020191748
 This layout combinator is similar in spirit (and in code) to
 the old combo combinator, but only allows two sublayouts.  As
 a result, we don't need to wrap these in existentials, and reading
 works seamlessly.  Also, we add the feature (which could also be
 added to combo) of being able to change which sublayout a given
 window is in through integration with WindowNavigation.
 
 I envision combo being deprecated soon.  combineTwo isn't quite
 so flexible, but it's much easier and is better-coded also.
] 
[allow layout modifiers to modify a Message in transit.
David Roundy <droundy@darcs.net>**20071020191542
 This is a helpful feature (for, e.g. WindowNavigation) that
 allows modifiers (if they so choose... the old API remains
 supported) to easily send a single Message to the modified
 layout in response to a Message.
] 
[update UrgencyHook example config to reflect changes to WindowNavigation and core Config.hs
Brent Yorgey <byorgey@gmail.com>**20071019145526] 
[add ToggleLayouts module.
David Roundy <droundy@darcs.net>**20071018214525] 
[default to empty description for layout modifiers.
David Roundy <droundy@darcs.net>**20071018202604
 This is because modifierDescription is designed to be human-readable,
 and show rarely creates a human-readable description.  And in many (if
 not most) cases, an empty description is precisely what we want.
] 
[beautify description code for empty modifier-description.
David Roundy <droundy@darcs.net>**20071018202438] 
[change definition of 'description' function for LayoutModifier so an extra space is not added if the modifier description is empty.
Brent Yorgey <byorgey@gmail.com>**20071018183054] 
[DynamicLog.hs: Add dzenColor
Eric Mertens <emertens@galois.com>**20071018174523] 
[add function to rename workspaces.
David Roundy <droundy@darcs.net>**20071018145604] 
[change example to dzenUrgencyHook
Devin Mullins <me@twifkak.com>**20071018022026] 
[add dzenUrgencyHook as example (and the one I use)
Devin Mullins <me@twifkak.com>**20071018021742] 
[fixed Dzen and gave it a configurable timeout
Devin Mullins <me@twifkak.com>**20071018012910] 
[rename LayoutSelect & defaultLayout in comments
Devin Mullins <me@twifkak.com>**20071016051819] 
[add import to comments, for clarity
Devin Mullins <me@twifkak.com>**20071012044555] 
[documentation for UrgencyHook
Devin Mullins <me@twifkak.com>**20071012034506] 
[d'oh, minor UrgencyHook cleanup
Devin Mullins <me@twifkak.com>**20071012032558] 
[brand new UrgencyHook contrib, depends on X11-extras WMHints binding
Devin Mullins <me@twifkak.com>**20071011051641
 It's a LayoutModifier which lets you define an urgencyHook function -- the
 action gets performed wheneveran X client sends an XUrgencyHint message (i.e.
 tries to "flash" the "taskbar").
 
 This statically points to Config.urgencyHook, which requires that the user add
 a line to Config.hs-boot, in addition to defining the urgencyHook.
 
 Documentation forthcoming.
] 
[TilePrime.hs: Give a description that distinguishs between horizontal/vertical
Eric Mertens <emertens@galois.com>**20071018063749] 
[fix WindowNavigation comment
l.mai@web.de**20071018054315] 
[-Wall police
l.mai@web.de**20071018033000] 
[Truncate title at 80 characters
Spencer Janssen <sjanssen@cse.unl.edu>**20071018003013] 
[shorten in sjanssenPP too
Spencer Janssen <sjanssen@cse.unl.edu>**20071018002821] 
[Truncate long window titles
Spencer Janssen <sjanssen@cse.unl.edu>**20071018002511] 
[DynamicLog.hs: Add ppWsSep field to PP to specify workspace separator.
Eric Mertens <emertens@galois.com>**20071018001652
 
 This can be useful when you are using colors to distinguish between
 workspaces and simply provides more functionality. The default behavior
 remains the same.
] 
[Wrapping the empty string yields the empty string
Spencer Janssen <sjanssen@cse.unl.edu>**20071018001542] 
[DynamicLog: documentation only
Spencer Janssen <sjanssen@cse.unl.edu>**20071017211427] 
[Allow the user to change the order of workspaces, layout, title
Spencer Janssen <sjanssen@cse.unl.edu>**20071017211303] 
[Don't wrap the layout description by default
Spencer Janssen <sjanssen@cse.unl.edu>**20071017211011] 
[DynamicLog: not . null. Duh.
Spencer Janssen <sjanssen@cse.unl.edu>**20071017210912] 
[A big dynamicLog refactor
Spencer Janssen <sjanssen@cse.unl.edu>**20071017210431
 We introduce the PP type to allow user customization of dynamicLog.
 dynamicLogWithTitle has been eliminated because this is the default behavior
 for dynamicLog now.
] 
[Don't toLower the layout description.
Spencer Janssen <sjanssen@cse.unl.edu>**20071017202953
 If we'd really like lower case layout descriptions, the 'description' method
 in the LayoutClass instances should be changed instead.
] 
[TilePrime.hs: Correct behavior when number of windows <= nmaster
Eric Mertens <emertens@galois.com>**20071017205153
 
 Additionally this patch does various clean-ups that should not
 affect functionality.
] 
[Remove RunInXTerm in favor of Run
Spencer Janssen <sjanssen@cse.unl.edu>**20071017202201] 
[Move runXXX functions to one module
Christian Thiemann <mail@christian-thiemann.de>**20071012145233
 This patch takes runProcessWithInput out of Dmenu, runProcessWithInputAndWait
 out of Dzen, and runInXTerm out of RunInXTerm and collects them in one central
 module called Run.  This way, other modules may include Run instead of Dmenu
 to get what they want without giving the impression of making use of dmenu.
] 
[Fix LANGUAGE pragmas
Shachaf Ben-Kiki <shachaf@gmail.com>**20071017194622] 
[RotSlaves.hs: Add rotAll functions
Eric Mertens <emertens@galois.com>**20071017173256] 
[TilePrime.hs: add usage info.
Joachim Fasting <joachim.fasting@gmail.com>**20071017192612] 
[use full screen for single window in TilePrime
l.mai@web.de**20071017191421] 
[TilePrime.hs: add LANGAUGE pragma.
Joachim Fasting <joachim.fasting@gmail.com>**20071017182042] 
[MetaModule.hs: add WorkspacePrompt.
Joachim Fasting <joachim.fasting@gmail.com>**20071017182027] 
[add TilePrime to MetaModule.
David Roundy <droundy@darcs.net>**20071017133202] 
[Initial import of TilePrime
Eric Mertens <emertens@galois.com>**20071017052017
 
 This layout provides a standard tiling layout with support for resize hints
 and filling the gaps created by them.
] 
[code cleanup in selectWorkspace.
David Roundy <droundy@darcs.net>**20071016231218] 
[allow users to go to dynamically-added workspaces with mod-n.
David Roundy <droundy@darcs.net>**20071016230301] 
[add modules to deal with Workspaces (select, etc) by name using XPrompt.
David Roundy <droundy@darcs.net>**20071016223347] 
[make windowNavigation simpler to use in simplest case.
David Roundy <droundy@darcs.net>**20071016214337] 
[compute nice window border for WindowNavigation properly.
David Roundy <droundy@darcs.net>**20071016213316] 
[fix docs on WindowNavigation.
David Roundy <droundy@darcs.net>**20071016210349] 
[compute a reasonable navigation color based on focussed color.
David Roundy <droundy@darcs.net>**20071015165504] 
[WindowNavigation: don't export the config constructor and some haddock fixes
Andrea Rossato <andrea.rossato@unibz.it>**20071013090524
 I told to David I would have taken care of that: instead of exporting
 the config constructor we export 2 functions: navigateColor and
 noNavigateBorders. Updated documentation accordingly.
] 
[improvements in Combo.
David Roundy <droundy@darcs.net>**20071015132839] 
[TAG 0.4
Spencer Janssen <sjanssen@cse.unl.edu>**20071016212343] 
Patch bundle hash:
d859e0c5ce1c48cc20466cb835c0f471980a4d06
