xmonad.hs 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import XMonad
  2. import XMonad.Config.Desktop
  3. import XMonad.Hooks.DynamicLog
  4. import XMonad.Hooks.ManageDocks
  5. import XMonad.Util.Run(spawnPipe, hPutStrLn, runProcessWithInput)
  6. -- Layouts
  7. import XMonad.Layout.Spacing(smartSpacing)
  8. import XMonad.Layout.Tabbed
  9. import XMonad.Layout.NoBorders
  10. -- Shutdown commands and keys
  11. import Data.Map(fromList)
  12. import XMonad.Prompt
  13. import XMonad.Prompt.XMonad
  14. import System.Exit(ExitCode(ExitSuccess), exitWith)
  15. import XMonad.Util.EZConfig(additionalKeys, removeKeys)
  16. -- Brightness and audio keys
  17. import Graphics.X11.ExtraTypes.XF86
  18. import Data.List(elemIndex, foldl1')
  19. -- kde
  20. import XMonad.Config.Kde
  21. main = do
  22. xmonad $ docks kde4Config
  23. { manageHook = manageHook kdeConfig <+> myManageHook
  24. , layoutHook = smartBorders $ avoidStruts $
  25. (smartSpacing 5 $ withBorder 2 $ Tall 1 (3/100) (1/2)) |||
  26. (smartSpacing 5 $ withBorder 2 $ Mirror (Tall 1 (3/100) (1/2))) |||
  27. Full |||
  28. tabbed shrinkText def
  29. , startupHook = startup
  30. , modMask = mod4Mask
  31. } `additionalKeys` myKeys `removeKeys` myRemoveKeys
  32. myRemoveKeys =
  33. [ (mod4Mask, xK_Tab)
  34. , (mod4Mask .|. shiftMask, xK_Tab)
  35. ]
  36. myManageHook = composeAll . concat $
  37. [ [ className =? c --> doFloat | c <- myFloats]
  38. , [ title =? p --> doFloat | p <- plasmaWindows]
  39. ]
  40. where myFloats = ["Gimp"]
  41. plasmaWindows =
  42. [ "yakuake"
  43. , "Yakuake"
  44. , "Kmix"
  45. , "kmix"
  46. , "plasma"
  47. , "Plasma"
  48. , "plasma-desktop"
  49. , "Plasma-desktop"
  50. , "krunner"
  51. , "ksplashsimple"
  52. , "ksplashqml"
  53. , "ksplashx"
  54. ]
  55. startupList :: [String]
  56. startupList =
  57. [ "owncloud"
  58. , "compton"
  59. ]
  60. startup :: X ()
  61. startup = do
  62. foldl1' (>>) $ map (spawn . ifNotRunning) startupList
  63. -- Wrap a command in Bash that checks if it's running.
  64. ifNotRunning :: String -> String
  65. ifNotRunning s = "if [ `pgrep -c " ++ (basename s) ++ "` == 0 ]; then " ++ s ++ "; fi"
  66. -- Grab the program name from a command (everything up to the space,
  67. -- if there's a space). Doesn't work with escaped spaces.
  68. basename :: String -> String
  69. basename s = case elemIndex ' ' s of
  70. (Just n) -> take n s
  71. Nothing -> s
  72. myKeys = [
  73. -- extra programs
  74. ((mod4Mask, xK_x),
  75. spawn "emacsclient -c")
  76. , ((mod4Mask, xK_z),
  77. spawn "firefox-nightly")
  78. , ((mod4Mask, xK_m),
  79. spawn ":"
  80. -- TODO put social stuff here (Discord, Riot) and open it on a particular workspace
  81. )
  82. ]