Advertisement
ganassa

ganassa's xmonad configuration

Aug 2nd, 2011
1,291
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Haskell 10.39 KB | None | 0 0
  1. {-# LANGUAGE FlexibleInstances, MultiParamTypeClasses, TypeSynonymInstances, FlexibleContexts, NoMonomorphismRestriction #-}
  2.  
  3. -- Based on XMonad configuration file by Thomas ten Cate - <ttencate@gmail.com> http://www.haskell.org/haskellwiki/Xmonad/Config_archive/Thomas_ten_Cate's_xmonad.hs
  4. -- Modified by Max <ganassa@gmail.com>
  5.  
  6. import XMonad
  7. import XMonad.Util.EZConfig
  8. import qualified XMonad.StackSet as S
  9. import XMonad.Actions.CycleWS
  10. import XMonad.Config.Gnome
  11. import XMonad.Hooks.EwmhDesktops
  12. import XMonad.Hooks.ManageDocks
  13. import XMonad.Layout.Combo
  14. import XMonad.Layout.Grid
  15. import XMonad.Layout.LayoutModifier
  16. import XMonad.Layout.Named
  17. import XMonad.Layout.NoBorders
  18. import XMonad.Layout.PerWorkspace
  19. import XMonad.Layout.Reflect
  20. import XMonad.Layout.TwoPane
  21. import XMonad.Layout.WindowNavigation
  22. import XMonad.Util.WindowProperties
  23. import Control.Monad
  24. import Data.Ratio
  25. import qualified Data.Map as M
  26. import System.Exit
  27. import XMonad.Hooks.DynamicLog
  28. import XMonad.Util.Run(spawnPipe)
  29. import System.IO
  30. import XMonad.Hooks.SetWMName
  31. import System.Exit
  32. import XMonad.Layout.Tabbed
  33. import qualified XMonad.StackSet as W
  34. import XMonad.Util.EZConfig
  35. import XMonad.Util.CustomKeys
  36. import XMonad.Layout.SubLayouts
  37. import XMonad.Layout.WindowNavigation
  38. import XMonad.Layout.BoringWindows
  39. import XMonad.Actions.UpdatePointer
  40. import XMonad.Layout.NoFrillsDecoration
  41.  
  42. myBaseConfig = gnomeConfig
  43. myBorderWidth = 2
  44. myNormalBorderColor = "#202030"
  45. myFocusedBorderColor = "#A0A0D0"
  46. myTheme = defaultTheme
  47. myWorkspaces = (miscs 8) ++ ["fullscreen", "im"]
  48.     where miscs = map (("F" ++) . show) . (flip take) [1..]
  49. isFullscreen = (== "fullscreen")
  50.  
  51. basicLayout = Tall nmaster delta ratio where
  52.     nmaster = 1
  53.     delta   = 3/100
  54.     ratio   = 2/3
  55. tallLayout = named "tall" $ avoidStruts $ subTabbed $ basicLayout
  56. wideLayout = named "wide" $ avoidStruts $ subTabbed $ Mirror basicLayout
  57. tabbedLayout = named "tab" $ avoidStruts $ noBorders simpleTabbed
  58. fullscreenLayout = named "fullscreen" $ noBorders Full
  59.  
  60. imLayout = avoidStruts $ reflectHoriz $ withIMs ratio rosters chatLayout where
  61.     chatLayout      = Grid
  62.     ratio           = 1%6
  63.     rosters         = [skypeRoster, pidginRoster]
  64.     pidginRoster    = And (ClassName "Pidgin") (Role "buddy_list")
  65.     skypeRoster     = (ClassName "Skype") `And` (Not (Title "Options")) `And` (Not (Role "Chats")) `And` (Not (Role "CallWindowForm")) `And` (Not (Role "ConversationsWindow"))
  66.  
  67. myLayoutHook = windowNavigation $ fullscreen $ im $ normal where
  68.     normal    = tallLayout
  69.             ||| wideLayout
  70.             ||| tabbedLayout
  71.     fullscreen = onWorkspace "fullscreen" fullscreenLayout
  72.     im         = onWorkspace "im" imLayout
  73.  
  74.  
  75. myManageHook = imManageHooks <+> myMaxManageHooks <+> manageHook myBaseConfig
  76. imManageHooks = composeAll [isIM --> moveToIM] where
  77.     isIM     = foldr1 (<||>) [isPidgin, isSkype]
  78.     isPidgin = className =? "Pidgin"
  79.     isSkype  = className =? "Skype"
  80.     moveToIM = doF $ S.shift "im"
  81. myMaxManageHooks= composeAll
  82.     [
  83.       className =? "Gimp"      --> doFloat
  84.     , className =? "Vncviewer" --> doFloat
  85.     , className =? "Unity-2d-panel"    --> doIgnore
  86.     , className =? "Unity-2d-launcher" --> doIgnore
  87.     , manageDocks
  88.     ]
  89.  
  90. altMask = mod1Mask
  91. winMask = mod4Mask
  92.  
  93. myKeys conf = M.fromList $
  94.     [
  95.       ((altMask, xK_F4)                    , kill)
  96.     , ((controlMask, xK_F12)               , spawn "xmonad --recompile; xmonad --restart")
  97.     , ((controlMask .|. shiftMask, xK_F12) , io (exitWith ExitSuccess) )
  98.     , ((winMask , xK_space )               , sendMessage NextLayout)
  99.     , ((winMask .|. shiftMask, xK_r)       , refresh)
  100.     , ((winMask , xK_Home)                 , windows S.swapMaster)
  101.     , ((altMask , xK_Tab)                  , windows S.focusDown)
  102.     , ((altMask .|. shiftMask, xK_Tab   )  , windows S.focusUp)
  103.     , ((winMask .|. altMask  ,                  xK_h  )           , sendMessage Shrink)
  104.     , ((winMask .|. altMask  ,                  xK_Left  )        , sendMessage Shrink)
  105.     , ((winMask .|. altMask  ,                  xK_l )            , sendMessage Expand)
  106.     , ((winMask .|. altMask  ,                  xK_Right )        , sendMessage Expand)
  107.     , ((winMask              ,                  xK_t     )        , withFocused $ windows . S.sink)
  108.     , ((winMask .|. altMask  ,                  xK_plus)          , sendMessage (IncMasterN 1))
  109.     , ((winMask .|. altMask  ,                  xK_minus)         , sendMessage (IncMasterN (-1)))
  110.     , ((winMask               ,                 xK_a  )           , prevWS)
  111.     , ((winMask               ,                 xK_s )            , nextWS)
  112.     , ((winMask .|. shiftMask,                  xK_a)             , shiftToPrev)
  113.     , ((winMask .|. shiftMask,                  xK_s)             , shiftToNext)
  114.     , ((winMask .|. controlMask  , xK_h)                          , sendMessage $ pullGroup L)
  115.     , ((winMask .|. controlMask  , xK_Left)                       , sendMessage $ pullGroup L)
  116.     , ((winMask .|. controlMask  , xK_l)                          , sendMessage $ pullGroup R)
  117.     , ((winMask .|. controlMask  , xK_Right)                      , sendMessage $ pullGroup R)
  118.     , ((winMask .|. controlMask  , xK_k)                          , sendMessage $ pullGroup U)
  119.     , ((winMask .|. controlMask  , xK_Down)                       , sendMessage $ pullGroup U)
  120.     , ((winMask .|. controlMask  , xK_j)                          , sendMessage $ pullGroup D)
  121.     , ((winMask .|. controlMask  , xK_Up)                         , sendMessage $ pullGroup D)
  122.     , ((winMask .|. controlMask  , xK_m)                          , withFocused (sendMessage . MergeAll))
  123.     , ((winMask .|. controlMask .|. shiftMask , xK_m)             , withFocused (sendMessage . UnMergeAll))
  124.     , ((winMask .|. controlMask  , xK_u)                          , withFocused (sendMessage . UnMerge))
  125.     , ((winMask                , xK_Tab   )                       , onGroup W.focusDown')
  126.    , ((winMask .|. shiftMask  , xK_Tab   )                       , onGroup W.focusUp')
  127.     , ((winMask,                 xK_Left )                        , sendMessage $ Go L)
  128.     , ((winMask,                 xK_h )                           , sendMessage $ Go L)
  129.     , ((winMask,                 xK_Right)                        , sendMessage $ Go R)
  130.     , ((winMask,                 xK_l)                            , sendMessage $ Go R)
  131.     , ((winMask,                 xK_Up   )                        , sendMessage $ Go U)
  132.     , ((winMask,                 xK_k   )                         , sendMessage $ Go U)
  133.     , ((winMask,                 xK_Down )                        , sendMessage $ Go D)
  134.     , ((winMask,                 xK_j )                           , sendMessage $ Go D)
  135.     , ((winMask .|. shiftMask,   xK_Left )                        , sendMessage $ Swap L)
  136.     , ((winMask .|. shiftMask,   xK_h )                           , sendMessage $ Swap L)
  137.     , ((winMask .|. shiftMask,   xK_Right)                        , sendMessage $ Swap R)
  138.     , ((winMask .|. shiftMask,   xK_l)                            , sendMessage $ Swap R)
  139.     , ((winMask .|. shiftMask,   xK_Up   )                        , sendMessage $ Swap U)
  140.     , ((winMask .|. shiftMask,   xK_k   )                         , sendMessage $ Swap U)
  141.     , ((winMask .|. shiftMask,   xK_Down )                        , sendMessage $ Swap D)
  142.     , ((winMask .|. shiftMask,   xK_j )                           , sendMessage $ Swap D)
  143.     ] ++
  144.     [  ((winMask .|. altMask, key), screenWorkspace sc >>= flip whenJust (windows . f))
  145.         | (key, sc) <- zip [xK_w, xK_e, xK_r] [0..]
  146.         , (f, m) <- [(W.view, 0), (W.shift, shiftMask)]
  147.     ] ++
  148.     [ ((winMask, k), windows $ S.greedyView i)
  149.         | (i, k) <- zip myWorkspaces workspaceKeys
  150.     ] ++
  151.     [ ((winMask .|. shiftMask, k), (windows $ S.shift i) >> (windows $ S.greedyView i))
  152.         | (i, k) <- zip myWorkspaces workspaceKeys
  153.     ]
  154.     where workspaceKeys = [xK_F1 .. xK_F10]
  155. myMouseBindings (XConfig {XMonad.modMask = modMask}) = M.fromList $
  156.     [ ((altMask, button1), (\w -> focus w >> mouseMoveWindow w))
  157.     , ((altMask, button3), (\w -> focus w >> mouseResizeWindow w))
  158.     , ((altMask, button2), (\w -> focus w >> (withFocused $ windows . S.sink)))
  159.     , ((altMask, button4), (const $ windows S.swapUp))
  160.     , ((altMask, button5), (const $ windows S.swapDown))
  161.     ]
  162.    
  163. main =
  164.     do
  165.     xmproc <- spawnPipe "xmobar"
  166.     xmonad $ myBaseConfig {
  167.       modMask = winMask
  168.     , workspaces = myWorkspaces
  169.     , layoutHook = myLayoutHook
  170.     , manageHook = myManageHook
  171.     , borderWidth = myBorderWidth
  172.     , normalBorderColor = myNormalBorderColor
  173.     , focusedBorderColor = myFocusedBorderColor
  174.     , keys = myKeys
  175.     , mouseBindings = myMouseBindings
  176.     , startupHook = setWMName "LG3D"
  177.     , logHook     = dynamicLogWithPP xmobarPP
  178.         { ppOutput = hPutStrLn xmproc
  179.         , ppLayout = const ""
  180.         , ppTitle = xmobarColor "white" "" . shorten 60
  181.         }
  182.     }
  183.  
  184. data AddRosters a = AddRosters Rational [Property] deriving (Read, Show)
  185.  
  186. instance LayoutModifier AddRosters Window where
  187.   modifyLayout (AddRosters ratio props) = applyIMs ratio props
  188.   modifierDescription _                = "IMs"
  189.  
  190. withIMs :: LayoutClass l a => Rational -> [Property] -> l a -> ModifiedLayout AddRosters l a
  191. withIMs ratio props = ModifiedLayout $ AddRosters ratio props
  192.  
  193. gridIMs :: Rational -> [Property] -> ModifiedLayout AddRosters Grid a
  194. gridIMs ratio props = withIMs ratio props Grid
  195.  
  196. hasAnyProperty :: [Property] -> Window -> X Bool
  197. hasAnyProperty [] _ = return False
  198. hasAnyProperty (p:ps) w = do
  199.     b <- hasProperty p w
  200.     if b then return True else hasAnyProperty ps w
  201.  
  202. applyIMs :: (LayoutClass l Window) =>
  203.                Rational
  204.             -> [Property]
  205.             -> S.Workspace WorkspaceId (l Window) Window
  206.             -> Rectangle
  207.             -> X ([(Window, Rectangle)], Maybe (l Window))
  208. applyIMs ratio props wksp rect = do
  209.     let stack = S.stack wksp
  210.     let ws = S.integrate' $ stack
  211.    rosters <- filterM (hasAnyProperty props) ws
  212.    let n = fromIntegral $ length rosters
  213.    let (rostersRect, chatsRect) = splitHorizontallyBy (n * ratio) rect
  214.    let rosterRects = splitHorizontally n rostersRect
  215.    let filteredStack = stack >>= S.filter (`notElem` rosters)
  216.    (a,b) <- runLayout (wksp {S.stack = filteredStack}) chatsRect
  217.    return (zip rosters rosterRects ++ a, b)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement