xmonad.hs (view raw)
1import qualified Data.Map as M
2import System.Exit
3
4import XMonad
5import qualified XMonad.StackSet as W
6
7import XMonad.Actions.GridSelect
8import XMonad.Actions.WithAll
9
10import XMonad.Hooks.DynamicLog
11import XMonad.Hooks.EwmhDesktops
12import XMonad.Hooks.StatusBar
13import XMonad.Hooks.StatusBar.PP
14
15import XMonad.Util.ClickableWorkspaces
16import XMonad.Util.EZConfig
17import XMonad.Util.NamedScratchpad
18
19import XMonad.Layout.BoringWindows hiding (Replace)
20import XMonad.Layout.Renamed
21import XMonad.Layout.Spacing
22import XMonad.Layout.ThreeColumns
23import XMonad.Layout.ToggleLayouts
24
25import LaNinpreConfig
26
27myKeys :: [(String, X ())]
28myKeys = [ ("M-<Return>", spawn myTerminal)
29 , ("M-w", spawn myBrowser)
30 , ("M-p", spawn "dmenu_run")
31 , ("<Print>", spawn "scrot_cmd -f")
32 , ("C-<Print>", spawn "scrot_cmd -a")
33 , ("M1-<Print>", spawn "scrot_cmd -w")
34
35 , ("M-s t", namedScratchpadAction myScratchPads "terminal")
36 , ("M-s c", namedScratchpadAction myScratchPads "calculator")
37 , ("M-s m", namedScratchpadAction myScratchPads "mocp")
38 , ("M-s v", namedScratchpadAction myScratchPads "mpvfloat")
39
40 , ("M-g t", goToSelected myGsConfig)
41 , ("M-g b", bringSelected myGsConfig)
42 , ("M-g g", mySpawnSelected myGsConfig myAppGrid)
43
44 , ("M-S-c", kill)
45 , ("M-<Space>", sendMessage NextLayout)
46 , ("M-f", sendMessage ToggleLayout)
47 , ("M-h", sendMessage Shrink)
48 , ("M-l", sendMessage Expand)
49 , ("M-j", focusDown)
50 , ("M-k", focusUp)
51 , ("M-S-j", swapDown)
52 , ("M-S-k", swapUp)
53 , ("M-m", focusMaster)
54 , ("M-S-m", windows W.swapMaster)
55 , ("M-t", withFocused $ windows . W.sink)
56 , ("M-S-t", sinkAll)
57 , ("M-<Tab>", toggleWindowSpacingEnabled >> toggleScreenSpacingEnabled)
58
59 , ("M-S-q", io (exitWith ExitSuccess))
60 , ("M-S-r", spawn "xmonad --recompile && xmonad --restart")
61 ]
62 ++
63 [("M-" ++ m ++ show k, windows $ f i)
64 | (i, k) <- zip (myWorkspaces) [1..9]
65 , (f, m) <- [(W.greedyView, ""), (W.shift, "S-")]
66 ]
67
68myColorizer :: a -> Bool -> X (String, String)
69myColorizer _ active = if active then return (col_bg_alt def, col_fg_alt def)
70 else return (col_bg def, col_fg def)
71
72myGsConfig :: GSConfig a
73myGsConfig = (buildDefaultGSConfig myColorizer)
74 { gs_font = head myFonts
75 , gs_bordercolor = col_bg_alt def
76 }
77
78mySpawnSelected :: GSConfig String -> [(String, String)] -> X ()
79mySpawnSelected conf lst = gridselect conf lst >>= flip whenJust spawn
80
81myXmobarPP :: PP
82myXmobarPP = def
83 { ppSep = xmobarColor (col_bg_alt def) "" " | "
84 , ppCurrent = xmobarColor (col_fg_alt def) "" . sitelen
85 , ppHidden = xmobarColor (col_fg def) "" . sitelen
86 , ppHiddenNoWindows = xmobarColor (col_bg_alt def) "" . sitelen
87 } where
88 sitelen = xmobarFont 3
89
90mySB :: StatusBarConfig
91mySB = statusBarProp "xmobar"
92 $ clickablePP $ filterOutWsPP [scratchpadWorkspaceTag] myXmobarPP
93
94myLayout = boringWindows
95 $ toggleLayouts full
96 $ tiled ||| threeCol
97 where
98 tiled = renamed [Replace "lawa"]
99 $ spacingWithEdge space $ Tall nmaster delta ratio
100 threeCol = renamed [Replace "supa"]
101 $ spacingWithEdge space $ ThreeColMid nmaster delta ratio
102 full = renamed [Replace "suli"] $ Full
103 nmaster = 1
104 ratio = 1/2
105 delta = 3/100
106 space = 4
107
108myConfig = def
109 { terminal = myTerminal
110 , modMask = myModMask
111 , layoutHook = myLayout
112 , manageHook = myManageHook <+> namedScratchpadManageHook myScratchPads
113 , workspaces = myWorkspaces
114 , borderWidth = myBorderWidth
115 , keys = const M.empty -- discard default keybindings
116 , normalBorderColor = col_bg def
117 , focusedBorderColor = col_bg_alt def
118 } `additionalKeysP` myKeys
119
120main :: IO ()
121main = xmonad
122 . ewmhFullscreen
123 . ewmh
124 . withEasySB mySB defToggleStrutsKey
125 $ myConfig