Estoy usando dynamicLogWithPP
desde XMonad.Hooks.DynamicLog
junto con dzen2 como una barra de estado bajo xmonad. Una de las cosas que me gustaría que se muestre en la barra es el tiempo restante en la pista que se está reproduciendo en audaz (si existe). Obtener esta información es fácil:¿se puede ejecutar logHook de xmonad en intervalos establecidos en lugar de en (meramente) responder a eventos de diseño?
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
Así que puede pegarse de que en ppExtras
y funciona bien — excepto que sólo se ejecute cuando el logHook
se ejecute, y que sólo ocurre cuando un evento adecuado llega pronto al mercado . Por lo tanto, la pantalla es potencialmente estática durante un tiempo prolongado, hasta que yo (por ejemplo) cambie de espacio de trabajo.
Parece que algunas personas solo ejecutan dos barras de dzen, y una obtiene la salida de un script de shell. ¿Es esa la única forma de tener actualizaciones regulares? ¿O puede hacerse desde dentro de xmonad (sin volverse demasiado loco/hacky)?
ETA: He intentado esto, que parece como si debería funcionar mejor de lo que lo hace:
- crear un TCHAN para recibir actualizaciones de xmonad, y otro para las actualizaciones de un sondeo de la función audaz;
- establece el campo
ppOutput
en la estructuraPP
desdeDynamicLog
para escribir en el primer TChan; - bifurque la audaz función de sondeo y pídales que escriban en el segundo TChan;
- fork una función para leer desde ambos TChans (verificando que no estén vacíos, primero) y combinar la salida.
actualizaciones de xmonad se leen desde el canal y se procesa en el momento oportuno, pero las actualizaciones de audaz apenas están registrados en absoluto — cada cinco segundos más o menos en el mejor. Sin embargo, parece que algún enfoque en esta línea debería funcionar.
He actualizado mi respuesta con un poco de explicación acerca de por qué su solución 'TChan' propuesta, y otras basadas en tener varios hilos, no funciona correctamente. –
Gracias por la actualización. –