Xmonad/Config archive/lars' xmonad.hs
< Xmonad | Config archive
import XMonad
import XMonad.Actions.FloatKeys
import XMonad.Hooks.ManageDocks
import XMonad.Hooks.DynamicLog
import XMonad.Util.EZConfig
import XMonad.Util.Run
import XMonad.Layout.NoBorders
import XMonad.Layout.ResizableTile
import System.Exit
import qualified System.IO.UTF8
import qualified XMonad.StackSet as W
import qualified Data.Map as M
myTerminal = "sakura"
myBorderWidth = 1
myModMask = mod4Mask
myNumlockMask = mod2Mask
myWorkspaces = ["1","2","3","4","5","6","7","8","9"]
myNormalBorderColor = "#dddddd"
myFocusedBorderColor = "#ff0000"
myKeys = \c -> mkKeymap c $
-- volume key binding
[ ("M-=", spawn "aumix2pipe +10")
, ("M--", spawn "aumix2pipe -10")
-- moc, music player
, ("M-p p", spawn "mocp --toggle-pause")
, ("M-p n", spawn "mocp --next")
, ("M-p S-n", spawn "mocp --previous")
-- launch programs
, ("M-r b b s", spawn "pcmanx")
, ("M-r c k", spawn "conkeror")
, ("M-r e", spawn "run-client 'emacsclient -c' 'emacs --daemon'")
, ("M-r f f", spawn "firefox")
, ("M-r h a l t", spawn "sudo shutdown -h now")
, ("M-r p", spawn "pidgin")
, ("M-r s d", spawn "stardict")
, ("M-r s s", spawn "scrot")
, ("M-r s S-s", spawn "scrot -s")
, ("M-r s t", spawn "killall stalonetray; stalonetray &")
, ("M-r r", spawn "gmrun")
, ("M-r t", spawn "sakura")
, ("M-r v", spawn "gvim")
-- Rotate through the available layout algorithms
, ("M-<Space>", sendMessage NextLayout)
, ("M-S-<Space>", sendMessage FirstLayout)
-- close focused window
, ("M-w", kill)
-- Resize viewed windows to the correct size
, ("M-S-r", refresh)
-- Move window focus
, ("M-j", windows W.focusDown)
, ("M-k", windows W.focusUp )
, ("M-<Return>", windows W.focusMaster )
-- Swap window
, ("M-S-j", windows W.swapDown >> windows W.focusDown)
, ("M-S-k", windows W.swapUp >> windows W.focusUp)
, ("M-S-<Return>", windows W.swapMaster)
-- Resize the master area
, ("M-h", sendMessage Shrink)
, ("M-l", sendMessage Expand)
, ("M-S-h", sendMessage MirrorShrink)
, ("M-S-l", sendMessage MirrorExpand)
-- toggle float/sink
, ("M-t", withFocused $ windows . W.sink)
-- Change the number of windows in the master area
, ("M-,", sendMessage (IncMasterN 1))
, ("M-.", sendMessage (IncMasterN (-1)))
-- Toggle the status bar gap
, ("M-g", sendMessage ToggleStruts)
-- Quit xmonad
, ("M-S-q", io (exitWith ExitSuccess))
-- Restart xmonad
, ("M-q", restart "xmonad" True)
] ++
-- mod-[1..9], Switch to workspace N
-- mod-shift-[1..9], Move client to workspace N
[(m ++ (show k), windows $ f i)
| (i, k) <- zip (XMonad.workspaces c) [1 .. 9]
, (f, m) <- [(W.greedyView, "M-"), (W.shift, "M-S-")]
] ++
-- moving floating window with key
[(c ++ m ++ k, withFocused $ f (d x))
| (d, k) <- zip [\a->(a, 0), \a->(0, a), \a->(0-a, 0), \a->(0, 0-a)] ["<Right>", "<Down>", "<Left>", "<Up>"]
, (f, m) <- zip [keysMoveWindow, \d -> keysResizeWindow d (0, 0)] ["M-", "M-S-"]
, (c, x) <- zip ["", "C-"] [20, 2]
]
------------------------------------------------------------------------
-- Mouse bindings: default actions bound to mouse events
--
myMouseBindings (XConfig {XMonad.modMask = modMask}) = M.fromList $
-- mod-button1, Set the window to floating mode and move by dragging
[ ((modMask, button1), (\w -> focus w >> mouseMoveWindow w))
-- mod-button2, Raise the window to the top of the stack
, ((modMask, button2), (\w -> focus w >> windows W.swapMaster))
-- mod-button3, Set the window to floating mode and resize by dragging
, ((modMask, button3), (\w -> focus w >> mouseResizeWindow w))
-- you may also bind events to the mouse scroll wheel (button4 and button5)
]
------------------------------------------------------------------------
-- Layouts:
myLayout = avoidStruts (smartBorders Full ||| smartBorders tiled ||| smartBorders (Mirror tiled))
where
tiled = ResizableTall 1 (1/100) (1/2) []
------------------------------------------------------------------------
-- Window rules:
myManageHook = composeAll
[ className =? "MPlayer" --> doFloat
, className =? "Gimp" --> doFloat
, className =? "Stardict" --> doFloat
, className =? "Smplayer" --> doFloat
, className =? "Wicd-client.py" --> doFloat
, className =? "Gxmessage" --> doFloat
, className =? "Pidgin" --> doShift "4"
, className =? "Conkeror" --> doShift "2"
, className =? "Emacs" --> doShift "3"
, className =? "Shiretoko" --> doShift "2"
, className =? "Gvim" --> doShift "3"
, resource =? "desktop_window" --> doIgnore
, className =? "stalonetray" --> doIgnore ]
-- Whether focus follows the mouse pointer.
myFocusFollowsMouse = True
------------------------------------------------------------------------
-- Startup hook
-- Perform an arbitrary action each time xmonad starts or is restarted
-- with mod-q. Used by, e.g., XMonad.Layout.PerWorkspace to initialize
-- per-workspace layout choices.
--
-- By default, do nothing.
myStartupHook = return ()
------------------------------------------------------------------------
-- Status bars and logging
-- >myLogHook = dynamicLogDzen
-- statusBarCmd= "xmobar /home/lars/.xmonad/xmobarrc"
statusBarCmd= "xmobar /home/lars/.xmobarrc"
-- dynamiclog pretty printer
myPP h = defaultPP
{
ppCurrent = xmobarColor "red" ""
, ppHidden = xmobarColor "#ffcc00" ""
-- , ppUrgent = wrap "<fc=#0099ff>" "</fc>" . \wsId -> if (':' `elem` wsId) then drop 2 wsId else wsId
, ppSep = " | "
, ppTitle = xmobarColor "#aabbcc" ""
, ppLayout = \s -> xmobarColor "green" "" $
case s of
"ResizableTall" -> "Tall"
"Mirror ResizableTall" -> "Wide"
"Full" -> "Full"
_ -> s
, ppOutput = System.IO.UTF8.hPutStrLn h
}
------------------------------------------------------------------------
-- Now run xmonad with all the defaults we set up.
main = do
din <- spawnPipe statusBarCmd
xmonad $ defaultConfig {
-- simple stuff
terminal = myTerminal,
focusFollowsMouse = myFocusFollowsMouse,
borderWidth = myBorderWidth,
modMask = myModMask,
numlockMask = myNumlockMask,
workspaces = myWorkspaces,
normalBorderColor = myNormalBorderColor,
focusedBorderColor = myFocusedBorderColor,
-- key bindings
keys = myKeys,
mouseBindings = myMouseBindings,
-- hooks, layouts
layoutHook = myLayout,
manageHook = myManageHook,
logHook = dynamicLogWithPP $ myPP din,
startupHook = myStartupHook
}