Difference between revisions of "Xmonad/Config archive/webframp's xmonad.hs"

From HaskellWiki
Jump to navigation Jump to search
(list comprehension for search bindings updated)
(missing type signatures in several places)
Line 11: Line 11:
 
--
 
--
 
-- customization for the xmonad window manager
 
-- customization for the xmonad window manager
  +
-- Last Modified: 2008 Nov 04 Tue - 07:53:00
 
-----------------------------------------------------------------------
 
-----------------------------------------------------------------------
 
 
-- Imports {{{
 
-- Imports {{{
import XMonad
+
import XMonad
 
-- Hooks
 
-- Hooks
 
import XMonad.Hooks.DynamicLog hiding (xmobar, xmobarPP, xmobarColor, sjanssenPP, byorgeyPP)
 
import XMonad.Hooks.DynamicLog hiding (xmobar, xmobarPP, xmobarColor, sjanssenPP, byorgeyPP)
Line 22: Line 22:
 
-- Prompt
 
-- Prompt
 
import XMonad.Prompt
 
import XMonad.Prompt
import XMonad.Prompt.RunOrRaise
+
import XMonad.Prompt.RunOrRaise (runOrRaisePrompt)
import XMonad.Prompt.Shell (shellPrompt, prompt, safePrompt)
+
import XMonad.Prompt.Window (windowPromptGoto, windowPromptBring)
import XMonad.Prompt.Workspace
+
import XMonad.Prompt.Workspace (workspacePrompt)
import XMonad.Prompt.AppendFile
+
import XMonad.Prompt.AppendFile (appendFilePrompt)
 
-- Actions
 
-- Actions
 
import XMonad.Actions.CycleWS --(nextWS, prevWS, shiftToNext, shiftToPrev, nextScreen, prevScreen, shiftNextScreen, shiftPrevScreen, toggleWS)
 
import XMonad.Actions.CycleWS --(nextWS, prevWS, shiftToNext, shiftToPrev, nextScreen, prevScreen, shiftNextScreen, shiftPrevScreen, toggleWS)
import XMonad.Actions.WindowGo (title, raise, raiseMaybe, raiseBrowser, raiseEditor, 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
 
-- Util
 
-- Util
 
import XMonad.Util.Run (safeSpawn, unsafeSpawn, runInTerm, spawnPipe)
 
import XMonad.Util.Run (safeSpawn, unsafeSpawn, runInTerm, spawnPipe)
import XMonad.Util.Scratchpad (scratchpadSpawnAction, scratchpadManageHook)
+
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)
Line 40: Line 40:
 
import XMonad.Layout.ResizableTile (ResizableTall(..))
 
import XMonad.Layout.ResizableTile (ResizableTall(..))
 
import System.IO (hPutStrLn)
 
import System.IO (hPutStrLn)
  +
import Data.Char (isSpace)
 
import qualified XMonad.StackSet as W
 
import qualified XMonad.StackSet as W
import qualified Data.Map as M
 
 
--}}}
 
--}}}
   
 
-- Main {{{
 
-- Main {{{
  +
main :: IO ()
 
main = do
 
main = do
 
dzpipe <- spawnPipe statusBarCmd
 
dzpipe <- spawnPipe statusBarCmd
Line 61: Line 62:
 
, startupHook = return () >> checkKeymap defaultConfig lacKeys
 
, startupHook = return () >> checkKeymap defaultConfig lacKeys
 
}
 
}
`additionalKeysP` lacKeys
+
`additionalKeysP` lacKeys
`additionalKeys` -- need these since a few keys are not defined in EZConfig
+
`additionalKeys`
-- Mediakeys on the Latitude D830
+
-- Mediakeys on the Latitude D830
 
[ ((0 ,0x1008ff11 ), unsafeSpawn "amixer -q set Master 2dB-" ) -- XF86AudioLowerVolume
 
[ ((0 ,0x1008ff11 ), unsafeSpawn "amixer -q set Master 2dB-" ) -- XF86AudioLowerVolume
 
, ((0 ,0x1008ff12 ), unsafeSpawn "amixer -q set Master toggle") -- XF86Audio Mute
 
, ((0 ,0x1008ff12 ), unsafeSpawn "amixer -q set Master toggle") -- XF86Audio Mute
 
, ((0 ,0x1008ff13 ), unsafeSpawn "amixer -q set Master 2dB+" ) -- XF86AudioRaiseVolume
 
, ((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
 
]
 
]
 
-- }}}
 
-- }}}
   
 
-- Config {{{
 
-- Config {{{
-- single options here, more complex settings(by comparison) get separated
+
-- single options here
 
-- }}}
 
-- }}}
   
 
-- Theme {{{
 
-- Theme {{{
  +
colorNormalBorder, colorFocusedBorder, colorNormalBG, colorNormalFG, colorFocusBG, colorFocusFG, colorFocusBO, colorUrgentBG, colorUrgentFG :: [Char]
 
colorNormalBorder = "#1c2636"
 
colorNormalBorder = "#1c2636"
 
colorFocusedBorder = "#99ff99"
 
colorFocusedBorder = "#99ff99"
Line 85: Line 87:
 
colorUrgentBG = "#ff00cc"
 
colorUrgentBG = "#ff00cc"
 
colorUrgentFG = "#00ff99"
 
colorUrgentFG = "#00ff99"
  +
barFont, barXFont, statusBarCmd, notesFile, mTerm :: [Char]
--barFont = "snap"
 
--barXFont = "-artwiz-snap-*-*-*-*-*-*-*-*-*-*-iso8859"
 
 
barFont = "terminus"
 
barFont = "terminus"
 
barXFont = "-*-terminus-*-*-*-*-14-*-*-*-*-*-*-*"
 
barXFont = "-*-terminus-*-*-*-*-14-*-*-*-*-*-*-*"
Line 97: Line 98:
 
" -ta l -expand r -e ''"
 
" -ta l -expand r -e ''"
 
notesFile = "/home/webframp/TODO"
 
notesFile = "/home/webframp/TODO"
mTerm = "urxvt"
+
mTerm = "urxvt"
   
 
-- Custom Searches
 
-- Custom Searches
  +
enro40, roen40 :: 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="
Line 122: Line 124:
   
 
-- Prompt Config {{{
 
-- Prompt Config {{{
  +
mXPConfig :: XPConfig
 
mXPConfig =
 
mXPConfig =
XPC { font = barFont
+
defaultXPConfig { font = barFont
, bgColor = colorFocusBG
+
, bgColor = colorFocusBG
, fgColor = colorNormalFG
+
, fgColor = colorNormalFG
, bgHLight = colorNormalBG
+
, bgHLight = colorNormalBG
, fgHLight = colorFocusFG
+
, fgHLight = colorFocusFG
, borderColor = "black"
+
, borderColor = "black"
, promptBorderWidth = 0
+
, promptBorderWidth = 0
, position = Bottom
+
, position = Bottom
, height = 14
+
, height = 14
, historySize = 256
+
, historySize = 256
, historyFilter = id
+
, historyFilter = id
, defaultText = ""
+
, defaultText = ""
, autoComplete = Nothing
+
, autoComplete = Nothing
, showCompletionOnTab = False
+
, showCompletionOnTab = False
}
+
}
   
  +
largeXPConfig :: XPConfig
 
largeXPConfig = mXPConfig
 
largeXPConfig = mXPConfig
 
{ font = "-*-terminus-*-*-*-*-16-*-*-*-*-*-*-*"
 
{ font = "-*-terminus-*-*-*-*-16-*-*-*-*-*-*-*"
Line 157: Line 161:
 
--}}}
 
--}}}
 
-- Window rules aka Manage Hook {{{
 
-- Window rules aka Manage Hook {{{
  +
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 --> moveTo "web" | w <- webs] ,
+
[ className =? w --> doShift "web" | w <- webs] ,
[ className =? g --> moveTo "game" | g <- games] ,
+
[ className =? g --> doShift "game" | g <- games] ,
 
[ resource =? "desktop_window" --> doIgnore
 
[ resource =? "desktop_window" --> doIgnore
, className =? "Epdfview" --> moveTo "read"
+
, className =? "Epdfview" --> doShift "read"
, title =? "mutt" --> moveTo "mail"
+
, className =? "Okular" --> doShift "read"
, title =? "irssi" --> moveTo "irc"
+
, title =? "mutt" --> doShift "mail"
  +
, title =? "irssi" --> doShift "irc"
 
, title =? "Save a Bookmark" --> doFloat
 
, title =? "Save a Bookmark" --> doFloat
 
, title =? "Add-ons" --> doFloat
 
, title =? "Add-ons" --> doFloat
, className =? "Mitter" --> moveTo "irc"
+
, className =? "Mitter" --> doShift "irc"
, className =? "Evolution" --> moveTo "mail"
+
, className =? "Evolution" --> doShift "mail"
, className =? "VirtualBox" --> moveTo "win"
+
, className =? "Shredder" --> doShift "mail"
, className =? "Tsclient" --> moveTo "win"
+
, className =? "VirtualBox" --> doShift "win"
  +
, className =? "Tsclient" --> doShift "win"
 
] ])
 
] ])
 
<+> manageDocks -- make some space
 
<+> manageDocks -- make some space
 
<+> composeOne [ isFullscreen -?> doFullFloat ]
 
<+> composeOne [ isFullscreen -?> doFullFloat ]
where floats = ["Mplayer","Gimp","Gimp-2.4","Tsclient","VirtualBox","Gtklp","smc"]
+
where floats = ["Mplayer","Gimp","Gimp-2.6","Tsclient","VirtualBox","Gtklp","smc"]
webs = ["Navigator","Gran Paradiso","Firefox", "Midori"]
+
webs = ["Navigator","Gran Paradiso","Firefox", "Midori", "Minefield"]
 
games = ["roguestar-gl","neverputt","neverball","wesnoth"]
 
games = ["roguestar-gl","neverputt","neverball","wesnoth"]
moveTo = doF . W.shift
 
   
 
-- }}}
 
-- }}}
  +
lacKeys :: [([Char], X ())]
 
lacKeys =
 
lacKeys =
 
[ ("M-p" , runOrRaisePrompt largeXPConfig { bgHLight = colorFocusFG, fgHLight = colorNormalBG })
 
[ ("M-p" , runOrRaisePrompt largeXPConfig { bgHLight = colorFocusFG, fgHLight = colorNormalBG })
, ("M-g" , runOrRaise "firefox" (className =? "Gran Paradiso"))
+
, ("M-g" , runOrRaise "firefox-nightly" (className =? "Minefield"))
, ("M-S-g" , safePromptSelection "firefox")
+
, ("M-S-g" , safePromptSelection "firefox-nightly")
, ("M-w" , workspacePrompt largeXPConfig (windows . W.view))
+
, ("M-w w" , workspacePrompt largeXPConfig (windows . W.view))
, ("M-S-w" , workspacePrompt largeXPConfig (windows . W.shift))
+
, ("M-w g" , windowPromptGoto largeXPConfig)
  +
, ("M-S-w w" , workspacePrompt largeXPConfig (windows . W.shift))
  +
, ("M-S-w g" , windowPromptBring largeXPConfig)
 
, ("M-C-n" , appendFilePrompt largeXPConfig { bgColor = colorFocusFG, fgColor = colorFocusBG } notesFile)
 
, ("M-C-n" , appendFilePrompt largeXPConfig { bgColor = colorFocusFG, fgColor = colorFocusBG } notesFile)
 
, ("M-S-z" , safeSpawn "mocp" "-G") -- play/pause
 
, ("M-S-z" , safeSpawn "mocp" "-G") -- play/pause
, ("M-S-<L>" , safeSpawn "mocp" "-r") -- rev
+
, ("M-S-," , safeSpawn "mocp" "-r") -- rev
, ("M-S-<R>" , 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-x" , unsafeSpawn "slock") -- screen lock
 
, ("M-S-x" , unsafeSpawn "slock") -- screen lock
, ("M-<Sys_Req>", unsafeSpawn "scrot '%Y-%m-%d-%H%M_$wx$h.png' -e 'mv $f ~/screenshots/'")
 
 
, ("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-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"))
Line 219: Line 227:
 
[("M-C-c " ++ k, S.selectSearch f) | (k,f) <- searchList ]
 
[("M-C-c " ++ k, S.selectSearch f) | (k,f) <- searchList ]
   
  +
searchList :: [([Char], S.SearchEngine)]
 
searchList = [ ("g", S.google)
 
searchList = [ ("g", S.google)
 
, ("h", S.hoogle)
 
, ("h", S.hoogle)

Revision as of 15:55, 4 November 2008

-----------------------------------------------------------------------
--
-- 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
-- Last Modified: 2008 Nov 04 Tue - 07:53:00
-----------------------------------------------------------------------
-- 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
-- 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)
-- Layouts 
import XMonad.Layout.NoBorders (smartBorders)
import XMonad.Layout.ResizableTile (ResizableTall(..))
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            = mLayout 
        , 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 {{{
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"
barFont, barXFont, statusBarCmd, notesFile, mTerm :: [Char]
barFont  = "terminus"
barXFont = "-*-terminus-*-*-*-*-14-*-*-*-*-*-*-*"
--}}}
statusBarCmd = "dzen2" ++ 
               " -bg '" ++ colorNormalBG ++ "'" ++
               " -fg '" ++ colorNormalFG ++ "'" ++
               " -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=" 

-- Pretty printer {{{
-- dynamiclog pretty printer for dzen
mPP h = defaultPP 
        { ppCurrent = wrap ("^fg(" ++ colorFocusFG ++ ")^bg(" ++ colorFocusBG ++ ")^p(2)") "^p(2)^fg()^bg()"
        , ppVisible = wrap ("^fg(" ++ colorNormalFG ++ ")^bg(" ++ colorNormalBG ++ ")^p(2)") "^p(2)^fg()^bg()"
        , ppSep     = " ^fg(grey60)^r(1x8)^fg() "
        , ppLayout  = dzenColor colorNormalFG "" . (\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 colorNormalBG colorUrgentBG . wrap "[" "]"
        , ppTitle   = dzenColor colorFocusFG "" . wrap "<" ">" 
        , ppOutput  = hPutStrLn h
        }
--}}}

-- Prompt Config {{{
mXPConfig :: XPConfig
mXPConfig = 
    defaultXPConfig { font                  = barFont
                    , bgColor               = colorFocusBG
                    , fgColor               = colorNormalFG
                    , bgHLight              = colorNormalBG
                    , fgHLight              = colorFocusFG
                    , borderColor           = "black"
                    , promptBorderWidth     = 0
                    , position              = Bottom
                    , height                = 14
                    , historySize           = 256
                    , historyFilter         = id
                    , defaultText           = ""
                    , autoComplete          = Nothing
                    , showCompletionOnTab   = False
                    }

largeXPConfig :: XPConfig
largeXPConfig = mXPConfig 
                { font = "-*-terminus-*-*-*-*-16-*-*-*-*-*-*-*"
                , height = 16 
                }
-- }}}

-- Layout Hook{{{
mLayout = avoidStruts $ smartBorders( 
                                     Mirror tiled                     ||| 
                                     ResizableTall 1 (3/100) (1/2) [] ||| 
                                     Full)
    where
      tiled   = Tall nmaster delta ratio
      nmaster = 1
      ratio   = toRational (2/(1+sqrt(5)::Double)) -- golden, thx Octoploid
      delta   = 0.03
--}}} 
-- 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
      , title     =? "Add-ons"         --> doFloat
      , className =? "Mitter"          --> doShift "irc"
      , className =? "Evolution"       --> doShift "mail"
      , className =? "Shredder"        --> doShift "mail"
      , className =? "VirtualBox"      --> doShift "win"
      , className =? "Tsclient"        --> doShift "win"
      ] ])
        <+> manageDocks -- make some space
        <+> composeOne [ isFullscreen -?> doFullFloat ]
            where floats = ["Mplayer","Gimp","Gimp-2.6","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 { bgHLight = colorFocusFG, fgHLight = colorNormalBG })
    , ("M-g"        , runOrRaise "firefox-nightly" (className =? "Minefield"))
    , ("M-S-g"      , safePromptSelection "firefox-nightly")
    , ("M-w w"      , workspacePrompt largeXPConfig (windows . W.view))
    , ("M-w g"      , windowPromptGoto largeXPConfig)
    , ("M-S-w w"    , workspacePrompt largeXPConfig (windows . W.shift))
    , ("M-S-w g"    , windowPromptBring largeXPConfig)
    , ("M-C-n"      , appendFilePrompt largeXPConfig { bgColor = colorFocusFG, fgColor = colorFocusBG } 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-x"      , unsafeSpawn "slock")                  -- screen lock
    , ("M-i"  , raiseMaybe (runInTerm "-title irssi" "sh -c '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 "evolution" (className =? "Evolution"))
    , ("M-e"  , safeSpawn "pcmanfm" "--no-desktop")
    , ("M-b"  , sendMessage ToggleStruts)
    , ("M-s"  , moveTo Next NonEmptyWS)
    , ("M-d"  , moveTo Prev NonEmptyWS)
    , ("M-C-s", nextWS)
    , ("M-C-d", prevWS)
    , ("M-S-s", shiftToNext)
    , ("M-S-d", shiftToPrev)
    , ("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 ]

searchList :: [([Char], S.SearchEngine)]
searchList = [ ("g", S.google)
             , ("h", S.hoogle)
             , ("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