rendered paste body-- import Control.OldException(catchDyn,try)
import Control.OldException(catchDyn)
import XMonad
import System.Exit
import XMonad.Config.Gnome
import XMonad.Layout.Circle
import XMonad.Layout.NoBorders
import XMonad.Layout.ShowWName
import XMonad.Layout.IM
import XMonad.Layout.PerWorkspace
import XMonad.Util.Run
import XMonad.Hooks.DynamicLog
import XMonad.Hooks.ManageDocks
import XMonad.Hooks.UrgencyHook
import DBus
import DBus.Connection
import DBus.Message
-- import Control.Concurrent
-- import System.Cmd
import qualified XMonad.StackSet as W
import qualified Data.Map as M
main = withConnection Session $ \ dbus -> do
getWellKnownName dbus
-- spawn "feh --bg-scale ~/desktop.png"
-- xmobar <- spawnPipe "xmobar ~/.xmonad/xmobar"
xmonad $ withUrgencyHook NoUrgencyHook $ gnomeConfig{
terminal ="urxvt"
,focusFollowsMouse = False
,borderWidth = 1
,modMask = mod4Mask
,workspaces = ["dp1","dp2","dp3","ww","im","dp6","dp7","dp8","dp9"]
,normalBorderColor = "#202020"
,focusedBorderColor = "#e67817"
,keys = myKeys
,mouseBindings = myMouseBindings
,layoutHook = showWName' mySWNConfig myLayout
,manageHook = myManageHook <+> manageDocks
,logHook = dynamicLogWithPP (myPrettyPrinter dbus)
,startupHook = spawn "pidof xcompmgr || xcompmgr -cC -r 0 -D 2 > /dev/null"}
myPrettyPrinter :: Connection -> PP
myPrettyPrinter dbus = defaultPP{
ppOutput = outputThroughDBus dbus
,ppTitle = pangoColor "#e67817" . shorten 50 . pangoSanitize
,ppCurrent = pangoColor "#e67817" . wrap "[" "]" . pangoSanitize
,ppVisible = pangoColor "#663366" . wrap "(" ")" . pangoSanitize
,ppHidden = wrap " " " "
,ppUrgent = pangoColor "green"}
-- 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)
-- getWellKnownName dbus)
where
tryGetName = do
namereq <- newMethodCall serviceDBus pathDBus interfaceDBus "RequestName"
addArgs namereq [String "org.xmonad.Log", Word32 5]
sendWithReplyAndBlock dbus namereq 0
return ()
outputThroughDBus :: Connection -> String -> IO ()
outputThroughDBus dbus str = do
let str' = "<span font=\"Ubuntu\">" ++ str ++ "</span>"
-- let str' = "<span>" ++ str ++ "</span>"
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 = "<span foreground=\"" ++ fg ++ "\">"
right = "</span>"
--pangoSanitize :: String -> String
--pangoSanitize = foldr sanitize ""
-- where
-- sanitize '>' acc = ">" ++ acc
-- sanitize '<' acc = "<" ++ acc
-- sanitize '\"' acc = """ ++ acc
-- sanitize '&' acc = "&" ++ acc
-- sanitize x acc = x:acc
pangoSanitize :: String -> String
pangoSanitize = concat . map sanitize
where
sanitize '>' = ">"
sanitize '<' = "<"
sanitize '\"' = """
sanitize '&' = "&"
sanitize x = x:[]
-- startNitrogen :: IO ()
-- startNitrogen = do
-- threadDelay (5 * 1000 * 1000)
-- try_ $ rawSystem "nitrogen" ["--restore"]
-- try_ :: MonadIO m => IO a -> m ()
-- try_ action = liftIO $ try action >> return ()
mySWNConfig = defaultSWNConfig
{swn_font = "-xos4-terminus-bold-*-normal-*-14-*-*-*-*-*-iso10646-*"
,swn_bgcolor = "#202020"
,swn_color = "#e67817"
,swn_fade = 1/4}
-- ssworkspaces :: [String]
-- ssworkspaces = ["dp1","dp2","dp3","dp4","dp5","dp6","dp7"]
myKeys conf@(XConfig {XMonad.modMask = modMask}) = M.fromList $
[((controlMask .|. mod1Mask,xK_q),spawn $ XMonad.terminal conf)
,((controlMask .|. mod4Mask,xK_a),safeSpawn "firefox" [])
,((mod1Mask .|. mod4Mask,xK_a),safeSpawn "gajim" [])
,((mod4Mask,xK_Up),safeSpawn "amixer" ["set","PCM","5%+","-q"])
,((mod4Mask,xK_Down),safeSpawn "amixer" ["set","PCM","5%-","-q"])
,((0,xK_Print),safeSpawn "scrot" ["~/scrots/%m-%d-%T_scrot.png"])
,((mod1Mask,xK_x),withFocused $ windows . W.sink)
,((mod1Mask,xK_q),safeSpawn "xkill" [])
,((mod1Mask,xK_w),kill)
--, ((mod1Mask,xK_x), withFocused (sendMessage . expandWindowAlt) >> sendMessage Expand)
--, ("M-h", withFocused (sendMessage . shrinkWindowAlt) >> sendMessage Shrink)
-- , ((mod1Mask,xK_x), sendMessage MirrorShrink)
-- , ((mod1Mask,xK_z), sendMessage MirrorExpand)
-- close focused window
-- , ((modMask .|. shiftMask, xK_c ), kill)
-- Rotate through the available layout algorithms
, ((modMask, xK_space ), sendMessage NextLayout)
-- Reset the layouts on the current workspace to default
, ((modMask .|. shiftMask, xK_space ), setLayout $ XMonad.layoutHook conf)
-- Resize viewed windows to the correct size
, ((modMask, xK_n ), refresh)
-- Move focus to the next window
, ((mod1Mask, xK_Tab ), windows W.focusDown)
-- Move focus to the next window
, ((modMask, xK_j ), windows W.focusDown)
-- Move focus to the previous window
, ((modMask, xK_k ), windows W.focusUp )
-- Move focus to the master window
, ((modMask, xK_m ), windows W.focusMaster )
-- Swap the focused window and the master window
, ((modMask, xK_Return), windows W.swapMaster)
-- Swap the focused window with the next window
, ((modMask .|. shiftMask, xK_j ), windows W.swapDown )
-- Swap the focused window with the previous window
, ((modMask .|. shiftMask, xK_k ), windows W.swapUp )
-- Shrink the master area
, ((modMask, xK_h ), sendMessage Shrink)
-- Expand the master area
, ((modMask, xK_l ), sendMessage Expand)
-- Push window back into tiling
-- , ((modMask, xK_t ), withFocused $ windows . W.sink)
-- Increment the number of windows in the master area
, ((modMask , xK_comma ), sendMessage (IncMasterN 1))
-- Deincrement the number of windows in the master area
, ((modMask , xK_period), sendMessage (IncMasterN (-1)))
-- toggle the status bar gap
-- TODO, update this binding with avoidStruts , ((modMask , xK_b ),
-- Quit xmonad
, ((modMask .|. shiftMask, xK_q ), io (exitWith ExitSuccess))
-- Restart xmonad
, ((modMask , xK_q ), restart "xmonad" True)
]
++
--
-- mod-[1..9], Switch to workspace N
-- mod-shift-[1..9], Move client to workspace N
--
[((m .|. mod1Mask, k), windows $ f i)
| (i, k) <- zip (XMonad.workspaces conf) [xK_1 .. xK_9]
, (f, m) <- [(W.greedyView, 0), (W.shift, shiftMask)]]
++
--
-- mod-{w,e,r}, Switch to physical/Xinerama screens 1, 2, or 3
-- mod-shift-{w,e,r}, Move client to screen 1, 2, or 3
--
[((m .|. modMask, key), screenWorkspace sc >>= flip whenJust (windows . f))
| (key, sc) <- zip [xK_w, xK_e, xK_r] [0..]
, (f, m) <- [(W.view, 0), (W.shift, shiftMask)]]
myMouseBindings (XConfig {XMonad.modMask = modMask}) = M.fromList $
[((mod1Mask,button1),(\w -> focus w >> mouseMoveWindow w))
,((mod1Mask,button2),(\w -> focus w >> windows W.swapMaster))
,((mod1Mask,button3),(\w -> focus w >> mouseResizeWindow w))]
myLayout = avoidStruts $ smartBorders $ onWorkspace "im" imLayout $ standardLayouts
where
standardLayouts = tiled ||| Circle ||| Mirror tiled ||| Full
tiled = Tall nmaster delta ratio
nmaster = 1
ratio = 1/2
delta = 3/100
imLayout = withIM (1/10) (Role "roster") (standardLayouts)
-- tiled = ResizableTall 1 (2/100) (1/2) []
myManageHook = composeAll
[className =? "MPlayer" --> doFloat
,className =? "Gimp" --> doFloat
,className =? "Gajim.py" --> doShift "im"
-- ,(className =? "Gajim.py" <&&> role =? "roster") --> doFloat
,className =? "Firefox" --> doShift "ww"
-- ,(className =? "Gajim.py" <&&> role =? "roster") --> (ask >>= doF . W.sink)
]
-- where
-- role = stringProperty "WM_WINDOW_ROLE"