Xmonad/Config archive/jelly(12gen)'s xmonad.hs
From HaskellWiki
(Difference between revisions)
| Line 1: | Line 1: | ||
<haskell> | <haskell> | ||
{- xmonad.hs | {- xmonad.hs | ||
| - | - Author: Jelle | + | - Author: Jelle van der Waa ( jelly12gen ) |
-} | -} | ||
| Line 35: | Line 35: | ||
-- layouts | -- layouts | ||
| - | |||
import XMonad.Layout.NoBorders | import XMonad.Layout.NoBorders | ||
import XMonad.Layout.ResizableTile | import XMonad.Layout.ResizableTile | ||
| + | import XMonad.Layout.Reflect | ||
| + | import XMonad.Layout.IM | ||
| + | import XMonad.Layout.Tabbed | ||
| + | import XMonad.Layout.PerWorkspace (onWorkspace) | ||
| + | import XMonad.Layout.Grid | ||
| + | -- Data.Ratio for IM layout | ||
| + | import Data.Ratio ((%)) | ||
| - | |||
| + | -- Main -- | ||
main = do | main = do | ||
xmproc <- spawnPipe "xmobar" -- start xmobar | xmproc <- spawnPipe "xmobar" -- start xmobar | ||
xmonad $ withUrgencyHook NoUrgencyHook $ defaultConfig | xmonad $ withUrgencyHook NoUrgencyHook $ defaultConfig | ||
{ manageHook = myManageHook | { manageHook = myManageHook | ||
| - | , layoutHook = | + | , layoutHook = myLayoutHook |
| - | , borderWidth = | + | , borderWidth = myBorderWidth |
| - | , normalBorderColor = | + | , normalBorderColor = myNormalBorderColor |
| - | , focusedBorderColor = | + | , focusedBorderColor = myFocusedBorderColor |
| - | , keys = | + | , keys = myKeys |
| - | , logHook = | + | , logHook = myLogHook xmproc |
| - | , modMask = | + | , modMask = myModMask |
| - | , terminal = | + | , terminal = myTerminal |
| - | , workspaces = | + | , workspaces = myWorkspaces |
| + | , focusFollowsMouse = False | ||
} | } | ||
| Line 64: | Line 71: | ||
myManageHook = composeAll . concat $ | myManageHook = composeAll . concat $ | ||
[[isFullscreen --> doFullFloat | [[isFullscreen --> doFullFloat | ||
| - | , className =? "OpenOffice.org 3.1" --> doShift " | + | , className =? "OpenOffice.org 3.1" --> doShift "5:doc" |
| - | , className =? " | + | , className =? "Xmessage" --> doCenterFloat |
| - | , className =? " | + | , className =? "Zenity" --> doCenterFloat |
| - | + | , className =? "feh" --> doCenterFloat | |
| - | , className =? " | + | , className =? "Gimp" --> doShift "9:gimp" |
| - | , className =? " | + | , className =? "Uzbl" --> doShift "2:web" |
| - | , className =? " | + | , className =? "Pidgin" --> doShift "1:chat" |
| - | + | , className =? "Skype" --> doShift "1:chat" | |
| - | , className =? " | + | , className =? "MPlayer" --> doShift "8:vid" |
| - | , className =? " | + | , className =? "VirtualBox" --> doShift "6:virtual" |
| - | , className =? "Apvlv" --> doShift "4: | + | , className =? "Apvlv" --> doShift "4:pdf" |
| - | , className =? "Evince" --> doShift "4: | + | , className =? "Evince" --> doShift "4:pdf"] |
] | ] | ||
where | where | ||
| Line 84: | Line 91: | ||
--logHook | --logHook | ||
| - | + | myLogHook :: Handle -> X () | |
| - | + | myLogHook h = dynamicLogWithPP $ customPP { ppOutput = hPutStrLn h } | |
| - | |||
| - | |||
| - | |||
---- Looks -- | ---- Looks -- | ||
---- bar | ---- bar | ||
| Line 101: | Line 105: | ||
, ppLayout = xmobarColor "#FF0000" "" | , ppLayout = xmobarColor "#FF0000" "" | ||
, ppTitle = xmobarColor "#00FF00" "" . shorten 80 | , ppTitle = xmobarColor "#00FF00" "" . shorten 80 | ||
| - | , ppSep = "<fc=# | + | , ppSep = "<fc=#0033FF> | </fc>" |
} | } | ||
| Line 115: | Line 119: | ||
} | } | ||
| + | --- My Theme For Tabbed layout | ||
| + | myTheme = defaultTheme { decoHeight = 16 | ||
| + | , activeColor = "#a6c292" | ||
| + | , activeBorderColor = "#a6c292" | ||
| + | , activeTextColor = "#000000" | ||
| + | , inactiveBorderColor = "#000000" | ||
| + | } | ||
| - | -- | + | --LayoutHook |
| - | + | myLayoutHook = onWorkspace "1:chat" chatL $ onWorkspace "2:web" webL $ onWorkspace "9:gimp" gimpL $ onWorkspace "6:virtual" fullL $ onWorkspace "8:vid" fullL $ standardLayouts | |
where | where | ||
| - | + | standardLayouts = avoidStruts $ (tiled ||| reflectTiled ||| Mirror tiled ||| Full) | |
| + | |||
| + | --Layouts | ||
| + | tiled = smartBorders (ResizableTall 1 (2/100) (1/2) []) | ||
| + | reflectTiled = (reflectHoriz tiled) | ||
| + | tabLayout = (tabbed shrinkText myTheme) | ||
| + | full = noBorders Full | ||
| + | |||
| + | --Chat Layout | ||
| + | --im = ((withIM ratio pidginRoster) $ reflectHoriz $ (withIM ratio skypeRoster)) | ||
| + | chatL = avoidStruts $ smartBorders $ (withIM ratio pidginRoster) $ tiled | ||
| + | ratio = 1%9 | ||
| + | --roster = And (ClassName "Pidgin" ) (Role "buddy_list") | ||
| + | pidginRoster = And (ClassName "Pidgin") (Role "buddy_list") | ||
| + | skypeRoster = (ClassName "Skype") `And` (Not (Title "Options")) `And` (Not (Role "Chats")) `And` (Not (Role "CallWindowForm")) | ||
| + | --chatL = avoidStruts $ smartBorders $ im tiled | ||
| + | |||
| + | --Gimp Layout | ||
| + | gimpL = avoidStruts $ smartBorders $ withIM (0.11) (Role "gimp-toolbox") $ reflectHoriz $ withIM (0.15) (Role "gimp-dock") Full | ||
| + | |||
| + | --Web Layout | ||
| + | webL = avoidStruts $ tabLayout ||| tiled ||| reflectHoriz tiled ||| full | ||
| + | |||
| + | --VirtualLayout | ||
| + | fullL = avoidStruts $ full | ||
| + | |||
| + | |||
| + | |||
| + | |||
------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | ||
---- Terminal -- | ---- Terminal -- | ||
| - | + | myTerminal :: String | |
| - | + | myTerminal = "urxvt" | |
------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | ||
-- Keys/Button bindings -- | -- Keys/Button bindings -- | ||
-- modmask | -- modmask | ||
| - | + | myModMask :: KeyMask | |
| - | + | myModMask = mod4Mask | |
-- borders | -- borders | ||
| - | + | myBorderWidth :: Dimension | |
| - | + | myBorderWidth = 1 | |
-- | -- | ||
| - | + | myNormalBorderColor, myFocusedBorderColor :: String | |
| - | + | myNormalBorderColor = "#333333" | |
| - | + | myFocusedBorderColor = "#FF0000" | |
-- | -- | ||
--Workspaces | --Workspaces | ||
| - | + | myWorkspaces :: [WorkspaceId] | |
| - | + | myWorkspaces = ["1:chat", "2:web", "3:code", "4:pdf", "5:doc", "6:virtual" ,"7:file", "8:vid", "9:gimp"] | |
-- | -- | ||
| Line 161: | Line 200: | ||
, ((0, xK_d), method S.dictionary ) | , ((0, xK_d), method S.dictionary ) | ||
, ((0, xK_w), method S.wikipedia ) | , ((0, xK_w), method S.wikipedia ) | ||
| + | , ((0, xK_h), method S.hoogle ) | ||
| + | , ((0, xK_i), method S.isohunt ) | ||
, ((0, xK_b), method $ S.searchEngine "archbbs" "http://bbs.archlinux.org/search.php?action=search&keywords=") | , ((0, xK_b), method $ S.searchEngine "archbbs" "http://bbs.archlinux.org/search.php?action=search&keywords=") | ||
, ((0, xK_r), method $ S.searchEngine "AUR" "http://aur.archlinux.org/packages.php?O=0&L=0&C=0&K=") | , ((0, xK_r), method $ S.searchEngine "AUR" "http://aur.archlinux.org/packages.php?O=0&L=0&C=0&K=") | ||
, ((0, xK_a), method $ S.searchEngine "archwiki" "http://wiki.archlinux.org/index.php/Special:Search?search=") | , ((0, xK_a), method $ S.searchEngine "archwiki" "http://wiki.archlinux.org/index.php/Special:Search?search=") | ||
| - | |||
| - | |||
| - | |||
] | ] | ||
| Line 172: | Line 210: | ||
-- keys | -- keys | ||
| - | + | myKeys :: XConfig Layout -> M.Map (KeyMask, KeySym) (X ()) | |
| - | + | myKeys conf@(XConfig {XMonad.modMask = modMask}) = M.fromList $ | |
-- launching and killing programs | -- launching and killing programs | ||
[ ((modMask, xK_Return), spawn $ XMonad.terminal conf) | [ ((modMask, xK_Return), spawn $ XMonad.terminal conf) | ||
, ((modMask .|. shiftMask, xK_c ), kill) | , ((modMask .|. shiftMask, xK_c ), kill) | ||
| + | , ((modMask .|. shiftMask, xK_b ), spawn "uzbl") | ||
| + | , ((modMask .|. shiftMask, xK_u ), spawn "sh ~/.config/uzbl/scripts/sessionuzbl -r") | ||
-- opening program launcher / search engine | -- opening program launcher / search engine | ||
| Line 199: | Line 239: | ||
, ((modMask, xK_k ), windows W.focusUp) | , ((modMask, xK_k ), windows W.focusUp) | ||
, ((modMask, xK_m ), windows W.focusMaster) | , ((modMask, xK_m ), windows W.focusMaster) | ||
| + | |||
-- swapping | -- swapping | ||
| Line 216: | Line 257: | ||
-- mpd controls | -- mpd controls | ||
| - | , (( | + | , ((0 , 0x1008ff16 ), spawn "ncmpcpp prev") |
| - | , (( | + | , ((0 , 0x1008ff17 ), spawn "ncmpcpp next") |
| - | , ((modMask .|. | + | , ((0 , 0x1008ff14 ), spawn "ncmpcpp play") |
| - | , ((modMask .|. | + | , ((0 , 0x1008ff15 ), spawn "ncmpcpp pause") |
| - | , ((modMask .|. | + | |
| - | , ((modMask .|. | + | -- Libnotify |
| - | , ((modMask .|. | + | , ((modMask .|. shiftMask, xK_a ), spawn "/home/jelle/bin/notify.py") |
| - | , ((modMask .|. | + | , ((modMask .|. shiftMask, xK_m ), spawn "/home/jelle/Projects/Notify/mpd-notification.py") |
| + | , ((modMask .|. shiftMask, xK_t ), spawn "/home/jelle/bin/notify-temp.py") | ||
| + | , ((modMask .|. shiftMask, xK_g ), spawn "/home/jelle/bin/notify-mail.py") | ||
| + | , ((modMask .|. shiftMask, xK_v ), spawn "/home/jelle/Projects/Notify/sound-notification.py") | ||
| + | |||
| + | -- volume control | ||
| + | , ((0 , 0x1008ff13 ), spawn "amixer -q set Master 2dB+") | ||
| + | , ((0 , 0x1008ff11 ), spawn "amixer -q set Master 2dB-") | ||
| + | , ((0 , 0x1008ff12 ), spawn "amixer -q set Master toggle") | ||
| + | |||
| + | -- printscreen | ||
| + | , ((modMask .|. shiftMask, xK_s ), spawn "/home/jelle/bin/scrotinput") | ||
-- quit, or restart | -- quit, or restart | ||
| Line 239: | Line 291: | ||
-- mod-shift-[w,e] %! move window to screen 1/2 | -- mod-shift-[w,e] %! move window to screen 1/2 | ||
[((m .|. modMask, key), screenWorkspace sc >>= flip whenJust (windows . f)) | [((m .|. modMask, key), screenWorkspace sc >>= flip whenJust (windows . f)) | ||
| - | | (key, sc) <- zip [ | + | | (key, sc) <- zip [xK_e, xK_w] [0..] |
, (f, m) <- [(W.view, 0), (W.shift, shiftMask)]] | , (f, m) <- [(W.view, 0), (W.shift, shiftMask)]] | ||
| + | |||
</haskell> | </haskell> | ||
Revision as of 21:25, 28 October 2009
{- xmonad.hs - Author: Jelle van der Waa ( jelly12gen ) -} -- Import stuff import XMonad import qualified XMonad.StackSet as W import qualified Data.Map as M import XMonad.Util.EZConfig(additionalKeys) import System.Exit import Graphics.X11.Xlib import System.IO -- actions import XMonad.Actions.CycleWS import XMonad.Actions.WindowGo import qualified XMonad.Actions.Search as S import XMonad.Actions.Search import qualified XMonad.Actions.Submap as SM -- utils import XMonad.Util.Run(spawnPipe) import qualified XMonad.Prompt as P import XMonad.Prompt.Shell import XMonad.Prompt -- hooks import XMonad.Hooks.DynamicLog import XMonad.Hooks.ManageDocks import XMonad.Hooks.UrgencyHook import XMonad.Hooks.ManageHelpers -- layouts import XMonad.Layout.NoBorders import XMonad.Layout.ResizableTile import XMonad.Layout.Reflect import XMonad.Layout.IM import XMonad.Layout.Tabbed import XMonad.Layout.PerWorkspace (onWorkspace) import XMonad.Layout.Grid -- Data.Ratio for IM layout import Data.Ratio ((%)) -- Main -- main = do xmproc <- spawnPipe "xmobar" -- start xmobar xmonad $ withUrgencyHook NoUrgencyHook $ defaultConfig { manageHook = myManageHook , layoutHook = myLayoutHook , borderWidth = myBorderWidth , normalBorderColor = myNormalBorderColor , focusedBorderColor = myFocusedBorderColor , keys = myKeys , logHook = myLogHook xmproc , modMask = myModMask , terminal = myTerminal , workspaces = myWorkspaces , focusFollowsMouse = False } -- hooks -- automaticly switching app to workspace myManageHook :: ManageHook myManageHook = composeAll . concat $ [[isFullscreen --> doFullFloat , className =? "OpenOffice.org 3.1" --> doShift "5:doc" , className =? "Xmessage" --> doCenterFloat , className =? "Zenity" --> doCenterFloat , className =? "feh" --> doCenterFloat , className =? "Gimp" --> doShift "9:gimp" , className =? "Uzbl" --> doShift "2:web" , className =? "Pidgin" --> doShift "1:chat" , className =? "Skype" --> doShift "1:chat" , className =? "MPlayer" --> doShift "8:vid" , className =? "VirtualBox" --> doShift "6:virtual" , className =? "Apvlv" --> doShift "4:pdf" , className =? "Evince" --> doShift "4:pdf"] ] where myIgnores = ["trayer"] myFloats = [] myOtherFloats = [] --logHook myLogHook :: Handle -> X () myLogHook h = dynamicLogWithPP $ customPP { ppOutput = hPutStrLn h } ---- Looks -- ---- bar customPP :: PP customPP = defaultPP { ppHidden = xmobarColor "#00FF00" "" , ppCurrent = xmobarColor "#FF0000" "" . wrap "[" "]" , ppUrgent = xmobarColor "#FF0000" "" . wrap "*" "*" , ppLayout = xmobarColor "#FF0000" "" , ppTitle = xmobarColor "#00FF00" "" . shorten 80 , ppSep = "<fc=#0033FF> | </fc>" } -- some nice colors for the prompt windows to match the dzen status bar. myXPConfig = defaultXPConfig { font = "-*-terminus-*-*-*-*-12-*-*-*-*-*-*-u" ,fgColor = "#00FFFF" , bgColor = "#000000" , bgHLight = "#000000" , fgHLight = "#FF0000" , position = Top } --- My Theme For Tabbed layout myTheme = defaultTheme { decoHeight = 16 , activeColor = "#a6c292" , activeBorderColor = "#a6c292" , activeTextColor = "#000000" , inactiveBorderColor = "#000000" } --LayoutHook myLayoutHook = onWorkspace "1:chat" chatL $ onWorkspace "2:web" webL $ onWorkspace "9:gimp" gimpL $ onWorkspace "6:virtual" fullL $ onWorkspace "8:vid" fullL $ standardLayouts where standardLayouts = avoidStruts $ (tiled ||| reflectTiled ||| Mirror tiled ||| Full) --Layouts tiled = smartBorders (ResizableTall 1 (2/100) (1/2) []) reflectTiled = (reflectHoriz tiled) tabLayout = (tabbed shrinkText myTheme) full = noBorders Full --Chat Layout --im = ((withIM ratio pidginRoster) $ reflectHoriz $ (withIM ratio skypeRoster)) chatL = avoidStruts $ smartBorders $ (withIM ratio pidginRoster) $ tiled ratio = 1%9 --roster = And (ClassName "Pidgin" ) (Role "buddy_list") pidginRoster = And (ClassName "Pidgin") (Role "buddy_list") skypeRoster = (ClassName "Skype") `And` (Not (Title "Options")) `And` (Not (Role "Chats")) `And` (Not (Role "CallWindowForm")) --chatL = avoidStruts $ smartBorders $ im tiled --Gimp Layout gimpL = avoidStruts $ smartBorders $ withIM (0.11) (Role "gimp-toolbox") $ reflectHoriz $ withIM (0.15) (Role "gimp-dock") Full --Web Layout webL = avoidStruts $ tabLayout ||| tiled ||| reflectHoriz tiled ||| full --VirtualLayout fullL = avoidStruts $ full ------------------------------------------------------------------------------- ---- Terminal -- myTerminal :: String myTerminal = "urxvt" ------------------------------------------------------------------------------- -- Keys/Button bindings -- -- modmask myModMask :: KeyMask myModMask = mod4Mask -- borders myBorderWidth :: Dimension myBorderWidth = 1 -- myNormalBorderColor, myFocusedBorderColor :: String myNormalBorderColor = "#333333" myFocusedBorderColor = "#FF0000" -- --Workspaces myWorkspaces :: [WorkspaceId] myWorkspaces = ["1:chat", "2:web", "3:code", "4:pdf", "5:doc", "6:virtual" ,"7:file", "8:vid", "9:gimp"] -- -- Switch to the "web" workspace viewWeb = windows (W.greedyView "2:web") -- (0,0a) -- --Search engines to be selected : [google (g), wikipedia (w) , youtube (y) , maps (m), dictionary (d) , wikipedia (w), bbs (b) ,aur (r), wiki (a) , TPB (t), mininova (n), isohunt (i) ] --keybinding: hit mod + s + <searchengine> searchEngineMap method = M.fromList $ [ ((0, xK_g), method S.google ) , ((0, xK_y), method S.youtube ) , ((0, xK_m), method S.maps ) , ((0, xK_d), method S.dictionary ) , ((0, xK_w), method S.wikipedia ) , ((0, xK_h), method S.hoogle ) , ((0, xK_i), method S.isohunt ) , ((0, xK_b), method $ S.searchEngine "archbbs" "http://bbs.archlinux.org/search.php?action=search&keywords=") , ((0, xK_r), method $ S.searchEngine "AUR" "http://aur.archlinux.org/packages.php?O=0&L=0&C=0&K=") , ((0, xK_a), method $ S.searchEngine "archwiki" "http://wiki.archlinux.org/index.php/Special:Search?search=") ] -- keys myKeys :: XConfig Layout -> M.Map (KeyMask, KeySym) (X ()) myKeys conf@(XConfig {XMonad.modMask = modMask}) = M.fromList $ -- launching and killing programs [ ((modMask, xK_Return), spawn $ XMonad.terminal conf) , ((modMask .|. shiftMask, xK_c ), kill) , ((modMask .|. shiftMask, xK_b ), spawn "uzbl") , ((modMask .|. shiftMask, xK_u ), spawn "sh ~/.config/uzbl/scripts/sessionuzbl -r") -- opening program launcher / search engine , ((modMask , xK_s ), SM.submap $ searchEngineMap $ S.promptSearch myXPConfig) , ((modMask .|. shiftMask , xK_s ), SM.submap $ searchEngineMap $ S.selectSearch) ,((modMask , xK_p), shellPrompt myXPConfig) -- layouts , ((modMask, xK_space ), sendMessage NextLayout) , ((modMask .|. shiftMask, xK_space ), setLayout $ XMonad.layoutHook conf) , ((modMask, xK_b ), sendMessage ToggleStruts) -- floating layer stuff , ((modMask, xK_t ), withFocused $ windows . W.sink) -- refresh' , ((modMask, xK_n ), refresh) -- focus , ((modMask, xK_Tab ), windows W.focusDown) , ((modMask, xK_j ), windows W.focusDown) , ((modMask, xK_k ), windows W.focusUp) , ((modMask, xK_m ), windows W.focusMaster) -- swapping , ((modMask .|. shiftMask, xK_Return), windows W.swapMaster) , ((modMask .|. shiftMask, xK_j ), windows W.swapDown ) , ((modMask .|. shiftMask, xK_k ), windows W.swapUp ) -- increase or decrease number of windows in the master area , ((modMask , xK_comma ), sendMessage (IncMasterN 1)) , ((modMask , xK_period), sendMessage (IncMasterN (-1))) -- resizing , ((modMask, xK_h ), sendMessage Shrink) , ((modMask, xK_l ), sendMessage Expand) , ((modMask .|. shiftMask, xK_h ), sendMessage MirrorShrink) , ((modMask .|. shiftMask, xK_l ), sendMessage MirrorExpand) -- mpd controls , ((0 , 0x1008ff16 ), spawn "ncmpcpp prev") , ((0 , 0x1008ff17 ), spawn "ncmpcpp next") , ((0 , 0x1008ff14 ), spawn "ncmpcpp play") , ((0 , 0x1008ff15 ), spawn "ncmpcpp pause") -- Libnotify , ((modMask .|. shiftMask, xK_a ), spawn "/home/jelle/bin/notify.py") , ((modMask .|. shiftMask, xK_m ), spawn "/home/jelle/Projects/Notify/mpd-notification.py") , ((modMask .|. shiftMask, xK_t ), spawn "/home/jelle/bin/notify-temp.py") , ((modMask .|. shiftMask, xK_g ), spawn "/home/jelle/bin/notify-mail.py") , ((modMask .|. shiftMask, xK_v ), spawn "/home/jelle/Projects/Notify/sound-notification.py") -- volume control , ((0 , 0x1008ff13 ), spawn "amixer -q set Master 2dB+") , ((0 , 0x1008ff11 ), spawn "amixer -q set Master 2dB-") , ((0 , 0x1008ff12 ), spawn "amixer -q set Master toggle") -- printscreen , ((modMask .|. shiftMask, xK_s ), spawn "/home/jelle/bin/scrotinput") -- quit, or restart , ((modMask .|. shiftMask, xK_q ), io (exitWith ExitSuccess)) , ((modMask , xK_q ), restart "xmonad" True) ] ++ -- mod-[1..9] %! Switch to workspace N -- mod-shift-[1..9] %! Move client to workspace N [((m .|. modMask, k), windows $ f i) | (i, k) <- zip (XMonad.workspaces conf) [xK_1 .. xK_9] , (f, m) <- [(W.greedyView, 0), (W.shift, shiftMask)]] ++ -- mod-[w,e] %! switch to twinview screen 1/2 -- mod-shift-[w,e] %! move window to screen 1/2 [((m .|. modMask, key), screenWorkspace sc >>= flip whenJust (windows . f)) | (key, sc) <- zip [xK_e, xK_w] [0..] , (f, m) <- [(W.view, 0), (W.shift, shiftMask)]]
