
New patches:

[refactor layout interface.
David Roundy <droundy@darcs.net>**20070417034813
 This change only changes functionality in that the tileFraction is now a
 per-layout variable.  The main point is to add the flexibility to define
 layouts in the Config file.  There's a bit of cheesiness in the type of
 modifyLayout, since I could figure out a pleasant choice for passing the
 key-binding information to the Layout, so I just used a string.
] 
<
> {
hunk ./Config.hs 110
 -- What layout to start in, and what the default proportion for the
 -- left pane should be in the tiled layout.  See LayoutDesc and
 -- friends in XMonad.hs for options.
-startingLayoutDesc :: LayoutDesc
-startingLayoutDesc =
-    LayoutDesc { layoutType   = Full
-               , tileFraction = 1%2  }
+startingLayouts :: [Layout]
+startingLayouts = [ full, tiled defaultDelta (1%2), vtiled defaultDelta (1%2) ]
 
 -- The keys list.
 keys :: M.Map (KeyMask, KeySym) (X ())
hunk ./Config.hs 125
     , ((modMask,               xK_j     ), raise GT)
     , ((modMask,               xK_k     ), raise LT)
 
-    , ((modMask,               xK_h     ), changeSplit (negate defaultDelta))
-    , ((modMask,               xK_l     ), changeSplit defaultDelta)
+    , ((modMask,               xK_h     ), layoutMsg "shrink")
+    , ((modMask,               xK_l     ), layoutMsg "expand")
 
     , ((modMask .|. shiftMask, xK_c     ), kill)
 
hunk ./Main.hs 53
             , dimensions    = (fromIntegral (displayWidth dpy dflt),
                                fromIntegral (displayHeight dpy dflt))
             , workspace     = W.empty workspaces (length xinesc)
-            , defaultLayoutDesc = startingLayoutDesc
-            , layoutDescs   = M.empty
+            , defaultLayouts = startingLayouts
+            , layouts   = M.empty
             }
 
     xSetErrorHandler -- in C, I'm too lazy to write the binding
hunk ./Operations.hs 43
 refresh :: X ()
 refresh = do
     XState {workspace = ws, xineScreens = xinesc
-           ,display   = d ,layoutDescs = fls  ,defaultLayoutDesc = dfltfl } <- get
+           ,display   = d ,layouts = fls  ,defaultLayouts = dfltfl } <- get
 
     flip mapM_ (M.assocs (W.screen2ws ws)) $ \(scn, n) -> do
         let sc =  genericIndex xinesc scn -- temporary coercion!
hunk ./Operations.hs 47
-            fl = M.findWithDefault dfltfl n fls
+            (l:_) = findNonEmptyWithDefault dfltfl n fls
         mapM_ (\(w, rect) -> io $ moveWindowInside d w rect) $
hunk ./Operations.hs 49
-            case layoutType fl of
-                Full -> fmap (flip (,) sc) $ maybeToList $ W.peekStack n ws
-                Tall -> tile  (tileFraction fl) sc $ W.index n ws
-                Wide -> vtile (tileFraction fl) sc $ W.index n ws
+            (doLayout l) sc $ W.index n ws
         whenJust (W.peekStack n ws) (io . raiseWindow d)
     whenJust (W.peek ws) setFocus
     clearEnterEvents
hunk ./Operations.hs 54
 
+full :: Layout
+full = Layout { doLayout = \sc -> map (\w -> (w,sc)), modifyLayout = const Nothing }
+
+tiled :: Rational -> Rational -> Layout
+tiled delta tileFrac = Layout { doLayout = \sc -> tile tileFrac sc , modifyLayout = m }
+    where m "expand" = Just $ tiled delta (tileFrac + delta)
+          m "shrink" = Just $ tiled delta (tileFrac - delta)
+          m _ = Nothing
+
+vtiled :: Rational -> Rational -> Layout
+vtiled delta tileFrac = Layout { doLayout = \sc -> vtile tileFrac sc , modifyLayout = m }
+    where m "expand" = Just $ vtiled delta (tileFrac + delta)
+          m "shrink" = Just $ vtiled delta (tileFrac - delta)
+          m _ = Nothing
+
 -- | clearEnterEvents.  Remove all window entry events from the event queue.
 clearEnterEvents :: X ()
 clearEnterEvents = do
hunk ./Operations.hs 110
 -- mode, and counter clockwise in wide mode. This is a feature.
 --
 switchLayout :: X ()
-switchLayout = layout $ \fl -> fl { layoutType = rotateLayout (layoutType fl) }
-
--- | changeSplit.  Changes the window split.
-changeSplit :: Rational -> X ()
-changeSplit delta = layout $ \fl ->
-    fl { tileFraction = min 1 (max 0 (tileFraction fl + delta)) }
+switchLayout = layout W.rotateList
 
 -- | layout. Modify the current workspace's layout with a pure
 -- function and refresh.
