All pastes #1558067 Raw Edit

Stuff

public text v1 · immutable
#1558067 ·published 2009-09-08 06:38 UTC
rendered paste body
-- -*- haskell -*-
import Monad (liftM)
import XMonad
import XMonad.Core
import System.Exit
import qualified XMonad.StackSet as W
import qualified Data.Map        as M
import XMonad.Layout.Tabbed
import XMonad.Layout.ResizableTile
import XMonad.Layout.Grid
import XMonad.Layout.Magnifier
import XMonad.Layout.TabBarDecoration
import XMonad.Hooks.DynamicLog hiding (shorten)
import XMonad.Actions.CycleWS
--import XMonad.Actions.Search 
import XMonad.Hooks.ManageDocks
import XMonad.Hooks.EwmhDesktops
import XMonad.Actions.DwmPromote
import XMonad.Actions.UpdatePointer
import XMonad.Hooks.UrgencyHook
import XMonad.Util.Run (spawnPipe)
import System.IO 
import XMonad.Prompt
import XMonad.Prompt.Shell
--import XMonad.Prompt.AppendFile     -- append stuff to my NOTES file
--import XMonad.Prompt.Input          -- generic input prompt, used for making more generic search prompts than those in XMonad.Prompt.Search
import XMonad.Util.WorkspaceCompare
import XMonad.Util.EZConfig
import XMonad.Actions.Warp
import Data.Ratio

myTerminal      = "urxvtc"
myScreenLock    = "xlock +nolock"
myBorderWidth   = 0
myModMask       = mod4Mask
myNumlockMask   = mod2Mask
myWorkspaces    = ["1:web", "2:bk" ,"3:ssh", "4:dev", "5:sh", "6:maths", "7:games", "8:multimedia", "9:tmp", "10:logs"]
myNormalBorderColor  = "#111"
myFocusedBorderColor = "cadetblue3"

