我想配置XMonad,以便在窗口聚焦时评估某个IO ()
函数,这样我就可以根据这个窗口改变环境的某些方面。我似乎无法在文档中找到有关此内容的任何内容,但我确定它存在,所以我可能正在寻找错误的关键字。
答案 0 :(得分:2)
XConfig
中最接近的可能是logHook :: !(X ())
。您可以获取焦点窗口并运行IO
操作来更新环境,但此挂钩被描述为"更改窗口集时要执行的操作",因此您的{{1}可以连续多次调用具有相同窗口ID的行(例如,在不更改焦点的情况下交换窗口时)。
updateEnv
答案 1 :(得分:2)
您可能想要自定义handleEventHook
。
这样的事情:
myEventHook e@(CrossingEvent {ev_event_type=t, ev_window=win})
| t == enterNotify = do
something with win
return $ All True
| t == leaveNotify = do
something else
return $ All True
| otherwise = return $ All True
答案 2 :(得分:0)
由于先前的选择,我建立了自己的。 @Leiza,我发现了如何使用clientMask
:
import XMonad
-- import Data.Monoid (All(..))
import Control.Monad (when)
...
hook :: Event -> X All
hook (AnyEvent {ev_event_type = et}) = do
when (et == focusOut) $
<action>
return (All True)
hook _ = return (All True)
...
main = do
...
clientMask = focusChangeMask .|. clientMask def
...
@Leiza是正确的,对我来说 CrossingEvents 无法正常工作。