module Polybar (polybarLogHook, mkDbusClient) where import XMonad.Hooks.DynamicLog import Text.Printf (printf) import XMonad.Layout.IndependentScreens (marshallPP) import qualified DBus as D import qualified DBus.Client as D import qualified Codec.Binary.UTF8.String as UTF8 mkDbusClient :: IO D.Client mkDbusClient = do dbus <- D.connectSession D.requestName dbus (D.busName_ "org.xmonad.log") opts return dbus where opts = [D.nameAllowReplacement, D.nameReplaceExisting, D.nameDoNotQueue] monitorMsg :: Int -> String -> String monitorMsg = printf "{\"%d\": \"%s\"}" -- Emit a DBus signal on log updates dbusOutput :: D.Client -> String -> IO () dbusOutput dbus str = let opath = D.objectPath_ "/org/xmonad/Log" iname = D.interfaceName_ "org.xmonad.Log" mname = D.memberName_ "Update" signal = D.signal opath iname mname body = [D.toVariant $ UTF8.decodeString $ monitorMsg 0 str] in D.emit dbus $ signal { D.signalBody = body } polybarFmt :: String -> String -> String -> String polybarFmt var color elem = "%{" ++ var ++ color ++ "}" ++ elem ++ "%{" ++ var ++ "-}" polybarFg :: String -> String -> String polybarFg = polybarFmt "F" polybarBg :: String -> String -> String polybarBg = polybarFmt "B" polybarBgFg :: String -> String -> String -> String polybarBgFg bg fg = polybarBg bg . polybarFg fg polybarHook :: D.Client -> PP polybarHook dbus = def { ppOutput = dbusOutput dbus , ppCurrent = polybarBgFg "#458588" "#fbf1c7" , ppVisible = polybarFg "#ebdbb2" , ppUrgent = polybarBgFg "#cc241d" "#fbf1c7" , ppHidden = polybarFg "#ebdbb2" , ppLayout = const "" , ppHiddenNoWindows = const "" , ppTitle = shorten 100 . polybarFg "#fbf1c7" , ppSep = polybarFg "#a89974" " | " } polybarLogHook dbus = dynamicLogWithPP $ (marshallPP 0 . polybarHook) dbus