Sto usando dynamicLogWithPP
da XMonad.Hooks.DynamicLog
insieme a dzen2 come barra di stato sotto xmonad. Una delle cose che mi piacerebbe aver visualizzato nella barra è il tempo rimanente nella traccia in riproduzione audace (se presente). Ottenere queste informazioni è semplice:il logHook di xmonad può essere eseguito ad intervalli prestabiliti anziché in (semplicemente) risposta agli eventi di layout?
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
così posso attaccare che a ppExtras
e funziona benissimo — tranne solo viene eseguito quando l'logHook
venga eseguito, e che accade solo quando un evento adatto scende il luccio . Pertanto, il display è potenzialmente statico per un lungo periodo di tempo, fino a quando I (ad es.) Commuta gli spazi di lavoro.
Sembra che alcune persone eseguano solo due dozzine di barre, con una uscita in uscita da uno script di shell. È l'unico modo per avere aggiornamenti regolari? Oppure può essere fatto da dentro xmonad (senza diventare troppo pazzo/hacky)?
ETA: ho provato questo, che sembra come se dovrebbe funzionare meglio di quanto non faccia:
- creare un Tchan per gli aggiornamenti da XMonad, e un altro per gli aggiornamenti da una funzione di polling Audacious;
- impostare il camponella struttura
PP
daDynamicLog
per scrivere sul primo TChan; - forca la funzione di polling audace e fallo scrivere al secondo TChan;
- fork una funzione per leggere da entrambi i TChan (verificando che non siano vuoti, prima) e combinando l'output.
Aggiornamenti da XMonad vengono letti dal canale e trattati in modo tempestivo, ma gli aggiornamenti da Audacious sono difficilmente registrati affatto — ogni cinque secondi o giù di lì al meglio. Sembra come se un approccio lungo queste linee dovesse funzionare, però.
Ho aggiornato la mia risposta con un po 'di spiegazioni sul perché la vostra proposta soluzione 'TChan' - e altre basate sull'avere più thread - non funziona correttamente. –
Grazie per l'aggiornamento. –