dynamicLogWithPP
을 XMonad.Hooks.DynamicLog
에서 xzenad의 상태 표시 줄과 함께 dzen2와 함께 사용하고 있습니다. 바에 표시하고 싶은 것들 중 하나는 현재 재생중인 트랙에 남아있는 시간 (대담한 경우)입니다. 이 정보를 얻는 것은 쉽다 :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
실행됩니다 때만 실행됩니다, 그리고 적절한 이벤트가 파이크 내려 오면 그에만 발생합니다 제외 . 따라서 I (예 :) 작업 영역을 전환 할 때까지 디스플레이가 오랫동안 정적 일 수 있습니다.
일부 사람들은 단지 두 개의 dzen bar를 실행하는 것처럼 보이는데, 하나는 출력을 쉘 스크립트에서 파이프하는 것입니다. 이것이 정기적 인 업데이트를받는 유일한 방법입니까? 또는 xmonad에서 (너무 미친/해키하지 않고)이 작업을 수행 할 수 있습니까?
ETA : 나는 그것보다 더 나은 작동합니다 것처럼 보인다 ,이 시도 :
- XMonad에서 업데이트에 대한 TChan를 작성하고 대담한 함수 폴링에서 업데이트를 다른;
DynamicLog
의PP
구조의ppOutput
필드를 첫 번째 TChan에 쓰도록 설정하십시오.- 대담한 폴링 기능을 포크하여 두 번째 TChan에 쓰도록합니다.
- 두 TChans에서 읽는 함수를 fork (먼저 비어 있지 않은지 확인)하고 출력을 결합합니다. XMonad에서
업데이트 채널에서 읽고 적시에 처리했지만 대담한에서 업데이트는 거의 매 5 정도 초 기껏 모든 —에 등록되지 않은 있습니다. 비록 이러한 라인을 따라 접근하는 것이 효과가있는 것처럼 보입니다.
제안 된'TChan' 솔루션 및 다중 스레드 기반의 다른 솔루션이 제대로 작동하지 않는 이유에 대한 설명으로 내 대답을 업데이트했습니다. –
감사합니다. –