我使用dynamicLogWithPP
從XMonad.Hooks.DynamicLog
連同dzen2作爲xmonad下的狀態欄。我想在欄中顯示的其中一件事是當前正在播放的曲目中大膽的時間(如果有的話)。得到這個信息很簡單:xmonad的logHook可以以設定的時間間隔運行,而不是僅僅響應佈局事件?
audStatus :: Player -> X (Maybe String)
audStatus p = do
info <- liftIO $ tryS $ withPlayer p $ do
ispaused <- paused
md <- getMetadataString
timeleftmillis <- (-) <$> (getCurrentTrack >>= songFrames) <*> time
let artist = md ! "artist"
title = md ! "title"
timeleft = timeleftmillis `quot` 1000
(minutes, seconds) = timeleft `quotRem` 60
disp = artist ++ " - " ++ title ++ " (-"++(show minutes)++":"++(show seconds)++")" -- will be wrong if seconds < 10
audcolor False = dzenColor base0 base03
audcolor True = dzenColor base1 base02
return $ wrap "^ca(1, pms p)" "^ca()" (audcolor ispaused disp)
return $ either (const Nothing) Just info
所以我能夠堅持,在ppExtras
,它工作正常— 除了它只有當logHook
獲取運行總是會自動運行,並在合適的事件歸結派克只會發生。因此,顯示屏可能會長時間處於靜態狀態,直到我(例如)切換工作區。
看起來好像有些人只是跑兩個酒吧,其中一個從shell腳本獲取輸出。這是定期更新的唯一方法嗎?或者,這可以從xmonad內完成(不要太瘋狂/哈克)?
ETA:我想這一點,這似乎爲如果它應該更好地工作比它:
- 從XMonad更新創建TChan,另一個用於從函數輪詢大膽更新;
- 設置
ppOutput
字段在PP
結構中從DynamicLog
寫到第一個TChan; - fork大膽輪詢功能,並寫入第二個TChan;
- 從兩個TChans中分別讀取一個函數(首先檢查它們是否爲空),然後組合輸出。
更新從XMonad從通道讀取,並及時處理,但大膽的更新,在所有—幾乎不登記每五秒左右最好。儘管如此,似乎沿着這些方向的一些方法應該起作用。
我已經更新了我的答案,並解釋了爲什麼您提出的'TChan'解決方案以及其他基於多線程的解決方案無法正常工作。 –
感謝您的更新。 –