dots/.xmonad/xmonad.hs

277 lines
8.9 KiB
Haskell
Raw Normal View History

2023-06-02 22:12:39 +02:00
-- {{{
2022-12-01 16:21:19 +01:00
import XMonad
import XMonad.Hooks.DynamicLog
import XMonad.Hooks.EwmhDesktops
import XMonad.Hooks.ManageDocks
import XMonad.Hooks.ManageHelpers
import XMonad.Hooks.StatusBar
import XMonad.Hooks.StatusBar.PP
import XMonad.Layout.Magnifier
import qualified XMonad.Layout.Magnifier as Mag (MagnifyMsg (..))
import XMonad.Layout.NoBorders (hasBorder, smartBorders)
import XMonad.Layout.PerScreen
import XMonad.Layout.ResizableTile
import XMonad.Layout.Spacing
import XMonad.Layout.ThreeColumns
import XMonad.Layout.ToggleLayouts
( ToggleLayout (..),
toggleLayouts,
)
import XMonad.Layout.IndependentScreens
2022-12-01 16:21:19 +01:00
import XMonad.Layout.WindowNavigation
import qualified XMonad.StackSet as W
import XMonad.Util.EZConfig
import qualified XMonad.Util.Hacks as Hacks
import XMonad.Util.Loggers
import XMonad.Util.Paste
import XMonad.Util.Run
( spawnExternalProcess,
spawnPipe,
)
import XMonad.Util.Ungrab
2023-06-02 22:12:39 +02:00
-- }}}
-- Statusbar {{{
2022-09-23 00:46:34 +02:00
2023-06-02 22:21:03 +02:00
pp' :: ScreenId -> PP -> PP
pp' s pp = (marshallPP s pp) { ppSort = ppSort pp }
pp :: PP
pp =
2022-12-01 16:18:44 +01:00
def
2023-05-04 23:57:30 +02:00
{ ppSep = tertiaryColor " ",
2022-12-01 16:18:44 +01:00
ppCurrent = brackitify,
ppHidden = secondaryColor,
ppHiddenNoWindows = tertiaryColor,
ppUrgent = red . wrap (yellow "!") (yellow "!"),
2023-06-02 22:22:42 +02:00
ppLayout = id,
2022-12-01 16:18:44 +01:00
ppTitle = shorten 80,
ppTitleSanitize = xmobarStrip,
2023-06-02 22:22:42 +02:00
ppOrder = \[workspaces, layout, windows, _] -> [workspaces, layout, windows],
2022-12-01 16:18:44 +01:00
ppExtras = [logTitles formatFocused formatUnfocused]
2022-10-25 21:11:18 +02:00
}
where
2023-05-04 23:57:30 +02:00
brackitify = wrap "" ""
formatFocused = secondaryColor . ppWindow
2022-10-25 21:11:18 +02:00
formatUnfocused = tertiaryColor . ppWindow
2022-09-24 01:07:06 +02:00
2022-10-25 21:11:18 +02:00
ppWindow = xmobarRaw . (\w -> if null w then "Untitled" else w) . shorten 16
2022-09-24 01:07:06 +02:00
2022-12-01 16:18:44 +01:00
primaryColor = xmobarColor "#000000" ""
secondaryColor = xmobarColor "#333333" ""
tertiaryColor = xmobarColor "#555555" ""
yellow = xmobarColor "#ff0" ""
red = xmobarColor "#ff5555" ""
2022-09-24 01:07:06 +02:00
2023-06-02 22:12:39 +02:00
-- }}}
-- Workspaces & screens {{{
2022-10-25 21:15:15 +02:00
-- Shift to workspace and view workspace
shiftAndView id = doF (W.view id) <> doF (W.shift id)
2022-09-23 00:46:34 +02:00
2023-06-04 15:00:30 +02:00
-- }}}
-- Hooks {{{
2023-05-21 18:27:55 +02:00
-- startupHook
myStartupHook =
do
spawn "albert"
2022-10-25 21:15:15 +02:00
-- manageHook
2023-06-04 14:48:23 +02:00
myManageHook :: ManageHook
2022-12-01 16:21:19 +01:00
myManageHook =
composeAll
2023-06-04 14:48:23 +02:00
[ isDialog --> doCenterFloat,
className =? "Zathura" --> doShift "1_info",
className =? "firefox" --> shiftAndView "1_www",
className =? "firefoxdeveloperedition" --> shiftAndView "1_www",
className =? "Anki" --> shiftAndView "1_etc",
className =? "Obsidian" --> shiftAndView "1_etc",
2022-12-01 16:21:19 +01:00
className =? "Launcher" --> doRectFloat (W.RationalRect 0.05 0.4 0.9 0.5),
2023-06-04 14:48:23 +02:00
className =? "Zettelkasten" --> doRectFloat (W.RationalRect 0.05 0.4 0.9 0.5),
2022-12-01 16:21:19 +01:00
className =? "Calculator" --> doCenterFloat,
className =? "feh" --> doCenterFloat,
2023-06-04 14:48:23 +02:00
-- Center matplotlib and prevent focus stealing
-- className =? "matplotlib" --> doRectFloat (W.RationalRect 0.5 0.5 0.5 0.5),
className =? "matplotlib" --> doCenterFloat,
2023-05-21 18:23:55 +02:00
className =? "Matplotlib" --> doCenterFloat,
className =? "Xournalpp" --> doRectFloat (W.RationalRect 0.5 0.5 0.5 0.5),
2023-06-04 14:48:23 +02:00
className =? "KeePassXC" --> doRectFloat (W.RationalRect 0.1 0.1 0.8 0.8),
className =? "flameshot" --> doRectFloat (W.RationalRect 0.1 0.1 0.8 0.8)
2022-12-01 16:21:19 +01:00
]
2022-09-23 00:46:34 +02:00
myDynamicManageHook :: ManageHook
myDynamicManageHook =
composeAll
[
title =? "Zettelkasten — Firefox Developer Edition" --> doShift "1_sh"
]
2022-10-25 21:14:38 +02:00
-- layoutHook
2022-12-01 16:21:19 +01:00
myLayoutHook =
2023-06-02 22:22:42 +02:00
showWName' myShowWNameConfig $
2023-06-04 14:49:51 +02:00
ifWider smallWidth (
t ||| -- Tiled layouts
c3 ||| -- Column layouts
c3m ||| --
f -- Monocle layouts
) (
t ||| -- Tiled layouts
f -- Monocle layouts
)
2022-09-24 01:07:06 +02:00
where
2023-06-04 14:49:51 +02:00
smallWidth = 1920
t = renamed [Replace "[]+"] $ ifWider smallWidth (centeredIfSingle 0.8 0.9 $ Tall nmaster delta ratio)
(Tall nmaster delta ratio)
2023-06-02 22:22:42 +02:00
c3 = renamed [Replace "|||"] $ ThreeCol nmaster delta ratio
c3m = renamed [Replace "[|]"] $ ThreeColMid nmaster delta ratio
f = renamed [Replace "[+]"] Full
2022-09-24 01:07:06 +02:00
nmaster = 1
2022-12-01 16:21:19 +01:00
ratio = 1 / 2
delta = 4 / 100
2022-09-24 01:07:06 +02:00
2023-06-04 15:00:30 +02:00
-- }}}
-- Main config {{{
myWorkspaces = [ "sh", "www", "dev", "info", "etc" ]
myWorkspaceKeys = [ "a", "s", "d", "f", "g" ]
mySharedWorkspaces = [ "shared" ]
mySharedWorkspaceKeys = [ "1" ]
2023-05-15 14:36:12 +02:00
2022-12-01 16:21:19 +01:00
myConfig =
def
{ terminal = "alacritty",
-- Use Win key instead of Alt
modMask = mod4Mask,
-- , workspaces = ["α", "β", "γ", "δ", "ε", "ζ", "η"]
workspaces = withScreen 0 myWorkspaces ++ withScreen 1 mySharedWorkspaces,
2022-12-01 16:21:19 +01:00
-- Styling
2023-05-04 23:57:30 +02:00
focusedBorderColor = "#000",
normalBorderColor = "#0000",
2023-05-21 18:25:51 +02:00
borderWidth = 4,
2022-12-01 16:21:19 +01:00
-- Hooks
2023-05-21 18:27:55 +02:00
startupHook = myStartupHook,
2022-12-01 16:21:19 +01:00
manageHook = myManageHook <+> manageHook def,
layoutHook = avoidStruts myLayoutHook,
handleEventHook = dynamicPropertyChange "WM_NAME" myDynamicManageHook <> handleEventHook def <> Hacks.windowedFullscreenFixEventHook
2022-12-01 16:21:19 +01:00
}
2023-06-04 15:20:14 +02:00
`removeKeysP` myRemoveKeys
`additionalKeysP` myKeys
`additionalMouseBindings` myMouseBindings
2022-09-24 01:07:06 +02:00
2023-06-04 15:00:30 +02:00
-- }}}
-- Keybindings {{{
2022-09-24 01:07:06 +02:00
-- Keybindings to be added/overridden
2023-06-04 15:20:14 +02:00
myKeys :: [(String, X ())]
myKeys =
[ ("M-<Space> s", unfloatFocusedW),
("M-<Space> <Space>", nextLayout), -- Cycle through layouts
("M-<Space> S-<Space>", defaultLayout), --
("M-<Space> M-<Space>", nextLayout), -- ..fat finger
("M-<Space> M-S-<Space>", defaultLayout), --
("M-S-p", spawnTermLauncher),
("<F8>", spawnKeepassXC),
("M-z", spawnZettelkasten),
("M-p", spawnLauncher),
2022-12-01 16:21:19 +01:00
("<Insert>", pasteSelection),
2023-06-04 15:20:14 +02:00
("<Print>", printScreen),
("<XF86AudioRaiseVolume>", raiseVol), -- Audio volume & playback
("<XF86AudioLowerVolume>", lowerVol), --
("<XF86AudioMute>", mute), --
("M-<Right>", nextTrack), --
("M-<Left>", prevTrack), --
("M-<Up>", play), --
("M-<Down>", pause), --
("<XF86MonBrightnessUp>", brighten), -- Brightness & hue controls
("<XF86MonBrightnessDown>", dim), --
("S-<XF86MonBrightnessUp>", warm), --
("S-<XF86MonBrightnessDown>", cool), --
("M-S-<XF86MonBrightnessUp>", resetTemp), --
("M-S-<XF86MonBrightnessDown>", resetTemp), --
("M-S-b", fullscreenBrowser),
("<XF86Calculator>", spawnCalculator),
("<XF86PowerOff>", spawn "systemctl suspend") --TODO: Only enable this on laptop
] ++
[ (m ++ k, windows $ f w) |
(m, f) <- zip ["M-", "M-S-"]
[W.greedyView, W.shift],
(k, w) <- zip myWorkspaceKeys
(withScreen 0 myWorkspaces)
++ zip mySharedWorkspaceKeys
(withScreen 1 mySharedWorkspaces)
2022-09-24 01:07:06 +02:00
]
2023-06-02 22:22:42 +02:00
zipKeyPrefixes :: [String] -> [String] -> [String]
zipKeyPrefixes prefixes keys = [prefix ++ key | prefix <- prefixes, key <- keys]
2022-09-24 01:07:06 +02:00
-- Keybindings to be removed
2023-06-04 15:20:14 +02:00
myRemoveKeys :: [String]
myRemoveKeys = "M-S-q" : zipKeyPrefixes ["M-", "M-S-"] (map show [ 1..5 ])
myMouseBindings = []
unfloatFocusedW :: X ()
unfloatFocusedW = withFocused $ windows . W.sink
myStartupHook :: X ()
nextLayout = sendMessage NextLayout
defaultLayout :: X ()
defaultLayout = setLayout $ Layout myLayoutHook
spawnZettelkasten :: X ()
spawnZettelkasten = spawn "alacritty --class Zettelkasten,Zettelkasten -e nvim $(cat ~/.zk/current-zettel.txt)"
spawnKeepassXC :: X ()
spawnKeepassXC = spawn "keepassxc"
fullscreenBrowser :: X ()
fullscreenBrowser = spawn "firefox --fullscreen"
spawnLauncher, spawnTermLauncher :: X ()
spawnLauncher = spawn "albert toggle"
spawnTermLauncher = spawn "alacritty --class Launcher,Launcher"
spawnCalculator = spawn "alacritty --class 'Calculator' -e ipython -i /home/h/.bin/calc.py"
printScreen :: X ()
printScreen = spawn "flameshot gui"
raiseVol, lowerVol, mute :: X ()
raiseVol = spawn "pactl set-sink-volume @DEFAULT_SINK@ +5%"
lowerVol = spawn "pactl set-sink-volume @DEFAULT_SINK@ -5%"
mute = spawn "pactl set-sink-mute @DEFAULT_SINK@ toggle"
nextTrack, prevTrack, play, pause :: X ()
nextTrack = spawn "playerctl next"
prevTrack = spawn "playerctl previous"
play = spawn "playerctl play"
pause = spawn "playerctl pause"
brighten, dim, warm, cool, resetTemp :: X ()
brighten = spawn "brightnessctl set 20+"
dim = spawn "brightnessctl set 20-"
warm = spawn "echo $(($(cat /tmp/temperature) + 50)) > /tmp/temperature && redshift -O $(cat /tmp/temperature) -P && notify < /tmp/temperature -h string:x-canonical-private-synchronous:anything"
cool = spawn "echo $(($(cat /tmp/temperature) - 50)) > /tmp/temperature && redshift -O $(cat /tmp/temperature) -P && notify < /tmp/temperature -h string:x-canonical-private-synchronous:anything"
resetTemp = spawn "echo 3000 > /tmp/temperature && redshift -x"
2022-09-24 01:07:06 +02:00
2023-06-04 15:00:30 +02:00
-- }}}
-- Main {{{
2023-06-02 22:21:03 +02:00
main = do xmonad
$ ewmh
$ withEasySB
(sb1 <> sb2)
defToggleStrutsKey
myConfig
where
sb1 = statusBarProp "xmobar" $ pure (pp' (S 0) pp)
sb2 = statusBarProp "xmobar" $ pure (pp' (S 1) pp)
2023-06-04 15:00:30 +02:00
-- }}}