
New patches:

[make mouse bindings configurable
Jason Creighton <jcreigh@gmail.com>**20070602040647] {
hunk ./Config.hs 145
+mouseBindings :: M.Map (KeyMask, Button) (Window -> X ())
+mouseBindings = M.fromList $
+    [ ((modMask, button1), (\w -> focus w >> mouseMoveWindow w))
+    , ((modMask, button2), (\w -> focus w >> swapMaster))
+    , ((modMask, button3), (\w -> focus w >> mouseResizeWindow w))
+    ]
+
hunk ./Config.hs-boot 3
-import Graphics.X11.Xlib (KeyMask)
hunk ./Config.hs-boot 4
-modMask     :: KeyMask
-numlockMask :: KeyMask
hunk ./Main.hs 76
+    grabButtons dpy rootw
+
hunk ./Main.hs 115
-cleanMask :: KeyMask -> KeyMask
-cleanMask = (complement (numlockMask .|. lockMask) .&.)
-
-------------------------------------------------------------------------
--- mouse handling
+grabButtons :: Display -> Window -> IO ()
+grabButtons dpy rootw = do
+    ungrabButton dpy anyButton anyModifier rootw
+    mapM_ (\(m,b) -> mapM_ (grab b . (m .|.)) extraModifiers) (M.keys mouseBindings)
+  where grab button mask = grabButton dpy button mask rootw False buttonPressMask
+                                      grabModeAsync grabModeSync none none
hunk ./Main.hs 122
--- | Accumulate mouse motion events
-mouseDrag :: (XMotionEvent -> IO ()) -> X ()
-mouseDrag f = do
-    XConf { theRoot = root, display = d } <- ask
-    io $ grabPointer d root False (buttonReleaseMask .|. pointerMotionMask)
-            grabModeAsync grabModeAsync none none currentTime
-    io $ allocaXEvent $ \p -> fix $ \again -> do -- event loop
-        maskEvent d (buttonReleaseMask .|. pointerMotionMask) p
-        et <- get_EventType p
-        when (et == motionNotify) $ get_MotionEvent p >>= f >> again
-    io $ ungrabPointer d currentTime
+extraModifiers :: [KeyMask]
+extraModifiers = [0, numlockMask, lockMask, numlockMask .|. lockMask ]
hunk ./Main.hs 125
-mouseMoveWindow :: Window -> X ()
-mouseMoveWindow w = withDisplay $ \d -> do
-    io $ raiseWindow d w
-    wa <- io $ getWindowAttributes d w
-    (_, _, _, ox, oy, _, _, _) <- io $ queryPointer d w
-    mouseDrag $ \(_, _, _, ex, ey, _, _, _, _, _) ->
-        moveWindow d w (fromIntegral (fromIntegral (wa_x wa) + (ex - ox)))
-                       (fromIntegral (fromIntegral (wa_y wa) + (ey - oy)))
-    float w
-
-mouseResizeWindow :: Window -> X ()
-mouseResizeWindow w = withDisplay $ \d -> do
-    io $ raiseWindow d w
-    wa <- io $ getWindowAttributes d w
-    io $ warpPointer d none w 0 0 0 0 (fromIntegral (wa_width wa))
-                                      (fromIntegral (wa_height wa))
-    mouseDrag $ \(_, _, _, ex, ey, _, _, _, _, _) ->
-        resizeWindow d w (fromIntegral (max 1 (ex - fromIntegral (wa_x wa))))
-                         (fromIntegral (max 1 (ey - fromIntegral (wa_y wa))))
-    float w
+cleanMask :: KeyMask -> KeyMask
+cleanMask = (complement (numlockMask .|. lockMask) .&.)
hunk ./Main.hs 163
-handle (ButtonEvent {ev_window = w, ev_event_type = t, ev_state = m, ev_button = b })
-    | t == buttonPress && cleanMask m == modMask && b == button1 = mouseMoveWindow w
-    | t == buttonPress && cleanMask m == modMask && b == button2 = focus w >> swapMaster
-    | t == buttonPress && cleanMask m == modMask && b == button3 = mouseResizeWindow w
-    | t == buttonPress = focus w
+handle (ButtonEvent { ev_window = w, ev_subwindow = subw, ev_event_type = t, ev_state = m, ev_button = b })
+    | t == buttonPress = do isr <- isRoot w
+                            -- If it's the root window, then it's something we
+                            -- grabbed in grabButtons. Otherwise, it's
+                            -- click-to-focus.
+                            if isr
+                                then whenJust (M.lookup (cleanMask m, b) mouseBindings) ($ subw)
+                                else focus w
hunk ./Operations.hs 18
-import {-# SOURCE #-} Config (borderWidth, modMask, numlockMask)
+import {-# SOURCE #-} Config (borderWidth)
hunk ./Operations.hs 243
-extraModifiers :: [KeyMask]
-extraModifiers = [0, numlockMask, lockMask, numlockMask .|. lockMask ]
-
hunk ./Operations.hs 245
-setButtonGrab grabAll w = withDisplay $ \d -> io $ do
-    when (not grabAll) $ ungrabButton d anyButton anyModifier w
-    mapM_ (grab d) masks
-  where masks = if grabAll then [anyModifier] else map (modMask .|.) extraModifiers
-        grab d m = grabButton d anyButton m w False (buttonPressMask .|. buttonReleaseMask)
-                                grabModeAsync grabModeSync none none
+setButtonGrab grab w = withDisplay $ \d -> io $
+    if grab
+        then grabButton d anyButton anyModifier w False buttonPressMask
+                        grabModeAsync grabModeSync none none
+        else ungrabButton d anyButton anyModifier w
hunk ./Operations.hs 433
+------------------------------------------------------------------------
+-- mouse handling
+
+-- | Accumulate mouse motion events
+mouseDrag :: (XMotionEvent -> IO ()) -> X ()
+mouseDrag f = do
+    XConf { theRoot = root, display = d } <- ask
+    io $ grabPointer d root False (buttonReleaseMask .|. pointerMotionMask)
+            grabModeAsync grabModeAsync none none currentTime
+    io $ allocaXEvent $ \p -> fix $ \again -> do -- event loop
+        maskEvent d (buttonReleaseMask .|. pointerMotionMask) p
+        et <- get_EventType p
+        when (et == motionNotify) $ get_MotionEvent p >>= f >> again
+    io $ ungrabPointer d currentTime
+
+mouseMoveWindow :: Window -> X ()
+mouseMoveWindow w = withDisplay $ \d -> do
+    io $ raiseWindow d w
+    wa <- io $ getWindowAttributes d w
+    (_, _, _, ox, oy, _, _, _) <- io $ queryPointer d w
+    mouseDrag $ \(_, _, _, ex, ey, _, _, _, _, _) ->
+        moveWindow d w (fromIntegral (fromIntegral (wa_x wa) + (ex - ox)))
+                       (fromIntegral (fromIntegral (wa_y wa) + (ey - oy)))
+    float w
+
+mouseResizeWindow :: Window -> X ()
+mouseResizeWindow w = withDisplay $ \d -> do
+    io $ raiseWindow d w
+    wa <- io $ getWindowAttributes d w
+    io $ warpPointer d none w 0 0 0 0 (fromIntegral (wa_width wa))
+                                      (fromIntegral (wa_height wa))
+    mouseDrag $ \(_, _, _, ex, ey, _, _, _, _, _) ->
+        resizeWindow d w (fromIntegral (max 1 (ex - fromIntegral (wa_x wa))))
+                         (fromIntegral (max 1 (ey - fromIntegral (wa_y wa))))
+    float w
+
}

Context:

[commented out implementation state logging. if someone has a client, we can enable this
Don Stewart <dons@cse.unsw.edu.au>**20070601085626] 
[ignore numlock/capslock on mouse bindings
Jason Creighton <jcreigh@gmail.com>**20070601015137] 
[now we handle transients properly, and restack windows, refresh from focus is ok
Don Stewart <dons@cse.unsw.edu.au>**20070601022329] 
[Rename withWorkspace to withWindowSet.
glasser@mit.edu**20070601001325] 
[Revert accidental change to border color
Spencer Janssen <sjanssen@cse.unl.edu>**20070531145509] 
[comments on why fullscreen tiling doesn't work with `implicit' floating
Don Stewart <dons@cse.unsw.edu.au>**20070531090537] 
[clean up mouse code a bit
Don Stewart <dons@cse.unsw.edu.au>**20070531085308] 
[first shot at a floating layer
Jason Creighton <jcreigh@gmail.com>**20070531044733
 
 This is a first attempting at a floating layer:
 
 mod-button1: move window
 mod-button2: swapMaster
 mod-button3: resize window
 
 mod-t: make floating window tiled again
 
 Moving or resizing a window automatically makes it floating.
 
 Known issues:
 
 Hard to manage stacking order. You can promote a window to move it to the top,
 (which you can do with mod-button2) but it should be easier than that.
 
 Moving a window by dragging it to a different Xinerama screen does not move it
 to that workspace.
 
 Code is ugly.
] 
[remove LOC cap (but still print count after tests)
Jason Creighton <jcreigh@gmail.com>**20070531043417] 
[TAG 0.2
Spencer Janssen <sjanssen@cse.unl.edu>**20070531010004] 
Patch bundle hash:
117375f1712587e94aac6130d34e614bb8deb800