myKeys = \conf -> mkKeymap conf $
                [ ("C-S-<Esc>",    spawn $ myScreenLock)
                , ("M-C-<Esc>",    spawn $ "xkill")
                , ("M-<Space>",    sendMessage NextLayout)
                , ("M-S-<Space>",  setLayout $ XMonad.layoutHook conf)
                , ("M-n",          refresh)
                , ("M-S-c",        kill)
                , ("M-<Tab>",      windows W.focusDown)
                , ("M-j",          windows W.focusDown)
                , ("M-S-<Tab>",    windows W.focusUp)
                , ("M-k",          windows W.focusUp)
                , ("M-m",          windows W.focusMaster)
                , ("M-S-k",        windows W.swapDown)
                , ("M-S-j",        windows W.swapUp)
                , ("M-b",          sendMessage ToggleStruts)
                , ("M-h",          sendMessage Shrink)
                , ("M-l",          sendMessage Expand)
                , ("M-t",          withFocused $ windows . W.sink)
                , ("M-,",          sendMessage (IncMasterN 1))
                , ("M-.",          sendMessage (IncMasterN (-1)))
                , ("M-S-q",        io (exitWith ExitSuccess))
                , ("M-q",          restart "xmonad" True)
                , ("M-p",          shellPrompt oxyXPConfig)
                , ("M-o",          shellPrompt oxyXPConfig)
                , ("M-S-<Right>",  shiftToNext >> nextWS)
                , ("M-S-<Left>",   shiftToPrev >> prevWS)
                , ("M-<Down>",     nextScreen)
                , ("M-S-<Down>",   shiftNextScreen >> nextScreen)
                , ("M-<Left>",     prevNonEmptyWS)
                , ("M-C-k",        prevNonEmptyWS)
                , ("M-<Right>",    nextNonEmptyWS)
                , ("M-C-j",        nextNonEmptyWS)
                , ("M-s",          swapNextScreen)
                , ("M-<Up>",       swapNextScreen)
                , ("M-a",          sendMessage MirrorShrink)
                , ("M-y",          sendMessage MirrorExpand)
                , ("M-<Return>",   dwmpromote)
--                , ("M-x M-c",      kill)
                , ("M-x c",        kill)
--                , ("M-x M-x",      nextScreen)
                , ("M-u M-x M-x",  swapNextScreen)
                , ("M-x <F1>",     spawn "sudo mount /VOLUMES/MEDIA1")
                , ("M-x <F2>",     spawn "sudo mount /VOLUMES/MEDIA2")
                , ("M-x <F3>",     spawn "sudo mount /VOLUMES/MEDIA3")
                , ("M-x <F4>",     spawn "sudo mount /VOLUMES/MEDIA4")
                , ("M-x <F5>",     spawn "sudo mount /VOLUMES/TC")
                , ("M-x <F6>",     spawn "sudo mount /VOLUMES/MESDOCs")
                , ("M-x <F7>",     spawn "sudo mount /VOLUMES/DONNEES")
                , ("M-x <F8>",     spawn "sudo mount /VOLUMES/MUSIQUE")
                , ("M-x <F9>",     spawn "sudo mount /VOLUMES/KAHI")
                , ("M-x <F10>",    spawn "sudo mount /VOLUMES/TIPHERES")
                , ("M-x <F11>",    spawn "sudo mount /VOLUMES/LHAMKHIAL")
                , ("M-x <F12>",    spawn "sudo mount /VOLUMES/DEVO")
                , ("M-C-x <F1>",   spawn "sudo umount /VOLUMES/MEDIA1")
                , ("M-C-x <F2>",   spawn "sudo umount /VOLUMES/MEDIA2")
                , ("M-C-x <F3>",   spawn "sudo umount /VOLUMES/MEDIA3")
                , ("M-C-x <F4>",   spawn "sudo umount /VOLUMES/MEDIA4")
                , ("M-C-x <F5>",   spawn "sudo umount /VOLUMES/TC")
                , ("M-C-x <F6>",   spawn "sudo umount /VOLUMES/MESDOCs")
                , ("M-C-x <F7>",   spawn "sudo umount /VOLUMES/DONNEES")
                , ("M-C-x <F8>",   spawn "sudo umount /VOLUMES/MUSIQUE")
                , ("M-C-x <F9>",   spawn "sudo umount /VOLUMES/KAHI")
                , ("M-C-x <F10>",  spawn "sudo umount /VOLUMES/TIPHERES")
                , ("M-C-x <F11>",  spawn "sudo umount /VOLUMES/LHAMKHIAL")
                , ("M-C-x <F12>",  spawn "sudo umount /VOLUMES/DEVO")
                , ("M-x a",        spawn "cgoban")
                , ("M-x b",        spawn "urxvtc -g 80x24+172+149 -pe tabbed")
--                , ("M-x c",        spawn "urxvtc -g 245x72-91-88")
                , ("M-x d",        spawn "urxvtc -e sh -c 'screen -x'")
                , ("M-x e",        spawn "urxvtc -name Emacs -g 272x83+0-0 -e sh -c 'TERM=xterm-color emacsclient -nw'")
--                , ("M-x e",        spawn "urxvtc -name Emacs -g 272x83+0-0 -e sh -c 'TERM=xterm-color nimred-emacsclient'")
                , ("M-x f",        spawn "urxvtc -name firefox -g 96x11+626+494 -e firefox3")
                , ("M-x g",        spawn "gcalculator")
                , ("M-x h",        spawn "xboard -boardSize Middling -fcp crafty -clockMode False")
                , ("M-x l",        spawn "urxvtc -name slrn -g 252x78+64+48 -e sh -c 'slrn'")
--                , ("M-x m",        spawn "urxvtc -name Emacs -g 92x48+440+139 -e sh -c 'TERM=xterm-color emacs -daemon -g 272x83+0-0'")
                , ("M-x m",        spawn "urxvtc -name Mutt -g 252x78+64+48 -e sh -c 'env TERM=xterm-color mutt -y'")
                , ("M-x n",        spawn "urxvtc -name ncmpc -g 150x35-56-40 -e sh -c 'TERM=xterm-color ncmpc'")
--                , ("M-x o",        spawn "urxvtc -name opera -g 96x11+626+494 -e opera -nomail -noraise -geometry 1244x670+326+128")
                , ("M-x o",        spawn "urxvtc -name opera -g 96x11+644+320 -e opera -nomail -noraise -geometry 1109x574+386+116")
                , ("M-x p",        spawn "opera -newpage `xclip -o | xargs echo`")
                , ("M-x r",        spawn "urxvtc -name radiobrowser -g 99x80+39-26 -e sh -c 'screen -xRD -c ~/.screenrc4tvradio'")
                , ("M-x s",        spawn "fltk-sudoku -g 480x505+928+107")
--                , ("M-x t",        spawn "urxvtc -name tvbrowser -g 70x84+1-0 -e sh -c 'screen -xRD -c ~/.screenrc4tv'")
                , ("M-x v",        spawn "urxvtc -name vim -g 252x78+64+48 -e sh -c 'TERM=xterm-color vim'")
                , ("M-x w",        spawn "urxvtc -g 245x72-91-88 -C")
                , ("M-x x",        spawn $ XMonad.terminal conf)
--                , ("M-x z",        spawn "urxvtc -g 80x24+172+149")
                , ("M-x M-o",      spawn "urxvtc -g 80x24+780+448 -e soffice -nologo")
                , ("M-x M-f",      spawn "urxvtc -g 226x30+331+116 -e finch")
                , ("M1-x <F9>",    spawn "urxvtc -name sshinfo -e ssh -t nimred@ssh.maxtheon.info")
                , ("M1-x <F10>",   spawn "urxvtc -name sshfr -e ssh -t nimred@ssh.maxtheon.fr screen -r")
                , ("M1-x <F11>",   spawn "urxvtc -name sshnet -e ssh -t nimred@ssh.maxtheon.net screen -r")
                , ("M1-x <F12>",   spawn "urxvtc -name sshnet -e ssh -t nimred@ssh.maxtheon.org screen -r")
                , ("S-<Tab>",      spawn "xclip -o | xargs echo | wgetpaste -X > /dev/console")
                , ("S-<Esc>",      spawn "xclip -o | xargs echo | xargs -o wgetpaste -X -c > /dev/console")
                , ("C-M1-r",       spawn "sudo /sbin/fastboot")
                , ("C-M1-p",       spawn "sudo /sbin/fasthalt -p")
                , ("C-M1-M-e",     spawn "eject /dev/rcd0d")
                , ("C-M1-M-p",     spawn "sudo /sbin/shutdown -p now")
                , ("C-M1-M-r",     spawn "sudo /sbin/shutdown -r now")
                , ("C-M1-M-w",     spawn "random-wallpaper")
                , ("M-<",          spawn $ myScreenLock)
                , ("M1-<Return>",   spawn $ XMonad.terminal conf)
                , ("M-w",          sendMessage MagnifyMore)
                , ("M-e",          sendMessage MagnifyLess)
                , ("C-<",          warpToWindow (1%10) (1%10)) -- Move pointer to currently focused window
--
    -- some prompts.
      -- ability to change the working dir for a workspace.
--    , ("M-p d", changeDir myXPConfig)                           -- (11)
      -- man page prompt
--    , ("M-p m", manPrompt myXPConfig)                           -- (24)
      -- add single lines to my NOTES file from a prompt.       -- (25)
--    , ("M-p n", appendFilePrompt myXPConfig "/home/brent/misc/NOTES")
--    , ("M-p x", appendFilePrompt myXPConfig "/home/brent/foo/BLAH")
      -- shell prompt.
--    , ("M-p s", shellPrompt myXPConfig)                         -- (26)
--    , ("M-p p", spawn "exe=`dmenu_path | dmenu` && eval \"exec $exe\"") -- (0)

                ]
                ++
                [ (m ++ i, windows $ f j)
                    | (i, j) <- zip (map show [1..9]) (XMonad.workspaces conf)
                    , (m, f) <- [("M-", W.view), ("M-S-", W.shift)]
                ]
    where
      nextNonEmptyWS = moveTo Next (WSIs (liftM (not .) isVisible))
      prevNonEmptyWS = moveTo Prev (WSIs (liftM (not .) isVisible))