hunk ./Operations.hs 114
-layout :: (LayoutDesc -> LayoutDesc) -> X ()
+layout :: ([Layout] -> [Layout]) -> X ()
 layout f = do
     modify $ \s ->
hunk ./Operations.hs 117
-        let fls = layoutDescs s
+        let fls = layouts s
             n   = W.current . workspace $ s
hunk ./Operations.hs 119
-            fl  = M.findWithDefault (defaultLayoutDesc s) n fls
-        in s { layoutDescs = M.insert n (f fl) fls }
+            fl = findNonEmptyWithDefault (defaultLayouts s) n fls
+        in s { layouts = M.insert n (f fl) fls }
     refresh
 
hunk ./Operations.hs 123
+layoutMsg :: String -> X () -- FIXME: The below shouldn't refresh on Nothing
+layoutMsg s = layout $ \(l:ls) -> case modifyLayout l s of
+                                    Nothing -> l:ls
+                                    Just l' -> l':ls
+
+findNonEmptyWithDefault :: Ord a => [b] -> a -> M.Map a [b] -> [b]
+findNonEmptyWithDefault [] _ _ = error "Empty default!"
+findNonEmptyWithDefault d n m = case M.findWithDefault d n m of { [] -> d; l -> l }
+
 -- | windows. Modify the current window list with a pure function, and refresh
 windows :: (WorkSpace -> WorkSpace) -> X ()
 windows f = do
hunk ./StackSet.hs 222
 -- | Cycle the current stack ordering. In tiled mode has the effect of
 -- moving a new window into the master position, without changing focus.
 promote :: StackSet a -> StackSet a
-promote w = w { stacks = M.adjust next (current w) (stacks w) }
-   where next [] = []
-         next xs = last xs : init xs
+promote w = w { stacks = M.adjust rotateList (current w) (stacks w) }
+
+rotateList :: [a] -> [a]
+rotateList [] = []
+rotateList xs = last xs : init xs
 
 -- |
 elemAfter :: Eq a => a -> [a] -> Maybe a
hunk ./XMonad.hs 18
 --
 
 module XMonad (
-    X, WorkSpace, XState(..), Layout(..), LayoutDesc(..),
+    X, WorkSpace, XState(..), Layout(..),
     runX, io, withDisplay, isRoot,
hunk ./XMonad.hs 20
-    spawn, trace, whenJust, rotateLayout
+    spawn, trace, whenJust,
   ) where
 
 import StackSet (StackSet,WorkspaceId)
hunk ./XMonad.hs 36
 -- | XState, the window manager state.
 -- Just the display, width, height and a window list
 data XState = XState
-    { display           :: Display                         -- ^ the X11 display
+    { display        :: Display                       -- ^ the X11 display
 
hunk ./XMonad.hs 38
-    , theRoot           :: !Window                         -- ^ the root window
-    , wmdelete          :: !Atom                           -- ^ window deletion atom
-    , wmprotocols       :: !Atom                           -- ^ wm protocols atom
-    , dimensions        :: !(Int,Int)                      -- ^ dimensions of the screen, 
-                                                           -- used for hiding windows
-    , workspace         :: !WorkSpace                      -- ^ workspace list
+    , theRoot        :: !Window                       -- ^ the root window
+    , wmdelete       :: !Atom                         -- ^ window deletion atom
+    , wmprotocols    :: !Atom                         -- ^ wm protocols atom
+    , dimensions     :: !(Int,Int)                    -- ^ dimensions of the screen, 
+                                                      --   used for hiding windows
+    , workspace      :: !WorkSpace                    -- ^ workspace list
 
hunk ./XMonad.hs 45
-    , xineScreens       :: ![Rectangle]                    -- ^ dimensions of each screen
-    , defaultLayoutDesc :: !LayoutDesc                     -- ^ default layout
-    , layoutDescs       :: !(M.Map WorkspaceId LayoutDesc) -- ^ mapping of workspaces 
-                                                           -- to descriptions of their layouts
+    , xineScreens    :: ![Rectangle]                  -- ^ dimensions of each screen
+    , defaultLayouts :: ![Layout]                     -- ^ default layout
+    , layouts        :: !(M.Map WorkspaceId [Layout]) -- ^ mapping of workspaces 
+                                                      --   to descriptions of their layouts
     }
 
 type WorkSpace = StackSet Window
hunk ./XMonad.hs 79
 ------------------------------------------------------------------------
 -- Layout handling
 
--- | The different layout modes
-data Layout = Full | Tall | Wide deriving (Enum, Bounded, Eq)
-
--- | 'rot' for Layout.
-rotateLayout :: Layout -> Layout
-rotateLayout x = if x == maxBound then minBound else succ x
-
--- | A full description of a particular workspace's layout parameters.
-data LayoutDesc = LayoutDesc { layoutType   :: !Layout
-                             , tileFraction :: !Rational
-                             }
+data Layout = Layout { doLayout :: Rectangle -> [Window] -> [(Window, Rectangle)]
+                     , modifyLayout :: String -> Maybe Layout }
 
 -- ---------------------------------------------------------------------
 -- Utilities
}

