Add utils.readFile and utils.interpolateFile, use them in xmonad config
- Add utils.readFile which reads a file and evaluates any nix in ${{null}}
brackets like that, returning a string. This should be a drop-in replacement
for builtins.readFile
- Add utils.interpolateFile which does the same as readFile but also writes to
the store and returns a store path for the new file. This should be a drop-in
wrapper for a path
- Use utils.interpolateFile on the xmonad config file
- Use a relative file path contained in nix interpolation brackets in the xmonad
config file
- Use package paths inside the included file (all included paths are also
interpolated)
- Update xmonad to have better volume change support
- Update xmonad to have better multi-display support (actually start polybar,
display different colors for second displays)
diff --git a/modules/xmonad/XMonadLog.hs b/modules/xmonad/XMonadLog.hs
index b07485c..fb5bbe7 100644
--- a/modules/xmonad/XMonadLog.hs
+++ b/modules/xmonad/XMonadLog.hs
@@ -33,11 +33,12 @@
grey = "#474e5d"
orange = "#e5c07b"
purple = "#c678dd"
+ green = "#98c379"
red = "#e06c75"
in def { ppOutput = dbusOutput dbus
, ppCurrent = wrapper red
- , ppVisible = wrapper blue
- , ppUrgent = wrapper orange
+ , ppVisible = wrapper orange
+ , ppUrgent = wrapper green
, ppHidden = wrapper blue
, ppHiddenNoWindows = wrapper grey
, ppTitle = shorten 100 . wrapper purple
diff --git a/modules/xmonad/vol_change.py b/modules/xmonad/vol_change.py
new file mode 100644
index 0000000..6629995
--- /dev/null
+++ b/modules/xmonad/vol_change.py
@@ -0,0 +1,30 @@
+#!${{pkgs.python3}}/bin/python3
+
+import sys
+import os
+import subprocess
+
+args = sys.argv
+
+device_argument = "--default-source" if "-i" in args else ""
+
+control_argument = ""
+control_argument += "-i" if "-u" in args else ""
+control_argument += "-d" if "-d" in args else ""
+control_argument += "-t" if "-m" in args else " 5"
+
+os.system(
+ f"${{pkgs.pamixer}}/bin/pamixer {device_argument} {control_argument} --set-limit 150"
+)
+mute_char = (
+ "!"
+ if subprocess.getoutput(f"${{pkgs.pamixer}}/bin/pamixer {device_argument} --get-mute")
+ == "true"
+ else ""
+)
+volume = subprocess.getoutput(f"${{pkgs.pamixer}}/bin/pamixer {device_argument} --get-volume")
+
+socket_path = f"{os.environ['XDG_RUNTIME_DIR']}/xob.sock"
+
+with open(socket_path, "w") as socket:
+ socket.write(f"{volume}{mute_char}\n")
diff --git a/modules/xmonad/xmonad.hs b/modules/xmonad/xmonad.hs
index b1b3219..76c29f5 100644
--- a/modules/xmonad/xmonad.hs
+++ b/modules/xmonad/xmonad.hs
@@ -1,4 +1,5 @@
-- spell-checker:words xmonad
+{-# OPTIONS_GHC -Wno-deferred-out-of-scope-variables #-}
import XMonad
import System.Exit
@@ -14,20 +15,28 @@
import Blaze.ByteString.Builder (toByteString)
import Foreign.C
-import XMonad
+import Graphics.X11.ExtraTypes (xF86XK_AudioLowerVolume,
+ xF86XK_AudioMute,
+ xF86XK_AudioRaiseVolume,
+ xF86XK_MonBrightnessDown,
+ xF86XK_MonBrightnessUp,
+ xF86XK_Xfer)
+import qualified XMonad as W
import XMonad.Hooks.DynamicProperty (dynamicPropertyChange)
import XMonad.Hooks.ManageHelpers (doFullFloat, doLower,
- isInProperty, doRectFloat)
+ doRectFloat, isInProperty)
import XMonad.Hooks.UrgencyHook
import XMonad.Layout.Drawer (propertyToQuery)
import XMonad.Layout.Gaps
import XMonad.Layout.Spacing
import qualified XMonad.StackSet as W
import XMonad.Util.Hacks
-import qualified XMonad as W
-import XMonad.Util.PureX (curScreenId, curScreen)
+import XMonad.Util.PureX (curScreen, curScreenId)
+import XMonad.Util.Run (safeSpawn, safeSpawnProg)
-terminal = "kitty" -- Kitty, my beloved <3
+volumeChangeCmd = "${{./vol_change.py}}"
+
+terminal = "/usr/bin/env SHLVL=0 kitty" -- Kitty, my beloved <3
launcher = "pkill rofi; rofi -show combi"
networkManager = "wpa_cli select_network $(wpa_cli list_networks | tail -n +3 | awk '!seen[$2]++' | rofi -dmenu -window-title 'Select Network' | awk '{print $1;}')"
@@ -36,7 +45,7 @@
modifierKey = mod4Mask -- Use Super as our mod key
-statusBar = "pkill polybar; polybar"
+statusBar = "pkill polybar; polybar main; polybar dp1; polybar dp2; polybar dp3; polybar dp4"
compositor = "pkill picom; picom"
background = "pkill show; show ~/.xmonad/wallpaper.glsl > /dev/null"
colorSelection = "xcolor | xclip -sel clip"
@@ -44,11 +53,16 @@
shift = shiftMask
+-- spell-checker:words xobsock
+xobsock = "$XDG_RUNTIME_DIR/xob.sock"
+
startupHook = do
spawn Main.statusBar
spawn Main.compositor
spawn background
spawn keybindings
+ spawn "pgrep keepass || run_keepass"
+ spawn $ "pkill xob; rm -f " ++ xobsock ++ " && mkfifo " ++ xobsock ++ " && tail -f " ++ xobsock ++ " | xob"
main :: IO ()
@@ -92,4 +106,15 @@
, ((modifierKey .|. Main.shift, xK_s), spawn selectScreenshot)
, ((modifierKey .|. Main.shift, xK_h), spawn colorSelection)
, ((0, xK_Print), spawn screenshot)
+ , ((modifierKey .|. Main.shift, xK_Return), spawn Main.terminal)
+ , ((0, xF86XK_AudioLowerVolume), spawn $ volumeChangeCmd ++ " -d")
+ , ((0, xF86XK_AudioRaiseVolume), spawn $ volumeChangeCmd ++ " -u")
+ , ((0, xF86XK_AudioMute), spawn $ volumeChangeCmd ++ " -m")
+ , ((modifierKey, xF86XK_AudioLowerVolume), spawn $ volumeChangeCmd ++ " -d -i")
+ , ((modifierKey, xF86XK_AudioRaiseVolume), spawn $ volumeChangeCmd ++ " -u -i")
+ , ((modifierKey, xF86XK_AudioMute), spawn $ volumeChangeCmd ++ " -m -i")
+ , ((0, xF86XK_MonBrightnessDown), spawn $ "light -U 6 && light -G | cut -d'.' -f1 > " ++ xobsock)
+ , ((0, xF86XK_MonBrightnessUp), spawn $ "light -A 6 && light -G | cut -d'.' -f1 > " ++ xobsock)
+ , ((modifierKey, xF86XK_MonBrightnessDown), spawn $ "light -U 3 && light -G | cut -d'.' -f1 > " ++ xobsock)
+ , ((modifierKey, xF86XK_MonBrightnessUp), spawn $ "light -A 3 && light -G | cut -d'.' -f1 > " ++ xobsock)
]