-- -*- 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-", spawn $ myScreenLock) , ("M-C-", spawn $ "xkill") , ("M-", sendMessage NextLayout) , ("M-S-", setLayout $ XMonad.layoutHook conf) , ("M-n", refresh) , ("M-S-c", kill) , ("M-", windows W.focusDown) , ("M-j", windows W.focusDown) , ("M-S-", 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-", shiftToNext >> nextWS) , ("M-S-", shiftToPrev >> prevWS) , ("M-", nextScreen) , ("M-S-", shiftNextScreen >> nextScreen) , ("M-", prevNonEmptyWS) , ("M-C-k", prevNonEmptyWS) , ("M-", nextNonEmptyWS) , ("M-C-j", nextNonEmptyWS) , ("M-s", swapNextScreen) , ("M-", swapNextScreen) , ("M-a", sendMessage MirrorShrink) , ("M-y", sendMessage MirrorExpand) , ("M-", dwmpromote) -- , ("M-x M-c", kill) , ("M-x c", kill) -- , ("M-x M-x", nextScreen) , ("M-u M-x M-x", swapNextScreen) , ("M-x ", spawn "sudo mount /VOLUMES/MEDIA1") , ("M-x ", spawn "sudo mount /VOLUMES/MEDIA2") , ("M-x ", spawn "sudo mount /VOLUMES/MEDIA3") , ("M-x ", spawn "sudo mount /VOLUMES/MEDIA4") , ("M-x ", spawn "sudo mount /VOLUMES/TC") , ("M-x ", spawn "sudo mount /VOLUMES/MESDOCs") , ("M-x ", spawn "sudo mount /VOLUMES/DONNEES") , ("M-x ", spawn "sudo mount /VOLUMES/MUSIQUE") , ("M-x ", spawn "sudo mount /VOLUMES/KAHI") , ("M-x ", spawn "sudo mount /VOLUMES/TIPHERES") , ("M-x ", spawn "sudo mount /VOLUMES/LHAMKHIAL") , ("M-x ", spawn "sudo mount /VOLUMES/DEVO") , ("M-C-x ", spawn "sudo umount /VOLUMES/MEDIA1") , ("M-C-x ", spawn "sudo umount /VOLUMES/MEDIA2") , ("M-C-x ", spawn "sudo umount /VOLUMES/MEDIA3") , ("M-C-x ", spawn "sudo umount /VOLUMES/MEDIA4") , ("M-C-x ", spawn "sudo umount /VOLUMES/TC") , ("M-C-x ", spawn "sudo umount /VOLUMES/MESDOCs") , ("M-C-x ", spawn "sudo umount /VOLUMES/DONNEES") , ("M-C-x ", spawn "sudo umount /VOLUMES/MUSIQUE") , ("M-C-x ", spawn "sudo umount /VOLUMES/KAHI") , ("M-C-x ", spawn "sudo umount /VOLUMES/TIPHERES") , ("M-C-x ", spawn "sudo umount /VOLUMES/LHAMKHIAL") , ("M-C-x ", 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 ", spawn "urxvtc -name sshinfo -e ssh -t nimred@ssh.maxtheon.info") , ("M1-x ", spawn "urxvtc -name sshfr -e ssh -t nimred@ssh.maxtheon.fr screen -r") , ("M1-x ", spawn "urxvtc -name sshnet -e ssh -t nimred@ssh.maxtheon.net screen -r") , ("M1-x ", spawn "urxvtc -name sshnet -e ssh -t nimred@ssh.maxtheon.org screen -r") , ("S-", spawn "xclip -o | xargs echo | wgetpaste -X > /dev/console") , ("S-", 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-", 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 " " " " , ppSep = "" , ppWsSep = "" , ppVisible = wrap " " " " , ppLayout = \x -> ":: " ++ case x of "Mirror ResizableTall" -> "MTiled" "ResizableTall" -> "Tiled" "Tabbed Bottom Simplest" -> "Tabbed" "Tabbed Simplest" -> "Tabbed" _ -> x ++ " " , ppTitle = \x -> case length x of 0 -> "" _ -> "[" ++ shorten 33 x ++ "]" , ppHiddenNoWindows = wrap " " " " , ppHidden = wrap " " " " , 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 }