Может ли logHook xmonad запускаться с заданными интервалами, а не (просто) в ответ на события макета?

Я использую dynamicLogWithPPиз XMonad.Hooks.DynamicLog. вместе с dzen2 в качестве строки состояния под xmonad. Одна из вещей, которые я хотел бы отобразить на панели, — это время, оставшееся на текущей воспроизводимой дорожке в дерзком (если есть). Получить эту информацию несложно:

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, и это происходит только тогда, когда подходящее событие случается. Таким образом, дисплей потенциально статичен в течение длительного времени, пока я (например) не переключу рабочие пространства.

Кажется, что некоторые люди просто запускают два бара дзен, один из которых получает вывод из скрипта оболочки.Это единственный способ получать регулярные обновления? Или это можно сделать изнутри xmonad (без ума/хакерства)?

ETA: я попробовал это, кажетсячто оно должно работать лучше, чем оно есть на самом деле:

  1. создать TChan для обновлений от XMonad и еще один для обновлений от функции, опрашивающей Audacious;
  2. установить поле ppOutputв структуре PPиз DynamicLogдля записи в первый TChan;
  3. разветвить функцию дерзкого опроса и заставить ее писать во второй TChan;
  4. создайте функцию для чтения из обоих TChan (сначала проверив, что они не пусты) и объединив вывод.

Обновления от XMonad считываются из канала и своевременно обрабатываются, но обновления от Audacious практически не регистрируются — в лучшем случае каждые пять секунд или около того. Однако кажется, что какой-то подход в этом направлении должен сработать.

5
задан ben w 15 June 2012 в 08:09
поделиться