Personal tools

Xmonad/Config archive/webframp's xmonad.hs

From HaskellWiki

< Xmonad | Config archive(Difference between revisions)
Jump to: navigation, search
(color theme, layout, keybindings changed)
(updated config, small changes)
Line 8: Line 8:
 
-- Maintainer  :  sean.escriva@gmail.com
 
-- Maintainer  :  sean.escriva@gmail.com
 
-- Stability  :  unstable
 
-- Stability  :  unstable
-- Portability :  not portable,  
+
-- Portability :  not portable,
 
--
 
--
 
-- customization for the xmonad window manager
 
-- customization for the xmonad window manager
 
-----------------------------------------------------------------------
 
-----------------------------------------------------------------------
 +
 
-- Imports {{{
 
-- Imports {{{
 
import XMonad
 
import XMonad
Line 18: Line 19:
 
import XMonad.Hooks.UrgencyHook (withUrgencyHook, NoUrgencyHook(..), focusUrgent)
 
import XMonad.Hooks.UrgencyHook (withUrgencyHook, NoUrgencyHook(..), focusUrgent)
 
import XMonad.Hooks.ManageDocks (avoidStruts, manageDocks, ToggleStruts(..))
 
import XMonad.Hooks.ManageDocks (avoidStruts, manageDocks, ToggleStruts(..))
import XMonad.Hooks.ManageHelpers
+
import XMonad.Hooks.ManageHelpers (isFullscreen, isDialog,  doFullFloat, doCenterFloat)
 +
import XMonad.Hooks.SetWMName
 
-- Prompt
 
-- Prompt
 
import XMonad.Prompt
 
import XMonad.Prompt
 
import XMonad.Prompt.RunOrRaise (runOrRaisePrompt)
 
import XMonad.Prompt.RunOrRaise (runOrRaisePrompt)
import XMonad.Prompt.Window (windowPromptGoto, windowPromptBring)
 
import XMonad.Prompt.Workspace (workspacePrompt)
 
 
import XMonad.Prompt.AppendFile (appendFilePrompt)
 
import XMonad.Prompt.AppendFile (appendFilePrompt)
-- Actions  
+
-- Actions
import XMonad.Actions.CycleWS --(nextWS, prevWS, shiftToNext, shiftToPrev, nextScreen, prevScreen, shiftNextScreen, shiftPrevScreen, toggleWS)
+
import XMonad.Actions.CycleWS (nextScreen, prevScreen, shiftNextScreen, shiftPrevScreen, toggleWS, WSDirection(..), WSType(..), findWorkspace)
import XMonad.Actions.WindowGo (title, raiseMaybe, runOrRaise, (=?))
+
import XMonad.Actions.WindowGo (title, raiseMaybe, runOrRaise) --, (=?))
 
import XMonad.Actions.UpdatePointer
 
import XMonad.Actions.UpdatePointer
 
import qualified XMonad.Actions.Search as S
 
import qualified XMonad.Actions.Search as S
import qualified XMonad.Actions.GridSelect
+
import XMonad.Actions.GridSelect
 
-- Util
 
-- Util
 
import XMonad.Util.Run (safeSpawn, unsafeSpawn, runInTerm, spawnPipe)
 
import XMonad.Util.Run (safeSpawn, unsafeSpawn, runInTerm, spawnPipe)
import XMonad.Util.Scratchpad (scratchpadSpawnAction, scratchpadManageHook) --, scratchpadFilterOutWorkspace)
+
import XMonad.Util.Scratchpad (scratchpadSpawnAction, scratchpadManageHook, scratchpadFilterOutWorkspace)
 
import XMonad.Util.XSelection (safePromptSelection)
 
import XMonad.Util.XSelection (safePromptSelection)
 
import XMonad.Util.EZConfig hiding (additionalMouseBindings, removeMouseBindings)
 
import XMonad.Util.EZConfig hiding (additionalMouseBindings, removeMouseBindings)
import Xmonad.Util.WorkspaceCompare (getSortByIndex)
+
import XMonad.Util.WorkspaceCompare (getSortByIndex)
-- Layouts  
+
import XMonad.Util.Loggers
 +
-- Layouts
 
import XMonad.Layout.NoBorders (smartBorders)
 
import XMonad.Layout.NoBorders (smartBorders)
 
import XMonad.Layout.ResizableTile (ResizableTall(..))
 
import XMonad.Layout.ResizableTile (ResizableTall(..))
Line 45: Line 46:
 
import XMonad.Layout.IM
 
import XMonad.Layout.IM
 
import XMonad.Layout.Reflect (reflectHoriz)
 
import XMonad.Layout.Reflect (reflectHoriz)
 +
import XMonad.Layout.Named
  
 +
import Graphics.X11.ExtraTypes.XF86 (xF86XK_AudioMute, xF86XK_AudioLowerVolume, xF86XK_AudioRaiseVolume)
 
import System.IO (hPutStrLn)
 
import System.IO (hPutStrLn)
 
import Data.Char (isSpace)
 
import Data.Char (isSpace)
Line 55: Line 58:
 
main = do
 
main = do
 
     dzpipe <- spawnPipe statusBarCmd
 
     dzpipe <- spawnPipe statusBarCmd
     xmonad $ withUrgencyHook NoUrgencyHook $ defaultConfig  
+
     xmonad $ withUrgencyHook NoUrgencyHook $ defaultConfig
 
         { terminal              = mTerm
 
         { terminal              = mTerm
 
         , focusFollowsMouse    = False
 
         , focusFollowsMouse    = False
Line 64: Line 67:
 
         , normalBorderColor    = colorNormalBorder
 
         , normalBorderColor    = colorNormalBorder
 
         , focusedBorderColor    = colorFocusedBorder
 
         , focusedBorderColor    = colorFocusedBorder
         , layoutHook            = avoidStruts $
+
         , layoutHook            = avoidStruts $  
 
                                   smartBorders (
 
                                   smartBorders (
 
                                               onWorkspace "term" grids $
 
                                               onWorkspace "term" grids $
                                               onWorkspace "web" mostlyTall $
+
                                               onWorkspace "web" mostlyTall $
                                               onWorkspace "art" gimp $
+
                                               onWorkspace "art" gimp standardLayouts)
                                              standardLayouts)
+
 
         , manageHook            = mManageHook
 
         , manageHook            = mManageHook
 
         , logHook              = (dynamicLogWithPP $ mPP dzpipe) >> updatePointer (Relative 0.95 0.95)
 
         , logHook              = (dynamicLogWithPP $ mPP dzpipe) >> updatePointer (Relative 0.95 0.95)
         , startupHook          = return () >> checkKeymap defaultConfig lacKeys
+
         , startupHook          = return () >> checkKeymap defaultConfig lacKeys >> setWMName "LG3D"
 
         }
 
         }
 
         `additionalKeysP` lacKeys
 
         `additionalKeysP` lacKeys
         `additionalKeys`
+
         `additionalKeys` -- need these since a few keys are not defined in EZConfig
        -- Mediakeys on the Latitude D830
+
         [ ((0             ,xF86XK_AudioLowerVolume ), unsafeSpawn "amixer -q set Master 2dB-"     )
         [ ((0 ,0x1008ff11 ), unsafeSpawn "amixer -q set Master 2dB-" ) -- XF86AudioLowerVolume
+
         , ((0             ,xF86XK_AudioMute        ), unsafeSpawn "amixer -q set Master toggle"   )
         , ((0 ,0x1008ff12 ), unsafeSpawn "amixer -q set Master toggle") -- XF86Audio Mute
+
         , ((0             ,xF86XK_AudioRaiseVolume ), unsafeSpawn "amixer -q set Master 2dB+"     )
         , ((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
 
         , ((0          ,xK_Print  ), unsafeSpawn "scrot '%Y-%m-%d-%H%M_$wx$h.png' -e 'mv $f ~/screenshots/'") -- Print Screen
 
         ]
 
         ]
Line 85: Line 86:
  
 
-- Config {{{
 
-- Config {{{
-- single options here
+
-- single options here, more complex settings(by comparison) get separated
 
-- }}}
 
-- }}}
  
 
-- Theme {{{
 
-- Theme {{{
-- Color names are easier to remember
+
-- Color names are easier to remember:
colorNormalBorder, colorFocusedBorder, colorNormalBG, colorNormalFG, colorFocusBG, colorFocusFG, colorFocusBO, colorUrgentBG, colorUrgentFG :: [Char]
+
colorOrange          = "#ff7701"
colorNormalBorder    = "#1c2636"
+
colorDarkGray       = "#171717"
colorFocusedBorder  = "#99ff99"
+
colorPink            = "#e3008d"
colorNormalBG       = "#1e1e27"
+
colorGreen          = "#00aa4a"
colorNormalFG        = "#cfbfad"
+
colorBlue            = "#008dd5"
colorFocusFG        = "#33ccff"
+
colorYellow          = "#fee100"
colorFocusBG        = "#1C2636"
+
colorWhite          = "#cfbfad"
colorFocusBO        = "#99ffcc"
+
 
colorUrgentBG        = "#ff00cc"
+
colorUrgentFG        = "#00ff99"
+
colorNormalBorder, colorFocusedBorder :: [Char]
+
 
colorNormalBorder    = "#1c2636"
 
colorNormalBorder    = "#1c2636"
 
colorFocusedBorder  = "#2797d8"
 
colorFocusedBorder  = "#2797d8"
barFont, barXFont, statusBarCmd, notesFile, mTerm :: [Char]
 
 
barFont  = "terminus"
 
barFont  = "terminus"
barXFont = "-*-terminus-*-*-*-*-14-*-*-*-*-*-*-*"
+
barXFont = "inconsolata:size=14"
 +
xftFont = "xft: inconsolata-14"
 
--}}}
 
--}}}
statusBarCmd = "dzen2" ++  
+
statusBarCmd = "dzen2" ++
 
               " -bg '" ++ colorDarkGray ++ "'" ++
 
               " -bg '" ++ colorDarkGray ++ "'" ++
 
               " -fg '" ++ colorBlue ++ "'" ++
 
               " -fg '" ++ colorBlue ++ "'" ++
 
               " -sa c" ++
 
               " -sa c" ++
 
               " -fn '" ++ barXFont ++ "'" ++
 
               " -fn '" ++ barXFont ++ "'" ++
               " -ta l -expand r -e ''"
+
               " -w 1920 -x 0 -y 0 -ta l -e ''"
 
notesFile = "/home/webframp/TODO"
 
notesFile = "/home/webframp/TODO"
mTerm    = "urxvt"
+
mTerm    = "urxvtc"
  
 
-- Custom Searches
 
-- Custom Searches
enro40, roen40 :: S.SearchEngine
+
enro40, roen40, hayoo :: S.SearchEngine
 
enro40 = S.searchEngine "enro40" "http://dictionare.com/phpdic/enro40.php?field0="
 
enro40 = S.searchEngine "enro40" "http://dictionare.com/phpdic/enro40.php?field0="
roen40 = S.searchEngine "roen40" "http://dictionare.com/phpdic/roen40.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="
 
hayoo = S.searchEngine "hayoo" "http://holumbus.fh-wedel.de/hayoo/hayoo.html?query="
  
 
-- Pretty printer {{{
 
-- Pretty printer {{{
 
-- dynamiclog pretty printer for dzen
 
-- dynamiclog pretty printer for dzen
mPP h = defaultPP  
+
mPP h = defaultPP
 
         { ppCurrent = wrap ("^fg(" ++ colorOrange ++ ")^bg(" ++ colorDarkGray ++ ")^p(2)") "^p(2)^fg()^bg()"
 
         { ppCurrent = wrap ("^fg(" ++ colorOrange ++ ")^bg(" ++ colorDarkGray ++ ")^p(2)") "^p(2)^fg()^bg()"
 
         , ppVisible = wrap ("^fg(" ++ colorBlue ++ ")^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() "
 
         , ppSep    = " ^fg(grey60)^r(1x8)^fg() "
 
         , ppLayout  = dzenColor colorWhite "" . (\x -> case x of
 
         , ppLayout  = dzenColor colorWhite "" . (\x -> case x of
                                                             "Mirror Tall"       -> "^i(/home/webframp/.xmonad/dzen/mtall.xbm)"
+
                                                             "Mirror Tall"                               -> pad "^i(/home/webframp/.xmonad/dzen/mtall.xbm)"
                                                             "ResizableTall"     -> "^i(/home/webframp/.xmonad/dzen/tall.xbm)"
+
                                                             "ResizableTall"                             -> pad "^i(/home/webframp/.xmonad/dzen/tall.xbm)"
                                                             "Full"             -> "^i(/home/webframp/.xmonad/dzen/full.xbm)"
+
                                                             "Full"                                     -> pad "^i(/home/webframp/.xmonad/dzen/full.xbm)"
                                                             _                  -> " " ++ x ++ " "
+
                                                             "Magnifier GridRatio 1.3333333333333333"    -> pad "^i(/home/webframp/.xmonad/dzen/mgrid.xbm)"
 +
                                                            "GridRatio 1.3333333333333333"             -> pad "^i(/home/webframp/.xmonad/dzen/grid.xbm)"
 +
                                                            "ReflectX Gimp"                            -> pad "^i(/home/webframp/.xmonad/dzen/reflectx.xbm)"
 +
                                                            _                                          -> pad x
 
                                                   )
 
                                                   )
 
         , ppUrgent  = dzenColor colorDarkGray colorYellow . wrap "[" "]"
 
         , ppUrgent  = dzenColor colorDarkGray colorYellow . wrap "[" "]"
         , ppTitle  = dzenColor colorWhite "" . wrap "<" ">"
+
         , ppTitle  = dzenColor colorWhite "" . trim
 +
        --, ppSort    = scratchpadFilterOutWorkspace
 +
        , ppExtras  = [logMail]
 
         , ppOutput  = hPutStrLn h
 
         , ppOutput  = hPutStrLn h
 
         }
 
         }
 +
    where
 +
        logMail = dzenColorL colorPink "" . wrapL mailIcon "". padL $ maildirNew mailDir
 +
        mailIcon = "^i(/home/webframp/.dzen/icons/dzen_bitmaps/envelope.xbm)"
 +
        mailDir = "/home/webframp/.mail/GMAIL/INBOX"
 +
 
--}}}
 
--}}}
  
 
-- Prompt Config {{{
 
-- Prompt Config {{{
 
mXPConfig :: XPConfig
 
mXPConfig :: XPConfig
mXPConfig =  
+
mXPConfig =
 
     defaultXPConfig { font                  = barFont
 
     defaultXPConfig { font                  = barFont
 
                     , bgColor              = colorDarkGray
 
                     , bgColor              = colorDarkGray
Line 154: Line 162:
  
 
largeXPConfig :: XPConfig
 
largeXPConfig :: XPConfig
largeXPConfig = mXPConfig  
+
largeXPConfig = mXPConfig
                 { font = "-*-terminus-*-*-*-*-16-*-*-*-*-*-*-*"
+
                 { font = xftFont
                 , height = 16
+
                 , height = 20
 
                 }
 
                 }
 
-- }}}
 
-- }}}
Line 168: Line 176:
 
                   defaultTall = ResizableTall 1 (3/100) (1/2) []
 
                   defaultTall = ResizableTall 1 (3/100) (1/2) []
 
                   nmaster    = 1
 
                   nmaster    = 1
                   ratio      = toRational (2/(1+sqrt(5)::Double)) -- golden, thx Octoploid
+
                   ratio      = toRational (2/(1 + sqrt 5 :: Double)) -- golden, thx Octoploid
 
                   delta      = 0.03
 
                   delta      = 0.03
  
Line 175: Line 183:
  
 
mostlyTall = ResizableTall 1 (3/100) (1/2) [] ||| Full
 
mostlyTall = ResizableTall 1 (3/100) (1/2) [] ||| Full
 
+
gimp     = reflectHoriz $  
gimp       = reflectHoriz $  
+
          named "Gimp" $
            withIM (11/64) (Role "gimp-toolbox") $  
+
          withIM (11/64) (Role "gimp-toolbox") $  
            ResizableTall 2 (1/118) (11/20) [5/4,5/4,5/4]
+
          ResizableTall 2 (1/118) (11/20) [5/4,5/4,5/4]
--}}}  
+
--}}}
-- Window rules aka Manage Hook {{{  
+
-- Manage Hook {{{
 
mManageHook :: ManageHook
 
mManageHook :: ManageHook
mManageHook = scratchpadManageHook (W.RationalRect 0.25 0.375 0.5 0.35) <+>  
+
mManageHook = scratchpadManageHook (W.RationalRect 0.25 0.375 0.5 0.35) <+>
 
               (composeAll . concat $
 
               (composeAll . concat $
     [ [ className =? c --> doFloat       | c <- floats ],
+
     [ [ className =? c --> doFloat       | c <- floats ],
 
       [ className =? w --> doShift "web"  | w <- webs]  ,
 
       [ className =? w --> doShift "web"  | w <- webs]  ,
 
       [ className =? g --> doShift "game" | g <- games]  ,
 
       [ className =? g --> doShift "game" | g <- games]  ,
 +
      [ className =? m --> doShift "mail" | m <- mails]  ,
 
       [ resource  =? "desktop_window"  --> doIgnore
 
       [ resource  =? "desktop_window"  --> doIgnore
 
       , className =? "Epdfview"        --> doShift "read"
 
       , className =? "Epdfview"        --> doShift "read"
 
       , className =? "Okular"          --> doShift "read"
 
       , className =? "Okular"          --> doShift "read"
       , title    =? "mutt"            --> doShift "mail"
+
       , className =? "Xpdf"            --> doShift "read"
      , 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 =? "VirtualBox"      --> doShift "win"
 
       , className =? "Tsclient"        --> doShift "win"
 
       , className =? "Tsclient"        --> doShift "win"
 +
      , className =? "Vncviewer"      --> doShift "win"
 
       , className =? "Gimp"            --> doShift "art"
 
       , className =? "Gimp"            --> doShift "art"
 +
      , title    =? "irssi"          --> doShift "irc"
 +
      , title    =? "mutt"            --> doShift "mail"
 +
      , title    =? "Save a Bookmark" --> doCenterFloat
 
       , isFullscreen                  --> doFullFloat
 
       , isFullscreen                  --> doFullFloat
 
       , isDialog                      --> doCenterFloat
 
       , isDialog                      --> doCenterFloat
Line 206: Line 214:
 
                   webs  = ["Navigator","Gran Paradiso","Firefox", "Midori", "Minefield"]
 
                   webs  = ["Navigator","Gran Paradiso","Firefox", "Midori", "Minefield"]
 
                   games  = ["roguestar-gl","neverputt","neverball","wesnoth"]
 
                   games  = ["roguestar-gl","neverputt","neverball","wesnoth"]
 +
                  mails  = ["Evolution", "Thunderbird-bin", "Shredder"]
 
-- }}}
 
-- }}}
 
lacKeys :: [([Char], X ())]
 
lacKeys :: [([Char], X ())]
 
lacKeys =
 
lacKeys =
     [ ("M-p"        , runOrRaisePrompt largeXPConfig )
+
     [ ("M-p"        , runOrRaisePrompt largeXPConfig )--{ bgHLight = colorFocusFG, fgHLight = colorNormalBG })
 
     , ("M-S-p"      , spawn "exe=`dmenu_path | dmenu -b` \"exec $exe\"") -- backup launcher incase prompt causes lockups
 
     , ("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-g"        , runOrRaise "firefox-nightly" (className =? "Minefield" <||> className =? "Gran Paradiso"))
 +
    , ("M-u"        , runOrRaise "uzbl" (className =? "Uzbl" ))
 
     , ("M-S-g"      , safePromptSelection "firefox-nightly")
 
     , ("M-S-g"      , safePromptSelection "firefox-nightly")
 
     , ("M-w"        , goToSelected defaultGSConfig)
 
     , ("M-w"        , goToSelected defaultGSConfig)
 
     , ("M-C-n"      , appendFilePrompt largeXPConfig { bgColor = colorOrange, fgColor = colorDarkGray } notesFile)
 
     , ("M-C-n"      , appendFilePrompt largeXPConfig { bgColor = colorOrange, fgColor = colorDarkGray } notesFile)
     , ("M-S-z"      , safeSpawn "mocp" "-G") -- play/pause
+
     , ("M-S-z"      , safeSpawn "mocp" "-G")               -- play/pause
     , ("M-S-,"      , safeSpawn "mocp" "-r") -- rev
+
     , ("M-S-,"      , safeSpawn "mocp" "-r")               -- rev
     , ("M-S-."      , safeSpawn "mocp" "-f") -- fwd
+
     , ("M-S-."      , safeSpawn "mocp" "-f")               -- fwd
 
     , ("M-<Esc>"    , focusUrgent)
 
     , ("M-<Esc>"    , focusUrgent)
 
     , ("M-`"        , scratchpadSpawnAction defaultConfig { terminal = mTerm })  -- scratchpad
 
     , ("M-`"        , scratchpadSpawnAction defaultConfig { terminal = mTerm })  -- scratchpad
     , ("M-S-l"      , unsafeSpawn "slock")   -- screen lock
+
     , ("M-S-l"      , unsafeSpawn "slock")                 -- screen lock
 
     , ("M-i"    , raiseMaybe (runInTerm "-title irssi" "sh -c 'screen -D -R -S irc irssi'") (title =? "irssi"))
 
     , ("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-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-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-S-m"  , runOrRaise "thunderbird3" (className =? "Shredder"))
     , ("M-e"   , safeSpawn "pcmanfm" "--no-desktop")
+
     , ("M-S-e" , safeSpawn "pcmanfm" "--no-desktop")
    , ("M-S-e"  , unsafeSpawn "dolphin")
+
 
     , ("M-b"    , sendMessage ToggleStruts)
 
     , ("M-b"    , sendMessage ToggleStruts)
 
     -- focus NonEmpty wss except scratchpad
 
     -- focus NonEmpty wss except scratchpad
Line 243: Line 252:
 
     , ("M-z"  , toggleWS)
 
     , ("M-z"  , toggleWS)
 
     ]
 
     ]
     ++  
+
     ++
 
     -- Search methods
 
     -- Search methods
 
     -- mapped to mod-c for 'a căuta'
 
     -- mapped to mod-c for 'a căuta'
Line 267: Line 276:
 
             , ("r", roen40)
 
             , ("r", roen40)
 
             ]
 
             ]
 +
 
-- vim:foldmethod=marker sw=4 sts=4 ts=4 tw=0 et ai nowrap
 
-- vim:foldmethod=marker sw=4 sts=4 ts=4 tw=0 et ai nowrap
 
</haskell>
 
</haskell>

Revision as of 20:13, 5 June 2009

-----------------------------------------------------------------------
--
-- 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 (isFullscreen, isDialog,  doFullFloat, doCenterFloat)
import XMonad.Hooks.SetWMName
-- Prompt
import XMonad.Prompt
import XMonad.Prompt.RunOrRaise (runOrRaisePrompt)
import XMonad.Prompt.AppendFile (appendFilePrompt)
-- Actions
import XMonad.Actions.CycleWS (nextScreen, prevScreen, shiftNextScreen, shiftPrevScreen, toggleWS, WSDirection(..), WSType(..), findWorkspace)
import XMonad.Actions.WindowGo (title, raiseMaybe, runOrRaise) --, (=?))
import XMonad.Actions.UpdatePointer
import qualified XMonad.Actions.Search as S
import 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)
import XMonad.Util.Loggers
-- 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 XMonad.Layout.Named
 
import Graphics.X11.ExtraTypes.XF86 (xF86XK_AudioMute, xF86XK_AudioLowerVolume, xF86XK_AudioRaiseVolume)
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 >> setWMName "LG3D"
        }
        `additionalKeysP` lacKeys
        `additionalKeys` -- need these since a few keys are not defined in EZConfig
        [ ((0             ,xF86XK_AudioLowerVolume ), unsafeSpawn "amixer -q set Master 2dB-"     )
        , ((0             ,xF86XK_AudioMute        ), unsafeSpawn "amixer -q set Master toggle"   )
        , ((0             ,xF86XK_AudioRaiseVolume ), unsafeSpawn "amixer -q set Master 2dB+"     )
        , ((0           ,xK_Print   ), unsafeSpawn "scrot '%Y-%m-%d-%H%M_$wx$h.png' -e 'mv $f ~/screenshots/'") -- Print Screen
        ]
-- }}}
 
