aboutsummaryrefslogtreecommitdiff
path: root/modules/desktop/hjem/wm/default.nix
diff options
context:
space:
mode:
authorCollin Williams <96917990+bluedragon1221@users.noreply.github.com>2025-11-30 16:35:17 -0600
committerCollin Williams <96917990+bluedragon1221@users.noreply.github.com>2025-11-30 16:35:17 -0600
commitcdad26dfda64e94d19db576e93793ded9434bd09 (patch)
tree82bac4d4a68750b570ebbbb78c4d0749be96c6e1 /modules/desktop/hjem/wm/default.nix
parent9882f579108d7c39589c7e96b428dced121bd31a (diff)
changes from a long time ago.
Diffstat (limited to 'modules/desktop/hjem/wm/default.nix')
-rw-r--r--modules/desktop/hjem/wm/default.nix147
1 files changed, 147 insertions, 0 deletions
diff --git a/modules/desktop/hjem/wm/default.nix b/modules/desktop/hjem/wm/default.nix
new file mode 100644
index 0000000..a5575ad
--- /dev/null
+++ b/modules/desktop/hjem/wm/default.nix
@@ -0,0 +1,147 @@
+{pkgs, ...}: {
+ files.".config/util.lua" = {
+ text = let
+ lua = pkgs.lua.withPackages (p: [p.lua-subprocess]);
+ in
+ # lua
+ ''
+ #!${lua}/bin/lua
+ local subprocess = require("subprocess")
+
+ local function get_volume()
+ local proc, err = subprocess.popen({
+ "wpctl", "get-volume", "@DEFAULT_AUDIO_SINK@",
+ stdout = subprocess.PIPE,
+ stderr = subprocess.PIPE
+ })
+ if not proc then
+ error("Failed to run wpctl get-volume: " .. tostring(err))
+ end
+
+ local out = proc.stdout:read("*a") or ""
+ local _, _, code = proc:wait()
+ if (code or 0) ~= 0 then
+ local errout = proc.stderr and proc.stderr:read("*a") or ""
+ error(("wpctl get-volume failed (code %d): %s"):format(code, errout))
+ end
+
+ local num = out:match("^Volume:%s*([%d%.]+)")
+ if not num then
+ error("Unexpected wpctl output: " .. out)
+ end
+
+ return tonumber(num) * 100
+ end
+
+ local function notify_volume()
+ local ok, reason, code = subprocess.call({
+ "dunstify", "-t", "300",
+ "-h", "string:x-canonical-private-synchronous:audio",
+ "Volume:", "-h", "int:value:"..get_volume()
+ })
+ if not ok then
+ io.stderr:write(("dunstify failed (%s, code %s)\n"):format(reason or "?", code or "?"))
+ end
+ end
+
+ local function set_volume(vol)
+ local ok, reason, code = subprocess.call({
+ "wpctl", "set-volume", "@DEFAULT_AUDIO_SINK@", vol
+ })
+ if not ok then
+ io.stderr:write(("wpctl set-volume failed (%s, code %s)\n"):format(reason or "?", code or "?"))
+ end
+ end
+
+ local function get_brightness()
+ local proc = subprocess.popen({
+ "${pkgs.brightnessctl}/bin/brightnessctl", "-e", "get",
+ stdout = subprocess.PIPE
+ })
+ if not proc then error("Failed to run brightnessctl get") end
+ local cur = tonumber(proc.stdout:read("*a"))
+ proc:wait()
+ if not cur then error("Failed to parse brightnessctl get output") end
+
+ local proc2 = subprocess.popen({
+ "${pkgs.brightnessctl}/bin/brightnessctl", "-e", "max",
+ stdout = subprocess.PIPE
+ })
+ if not proc2 then error("Failed to run brightnessctl max") end
+ local max = tonumber(proc2.stdout:read("*a"))
+ proc2:wait()
+ if not max or max == 0 then error("Failed to parse brightnessctl max output") end
+
+ return (cur / max) * 100
+ end
+
+ local function notify_brightness()
+ local ok, reason, code = subprocess.call({
+ "dunstify", "-t", "300",
+ "-h", "string:x-canonical-private-synchronous:brightness",
+ "Brightness", "-h", "int:value:"..get_brightness()
+ })
+ if not ok then
+ io.stderr:write(("dunstify failed (%s, code %s)\n"):format(reason or "?", code or "?"))
+ end
+ end
+
+ local function set_brightness(brightness)
+ local ok, reason, code = subprocess.call({
+ "${pkgs.brightnessctl}/bin/brightnessctl", "-e", "set", brightness
+ })
+ if not ok then
+ io.stderr:write(("brightnessctl set failed (%s, code %s)\n"):format(reason or "?", code or "?"))
+ end
+ end
+
+ local function list_music_players()
+ local proc = subprocess.popen({
+ "${pkgs.playerctl}/bin/playerctl", "-l",
+ stdout = subprocess.PIPE
+ })
+ if not proc then error("Failed to run playerctl -l") end
+
+ local cur = proc.stdout:lines()
+
+ local out = {}
+ for i in cur do
+ table.insert(out, i)
+ end
+
+ return out
+ end
+
+ local function toggle_music()
+ local ok, reason, code = subprocess.call({
+ "${pkgs.playerctl}/bin/playerctl", "play-pause",
+ })
+ if not ok then
+ io.stderr:write(("playerctl play-pause failed (%s, code %s)\n"):format(reason or "?", code or "?"))
+ end
+ end
+
+ -- main logic
+ if arg[2] and arg[2]:match("^(%d+)%%([%+%-])$") then
+ if arg[1] == "vol" then
+ set_volume(arg[2])
+ notify_volume()
+ elseif arg[1] == "brightness" then
+ set_brightness(arg[2])
+ notify_brightness()
+ else
+ error(("arg[2] '%s' incorrect format. Should look like 5%%+ or 10%%-"):format(tostring(arg[2])))
+ end
+ elseif arg[1] and arg[1] == "music" then
+ if arg[2] == "play" then
+ toggle_music()
+ else
+ error(("Invalid arg[2]: '%s'. should be `play`"):format(arg[3]))
+ end
+ else
+ error("Unknown command: " .. tostring(arg[1]))
+ end
+ '';
+ executable = true;
+ };
+}