Ich verwende dynamicLogWithPP
von XMonad.Hooks.DynamicLog
zusammen mit dzen2 als Statusleiste unter Xmonad. Eines der Dinge, die ich gerne in der Leiste anzeigen würde, ist die Zeit, die in dem aktuell spielenden Track in kühnen (falls vorhanden) verbleibt. diese Informationen zu erhalten ist einfach:Kann das LogHook von xmonad in festgelegten Intervallen ausgeführt werden und nicht nur als Reaktion auf Layout-Ereignisse?
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
So kann ich das in ppExtras
halten und es funktioniert gut — außer es wird nur ausgeführt, wenn die logHook
fuehrt wird, und das geschieht nur, wenn eine geeignete Veranstaltung auf den Hecht kommt . Daher ist die Anzeige möglicherweise für eine lange Zeit möglicherweise statisch, bis ich (z. B.) Arbeitsbereiche umschalte.
Es sieht so aus, als würden einige Leute nur zwei Dutzend Bars laufen lassen, wobei eine Ausgabe von einem Shell-Skript weitergeleitet wird. Ist das die einzige Möglichkeit, regelmäßige Updates zu haben? Oder kann dies innerhalb von xmonad getan werden (ohne zu verrückt/hacky zu werden)?
ETA: Ich habe versucht, das, was scheint, als ob es sollte besser funktionieren, als es:
- eine Tchan für Updates von XMonad erstellen, und eine andere für Updates von einer Funktion Polling Audacious;
- setzen Sie das
ppOutput
Feld in der Struktur vonDynamicLog
, um zum ersten TChan zu schreiben; - fork die kühnen-polling-funktion und haben es schreiben auf die zweite TChan;
- Fork eine Funktion zum Lesen von beiden TChans (Überprüfung, dass sie nicht leer sind, zuerst), und die Kombination der Ausgabe.
Updates von XMonad werden aus dem Kanal gelesen und in einer angemessenen Art und Weise verarbeitet, aber Updates von Audacious sind so gut wie gar — alle fünf oder so Sekunden bestenfalls registriert. Es scheint, als ob ein Ansatz in dieser Richtung funktionieren müsste.
Ich habe meine Antwort mit ein wenig Erklärung darüber, warum Ihre vorgeschlagene "TChan" -Lösung - und andere basierend auf mehreren Threads - nicht richtig funktioniert. –
Danke für das Update. –