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
}