Xmonad/Config archive/Erthad's xmonad.hs
From HaskellWiki
< Xmonad | Config archive
-- -- xmonad example config file. -- -- A template showing all available configuration hooks, -- and how to override the defaults in your own xmonad.hs conf file. -- -- Normally, you'd only override those defaults you care about. -- {-# OPTIONS_GHC -fglasgow-exts #-} -- required for XMonad.Layout.MultiToggle import XMonad import XMonad.Actions.CycleWS import XMonad.Actions.DwmPromote import XMonad.Actions.FindEmptyWorkspace import qualified XMonad.Actions.FlexibleResize as Flex import XMonad.Actions.RotSlaves import XMonad.Actions.Search import XMonad.Actions.WindowGo import XMonad.Hooks.DynamicLog as Log import XMonad.Hooks.ManageDocks import XMonad.Hooks.EwmhDesktops import XMonad.Util.Run (spawnPipe) import XMonad.Util.EZConfig import XMonad.Prompt import XMonad.Prompt.RunOrRaise import XMonad.Prompt.Shell import XMonad.Prompt.Ssh import XMonad.Prompt.Workspace import XMonad.Util.Dzen as Dzen import XMonad.Util.Run import XMonad.Util.Loggers import XMonad.Layout.Accordion import XMonad.Layout.Combo import XMonad.Layout.DwmStyle import XMonad.Layout.IM import XMonad.Layout.Maximize import XMonad.Layout.MultiToggle import XMonad.Layout.NoBorders import XMonad.Layout.PerWorkspace import XMonad.Layout.Reflect import XMonad.Layout.ResizableTile import XMonad.Layout.TwoPane import XMonad.Layout.WindowNavigation import Codec.Binary.UTF8.String import Control.Monad import Data.Ratio ((%)) import System.Exit import System.IO (hPutStrLn) import qualified XMonad.StackSet as W import qualified Data.Map as M myTerminal = "xterm -bg black -fg '#CFDBFF' -fn '-*-terminus-medium-*-*-*-20-*-*-*-*-*-iso10646-1' +sb -bdc" myBorderWidth = 1 myModMask = mod4Mask myNumlockMask = mod2Mask myWorkspaces = ["~"] ++ map show [1..2] ++ ["web","IM","mail","6","7","8","mpc","0","rdesktop"] myDefaultGaps = [(0,0,0,0)] myNormalBorderColor = "#444488" myFocusedBorderColor = "#ee9999" myBgColor= "#001070" myFgColor = "#bbbbdd" myBgHLight= "#4444aa" myFgHLight= "#ddddff" myXPConfig :: XPConfig myXPConfig = defaultXPConfig { font = "xft:Terminus:pixelsize=16" , bgColor = myBgColor , fgColor = myFgColor , bgHLight = myBgHLight , fgHLight = myFgHLight , borderColor = myNormalBorderColor } -- Mutimedia keys bindings multKeys conf@(XConfig {XMonad.modMask = modMask}) = M.fromList $ [ ((0, 0x1008ff14), spawn "mpc --no-status toggle") , ((0, 0x1008ff15), spawn "mpc --no-status stop") , ((0, 0x1008ff16), spawn "mpc --no-status prev") , ((0, 0x1008ff17), spawn "mpc --no-status next") , ((0, 0x1008ff11), spawn "mpcvolume -") , ((0, 0x1008ff13), spawn "mpcvolume +") , ((0, 0x1008ff18), runOrRaise "firefox" (className =? "Firefox-bin")) , ((0, 0x1008ff19), runOrRaise "claws-mail" (className =? "Claws-mail")) , ((0, 0x1008ff30), runOrRaise "kvirc" (className =? "Kvirc")) , ((0, 0x1008ff10), spawn "/usr/bin/xscreensaver-command -lock") , ((0, xK_Print), unsafeSpawn "import -w root png:$HOME/screenshot--`date +%F--%T`.png") ] myKeys = \conf -> mkKeymap conf $ [ ("M-S-<Return>", spawn $ XMonad.terminal conf) -- terminal , ("M-S-c", kill) , ("M-r", refresh) , ("M-b", sendMessage ToggleStruts) , ("M-S-C-<Pause>", io (exitWith ExitSuccess)) , ("M-q", restart "xmonad" True) -- Propmpts here , ("M-p p", runOrRaisePrompt myXPConfig) , ("M-p M-p", runOrRaisePrompt myXPConfig) , ("M-p t", prompt (myTerminal ++ " -e") myXPConfig) , ("M-p M-t", prompt (myTerminal ++ " -e") myXPConfig) , ("M-p s", sshPrompt myXPConfig) , ("M-p M-s", sshPrompt myXPConfig) , ("M-p w", workspacePrompt myXPConfig (windows . W.view)) , ("M-p S-w", workspacePrompt myXPConfig (windows . W.shift)) , ("M-p M-w", workspacePrompt myXPConfig (windows . W.view)) , ("M-p M-S-w", workspacePrompt myXPConfig (windows . W.shift)) , ("M-S-b", selectSearch bugzilla) , ("M-p M-r", prompt ("rdesktop -k en-us") myXPConfig) -- Workspaces , ("M-z", viewEmptyWorkspace) , ("M-<L>", prevWS) , ("M-<R>", nextWS) , ("M-<Space>", sendMessage NextLayout) , ("M-S-<Space>", setLayout $ XMonad.layoutHook conf) --- Window management , ("M-h", sendMessage $ Go L) , ("M-S-h", sendMessage $ Swap L) , ("M-j", sendMessage $ Go D) , ("M-S-j", sendMessage $ Swap D) , ("M-k", sendMessage $ Go U) , ("M-S-k", sendMessage $ Swap U) , ("M-l", sendMessage $ Go R) , ("M-S-l", sendMessage $ Swap R) , ("M-<Tab>", windows W.focusDown) , ("M-S-<Tab>", windows W.focusUp) , ("M-<Return>", windows W.focusMaster) , ("M-m", dwmpromote) , ("M-y", rotSlavesDown) , ("M-S-y", rotAllDown) , ("M-o", rotSlavesUp) , ("M-S-o", rotAllUp) , ("M-S-u", sendMessage Shrink) , ("M-S-i", sendMessage Expand) , ("M-u", sendMessage MirrorExpand) , ("M-i", sendMessage MirrorShrink) , ("M-v", withFocused $ sendMessage . maximizeRestore ) , ("M-s", sendMessage $ Toggle ACCORDION) , ("M-S-s", sendMessage $ Toggle FULL) , ("M-t", withFocused $ windows . W.sink) -- unfloat -- Increment the number of windows in the master area , ("M-,", sendMessage (IncMasterN 1)) , ("M-.", sendMessage (IncMasterN (-1))) ] ++ [ (m ++ i, windows $ f j) | (i, j) <- zip (["`"] ++ map show [1..9] ++ ["0","C-r"] ) (XMonad.workspaces conf) , (m, f) <- [("M-", W.view), ("M-S-", W.shift)] -- , (m, f) <- [("M-", W.greedyView), ("M-S-", W.shift)] ] --- xinerama not used -- ++ -- -- mod-{w,e,r}, Switch to physical/Xinerama screens 1, 2, or 3 -- mod-shift-{w,e,r}, Move client to screen 1, 2, or 3 -- -- [((m .|. modMask, key), screenWorkspace sc >>= flip whenJust (windows . f)) -- | (key, sc) <- zip [xK_w, xK_e, xK_r] [0..] -- , (f, m) <- [(W.view, 0), (W.shift, shiftMask)]] bugzilla = searchEngine "bugzilla" "https://bugzilla.altlinux.org/show_bug.cgi?id=" ------------------------------------------------------------------------ -- Mouse bindings: default actions bound to mouse events -- 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 >> Flex.mouseResizeWindow w)) -- you may also bind events to the mouse scroll wheel (button4 and button5) -- , ((modMask, button4), prevWS) -- , ((modMask, button5), nextWS) ] data ACCORDION = ACCORDION deriving (Read, Show, Eq, Typeable) instance Transformer ACCORDION Window where transform _ x k = k Accordion data FULL = FULL deriving (Read, Show, Eq, Typeable) instance Transformer FULL Window where transform _ x k = k Full data NOBORDERS = NOBORDERS deriving (Read, Show, Eq, Typeable) instance Transformer NOBORDERS Window where transform _ x k = k (noBorders x) myLayout = ewmhDesktopsLayout . dwmStyle shrinkText myTheme . windowNavigation . avoidStruts . maximize . mkToggle (single ACCORDION) . mkToggle (NOBORDERS ?? FULL ?? EOT) $ onWorkspace "IM" tiledIM (Mirror tiled) ||| onWorkspace "IM" (Mirror tiled) tiledIM where tiled = ResizableTall 1 0.03 0.6180 [] tiledIM = ResizableTall 1 0.03 0.85 [] myTheme = defaultTheme { activeColor = myBgHLight , activeTextColor = myFgHLight , inactiveColor = myBgColor , inactiveTextColor = myFgColor } myManageHook = composeAll [ moveToC "Firefox-bin" "web" , floatT "Save a Bookmark" , moveToC "Claws-mail" "mail" , moveToC "rdesktop" "rdesktop" , moveToC "Kvirc" "IM" , moveToC "mainwnd" "IM" , floatC "Xmessage" , floatC "container" , floatC "history" , floatT $ decode [0xd0, 0x9f, 0xd0, 0xbe, 0xd0, 0xbc, 0xd0, 0xb5, 0xd1, 0x82, 0xd0, 0xb8, 0xd1, 0x82, 0xd1, 0x8c, 0x20, 0xd0, 0xba, 0xd0, 0xb0, 0xd0, 0xba, 0x20, 0xd0, 0xbf, 0xd1, 0x80, 0xd0, 0xbe, 0xd1, 0x87, 0xd0, 0xb8, 0xd1, 0x82, 0xd0, 0xb0, 0xd0, 0xbd, 0xd0, 0xbd, 0xd0, 0xbe, 0xd0, 0xb5] ] <+> manageDocks where moveToC c w = className =? c --> doF (W.shift w) moveToT t w = title =? t --> doF (W.shift w) floatC c = className =? c --> doFloat floatT t = title =? t --> doFloat -- Whether focus follows the mouse pointer. myFocusFollowsMouse :: Bool myFocusFollowsMouse = True ------------------------------------------------------------------------ -- Startup hook -- Perform an arbitrary action each time xmonad starts or is restarted -- with mod-q. Used by, e.g., XMonad.Layout.PerWorkspace to initialize -- per-workspace layout choices. -- -- By default, do nothing. myStartupHook = do spawn "xsetroot -cursor_name left_ptr -solid '#001040'" --return () --myLogHook = return () ------------------------------------------------------------------------ -- Now run xmonad with all the defaults we set up. -- Run xmonad with the settings you specify. No need to modify this. -- main = do dzen2 <- spawnPipe ( "killall rundzen; rundzen --" ++ (join $ map (wrap "-" "-") myWorkspaces )) Log.dzen $ \ defaultConfig -> xmonad $ -- A structure containing your configuration settings, overriding -- fields in the default config. Any you don't override, will -- use the defaults defined in xmonad/XMonad/Config.hs -- defaultConfig { -- simple stuff terminal = myTerminal, focusFollowsMouse = myFocusFollowsMouse, borderWidth = myBorderWidth, modMask = myModMask, numlockMask = myNumlockMask, workspaces = myWorkspaces, normalBorderColor = myNormalBorderColor, focusedBorderColor = myFocusedBorderColor, -- defaultGaps = myDefaultGaps, -- key bindings keys = \c -> myKeys c `M.union` multKeys c, mouseBindings = myMouseBindings, -- hooks, layouts layoutHook = myLayout, manageHook = myManageHook, logHook = do ewmhDesktopsLogHook dynamicLogWithPP dzenPP { ppCurrent = dzenColor myFgHLight myBgHLight . wrap "-" "-" , ppTitle = (>> "") , ppLayout = (>> "") , ppHidden = dzenColor myFgColor myBgColor . wrap " " " " , ppSep = " | " -- , ppExtras = [ logCmd "gcpubar -c 1" ] , ppOutput = hPutStrLn dzen2 }, startupHook = myStartupHook }
