Tôi đang sử dụng dynamicLogWithPP
từ XMonad.Hooks.DynamicLog
cùng với dzen2 làm thanh trạng thái trong xmonad. Một trong những điều tôi muốn được hiển thị trên thanh là thời gian còn lại trong bản nhạc đang phát ở chế độ táo bạo (nếu có). Nhận được thông tin này rất dễ dàng:logHook của xmonad có thể chạy trong khoảng thời gian được đặt thay vì trả lời (chỉ đơn thuần) cho các sự kiện bố cục không?
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
Vì vậy, tôi có thể dính rằng trong ppExtras
và nó hoạt động tốt — trừ nó chỉ được chạy khi logHook
được chạy, và điều đó chỉ xảy ra khi một sự kiện phù hợp đi xuống pike . Vì vậy, màn hình có khả năng tĩnh trong một thời gian dài, cho đến khi tôi (ví dụ) chuyển đổi không gian làm việc.
Dường như một số người chỉ chạy hai thanh dzen, với một đầu ra nhận được từ một tập lệnh shell. Đó có phải là cách duy nhất để cập nhật thường xuyên không? Hoặc điều này có thể được thực hiện từ bên trong xmonad (mà không nhận được quá điên/hacky)?
ETA: Tôi cố gắng này, mà dường như như thể nó sẽ làm việc tốt hơn so với nó:
- tạo TChan các bản cập nhật từ xmonad, và một cho cập nhật từ một chức năng bỏ phiếu Audacious;
- đặt trường
ppOutput
trong cấu trúcPP
từDynamicLog
để ghi vào TChan đầu tiên; - ngã ba chức năng bỏ phiếu táo bạo và ghi nó vào TChan thứ hai;
- chia nhỏ một chức năng để đọc từ cả hai TChans (kiểm tra xem chúng có trống không, trước tiên) và kết hợp đầu ra.
Cập nhật từ XMonad được đọc từ kênh và xử lý kịp thời nhưng cập nhật từ Audacious hiếm khi được đăng ký ở tất cả — cứ 5 giây một lần. Dường như một số cách tiếp cận dọc theo những dòng này phải làm việc.
Tôi đã cập nhật câu trả lời của mình với một chút giải thích về lý do giải pháp 'TChan' được đề xuất của bạn - và các giải pháp khác dựa trên việc có nhiều luồng - không hoạt động đúng cách. –
Cảm ơn bạn đã cập nhật. –