summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimmy Keller <tjk@tjkeller.xyz>2024-10-05 11:51:10 -0500
committerTimmy Keller <tjk@tjkeller.xyz>2024-10-05 11:51:10 -0500
commit5a20302dc51bd0cae9562460c8e202bfd604b6ea (patch)
tree29f0f404eb1d5cfef35d02c92ac2a15474f4f025
parentd1f9ee5eced0c273de6c598f88ddb0f7b4e54230 (diff)
downloaddotconfig-5a20302dc51bd0cae9562460c8e202bfd604b6ea.tar.xz
dotconfig-5a20302dc51bd0cae9562460c8e202bfd604b6ea.zip
pavolctld module and more
-rw-r--r--awesome/bar.lua13
-rw-r--r--awesome/keybindings.lua85
-rw-r--r--awesome/layouts.lua1
-rw-r--r--awesome/util/dbus_example.lua59
-rw-r--r--awesome/widgets/audio.lua1
-rw-r--r--awesome/widgets/pavolctld.lua99
-rw-r--r--awesome/widgets/pipewire.lua34
-rw-r--r--awesome/widgets/temperature.lua11
8 files changed, 256 insertions, 47 deletions
diff --git a/awesome/bar.lua b/awesome/bar.lua
index 285ffe6..523beec 100644
--- a/awesome/bar.lua
+++ b/awesome/bar.lua
@@ -19,6 +19,8 @@ local widget_cpu_usage = require("widgets.cpu")
local widget_ram_usage = require("widgets.ram")
local widget_temperature = require("widgets.temperature")
local classiclayoutbox = require("widgets.classiclayoutbox")
+local volume_control = require("widgets.pavolctld")
+local widget_volume = volume_control.textbox
-- Menu
-- Create a launcher widget and a main menu
@@ -66,6 +68,10 @@ local tasklist_buttons = gears.table.join(
awful.button({ }, 5, function () awful.client.focus.byidx(-1) end)
)
+local volume_buttons = gears.table.join(
+ awful.button({ }, 4, function() volume_control.volume_inc(5) end),
+ awful.button({ }, 5, function() volume_control.volume_dec(5) end)
+)
awful.screen.connect_for_each_screen(function (s)
awful.tag({"1", "2", "3", "4", "5", "6", "7", "8", "9"}, s, awful.layout.layouts[1])
@@ -144,6 +150,13 @@ awful.screen.connect_for_each_screen(function (s)
widget_ram_usage,
wibox.widget.textbox "%",
},
+ {
+ layout = wibox.layout.fixed.horizontal,
+ buttons = volume_buttons,
+ wibox.widget.textbox "VOL: ",
+ widget_volume,
+ wibox.widget.textbox "%",
+ },
mylauncher,
},
}
diff --git a/awesome/keybindings.lua b/awesome/keybindings.lua
index 7908281..9800bbd 100644
--- a/awesome/keybindings.lua
+++ b/awesome/keybindings.lua
@@ -34,53 +34,54 @@ end
-- Key bindings
globalkeys = gears.table.join(
-- Applications
- key(a , "Return", function () awful.spawn(terminal) end, { group = "launcher", description = "open a terminal" }),
- key(a , "f", function () awful.spawn("pcmanfm") end, { group = "launcher", description = "launch pcmanfm" }),
- key(a , "b", function () awful.spawn("launch firefox") end, { group = "launcher", description = "launch firefox" }),
- key(a , "c", function () awful.spawn("launch chrome") end, { group = "launcher", description = "launch firefox (alt profile)" }),
+ key(a , "Return", function () awful.spawn(terminal) end, { group = "launcher", description = "open a terminal" }),
+ key(a , "f", function () awful.spawn("pcmanfm") end, { group = "launcher", description = "launch pcmanfm" }),
+ key(a , "b", function () awful.spawn("launch firefox") end, { group = "launcher", description = "launch firefox" }),
+ key(a , "c", function () awful.spawn("launch chrome") end, { group = "launcher", description = "launch firefox (alt profile)" }),
-- Wallpaper
- key(w , "w", function () awful.spawn("seasonalwallpaper") end, { group = "launcher", description = "change wallpaper" }),
+ key(w , "w", function () awful.spawn("seasonalwallpaper") end, { group = "launcher", description = "change wallpaper" }),
-- Awesome
- key(w , "F1", hotkeys_popup.show_help , { group = "awesome" , description = "show help" }),
- key(w , "F10", awesome.restart , { group = "awesome" , description = "reload awesome" }),
- key(ws, "F10", awesome.quit , { group = "awesome" , description = "quit awesome" }),
- key(w , "Tab", awful.tag.history.restore , { group = "tag" , description = "go back" }),
+ key(w , "F1", hotkeys_popup.show_help , { group = "awesome" , description = "show help" }),
+ key(w , "F10", awesome.restart , { group = "awesome" , description = "reload awesome" }),
+ key(ws, "F10", awesome.quit , { group = "awesome" , description = "quit awesome" }),
+ key(w , "Tab", awful.tag.history.restore , { group = "tag" , description = "go back" }),
--
- key(w , "j", function () awful.client.focus.byidx( 1) end, { group = "client" , description = "focus next by index" }),
- key(w , "k", function () awful.client.focus.byidx(-1) end, { group = "client" , description = "focus previous by index" }),
- key(ws, "j", function () awful.client.swap.byidx( 1) end, { group = "client" , description = "swap with next client by index" }),
- key(ws, "k", function () awful.client.swap.byidx( -1) end, { group = "client" , description = "swap with previous client by index" }),
- key(w , ",", function () awful.screen.focus_relative(-1) end, { group = "screen" , description = "focus the previous screen" }),
- key(w , ".", function () awful.screen.focus_relative( 1) end, { group = "screen" , description = "focus the next screen" }),
- key(w , "u", awful.client.urgent.jumpto , { group = "client" , description = "jump to urgent client" }),
- key(a , "Tab", focus_previous , { group = "client" , description = "focus previous client" }),
- key(w , "l", function () awful.tag.incmwfact( 0.05) end, { group = "layout" , description = "increase master width factor" }),
- key(w , "h", function () awful.tag.incmwfact(-0.05) end, { group = "layout" , description = "decrease master width factor" }),
- key(ws, "h", function () awful.tag.incnmaster( 1, nil, true) end, { group = "layout" , description = "increase the number of master clients" }),
- key(ws, "l", function () awful.tag.incnmaster(-1, nil, true) end, { group = "layout" , description = "decrease the number of master clients" }),
- --key(wc, "h", function () awful.tag.incncol( 1, nil, true) end, { group = "layout" , description = "increase the number of columns" }),
- --key(wc, "l", function () awful.tag.incncol(-1, nil, true) end, { group = "layout" , description = "decrease the number of columns" }),
- key(w , "m", function () awful.layout.set(awful.layout.suit.max) end, { group = "layout" , description = "change to max layout" }),
- key(w , "t", function () awful.layout.set(awful.layout.suit.tile) end, { group = "layout" , description = "change to tile layout" }),
- key(w , "r", function () awful.screen.focused().mypromptbox:run() end, { group = "launcher", description = "run prompt" }),
- key(w , "p", function () menubar.show() end, { group = "launcher", description = "show the menubar" }),
+ key(w , "j", function () awful.client.focus.byidx( 1) end, { group = "client" , description = "focus next by index" }),
+ key(w , "k", function () awful.client.focus.byidx(-1) end, { group = "client" , description = "focus previous by index" }),
+ key(ws, "j", function () awful.client.swap.byidx( 1) end, { group = "client" , description = "swap with next client by index" }),
+ key(ws, "k", function () awful.client.swap.byidx( -1) end, { group = "client" , description = "swap with previous client by index" }),
+ key(w , ",", function () awful.screen.focus_relative(-1) end, { group = "screen" , description = "focus the previous screen" }),
+ key(w , ".", function () awful.screen.focus_relative( 1) end, { group = "screen" , description = "focus the next screen" }),
+ key(w , "u", awful.client.urgent.jumpto , { group = "client" , description = "jump to urgent client" }),
+ key(a , "Tab", focus_previous , { group = "client" , description = "focus previous client" }),
+ key(w , "l", function () awful.tag.incmwfact( 0.05) end, { group = "layout" , description = "increase master width factor" }),
+ key(w , "h", function () awful.tag.incmwfact(-0.05) end, { group = "layout" , description = "decrease master width factor" }),
+ key(ws, "h", function () awful.tag.incnmaster( 1, nil, true) end, { group = "layout" , description = "increase the number of master clients" }),
+ key(ws, "l", function () awful.tag.incnmaster(-1, nil, true) end, { group = "layout" , description = "decrease the number of master clients" }),
+ --key(wc, "h", function () awful.tag.incncol( 1, nil, true) end, { group = "layout" , description = "increase the number of columns" }),
+ --key(wc, "l", function () awful.tag.incncol(-1, nil, true) end, { group = "layout" , description = "decrease the number of columns" }),
+ key(w , "m", function () awful.layout.set(awful.layout.suit.max) end, { group = "layout" , description = "change to max layout" }),
+ key(w , "t", function () awful.layout.set(awful.layout.suit.tile) end, { group = "layout" , description = "change to tile layout" }),
+ key(w , "b", function () awful.layout.set(awful.layout.suit.tile.bottom) end, { group = "layout" , description = "change to tile bottom layout" }),
+ key(w , "r", function () awful.screen.focused().mypromptbox:run() end, { group = "launcher", description = "run prompt" }),
+ key(w , "p", function () menubar.show() end, { group = "launcher", description = "show the menubar" }),
-- PC Controls
- key(w , "Escape", function () awful.spawn("shutdownprompt") end, { group = "system" , description = "show shutdown prompt" }),
- key(w , "Escape", function () awful.spawn("shutdownprompt") end, { group = "system" , description = "show shutdown prompt" }),
- key(w , "F9", function () awful.spawn("shutdownprompt Restart") end, { group = "system" , description = "restart system" }),
- key(w , "F11", function () awful.spawn("shutdownprompt Suspend") end, { group = "system" , description = "suspend system" }),
- key(w , "F12", function () awful.spawn("shutdownprompt Shutdown") end, { group = "system" , description = "shutdown system" }),
- key(a , "m", function () awful.spawn("mounter -m") end, { group = "system" , description = "mount drive prompt" }),
- key(as, "m", function () awful.spawn("mounter -u") end, { group = "system" , description = "unmount drive prompt" }),
- key(w , "F5", function () awful.spawn("bl set 0") end, { group = "system" , description = "set brightness to 0%" }),
- key(w , "F6", function () awful.spawn("bl set 25") end, { group = "system" , description = "set brightness to 25%" }),
- key(w , "F7", function () awful.spawn("bl set 50") end, { group = "system" , description = "set brightness to 50%" }),
- key(w , "F8", function () awful.spawn("bl set 100") end, { group = "system" , description = "set brightness to 100%" }),
+ key(w , "Escape", function () awful.spawn("shutdownprompt") end, { group = "system" , description = "show shutdown prompt" }),
+ key(w , "Escape", function () awful.spawn("shutdownprompt") end, { group = "system" , description = "show shutdown prompt" }),
+ key(w , "F9", function () awful.spawn("shutdownprompt Restart") end, { group = "system" , description = "restart system" }),
+ key(w , "F11", function () awful.spawn("shutdownprompt Suspend") end, { group = "system" , description = "suspend system" }),
+ key(w , "F12", function () awful.spawn("shutdownprompt Shutdown") end, { group = "system" , description = "shutdown system" }),
+ key(a , "m", function () awful.spawn("mounter -m") end, { group = "system" , description = "mount drive prompt" }),
+ key(as, "m", function () awful.spawn("mounter -u") end, { group = "system" , description = "unmount drive prompt" }),
+ key(w , "F5", function () awful.spawn("bl set 0") end, { group = "system" , description = "set brightness to 0%" }),
+ key(w , "F6", function () awful.spawn("bl set 25") end, { group = "system" , description = "set brightness to 25%" }),
+ key(w , "F7", function () awful.spawn("bl set 50") end, { group = "system" , description = "set brightness to 50%" }),
+ key(w , "F8", function () awful.spawn("bl set 100") end, { group = "system" , description = "set brightness to 100%" }),
-- Screenshots
- key({}, "Print", function () awful.spawn("screenshot -x") end, { group = "misc" , description = "screenshot, copy to clipboard" }),
- key(a , "Print", function () awful.spawn("screenshot -xc") end, { group = "misc" , description = "screenshot, crop, copy to clipboard" }),
- key(w , "Print", function () awful.spawn("screenshot") end, { group = "misc" , description = "screenshot, save to screenshots dir" }),
- key(wa, "Print", function () awful.spawn("screenshot -c") end, { group = "misc" , description = "screenshot, crop, save to screenshots dir" })
+ key({}, "Print", function () awful.spawn("screenshot -x") end, { group = "misc" , description = "screenshot, copy to clipboard" }),
+ key(a , "Print", function () awful.spawn("screenshot -xc") end, { group = "misc" , description = "screenshot, crop, copy to clipboard" }),
+ key(w , "Print", function () awful.spawn("screenshot") end, { group = "misc" , description = "screenshot, save to screenshots dir" }),
+ key(wa, "Print", function () awful.spawn("screenshot -c") end, { group = "misc" , description = "screenshot, crop, save to screenshots dir" })
)
--Audio Raise Volume Increase volume
--Audio Lower Volume Decrease volume
diff --git a/awesome/layouts.lua b/awesome/layouts.lua
index 6143c2c..7b78c02 100644
--- a/awesome/layouts.lua
+++ b/awesome/layouts.lua
@@ -4,6 +4,7 @@ local awful = require("awful")
-- Table of layouts to cover with awful.layout.inc, order matters.
awful.layout.layouts = {
awful.layout.suit.tile,
+ awful.layout.suit.tile.bottom,
awful.layout.suit.max,
awful.layout.suit.floating,
}
diff --git a/awesome/util/dbus_example.lua b/awesome/util/dbus_example.lua
new file mode 100644
index 0000000..1e4d756
--- /dev/null
+++ b/awesome/util/dbus_example.lua
@@ -0,0 +1,59 @@
+local lgi = require("lgi")
+local Gio = lgi.require("Gio")
+local GLib = lgi.require("GLib")
+
+-- Workaround for https://github.com/pavouk/lgi/issues/142
+local function bus_get_async(type)
+ Gio.bus_get(type, nil, coroutine.running())
+ local a, b = coroutine.yield()
+ return Gio.bus_get_finish(b)
+end
+
+local function inhibit(bus, what, who, why, mode)
+ local name = "org.freedesktop.login1"
+ local object = "/org/freedesktop/login1"
+ local interface = "org.freedesktop.login1.Manager"
+ local message = Gio.DBusMessage.new_method_call(name, object, interface, "Inhibit")
+ message:set_body(GLib.Variant("(ssss)",
+ { what, who, why, mode }))
+
+ local timeout = -1 -- Just use the default
+ local result, err = bus:async_send_message_with_reply(message, Gio.DBusSendMessageFlags.NONE,
+ timeout, nil)
+
+ if err then
+ print("error: " .. tostring(err))
+ return
+ end
+
+ if result:get_message_type() == "ERROR" then
+ local _, err = result:to_gerror()
+ print("error: " .. tostring(err))
+ return
+ end
+
+ local fd_list = result:get_unix_fd_list()
+ local fd, err = fd_list:get(0)
+ if err then
+ print("error: " .. tostring(err))
+ return
+ end
+
+ -- Now... somehow turn this fd into something we can close
+ return Gio.UnixInputStream.new(fd, true)
+end
+
+Gio.Async.call(function()
+ local bus = bus_get_async(Gio.BusType.SYSTEM)
+ local a = inhibit(bus, "shutdown:sleep", "hi, it's me!", "Just because", "delay")
+ print("got lock")
+ io.popen("sleep 10"):read("*a")
+ a:async_close()
+ -- Speed up deletion of the GDBusMessage that still references the FD
+ collectgarbage("collect")
+ collectgarbage("collect")
+
+ print("released lock")
+ io.popen("sleep 10"):read("*a")
+end)()
+
diff --git a/awesome/widgets/audio.lua b/awesome/widgets/audio.lua
index fa5c747..002c556 100644
--- a/awesome/widgets/audio.lua
+++ b/awesome/widgets/audio.lua
@@ -13,7 +13,6 @@ local audio_dropdown = awful.popup {
},
ontop = true,
placement = awful.placement.centered,
- --shape = gears.shape.infobubble,
border_width = 1,
border_color = "#ff0000",
visible = true,
diff --git a/awesome/widgets/pavolctld.lua b/awesome/widgets/pavolctld.lua
new file mode 100644
index 0000000..33b03d8
--- /dev/null
+++ b/awesome/widgets/pavolctld.lua
@@ -0,0 +1,99 @@
+local awful = require("awful")
+local wibox = require("wibox")
+local naughty = require("naughty")
+
+-- Gio is used to handle the subprocess instead of awful.spawn.
+-- Gio is more flexible and allows writing to stdin.
+-- also, awful.spawn.with_line_callback does not play nicely with pavolctld, as
+-- it seems to feed the stdout back into its stdin and kill performance.
+local lgi = require("lgi")
+local Gio = lgi.Gio
+
+-- return table
+local widget = {
+ textbox = wibox.widget.textbox()
+}
+
+-- start subprocess
+local p = Gio.Subprocess.new({ "pavolctld" }, Gio.SubprocessFlags.STDIN_PIPE + Gio.SubprocessFlags.STDOUT_PIPE)
+
+local stdout = p:get_stdout_pipe()
+local stdin = p:get_stdin_pipe()
+
+-- state vars
+local sinks = {
+ default = nil,
+ current = nil, -- sink being modified by commands
+ sinks = {},
+}
+
+function sinks.get(i)
+ if sinks.sinks[i] == nil then
+ sinks.sinks[i] = {
+ vol = 0,
+ db = 0.0,
+ mute = 0,
+ name = "",
+ desc = "",
+ }
+ end
+ return sinks.sinks[i]
+end
+
+-- parse output
+function parse_csv(csv)
+ return (csv .. ","):gmatch("(.-),")
+end
+
+awful.spawn.read_lines(stdout, function(s)
+ local cmd = s:sub(1, 1) -- first char of output
+ -- volume change
+ if cmd == 'v' then
+ local v = parse_csv(s:sub(2))
+ local i = tonumber(v())
+ local sink = sinks.get(i)
+ sink.vol = tonumber(v())
+ sink.db = tonumber(v())
+ sink.mute = tonumber(v())
+
+ if sink == sinks.default then
+ widget.textbox:set_text(sink.vol)
+ end
+ -- sink description change
+ elseif cmd == 's' then
+ local v = parse_csv(s:sub(2))
+ local i = tonumber(v())
+ local sink = sinks.get(i)
+ sink.name = v()
+ sink.desc = v()
+ -- default sink change
+ elseif cmd == 'f' then
+ local f = tonumber(s:sub(2))
+ sinks.default = sinks.get(f)
+ widget.textbox:set_text(sinks.default.vol)
+ -- sink removed
+ elseif cmd == 'x' then
+ local x = tonumber(s:sub(2))
+ table.remove(sinks.sinks, x)
+ else
+ naughty.notify({
+ preset = naughty.config.presets.critical,
+ title = "pavolctld output error",
+ text = "pavolctld output data '" .. s .. "' is not recognized as a valid input"
+ })
+ end
+end)
+
+-- pavolctld takes commands in using stdin
+function pavolctld_cmd(cmd)
+ local _, err = stdin:write_all(cmd .. "\n", nil)
+
+ if err then return nil end
+ return true
+end
+
+function widget.volume_inc(vol) return pavolctld_cmd("v+" .. vol) end
+function widget.volume_dec(vol) return pavolctld_cmd("v-" .. vol) end
+function widget.volume_set(vol) return pavolctld_cmd("v" .. vol) end
+
+return widget
diff --git a/awesome/widgets/pipewire.lua b/awesome/widgets/pipewire.lua
new file mode 100644
index 0000000..3195ee7
--- /dev/null
+++ b/awesome/widgets/pipewire.lua
@@ -0,0 +1,34 @@
+local awful = require("awful")
+local wibox = require("wibox")
+
+--local get_volume_cmd = "wpctl get-volume @DEFAULT_AUDIO_SINK@ | sed 's/Volume: //;s/0*\\.//'"
+--local set_volume_cmd = "wpctl set-volume @DEFAULT_AUDIO_SINK@ %d%%%s" -- will be formatted
+local get_volume_cmd = "wpctl get-volume @DEFAULT_AUDIO_SINK@"
+
+local widget = {
+ textbox = wibox.widget.textbox()
+}
+
+local updating = false
+function update_volume()
+ if updating then
+ return
+ end
+ awful.spawn.easy_async(get_volume_cmd, function(vol)
+ updating = true
+ vol = vol:sub(8) * 100 -- skip `Volume: ` whos len is 8
+ widget.textbox:set_text(math.floor(vol))
+ updating = false
+ end)
+end
+
+-- NOTE pulseaudio-utils (pactl) is still required due to the dependence on the
+-- `pactl subscribe` command. in the future it would be advantageous to replace
+-- this. currently it is (probably) only really possible with dbus.
+awful.spawn.with_line_callback("pactl subscribe", { stdout = function(stdout)
+ --update_volume()
+end })
+
+update_volume()
+
+return widget.textbox
diff --git a/awesome/widgets/temperature.lua b/awesome/widgets/temperature.lua
index 8cf1aa9..985291d 100644
--- a/awesome/widgets/temperature.lua
+++ b/awesome/widgets/temperature.lua
@@ -7,10 +7,13 @@ local linux = { file = nil }
function linux.temperature(widget)
-- read meminfo
local tempf = io.open(linux.file)
- local temp = tempf:read() / 1000
- tempf:close()
-
- widget:set_text(math.floor(temp))
+ if tempf then
+ local temp = tempf:read() / 1000
+ tempf:close()
+ widget:set_text(math.floor(temp))
+ else
+ widget:set_text("err")
+ end
end