awesome-www/recipes/mic.lua

169 lines
4.6 KiB
Lua
Raw Permalink Normal View History

2021-03-18 23:01:30 +01:00
--[[
Licensed under GNU General Public License v2
* (c) 2021, bzgec
# Microphone state widget/watcher
2021-04-02 11:38:54 +02:00
2021-03-18 23:01:30 +01:00
This widget can be used to display the current microphone status.
## Requirements
2021-04-02 11:38:54 +02:00
2021-03-18 23:01:30 +01:00
- `amixer` - this command is used to get and toggle microphone state
## Usage
2021-04-02 11:38:54 +02:00
2021-03-18 23:01:30 +01:00
- Download [mic.lua](https://awesomewm.org/recipes/mic.lua) file and put it into awesome's
folder (like `~/.config/awesome/widgets/mic.lua`)
2021-04-02 11:38:54 +02:00
2021-03-18 23:01:30 +01:00
- Add widget to `theme.lua`:
2021-04-02 11:38:54 +02:00
```lua
local widgets = {
mic = require("widgets/mic"),
}
theme.mic = widgets.mic({
timeout = 10,
settings = function(self)
if self.state == "muted" then
self.widget:set_image(theme.widget_micMuted)
else
self.widget:set_image(theme.widget_micUnmuted)
end
end
})
local widget_mic = wibox.widget { theme.mic.widget, layout = wibox.layout.align.horizontal }
```
2021-03-18 23:01:30 +01:00
- Create a shortcut to toggle microphone state (add to `rc.lua`):
2021-04-02 11:38:54 +02:00
```lua
-- Toggle microphone state
awful.key({ modkey, "Shift" }, "m",
function ()
beautiful.mic:toggle()
end,
{description = "Toggle microphone (amixer)", group = "Hotkeys"}
),
```
2021-03-18 23:01:30 +01:00
- You can also add a command to mute the microphone state on boot. Add this to your `rc.lua`:
2021-04-02 11:38:54 +02:00
```lua
-- Mute microphone on boot
beautiful.mic:mute()
```
2021-03-18 23:01:30 +01:00
--]]
local awful = require("awful")
local naughty = require("naughty")
local gears = require("gears")
local wibox = require("wibox")
local function factory(args)
local args = args or {}
local mic = {
widget = args.widget or wibox.widget.imagebox(),
settings = args.settings or function(self) end,
timeout = args.timeout or 10,
timer = gears.timer,
state = "",
}
function mic:mute()
awful.spawn.easy_async({"amixer", "set", "Capture", "nocap"},
2021-03-18 23:01:30 +01:00
function()
self:update()
end
)
end
function mic:unmute()
awful.spawn.easy_async({"amixer", "set", "Capture", "cap"},
2021-03-18 23:01:30 +01:00
function()
self:update()
end
)
end
function mic:toggle()
awful.spawn.easy_async({"amixer", "set", "Capture", "toggle"},
2021-03-18 23:01:30 +01:00
function()
self:update()
end
)
end
function mic:pressed(button)
if button == 1 then
self:toggle()
end
end
function mic:update()
-- Check that timer has started
if self.timer.started then
self.timer:emit_signal("timeout")
end
end
-- Read `amixer get Capture` command and try to `grep` all "[on]" lines.
-- - If there are lines with "[on]" then assume microphone is "unmuted".
-- - If there are NO lines with "[on]" then assume microphone is "muted".
mic, mic.timer = awful.widget.watch(
{"bash", "-c", "amixer get Capture | grep '\\[on\\]'"},
2021-03-18 23:01:30 +01:00
mic.timeout,
function(self, stdout, stderr, exitreason, exitcode)
local current_micState = "error"
if exitcode == 1 then
-- Exit code 1 - no line selected
current_micState = "muted"
elseif exitcode == 0 then
-- Exit code 0 - a line is selected
current_micState = "unmuted"
else
-- Other exit code (2) - error occurred
current_micState = "error"
end
-- Compare new and old state
if current_micState ~= self.state then
if current_micState == "muted" then
naughty.notify({preset=naughty.config.presets.normal,
title="mic widget info",
text='muted'})
elseif current_micState == "unmuted" then
naughty.notify({preset=naughty.config.presets.normal,
title="mic widget info",
text='unmuted'})
else
naughty.notify({preset=naughty.config.presets.critical,
title="mic widget error",
text='Error on "amixer get Capture | grep \'\\[on\\]\'"'})
end
-- Store new microphone state
self.state = current_micState
end
-- Call user/theme defined function
self:settings()
end,
mic -- base_widget (passed in callback function as first parameter)
)
-- add mouse click
mic.widget:connect_signal("button::press", function(c, _, _, button)
mic:pressed(button)
end)
return mic
end
return factory