Advertisement
Guest User

xmonad config

a guest
Jul 30th, 2012
263
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import XMonad
  2. import XMonad.Actions.CycleWS
  3. import XMonad.Actions.Volume
  4. import XMonad.Config.Desktop
  5. import XMonad.Hooks.DynamicLog
  6. import XMonad.Hooks.EwmhDesktops
  7. import XMonad.Hooks.ManageDocks
  8. import XMonad.Hooks.ManageHelpers
  9. import XMonad.Hooks.SetWMName
  10. import XMonad.Hooks.UrgencyHook
  11. import System.IO
  12. import XMonad.Layout.Circle
  13. import XMonad.Layout.DecorationMadness
  14. import qualified XMonad.Layout.Grid as G
  15. import XMonad.Layout.HintedGrid
  16. import XMonad.Layout.IM
  17. import XMonad.Layout.NoBorders
  18. import XMonad.Layout.PerWorkspace
  19. import XMonad.Layout.Reflect
  20. import XMonad.Prompt
  21. import XMonad.Prompt.Shell
  22. import qualified XMonad.StackSet as W
  23. import XMonad.Util.Run(spawnPipe)
  24. import XMonad.Util.EZConfig
  25. import XMonad.Util.Scratchpad
  26. import Data.List
  27. import Data.Ratio
  28. import Foreign.C.Types
  29. import Debug.Trace
  30.  
  31. modm = mod3Mask -- caps-lock key for mod
  32.  
  33. myManageHook :: ManageHook
  34. myManageHook = composeAll
  35.             [ className =? "MPlayer"           --> doFloat
  36.             , className =? "Gitk"              --> doFloat
  37.             , className =? "Google-chrome"     --> doShift "1:web"
  38.             , className =? "Chromium-browser"  --> doShift "1:web"
  39.             , className =? "Firefox"           --> doShift "1:web"
  40.             , className =? "Emacs"             --> doShift "2:emacs"
  41.             , className =? "Pcmanfm"           --> doShift "4:files"
  42.             , className =? "Vlc"               --> doShift "5:cinema"
  43.                     , className =? "Vncviewer"         --> doShift "5:cinema"
  44.             , className =? "Deluge"            --> doShift "6:torrent"
  45.             , className =? "Gimp"              --> doShift "7:gimp"
  46.             , className =? "Pidgin"            --> doShift "9:im"
  47.             , className =? "Skype"             --> doShift "9:im"
  48.             , className =? "feh"               --> doCenterFloat
  49.                     , className =? "Speedcrunch"       --> doCenterFloat
  50.                     , className =? "Gweather-applet-2" --> doCenterFloat
  51.                     , className =? "Wicd-client.py"    --> doCenterFloat
  52.                     , className =? "com-mathworks-util-PostVMInit" --> doCenterFloat
  53.             , className =? "Paman"             --> doFloat
  54.             , className =? "Pavucontrol"       --> doFloat
  55.             , className =? "Xmessage"          --> doCenterFloat
  56.             , isDialog                         --> doCenterFloat
  57.             , className =? "Vncviewer"         --> doFullFloat
  58.                     , isFullscreen                     --> doFullFloat
  59.             , resource  =? "desktop_window"    --> doIgnore
  60.             , className =? "Qt-subapplication" --> doIgnore
  61.             , checkMenu                        --> doFloat
  62.             , checkDialog                      --> doFloat
  63.             , checkPopupMenu                   --> doFloat
  64.             , scratchpadManageHook (W.RationalRect 0.25 0.2 0.5 0.5)
  65.                     ]
  66.  
  67. getProp :: Atom -> Window -> X (Maybe [CLong])
  68. getProp a w = withDisplay $ \dpy -> io $ getWindowProperty32 dpy a w
  69.  
  70. checkAtom name value = ask >>= \w -> liftX $ do
  71.         a <- getAtom name
  72.         val <- getAtom value
  73.         mbr <- getProp a w
  74.         return $ case mbr of
  75.                Just r -> elem val $ map fromIntegral r
  76.                _      -> False
  77.  
  78. checkDialog = checkAtom "_NET_WM_WINDOW_TYPE" "_NET_WM_WINDOW_TYPE_DIALOG"
  79. checkMenu = checkAtom "_NET_WM_WINDOW_TYPE" "_NET_WM_WINDOW_TYPE_MENU"
  80. checkPopupMenu = checkAtom "_NET_WM_WINDOW_TYPE" "_NET_WM_WINDOW_TYPE_POPUP_MENU"
  81.  
  82. -- shell prompt theme
  83. mySP = defaultXPConfig
  84.        { font = "xft:DejaVu Sans Mono:pixelsize=10"
  85.        , bgColor           = "#000000"
  86.        , fgColor           = "#f8f8f8"
  87.        , fgHLight          = "#f8f8f8"
  88.        , bgHLight          = "steelblue3"
  89.        , borderColor       = "#191970"
  90.        , promptBorderWidth = 1
  91.        , position          = Top
  92.        , height            = 20
  93.        , defaultText       = []
  94.        }
  95.  
  96. --  Strip xmobar markup. Useful to remove ppHidden color from ppUrgent
  97. --   field. For example:
  98. -- >     , ppHidden          = xmobarColor "gray20" "" . wrap "<" ">"
  99. -- >     , ppUrgent          = xmobarColor "dark orange" "" .  xmobarStrip
  100. xmobarStrip :: String -> String
  101. xmobarStrip = strip [] where
  102.     strip keep x
  103.       | null x                 = keep
  104.       | "<fc="  `isPrefixOf` x = strip keep (drop 1 . dropWhile (/= '>') $ x)
  105.       | "</fc>" `isPrefixOf` x = strip keep (drop 5  x)
  106.       | '<' == head x          = strip (keep ++ "<") (tail x)
  107.       | otherwise              = let (good,x') = span (/= '<') x
  108.                  in strip (keep ++ good) x'
  109.  
  110. myLayouts =  (layoutHook desktopConfig ||| G.Grid)
  111. usualL l = smartBorders $ avoidStruts $ l
  112. gimpL = usualL $ withIM (0.11) (Role "gimp-toolbox") $ reflectHoriz $ withIM (0.15) (Role "gimp-dock") myLayouts
  113. termL = usualL G.Grid
  114.  
  115. imL = usualL $ withIM (1%7) skype $ reflectHoriz $ withIM (1%7) pidgin myLayouts
  116.       where
  117.     pidgin = And (ClassName "Pidgin") (Role "buddy_list")
  118.     skype  = (ClassName "Skype") `And` (Not (Title "Options")) `And` (Not (Role "Chats")) `And` (Not (Role "CallWindowForm"))
  119.  
  120. main = do
  121.   xmproc <- spawnPipe "xmobar ~/.xmobarrc"
  122.   -- dzen <- spawnPipe "dzen2"
  123.   xmonad $ withUrgencyHook NoUrgencyHook desktopConfig {
  124.            modMask = modm
  125.              , normalBorderColor = "#333333"
  126.          , focusedBorderColor = "#191970"
  127.          , workspaces = ["1:web", "2:emacs", "3:term", "4:files", "5:cinema", "6:torrent", "7:gimp","8:misc","9:im"]
  128.              , terminal = "urxvtc -sw -si"
  129.          , logHook = takeTopFocus >> (dynamicLogWithPP $ xmobarPP
  130.                           { ppOutput = hPutStrLn xmproc
  131.                           , ppTitle = xmobarColor "#6666ff" "" . shorten 100
  132.                       , ppUrgent = xmobarColor "grey" "#3A0E76" . Main.xmobarStrip
  133.                           }) >> ewmhDesktopsLogHook
  134.                                   >> setWMName "LG3D"
  135.          -- ,  logHook = dynamicLogWithPP $ dzenPP { ppOutput = hPutStrLn dzen }
  136.          , layoutHook = onWorkspace "7:gimp" gimpL $ onWorkspace "9:im" imL $ onWorkspace "3:term" termL $ usualL myLayouts
  137.          , borderWidth = 1
  138.          , manageHook = myManageHook <+> manageDocks
  139.          } `additionalKeys`
  140.          [ ((modm, xK_p), spawn "exe=`dmenu_path | dmenu` && eval \"exec $exe\"")
  141.          ] `additionalKeysP`
  142.          [ ("M-`",         scratchpadSpawnActionTerminal "urxvtc -bg rgba:0000/0000/0000/eeee") -- scratch
  143.          , ("M-C-c",       spawn "speedcrunch") -- calculator
  144.          , ("M-C-r",       refresh) -- refresh
  145.          , ("M-<Left>",    prevWS ) -- left workspace
  146.          , ("M-<Right>",   nextWS ) -- right workspace
  147.          , ("M-C-<Left>",  shiftToPrev >> prevWS ) -- schlep left workspace
  148.          , ("M-C-<Right>", shiftToNext >> nextWS ) -- schlep right workspace
  149.          , ("M-s",         shellPrompt mySP) -- shell
  150.              , ("C-1",         shellPrompt mySP) -- shell
  151.          , ("M-C--",       spawn "transset-df -a --dec .1")
  152.          , ("M-C-=",       spawn "transset-df -a --inc .1")
  153.              , ("<XF86AudioMute>",toggleMute >> return ())
  154.              , ("<XF86AudioLowerVolume>",lowerVolume 3 >> return ())
  155.              , ("<XF86AudioRaiseVolume>",raiseVolume 3 >> return ())
  156.              ]
  157.  
  158. takeTopFocus = withWindowSet $ maybe (setFocusX =<< asks theRoot) takeFocusX . W.peek
  159.  
  160. atom_WM_TAKE_FOCUS = getAtom "WM_TAKE_FOCUS"
  161. takeFocusX w = withWindowSet $ \ws -> do
  162.          dpy <- asks display
  163.          wmtakef <- atom_WM_TAKE_FOCUS
  164.          wmprot <- atom_WM_PROTOCOLS
  165.          protocols <- io $ getWMProtocols dpy w
  166.          if (wmtakef `elem` protocols) then
  167.              do
  168.                io $ allocaXEvent $ \ev -> do
  169.                     setEventType ev clientMessage
  170.                                 setClientMessageEvent ev w wmprot 32 wmtakef currentTime
  171.                     sendEvent dpy w False noEventMask ev else
  172.              return ()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement