Я использую dynamicLogWithPP
из XMonad.Hooks.DynamicLog
. вместе с dzen2 в качестве строки состояния под xmonad. Одна из вещей, которые я хотел бы отобразить на панели, — это время, оставшееся на текущей воспроизводимой дорожке в дерзком (если есть). Получить эту информацию несложно:
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
, и это происходит только тогда, когда подходящее событие случается. Таким образом, дисплей потенциально статичен в течение длительного времени, пока я (например) не переключу рабочие пространства.
Кажется, что некоторые люди просто запускают два бара дзен, один из которых получает вывод из скрипта оболочки.Это единственный способ получать регулярные обновления? Или это можно сделать изнутри xmonad (без ума/хакерства)?
ETA: я попробовал это, кажетсячто оно должно работать лучше, чем оно есть на самом деле:
ppOutput
в структуре PP
из DynamicLog
для записи в первый TChan;Обновления от XMonad считываются из канала и своевременно обрабатываются, но обновления от Audacious практически не регистрируются — в лучшем случае каждые пять секунд или около того. Однако кажется, что какой-то подход в этом направлении должен сработать.