In xmonad it can be useful to have different keybindings for different layouts, or respond to other events differently depending on the active layout. This can be accomplished by looking up the active layout in the hook. For this we define a utility function:
import XMonad
import qualified XMonad.StackSet as S
-- Get the name of the active layout.
getActiveLayoutDescription :: X String
getActiveLayoutDescription = do
workspaces <- gets windowset
return $ description . S.layout . S.workspace . S.current $ workspaces
We can use this function in keybindings as follows. Here Iām using the BinarySpacePartition layout, and my other layouts are based on Tall. Depending on whether I have BSP active or not, I send different messages.
-- ...
import XMonad.Layout.BinarySpacePartition
myKeys = [ ((mod4Mask .|. shiftMask, xK_l), do
layout <- getActiveLayoutDescription
case layout of
"BSP" -> sendMessage $ ExpandTowards R
_ -> sendMessage Expand
)
, ((mod4Mask .|. shiftMask, xK_h), do
layout <- getActiveLayoutDescription
case layout of
"BSP" -> sendMessage $ ExpandTowards L
_ -> sendMessage Shrink
)
]
Note that you can give your layouts custom names through Renamed.