Skip to content

Commit

Permalink
Merge pull request streetturtle#97 from utix/volume_notification
Browse files Browse the repository at this point in the history
[Volume] Add an option to display a notification
  • Loading branch information
streetturtle authored Sep 19, 2019
2 parents 3b15540 + f59cd86 commit 57e0bbd
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 11 deletions.
12 changes: 7 additions & 5 deletions volume-widget/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ It is possible to customize widget by providing a table with all or some of the
| Name | Default | Description |
|---|---|---|
| `volume_audio_controller` | `pulse` | audio device |
| `notification` | `false` | Display a notification on mouseover |
| `notification_position` | `top_right` | The notification position |

## Installation

Expand All @@ -27,16 +29,16 @@ s.mytasklist, -- Middle widget
layout = wibox.layout.fixed.horizontal,
...
volume_widget(),
...
...
```

- _Optional step._ In Arc icon theme the muted audio level icon (![Volume-widget](./audio-volume-muted-symbolic.png)) looks like 0 level icon, which could be a bit misleading.
So I decided to use original muted icon for low audio level, and the same icon, but colored in red for muted audio level. Fortunately icons are in svg format, so you can easily recolor them with `sed`, so it would look like this (![Volume Widget](./audio-volume-muted-symbolic_red.png)):

```bash
cd /usr/share/icons/Arc/status/symbolic &&
sudo cp audio-volume-muted-symbolic.svg audio-volume-muted-symbolic_red.svg &&
sudo sed -i 's/bebebe/ed4737/g' ./audio-volume-muted-symbolic_red.svg
cd /usr/share/icons/Arc/status/symbolic &&
sudo cp audio-volume-muted-symbolic.svg audio-volume-muted-symbolic_red.svg &&
sudo sed -i 's/bebebe/ed4737/g' ./audio-volume-muted-symbolic_red.svg
```

### Pulse or ALSA only
Expand Down
53 changes: 47 additions & 6 deletions volume-widget/volume.lua
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,12 @@
-- @copyright 2018 Pavel Makhov
-------------------------------------------------

local awful = require("awful")
local wibox = require("wibox")
local watch = require("awful.widget.watch")
local spawn = require("awful.spawn")
local naughty = require("naughty")
local dpi = require('beautiful').xresources.apply_dpi


local path_to_icons = "/usr/share/icons/Arc/status/symbolic/"

Expand All @@ -22,7 +24,8 @@ local function worker(args)
local args = args or {}

local volume_audio_controller = args.volume_audio_controller or 'pulse'

local display_notification = args.notification or 'false'
local position = args.notification_position or "top_right"
local device_arg = ''
if volume_audio_controller == 'pulse' then
device_arg = '-D pulse'
Expand All @@ -47,35 +50,73 @@ local function worker(args)
end
}

local notification = {}
local volume_icon_name="audio-volume-high-symbolic"

local function get_notification_text(txt)
local mute = string.match(txt, "%[(o%a%a?)%]")
local volume = string.match(txt, "(%d?%d?%d)%%")
volume = tonumber(string.format("% 3d", volume))
if mute == "off" then
return volume.."% <span color=\"red\"><b>Mute</b></span>"
else
return volume .."%"
end
end

local function show_volume(val)
spawn.easy_async(GET_VOLUME_CMD,
function(stdout, _, _, _)
notification = naughty.notify{
text = get_notification_text(stdout),
icon=path_to_icons .. val .. ".svg",
icon_size = dpi(16),
title = "Volume",
position = position,
timeout = 0, hover_timeout = 0.5,
width = 200,
}
end
)
end


local update_graphic = function(widget, stdout, _, _, _)
local mute = string.match(stdout, "%[(o%D%D?)%]")
local volume = string.match(stdout, "(%d?%d?%d)%%")
volume = tonumber(string.format("% 3d", volume))
local volume_icon_name
if mute == "off" then volume_icon_name="audio-volume-muted-symbolic_red"
elseif (volume >= 0 and volume < 25) then volume_icon_name="audio-volume-muted-symbolic"
elseif (volume < 50) then volume_icon_name="audio-volume-low-symbolic"
elseif (volume < 75) then volume_icon_name="audio-volume-medium-symbolic"
elseif (volume <= 100) then volume_icon_name="audio-volume-high-symbolic"
end
widget.image = path_to_icons .. volume_icon_name .. ".svg"
if display_notification then
notification.iconbox.image = path_to_icons .. volume_icon_name .. ".svg"
naughty.replace_text(notification, "Volume", get_notification_text(stdout))
end
end

--[[ allows control volume level by:
- clicking on the widget to mute/unmute
- scrolling when cursor is over the widget
]]
volume_widget:connect_signal("button::press", function(_,_,_,button)
if (button == 4) then awful.spawn(INC_VOLUME_CMD, false)
elseif (button == 5) then awful.spawn(DEC_VOLUME_CMD, false)
elseif (button == 1) then awful.spawn(TOG_VOLUME_CMD, false)
if (button == 4) then spawn(INC_VOLUME_CMD, false)
elseif (button == 5) then spawn(DEC_VOLUME_CMD, false)
elseif (button == 1) then spawn(TOG_VOLUME_CMD, false)
end

spawn.easy_async(GET_VOLUME_CMD, function(stdout, stderr, exitreason, exitcode)
update_graphic(volume_widget, stdout, stderr, exitreason, exitcode)
end)
end)

if display_notification then
volume_widget:connect_signal("mouse::enter", function() show_volume(volume_icon_name) end)
volume_widget:connect_signal("mouse::leave", function() naughty.destroy(notification) end)
end
watch(GET_VOLUME_CMD, 1, update_graphic, volume_widget)

return volume_widget
Expand Down

0 comments on commit 57e0bbd

Please sign in to comment.