This repository has no description
9.7 kB
245 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.writeDash "passmenu-wrapped" ''
131 set -efux
132 export TERM=dumb
133 ${pkgs.pass}/bin/passmenu --type
134 ''}" [] Nothing)
135
136 , ("M4-S-p", forkFile "${self.packages.${pkgs.system}.otpmenu}/bin/otpmenu" [] Nothing)
137
138 , ("M4-S-q", restart "xmonad" True)
139
140 , ("<XF86AudioMute>", spawn "${pkgs.pulseaudio.out}/bin/pactl -- set-sink-mute @DEFAULT_SINK@ toggle")
141 , ("<XF86AudioRaiseVolume>", spawn "${pkgs.pulseaudio.out}/bin/pactl -- set-sink-volume @DEFAULT_SINK@ +4%")
142 , ("<XF86AudioLowerVolume>", spawn "${pkgs.pulseaudio.out}/bin/pactl -- set-sink-volume @DEFAULT_SINK@ -4%")
143 , ("<XF86MonBrightnessDown>", spawn "${pkgs.acpilight}/bin/xbacklight -time 0 -dec 1")
144 , ("<XF86MonBrightnessUp>", spawn "${pkgs.acpilight}/bin/xbacklight -time 0 -inc 1")
145 , ("M4-C-k", spawn "${pkgs.xorg.xkill}/bin/xkill")
146
147 , ("M4-<Tab>", focusDown)
148 , ("M4-S-<Tab>", focusUp)
149 , ("M4-j", focusDown)
150 , ("M4-k", focusUp)
151
152 , ("M4-a", focusUrgent)
153 , ("M4-S-r", renameWorkspace myXPConfig)
154 , ("M4-S-a", addWorkspacePrompt myXPConfig)
155 , ("M4-S-<Backspace>", removeEmptyWorkspace)
156 , ("M4-S-c", kill1)
157 , ("M4-<Esc>", toggleWS)
158 , ("M4-S-<Enter>", spawn myTerm)
159 , ("M4-x", floatNext True >> spawn myTerm)
160 , ("M4-c", spawn "/run/current-system/sw/bin/emacsclient -c")
161 -- , ("M4-c", unGrab)
162 , ("M4-f", floatNext True)
163 , ("M4-b", spawn "/run/current-system/sw/bin/klem")
164
165 , ("M4-c", defaultCommands >>= runCommand)
166 , ("M4-v", withWorkspace autoXPConfig (windows . W.greedyView))
167 , ("M4-S-v", withWorkspace autoXPConfig (windows . W.shift))
168 , ("M4-C-v", withWorkspace autoXPConfig (windows . copy))
169
170 , ("M4-m", withFocused minimizeWindow)
171 , ("M4-S-m", withLastMinimized maximizeWindow)
172
173 , ("M4-S-q", return ())
174
175 , ("M4-d", floatNext True >> spawn "${pkgs.writers.writeDash "clipmenu" ''
176 PATH=${
177 lib.makeBinPath [
178 pkgs.coreutils
179 pkgs.gawk
180 pkgs.dmenu
181 ]
182 }
183 ${pkgs.clipmenu}/bin/clipmenu
184 ''}")
185
186 , ("M4-<Insert>", spawn "${pkgs.writers.writeDash "paste" ''
187 ${pkgs.coreutils}/bin/sleep 0.4
188 ${pkgs.xclip}/bin/xclip -o | ${pkgs.xdotool}/bin/xdotool type -f -
189 ''}")
190
191 , ("M4-<F1>", spawn "/run/current-system/sw/bin/gamepad_mouse_toggle")
192 , ("M4-<F2>", windows copyToAll)
193 , ("M4-<F5>", spawn "${pkgs.acpilight}/bin/xbacklight -set 1")
194 , ("M4-<F6>", spawn "${pkgs.acpilight}/bin/xbacklight -set 10")
195 , ("M4-<F7>", spawn "${pkgs.acpilight}/bin/xbacklight -set 33")
196 , ("M4-<F8>", spawn "${pkgs.acpilight}/bin/xbacklight -set 100")
197
198 , ("M4-<F9>", spawn "${pkgs.redshift}/bin/redshift -O 4000 -g 0.9:0.8:0.8")
199 , ("M4-<F10>", spawn "${pkgs.redshift}/bin/redshift -x")
200
201 , ("M4-<F11>", spawn "${config.lass.screenlock.command}")
202
203 , ("M4-u", spawn "${pkgs.xcalib}/bin/xcalib -invert -alter")
204 , ("M4-y", spawn "/run/current-system/sw/bin/switch-theme toggle")
205
206 ${lib.optionalString (builtins.hasAttr "warpd" pkgs) '', ("M4-s", spawn "${pkgs.warpd}/bin/warpd --hint")''}
207 , ("M4-i", spawn "/run/current-system/sw/bin/screenshot")
208
209 --, ("M4-w", screenWorkspace 0 >>= (windows . W.greedyView))
210 --, ("M4-e", screenWorkspace 1 >>= (windows . W.greedyView))
211 --, ("M4-r", screenWorkspace 2 >>= (windows . W.greedyView))
212 ]
213
214 forkFile :: FilePath -> [String] -> Maybe [(String, String)] -> X ()
215 forkFile path args env =
216 xfork (executeFile path True args env) >> return ()
217
218 myXPConfig :: XPConfig
219 myXPConfig = def
220 { font = myFont
221 , height = 40
222 }
223
224 autoXPConfig :: XPConfig
225 autoXPConfig = myXPConfig
226 { autoComplete = Just 5000
227 }
228
229 infixAutoXPConfig :: XPConfig
230 infixAutoXPConfig = autoXPConfig
231 { searchPredicate = isInfixOf
232 }
233
234 gridConfig :: GSConfig WorkspaceId
235 gridConfig = def
236 { gs_cellwidth = 100
237 , gs_cellheight = 30
238 , gs_cellpadding = 2
239 , gs_navigate = navNSearch
240 , gs_font = myFont
241 }
242
243 '';
244 };
245}