Xmonad/Config archive/webframp's xmonad.hs
< Xmonad | Config archive
Jump to navigation
Jump to search
-----------------------------------------------------------------------
--
-- Module : xmonad.hs
-- Copyright : (c) Sean Escriva 2008
-- License : BSD3-style (see LICENSE)
--
-- Maintainer : sean.escriva@gmail.com
-- Stability : unstable
-- Portability : not portable,
--
-- customization for the xmonad window manager
-----------------------------------------------------------------------
-- Imports {{{
import XMonad
-- Hooks
import XMonad.Hooks.DynamicLog hiding (xmobar, xmobarPP, xmobarColor, sjanssenPP, byorgeyPP)
import XMonad.Hooks.UrgencyHook (withUrgencyHook, NoUrgencyHook(..), focusUrgent)
import XMonad.Hooks.ManageDocks (avoidStruts, manageDocks, ToggleStruts(..))
import XMonad.Hooks.ManageHelpers
-- Prompt
import XMonad.Prompt
import XMonad.Prompt.RunOrRaise (runOrRaisePrompt)
import XMonad.Prompt.Window (windowPromptGoto, windowPromptBring)
import XMonad.Prompt.Workspace (workspacePrompt)
import XMonad.Prompt.AppendFile (appendFilePrompt)
-- Actions
import XMonad.Actions.CycleWS --(nextWS, prevWS, shiftToNext, shiftToPrev, nextScreen, prevScreen, shiftNextScreen, shiftPrevScreen, toggleWS)
import XMonad.Actions.WindowGo (title, raiseMaybe, runOrRaise, (=?))
import XMonad.Actions.UpdatePointer
import qualified XMonad.Actions.Search as S
import qualified XMonad.Actions.GridSelect
-- Util
import XMonad.Util.Run (safeSpawn, unsafeSpawn, runInTerm, spawnPipe)
import XMonad.Util.Scratchpad (scratchpadSpawnAction, scratchpadManageHook) --, scratchpadFilterOutWorkspace)
import XMonad.Util.XSelection (safePromptSelection)
import XMonad.Util.EZConfig hiding (additionalMouseBindings, removeMouseBindings)
import Xmonad.Util.WorkspaceCompare (getSortByIndex)
-- Layouts
import XMonad.Layout.NoBorders (smartBorders)
import XMonad.Layout.ResizableTile (ResizableTall(..))
import XMonad.Layout.Grid (Grid(..))
import XMonad.Layout.Magnifier (magnifiercz)
import XMonad.Layout.PerWorkspace (onWorkspace)
import XMonad.Layout.IM
import XMonad.Layout.Reflect (reflectHoriz)
import System.IO (hPutStrLn)
import Data.Char (isSpace)
import qualified XMonad.StackSet as W
--}}}
-- Main {{{
main :: IO ()
main = do
dzpipe <- spawnPipe statusBarCmd
xmonad $ withUrgencyHook NoUrgencyHook $ defaultConfig
{ terminal = mTerm
, focusFollowsMouse = False
, borderWidth = 1
, modMask = mod4Mask -- win key
, numlockMask = mod2Mask
, workspaces = ["mail","web","code","irc","term","read","game","art","win"]
, normalBorderColor = colorNormalBorder
, focusedBorderColor = colorFocusedBorder
, layoutHook = avoidStruts $
smartBorders (
onWorkspace "term" grids $
onWorkspace "web" mostlyTall $
onWorkspace "art" gimp $
standardLayouts)
, manageHook = mManageHook
, logHook = (dynamicLogWithPP $ mPP dzpipe) >> updatePointer (Relative 0.95 0.95)
, startupHook = return () >> checkKeymap defaultConfig lacKeys
}
`additionalKeysP` lacKeys
`additionalKeys`
-- Mediakeys on the Latitude D830
[ ((0 ,0x1008ff11 ), unsafeSpawn "amixer -q set Master 2dB-" ) -- XF86AudioLowerVolume
, ((0 ,0x1008ff12 ), unsafeSpawn "amixer -q set Master toggle") -- XF86Audio Mute
, ((0 ,0x1008ff13 ), unsafeSpawn "amixer -q set Master 2dB+" ) -- XF86AudioRaiseVolume
, ((0 ,xK_Print ), unsafeSpawn "scrot '%Y-%m-%d-%H%M_$wx$h.png' -e 'mv $f ~/screenshots/'") -- Print Screen
]
-- }}}
-- Config {{{
-- single options here
-- }}}
-- Theme {{{
-- Color names are easier to remember
colorNormalBorder, colorFocusedBorder, colorNormalBG, colorNormalFG, colorFocusBG, colorFocusFG, colorFocusBO, colorUrgentBG, colorUrgentFG :: [Char]
colorNormalBorder = "#1c2636"
colorFocusedBorder = "#99ff99"
colorNormalBG = "#1e1e27"
colorNormalFG = "#cfbfad"
colorFocusFG = "#33ccff"
colorFocusBG = "#1C2636"
colorFocusBO = "#99ffcc"
colorUrgentBG = "#ff00cc"
colorUrgentFG = "#00ff99"
colorNormalBorder, colorFocusedBorder :: [Char]
colorNormalBorder = "#1c2636"
colorFocusedBorder = "#2797d8"
barFont, barXFont, statusBarCmd, notesFile, mTerm :: [Char]
barFont = "terminus"
barXFont = "-*-terminus-*-*-*-*-14-*-*-*-*-*-*-*"
--}}}
statusBarCmd = "dzen2" ++
" -bg '" ++ colorDarkGray ++ "'" ++
" -fg '" ++ colorBlue ++ "'" ++
" -sa c" ++
" -fn '" ++ barXFont ++ "'" ++
" -ta l -expand r -e ''"
notesFile = "/home/webframp/TODO"
mTerm = "urxvt"
-- Custom Searches
enro40, roen40 :: S.SearchEngine
enro40 = S.searchEngine "enro40" "http://dictionare.com/phpdic/enro40.php?field0="
roen40 = S.searchEngine "roen40" "http://dictionare.com/phpdic/roen40.php?field0="
hayoo = S.searchEngine "hayoo" "http://holumbus.fh-wedel.de/hayoo/hayoo.html?query="
-- Pretty printer {{{
-- dynamiclog pretty printer for dzen
mPP h = defaultPP
{ ppCurrent = wrap ("^fg(" ++ colorOrange ++ ")^bg(" ++ colorDarkGray ++ ")^p(2)") "^p(2)^fg()^bg()"
, ppVisible = wrap ("^fg(" ++ colorBlue ++ ")^bg(" ++ colorDarkGray ++ ")^p(2)") "^p(2)^fg()^bg()"
, ppSep = " ^fg(grey60)^r(1x8)^fg() "
, ppLayout = dzenColor colorWhite "" . (\x -> case x of
"Mirror Tall" -> "^i(/home/webframp/.xmonad/dzen/mtall.xbm)"
"ResizableTall" -> "^i(/home/webframp/.xmonad/dzen/tall.xbm)"
"Full" -> "^i(/home/webframp/.xmonad/dzen/full.xbm)"
_ -> " " ++ x ++ " "
)
, ppUrgent = dzenColor colorDarkGray colorYellow . wrap "[" "]"
, ppTitle = dzenColor colorWhite "" . wrap "<" ">"
, ppOutput = hPutStrLn h
}
--}}}
-- Prompt Config {{{
mXPConfig :: XPConfig
mXPConfig =
defaultXPConfig { font = barFont
, bgColor = colorDarkGray
, fgColor = colorGreen
, bgHLight = colorGreen
, fgHLight = colorDarkGray
, promptBorderWidth = 0
, height = 14
, historyFilter = deleteConsecutive
}
largeXPConfig :: XPConfig
largeXPConfig = mXPConfig
{ font = "-*-terminus-*-*-*-*-16-*-*-*-*-*-*-*"
, height = 16
}
-- }}}
-- Layout Hook{{{
standardLayouts = Mirror tiled |||
defaultTall |||
Full
where
tiled = Tall nmaster delta ratio
defaultTall = ResizableTall 1 (3/100) (1/2) []
nmaster = 1
ratio = toRational (2/(1+sqrt(5)::Double)) -- golden, thx Octoploid
delta = 0.03
grids = magnifiercz 1.2 (GridRatio (4/3)) |||
GridRatio (4/3)
mostlyTall = ResizableTall 1 (3/100) (1/2) [] ||| Full
gimp = reflectHoriz $
withIM (11/64) (Role "gimp-toolbox") $
ResizableTall 2 (1/118) (11/20) [5/4,5/4,5/4]
--}}}
-- Window rules aka Manage Hook {{{
mManageHook :: ManageHook
mManageHook = scratchpadManageHook (W.RationalRect 0.25 0.375 0.5 0.35) <+>
(composeAll . concat $
[ [ className =? c --> doFloat | c <- floats ],
[ className =? w --> doShift "web" | w <- webs] ,
[ className =? g --> doShift "game" | g <- games] ,
[ resource =? "desktop_window" --> doIgnore
, className =? "Epdfview" --> doShift "read"
, className =? "Okular" --> doShift "read"
, title =? "mutt" --> doShift "mail"
, title =? "irssi" --> doShift "irc"
, title =? "Save a Bookmark" --> doFloat
, className =? "Mitter" --> doShift "irc"
, className =? "Evolution" --> doShift "mail"
, className =? "Shredder" --> doShift "mail"
, className =? "VirtualBox" --> doShift "win"
, className =? "Tsclient" --> doShift "win"
, className =? "Gimp" --> doShift "art"
, isFullscreen --> doFullFloat
, isDialog --> doCenterFloat
] ])
<+> manageDocks -- make some space
where floats = ["Mplayer","Tsclient","VirtualBox","Gtklp","smc"]
webs = ["Navigator","Gran Paradiso","Firefox", "Midori", "Minefield"]
games = ["roguestar-gl","neverputt","neverball","wesnoth"]
-- }}}
lacKeys :: [([Char], X ())]
lacKeys =
[ ("M-p" , runOrRaisePrompt largeXPConfig )
, ("M-S-p" , spawn "exe=`dmenu_path | dmenu -b` \"exec $exe\"") -- backup launcher incase prompt causes lockups
, ("M-g" , runOrRaise "firefox-nightly" (className =? "Minefield"))
, ("M-S-g" , safePromptSelection "firefox-nightly")
, ("M-w" , goToSelected defaultGSConfig)
, ("M-C-n" , appendFilePrompt largeXPConfig { bgColor = colorOrange, fgColor = colorDarkGray } notesFile)
, ("M-S-z" , safeSpawn "mocp" "-G") -- play/pause
, ("M-S-," , safeSpawn "mocp" "-r") -- rev
, ("M-S-." , safeSpawn "mocp" "-f") -- fwd
, ("M-<Esc>" , focusUrgent)
, ("M-`" , scratchpadSpawnAction defaultConfig { terminal = mTerm }) -- scratchpad
, ("M-S-l" , unsafeSpawn "slock") -- screen lock
, ("M-i" , raiseMaybe (runInTerm "-title irssi" "sh -c 'screen -D -R -S irc irssi'") (title =? "irssi"))
, ("M-S-i" , raiseMaybe (runInTerm "-title irssi" "sh -c 'ssh -t webframp@astrotrain screen -D -R -S irc irssi'") (title =? "irssi"))
, ("M-m" , raiseMaybe (runInTerm "-title mutt" "sh -c 'screen -D -R -S mail mutt'") (title =? "mutt"))
, ("M-S-m" , runOrRaise "thunderbird3" (className =? "Shredder")) -- work email
, ("M-e" , safeSpawn "pcmanfm" "--no-desktop")
, ("M-S-e" , unsafeSpawn "dolphin")
, ("M-b" , sendMessage ToggleStruts)
-- focus NonEmpty wss except scratchpad
, ("M-s", windows . W.greedyView =<< findWorkspace getSortByIndexNoSP Next NonEmptyWS 1)
, ("M-d", windows . W.greedyView =<< findWorkspace getSortByIndexNoSP Prev NonEmptyWS 1)
-- move window to NonEmpty wss except scratchpad
, ("M-S-s", windows . W.shift =<< findWorkspace getSortByIndexNoSP Next NonEmptyWS 1)
, ("M-S-d", windows . W.shift =<< findWorkspace getSortByIndexNoSP Prev NonEmptyWS 1)
-- move window to and focus NonEmpty wss except scratchpad
, ("M-C-s", shiftAndView Next)
, ("M-C-d", shiftAndView Prev)
, ("M-f" , nextScreen)
, ("M-a" , prevScreen)
, ("M-S-f", shiftNextScreen)
, ("M-S-a", shiftPrevScreen)
, ("M-z" , toggleWS)
]
++
-- Search methods
-- mapped to mod-c for 'a căuta'
[("M-c " ++ k, S.promptSearch largeXPConfig f) | (k,f) <- searchList ]
++
[("M-C-c " ++ k, S.selectSearch f) | (k,f) <- searchList ]
where -- | non-empty workspaces less scratchpad
shiftAndView dir = findWorkspace getSortByIndexNoSP dir NonEmptyWS 1
>>= \t -> (windows . W.shift $ t) >> (windows . W.greedyView $ t)
getSortByIndexNoSP =
fmap (.scratchpadFilterOutWorkspace) getSortByIndex
searchList :: [([Char], S.SearchEngine)]
searchList = [ ("g", S.google)
, ("h", hayoo)
, ("i", S.isohunt)
, ("w", S.wikipedia)
, ("d", S.dictionary)
, ("t", S.thesaurus)
, ("a", S.amazon)
, ("y", S.youtube)
, ("e", enro40)
, ("r", roen40)
]
-- vim:foldmethod=marker sw=4 sts=4 ts=4 tw=0 et ai nowrap