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