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.
--