This repository has no description
9.5 kB
241 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
161 , ("M4-c", defaultCommands >>= runCommand)
162 , ("M4-v", withWorkspace autoXPConfig (windows . W.greedyView))
163 , ("M4-S-v", withWorkspace autoXPConfig (windows . W.shift))
164 , ("M4-C-v", withWorkspace autoXPConfig (windows . copy))
165
166 , ("M4-m", withFocused minimizeWindow)
167 , ("M4-S-m", withLastMinimized maximizeWindow)
168
169 , ("M4-S-q", return ())
170
171 , ("M4-d", floatNext True >> spawn "${pkgs.writers.writeDash "clipmenu" ''
172 PATH=${
173 lib.makeBinPath [
174 pkgs.coreutils
175 pkgs.gawk
176 pkgs.dmenu
177 ]
178 }
179 ${pkgs.clipmenu}/bin/clipmenu
180 ''}")
181
182 , ("M4-<Insert>", spawn "${pkgs.writers.writeDash "paste" ''
183 ${pkgs.coreutils}/bin/sleep 0.4
184 ${pkgs.xclip}/bin/xclip -o | ${pkgs.xdotool}/bin/xdotool type -f -
185 ''}")
186
187 , ("M4-<F1>", spawn "/run/current-system/sw/bin/gamepad_mouse_toggle")
188 , ("M4-<F2>", windows copyToAll)
189 , ("M4-<F5>", spawn "${pkgs.acpilight}/bin/xbacklight -set 1")
190 , ("M4-<F6>", spawn "${pkgs.acpilight}/bin/xbacklight -set 10")
191 , ("M4-<F7>", spawn "${pkgs.acpilight}/bin/xbacklight -set 33")
192 , ("M4-<F8>", spawn "${pkgs.acpilight}/bin/xbacklight -set 100")
193
194 , ("M4-<F9>", spawn "${pkgs.redshift}/bin/redshift -O 4000 -g 0.9:0.8:0.8")
195 , ("M4-<F10>", spawn "${pkgs.redshift}/bin/redshift -x")
196
197 , ("M4-<F11>", spawn "${config.lass.screenlock.command}")
198
199 , ("M4-u", spawn "${pkgs.xcalib}/bin/xcalib -invert -alter")
200 , ("M4-y", spawn "/run/current-system/sw/bin/switch-theme toggle")
201
202 ${lib.optionalString (builtins.hasAttr "warpd" pkgs) '', ("M4-s", spawn "${pkgs.warpd}/bin/warpd --hint")''}
203 , ("M4-i", spawn "/run/current-system/sw/bin/screenshot")
204
205 --, ("M4-w", screenWorkspace 0 >>= (windows . W.greedyView))
206 --, ("M4-e", screenWorkspace 1 >>= (windows . W.greedyView))
207 --, ("M4-r", screenWorkspace 2 >>= (windows . W.greedyView))
208 ]
209
210 forkFile :: FilePath -> [String] -> Maybe [(String, String)] -> X ()
211 forkFile path args env =
212 xfork (executeFile path True args env) >> return ()
213
214 myXPConfig :: XPConfig
215 myXPConfig = def
216 { font = myFont
217 , height = 40
218 }
219
220 autoXPConfig :: XPConfig
221 autoXPConfig = myXPConfig
222 { autoComplete = Just 5000
223 }
224
225 infixAutoXPConfig :: XPConfig
226 infixAutoXPConfig = autoXPConfig
227 { searchPredicate = isInfixOf
228 }
229
230 gridConfig :: GSConfig WorkspaceId
231 gridConfig = def
232 { gs_cellwidth = 100
233 , gs_cellheight = 30
234 , gs_cellpadding = 2
235 , gs_navigate = navNSearch
236 , gs_font = myFont
237 }
238
239 '';
240 };
241}