On Sat, Feb 11, 2012 at 17:46, Toby Cubitt <tsc25@cantab.net> wrote:
I'm trying to write a Managehook that only shifts a window to workspace
if that workspace is empty. But I'm quickly realising I don't have a good
enough grasp of Xmonad types, and Haskell monads in general, to get it to
work.

So far, the closest I think I've got is the following:

myManageHook = [ className =? "mutt" --> doShiftEmpty "email" ]
              where doShiftEmpty t = when (isEmpty t) (doShift t)
                    isEmpty t = do wsl <- gets $ W.workspaces . windowset
                                   let mws = find (\ws -> W.tag ws == t) wsl
                                   return $ maybe True (isNothing . W.stack) mws

which throws a type error:

 "Couldn't match expected type `Bool' with actual type `m0 Bool'

The problem here is that your function wants to execute in the X monad, but is actually running in the Query monad because it's in a ManageHook.  The fix is to wrap it in liftX:

    className =? "mutt" --> liftX (doShiftEmpty "email")

By the way, did you really mean className there?  mutt is terminal based; className will therefore always be the terminal program you're using, and will start with an uppercase letter.  Assuming you're using -name or similar to set the instance name for the terminal to "mutt", you probably want appName instead.

--
brandon s allbery                                      allbery.b@gmail.com
wandering unix systems administrator (available)     (412) 475-9364 vm/sms