forked from
lass.pds.lassul.us/superconfig
This repository has no description
9.6 kB
243 lines
1{
2 self,
3 config,
4 lib,
5 pkgs,
6 ...
7}:
8
9{
10 imports = [
11 ../lib/x11.nix
12 ];
13 services.xserver.windowManager.xmonad = {
14 enable = true;
15 extraPackages = hs: [
16 hs.extra
17 hs.xmonad-contrib
18 ];
19 config = # haskell
20 ''
21 {-# LANGUAGE LambdaCase #-}
22
23
24 module Main where
25 import XMonad
26
27 import qualified XMonad.StackSet as W
28 import Control.Monad.Extra (whenJustM)
29 import Data.List (isInfixOf)
30 import Data.Monoid (Endo)
31 import System.Environment (getArgs, lookupEnv)
32 import System.Exit (exitFailure)
33 import System.IO (hPutStrLn, stderr)
34 import System.Posix.Process (executeFile)
35 import Data.Ratio
36
37 import XMonad.Actions.Commands (defaultCommands, runCommand)
38 import XMonad.Actions.CopyWindow (copy, copyToAll, kill1)
39 import XMonad.Actions.CycleWS (toggleWS)
40 import XMonad.Actions.DynamicWorkspaces ( addWorkspacePrompt, renameWorkspace, removeEmptyWorkspace)
41 import XMonad.Actions.DynamicWorkspaces (withWorkspace)
42 import XMonad.Actions.GridSelect (GSConfig(..), gridselectWorkspace, navNSearch)
43 import XMonad.Actions.Minimize (minimizeWindow, maximizeWindow, withLastMinimized)
44 import XMonad.Hooks.EwmhDesktops (ewmh)
45 import XMonad.Hooks.FloatNext (floatNext)
46 import XMonad.Hooks.FloatNext (floatNextHook)
47 import XMonad.Hooks.ManageDocks (avoidStruts, ToggleStruts(ToggleStruts))
48 import XMonad.Hooks.ManageHelpers (doCenterFloat, doRectFloat, (-?>))
49 import XMonad.Hooks.Place (placeHook, smart)
50 import XMonad.Hooks.UrgencyHook (focusUrgent)
51 import XMonad.Hooks.UrgencyHook (withUrgencyHook, UrgencyHook(..))
52 import XMonad.Layout.BoringWindows (boringWindows, focusDown, focusUp)
53 import XMonad.Layout.FixedColumn (FixedColumn(..))
54 import XMonad.Layout.Grid (Grid(..))
55 import XMonad.Layout.Minimize (minimize)
56 import XMonad.Layout.NoBorders (smartBorders, noBorders)
57 import XMonad.Layout.MouseResizableTile (mouseResizableTile)
58 import XMonad.Layout.SimplestFloat (simplestFloat)
59 import XMonad.Layout.StateFull
60 import XMonad.ManageHook (composeAll)
61 import XMonad.Prompt (autoComplete, font, height, searchPredicate, XPConfig)
62 import XMonad.Util.EZConfig (additionalKeysP)
63 import XMonad.Util.NamedWindows (getName)
64 import XMonad.Util.Run (safeSpawn)
65 import XMonad.Util.Ungrab (unGrab)
66 import XMonad.Util.Paste (sendKey)
67
68 data LibNotifyUrgencyHook = LibNotifyUrgencyHook deriving (Read, Show)
69
70 instance UrgencyHook LibNotifyUrgencyHook where
71 urgencyHook LibNotifyUrgencyHook w = do
72 name <- getName w
73 Just idx <- fmap (W.findTag w) $ gets windowset
74
75 safeSpawn "${pkgs.libnotify}/bin/notify-send" [show name, "workspace " ++ idx]
76
77 myTerm :: FilePath
78 myTerm = "/run/current-system/sw/bin/alacritty"
79
80 myFont :: String
81 myFont = "${config.lass.fonts.regular}"
82
83 main :: IO ()
84 main = do
85 xmonad $ ewmh
86 $ withUrgencyHook LibNotifyUrgencyHook
87 $ def
88 { terminal = myTerm
89 , modMask = mod4Mask
90 , layoutHook = myLayoutHook
91 , manageHook = floatHooks
92 , startupHook =
93 whenJustM (liftIO (lookupEnv "XMONAD_STARTUP_HOOK"))
94 (\path -> forkFile path [] Nothing)
95 , normalBorderColor = "#1c1c1c"
96 , focusedBorderColor = "#ff0000"
97 , workspaces = [ "dashboard", "sys", "wp" ]
98 } `additionalKeysP` myKeyMap
99
100 myLayoutHook = defLayout
101 where
102 defLayout = smartBorders $
103 minimize .
104 boringWindows $
105 (
106 noBorders StateFull |||
107 (avoidStruts $ Mirror (Tall 1 (3/100) (1/2))) |||
108 FixedColumn 2 80 80 1 |||
109 Tall 1 (3/100) (1/2) |||
110 simplestFloat |||
111 mouseResizableTile |||
112 Grid
113 )
114
115 floatHooks = composeAll
116 [ className =? "Pinentry" --> doCenterFloat
117 , className =? "Pager" --> doCenterFloat
118 , title =? "pager" --> doCenterFloat
119 , title =? "fzfmenu" --> doCenterFloat
120 , title =? "glxgears" --> doCenterFloat
121 , resource =? "Dialog" --> doFloat
122 , title =? "Upload to Imgur" -->
123 doRectFloat (W.RationalRect 0 0 (1 % 8) (1 % 8))
124 , placeHook (smart (1,0))
125 , floatNextHook
126 ]
127
128 myKeyMap :: [([Char], X ())]
129 myKeyMap =
130 [ ("M4-p", forkFile "${pkgs.writers.writeDashBin "passmenu" ''
131 set -efux
132 export TERM=dumb
133 ${pkgs.pass}/bin/passmenu --type
134 ''}" [] Nothing)
135
136 , ("M4-S-q", restart "xmonad" True)
137
138 , ("<XF86AudioMute>", spawn "${pkgs.pulseaudio.out}/bin/pactl -- set-sink-mute @DEFAULT_SINK@ toggle")
139 , ("<XF86AudioRaiseVolume>", spawn "${pkgs.pulseaudio.out}/bin/pactl -- set-sink-volume @DEFAULT_SINK@ +4%")
140 , ("<XF86AudioLowerVolume>", spawn "${pkgs.pulseaudio.out}/bin/pactl -- set-sink-volume @DEFAULT_SINK@ -4%")
141 , ("<XF86MonBrightnessDown>", spawn "${pkgs.acpilight}/bin/xbacklight -time 0 -dec 1")
142 , ("<XF86MonBrightnessUp>", spawn "${pkgs.acpilight}/bin/xbacklight -time 0 -inc 1")
143 , ("M4-C-k", spawn "${pkgs.xorg.xkill}/bin/xkill")
144
145 , ("M4-<Tab>", focusDown)
146 , ("M4-S-<Tab>", focusUp)
147 , ("M4-j", focusDown)
148 , ("M4-k", focusUp)
149
150 , ("M4-a", focusUrgent)
151 , ("M4-S-r", renameWorkspace myXPConfig)
152 , ("M4-S-a", addWorkspacePrompt myXPConfig)
153 , ("M4-S-<Backspace>", removeEmptyWorkspace)
154 , ("M4-S-c", kill1)
155 , ("M4-<Esc>", toggleWS)
156 , ("M4-S-<Enter>", spawn myTerm)
157 , ("M4-x", floatNext True >> spawn myTerm)
158 , ("M4-c", spawn "/run/current-system/sw/bin/emacsclient -c")
159 -- , ("M4-c", unGrab)
160 , ("M4-f", floatNext True)
161 , ("M4-b", spawn "/run/current-system/sw/bin/klem")
162
163 , ("M4-c", defaultCommands >>= runCommand)
164 , ("M4-v", withWorkspace autoXPConfig (windows . W.greedyView))
165 , ("M4-S-v", withWorkspace autoXPConfig (windows . W.shift))
166 , ("M4-C-v", withWorkspace autoXPConfig (windows . copy))
167
168 , ("M4-m", withFocused minimizeWindow)
169 , ("M4-S-m", withLastMinimized maximizeWindow)
170
171 , ("M4-S-q", return ())
172
173 , ("M4-d", floatNext True >> spawn "${pkgs.writers.writeDash "clipmenu" ''
174 PATH=${
175 lib.makeBinPath [
176 pkgs.coreutils
177 pkgs.gawk
178 pkgs.dmenu
179 ]
180 }
181 ${pkgs.clipmenu}/bin/clipmenu
182 ''}")
183
184 , ("M4-<Insert>", spawn "${pkgs.writers.writeDash "paste" ''
185 ${pkgs.coreutils}/bin/sleep 0.4
186 ${pkgs.xclip}/bin/xclip -o | ${pkgs.xdotool}/bin/xdotool type -f -
187 ''}")
188
189 , ("M4-<F1>", spawn "/run/current-system/sw/bin/gamepad_mouse_toggle")
190 , ("M4-<F2>", windows copyToAll)
191 , ("M4-<F5>", spawn "${pkgs.acpilight}/bin/xbacklight -set 1")
192 , ("M4-<F6>", spawn "${pkgs.acpilight}/bin/xbacklight -set 10")
193 , ("M4-<F7>", spawn "${pkgs.acpilight}/bin/xbacklight -set 33")
194 , ("M4-<F8>", spawn "${pkgs.acpilight}/bin/xbacklight -set 100")
195
196 , ("M4-<F9>", spawn "${pkgs.redshift}/bin/redshift -O 4000 -g 0.9:0.8:0.8")
197 , ("M4-<F10>", spawn "${pkgs.redshift}/bin/redshift -x")
198
199 , ("M4-<F11>", spawn "${config.lass.screenlock.command}")
200
201 , ("M4-u", spawn "${pkgs.xcalib}/bin/xcalib -invert -alter")
202 , ("M4-y", spawn "/run/current-system/sw/bin/switch-theme toggle")
203
204 ${lib.optionalString (builtins.hasAttr "warpd" pkgs) '', ("M4-s", spawn "${pkgs.warpd}/bin/warpd --hint")''}
205 , ("M4-i", spawn "/run/current-system/sw/bin/screenshot")
206
207 --, ("M4-w", screenWorkspace 0 >>= (windows . W.greedyView))
208 --, ("M4-e", screenWorkspace 1 >>= (windows . W.greedyView))
209 --, ("M4-r", screenWorkspace 2 >>= (windows . W.greedyView))
210 ]
211
212 forkFile :: FilePath -> [String] -> Maybe [(String, String)] -> X ()
213 forkFile path args env =
214 xfork (executeFile path True args env) >> return ()
215
216 myXPConfig :: XPConfig
217 myXPConfig = def
218 { font = myFont
219 , height = 40
220 }
221
222 autoXPConfig :: XPConfig
223 autoXPConfig = myXPConfig
224 { autoComplete = Just 5000
225 }
226
227 infixAutoXPConfig :: XPConfig
228 infixAutoXPConfig = autoXPConfig
229 { searchPredicate = isInfixOf
230 }
231
232 gridConfig :: GSConfig WorkspaceId
233 gridConfig = def
234 { gs_cellwidth = 100
235 , gs_cellheight = 30
236 , gs_cellpadding = 2
237 , gs_navigate = navNSearch
238 , gs_font = myFont
239 }
240
241 '';
242 };
243}