spacepaste

  1.  
  2. -- ###### Imports ###### --
  3. -- ### Xmonad ### --
  4. import XMonad
  5. import XMonad.Core as XMonad hiding
  6. (workspaces,manageHook,keys,logHook,startupHook,borderWidth,mouseBindings
  7. ,layoutHook,modMask,terminal,normalBorderColor,focusedBorderColor,focusFollowsMouse
  8. ,handleEventHook,clickJustFocuses)
  9. import qualified XMonad.Core as XMonad
  10. (workspaces,manageHook,keys,logHook,startupHook,borderWidth,mouseBindings
  11. ,layoutHook,modMask,terminal,normalBorderColor,focusedBorderColor,focusFollowsMouse
  12. ,handleEventHook,clickJustFocuses)
  13. import XMonad.Operations
  14. import XMonad.Util.Run
  15. import XMonad.Actions.CycleWS
  16. import XMonad.Actions.SpawnOn
  17. import qualified Data.Map as M
  18. import qualified XMonad.StackSet as W
  19. import Data.Bits ((.|.))
  20. import Data.Monoid
  21. import Data.Ratio ((%))
  22. import Graphics.X11.Xlib
  23. import Graphics.X11.Xlib.Extras
  24. -- ### System ### --
  25. import System.IO
  26. import System.Exit
  27. -- ### Prompt ### --
  28. import XMonad.Prompt
  29. import XMonad.Prompt.RunOrRaise (runOrRaisePrompt)
  30. import XMonad.Prompt.AppendFile (appendFilePrompt)
  31. -- ### Hooks ### --
  32. import XMonad.ManageHook
  33. import XMonad.Hooks.ManageDocks
  34. import XMonad.Hooks.ManageHelpers
  35. import XMonad.Hooks.SetWMName
  36. import XMonad.Hooks.DynamicLog
  37. import XMonad.Hooks.UrgencyHook
  38. import XMonad.Hooks.FadeInactive
  39. import XMonad.Hooks.EwmhDesktops
  40. import XMonad.Operations
  41. -- ### Layout ### --
  42. import XMonad.Layout
  43. import XMonad.Layout.NoBorders (smartBorders, noBorders)
  44. import XMonad.Layout.PerWorkspace (onWorkspace, onWorkspaces)
  45. import XMonad.Layout.Reflect (reflectHoriz)
  46. import XMonad.Layout.IM
  47. import XMonad.Layout.SimpleFloat
  48. import XMonad.Layout.Spacing
  49. import XMonad.Layout.ResizableTile
  50. import XMonad.Layout.LayoutHints
  51. import XMonad.Layout.LayoutModifier
  52. import XMonad.Layout.Grid
  53. import XMonad.Layout.Tabbed
  54. import XMonad.Layout.TrackFloating
  55. -- ###### End Imports ### --
  56. -- ###### Config ###### --
  57. -- ### Terminal ### --
  58. myTerminal = "terminator"
  59. -- ### modMask ### --
  60. mymodMask :: KeyMask
  61. mymodMask = mod4Mask
  62. -- ### Workspaces ### --
  63. myWorkspaces = ["1:cKlap","2:www","3:dev","4:file","5:virt","6:mayhem","7:media","8:com"]
  64. -- ### Bars/Dzen2 ### --
  65. myXmonadBar = "dzen2 -x '0' -y '0' -h '18' -w '1000' -ta 'l' -fg '#999999' -bg '#000000' -fn '-*-fixed-medium-*-*-*-12-*-*-*-*-*-iso8859-*'"
  66. myTrayBar = "~/.xmonad/dzen/status_bars/dzen_secondary.sh | dzen2 -x '1000' -y '0' -h '18' -w '366' -ta 'r' -fg '#999999' -bg '#000000' -fn '-*-fixed-medium-*-*-*-12-*-*-*-*-*-iso8859-*'"
  67. myStatusBar = "~/.xmonad/dzen/status_bars/dzen_main.sh | dzen2 -x '0' -w '1000' -y '750' -h '18' -fg '#999999' -bg '#000000' -ta 'l' -fn '-*-fixed-medium-*-*-*-12-*-*-*-*-*-iso8859-*'"
  68. myMpdBar = "~/.xmonad/dzen/status_bars/dzen_audio.sh | dzen2 -x '1000' -w '366' -y '750' -h '18' -fg '#999999' -bg '#000000' -ta 'r' -fn '-*-fixed-medium-*-*-*-12-*-*-*-*-*-iso8859-*'"
  69. myBitmapsDir = "/home/coke/.xmonad/dzen"
  70. -- ### Main ### --
  71. main = do
  72. --bg <- spawnPipe "feh --bg-tile /home/coke/wallpapers/ska.jpg"
  73. dzenLeftBar <- spawnPipe myXmonadBar
  74. dzenStatusBar <- spawnPipe myStatusBar
  75. dzenTrayBar <- spawnPipe myTrayBar
  76. dzenMpdBar <- spawnPipe myMpdBar
  77. xmonad $ defaultConfig
  78. { terminal = myTerminal
  79. , workspaces = myWorkspaces
  80. , keys = myKeys
  81. , modMask = mymodMask
  82. , layoutHook = myLayoutHook
  83. , manageHook = manageSpawn <+> myManageHook
  84. , logHook = myLogHook dzenLeftBar
  85. , normalBorderColor = colorNormalBorder
  86. , focusedBorderColor = colorFocusedBorder
  87. , borderWidth = 0
  88. , startupHook = myStartupHook }
  89. -- ### StartupHook ### --
  90. myStartupHook :: X ()
  91. myStartupHook = do
  92. spawn "compton -cfb -D 1 -r 10 -l -15 -t -12 -o 0.6 -e 1.0 -i 1.0"
  93. spawn "xscreensaver -nosplash"
  94. spawn "xsetroot -cursor_name left_ptr"
  95. -- spawnOn "8:com" "terminator -x screen irssi"
  96. -- spawnOn "1:cKlap" "aterm -e htop"
  97. -- spawnOn "1:cKlap" "aterm -e tty-clock -c -C 1 -s -n"
  98. -- spawnOn "1:cKlap" "terminator -x alsamixer --card=1"
  99. -- spawnOn "1:cKlap" "terminator -x ncmpcpp"
  100. -- spawnOn "1:cKlap" "terminator -x wicd-curses"
  101. -- spawnOn "1:cKlap" "terminator -x htop"
  102. -- spawnOn "2:www" "google-chrome-stable"
  103. spawnOn "4:file" "nautilus --no-desktop --browser"
  104. spawnOn "6:mayhem" "terminator -x ssh coke@ccokee.no-ip.org"
  105. -- spawnOn "6:mayhem" "terminator -x ssh root@ccokee.no-ip.org:2222"
  106. -- spawnOn "6:mayhem" "terminator"
  107. -- spawnOn "8:com" "skype"
  108. -- ### ManageHook ### --
  109. myManageHook :: ManageHook
  110. myManageHook = (composeAll . concat $
  111. [ [resource =? r --> doIgnore | r <- myIgnores] -- ignore desktop
  112. , [className =? c --> doShift "3:develop" | c <- myDev ] -- move myDev to dev
  113. , [className =? c --> doShift "4:file" | c <- myFiles ] -- move myFiles to file
  114. , [className =? c --> doShift "7:media" | c <- myMedia ] -- move myMedia to media
  115. , [className =? c --> doShift "8:com" | c <- myChat ] -- move myChat to com
  116. , [className =? c --> doShift "5:virt" | c <- myVBox ] -- move myVBox to virt
  117. , [className =? c --> doCenterFloat | c <- myFloats ] -- float my floats
  118. , [name =? n --> doCenterFloat | n <- myNames ] -- float my names
  119. , [isFullscreen --> myDoFullFloat ]])
  120. where
  121. role = stringProperty "WM_WINDOW_ROLE"
  122. name = stringProperty "WM_NAME"
  123. -- classnames
  124. myTerms = ["aterm","urxvt","terminator"]
  125. myFloats = ["vlc","gimp","VirtualBox","skype"]
  126. myWebs = ["Firefox","google-chrome-stable"]
  127. myMedia = ["Spotify","vlc","kodi"]
  128. myChat = ["skype"]
  129. myFiles = ["nautilus","thunar","mc"]
  130. myDev = ["gvim","eclipse","ADT","emacs"]
  131. myVBox = ["VirtualBox","Virtualbox-bin","vbox"]
  132. -- resources
  133. myIgnores = ["desktop","desktop_window","notify-osd","stalonetray","trayer"]
  134. -- names
  135. myNames = ["bashrun","Google Chrome Options","Chromium Options"]
  136. -- ### LogHook ### --
  137. myLogHook :: Handle -> X ()
  138. myLogHook h = dynamicLogWithPP $ defaultPP
  139. {
  140. ppCurrent = dzenColor "#c9dee8" "#000000" . wrap "^fg(#c9dee8)[^fg(#ffffff)" "^fg(#c9dee8)]"
  141. , ppVisible = dzenColor "#c9dee8" "#000000" . wrap "^fg(#999999)[^fg(#c9dee8)" "^fg(#999999)]"
  142. , ppHidden = dzenColor "#eeeeee" "#000000" . pad
  143. , ppHiddenNoWindows = dzenColor "#999999" "#000000" . pad
  144. , ppUrgent = dzenColor "#ff0000" "#000000" . pad
  145. , ppWsSep = " "
  146. , ppSep = ":"
  147. , ppLayout = dzenColor "#c9dee8" "#000000" .
  148. (\x -> case x of
  149. "Spacing 7 ResizableTall" -> "^i(" ++ myBitmapsDir ++ "/tall.xbm)"
  150. "Mirror ResizableTall" -> "^i(" ++ myBitmapsDir ++ "/mtall.xbm)"
  151. "Full" -> "^i(" ++ myBitmapsDir ++ "/full.xbm)"
  152. "Simple Float" -> "~"
  153. _ -> x
  154. )
  155. , ppTitle = (" " ++) . dzenColor "#c9dee8" "#000000" . dzenEscape
  156. , ppOutput = hPutStrLn h
  157. }
  158. -- ### LayoutHook ### --
  159. myLayoutHook = onWorkspaces ["1:cKlap"] cKlapLayout $
  160. onWorkspaces ["2:www"] wwwLayout $
  161. onWorkspaces ["3:develop"] simpLayout $
  162. onWorkspaces ["4:files"] wwwLayout $
  163. onWorkspaces ["5:virt"] vBoxLayout $
  164. --onWorkspaces ["6:mayhem"] netLayout $
  165. onWorkspaces ["7:media"] mediaLayout $
  166. onWorkspaces ["8:com"] chatLayout $
  167. simpLayout
  168. -- ### Layouts ### --
  169. cKlapLayout = avoidStruts $ tiled ||| Mirror tiled ||| noBorders Full ||| simpleFloat
  170. where
  171. tiled = spacing 7 $ ResizableTall 1 (2/100) (2/3) []
  172. wwwLayout = avoidStruts $ noBorders tiled ||| Mirror tiled ||| noBorders Full ||| simpleFloat
  173. where
  174. tiled = spacing 7 $ ResizableTall 1 (2/100) (1/2) []
  175. simpLayout = avoidStruts $ noBorders Full ||| tiled ||| Mirror tiled ||| simpleFloat
  176. where
  177. tiled = spacing 7 $ ResizableTall 1 (2/100) (1/2) []
  178. vBoxLayout = avoidStruts $ noBorders simpleFloat
  179. --netLayout = spacing 7 $ avoidStruts $ smartBorders $ withIM (1%5) (And (Resource "aterm") (Role "buddy_list")) Grid
  180. mediaLayout = noBorders Full $ withIM 0.11 (Role "gimp-toolbox") $ reflectHoriz
  181. $ withIM 0.15 (Role "gimp-dock") (trackFloating simpleTabbed)
  182. chatLayout = avoidStruts $ withIM (1%5) (And (ClassName "skype") (Role "buddy_list")) simpleFloat
  183. -- ### Theme ### --
  184. colorOrange = "#83bbf4"
  185. colorDarkGray = "#1B1D1E"
  186. colorPink = "#F92672"
  187. colorGreen = "#A6E22E"
  188. colorBlue = "#66D9EF"
  189. colorYellow = "#E6DB74"
  190. colorWhite = "#CCCCC6"
  191. colorNormalBorder = "#CCCCCC"
  192. colorFocusedBorder = "#EEEEEE"
  193. -- ### Fonts ### --
  194. barFont = "-*-fixed-*-*-*-*-10-*-*-*-*-*-*-*"
  195. barXFont = "fixed"
  196. xftFont = "xft: fixed"
  197. -- ### Prompt Config ### --
  198. mXPConfig :: XPConfig
  199. mXPConfig =
  200. defaultXPConfig { font = barFont
  201. , bgColor = colorDarkGray
  202. , fgColor = colorGreen
  203. , bgHLight = colorGreen
  204. , fgHLight = colorDarkGray
  205. , promptBorderWidth = 0
  206. , height = 12
  207. , historyFilter = deleteConsecutive
  208. }
  209. -- ### Run or Raise Menu ### --
  210. largeXPConfig :: XPConfig
  211. largeXPConfig = mXPConfig
  212. { font = xftFont
  213. , height = 12
  214. }
  215. -- ### Trick for fullscreen switching windows ### --
  216. myDoFullFloat :: ManageHook
  217. myDoFullFloat = doF W.focusDown <+> doFullFloat
  218. -- ### Key Bindings ### --
  219. myKeys conf@(XConfig {XMonad.modMask = modMask}) = M.fromList $
  220. [ ((modMask, xK_p ), runOrRaisePrompt largeXPConfig)
  221. , ((modMask, xK_k ), spawn $ XMonad.terminal conf)
  222. , ((modMask, xK_F2 ), spawn "gmrun")
  223. , ((modMask .|. shiftMask, xK_c ), kill)
  224. , ((modMask .|. shiftMask, xK_l ), spawn "xscreensaver-command -lock")
  225. , ((0, xK_Print ), spawn "scrot -e 'mv $f ~/screenshots/'")
  226. , ((modMask, xK_c ), spawn "google-chrome-stable")
  227. , ((modMask, xK_n ), spawn "nautilus --no-desktop --browser")
  228. , ((0, 0x1008ff12 ), spawn "amixer -c 1 sset Master toggle") -- XF86AudioMute
  229. , ((0, 0x1008ff11 ), spawn "amixer -c 1 sset Master 5%-") -- XF86AudioLowerVolume
  230. , ((0, 0x1008ff13 ), spawn "amixer -c 1 sset Master 5%+")
  231. , ((0, 0x1008ff14 ), spawn "rhythmbox-client --play-pause")
  232. , ((0, 0x1008ff17 ), spawn "rhythmbox-client --next")
  233. , ((0, 0x1008ff16 ), spawn "rhythmbox-client --previous")
  234. , ((modMask, xK_x ), spawn "xbmc")
  235. , ((modMask, xK_g ), spawn "gimp")
  236. , ((modMask, xK_i ), spawn "screen irssi")
  237. , ((modMask, xK_v ), spawn "VirtualBox")
  238. , ((modMask .|. shiftMask, xK_v ), spawn "VBoxManage startvm 'Windows 10'")
  239. , ((modMask, xK_m ), spawn "vlc")
  240. , ((modMask .|. shiftMask, xK_m ), spawn "kodi")
  241. , ((modMask, xK_d ), spawn "deluge-gtk")
  242. , ((modMask, xK_e ), spawn "eclipse")
  243. , ((modMask .|. shiftMask, xK_e ), spawn "emacs")
  244. , ((modMask, xK_space ), sendMessage NextLayout)
  245. , ((modMask .|. shiftMask, xK_space ), setLayout $ XMonad.layoutHook conf) -- reset layout on current desktop to default
  246. , ((modMask, xK_b ), sendMessage ToggleStruts)
  247. , ((modMask, xK_r ), refresh)
  248. , ((modMask, xK_Tab ), windows W.focusDown) -- move focus to next window
  249. , ((modMask .|. shiftMask, xK_j ), windows W.focusDown)
  250. , ((modMask .|. shiftMask, xK_k ), windows W.focusUp )
  251. , ((modMask .|. shiftMask, xK_Down ), windows W.swapDown) -- swap the focused window with the next window
  252. , ((modMask .|. shiftMask, xK_Up ), windows W.swapUp) -- swap the focused window with the previous window
  253. , ((modMask, xK_Return ), windows W.swapMaster)
  254. , ((modMask, xK_t ), withFocused $ windows . W.sink) -- Push window back into tiling
  255. , ((modMask, xK_h ), sendMessage Shrink) -- %! Shrink a master area
  256. , ((modMask, xK_l ), sendMessage Expand) -- %! Expand a master area
  257. , ((modMask, xK_comma ), sendMessage (IncMasterN 1))
  258. , ((modMask, xK_period ), sendMessage (IncMasterN (-1)))
  259. -- workspaces
  260. , ((modMask .|. controlMask, xK_Right ), nextWS)
  261. , ((modMask .|. shiftMask, xK_Right ), shiftToNext)
  262. , ((modMask .|. controlMask, xK_Left ), prevWS)
  263. , ((modMask .|. shiftMask, xK_Left ), shiftToPrev)
  264. -- quit, or restart
  265. , ((modMask .|. shiftMask, xK_q ), io (exitWith ExitSuccess))
  266. , ((modMask, xK_q ), spawn "killall dzen2 && /home/my_user/.cabal/bin/xmonad --recompile && /home/my_user/.cabal/bin/xmonad --restart")
  267. ]
  268. ++
  269. -- mod-[1..9] %! Switch to workspace N
  270. -- mod-shift-[1..9] %! Move client to workspace N
  271. [((m .|. modMask, k), windows $ f i)
  272. | (i, k) <- zip (XMonad.workspaces conf) [xK_1 .. xK_9]
  273. , (f, m) <- [(W.greedyView, 0), (W.shift, shiftMask)]]
  274. -- ++
  275. --
  276. -- mod-{w,e,r}, Switch to physical/Xinerama screens 1, 2, or 3
  277. -- mod-shift-{w,e,r}, Move client to screen 1, 2, or 3
  278. --
  279. -- [((m .|. modMask, key), screenWorkspace sc >>= flip whenJust (windows . f))
  280. -- | (key, sc) <- zip [xK_w, xK_e, xK_r] [0..]
  281. -- , (f, m) <- [(W.view, 0), (W.shift, shiftMask)]]
  282. -- ###### End Config ###### --
  283.