isVisible :: X (WindowSpace -> Bool)
isVisible = do
  vs <- gets (map (W.tag . W.workspace) . W.visible . windowset)
  return (\w -> (W.tag w) `elem` vs)

-- Config for Prompt
oxyXPConfig :: XPConfig
oxyXPConfig = defaultXPConfig { font              = "xft:Consolas-12"
                              , bgColor           = "Aquamarine3"
                              , fgColor           = "black"
                              , fgHLight          = "black"
                              , bgHLight          = "darkslategray4"
                              , borderColor       = "black"
                              , promptBorderWidth = 1
                              , position          = Top
                              , height            = 24
                              , defaultText       = []
                              }

myMouseBindings (XConfig {XMonad.modMask = modMask}) = M.fromList $
    -- mod-button1, Set the window to floating mode and move by dragging
    [ ((modMask, button1), (\w -> focus w >> mouseMoveWindow w))
    -- mod-button2, Raise the window to the top of the stack
    , ((modMask, button2), (\w -> focus w >> windows W.swapMaster))
    -- mod-button3, Set the window to floating mode and resize by dragging
    , ((modMask, button3), (\w -> focus w >> mouseResizeWindow w))
    -- you may also bind events to the mouse scroll wheel (button4 and button5)
    -- cycle focus
    , ((modMask, button4), (\_ -> windows W.focusUp))
    , ((modMask, button5), (\_ -> windows W.focusDown))
    -- cycle through workspaces
    , ((controlMask .|. modMask, button5), nextNonEmptyWS)
    , ((controlMask .|. modMask, button4), prevNonEmptyWS)
    ]
    where
      nextNonEmptyWS = \_ -> moveTo Next (WSIs (liftM (not .) isVisible))
      prevNonEmptyWS = \_ -> moveTo Prev (WSIs (liftM (not .) isVisible))

