Advertisement
Guest User

Untitled

a guest
Sep 7th, 2009
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.08 KB | None | 0 0
  1. -------------------- imports --------------------
  2.  
  3. --necessary
  4. import XMonad
  5. import qualified XMonad.StackSet as W
  6. import qualified Data.Map as M
  7. import System.Exit
  8. import Graphics.X11.Xlib
  9. import IO (Handle, hPutStrLn)
  10.  
  11. --utilities
  12. import XMonad.Util.Run (spawnPipe)
  13. import XMonad.Actions.NoBorders
  14.  
  15. --hooks
  16. import XMonad.Hooks.ManageDocks
  17. import XMonad.Hooks.DynamicLog
  18. import XMonad.Hooks.XPropManage
  19. import XMonad.Hooks.FadeInactive
  20.  
  21. --MO' HOOKS
  22. import Graphics.X11.Xlib.Extras
  23. import Foreign.C.Types (CLong)
  24.  
  25. --layouts
  26. import XMonad.Layout.NoBorders
  27. import XMonad.Layout.ResizableTile
  28. import XMonad.Layout.Named
  29. import XMonad.Layout.PerWorkspace
  30. import XMonad.Layout.Spacing
  31. import XMonad.Layout.Spiral
  32. import XMonad.Layout.Tabbed
  33. import Data.Ratio((%))
  34.  
  35.  
  36. -------------------- main --------------------
  37.  
  38. main = do
  39. h <- spawnPipe "xmobar ~/.xmobarrc"
  40. xmonad $ defaultConfig
  41. { workspaces = ["term", "web", "irc", "code", "else"]
  42. , modMask = mod1Mask
  43. , borderWidth = 1
  44. , normalBorderColor = "#1C1C1C"
  45. , focusedBorderColor = "#66AABB"
  46. , terminal = "urxvt"
  47. , logHook = logHook' h
  48. , manageHook = manageHook'
  49. , layoutHook = layoutHook'
  50. , keys = keys'
  51. }
  52. -------------------- loghooks --------------------
  53.  
  54. logHook' :: Handle -> X ()
  55. logHook' h = dynamicLogWithPP $ customPP { ppOutput = hPutStrLn h }
  56.  
  57. customPP :: PP
  58. customPP = defaultPP { ppCurrent = xmobarColor "#66AABB" ""
  59. , ppTitle = shorten 75
  60. , ppSep = "<fc=#66AABB> | </fc>"
  61. , ppHiddenNoWindows = xmobarColor "#DDEEDD" ""
  62. }
  63.  
  64. -------------------- layouthooks --------------------
  65.  
  66. layoutHook' = customLayout
  67. customLayout = avoidStrutsOn [U] (spaced ||| simpleTabbed ||| spiral (6/7) ||| smartBorders tiled ||| smartBorders (Mirror tiled) ||| noBorders Full)
  68. where
  69. spaced = named "Spacing" $ spacing 6 $ Tall 1 (3/100) (1/2)
  70. tiled = named "Tiled" $ ResizableTall 1 (2/100) (1/2) []
  71.  
  72. -------------------- menuhook --------------------
  73.  
  74. getProp :: Atom -> Window -> X (Maybe [CLong])
  75. getProp a w = withDisplay $ \dpy -> io $ getWindowProperty32 dpy a w
  76.  
  77. checkAtom name value = ask >>= \w -> liftX $ do
  78. a <- getAtom name
  79. val <- getAtom value
  80. mbr <- getProp a w
  81. case mbr of
  82. Just [r] -> return $ elem (fromIntegral r) [val]
  83. _ -> return False
  84.  
  85. checkDialog = checkAtom "_NET_WM_WINDOW_TYPE" "_NET_WM_WINDOW_TYPE_DIALOG"
  86. checkMenu = checkAtom "_NET_WM_WINDOW_TYPE" "_NET_WM_WINDOW_TYPE_MENU"
  87.  
  88. manageMenus = checkMenu --> doFloat
  89. manageDialogs = checkDialog --> doFloat
  90.  
  91. -------------------- managehook --------------------
  92.  
  93. manageHook' :: ManageHook
  94. manageHook' = manageHook defaultConfig <+> manageDocks <+> manageMenus <+> manageDialogs <+> myManageHook
  95.  
  96. myManageHook :: ManageHook
  97. myManageHook = composeAll . concat $
  98. [ [className =? c --> doFloat | c <- myFloats]
  99. , [title =? t --> doFloat | t <- myOtherFloats]
  100. , [className =? r --> doIgnore | r <- myIgnores]
  101.  
  102. , [className =? im --> doF (W.shift "irc") | im <- imMessenger]
  103. , [className =? bw --> doF (W.shift "web") | bw <- browsers]
  104. , [className =? e --> doF (W.shift "else") | e <- elseApps]
  105. ]
  106. where
  107. myFloats = ["Gimp", "vlc", "Nitrogen", "Thunar", "Leafpad"]
  108. myOtherFloats = ["Downloads", "Firefox Preferences", "Save As...", "Send file", "Open", "File Transfers"]
  109. myIgnores = ["trayer", "stalonetray"]
  110.  
  111. imMessenger = ["Pidgin"]
  112. browsers = ["Shiretoko", "Uzbl"]
  113. elseApps = ["Mirage", "Gimp"]
  114.  
  115. -------------------- keybinds --------------------
  116.  
  117. keys' :: XConfig Layout -> M.Map (KeyMask, KeySym) (X ())
  118. keys' conf@(XConfig {XMonad.modMask = modMask}) = M.fromList $
  119.  
  120. --launching/killing
  121. [ ((modMask, xK_p ), spawn "dmenu_run -fn \"-*-terminus-*-*-*-*-*-*-*-*-*-*-*-*\" -nb \"#131313\" -nf \"#888888\" -sb \"#2A2A2A\" -sf \"#3579A8\"")
  122. , ((modMask .|. shiftMask, xK_Return ), spawn $ XMonad.terminal conf)
  123. , ((modMask, xK_f ), spawn "uzbl --config=.configs") --or spawn "firefox"
  124. , ((modMask .|. shiftMask, xK_m ), spawn "urxvt -e ncmpcpp")
  125. , ((modMask .|. shiftMask, xK_c ), kill)
  126.  
  127. --layouts
  128. , ((modMask, xK_space ), sendMessage NextLayout)
  129. , ((modMask .|. shiftMask, xK_space ), setLayout $ XMonad.layoutHook conf)
  130. , ((modMask, xK_b ), sendMessage ToggleStruts)
  131.  
  132. -- refresh
  133. , ((modMask, xK_n ), refresh)
  134. , ((modMask .|. shiftMask, xK_w ), withFocused toggleBorder)
  135.  
  136. -- focus
  137. , ((modMask, xK_Tab ), windows W.focusDown)
  138. , ((modMask, xK_j ), windows W.focusDown)
  139. , ((modMask, xK_k ), windows W.focusUp)
  140. , ((modMask, xK_m ), windows W.focusMaster)
  141.  
  142. -- swapping
  143. , ((modMask .|. shiftMask, xK_j ), windows W.swapDown )
  144. , ((modMask .|. shiftMask, xK_k ), windows W.swapUp )
  145.  
  146. -- increase or decrease number of windows in the master area
  147. , ((modMask .|. controlMask, xK_h ), sendMessage (IncMasterN 1))
  148. , ((modMask .|. controlMask, xK_l ), sendMessage (IncMasterN (-1)))
  149.  
  150. -- resizing
  151. , ((modMask, xK_h ), sendMessage Shrink)
  152. , ((modMask, xK_l ), sendMessage Expand)
  153. , ((modMask .|. shiftMask, xK_h ), sendMessage MirrorShrink)
  154. , ((modMask .|. shiftMask, xK_l ), sendMessage MirrorExpand)
  155.  
  156. -- quit, or restart
  157. , ((modMask .|. shiftMask, xK_q ), io (exitWith ExitSuccess))
  158. , ((modMask , xK_q ), restart "xmonad" True)
  159. ]
  160. ++
  161. -- mod-[1..9] %! Switch to workspace N
  162. -- mod-shift-[1..9] %! Move client to workspace N
  163. [((m .|. modMask, k), windows $ f i)
  164. | (i, k) <- zip (XMonad.workspaces conf) [xK_F1 .. xK_F5]
  165. , (f, m) <- [(W.greedyView, 0), (W.shift, shiftMask)]]
  166.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement