dynamicLogWithPP
xmonad のステータス バーとしてfromXMonad.Hooks.DynamicLog
を dzen2 と共に使用しています。バーに表示したいことの 1 つは、現在再生中のトラックの残り時間 (ある場合) です。この情報は簡単に取得できます。
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
そのため、(たとえば) ワークスペースを切り替えるまで、ディスプレイは長時間静的になる可能性があります。
一部の人々は 2 つの dzen バーを実行し、そのうちの 1 つがシェル スクリプトからパイプで出力されているようです。それが定期的な更新を行う唯一の方法ですか?それとも、これを xmonad 内から行うことができますか?
ETA: 私はこれを試しました。
- XMonad からの更新用に TChannel を作成し、Audacious をポーリングする関数からの更新用に別の TChannel を作成します。
- 最初の TChannel に書き込みを行うfrom 構造体の
ppOutput
フィールドを設定します。PP
DynamicLog
- audacious-polling 関数を fork し、2 番目の TChannel に書き込みます。
- 両方の TChans から読み取る関数を fork し (最初にそれらが空でないことを確認します)、出力を結合します。
XMonad からの更新はチャネルから読み取られ、タイムリーに処理されますが、Audacious からの更新はほとんど登録されません。せいぜい 5 秒ごとです。ただし、これらの線に沿ったいくつかのアプローチが機能するはずのようです。