myLayout = avoidStrutsOn[U] $ tabs
           ||| tiled
           ||| Mirror tiled
           ||| magnify Grid
  where
     -- default tiling algorithm partitions the screen into two panes
     tiled   = ResizableTall nmaster delta ratio []
     -- The default number of windows in the master pane
     nmaster = 1
     -- Default proportion of screen occupied by master pane
     ratio   = 8 % 13
     -- Percent of screen to increment by when resizing panes
     delta   = 3 % 100
     -- tabbed layout
     tabs = tabbed shrinkText oxyDarkTheme
     -- magnification in grid
     magnify = magnifiercz (13%10)

-- Configuration for Tabbed
oxyTheme :: Theme
oxyTheme = defaultTheme { inactiveBorderColor = "#000"
                        , activeBorderColor = myFocusedBorderColor
                        , activeColor = "aquamarine3"
                        , inactiveColor = "DarkSlateGray4"
                        , inactiveTextColor = "#222"
                        , activeTextColor = "#222"
                        , fontName = "xft:Consolas-10:bold"
                        , decoHeight = 18
                        , urgentColor = "#000"
                        , urgentTextColor = "#63b8ff"
                        }

oxyDarkTheme :: Theme
oxyDarkTheme = defaultTheme { inactiveBorderColor = "#777"
                            , activeBorderColor = myFocusedBorderColor
                            , activeColor = "#000"
                            , inactiveColor = "#444"
                            , inactiveTextColor = "aquamarine4"
                            , activeTextColor = "aquamarine1"
                            , fontName = "xft:Dejavu Sans Mono-8"
                            , decoHeight = 15
                            , urgentColor = "#000"
                            , urgentTextColor = "#63b8ff"
                        }