Context:

[test for xmonad in path first, before restarting
Don Stewart <dons@cse.unsw.edu.au>**20070416025541] 
[added comment about windows key (mod4Mask)
Jason Creighton <jcreigh@gmail.com>**20070415233635] 
[remove unused sizeDelta setting
Jason Creighton <jcreigh@gmail.com>**20070415233244] 
[Note we must fix mod-shift-c before 0.1 can go out
Don Stewart <dons@cse.unsw.edu.au>**20070415230435] 
[fix typo.
David Roundy <droundy@darcs.net>**20070415055616] 
[added warning re: xmonad in path to mod-shift-q docs
Jason Creighton <jcreigh@gmail.com>**20070413233019] 
[Clear up documentation on mod-h/l
Spencer Janssen <sjanssen@cse.unl.edu>**20070413230706] 
[Ignore window entries while moving windows.  This should fix all the focus preservation problems.
Spencer Janssen <sjanssen@cse.unl.edu>**20070413083702] 
[Update TODO
Spencer Janssen <sjanssen@cse.unl.edu>**20070413031003] 
[mod-wer for Xinerama was inadvertently changed
Alec Berryman <alec@thened.net>**20070412132033] 
[and the tests still run
Don Stewart <dons@cse.unsw.edu.au>**20070411081500] 
[add license headers to two missing files
Don Stewart <dons@cse.unsw.edu.au>**20070411081042] 
[clean up tiling code a teensy bit, and comment on the interaction between focus, master, and cycling direction between the modes
Don Stewart <dons@cse.unsw.edu.au>**20070411080747] 
[explain what mod-return now does. it cycles
Don Stewart <dons@cse.unsw.edu.au>**20070411073636] 
[Change semantics of 'promote'. 
Don Stewart <dons@cse.unsw.edu.au>**20070411073456
 
 Previously 'promote' would move the currently focused window into the
 master position in tiled mode. This was *almost* a cycle of the windows,
 but not quite (depending on where the focus was, it was in fact a
 cycle).
 
 Now we do the obvious generalisation, and just cycle the current window
 stack. Simpler to understand, simpler to reason about.
 
] 
[clean up only
Don Stewart <dons@cse.unsw.edu.au>**20070411065607] 
[merge with toList/fromList patch
Don Stewart <dons@cse.unsw.edu.au>**20070411060947] 
[Statically distinguish Workspace and Screen indices
Don Stewart <dons@cse.unsw.edu.au>**20070411060456] 
[fromList/toList have # of screens + another QC property
Jason Creighton <jcreigh@gmail.com>**20070411044215] 
[Xinerama screen switching bugfix
Jason Creighton <jcreigh@gmail.com>**20070411041615] 
[removed xinerama-enabled dmenu action
Jason Creighton <jcreigh@gmail.com>**20070411024716
 I don't think we're going to see any Xinerama support upstream, at least not
 anytime soon. It doesn't make sense to ship something with xmonad that isn't
 going to work out of the box. So for now Xinerama users should just use this
 patch: http://www.jcreigh.com/xmonad/xinerama-dmenu.html
] 
[Move workspace fetching logic from Config.hs to Operations.hs
Spencer Janssen <sjanssen@cse.unl.edu>**20070410064714] 
[moved screen <-> workspace mapping from XMonad to StackSet
Jason Creighton <jcreigh@gmail.com>**20070410062731] 
[Add notes about StackSet redesign
Spencer Janssen <sjanssen@cse.unl.edu>**20070410021238] 
[Simplify rot
Spencer Janssen <sjanssen@cse.unl.edu>**20070409223500] 
[Rearrange TODO
Spencer Janssen <sjanssen@cse.unl.edu>**20070409075817] 
[Also done
Spencer Janssen <sjanssen@cse.unl.edu>**20070409075029] 
[Tile algorithm has been improved
Spencer Janssen <sjanssen@cse.unl.edu>**20070409074945] 
[Vertical tiling done
Spencer Janssen <sjanssen@cse.unl.edu>**20070409074853] 
[Remove redundant parens
Spencer Janssen <sjanssen@cse.unl.edu>**20070409073836] 
[Remove unused 'screen' field
Spencer Janssen <sjanssen@cse.unl.edu>**20070409073510] 
[Document XState fields
Spencer Janssen <sjanssen@cse.unl.edu>**20070409073414] 
[Use -funbox-strict-fields, rather than UNPACK pragmas. cleaner code.
Don Stewart <dons@cse.unsw.edu.au>**20070409072302] 
[Remove redundant setFocus, setFocus is called by refresh which is called by windows
Spencer Janssen <sjanssen@cse.unl.edu>**20070405215832] 
[-Wall police
Don Stewart <dons@cse.unsw.edu.au>**20070405000100] 
[take window borders into account when resizing (requires latest X11-extras)
Jason Creighton <jcreigh@gmail.com>**20070404021612] 
[summarise key bindings in a table in Config.hs
Don Stewart <dons@cse.unsw.edu.au>**20070404011441] 
[replace multiple gets with a single get and record bind
Don Stewart <dons@cse.unsw.edu.au>**20070404010524] 
[Use Tall and Wide for split screen layouts.  This should be less confusing.
Spencer Janssen <sjanssen@cse.unl.edu>**20070403050610] 
[Abusing TODO as a bug tracker: note about overlapping
Alec Berryman <alec@thened.net>**20070402222956] 
[Comment typo: more -> move
Alec Berryman <alec@thened.net>**20070402221948] 
[Note the Xinerama bugs I've experienced in the TODO
Alec Berryman <alec@thened.net>**20070402160802] 
[vertical (master area on top) tiling
Jason Creighton <jcreigh@gmail.com>**20070403040658] 
[Comment typo.
Spencer Janssen <sjanssen@cse.unl.edu>**20070402214605] 
[Comment only.
Spencer Janssen <sjanssen@cse.unl.edu>**20070402072418] 
[Revert to the old layout code.
Spencer Janssen <sjanssen@cse.unl.edu>**20070402045114] 
[Type error: lockMask :: KeyMask, not KeySym
Alec Berryman <alec@thened.net>**20070401143416
 
 Error prevents compilation on 64-bit systems.
] 
[Suggest an alternative modMask for emacs users
Alec Berryman <alec@thened.net>**20070401161027] 
[Remove trailing spaces, no content changed
Alec Berryman <alec@thened.net>**20070401144539] 
[Fix type error in dimensions field of XState record for 64-bit systems
Alec Berryman <alec@thened.net>**20070401144229
 
 Fallout from Int->CInt conversion.
] 
[Config.hs comment formatting/typo
Jason Creighton <jcreigh@gmail.com>**20070401055711] 
["dmenu" operation to spawn dmenu only on the current screen (for Xinerama)
Jason Creighton <jcreigh@gmail.com>**20070401012712
 This requires a dmenu that will accept -x and -w. Currently, This means
 applying this patch: http://www.jcreigh.com/dmenu/position-options.patch (I'm
 trying to see if I can get this into dmenu upstream; haven't heard anything
 back yet.)
] 
[Move safeFocus from Main to Operations
Spencer Janssen <sjanssen@cse.unl.edu>**20070331010024] 
[sanitize key bindings
Don Stewart <dons@cse.unsw.edu.au>**20070401033522
 
 Changes mean:
 
 * gmrun is like the dmenu key, but with shift set. 
     -    , ((modMask .|. shiftMask, xK_F11   ), spawn "gmrun")
     +    , ((modMask .|. shiftMask, xK_p     ), spawn "gmrun")
 
  If no one actually uses both gmrun and dmenu, we should consider only
  using mod-p for this.
 
 * restart is like quit, but with 'ctrl' set:
     +    , ((modMask .|. shiftMask, xK_q                     ), io $ exitWith ExitSuccess)
     +    , ((modMask .|. shiftMask .|. controlMask, xK_q     ), io restart)
 
 * revert to 'wer' ordering for xinerama screens:
     -        | (key, sc) <- zip [xK_e, xK_r, xK_t] [1..]
     +        | (key, sc) <- zip [xK_w, xK_e, xK_r] [1..]
 
 that's the only binding order that makes sense, since they're meant to
 refer to screens 1 2 and 3, hence 'wer' (look at the keyboard to see why)
 
 
 
 
 
] 
[Cleaned up layout a little bit
hughes@rpi.edu**20070401023639] 
[restore dwm-style keybindings. mod-shift-{j,k} resize in vert mode
Don Stewart <dons@cse.unsw.edu.au>**20070401025433] 
[Merged things together with dons changes.
hughes@rpi.edu**20070401021846] 
[Config.hs avoids conflict with essential M-w Emacs shortcut.
hughes@rpi.edu**20070401015135] 
[Vertical/horizontal split, and resizability.
hughes@rpi.edu**20070401014706] 
[Remove evil gmrun shortcut.
hughes@rpi.edu**20070330144558] 
[formatting only
Don Stewart <dons@cse.unsw.edu.au>**20070401004726] 
[formatting fixes. the style is getting a bit dodgy in some places...
Don Stewart <dons@cse.unsw.edu.au>**20070401002803] 
[removed refocus; moved functionality to setFocus
Jason Creighton <jcreigh@gmail.com>**20070331003442] 
[refactored "focus changed" code into "refocus"
Jason Creighton <jcreigh@gmail.com>**20070330035454] 
[Window borders
Alec Berryman <alec@thened.net>**20070329182159
 
 Colors taken from dwm's config.default.h and hard-coded in Operations instead
 of Config because of import cycle.
 
 Windows overlap slightly in the current tiling algorithm and sometimes prevent
 the active window from being completely surrounded by a red border.
] 
[Add AMD64 note to the README
Spencer Janssen <sjanssen@cse.unl.edu>**20070329055250] 
[Type error: button1 :: Button, not :: ButtonMask
Alec Berryman <alec@thened.net>**20070329024330] 
[Fix refreshKeyboardMapping issues.  Requires the latest X11-extras
Spencer Janssen <sjanssen@cse.unl.edu>**20070328215753] 
[allow mouse to change current workspace
daniel@wagner-home.com**20070328103435] 
[first shot at allowing click to focus windows
daniel@wagner-home.com**20070328101540] 
[added a quickcheck property
daniel@wagner-home.com**20070328025337] 
[Compatibility with CInt'ified X11
Spencer Janssen <sjanssen@cse.unl.edu>**20070328071436] 
[one less todo
Don Stewart <dons@cse.unsw.edu.au>**20070327231846] 
[whitespace
Jason Creighton <jcreigh@gmail.com>**20070327013350] 
[updated TODO (Config.hs completed)
Jason Creighton <jcreigh@gmail.com>**20070327014124] 
[Config supports Ctrl+Space for gmrun again.
hughes@rpi.edu**20070326151243] 
[Workspace-specific layouts
hughes@rpi.edu**20070326150213] 
[Typo: use dmenu_path instead of emenu_path
Alec Berryman <alec@thened.net>**20070326140335] 
[Focus follows mouse.
Spencer Janssen <sjanssen@cse.unl.edu>**20070326124725
 This change makes the window under the mouse pointer the focused window.  This
 isn't quite what we want, but it is a step in the right direction.  The next
 step is to somehow inhibit the CrossingEvents generated during workspace and
 layout switches.
 
] 
[Update todo
Spencer Janssen <sjanssen@cse.unl.edu>**20070326102441] 
[Extra config: defaultLayout
daniel@wagner-home.com**20070326074234] 
[updated TODO
daniel@wagner-home.com**20070326073415] 
[minor aesthetic changes
daniel@wagner-home.com**20070326073339] 
[Restrain leftWidth
Spencer Janssen <sjanssen@cse.unl.edu>**20070326095034] 
[fix
Don Stewart <dons@cse.unsw.edu.au>**20070326075812] 
[Config.lhs -> Config.hs
Jason Creighton <jcreigh@gmail.com>**20070326054004] 
[added Config.lhs and moved most things in Main.hs into Operations.hs to enable this
Jason Creighton <jcreigh@gmail.com>**20070326051341] 
[Xinerama focus bug (couldn't focus on current workspace)
Jason Creighton <jcreigh@gmail.com>**20070325203702] 
[restart (simple exec(), no state saved)
Jason Creighton <jcreigh@gmail.com>**20070323023738] 
[Add promote.  Makes the focused window the master
Spencer Janssen <sjanssen@cse.unl.edu>**20070322222333] 
[Add promote
Spencer Janssen <sjanssen@cse.unl.edu>**20070322221547] 
[I like 1%2 split.  Maintainer's prerogative :)
Spencer Janssen <sjanssen@cse.unl.edu>**20070321070649] 
[Add defaultLeftWidth in the configuration section
Spencer Janssen <sjanssen@cse.unl.edu>**20070321065807] 
[Allow dynamic width in tiling mode
daniel@wagner-home.com**20070321054245] 
[GHC 6.4 compatibility.
Spencer Janssen <sjanssen@cse.unl.edu>**20070321045211] 
[add keybindings to change screens and tag windows to screens
Jason Creighton <jcreigh@gmail.com>**20070321033807] 
[Add raiseFocus.
Spencer Janssen <sjanssen@cse.unl.edu>**20070320160135] 
[Make numlockMask configurable
Spencer Janssen <sjanssen@cse.unl.edu>**20070320145828] 
[Initial tiling support.
Spencer Janssen <sjanssen@cse.unl.edu>**20070320071812] 
[Fix indentation
Spencer Janssen <sjanssen@cse.unl.edu>**20070320054647] 
[Untabify
Spencer Janssen <sjanssen@cse.unl.edu>**20070320054045] 
[changed type of getScreenInfo in Graphics.X11.Xinerama
Jason Creighton <jcreigh@gmail.com>**20070320044253] 
[Decouple the concepts of focus and window order.  First step to tiling!
Spencer Janssen <sjanssen@cse.unl.edu>**20070320051124] 
[trace wsOnScreen when it's changed
Jason Creighton <jcreigh@gmail.com>**20070319035629] 
[don't try to change the current workspace based on an enterNotify event
Jason Creighton <jcreigh@gmail.com>**20070319035450] 
[use "windows" in "unmanage"
Jason Creighton <jcreigh@gmail.com>**20070318024825] 
[replaced "let Just x = ..." in view with "case ... of ..."
Jason Creighton <jcreigh@gmail.com>**20070318005525] 
[basic xinerama support (depends on Graphics.X11.Xinerama in X11-extras)
Jason Creighton <jcreigh@gmail.com>**20070317234904] 
[Whitespace only
Spencer Janssen <sjanssen@cse.unl.edu>**20070316194950] 
[-Wall police
Spencer Janssen <sjanssen@cse.unl.edu>**20070316022201] 
[abstract out modMask for easy user configuration
shae@ScannedInAvian.com**20070315230127] 
[tasks before 0.1
Spencer Janssen <sjanssen@cse.unl.edu>**20070315061646] 
[s/thunk/xmonad
Spencer Janssen <sjanssen@cse.unl.edu>**20070315054632] 
[Tiling notes
Spencer Janssen <sjanssen@cse.unl.edu>**20070314070752] 
[Actually fix the zombie issue.
Spencer Janssen <sjanssen@cse.unl.edu>**20070313235931] 
[Sloppy typos in spawn.
Spencer Janssen <sjanssen@cse.unl.edu>**20070313215009] 
[Fix forking issues, add unix dependency.
Spencer Janssen <sjanssen@cse.unl.edu>**20070313153310] 
[catch exceptions in spawn, so failing to fork won't kill the wm
Don Stewart <dons@cse.unsw.edu.au>**20070312062612] 
[fiddling, comments
Don Stewart <dons@cse.unsw.edu.au>**20070312014029] 
[comments, move isRoot into XMonad
Don Stewart <dons@cse.unsw.edu.au>**20070312012350] 
[wibbles
Don Stewart <dons@cse.unsw.edu.au>**20070312010756] 
[abstract out setfocus code a bit
Don Stewart <dons@cse.unsw.edu.au>**20070312005540] 
[general refactor, and call xerrorhandler to ignore certain undetectable issues
Don Stewart <dons@cse.unsw.edu.au>**20070311102653] 
[initial support for Atom-based delete protocol. makes kill client work on firefox. Quitting though still leads to a bogus notify from firefox, for a closed window
Don Stewart <dons@cse.unsw.edu.au>**20070311064515] 
[thunk is now known as xmonad!
Spencer Janssen <sjanssen@cse.unl.edu>**20070310070320] 
[XMonad
Don Stewart <dons@cse.unsw.edu.au>**20070310070152] 
[add tracing for kill window
Don Stewart <dons@cse.unsw.edu.au>**20070310062154] 
[Use 9 workspaces by default
Spencer Janssen <sjanssen@cse.unl.edu>**20070310041114] 
[Reduce flicker on workspace change.
Spencer Janssen <sjanssen@cse.unl.edu>**20070310041021] 
[typo
Don Stewart <dons@cse.unsw.edu.au>**20070310034012] 
[Add support for Enter/Leave notify events. Fixes firefox on my machine
Don Stewart <dons@cse.unsw.edu.au>**20070310032759] 
[refactor, trying to seperate out IO from W stuff, in order to QC the handler at some point
Don Stewart <dons@cse.unsw.edu.au>**20070310012940] 
[notes on the firefox bug
Don Stewart <dons@cse.unsw.edu.au>**20070309162510
 
 basically we have to set focus ourselves. This means when we start
 managing a window, and when an XCrossingEvent occurs (which we don't
 handle). 
 
 On Manage/Enter, we set focus. on Leave we set focus to root.
 See event.c and focus.c in dwm for more details.
 
] 
[grammar nazis
Don Stewart <dons@cse.unsw.edu.au>**20070309145649] 
[whitespace. and note if we get a config request for an already managed window
Don Stewart <dons@cse.unsw.edu.au>**20070309144308] 
[improved grabkeys (also handle lockMask down)
Don Stewart <dons@cse.unsw.edu.au>**20070309134211] 
[alloc the event space only once
Don Stewart <dons@cse.unsw.edu.au>**20070309134149] 
[also select for enter and leave window events (need for XCrossing?)
Don Stewart <dons@cse.unsw.edu.au>**20070309131251] 
[we should check for OverrideRedirect on initial scan too
Don Stewart <dons@cse.unsw.edu.au>**20070309130608] 
[no unix dependency
Don Stewart <dons@cse.unsw.edu.au>**20070309091951] 
[fmt only
Don Stewart <dons@cse.unsw.edu.au>**20070309091455] 
[unnec. export list
Don Stewart <dons@cse.unsw.edu.au>**20070309091328] 
[unnec. `nub'
Don Stewart <dons@cse.unsw.edu.au>**20070309091045] 
[just use Map, not int map. strict updates don't seem to help btw.
Don Stewart <dons@cse.unsw.edu.au>**20070309083706] 
[comments on whether we lose space due to lazy updates of the stack set
Don Stewart <dons@cse.unsw.edu.au>**20070309081621] 
[don't need the unix package
Don Stewart <dons@cse.unsw.edu.au>**20070309075148] 
[sneaky inline 
Don Stewart <dons@cse.unsw.edu.au>**20070309063818] 
[little bit of strictness, based on -prof output
Don Stewart <dons@cse.unsw.edu.au>**20070309063449] 
[explicit interface on StackSet. maybe it should be a seperate package ... ?
Don Stewart <dons@cse.unsw.edu.au>**20070309061255] 
[-12 lines, refactor
Don Stewart <dons@cse.unsw.edu.au>**20070309060139] 
[refactor, -10 or so loc
Don Stewart <dons@cse.unsw.edu.au>**20070309055417] 
[more QC properties on StackSets
Don Stewart <dons@cse.unsw.edu.au>**20070309054042] 
[simpler type (no need to cache size, we *could* grow new stacks on demand now)
Don Stewart <dons@cse.unsw.edu.au>**20070309043638] 
[replace Seq [a] with IntMap [a], hopefully gets 6.4 support
Don Stewart <dons@cse.unsw.edu.au>**20070309043035] 
[simplify StackSet api even further (-15 loc)
Don Stewart <dons@cse.unsw.edu.au>**20070309041707] 
[smaller api, less tests
Don Stewart <dons@cse.unsw.edu.au>**20070309035635] 
[use new StackSet api
Don Stewart <dons@cse.unsw.edu.au>**20070309035615] 
[shrink StackSet api
Don Stewart <dons@cse.unsw.edu.au>**20070309035603] 
[Update location for X11-extras
Spencer Janssen <sjanssen@cse.unl.edu>**20070309043422] 
[comments
Don Stewart <dons@cse.unsw.edu.au>**20070309031847] 
[handle MappingNotifyEvent properly, and missing test in MapRequestEvent. firefox still won't take the keyboard though
Don Stewart <dons@cse.unsw.edu.au>**20070309030644] 
[comments
Don Stewart <dons@cse.unsw.edu.au>**20070309030640] 
[stub for MappingNotifyEvent, based on dwm. But the X11-extras binding for this event needs doing (sjanssen?)
Don Stewart <dons@cse.unsw.edu.au>**20070308130517] 
[refactoring. heads up: depends on withServer in X11-extras
Don Stewart <dons@cse.unsw.edu.au>**20070308122613] 
[comments
Don Stewart <dons@cse.unsw.edu.au>**20070308120753] 
[move W -> WMonad
Don Stewart <dons@cse.unsw.edu.au>**20070308120536] 
[forgot to add Properties.hs
Don Stewart <dons@cse.unsw.edu.au>**20070308120521] 
[move tests into subdir
Don Stewart <dons@cse.unsw.edu.au>**20070308120448] 
[Switch to using abstract StackSet data type. Most workspace logic moved into StackSet.hs
Don Stewart <dons@cse.unsw.edu.au>**20070308114308] 
[unpack on our own
Don Stewart <dons@cse.unsw.edu.au>**20070308114255] 
[cleanup only
Don Stewart <dons@cse.unsw.edu.au>**20070308021901] 
[Make the number of workspaces configurable.
Spencer Janssen <sjanssen@cse.unl.edu>**20070308043614] 
[Print a message for unhandled events
Spencer Janssen <sjanssen@cse.unl.edu>**20070308013249] 
[Manage windows that are created before thunk starts
Spencer Janssen <sjanssen@cse.unl.edu>**20070307210117] 
[Add Alt-Shift-[1..5], to move the current client to a new workspace
Don Stewart <dons@cse.unsw.edu.au>**20070308010424] 
[cleaner implementation of 'view'. Only hide the current list. And shortcut if we try to move to the same screen. No flicker
Don Stewart <dons@cse.unsw.edu.au>**20070308002134] 
[Fill in missing workspace code
Don Stewart <dons@cse.unsw.edu.au>**20070308000729
 
 How do we manage workspaces? thunk keeps a list of window lists,
 corresponding each window stack on each workspace. When you switch views
 to a different workspace it moves all windows off the screen (2*w)
 (2*h), and then moves back those in the current list. There's some
 screen flicker, we could probably be smarter about this.
 
] 
[Add support for multiple workspaces
Don Stewart <dons@cse.unsw.edu.au>**20070307111247
 
 Everything is in place for multiple workspaces, bar one thing:
 the view function. It updates thunk's idea of the current visible
 windows, but I don't know how to tell X to hide the current set, and
 instead treat the new window list as the only ones visible.
 
 See notes for 'view' at bottom of Main.hs. If we can, say, switch to a
 new workspace, which is empty, 'refresh' should spot this only display
 the root window.
 
 
] 
[no -Werror
Don Stewart <dons@cse.unsw.edu.au>**20070307111240] 
[-Wall police. and strip the binary
Don Stewart <dons@cse.unsw.edu.au>**20070307074910] 
[fmt. and use a Map for keycode lookup
Don Stewart <dons@cse.unsw.edu.au>**20070307074248] 
[xKillClient -> killClient
Spencer Janssen <sjanssen@cse.unl.edu>**20070307073010] 
[formatting and comments only
Don Stewart <dons@cse.unsw.edu.au>**20070307071926] 
[Add alt-c, kill client
Don Stewart <dons@cse.unsw.edu.au>**20070307071910] 
[dead code
Don Stewart <dons@cse.unsw.edu.au>**20070307065250] 
[need Data.List
Don Stewart <dons@cse.unsw.edu.au>**20070307064827] 
[focus left and right (mod-j/mod-k)
Don Stewart <dons@cse.unsw.edu.au>**20070307064539] 
[Plan for statusbar/multithreading
Spencer Janssen <sjanssen@cse.unl.edu>**20070307064223] 
[Add TODO
Spencer Janssen <sjanssen@cse.unl.edu>**20070307064214] 
[wibble
Don Stewart <dons@cse.unsw.edu.au>**20070307062201] 
[derive MonadState, removes most accessors
Don Stewart <dons@cse.unsw.edu.au>**20070307061532] 
[Handle several more events, should fix several issues.
Spencer Janssen <sjanssen@cse.unl.edu>**20070307060447] 
[refactoring. less code
Don Stewart <dons@cse.unsw.edu.au>**20070307055007] 
[just use [Window]
Don Stewart <dons@cse.unsw.edu.au>**20070307050139] 
[url of dmenu. it now works
Don Stewart <dons@cse.unsw.edu.au>**20070307042446] 
[typo in dmenu code
Don Stewart <dons@cse.unsw.edu.au>**20070307041921] 
[X11 1.2 works too.
Spencer Janssen <sjanssen@cse.unl.edu>**20070307041540] 
[add dmenu support, seems to work, but the resulting client isn't launched
Don Stewart <dons@cse.unsw.edu.au>**20070307034738] 
[refactoring
Don Stewart <dons@cse.unsw.edu.au>**20070307033855] 
[Wm -> W, all good monads have single capital letter names. comment the W.hs file
Don Stewart <dons@cse.unsw.edu.au>**20070307033307] 
[unbox-strict-fields
Don Stewart <dons@cse.unsw.edu.au>**20070307032249] 
[comments for Main.hs, add io_, like io but return ()
Don Stewart <dons@cse.unsw.edu.au>**20070307032139] 
[comments, rename 'l' to 'io', and state explicitly that we use GeneralizedNewtypeDeriving
Don Stewart <dons@cse.unsw.edu.au>**20070307030351] 
[move thunk.hs -> Main.hs. Be precise about which versions of every package are known to work
Don Stewart <dons@cse.unsw.edu.au>**20070307025535] 
[add more readme details for finding dependencies
Don Stewart <dons@cse.unsw.edu.au>**20070307025310] 
[depend on the X11-extras package
Don Stewart <dons@cse.unsw.edu.au>**20070307024838] 
[Flatten module hierarchy
Don Stewart <dons@cse.unsw.edu.au>**20070307022332] 
[add readme
Don Stewart <dons@cse.unsw.edu.au>**20070307022301] 
[add license stuff to .cabal
Don Stewart <dons@cse.unsw.edu.au>**20070307022252] 
[more stuff for .cabal file. Add example of include path to use on OpenBSD
Don Stewart <dons@cse.unsw.edu.au>**20070307021504] 
[Initial import.
Spencer Janssen <sjanssen@cse.unl.edu>**20070307013527] 
Patch bundle hash:
e190a9e519280616d2a2e109b990959ac993f0db
