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