nix-config/home/modules/desktop-xmonad/xmonad/lib/Polybar.hs

61 lines
1.9 KiB
Haskell

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