Xmonad/Config archive/twifkak's xmonad.hs

From HaskellWiki
< Xmonad‎ | Config archive
Revision as of 02:50, 11 November 2007 by Twifkak (talk | contribs) (greedyView -> view)
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
-- XMonad Core
import XMonad
import XMonad.Layouts
import XMonad.Operations
import qualified XMonad.StackSet as W

-- GHC hierarchical libraries
import Data.Bits ((.|.))
import qualified Data.Map as M
import Data.Ratio ((%))
import Graphics.X11.Xlib

-- Contribs
import XMonad.Actions.CycleWS
import XMonad.Actions.SwapWorkspaces
import XMonad.Actions.Submap
import XMonad.Actions.WindowBringer
import XMonad.Hooks.UrgencyHook
import XMonad.Layout.NoBorders
import XMonad.Layout.Tabbed
import XMonad.Layout.WindowNavigation

-- Get ready!
main = xmonad $ defaultConfig
                { workspaces     = workspaces'
                , modMask        = modMask'
                , numlockMask    = 0
                , layoutHook     = layoutHook'
                , terminal       = "urxvtc || urxvt"
                , mouseBindings  = mouseBindings'
                }
                `additionalKeys` keys'

modMask'    = mod4Mask

workspaces' = map show $ [1 .. 9 :: Int] ++ [0]

layoutHook' = Layout $ withUrgencyHook dzenUrgencyHook { args = ["-bg", "darkgreen", "-xs", "1"] }
                     $ configurableNavigation noNavigateBorders
                     $ layouts

layouts =     tiled
          ||| Mirror tiled
          ||| noBorders (tabbed shrinkText defaultTConf { fontName = "fixed" })
  where
     tiled   = Tall nmaster delta ratio
     nmaster = 1     -- The default number of windows in the master pane
     ratio   = 1%2   -- Default proportion of screen occupied by master pane
     delta   = 3%100 -- Percent of screen to increment by when resizing panes

-- M.union is left-biased, so we place precedence towards the user-defined keys.
additionalKeys :: XConfig -> [((ButtonMask, KeySym), X ())] -> XConfig
additionalKeys conf keysList = conf { keys = \cnf -> M.union (M.fromList keysList) (keys conf cnf) }

keys' =
    [ ((modMask' .|. shiftMask, xK_d     ), spawn "date | dzen2 -p 2 -xs 1") -- %! Print current date
    , ((modMask' .|. mod1Mask,  xK_m     ), submap $ M.fromList -- %! MPD prefix key
        [ ((modMask' .|. mod1Mask,  xK_p     ), spawn "mpc toggle") -- %! MPD: Toggle pause/play
        , ((modMask' .|. mod1Mask,  xK_m     ), spawn "mpc | head -1 | dzen2 -p 2 -xs 1") -- %! MPD: Print the currently playing song
        , ((modMask' .|. mod1Mask,  xK_comma ), spawn "mpc prev") -- %! MPD: Go to previous song
        , ((modMask' .|. mod1Mask,  xK_period), spawn "mpc next") -- %! MPD: Go to next song
        ] )
    , ((modMask' .|. mod1Mask,  xK_space ), withFocused $ \w -> hide w >> reveal w >> setFocusX w) -- %! force the window to redraw itself
    , ((modMask'              , xK_i     ), prevWS)
    , ((modMask'              , xK_o     ), nextWS)
    , ((modMask' .|. shiftMask, xK_i     ), shiftToPrev)
    , ((modMask' .|. shiftMask, xK_o     ), shiftToNext)
    , ((modMask',               xK_a     ), sendMessage $ Go L)
    , ((modMask',               xK_w     ), sendMessage $ Go U)
    , ((modMask',               xK_s     ), sendMessage $ Go D)
    , ((modMask',               xK_d     ), sendMessage $ Go R)
    , ((modMask' .|. shiftMask, xK_g     ), gotoMenu)
    , ((modMask' .|. shiftMask, xK_b     ), bringMenu)
    , ((modMask'              , xK_BackSpace), focusUrgent)
    ]
    ++
    -- modMask'-[1..9] %! Switch to workspace N
    -- modMask'-shift-[1..9] %! Move client to workspace N
    [((m .|. modMask', k), windows $ f i)
        | (i, k) <- zip workspaces' $ [xK_1 .. xK_9] ++ [xK_0]
        , (f, m) <- [(W.view, 0), (W.shift, shiftMask)]]
    ++
    -- modMask'-{e,r} %! Switch to physical/Xinerama screens 1 or 2
    -- modMask'-shift-{e,r} %! Move client to screen 1 or 2
    [((m .|. modMask', key), screenWorkspace sc >>= flip whenJust (windows . f))
        | (key, sc) <- zip [xK_e, xK_r] [0..]
        , (f, m) <- [(W.view, 0), (W.shift, shiftMask)]]
    ++
    [((modMask' .|. mod1Mask, k), windows $ swapWithCurrent i)
        | (i, k) <- zip workspaces' $ [xK_1 .. xK_9] ++ [xK_0]]

-- I have "Emulate three button mouse" turned on in Darwin X11, so mod4 (Apple) right-clicks.
-- Use ctrl-shift, instead.
mouseBindings' (XConfig {XMonad.modMask = modMask}) = M.fromList $
    -- ctrl-shift-button1 %! Set the window to floating mode and move by dragging
    [ ((controlMask .|. shiftMask, button1), (\w -> focus w >> mouseMoveWindow w))

    -- ctrl-shift-button2 %! Raise the window to the top of the stack
    , ((controlMask .|. shiftMask, button2), (\w -> focus w >> windows W.swapMaster))

    -- ctrl-shift-button3 %! Set the window to floating mode and resize by dragging
    , ((controlMask .|. shiftMask, button3), (\w -> focus w >> mouseResizeWindow w))
    ]