-- Config {{{
-- single options here, more complex settings(by comparison) get separated
-- }}}
 
-- Theme {{{
-- Color names are easier to remember:
colorOrange          = "#ff7701"
colorDarkGray        = "#171717"
colorPink            = "#e3008d"
colorGreen           = "#00aa4a"
colorBlue            = "#008dd5"
colorYellow          = "#fee100"
colorWhite           = "#cfbfad"
 
colorNormalBorder    = "#1c2636"
colorFocusedBorder   = "#2797d8"
barFont  = "terminus"
barXFont = "inconsolata:size=14"
xftFont = "xft: inconsolata-14"
--}}}
statusBarCmd = "dzen2" ++
               " -bg '" ++ colorDarkGray ++ "'" ++
               " -fg '" ++ colorBlue ++ "'" ++
               " -sa c" ++
               " -fn '" ++ barXFont ++ "'" ++
               " -w 1920 -x 0 -y 0 -ta l -e ''"
notesFile = "/home/webframp/TODO"
mTerm     = "urxvtc"
 
-- Custom Searches
enro40, roen40, hayoo :: 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"                               -> pad "^i(/home/webframp/.xmonad/dzen/mtall.xbm)"
                                                            "ResizableTall"                             -> pad "^i(/home/webframp/.xmonad/dzen/tall.xbm)"
                                                            "Full"                                      -> pad "^i(/home/webframp/.xmonad/dzen/full.xbm)"
                                                            "Magnifier GridRatio 1.3333333333333333"    -> pad "^i(/home/webframp/.xmonad/dzen/mgrid.xbm)"
                                                            "GridRatio 1.3333333333333333"              -> pad "^i(/home/webframp/.xmonad/dzen/grid.xbm)"
                                                            "ReflectX Gimp"                             -> pad "^i(/home/webframp/.xmonad/dzen/reflectx.xbm)"
                                                            _                                           -> pad x
                                                   )
        , ppUrgent  = dzenColor colorDarkGray colorYellow . wrap "[" "]"
        , ppTitle   = dzenColor colorWhite "" . trim
        --, ppSort    = scratchpadFilterOutWorkspace
        , ppExtras  = [logMail]
        , ppOutput  = hPutStrLn h
        }
    where
        logMail = dzenColorL colorPink "" . wrapL mailIcon "". padL $ maildirNew mailDir
        mailIcon = "^i(/home/webframp/.dzen/icons/dzen_bitmaps/envelope.xbm)"
        mailDir = "/home/webframp/.mail/GMAIL/INBOX"
 