-- A manageHook to float everything by default and unfloat a few windows
myManageHook :: ManageHook
myManageHook = composeAll [ appName =? "urxvt" --> unfloat
                          , appName =? "Console" --> unfloat
                          , appName =? "Emacs" --> unfloat
                          , appName =? "slrn" --> unfloat
                          , appName =? "Mutt" --> unfloat
                          , appName =? "sshinfo" --> unfloat
                          , appName =? "sshfr" --> unfloat
                          , appName =? "sshnet" --> unfloat
                          , className =? "Minefield" --> doF (W.shift "1:web")
                          , appName =? "firefox" --> doF (W.shift "1:web")
                          , className =? "Firefox" --> doF (W.shift "1:web")
                          , className =? "Opera" --> doF (W.shift "1:web")
                          , className =? "opera" --> doF (W.shift "1:web")
                          , appName =? "opera" --> doF (W.shift "1:web")
                          , appName =? "sshinfo" --> doF (W.shift "3:ssh")
                          , appName =? "sshfr" --> doF (W.shift "3:ssh")
                          , appName =? "sshnet" --> doF (W.shift "3:ssh")
--                          , appName =? "Emacs" --> doF (W.shift "4:dev")
                          , appName =? "scilex" --> doF (W.shift "6:maths")
                          , appName =? "Xscilab" --> doF (W.shift "6:maths")
                          , className =? "CGoban Control" --> doF (W.shift "7:games")
                          , className =? "Basicwin" --> doF (W.shift "7:games")
                          , className =? "xboard" --> doF (W.shift "7:games")
                          , className =? "XBoard" --> doF (W.shift "7:games")
                          , className =? "Sudoku" --> doF (W.shift "7:games")
                          , className =? "Fltk" --> doF (W.shift "7:games")
                          , appName =? "tvbrowser" --> doF (W.shift "8:multimedia")
                          , appName =? "radiobrowser" --> doF (W.shift "8:multimedia")
                          , appName =? "ncmpc" --> doF (W.shift "8:multimedia")
                          , className =? "MPlayer" --> doF (W.shift "8:multimedia")
                          , className =? "VLC" --> doF (W.shift "8:multimedia")
                          , className =? "vlc" --> doF (W.shift "8:multimedia")
                          , appName =? "VLC" --> doF (W.shift "8:multimedia")
                          , appName =? "vlc" --> doF (W.shift "8:multimedia")
                          , appName =? "Mutt" --> doF (W.shift "9:tmp")
                          , appName =? "slrn" --> doF (W.shift "9:tmp")
                          , appName =? "Xpdf" --> doF (W.shift "9:tmp")
                          , appName =? "Console" --> doF (W.shift "10:logs") ]
               <+> doFloat <+> manageDocks
                   where unfloat = ask >>= doF . W.sink
--ask = ["Emacs" , "Mutt"]
--myManageHook = composeAll
-- [ resource  =? "desktop_window"    --> doIgnore
-- , className =? "Deluge"            --> doF (W.shift "9")
-- , title     =? "roottail"          --> doIgnore ]
--    <+> manageDocks

-- Status bars and logging
myLogHook h = do
  ewmhDesktopsLogHook
  dynamicLogWithPP $ oxyPP h
  updatePointer (Relative (1/20) (1/20))

oxyPP :: Handle -> PP
oxyPP h = defaultPP  { ppCurrent = wrap "<fc=black,aquamarine3> " " </fc>"
                     , ppSep     = ""
                     , ppWsSep = ""
                     , ppVisible = wrap "<fc=black,DarkSlateGray4> " " </fc>"
                     , ppLayout = \x -> "<fc=aquamarine2,black>:: "
                                  ++ case x of
                                       "Mirror ResizableTall"   -> "MTiled"
                                       "ResizableTall"          -> "Tiled"
                                       "Tabbed Bottom Simplest" -> "Tabbed"
                                       "Tabbed Simplest"        -> "Tabbed"
                                       _                        -> x
                                  ++ "</fc> "
                     , ppTitle = \x -> case length x of
                                         0 -> ""
                                         _ -> "<fc=DarkSlateGray3,black>[" ++ shorten 33 x ++ "]</fc>"
                     , ppHiddenNoWindows = wrap "<fc=#aaa,black> " " </fc>"
                     , ppHidden = wrap "<fc=#aaa,black> " " </fc>"
                     , ppOutput = hPutStrLn h
                     }

shorten :: Int -> String -> String
shorten n xs | length xs < n = xs
             | otherwise     = (take (n - length end) xs) ++ end
 where
    end = ""

myFocusFollowsMouse :: Bool
myFocusFollowsMouse = True

------------------------------------------------------------------------
-- Now run xmonad with all the defaults we set up.

-- Run xmonad with the settings you specify. No need to modify this.
--
main = do
  pipe <- spawnPipe "xmobar /home/nimred/.xmonad/xmobarc"
  xmonad $ withUrgencyHook NoUrgencyHook $ defaults pipe

defaults pipe = defaultConfig {
      -- simple stuff
        terminal           = myTerminal,
        focusFollowsMouse  = myFocusFollowsMouse,
        borderWidth        = myBorderWidth,
        modMask            = myModMask,
        numlockMask        = myNumlockMask,
        workspaces         = myWorkspaces,
        normalBorderColor  = myNormalBorderColor,
        focusedBorderColor = myFocusedBorderColor,
      -- key bindings
        keys               = myKeys,
        mouseBindings      = myMouseBindings,
      -- hooks, layouts
        layoutHook         = myLayout,
        manageHook         = myManageHook,
        logHook            = myLogHook pipe
    }