import Control.OldException(catchDyn,try)
import XMonad.Util.Run
import Control.Concurrent
import DBus
import DBus.Connection
import DBus.Message
import System.Cmd
import XMonad
import XMonad.Config.Gnome
import XMonad.Hooks.DynamicLog
import XMonad.Layout.Accordion
import XMonad.Layout.Grid
import XMonad.ManageHook
import XMonad.Prompt
import XMonad.Util.EZConfig
main = withConnection Session $ \ dbus -> do
getWellKnownName dbus
xmonad $ gnomeConfig {
terminal = "xterm",
modMask = mod4Mask, -- set the mod key to the windows key
logHook = dynamicLogWithPP (myPrettyPrinter dbus)
}
-- This retry is really awkward, but sometimes DBus won't let us get our
-- name unless we retry a couple times.
getWellKnownName :: Connection -> IO ()
getWellKnownName dbus = tryGetName `catchDyn` (\ (DBus.Error _ _) ->
getWellKnownName dbus)
where
tryGetName = do
namereq <- newMethodCall serviceDBus pathDBus interfaceDBus "RequestName"
addArgs namereq [String "org.xmonad.Log", Word32 5]
sendWithReplyAndBlock dbus namereq 0
return ()
myPrettyPrinter :: Connection -> PP
myPrettyPrinter dbus = defaultPP {
ppOutput = outputThroughDBus dbus
, ppTitle = pangoColor "#003366" . shorten 50 . pangoSanitize
, ppCurrent = pangoColor "#006666" . wrap "[" "]" . pangoSanitize
, ppVisible = pangoColor "#663366" . wrap "(" ")" . pangoSanitize
, ppHidden = wrap " " " "
, ppUrgent = pangoColor "red"
}
outputThroughDBus :: Connection -> String -> IO ()
outputThroughDBus dbus str = do
let str' = "" ++ str ++ ""
msg <- newSignal "/org/xmonad/Log" "org.xmonad.Log" "Update"
addArgs msg [String str']
send dbus msg 0 `catchDyn` (\ (DBus.Error _ _ ) -> return 0)
return ()
pangoColor :: String -> String -> String
pangoColor fg = wrap left right
where
left = ""
right = ""
pangoSanitize :: String -> String
pangoSanitize = foldr sanitize ""
where
sanitize '>' acc = ">" ++ acc
sanitize '<' acc = "<" ++ acc
sanitize '\"' acc = """ ++ acc
sanitize '&' acc = "&" ++ acc
sanitize x acc = x:acc