Xmonad/Config archive/skorpan's xmonad.hs

From HaskellWiki
< Xmonad‎ | Config archive
Revision as of 21:04, 15 December 2007 by Skorpan (talk | contribs) (haskell tags)
Jump to navigation Jump to search
--
-- ~/.xmonad/xmonad.hs
--

-- import the necessary libraries

import XMonad
import XMonad.ManageHook
import XMonad.Operations
import XMonad.Actions.CycleWS
import XMonad.Actions.DwmPromote
import XMonad.Actions.RotSlaves
import XMonad.Actions.RotView
import XMonad.Actions.SinkAll
import XMonad.Hooks.DynamicLog ( PP(..), dynamicLogWithPP, dzenColor, wrap, defaultPP )
import XMonad.Hooks.UrgencyHook
import XMonad.Layout.Grid
import XMonad.Layout.Maximize
import XMonad.Layout.NoBorders ( noBorders, smartBorders )
import XMonad.Layout.Tabbed
import XMonad.Layout.ToggleLayouts
import XMonad.Util.Run

import qualified XMonad.StackSet as W
import qualified XMonad.Actions.FlexibleResize as Flex
import qualified Data.Map as M
import Data.Bits ((.|.))
import Data.Ratio
import Graphics.X11
import System.IO

dmenuExec   = "exe=`dmenu_path | dmenu -b -fn '-*-terminus-*-r-normal-*-*-120-*-*-*-*-iso8859-*' -nb '#000000' -nf '#FFFFFF' -sb '#333333'` && eval \"exec $exe\""
myIconsDir  = "/home/deniz/usr/share/dzen2/icons"
myStatusBar = "dzen2 -bg '#222222' -fg '#777777' -h 16 -w 640 -sa c -e '' -fn '-*-terminus-*-r-normal-*-*-120-*-*-*-*-iso8859-*' -ta l"
 
main = do din <- spawnPipe myStatusBar
          xmonad $ defaultConfig
                     { borderWidth        = 2
                     , normalBorderColor  = "#555555"
                     , focusedBorderColor = "#dddddd"
                     , workspaces         =
                         ["1:main", "2:web", "3:dev"] ++
                         map show [4..7] ++ ["8:warez","9:music"]
                     , terminal           = "urxvt"
                     , modMask            = mod4Mask
                     , defaultGaps        = [(16,0,0,0)]
                     , manageHook         = manageHook defaultConfig <+> myManageHook
                     , logHook            = dynamicLogWithPP $ myPP din
                     , layoutHook         = toggleLayouts (noBorders Full) $
                                            smartBorders $
                                            tiled |||
                                            Mirror tiled
                                            ||| Full
                                            ||| Grid
                                            ||| tabbed shrinkText defaultTConf
                                            ||| maximize (Tall 1 (3%100) (1%2))
                     , keys               = \c -> myKeys c `M.union` keys defaultConfig c
                     , mouseBindings      = \c -> myMouse c `M.union` mouseBindings defaultConfig c
                     }
                     where
                       tiled   = Tall nmaster delta ratio
                       nmaster = 1
                       ratio   = 50%100
                       delta   = 5%100

-- application control 
--
myManageHook :: ManageHook
myManageHook = composeAll . concat $
    [ [ className   =? c                 --> doFloat | c <- myFloats]
    , [ title       =? t                 --> doFloat | t <- myOtherFloats]
    , [ resource    =? r                 --> doIgnore | r <- myIgnores]
    , [ className   =? "Firefox-bin"     --> doF (W.shift "2:web") ]
    ]
    where
        myIgnores       = []
        myFloats        = ["feh",
                           "GIMP",
                           "gimp"]
        myOtherFloats   = ["Bon Echo Preferences",
                           "Mail/News Preferences",
                           "Bon Echo - Restore Previous Session",
                           "MPlayer"] 

-- modify/add default key binds
--
myKeys conf@(XConfig {modMask = modm}) = M.fromList $
           [ ((modm, xK_p                   ), spawn dmenuExec)
           , ((modm, xK_x                   ), sendMessage ToggleLayout)
           , ((modm, xK_z                   ), toggleWS)
           , ((modm, xK_Left                ), windows W.focusUp)
           , ((modm, xK_Right               ), windows W.focusDown)
           , ((modm, xK_Up                  ), windows W.focusUp)
           , ((modm, xK_Down                ), windows W.focusDown)
           , ((modm, xK_Return              ), spawn $ XMonad.terminal conf)
           , ((modm .|. shiftMask, xK_Tab   ), rotSlavesUp)
           , ((modm .|. shiftMask, xK_Right ), rotView True)
           , ((modm .|. shiftMask, xK_Left  ), rotView False)
           ]
 
-- modify/add default mouse binds
-- 
myMouse (XConfig {modMask = modm}) = M.fromList $
           [ ((modm, button3), (\w -> focus w >> Flex.mouseResizeWindow w))
           , ((modm, button4), (\_ -> rotView True)) 
           , ((modm, button5), (\_ -> rotView False))
           ]

-- dynamiclog pretty printer for dzen
-- ironic that this is "pretty printer" with such fugly code.
myPP h = defaultPP 
         { ppCurrent = wrap "^fg(#ffffff)^bg(#888888)^p(3)" "^p(2)^fg()^bg()" . \wsId ->
                       if (':' `elem` wsId) then
                           drop 2 wsId
                       else wsId
         , ppVisible = wrap "^bg(grey30)^fg(grey75)^p(2)" "^p(2)^fg()^bg()"
         , ppHidden  = wrap "^fg(#ffffff)^bg()^p(2)" "^p(3)^fg()^bg()" . \wsId ->
                       if (':' `elem` wsId) then
                           drop 2 wsId
                       else wsId
         , ppHiddenNoWindows = id . \wsId ->
                               if (':' `elem` wsId) then
                                   drop 2 wsId
                               else wsId
         , ppSep     = " ^fg(#ffffff)^r(2x2)^p(2)^fg() "
         , ppWsSep   = " "
         , ppLayout  = (\x -> case x of
                                "Tall" ->
                                    " ^i(" ++ myIconsDir ++ "/tall.xbm) "
                                "Mirror Tall" ->
                                    " ^i(" ++ myIconsDir ++ "/mtall.xbm) "
                                "Full" ->
                                    " ^i(" ++ myIconsDir ++ "/full.xbm) "
                                "Grid" ->
                                    " ^i(" ++ myIconsDir ++ "/grid.xbm) "
                                "Tabbed" ->
                                    " ^i(" ++ myIconsDir ++ "/tabbed.xbm) "
                                "Maximize Tall" ->
                                    " ^i(" ++ myIconsDir ++ "/maximize.xbm) "
                       )
         , ppTitle   = dzenColor "white" ""
         , ppOutput  = hPutStrLn h
         }