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 XMonad.Config.LaNinpre
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 , ("<XF86AudioMute>", spawn $ myMocp ++ " -v 0")
83 , ("<XF86AudioPrev>", spawn $ myMocp ++ " --previous")
84 , ("<XF86AudioNext>", spawn $ myMocp ++ " --next")
85 ]
86 ++
87 [("M-" ++ m ++ show k, windows $ f i)
88 | (i, k) <- zip myWorkspaces [1..9]
89 , (f, m) <- [(W.greedyView, ""), (W.shift, "S-")]
90 ]
91
92myColorizer :: a -> Bool -> X (String, String)
93myColorizer _ active = if active then return (col_bg_alt def, col_fg_alt def)
94 else return (col_bg def, col_fg def)
95
96myGsConfig :: GSConfig a
97myGsConfig = (buildDefaultGSConfig myColorizer)
98 { gs_font = head myFonts
99 , gs_bordercolor = col_bg_alt def
100 }
101
102mySpawnSelected :: GSConfig String -> [(String, String)] -> X ()
103mySpawnSelected conf lst = gridselect conf lst >>= flip whenJust spawn
104
105myXmobarPP :: PP
106myXmobarPP = def
107 { ppSep = xmobarColor (col_bg_alt def) "" " | "
108 , ppCurrent = xmobarColor (col_fg_alt def) "" . sitelen
109 , ppHidden = xmobarColor (col_fg def) "" . sitelen
110 , ppHiddenNoWindows = xmobarColor (col_bg_alt def) "" . sitelen
111 , ppLayout = sitelen
112 } where
113 sitelen = xmobarFont 3
114
115mySB :: StatusBarConfig
116mySB = statusBarProp "xmobar"
117 $ clickablePP $ filterOutWsPP [scratchpadWorkspaceTag] myXmobarPP
118
119myTabTheme :: Theme
120myTabTheme = def
121 { fontName = head myFonts
122 , activeTextColor = col_fg_alt def
123 , activeColor = col_bg_alt def
124 , activeBorderWidth = 0
125 , inactiveTextColor = col_fg def
126 , inactiveColor = col_bg def
127 , inactiveBorderWidth = 0
128 , urgentTextColor = col_bg_alt def
129 , urgentColor = col_fg_alt def
130 , urgentBorderWidth = 0
131 }
132
133myLayout = windowNavigation
134 $ boringWindows
135 $ toggleLayouts full
136 $ smartBorders
137 $ tiled ||| threeCol
138 where
139 tiled = renamed [Replace "\xe624"] -- lawa
140 $ addTabs shrinkText myTabTheme
141 $ subLayout [] Simplest
142 $ spacingWithEdge space $ ResizableTall nmaster delta ratio []
143 threeCol = renamed [Replace "\xe665"] -- supa
144 $ addTabs shrinkText myTabTheme
145 $ subLayout [] Simplest
146 $ spacingWithEdge space $ ResizableThreeColMid nmaster delta ratio []
147 full = renamed [Replace "\xe663"] -- suli
148 $ noBorders Full
149 nmaster = 1
150 ratio = 1/2
151 delta = 3/100
152 space = 4
153
154myConfig = def
155 { terminal = myTerminal
156 , modMask = myModMask
157 , layoutHook = myLayout
158 , manageHook = myManageHook
159 , workspaces = myWorkspaces
160 , borderWidth = myBorderWidth
161 , keys = (`mkKeymap` myKeys)
162 , normalBorderColor = col_bg_alt def
163 , focusedBorderColor = col_fg_alt def
164 , startupHook = return () >> checkKeymap myConfig myKeys
165 }
166
167main :: IO ()
168main = xmonad
169 . ewmhFullscreen
170 . ewmh
171 . withEasySB mySB defToggleStrutsKey
172 $ myConfig