我使用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'解决方案以及其他基于多线程的解决方案无法正常工作。 –
感谢您的更新。 –