diff options
| -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  | 