--}}}
 
-- 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 = xftFont
                , height = 20
                }
-- }}}
 
-- 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 $ 
           named "Gimp" $ 
           withIM (11/64) (Role "gimp-toolbox") $ 
           ResizableTall 2 (1/118) (11/20) [5/4,5/4,5/4]
--}}}
-- 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]  ,
      [ className =? m --> doShift "mail" | m <- mails]  ,
      [ resource  =? "desktop_window"  --> doIgnore
      , className =? "Epdfview"        --> doShift "read"
      , className =? "Okular"          --> doShift "read"
      , className =? "Xpdf"            --> doShift "read"
      , className =? "VirtualBox"      --> doShift "win"
      , className =? "Tsclient"        --> doShift "win"
      , className =? "Vncviewer"       --> doShift "win"
      , className =? "Gimp"            --> doShift "art"
      , title     =? "irssi"           --> doShift "irc"
      , title     =? "mutt"            --> doShift "mail"
      , title     =? "Save a Bookmark" --> doCenterFloat
      , 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"]
                  mails  = ["Evolution", "Thunderbird-bin", "Shredder"]
-- }}}
lacKeys :: [([Char], X ())]
lacKeys =
    [ ("M-p"        , runOrRaisePrompt largeXPConfig )--{ bgHLight = colorFocusFG, fgHLight = colorNormalBG })
    , ("M-S-p"      , spawn "exe=`dmenu_path | dmenu -b` \"exec $exe\"") -- backup launcher incase prompt causes lockups
    , ("M-g"        , runOrRaise "firefox-nightly" (className =? "Minefield" <||> className =? "Gran Paradiso"))
    , ("M-u"        , runOrRaise "uzbl" (className =? "Uzbl" ))
    , ("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"))
    , ("M-S-e"  , safeSpawn "pcmanfm" "--no-desktop")
    , ("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