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 } where
106 sitelen = xmobarFont 3
107
108mySB :: StatusBarConfig
109mySB = statusBarProp "xmobar"
110 $ clickablePP $ filterOutWsPP [scratchpadWorkspaceTag] myXmobarPP
111
112myTabTheme :: Theme
113myTabTheme = def
114 { fontName = head myFonts
115 , activeTextColor = col_fg_alt def
116 , activeColor = col_bg_alt def
117 , activeBorderWidth = myBorderWidth
118 , inactiveTextColor = col_fg def
119 , inactiveColor = col_bg def
120 , inactiveBorderWidth = myBorderWidth
121 , urgentTextColor = col_bg_alt def
122 , urgentColor = col_fg_alt def
123 , urgentBorderWidth = myBorderWidth
124 }
125
126myLayout = windowNavigation
127 $ boringWindows
128 $ toggleLayouts full
129 $ smartBorders
130 $ tiled ||| threeCol
131 where
132 tiled = renamed [Replace "lawa"]
133 $ addTabs shrinkText myTabTheme
134 $ subLayout [] (Simplest)
135 $ spacingWithEdge space $ ResizableTall nmaster delta ratio []
136 threeCol = renamed [Replace "supa"]
137 $ addTabs shrinkText myTabTheme
138 $ subLayout [] (Simplest)
139 $ spacingWithEdge space $ ResizableThreeColMid nmaster delta ratio []
140 full = renamed [Replace "suli"] $ noBorders Full
141 nmaster = 1
142 ratio = 1/2
143 delta = 3/100
144 space = 4
145
146myConfig = def
147 { terminal = myTerminal
148 , modMask = myModMask
149 , layoutHook = myLayout
150 , manageHook = myManageHook
151 , workspaces = myWorkspaces
152 , borderWidth = myBorderWidth
153 , keys = const M.empty -- discard default keybindings
154 , normalBorderColor = col_bg def
155 , focusedBorderColor = col_bg_alt def
156 , startupHook = return () >> checkKeymap myConfig myKeys
157 } `additionalKeysP` myKeys
158
159main :: IO ()
160main = xmonad
161 . ewmhFullscreen
162 . ewmh
163 . withEasySB mySB defToggleStrutsKey
164 $ myConfig