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