This repository has no description
8.4 kB
236 lines
1{ config, lib, pkgs, ... }:
2
3{
4 services.xserver.windowManager.xmonad = {
5 enable = true;
6 extraPackages = hs: [
7 hs.extra
8 hs.xmonad-contrib
9 ];
10 config = /* haskell */ ''
11{-# LANGUAGE LambdaCase #-}
12
13
14module Main where
15import XMonad
16
17import qualified XMonad.StackSet as W
18import Control.Monad.Extra (whenJustM)
19import Data.List (isInfixOf)
20import Data.Monoid (Endo)
21import System.Environment (getArgs, lookupEnv)
22import System.Exit (exitFailure)
23import System.IO (hPutStrLn, stderr)
24import System.Posix.Process (executeFile)
25import Data.Ratio
26
27import XMonad.Actions.Commands (defaultCommands, runCommand)
28import XMonad.Actions.CopyWindow (copy, copyToAll, kill1)
29import XMonad.Actions.CycleWS (toggleWS)
30import XMonad.Actions.DynamicWorkspaces ( addWorkspacePrompt, renameWorkspace, removeEmptyWorkspace)
31import XMonad.Actions.DynamicWorkspaces (withWorkspace)
32import XMonad.Actions.GridSelect (GSConfig(..), gridselectWorkspace, navNSearch)
33import XMonad.Actions.Minimize (minimizeWindow, maximizeWindow, withLastMinimized)
34import XMonad.Hooks.EwmhDesktops (ewmh)
35import XMonad.Hooks.FloatNext (floatNext)
36import XMonad.Hooks.FloatNext (floatNextHook)
37import XMonad.Hooks.ManageDocks (avoidStruts, ToggleStruts(ToggleStruts))
38import XMonad.Hooks.ManageHelpers (doCenterFloat, doRectFloat, (-?>))
39import XMonad.Hooks.Place (placeHook, smart)
40import XMonad.Hooks.UrgencyHook (focusUrgent)
41import XMonad.Hooks.UrgencyHook (withUrgencyHook, UrgencyHook(..))
42import XMonad.Layout.BoringWindows (boringWindows, focusDown, focusUp)
43import XMonad.Layout.FixedColumn (FixedColumn(..))
44import XMonad.Layout.Grid (Grid(..))
45import XMonad.Layout.Minimize (minimize)
46import XMonad.Layout.NoBorders (smartBorders, noBorders)
47import XMonad.Layout.MouseResizableTile (mouseResizableTile)
48import XMonad.Layout.SimplestFloat (simplestFloat)
49import XMonad.Layout.StateFull
50import XMonad.ManageHook (composeAll)
51import XMonad.Prompt (autoComplete, font, height, searchPredicate, XPConfig)
52import XMonad.Prompt.Window (windowPromptGoto, windowPromptBringCopy)
53import XMonad.Util.EZConfig (additionalKeysP)
54import XMonad.Util.NamedWindows (getName)
55import XMonad.Util.Run (safeSpawn)
56import XMonad.Util.Ungrab (unGrab)
57import XMonad.Util.Paste (sendKey)
58
59data LibNotifyUrgencyHook = LibNotifyUrgencyHook deriving (Read, Show)
60
61instance UrgencyHook LibNotifyUrgencyHook where
62 urgencyHook LibNotifyUrgencyHook w = do
63 name <- getName w
64 Just idx <- fmap (W.findTag w) $ gets windowset
65
66 safeSpawn "${pkgs.libnotify}/bin/notify-send" [show name, "workspace " ++ idx]
67
68myTerm :: FilePath
69myTerm = "/run/current-system/sw/bin/alacritty"
70
71myFont :: String
72myFont = "${config.lass.fonts.regular}"
73
74main :: IO ()
75main = do
76 xmonad $ ewmh
77 $ withUrgencyHook LibNotifyUrgencyHook
78 $ def
79 { terminal = myTerm
80 , modMask = mod4Mask
81 , layoutHook = myLayoutHook
82 , manageHook = floatHooks
83 , startupHook =
84 whenJustM (liftIO (lookupEnv "XMONAD_STARTUP_HOOK"))
85 (\path -> forkFile path [] Nothing)
86 , normalBorderColor = "#1c1c1c"
87 , focusedBorderColor = "#ff0000"
88 , workspaces = [ "dashboard", "sys", "wp" ]
89 } `additionalKeysP` myKeyMap
90
91myLayoutHook = defLayout
92 where
93 defLayout = smartBorders $
94 minimize .
95 boringWindows $
96 (
97 noBorders StateFull |||
98 (avoidStruts $ Mirror (Tall 1 (3/100) (1/2))) |||
99 FixedColumn 2 80 80 1 |||
100 Tall 1 (3/100) (1/2) |||
101 simplestFloat |||
102 mouseResizableTile |||
103 Grid
104 )
105
106floatHooks = composeAll
107 [ className =? "Pinentry" --> doCenterFloat
108 , className =? "Pager" --> doCenterFloat
109 , title =? "pager" --> doCenterFloat
110 , title =? "fzfmenu" --> doCenterFloat
111 , title =? "glxgears" --> doCenterFloat
112 , resource =? "Dialog" --> doFloat
113 , title =? "Upload to Imgur" -->
114 doRectFloat (W.RationalRect 0 0 (1 % 8) (1 % 8))
115 , placeHook (smart (1,0))
116 , floatNextHook
117 ]
118
119myKeyMap :: [([Char], X ())]
120myKeyMap =
121 [ ("M4-p", forkFile "${pkgs.pass}/bin/passmenu" [ "--type" ] Nothing)
122 , ("M4-S-p", forkFile "${pkgs.otpmenu}/bin/otpmenu" [] Nothing)
123 , ("M4-z", forkFile "${pkgs.unimenu}/bin/unimenu" [] Nothing)
124
125 , ("M4-S-q", restart "xmonad" True)
126
127 , ("<XF86AudioMute>", spawn "${pkgs.pulseaudio.out}/bin/pactl -- set-sink-mute @DEFAULT_SINK@ toggle")
128 , ("<XF86AudioRaiseVolume>", spawn "${pkgs.pulseaudio.out}/bin/pactl -- set-sink-volume @DEFAULT_SINK@ +4%")
129 , ("<XF86AudioLowerVolume>", spawn "${pkgs.pulseaudio.out}/bin/pactl -- set-sink-volume @DEFAULT_SINK@ -4%")
130 , ("<XF86MonBrightnessDown>", spawn "${pkgs.acpilight}/bin/xbacklight -time 0 -dec 1")
131 , ("<XF86MonBrightnessUp>", spawn "${pkgs.acpilight}/bin/xbacklight -time 0 -inc 1")
132 , ("M4-C-k", spawn "${pkgs.xorg.xkill}/bin/xkill")
133
134 , ("M4-<Tab>", focusDown)
135 , ("M4-S-<Tab>", focusUp)
136 , ("M4-j", focusDown)
137 , ("M4-k", focusUp)
138
139 , ("M4-a", focusUrgent)
140 , ("M4-S-r", renameWorkspace myXPConfig)
141 , ("M4-S-a", addWorkspacePrompt myXPConfig)
142 , ("M4-S-<Backspace>", removeEmptyWorkspace)
143 , ("M4-S-c", kill1)
144 , ("M4-<Esc>", toggleWS)
145 , ("M4-S-<Enter>", spawn myTerm)
146 , ("M4-x", floatNext True >> spawn myTerm)
147 , ("M4-c", spawn "/run/current-system/sw/bin/emacsclient -c")
148 -- , ("M4-c", unGrab)
149 , ("M4-f", floatNext True)
150 , ("M4-b", spawn "/run/current-system/sw/bin/klem")
151
152 , ("M4-c", defaultCommands >>= runCommand)
153 -- , ("M4-v", spawn "${pkgs.pager}/bin/pager view")
154 -- , ("M4-S-v", spawn "${pkgs.pager}/bin/pager shift")
155 , ("M4-v", withWorkspace autoXPConfig (windows . W.greedyView))
156 , ("M4-S-v", withWorkspace autoXPConfig (windows . W.shift))
157 , ("M4-C-v", withWorkspace autoXPConfig (windows . copy))
158
159 , ("M4-m", withFocused minimizeWindow)
160 , ("M4-S-m", withLastMinimized maximizeWindow)
161
162 , ("M4-q", windowPromptGoto infixAutoXPConfig)
163 , ("M4-C-q", windowPromptBringCopy infixAutoXPConfig)
164
165 , ("M4-S-q", return ())
166
167 , ("M4-d", floatNext True >> spawn "${pkgs.writers.writeDash "clipmenu" ''
168 PATH=${lib.makeBinPath [
169 pkgs.coreutils
170 pkgs.gawk
171 pkgs.dmenu
172 ]}
173 ${pkgs.clipmenu}/bin/clipmenu
174 ''}")
175
176 , ("M4-<Insert>", spawn "${pkgs.writers.writeDash "paste" ''
177 ${pkgs.coreutils}/bin/sleep 0.4
178 ${pkgs.xclip}/bin/xclip -o | ${pkgs.xdotool}/bin/xdotool type -f -
179 ''}")
180
181 , ("M4-<F1>", spawn "/run/current-system/sw/bin/gamepad_mouse_toggle")
182 , ("M4-<F2>", windows copyToAll)
183 , ("M4-<F4>", spawn "${pkgs.nm-dmenu}/bin/nm-dmenu")
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}