xmonad.hs (view raw)
1import System.Exit
2
3import XMonad
4import qualified XMonad.StackSet as W
5
6import XMonad.Actions.GridSelect
7import XMonad.Actions.WithAll
8
9import XMonad.Hooks.DynamicLog
10import XMonad.Hooks.EwmhDesktops
11import XMonad.Hooks.ManageDocks
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.NoBorders
21import XMonad.Layout.Renamed
22import XMonad.Layout.ResizableTile
23import XMonad.Layout.ResizableThreeColumns
24import XMonad.Layout.Simplest
25import XMonad.Layout.Spacing
26import XMonad.Layout.SubLayouts
27import XMonad.Layout.Tabbed
28import XMonad.Layout.ToggleLayouts
29import XMonad.Layout.WindowNavigation
30
31import LaNinpreConfig
32
33myKeys :: [(String, X ())]
34myKeys = [ ("M-<Return>", spawn myTerminal)
35 , ("M-w", spawn myBrowser)
36 , ("M-p", spawn "dmenu_run")
37 , ("M-<Delete>", spawn "slock")
38 , ("<Print>", spawn "scrot_cmd -f")
39 , ("C-<Print>", spawn "scrot_cmd -a")
40 , ("M1-<Print>", spawn "scrot_cmd -w")
41
42 , ("M-s t", namedScratchpadAction myScratchPads "terminal")
43 , ("M-s c", namedScratchpadAction myScratchPads "calculator")
44 , ("M-s m", namedScratchpadAction myScratchPads "mocp")
45 , ("M-s v", namedScratchpadAction myScratchPads "mpvfloat")
46
47 , ("M-g t", goToSelected myGsConfig)
48 , ("M-g b", bringSelected myGsConfig)
49 , ("M-g g", mySpawnSelected myGsConfig myAppGrid)
50
51 , ("M-S-c", kill)
52 , ("M-<Space>", sendMessage NextLayout)
53 , ("M-f", sendMessage ToggleLayout >> sendMessage ToggleStruts)
54 , ("M-h", sendMessage Shrink)
55 , ("M-l", sendMessage Expand)
56 , ("M-C-j", sendMessage MirrorShrink)
57 , ("M-C-k", sendMessage MirrorExpand)
58 , ("M-M1-h", sendMessage $ pullGroup L)
59 , ("M-M1-j", sendMessage $ pullGroup D)
60 , ("M-M1-k", sendMessage $ pullGroup U)
61 , ("M-M1-l", sendMessage $ pullGroup R)
62 , ("M-M1-u", withFocused $ sendMessage . UnMerge)
63 , ("M-M1-m", withFocused $ sendMessage . UnMergeAll)
64 , ("M-M1-,", onGroup W.focusDown')
65 , ("M-M1-.", onGroup W.focusUp')
66 , ("M-j", focusDown)
67 , ("M-k", focusUp)
68 , ("M-S-j", swapDown)
69 , ("M-S-k", swapUp)
70 , ("M-m", focusMaster)
71 , ("M-S-m", windows W.swapMaster)
72 , ("M-t", withFocused $ windows . W.sink)
73 , ("M-S-t", sinkAll)
74 , ("M-<Tab>", toggleWindowSpacingEnabled >> toggleScreenSpacingEnabled)
75
76 , ("M-S-q", io exitSuccess)
77 , ("M-S-r", spawn "xmonad --recompile && xmonad --restart")
78
79 , ("<XF86AudioPlay>", spawn $ myMocp ++ " -G")
80 , ("<XF86AudioRaiseVolume>", spawn $ myMocp ++ " -v +5")
81 , ("<XF86AudioLowerVolume>", spawn $ myMocp ++ " -v -5")
82 , ("<XF86AudioPrev>", spawn $ myMocp ++ " --previous")
83 , ("<XF86AudioNext>", spawn $ myMocp ++ " --next")
84 ]
85 ++
86 [("M-" ++ m ++ show k, windows $ f i)
87 | (i, k) <- zip myWorkspaces [1..9]
88 , (f, m) <- [(W.greedyView, ""), (W.shift, "S-")]
89 ]
90
91myColorizer :: a -> Bool -> X (String, String)
92myColorizer _ active = if active then return (col_bg_alt def, col_fg_alt def)
93 else return (col_bg def, col_fg def)
94
95myGsConfig :: GSConfig a
96myGsConfig = (buildDefaultGSConfig myColorizer)
97 { gs_font = head myFonts
98 , gs_bordercolor = col_bg_alt def
99 }
100
101mySpawnSelected :: GSConfig String -> [(String, String)] -> X ()
102mySpawnSelected conf lst = gridselect conf lst >>= flip whenJust spawn
103
104myXmobarPP :: PP
105myXmobarPP = def
106 { ppSep = xmobarColor (col_bg_alt def) "" " | "
107 , ppCurrent = xmobarColor (col_fg_alt def) "" . sitelen
108 , ppHidden = xmobarColor (col_fg def) "" . sitelen
109 , ppHiddenNoWindows = xmobarColor (col_bg_alt def) "" . sitelen
110 , ppLayout = sitelen
111 } where
112 sitelen = xmobarFont 3
113
114mySB :: StatusBarConfig
115mySB = statusBarProp "xmobar"
116 $ clickablePP $ filterOutWsPP [scratchpadWorkspaceTag] myXmobarPP
117
118myTabTheme :: Theme
119myTabTheme = def
120 { fontName = head myFonts
121 , activeTextColor = col_fg_alt def
122 , activeColor = col_bg_alt def
123 , activeBorderWidth = 0
124 , inactiveTextColor = col_fg def
125 , inactiveColor = col_bg def
126 , inactiveBorderWidth = 0
127 , urgentTextColor = col_bg_alt def
128 , urgentColor = col_fg_alt def
129 , urgentBorderWidth = 0
130 }
131
132myLayout = windowNavigation
133 $ boringWindows
134 $ toggleLayouts full
135 $ smartBorders
136 $ tiled ||| threeCol
137 where
138 tiled = renamed [Replace "\xe624"] -- lawa
139 $ addTabs shrinkText myTabTheme
140 $ subLayout [] Simplest
141 $ spacingWithEdge space $ ResizableTall nmaster delta ratio []
142 threeCol = renamed [Replace "\xe665"] -- supa
143 $ addTabs shrinkText myTabTheme
144 $ subLayout [] Simplest
145 $ spacingWithEdge space $ ResizableThreeColMid nmaster delta ratio []
146 full = renamed [Replace "\xe663"] -- suli
147 $ noBorders Full
148 nmaster = 1
149 ratio = 1/2
150 delta = 3/100
151 space = 4
152
153myConfig = def
154 { terminal = myTerminal
155 , modMask = myModMask
156 , layoutHook = myLayout
157 , manageHook = myManageHook
158 , workspaces = myWorkspaces
159 , borderWidth = myBorderWidth
160 , keys = (`mkKeymap` myKeys)
161 , normalBorderColor = col_bg_alt def
162 , focusedBorderColor = col_fg_alt def
163 , startupHook = return () >> checkKeymap myConfig myKeys
164 }
165
166main :: IO ()
167main = xmonad
168 . ewmhFullscreen
169 . ewmh
170 . withEasySB mySB defToggleStrutsKey
171 $ myConfig