XMonad焦点钩子

时间:2014-04-26 17:53:15

标签: haskell x11 xmonad

我想配置XMonad,以便在窗口聚焦时评估某个IO ()函数,这样我就可以根据这个窗口改变环境的某些方面。我似乎无法在文档中找到有关此内容的任何内容,但我确定它存在,所以我可能正在寻找错误的关键字。

3 个答案:

答案 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 无法正常工作。