diff options
Diffstat (limited to 'awesome')
-rw-r--r-- | awesome/bar.lua | 13 | ||||
-rw-r--r-- | awesome/keybindings.lua | 85 | ||||
-rw-r--r-- | awesome/layouts.lua | 1 | ||||
-rw-r--r-- | awesome/util/dbus_example.lua | 59 | ||||
-rw-r--r-- | awesome/widgets/audio.lua | 1 | ||||
-rw-r--r-- | awesome/widgets/pavolctld.lua | 99 | ||||
-rw-r--r-- | awesome/widgets/pipewire.lua | 34 | ||||
-rw-r--r-- | awesome/widgets/temperature.lua | 11 |
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 |