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