2014-04-26 76 views
2

我想配置XMonad,以便在窗口關注時對某個IO()函數進行評估,這樣我就可以根據這是哪個窗口來更改環境的某些方面。我似乎無法在文檔中找到任何有關此信息的內容,但我確定它存在,因此推測我正在尋找錯誤的關鍵字。XMonad焦點鉤子

+0

你們是不是要執行時,聚焦一個特定的窗口操作,或當集中的任何窗口?後者比前者要困難得多(我不熟悉任何提供所謂的焦點鉤子的模塊)。 – acomar

+0

當一個特定的窗口聚焦時,如果我沒有聚焦時也可能發生某些事情,那就沒事了。 –

回答

2

最接近的東西可能是logHook :: !(X())XConfig。您可以獲得焦點窗口並運行您的IO操作來更新環境,但此鉤子被描述爲「更改窗口集時執行的操作」,因此您的updateEnv可以在同一個窗口中連續調用多次ID(例如,當您切換窗口而不更改焦點時)。

myLogHook = gets (peek . windowset) >>= liftIO . updateEnv 
    where 
    updateEnv :: Maybe Window -> IO() 
    updateEnv = undefined 
+0

我認爲這是我想要的;一旦我有時間來驗證它是否有效,我會鼓勵並接受它。 –

2

您可能想要自定義handleEventHook

事情是這樣的:

myEventHook [email protected](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 
+0

因爲'CrossingEvent'與鼠標指針綁定,所以當你使用鍵盤改變焦點時,除非你使用'XMonad.Actions.UpdatePointer'來使指針跟隨,否則它不會做任何事情。 – raymonad

+0

@raymonad focusIn/focusOut將是正確的事件,但它似乎不可能得到它們(我嘗試使用AnyEvent)。我不知道爲什麼。 – Leiaz

+0

@Leiaz我認爲你需要改變XMonad使用的clientMask。 ([xmonad.org/docu](http://xmonad.org/xmonad-docs/xmonad/src/XMonad-Operations.html#clientMask))。當然,有一種方法可以將'focusChangeMask'添加到它,但我不知道如何。 – anthonybrice