Merge remote-tracking branch 'origin/laptop'
|
@ -16,6 +16,8 @@ local wibox = require("wibox")
|
||||||
local theme = require("theme")
|
local theme = require("theme")
|
||||||
local lain = require("lain")
|
local lain = require("lain")
|
||||||
local dpi = beautiful.xresources.apply_dpi
|
local dpi = beautiful.xresources.apply_dpi
|
||||||
|
local battery_widget = require("widgets.battery-widget.battery")
|
||||||
|
local volume_widget = require("widgets.volume-widget.volume")
|
||||||
|
|
||||||
-- import widgets
|
-- import widgets
|
||||||
local task_list = require("widgets.task-list")
|
local task_list = require("widgets.task-list")
|
||||||
|
@ -67,9 +69,17 @@ top_panel.create = function(s)
|
||||||
{
|
{
|
||||||
layout = wibox.layout.fixed.horizontal,
|
layout = wibox.layout.fixed.horizontal,
|
||||||
wibox.layout.margin(wibox.widget.systray(), dpi(5), dpi(5), dpi(5), dpi(5)),
|
wibox.layout.margin(wibox.widget.systray(), dpi(5), dpi(5), dpi(5), dpi(5)),
|
||||||
|
wibox.widget.textbox(' '),
|
||||||
|
volume_widget({widget_type='arc'}),
|
||||||
|
wibox.widget.textbox(' '),
|
||||||
|
battery_widget({font=theme.font, display_notification=true}),
|
||||||
wibox.widget.textbox(' | '),
|
wibox.widget.textbox(' | '),
|
||||||
updates_indicator,
|
updates_indicator,
|
||||||
wibox.widget.textbox(' | '),
|
wibox.widget.textbox(' | '),
|
||||||
|
awful.widget.watch('bash -c "cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor"', 5),
|
||||||
|
wibox.widget.textbox(' | '),
|
||||||
|
wibox.layout.margin(require("widgets.layout-box"), dpi(5), dpi(5), dpi(5), dpi(5)),
|
||||||
|
wibox.widget.textbox(' | '),
|
||||||
lain.widget.mem({
|
lain.widget.mem({
|
||||||
settings = function()
|
settings = function()
|
||||||
widget:set_markup(lain.util.markup.font(theme.font, mem_now.used .. " MB"))
|
widget:set_markup(lain.util.markup.font(theme.font, mem_now.used .. " MB"))
|
||||||
|
@ -84,11 +94,8 @@ top_panel.create = function(s)
|
||||||
wibox.widget.textbox(' | '),
|
wibox.widget.textbox(' | '),
|
||||||
awful.widget.watch('bash -c "/usr/bin/cat /proc/cpuinfo | grep MHz | cut -b 12- | sort -r | head -n 1 | xargs printf \'%f / 1000\n\' | bc -l | cut -b -4"', 1),
|
awful.widget.watch('bash -c "/usr/bin/cat /proc/cpuinfo | grep MHz | cut -b 12- | sort -r | head -n 1 | xargs printf \'%f / 1000\n\' | bc -l | cut -b -4"', 1),
|
||||||
wibox.widget.textbox('GHz | '),
|
wibox.widget.textbox('GHz | '),
|
||||||
awful.widget.watch('bash -c "sensors | grep Tctl | cut -f 10 -d \' \' | cut -c 2-"', 5),
|
awful.widget.watch('bash -c "sensors | grep Package | cut -f 5 -d \' \' | cut -c 2-"', 5),
|
||||||
wibox.widget.textbox(' | '),
|
wibox.widget.textbox(' '),
|
||||||
awful.widget.watch('bash -c "cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor"', 5),
|
|
||||||
wibox.widget.textbox(' | '),
|
|
||||||
wibox.layout.margin(require("widgets.layout-box"), dpi(5), dpi(5), dpi(5), dpi(5)),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,95 +0,0 @@
|
||||||
-- ██╗ ██╗ ██████╗ ██╗ ██╗ ██╗███╗ ███╗███████╗
|
|
||||||
-- ██║ ██║██╔═══██╗██║ ██║ ██║████╗ ████║██╔════╝
|
|
||||||
-- ██║ ██║██║ ██║██║ ██║ ██║██╔████╔██║█████╗
|
|
||||||
-- ╚██╗ ██╔╝██║ ██║██║ ██║ ██║██║╚██╔╝██║██╔══╝
|
|
||||||
-- ╚████╔╝ ╚██████╔╝███████╗╚██████╔╝██║ ╚═╝ ██║███████╗
|
|
||||||
-- ╚═══╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝
|
|
||||||
|
|
||||||
|
|
||||||
-- ===================================================================
|
|
||||||
-- Initialization
|
|
||||||
-- ===================================================================
|
|
||||||
|
|
||||||
|
|
||||||
local wibox = require("wibox")
|
|
||||||
local awful = require("awful")
|
|
||||||
local gears = require("gears")
|
|
||||||
local beautiful = require("beautiful")
|
|
||||||
local dpi = beautiful.xresources.apply_dpi
|
|
||||||
|
|
||||||
local offsetx = dpi(56)
|
|
||||||
local offsety = dpi(300)
|
|
||||||
local screen = awful.screen.focused()
|
|
||||||
local icon_dir = gears.filesystem.get_configuration_dir() .. "/icons/volume/" .. beautiful.name .. "/"
|
|
||||||
|
|
||||||
|
|
||||||
-- ===================================================================
|
|
||||||
-- Appearance & Functionality
|
|
||||||
-- ===================================================================
|
|
||||||
|
|
||||||
|
|
||||||
-- create the volume_adjust component
|
|
||||||
local volume_adjust = wibox({
|
|
||||||
screen = awful.screen.focused(),
|
|
||||||
x = screen.geometry.width - offsetx,
|
|
||||||
y = (screen.geometry.height / 2) - (offsety / 2),
|
|
||||||
width = dpi(48),
|
|
||||||
height = offsety,
|
|
||||||
shape = gears.shape.rounded_rect,
|
|
||||||
visible = false,
|
|
||||||
ontop = true
|
|
||||||
})
|
|
||||||
|
|
||||||
local volume_bar = wibox.widget{
|
|
||||||
widget = wibox.widget.progressbar,
|
|
||||||
shape = gears.shape.rounded_bar,
|
|
||||||
color = "#efefef",
|
|
||||||
background_color = beautiful.bg_focus,
|
|
||||||
max_value = 100,
|
|
||||||
value = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
volume_adjust:setup {
|
|
||||||
layout = wibox.layout.align.vertical,
|
|
||||||
{
|
|
||||||
wibox.container.margin(
|
|
||||||
volume_bar, dpi(14), dpi(20), dpi(20), dpi(20)
|
|
||||||
),
|
|
||||||
forced_height = offsety,
|
|
||||||
direction = "east",
|
|
||||||
layout = wibox.container.rotate
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
-- create a 4 second timer to hide the volume adjust
|
|
||||||
-- component whenever the timer is started
|
|
||||||
local hide_volume_adjust = gears.timer {
|
|
||||||
timeout = 4,
|
|
||||||
autostart = true,
|
|
||||||
callback = function()
|
|
||||||
volume_adjust.visible = false
|
|
||||||
end
|
|
||||||
}
|
|
||||||
|
|
||||||
-- show volume-adjust when "volume_change" signal is emitted
|
|
||||||
awesome.connect_signal("volume_change",
|
|
||||||
function()
|
|
||||||
-- set new volume value
|
|
||||||
awful.spawn.easy_async_with_shell(
|
|
||||||
"amixer sget Master | grep 'Right:' | awk -F '[][]' '{print $2}'| sed 's/[^0-9]//g'",
|
|
||||||
function(stdout)
|
|
||||||
local volume_level = tonumber(stdout)
|
|
||||||
volume_bar.value = volume_level
|
|
||||||
end,
|
|
||||||
false
|
|
||||||
)
|
|
||||||
|
|
||||||
-- make volume_adjust component visible
|
|
||||||
if volume_adjust.visible then
|
|
||||||
hide_volume_adjust:again()
|
|
||||||
else
|
|
||||||
volume_adjust.visible = true
|
|
||||||
hide_volume_adjust:start()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
)
|
|
|
@ -15,6 +15,7 @@ local awful = require("awful")
|
||||||
local gears = require("gears")
|
local gears = require("gears")
|
||||||
local naughty = require("naughty")
|
local naughty = require("naughty")
|
||||||
local beautiful = require("beautiful")
|
local beautiful = require("beautiful")
|
||||||
|
local volume_widget = require("widgets.volume-widget.volume")
|
||||||
local dpi = beautiful.xresources.apply_dpi
|
local dpi = beautiful.xresources.apply_dpi
|
||||||
|
|
||||||
-- Define mod keys
|
-- Define mod keys
|
||||||
|
@ -188,22 +189,19 @@ keys.globalkeys = gears.table.join(
|
||||||
-- ALSA volume control
|
-- ALSA volume control
|
||||||
awful.key({}, "XF86AudioRaiseVolume",
|
awful.key({}, "XF86AudioRaiseVolume",
|
||||||
function()
|
function()
|
||||||
awful.spawn("amixer -D pulse sset Master 5%+", false)
|
volume_widget:inc(5)
|
||||||
awesome.emit_signal("volume_change")
|
|
||||||
end,
|
end,
|
||||||
{description = "volume up", group = "hotkeys"}
|
{description = "volume up", group = "hotkeys"}
|
||||||
),
|
),
|
||||||
awful.key({}, "XF86AudioLowerVolume",
|
awful.key({}, "XF86AudioLowerVolume",
|
||||||
function()
|
function()
|
||||||
awful.spawn("amixer -D pulse sset Master 5%-", false)
|
volume_widget:dec(5)
|
||||||
awesome.emit_signal("volume_change")
|
|
||||||
end,
|
end,
|
||||||
{description = "volume down", group = "hotkeys"}
|
{description = "volume down", group = "hotkeys"}
|
||||||
),
|
),
|
||||||
awful.key({}, "XF86AudioMute",
|
awful.key({}, "XF86AudioMute",
|
||||||
function()
|
function()
|
||||||
awful.spawn("amixer -D pulse set Master 1+ toggle", false)
|
volume_widget:toggle()
|
||||||
awesome.emit_signal("volume_change")
|
|
||||||
end,
|
end,
|
||||||
{description = "toggle mute", group = "hotkeys"}
|
{description = "toggle mute", group = "hotkeys"}
|
||||||
),
|
),
|
||||||
|
|
|
@ -27,7 +27,6 @@ pastel.initialize = function()
|
||||||
-- Import components
|
-- Import components
|
||||||
require("components.pastel.wallpaper")
|
require("components.pastel.wallpaper")
|
||||||
require("components.exit-screen")
|
require("components.exit-screen")
|
||||||
require("components.volume-adjust")
|
|
||||||
|
|
||||||
-- Import panels
|
-- Import panels
|
||||||
local top_panel = require("components.pastel.top-panel")
|
local top_panel = require("components.pastel.top-panel")
|
||||||
|
|
|
@ -38,7 +38,8 @@ network_interfaces = {
|
||||||
-- List of apps to run on start-up
|
-- List of apps to run on start-up
|
||||||
local run_on_start_up = {
|
local run_on_start_up = {
|
||||||
"numlockx on",
|
"numlockx on",
|
||||||
"bluetoothctl power on"
|
"bluetoothctl power on",
|
||||||
|
"nm-applet",
|
||||||
}
|
}
|
||||||
|
|
||||||
-- ===================================================================
|
-- ===================================================================
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
-- ████████╗██╗ ██╗███████╗███╗ ███╗███████╗
|
-- ████████╗██╗ ██╗███████╗███╗ ███╗███████╗theme
|
||||||
-- ╚══██╔══╝██║ ██║██╔════╝████╗ ████║██╔════╝
|
-- ╚══██╔══╝██║ ██║██╔════╝████╗ ████║██╔════╝
|
||||||
-- ██║ ███████║█████╗ ██╔████╔██║█████╗
|
-- ██║ ███████║█████╗ ██╔████╔██║█████╗
|
||||||
-- ██║ ██╔══██║██╔══╝ ██║╚██╔╝██║██╔══╝
|
-- ██║ ██╔══██║██╔══╝ ██║╚██╔╝██║██╔══╝
|
||||||
|
@ -25,7 +25,7 @@ local theme = {}
|
||||||
theme.name = "pastel"
|
theme.name = "pastel"
|
||||||
|
|
||||||
-- Font
|
-- Font
|
||||||
theme.font = "Ubuntu 13"
|
theme.font = "Ubuntu 12"
|
||||||
theme.title_font = "Ubuntu 12"
|
theme.title_font = "Ubuntu 12"
|
||||||
|
|
||||||
-- Background
|
-- Background
|
||||||
|
@ -95,7 +95,7 @@ theme.titlebars_enabled = false
|
||||||
-- theme.layout_floating = "~/.config/awesome/icons/layouts/floating.png"
|
-- theme.layout_floating = "~/.config/awesome/icons/layouts/floating.png"
|
||||||
-- theme.layout_max = "~/.config/awesome/icons/layouts/maximized.png"
|
-- theme.layout_max = "~/.config/awesome/icons/layouts/maximized.png"
|
||||||
|
|
||||||
theme.icon_theme = "Tela-dark"
|
theme.icon_theme = "Papirus"
|
||||||
|
|
||||||
-- return theme
|
-- return theme
|
||||||
return theme
|
return theme
|
||||||
|
|
|
@ -0,0 +1,75 @@
|
||||||
|
# Battery widget
|
||||||
|
|
||||||
|
Simple and easy-to-install widget for Awesome Window Manager.
|
||||||
|
|
||||||
|
This widget consists of:
|
||||||
|
|
||||||
|
- an icon which shows the battery level:
|
||||||
|

|
||||||
|
- a pop-up window, which shows up when you hover over an icon:
|
||||||
|

|
||||||
|
Alternatively you can use a tooltip (check the code):
|
||||||
|

|
||||||
|
- a pop-up warning message which appears on bottom right corner when battery level is less that 15% (you can get the image [here](https://vk.com/images/stickers/1933/512.png)):
|
||||||
|

|
||||||
|
|
||||||
|
Note that widget uses the Arc icon theme, so it should be [installed](https://github.com/horst3180/arc-icon-theme#installation) first under **/usr/share/icons/Arc/** folder.
|
||||||
|
|
||||||
|
## Customization
|
||||||
|
|
||||||
|
It is possible to customize widget by providing a table with all or some of the following config parameters:
|
||||||
|
|
||||||
|
| Name | Default | Description |
|
||||||
|
|---|---|---|
|
||||||
|
| `font` | Play 8 | Fond |
|
||||||
|
| `path_to_icons` | `/usr/share/icons/Arc/status/symbolic/` | Path to the folder with icons* |
|
||||||
|
| `show_current_level`| false | Show current charge level |
|
||||||
|
| `margin_right`|0| The right margin of the widget|
|
||||||
|
| `margin_left`|0| The left margin of the widget|
|
||||||
|
| `display_notification` | `false` | Display a notification on mouseover |
|
||||||
|
| `notification_position` | `top_right` | The notification position |
|
||||||
|
| `timeout` | 10 | How often in seconds the widget refreshes |
|
||||||
|
| `warning_msg_title` | _Huston, we have a problem_ | Title of the warning popup |
|
||||||
|
| `warning_msg_text` | _Battery is dying_ | Text of the warning popup |
|
||||||
|
| `warning_msg_position` | `bottom_right` | Position of the warning popup |
|
||||||
|
| `warning_msg_icon` | ~/.config/awesome/awesome-wm-widgets/battery-widget/spaceman.jpg | Icon of the warning popup |
|
||||||
|
| `enable_battery_warning` | `true` | Display low battery warning |
|
||||||
|
|
||||||
|
*Note: the widget expects following icons to be present in the folder:
|
||||||
|
|
||||||
|
- battery-caution-charging-symbolic.svg
|
||||||
|
- battery-empty-charging-symbolic.svg
|
||||||
|
- battery-full-charged-symbolic.svg
|
||||||
|
- battery-full-symbolic.svg
|
||||||
|
- battery-good-symbolic.svg
|
||||||
|
- battery-low-symbolic.svg
|
||||||
|
- battery-caution-symbolic.svg
|
||||||
|
- battery-empty-symbolic.svg
|
||||||
|
- battery-full-charging-symbolic.svg
|
||||||
|
- battery-good-charging-symbolic.svg
|
||||||
|
- battery-low-charging-symbolic.svg
|
||||||
|
- battery-missing-symbolic.svg
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
This widget reads the output of acpi tool.
|
||||||
|
|
||||||
|
- install `acpi` and check the output:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ sudo apt-get install acpi
|
||||||
|
$ acpi
|
||||||
|
Battery 0: Discharging, 66%, 02:34:06 remaining
|
||||||
|
```
|
||||||
|
|
||||||
|
```lua
|
||||||
|
local battery_widget = require("awesome-wm-widgets.battery-widget.battery")
|
||||||
|
|
||||||
|
...
|
||||||
|
s.mytasklist, -- Middle widget
|
||||||
|
{ -- Right widgets
|
||||||
|
layout = wibox.layout.fixed.horizontal,
|
||||||
|
...
|
||||||
|
battery_widget(),
|
||||||
|
...
|
||||||
|
```
|
After Width: | Height: | Size: 700 B |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 10 KiB |
After Width: | Height: | Size: 14 KiB |
|
@ -0,0 +1,200 @@
|
||||||
|
-------------------------------------------------
|
||||||
|
-- Battery Widget for Awesome Window Manager
|
||||||
|
-- Shows the battery status using the ACPI tool
|
||||||
|
-- More details could be found here:
|
||||||
|
-- https://github.com/streetturtle/awesome-wm-widgets/tree/master/battery-widget
|
||||||
|
|
||||||
|
-- @author Pavel Makhov
|
||||||
|
-- @copyright 2017 Pavel Makhov
|
||||||
|
-------------------------------------------------
|
||||||
|
|
||||||
|
local awful = require("awful")
|
||||||
|
local naughty = require("naughty")
|
||||||
|
local watch = require("awful.widget.watch")
|
||||||
|
local wibox = require("wibox")
|
||||||
|
local gfs = require("gears.filesystem")
|
||||||
|
local dpi = require('beautiful').xresources.apply_dpi
|
||||||
|
|
||||||
|
-- acpi sample outputs
|
||||||
|
-- Battery 0: Discharging, 75%, 01:51:38 remaining
|
||||||
|
-- Battery 0: Charging, 53%, 00:57:43 until charged
|
||||||
|
|
||||||
|
local HOME = os.getenv("HOME")
|
||||||
|
local WIDGET_DIR = HOME .. '/.config/awesome/awesome-wm-widgets/battery-widget'
|
||||||
|
|
||||||
|
local battery_widget = {}
|
||||||
|
local function worker(user_args)
|
||||||
|
local args = user_args or {}
|
||||||
|
|
||||||
|
local font = args.font or 'Play 8'
|
||||||
|
local path_to_icons = args.path_to_icons or "/usr/share/icons/Arc/status/symbolic/"
|
||||||
|
local show_current_level = args.show_current_level or false
|
||||||
|
local margin_left = args.margin_left or 0
|
||||||
|
local margin_right = args.margin_right or 0
|
||||||
|
|
||||||
|
local display_notification = args.display_notification or false
|
||||||
|
local display_notification_onClick = args.display_notification_onClick or true
|
||||||
|
local position = args.notification_position or "top_right"
|
||||||
|
local timeout = args.timeout or 10
|
||||||
|
|
||||||
|
local warning_msg_title = args.warning_msg_title or 'Huston, we have a problem'
|
||||||
|
local warning_msg_text = args.warning_msg_text or 'Battery is dying'
|
||||||
|
local warning_msg_position = args.warning_msg_position or 'bottom_right'
|
||||||
|
local warning_msg_icon = args.warning_msg_icon or WIDGET_DIR .. '/spaceman.jpg'
|
||||||
|
local enable_battery_warning = args.enable_battery_warning
|
||||||
|
if enable_battery_warning == nil then
|
||||||
|
enable_battery_warning = true
|
||||||
|
end
|
||||||
|
|
||||||
|
if not gfs.dir_readable(path_to_icons) then
|
||||||
|
naughty.notify{
|
||||||
|
title = "Battery Widget",
|
||||||
|
text = "Folder with icons doesn't exist: " .. path_to_icons,
|
||||||
|
preset = naughty.config.presets.critical
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
local icon_widget = wibox.widget {
|
||||||
|
{
|
||||||
|
id = "icon",
|
||||||
|
widget = wibox.widget.imagebox,
|
||||||
|
resize = false
|
||||||
|
},
|
||||||
|
valign = 'center',
|
||||||
|
layout = wibox.container.place,
|
||||||
|
}
|
||||||
|
local level_widget = wibox.widget {
|
||||||
|
font = font,
|
||||||
|
widget = wibox.widget.textbox
|
||||||
|
}
|
||||||
|
|
||||||
|
battery_widget = wibox.widget {
|
||||||
|
icon_widget,
|
||||||
|
level_widget,
|
||||||
|
layout = wibox.layout.fixed.horizontal,
|
||||||
|
}
|
||||||
|
-- Popup with battery info
|
||||||
|
-- One way of creating a pop-up notification - naughty.notify
|
||||||
|
local notification
|
||||||
|
local function show_battery_status(batteryType)
|
||||||
|
awful.spawn.easy_async([[bash -c 'acpi']],
|
||||||
|
function(stdout, _, _, _)
|
||||||
|
naughty.destroy(notification)
|
||||||
|
notification = naughty.notify{
|
||||||
|
text = stdout,
|
||||||
|
title = "Battery status",
|
||||||
|
icon = path_to_icons .. batteryType .. ".svg",
|
||||||
|
icon_size = dpi(16),
|
||||||
|
position = position,
|
||||||
|
timeout = 5, hover_timeout = 0.5,
|
||||||
|
width = 200,
|
||||||
|
screen = mouse.screen
|
||||||
|
}
|
||||||
|
end
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Alternative to naughty.notify - tooltip. You can compare both and choose the preferred one
|
||||||
|
--battery_popup = awful.tooltip({objects = {battery_widget}})
|
||||||
|
|
||||||
|
-- To use colors from beautiful theme put
|
||||||
|
-- following lines in rc.lua before require("battery"):
|
||||||
|
-- beautiful.tooltip_fg = beautiful.fg_normal
|
||||||
|
-- beautiful.tooltip_bg = beautiful.bg_normal
|
||||||
|
|
||||||
|
local function show_battery_warning()
|
||||||
|
naughty.notify {
|
||||||
|
icon = warning_msg_icon,
|
||||||
|
icon_size = 100,
|
||||||
|
text = warning_msg_text,
|
||||||
|
title = warning_msg_title,
|
||||||
|
timeout = 25, -- show the warning for a longer time
|
||||||
|
hover_timeout = 0.5,
|
||||||
|
position = warning_msg_position,
|
||||||
|
bg = "#F06060",
|
||||||
|
fg = "#EEE9EF",
|
||||||
|
width = 300,
|
||||||
|
screen = mouse.screen
|
||||||
|
}
|
||||||
|
end
|
||||||
|
local last_battery_check = os.time()
|
||||||
|
local batteryType = "battery-good-symbolic"
|
||||||
|
|
||||||
|
watch("acpi -i", timeout,
|
||||||
|
function(widget, stdout)
|
||||||
|
local battery_info = {}
|
||||||
|
local capacities = {}
|
||||||
|
for s in stdout:gmatch("[^\r\n]+") do
|
||||||
|
local status, charge_str, _ = string.match(s, '.+: ([%a%s]+), (%d?%d?%d)%%,?(.*)')
|
||||||
|
if status ~= nil then
|
||||||
|
table.insert(battery_info, {status = status, charge = tonumber(charge_str)})
|
||||||
|
else
|
||||||
|
local cap_str = string.match(s, '.+:.+last full capacity (%d+)')
|
||||||
|
table.insert(capacities, tonumber(cap_str))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local capacity = 0
|
||||||
|
for _, cap in ipairs(capacities) do
|
||||||
|
capacity = capacity + cap
|
||||||
|
end
|
||||||
|
|
||||||
|
local charge = 0
|
||||||
|
local status
|
||||||
|
for i, batt in ipairs(battery_info) do
|
||||||
|
if capacities[i] ~= nil then
|
||||||
|
if batt.charge >= charge then
|
||||||
|
status = batt.status -- use most charged battery status
|
||||||
|
-- this is arbitrary, and maybe another metric should be used
|
||||||
|
end
|
||||||
|
|
||||||
|
charge = charge + batt.charge * capacities[i]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
charge = charge / capacity
|
||||||
|
|
||||||
|
if show_current_level then
|
||||||
|
level_widget.text = string.format('%d%%', charge)
|
||||||
|
end
|
||||||
|
|
||||||
|
if (charge >= 1 and charge < 15) then
|
||||||
|
batteryType = "battery-empty%s-symbolic"
|
||||||
|
if enable_battery_warning and status ~= 'Charging' and os.difftime(os.time(), last_battery_check) > 300 then
|
||||||
|
-- if 5 minutes have elapsed since the last warning
|
||||||
|
last_battery_check = os.time()
|
||||||
|
|
||||||
|
show_battery_warning()
|
||||||
|
end
|
||||||
|
elseif (charge >= 15 and charge < 40) then batteryType = "battery-caution%s-symbolic"
|
||||||
|
elseif (charge >= 40 and charge < 60) then batteryType = "battery-low%s-symbolic"
|
||||||
|
elseif (charge >= 60 and charge < 80) then batteryType = "battery-good%s-symbolic"
|
||||||
|
elseif (charge >= 80 and charge <= 100) then batteryType = "battery-full%s-symbolic"
|
||||||
|
end
|
||||||
|
|
||||||
|
if status == 'Charging' then
|
||||||
|
batteryType = string.format(batteryType, '-charging')
|
||||||
|
else
|
||||||
|
batteryType = string.format(batteryType, '')
|
||||||
|
end
|
||||||
|
|
||||||
|
widget.icon:set_image(path_to_icons .. batteryType .. ".svg")
|
||||||
|
|
||||||
|
-- Update popup text
|
||||||
|
-- battery_popup.text = string.gsub(stdout, "\n$", "")
|
||||||
|
end,
|
||||||
|
icon_widget)
|
||||||
|
|
||||||
|
if display_notification then
|
||||||
|
battery_widget:connect_signal("mouse::enter", function() show_battery_status(batteryType) end)
|
||||||
|
battery_widget:connect_signal("mouse::leave", function() naughty.destroy(notification) end)
|
||||||
|
elseif display_notification_onClick then
|
||||||
|
battery_widget:connect_signal("button::press", function(_,_,_,button)
|
||||||
|
if (button == 3) then show_battery_status(batteryType) end
|
||||||
|
end)
|
||||||
|
battery_widget:connect_signal("mouse::leave", function() naughty.destroy(notification) end)
|
||||||
|
end
|
||||||
|
|
||||||
|
return wibox.container.margin(battery_widget, margin_left, margin_right)
|
||||||
|
end
|
||||||
|
|
||||||
|
return setmetatable(battery_widget, { __call = function(_, ...) return worker(...) end })
|
After Width: | Height: | Size: 16 KiB |
|
@ -0,0 +1,119 @@
|
||||||
|
# Volume widget
|
||||||
|
|
||||||
|
Volume widget based on [amixer](https://linux.die.net/man/1/amixer) (is used for controlling the audio volume) and [pacmd](https://linux.die.net/man/1/pacmd) (is used for selecting a sink/source). Also, the widget provides an easy way to customize how it looks, following types are supported out-of-the-box:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
From left to right: `horizontal_bar`, `vertical_bar`, `icon`, `icon_and_text`, `arc`
|
||||||
|
|
||||||
|
A right-click on the widget opens a popup where you can choose a sink/source:
|
||||||
|

|
||||||
|
|
||||||
|
Left click toggles mute and middle click opens a mixer ([pavucontrol](https://freedesktop.org/software/pulseaudio/pavucontrol/) by default).
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
- switch between sinks/sources by right click on the widget;
|
||||||
|
- more responsive than previous versions of volume widget, which were refreshed once a second;
|
||||||
|
- 5 predefined customizable looks;
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
Clone the repo under **~/.config/awesome/** and add widget in **rc.lua**:
|
||||||
|
|
||||||
|
```lua
|
||||||
|
local volume_widget = require('awesome-wm-widgets.volume-widget.volume')
|
||||||
|
...
|
||||||
|
s.mytasklist, -- Middle widget
|
||||||
|
{ -- Right widgets
|
||||||
|
layout = wibox.layout.fixed.horizontal,
|
||||||
|
...
|
||||||
|
-- default
|
||||||
|
volume_widget(),
|
||||||
|
-- customized
|
||||||
|
volume_widget{
|
||||||
|
widget_type = 'arc'
|
||||||
|
},
|
||||||
|
```
|
||||||
|
|
||||||
|
Note that widget uses following command the get the current volume: `amixer -D pulse sget Master`, so please make sure that it works for you, otherwise you need to set parameter `device = 'default'`.
|
||||||
|
|
||||||
|
### Shortcuts
|
||||||
|
|
||||||
|
To improve responsiveness of the widget when volume level is changed by a shortcut use corresponding methods of the widget:
|
||||||
|
|
||||||
|
```lua
|
||||||
|
awful.key({ modkey }, "]", function() volume_widget:inc(5) end),
|
||||||
|
awful.key({ modkey }, "[", function() volume_widget:dec(5) end),
|
||||||
|
awful.key({ modkey }, "\\", function() volume_widget:toggle() end),
|
||||||
|
```
|
||||||
|
|
||||||
|
## Customization
|
||||||
|
|
||||||
|
It is possible to customize the widget by providing a table with all or some of the following config parameters:
|
||||||
|
|
||||||
|
### Generic parameter
|
||||||
|
|
||||||
|
| Name | Default | Description |
|
||||||
|
|---|---|---|
|
||||||
|
| `mixer_cmd` | `pavucontrol` | command to run on middle click (e.g. a mixer program) |
|
||||||
|
| `step` | `5` | How much the volume is raised or lowered at once (in %) |
|
||||||
|
| `widget_type`| `icon_and_text`| Widget type, one of `horizontal_bar`, `vertical_bar`, `icon`, `icon_and_text`, `arc` |
|
||||||
|
| `device` | `pulse` | Select the device name to control |
|
||||||
|
|
||||||
|
Depends on the chosen widget type add parameters from the corresponding section below:
|
||||||
|
|
||||||
|
#### `icon` parameters
|
||||||
|
|
||||||
|
| Name | Default | Description |
|
||||||
|
|---|---|---|
|
||||||
|
| `icon_dir`| `./icons`| Path to the folder with icons |
|
||||||
|
|
||||||
|
_Note:_ if you are changing icons, the folder should contain following .svg images:
|
||||||
|
- audio-volume-high-symbolic
|
||||||
|
- audio-volume-medium-symbolic
|
||||||
|
- audio-volume-low-symbolic
|
||||||
|
- audio-volume-muted-symbolic
|
||||||
|
|
||||||
|
#### `icon_and_text` parameters
|
||||||
|
|
||||||
|
| Name | Default | Description |
|
||||||
|
|---|---|---|
|
||||||
|
| `icon_dir`| `./icons`| Path to the folder with icons |
|
||||||
|
| `font` | `beautiful.font` | Font name and size, like `Play 12` |
|
||||||
|
|
||||||
|
#### `arc` parameters
|
||||||
|
|
||||||
|
| Name | Default | Description |
|
||||||
|
|---|---|---|
|
||||||
|
| `thickness` | 2 | Thickness of the arc |
|
||||||
|
| `main_color` | `beautiful.fg_color` | Color of the arc |
|
||||||
|
| `bg_color` | `#ffffff11` | Color of the arc's background |
|
||||||
|
| `mute_color` | `beautiful.fg_urgent` | Color of the arc when mute |
|
||||||
|
| `size` | 18 | Size of the widget |
|
||||||
|
|
||||||
|
#### `horizontal_bar` parameters
|
||||||
|
|
||||||
|
| Name | Default | Description |
|
||||||
|
|---|---|---|
|
||||||
|
| `main_color` | `beautiful.fg_normal` | Color of the bar |
|
||||||
|
| `mute_color` | `beautiful.fg_urgent` | Color of the bar when mute |
|
||||||
|
| `bg_color` | `'#ffffff11'` | Color of the bar's background |
|
||||||
|
| `width` | `50` | The bar width |
|
||||||
|
| `margins` | `10` | Top and bottom margins (if your wibar is 22 px high, bar will be 2 px = 22 - 2*10) |
|
||||||
|
| `shape` | `'bar'` | [gears.shape](https://awesomewm.org/doc/api/libraries/gears.shape.html), could be `octogon`, `hexagon`, `powerline`, etc |
|
||||||
|
| `with_icon` | `true` | Show volume icon|
|
||||||
|
|
||||||
|
_Note:_ I didn't figure out how does the `forced_height` property of progressbar widget work (maybe it doesn't work at all), thus there is a workaround with margins.
|
||||||
|
|
||||||
|
#### `vertical_bar` parameters
|
||||||
|
|
||||||
|
| Name | Default | Description |
|
||||||
|
|---|---|---|
|
||||||
|
| `main_color` | `beautiful.fg_normal` | Color of the bar |
|
||||||
|
| `mute_color` | `beautiful.fg_urgent` | Color of the bar when mute |
|
||||||
|
| `bg_color` | `'#ffffff11'` | Color of the bar's background |
|
||||||
|
| `width` | `10` | The bar width |
|
||||||
|
| `margins` | `20` | Top and bottom margins (if your wibar is 22 px high, bar will be 2 px = 22 - 2*10) |
|
||||||
|
| `shape` | `'bar'` | [gears.shape](https://awesomewm.org/doc/api/libraries/gears.shape.html), could be `octogon`, `hexagon`, `powerline`, etc |
|
||||||
|
| `with_icon` | `true` | Show volume icon|
|
|
@ -0,0 +1,88 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="16"
|
||||||
|
viewBox="0 0 16 16"
|
||||||
|
height="16"
|
||||||
|
id="svg2"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.91 r"
|
||||||
|
sodipodi:docname="audio-volume-high-symbolic.svg">
|
||||||
|
<metadata
|
||||||
|
id="metadata30">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title></dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="1215"
|
||||||
|
inkscape:window-height="776"
|
||||||
|
id="namedview28"
|
||||||
|
showgrid="true"
|
||||||
|
inkscape:zoom="38.125"
|
||||||
|
inkscape:cx="8"
|
||||||
|
inkscape:cy="8"
|
||||||
|
inkscape:window-x="65"
|
||||||
|
inkscape:window-y="24"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg2"
|
||||||
|
showguides="true"
|
||||||
|
inkscape:snap-intersection-paths="false"
|
||||||
|
inkscape:object-paths="false">
|
||||||
|
<inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid4158" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<defs
|
||||||
|
id="defs4" />
|
||||||
|
<path
|
||||||
|
d="M 6,2 2,6 2,10 6,14 6,9 7,8 6,7 Z"
|
||||||
|
id="path18"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#bebebe"
|
||||||
|
sodipodi:nodetypes="cccccccc" />
|
||||||
|
<path
|
||||||
|
d="M 1.300003,5 C 0.216589,5 0,6.163269 0,7.4 L 0,8.6 C 0,9.836747 0.24312,11 1.300003,11 L 3,11 3,5 Z"
|
||||||
|
id="path20"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#bebebe"
|
||||||
|
sodipodi:nodetypes="ssssccs" />
|
||||||
|
<path
|
||||||
|
style="opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="M 13.140638,1 11.726417,2.413582 C 12.808349,3.4955144 13.990412,5.4467621 14,8 c 0,2.551493 -1.192916,4.505751 -2.273583,5.586418 L 13.140638,15 C 14.595711,13.544927 16.019176,11 16,8 16.035061,5 14.595117,2.4544787 13.140638,1 Z"
|
||||||
|
id="path4508"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="ccccccc" />
|
||||||
|
<path
|
||||||
|
style="opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="M 11,3.1156678 9.5897193,4.5261118 C 10.372347,5.3087395 11,6.5690611 11,8 11,9.4309388 10.372767,10.690952 9.5897193,11.474 L 11,12.884 C 12.275645,11.608355 13,9.854095 13,8 13,6.1543677 12.273068,4.3887355 11,3.1156678 Z"
|
||||||
|
id="path4529"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="ccccccc" />
|
||||||
|
<path
|
||||||
|
style="opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="M 8.629,5 7.2094668,6.4096296 C 8,7.05621 8,7.805653 8,8 8,8.1932576 7.982199,8.9408674 7.209,9.59 L 8.6289063,11 C 9.8466375,9.952694 10,8.5984701 10,8 10,7.400497 9.854476,6.062891 8.629,5 Z"
|
||||||
|
id="path4569"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="ccscccc" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 3.4 KiB |
|
@ -0,0 +1,88 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="16"
|
||||||
|
viewBox="0 0 16 16"
|
||||||
|
height="16"
|
||||||
|
id="svg2"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.91 r"
|
||||||
|
sodipodi:docname="audio-volume-low-symbolic.svg">
|
||||||
|
<metadata
|
||||||
|
id="metadata30">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title></dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="1215"
|
||||||
|
inkscape:window-height="776"
|
||||||
|
id="namedview28"
|
||||||
|
showgrid="true"
|
||||||
|
inkscape:zoom="38.125"
|
||||||
|
inkscape:cx="8"
|
||||||
|
inkscape:cy="8"
|
||||||
|
inkscape:window-x="65"
|
||||||
|
inkscape:window-y="24"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg2"
|
||||||
|
showguides="true"
|
||||||
|
inkscape:snap-intersection-paths="false"
|
||||||
|
inkscape:object-paths="false">
|
||||||
|
<inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid4158" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<defs
|
||||||
|
id="defs4" />
|
||||||
|
<path
|
||||||
|
d="M 6,2 2,6 2,10 6,14 6,9 7,8 6,7 Z"
|
||||||
|
id="path18"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#bebebe"
|
||||||
|
sodipodi:nodetypes="cccccccc" />
|
||||||
|
<path
|
||||||
|
d="M 1.300003,5 C 0.216589,5 0,6.163269 0,7.4 L 0,8.6 C 0,9.836747 0.24312,11 1.300003,11 L 3,11 3,5 Z"
|
||||||
|
id="path20"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#bebebe"
|
||||||
|
sodipodi:nodetypes="ssssccs" />
|
||||||
|
<path
|
||||||
|
style="opacity:0.3;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="M 13.140638,1 11.726417,2.413582 C 12.808349,3.4955144 13.990412,5.4467621 14,8 c 0,2.551493 -1.192916,4.505751 -2.273583,5.586418 L 13.140638,15 C 14.595711,13.544927 16.019176,11 16,8 16.035061,5 14.595117,2.4544787 13.140638,1 Z"
|
||||||
|
id="path4508"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="ccccccc" />
|
||||||
|
<path
|
||||||
|
style="opacity:0.3;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="M 11,3.1156678 9.5897193,4.5261118 C 10.372347,5.3087395 11,6.5690611 11,8 11,9.4309388 10.372767,10.690952 9.5897193,11.474 L 11,12.884 C 12.275645,11.608355 13,9.854095 13,8 13,6.1543677 12.273068,4.3887355 11,3.1156678 Z"
|
||||||
|
id="path4529"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="ccccccc" />
|
||||||
|
<path
|
||||||
|
style="opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="M 8.629,5 7.2094668,6.4096296 C 8,7.05621 8,7.805653 8,8 8,8.1932576 7.982199,8.9408674 7.209,9.59 L 8.6289063,11 C 9.8466375,9.952694 10,8.5984701 10,8 10,7.400497 9.854476,6.062891 8.629,5 Z"
|
||||||
|
id="path4569"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="ccscccc" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 3.4 KiB |
|
@ -0,0 +1,88 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="16"
|
||||||
|
viewBox="0 0 16 16"
|
||||||
|
height="16"
|
||||||
|
id="svg2"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.91 r"
|
||||||
|
sodipodi:docname="audio-volume-medium-symbolic.svg">
|
||||||
|
<metadata
|
||||||
|
id="metadata30">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title></dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="1215"
|
||||||
|
inkscape:window-height="776"
|
||||||
|
id="namedview28"
|
||||||
|
showgrid="true"
|
||||||
|
inkscape:zoom="38.125"
|
||||||
|
inkscape:cx="8"
|
||||||
|
inkscape:cy="8"
|
||||||
|
inkscape:window-x="65"
|
||||||
|
inkscape:window-y="24"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg2"
|
||||||
|
showguides="true"
|
||||||
|
inkscape:snap-intersection-paths="false"
|
||||||
|
inkscape:object-paths="false">
|
||||||
|
<inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid4158" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<defs
|
||||||
|
id="defs4" />
|
||||||
|
<path
|
||||||
|
d="M 6,2 2,6 2,10 6,14 6,9 7,8 6,7 Z"
|
||||||
|
id="path18"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#bebebe"
|
||||||
|
sodipodi:nodetypes="cccccccc" />
|
||||||
|
<path
|
||||||
|
d="M 1.300003,5 C 0.216589,5 0,6.163269 0,7.4 L 0,8.6 C 0,9.836747 0.24312,11 1.300003,11 L 3,11 3,5 Z"
|
||||||
|
id="path20"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#bebebe"
|
||||||
|
sodipodi:nodetypes="ssssccs" />
|
||||||
|
<path
|
||||||
|
style="opacity:0.3;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="M 13.140638,1 11.726417,2.413582 C 12.808349,3.4955144 13.990412,5.4467621 14,8 c 0,2.551493 -1.192916,4.505751 -2.273583,5.586418 L 13.140638,15 C 14.595711,13.544927 16.019176,11 16,8 16.035061,5 14.595117,2.4544787 13.140638,1 Z"
|
||||||
|
id="path4508"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="ccccccc" />
|
||||||
|
<path
|
||||||
|
style="opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="M 11,3.1156678 9.5897193,4.5261118 C 10.372347,5.3087395 11,6.5690611 11,8 11,9.4309388 10.372767,10.690952 9.5897193,11.474 L 11,12.884 C 12.275645,11.608355 13,9.854095 13,8 13,6.1543677 12.273068,4.3887355 11,3.1156678 Z"
|
||||||
|
id="path4529"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="ccccccc" />
|
||||||
|
<path
|
||||||
|
style="opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="M 8.629,5 7.2094668,6.4096296 C 8,7.05621 8,7.805653 8,8 8,8.1932576 7.982199,8.9408674 7.209,9.59 L 8.6289063,11 C 9.8466375,9.952694 10,8.5984701 10,8 10,7.400497 9.854476,6.062891 8.629,5 Z"
|
||||||
|
id="path4569"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="ccscccc" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 3.4 KiB |
|
@ -0,0 +1,88 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="16"
|
||||||
|
viewBox="0 0 16 16"
|
||||||
|
height="16"
|
||||||
|
id="svg2"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.91 r13725"
|
||||||
|
sodipodi:docname="audio-volume-muted-symbolic.svg">
|
||||||
|
<metadata
|
||||||
|
id="metadata30">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title></dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="1215"
|
||||||
|
inkscape:window-height="776"
|
||||||
|
id="namedview28"
|
||||||
|
showgrid="true"
|
||||||
|
inkscape:zoom="38.125"
|
||||||
|
inkscape:cx="3.4229508"
|
||||||
|
inkscape:cy="7.947541"
|
||||||
|
inkscape:window-x="65"
|
||||||
|
inkscape:window-y="24"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg2"
|
||||||
|
showguides="true"
|
||||||
|
inkscape:snap-intersection-paths="false"
|
||||||
|
inkscape:object-paths="false">
|
||||||
|
<inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid4158" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<defs
|
||||||
|
id="defs4" />
|
||||||
|
<path
|
||||||
|
d="M 6,2 2,6 2,10 6,14 6,9 7,8 6,7 Z"
|
||||||
|
id="path18"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#bebebe"
|
||||||
|
sodipodi:nodetypes="cccccccc" />
|
||||||
|
<path
|
||||||
|
d="M 1.300003,5 C 0.216589,5 0,6.163269 0,7.4 L 0,8.6 C 0,9.836747 0.24312,11 1.300003,11 L 3,11 3,5 Z"
|
||||||
|
id="path20"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#bebebe"
|
||||||
|
sodipodi:nodetypes="ssssccs" />
|
||||||
|
<path
|
||||||
|
style="opacity:0.3;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="M 13.140638,1 11.726417,2.413582 C 12.808349,3.4955144 13.990412,5.4467621 14,8 c 0,2.551493 -1.192916,4.505751 -2.273583,5.586418 L 13.140638,15 C 14.595711,13.544927 16.019176,11 16,8 16.035061,5 14.595117,2.4544787 13.140638,1 Z"
|
||||||
|
id="path4508"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="ccccccc" />
|
||||||
|
<path
|
||||||
|
style="opacity:0.3;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="M 11,3.1156678 9.5897193,4.5261118 C 10.372347,5.3087395 11,6.5690611 11,8 11,9.4309388 10.372767,10.690952 9.5897193,11.474 L 11,12.884 C 12.275645,11.608355 13,9.854095 13,8 13,6.1543677 12.273068,4.3887355 11,3.1156678 Z"
|
||||||
|
id="path4529"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="ccccccc" />
|
||||||
|
<path
|
||||||
|
style="opacity:0.3;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="M 8.629,5 7.2094668,6.4096296 C 8,7.05621 8,7.805653 8,8 8,8.1932576 7.982199,8.9408674 7.209,9.59 L 8.6289063,11 C 9.8466375,9.952694 10,8.5984701 10,8 10,7.400497 9.854476,6.062891 8.629,5 Z"
|
||||||
|
id="path4569"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="ccscccc" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 3.5 KiB |
After Width: | Height: | Size: 8.9 KiB |
After Width: | Height: | Size: 72 KiB |
|
@ -0,0 +1,105 @@
|
||||||
|
|
||||||
|
|
||||||
|
local utils = {}
|
||||||
|
|
||||||
|
local function split(string_to_split, separator)
|
||||||
|
if separator == nil then separator = "%s" end
|
||||||
|
local t = {}
|
||||||
|
|
||||||
|
for str in string.gmatch(string_to_split, "([^".. separator .."]+)") do
|
||||||
|
table.insert(t, str)
|
||||||
|
end
|
||||||
|
|
||||||
|
return t
|
||||||
|
end
|
||||||
|
|
||||||
|
function utils.extract_sinks_and_sources(pacmd_output)
|
||||||
|
local sinks = {}
|
||||||
|
local sources = {}
|
||||||
|
local device
|
||||||
|
local properties
|
||||||
|
local ports
|
||||||
|
local in_sink = false
|
||||||
|
local in_source = false
|
||||||
|
local in_device = false
|
||||||
|
local in_properties = false
|
||||||
|
local in_ports = false
|
||||||
|
for line in pacmd_output:gmatch("[^\r\n]+") do
|
||||||
|
if string.match(line, 'source%(s%) available.') then
|
||||||
|
in_sink = false
|
||||||
|
in_source = true
|
||||||
|
end
|
||||||
|
if string.match(line, 'sink%(s%) available.') then
|
||||||
|
in_sink = true
|
||||||
|
in_source = false
|
||||||
|
end
|
||||||
|
|
||||||
|
if string.match(line, 'index:') then
|
||||||
|
in_device = true
|
||||||
|
in_properties = false
|
||||||
|
device = {
|
||||||
|
id = line:match(': (%d+)'),
|
||||||
|
is_default = string.match(line, '*') ~= nil
|
||||||
|
}
|
||||||
|
if in_sink then
|
||||||
|
table.insert(sinks, device)
|
||||||
|
elseif in_source then
|
||||||
|
table.insert(sources, device)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if string.match(line, '^\tproperties:') then
|
||||||
|
in_device = false
|
||||||
|
in_properties = true
|
||||||
|
properties = {}
|
||||||
|
device['properties'] = properties
|
||||||
|
end
|
||||||
|
|
||||||
|
if string.match(line, 'ports:') then
|
||||||
|
in_device = false
|
||||||
|
in_properties = false
|
||||||
|
in_ports = true
|
||||||
|
ports = {}
|
||||||
|
device['ports'] = ports
|
||||||
|
end
|
||||||
|
|
||||||
|
if string.match(line, 'active port:') then
|
||||||
|
in_device = false
|
||||||
|
in_properties = false
|
||||||
|
in_ports = false
|
||||||
|
device['active_port'] = line:match(': (.+)'):gsub('<',''):gsub('>','')
|
||||||
|
end
|
||||||
|
|
||||||
|
if in_device then
|
||||||
|
local t = split(line, ': ')
|
||||||
|
local key = t[1]:gsub('\t+', ''):lower()
|
||||||
|
local value = t[2]:gsub('^<', ''):gsub('>$', '')
|
||||||
|
device[key] = value
|
||||||
|
end
|
||||||
|
|
||||||
|
if in_properties then
|
||||||
|
local t = split(line, '=')
|
||||||
|
local key = t[1]:gsub('\t+', ''):gsub('%.', '_'):gsub('-', '_'):gsub(':', ''):gsub("%s+$", "")
|
||||||
|
local value
|
||||||
|
if t[2] == nil then
|
||||||
|
value = t[2]
|
||||||
|
else
|
||||||
|
value = t[2]:gsub('"', ''):gsub("^%s+", ""):gsub(' Analog Stereo', '')
|
||||||
|
end
|
||||||
|
properties[key] = value
|
||||||
|
end
|
||||||
|
|
||||||
|
if in_ports then
|
||||||
|
local t = split(line, ': ')
|
||||||
|
local key = t[1]
|
||||||
|
if key ~= nil then
|
||||||
|
key = key:gsub('\t+', '')
|
||||||
|
end
|
||||||
|
ports[key] = t[2]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return sinks, sources
|
||||||
|
end
|
||||||
|
|
||||||
|
return utils
|
|
@ -0,0 +1 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#ffffff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-volume-2"><polygon points="11 5 6 9 2 9 2 15 6 15 11 19 11 5"></polygon><path d="M19.07 4.93a10 10 0 0 1 0 14.14M15.54 8.46a5 5 0 0 1 0 7.07"></path></svg>
|
After Width: | Height: | Size: 354 B |
|
@ -0,0 +1,228 @@
|
||||||
|
-------------------------------------------------
|
||||||
|
-- The Ultimate Volume Widget for Awesome Window Manager
|
||||||
|
-- More details could be found here:
|
||||||
|
-- https://github.com/streetturtle/widgets/tree/master/volume-widget
|
||||||
|
|
||||||
|
-- @author Pavel Makhov
|
||||||
|
-- @copyright 2020 Pavel Makhov
|
||||||
|
-------------------------------------------------
|
||||||
|
|
||||||
|
local awful = require("awful")
|
||||||
|
local wibox = require("wibox")
|
||||||
|
local spawn = require("awful.spawn")
|
||||||
|
local gears = require("gears")
|
||||||
|
local beautiful = require("beautiful")
|
||||||
|
local watch = require("awful.widget.watch")
|
||||||
|
local utils = require("widgets.volume-widget.utils")
|
||||||
|
|
||||||
|
|
||||||
|
local LIST_DEVICES_CMD = [[sh -c "pacmd list-sinks; pacmd list-sources"]]
|
||||||
|
local function GET_VOLUME_CMD(device) return 'amixer -D ' .. device .. ' sget Master' end
|
||||||
|
local function INC_VOLUME_CMD(device, step) return 'amixer -D ' .. device .. ' sset Master ' .. step .. '%+' end
|
||||||
|
local function DEC_VOLUME_CMD(device, step) return 'amixer -D ' .. device .. ' sset Master ' .. step .. '%-' end
|
||||||
|
local function TOG_VOLUME_CMD(device) return 'amixer -D ' .. device .. ' sset Master toggle' end
|
||||||
|
|
||||||
|
|
||||||
|
local widget_types = {
|
||||||
|
icon_and_text = require("widgets.volume-widget.widgets.icon-and-text-widget"),
|
||||||
|
icon = require("widgets.volume-widget.widgets.icon-widget"),
|
||||||
|
arc = require("widgets.volume-widget.widgets.arc-widget"),
|
||||||
|
horizontal_bar = require("widgets.volume-widget.widgets.horizontal-bar-widget"),
|
||||||
|
vertical_bar = require("widgets.volume-widget.widgets.vertical-bar-widget")
|
||||||
|
}
|
||||||
|
local volume = {}
|
||||||
|
|
||||||
|
local rows = { layout = wibox.layout.fixed.vertical }
|
||||||
|
|
||||||
|
local popup = awful.popup{
|
||||||
|
bg = beautiful.bg_normal,
|
||||||
|
ontop = true,
|
||||||
|
visible = false,
|
||||||
|
shape = gears.shape.rounded_rect,
|
||||||
|
border_width = 1,
|
||||||
|
border_color = beautiful.bg_focus,
|
||||||
|
maximum_width = 400,
|
||||||
|
offset = { y = 5 },
|
||||||
|
widget = {}
|
||||||
|
}
|
||||||
|
|
||||||
|
local function build_main_line(device)
|
||||||
|
if device.active_port ~= nil and device.ports[device.active_port] ~= nil then
|
||||||
|
return device.properties.device_description .. ' · ' .. device.ports[device.active_port]
|
||||||
|
else
|
||||||
|
return device.properties.device_description
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function build_rows(devices, on_checkbox_click, device_type)
|
||||||
|
local device_rows = { layout = wibox.layout.fixed.vertical }
|
||||||
|
for _, device in pairs(devices) do
|
||||||
|
|
||||||
|
local checkbox = wibox.widget {
|
||||||
|
checked = device.is_default,
|
||||||
|
color = beautiful.bg_normal,
|
||||||
|
paddings = 2,
|
||||||
|
shape = gears.shape.circle,
|
||||||
|
forced_width = 20,
|
||||||
|
forced_height = 20,
|
||||||
|
check_color = beautiful.fg_urgent,
|
||||||
|
widget = wibox.widget.checkbox
|
||||||
|
}
|
||||||
|
|
||||||
|
checkbox:connect_signal("button::press", function()
|
||||||
|
spawn.easy_async(string.format([[sh -c 'pacmd set-default-%s "%s"']], device_type, device.name), function()
|
||||||
|
on_checkbox_click()
|
||||||
|
end)
|
||||||
|
end)
|
||||||
|
|
||||||
|
local row = wibox.widget {
|
||||||
|
{
|
||||||
|
{
|
||||||
|
{
|
||||||
|
checkbox,
|
||||||
|
valign = 'center',
|
||||||
|
layout = wibox.container.place,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{
|
||||||
|
text = build_main_line(device),
|
||||||
|
align = 'left',
|
||||||
|
widget = wibox.widget.textbox
|
||||||
|
},
|
||||||
|
left = 10,
|
||||||
|
layout = wibox.container.margin
|
||||||
|
},
|
||||||
|
spacing = 8,
|
||||||
|
layout = wibox.layout.align.horizontal
|
||||||
|
},
|
||||||
|
margins = 4,
|
||||||
|
layout = wibox.container.margin
|
||||||
|
},
|
||||||
|
bg = beautiful.bg_normal,
|
||||||
|
widget = wibox.container.background
|
||||||
|
}
|
||||||
|
|
||||||
|
row:connect_signal("mouse::enter", function(c) c:set_bg(beautiful.bg_focus) end)
|
||||||
|
row:connect_signal("mouse::leave", function(c) c:set_bg(beautiful.bg_normal) end)
|
||||||
|
|
||||||
|
local old_cursor, old_wibox
|
||||||
|
row:connect_signal("mouse::enter", function()
|
||||||
|
local wb = mouse.current_wibox
|
||||||
|
old_cursor, old_wibox = wb.cursor, wb
|
||||||
|
wb.cursor = "hand1"
|
||||||
|
end)
|
||||||
|
row:connect_signal("mouse::leave", function()
|
||||||
|
if old_wibox then
|
||||||
|
old_wibox.cursor = old_cursor
|
||||||
|
old_wibox = nil
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
row:connect_signal("button::press", function()
|
||||||
|
spawn.easy_async(string.format([[sh -c 'pacmd set-default-%s "%s"']], device_type, device.name), function()
|
||||||
|
on_checkbox_click()
|
||||||
|
end)
|
||||||
|
end)
|
||||||
|
|
||||||
|
table.insert(device_rows, row)
|
||||||
|
end
|
||||||
|
|
||||||
|
return device_rows
|
||||||
|
end
|
||||||
|
|
||||||
|
local function build_header_row(text)
|
||||||
|
return wibox.widget{
|
||||||
|
{
|
||||||
|
markup = "<b>" .. text .. "</b>",
|
||||||
|
align = 'center',
|
||||||
|
widget = wibox.widget.textbox
|
||||||
|
},
|
||||||
|
bg = beautiful.bg_normal,
|
||||||
|
widget = wibox.container.background
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
local function rebuild_popup()
|
||||||
|
spawn.easy_async(LIST_DEVICES_CMD, function(stdout)
|
||||||
|
|
||||||
|
local sinks, sources = utils.extract_sinks_and_sources(stdout)
|
||||||
|
|
||||||
|
for i = 0, #rows do rows[i]=nil end
|
||||||
|
|
||||||
|
table.insert(rows, build_header_row("SINKS"))
|
||||||
|
table.insert(rows, build_rows(sinks, function() rebuild_popup() end, "sink"))
|
||||||
|
table.insert(rows, build_header_row("SOURCES"))
|
||||||
|
table.insert(rows, build_rows(sources, function() rebuild_popup() end, "source"))
|
||||||
|
|
||||||
|
popup:setup(rows)
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
local function worker(user_args)
|
||||||
|
|
||||||
|
local args = user_args or {}
|
||||||
|
|
||||||
|
local mixer_cmd = args.mixer_cmd or 'pavucontrol'
|
||||||
|
local widget_type = args.widget_type
|
||||||
|
local refresh_rate = args.refresh_rate or 1
|
||||||
|
local step = args.step or 5
|
||||||
|
local device = args.device or 'pulse'
|
||||||
|
|
||||||
|
if widget_types[widget_type] == nil then
|
||||||
|
volume.widget = widget_types['icon_and_text'].get_widget(args.icon_and_text_args)
|
||||||
|
else
|
||||||
|
volume.widget = widget_types[widget_type].get_widget(args)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function update_graphic(widget, stdout)
|
||||||
|
local mute = string.match(stdout, "%[(o%D%D?)%]") -- \[(o\D\D?)\] - [on] or [off]
|
||||||
|
if mute == 'off' then widget:mute()
|
||||||
|
elseif mute == 'on' then widget:unmute()
|
||||||
|
end
|
||||||
|
local volume_level = string.match(stdout, "(%d?%d?%d)%%") -- (\d?\d?\d)\%)
|
||||||
|
volume_level = string.format("% 3d", volume_level)
|
||||||
|
widget:set_volume_level(volume_level)
|
||||||
|
end
|
||||||
|
|
||||||
|
function volume:inc(s)
|
||||||
|
spawn.easy_async(INC_VOLUME_CMD(device, s or step), function(stdout) update_graphic(volume.widget, stdout) end)
|
||||||
|
end
|
||||||
|
|
||||||
|
function volume:dec(s)
|
||||||
|
spawn.easy_async(DEC_VOLUME_CMD(device, s or step), function(stdout) update_graphic(volume.widget, stdout) end)
|
||||||
|
end
|
||||||
|
|
||||||
|
function volume:toggle()
|
||||||
|
spawn.easy_async(TOG_VOLUME_CMD(device), function(stdout) update_graphic(volume.widget, stdout) end)
|
||||||
|
end
|
||||||
|
|
||||||
|
function volume:mixer()
|
||||||
|
if mixer_cmd then
|
||||||
|
spawn.easy_async(mixer_cmd)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
volume.widget:buttons(
|
||||||
|
awful.util.table.join(
|
||||||
|
awful.button({}, 3, function()
|
||||||
|
if popup.visible then
|
||||||
|
popup.visible = not popup.visible
|
||||||
|
else
|
||||||
|
rebuild_popup()
|
||||||
|
popup:move_next_to(mouse.current_widget_geometry)
|
||||||
|
end
|
||||||
|
end),
|
||||||
|
awful.button({}, 4, function() volume:inc() end),
|
||||||
|
awful.button({}, 5, function() volume:dec() end),
|
||||||
|
awful.button({}, 2, function() volume:mixer() end),
|
||||||
|
awful.button({}, 1, function() volume:toggle() end)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
watch(GET_VOLUME_CMD(device), refresh_rate, update_graphic, volume.widget)
|
||||||
|
|
||||||
|
return volume.widget
|
||||||
|
end
|
||||||
|
|
||||||
|
return setmetatable(volume, { __call = function(_, ...) return worker(...) end })
|
|
@ -0,0 +1,46 @@
|
||||||
|
local wibox = require("wibox")
|
||||||
|
local beautiful = require('beautiful')
|
||||||
|
|
||||||
|
local ICON_DIR = os.getenv("HOME") .. '/.config/awesome/widgets/volume-widget/icons/'
|
||||||
|
|
||||||
|
local widget = {}
|
||||||
|
|
||||||
|
function widget.get_widget(widgets_args)
|
||||||
|
local args = widgets_args or {}
|
||||||
|
|
||||||
|
local thickness = args.thickness or 2
|
||||||
|
local main_color = args.main_color or beautiful.fg_color
|
||||||
|
local bg_color = args.bg_color or '#ffffff11'
|
||||||
|
local mute_color = args.mute_color or beautiful.fg_urgent
|
||||||
|
local size = args.size or 18
|
||||||
|
|
||||||
|
return wibox.widget {
|
||||||
|
{
|
||||||
|
id = "icon",
|
||||||
|
image = ICON_DIR .. 'audio-volume-high-symbolic.svg',
|
||||||
|
resize = true,
|
||||||
|
widget = wibox.widget.imagebox,
|
||||||
|
},
|
||||||
|
max_value = 100,
|
||||||
|
thickness = thickness,
|
||||||
|
start_angle = 4.71238898, -- 2pi*3/4
|
||||||
|
forced_height = size,
|
||||||
|
forced_width = size,
|
||||||
|
bg = bg_color,
|
||||||
|
paddings = 2,
|
||||||
|
widget = wibox.container.arcchart,
|
||||||
|
set_volume_level = function(self, new_value)
|
||||||
|
self.value = new_value
|
||||||
|
end,
|
||||||
|
mute = function(self)
|
||||||
|
self.colors = { mute_color }
|
||||||
|
end,
|
||||||
|
unmute = function(self)
|
||||||
|
self.colors = { main_color }
|
||||||
|
end
|
||||||
|
}
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
return widget
|
|
@ -0,0 +1,58 @@
|
||||||
|
local wibox = require("wibox")
|
||||||
|
local beautiful = require('beautiful')
|
||||||
|
local gears = require("gears")
|
||||||
|
|
||||||
|
local ICON_DIR = os.getenv("HOME") .. '/.config/awesome/widgets/volume-widget/icons/'
|
||||||
|
|
||||||
|
local widget = {}
|
||||||
|
|
||||||
|
function widget.get_widget(widgets_args)
|
||||||
|
local args = widgets_args or {}
|
||||||
|
|
||||||
|
local main_color = args.main_color or beautiful.fg_normal
|
||||||
|
local mute_color = args.mute_color or beautiful.fg_urgent
|
||||||
|
local bg_color = args.bg_color or '#ffffff11'
|
||||||
|
local width = args.width or 50
|
||||||
|
local margins = args.margins or 10
|
||||||
|
local shape = args.shape or 'bar'
|
||||||
|
local with_icon = args.with_icon == true and true or false
|
||||||
|
|
||||||
|
local bar = wibox.widget {
|
||||||
|
{
|
||||||
|
{
|
||||||
|
id = "icon",
|
||||||
|
image = ICON_DIR .. 'audio-volume-high-symbolic.svg',
|
||||||
|
resize = false,
|
||||||
|
widget = wibox.widget.imagebox,
|
||||||
|
},
|
||||||
|
valign = 'center',
|
||||||
|
visible = with_icon,
|
||||||
|
layout = wibox.container.place,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id = 'bar',
|
||||||
|
max_value = 100,
|
||||||
|
forced_width = width,
|
||||||
|
color = main_color,
|
||||||
|
margins = { top = margins, bottom = margins },
|
||||||
|
background_color = bg_color,
|
||||||
|
shape = gears.shape[shape],
|
||||||
|
widget = wibox.widget.progressbar,
|
||||||
|
},
|
||||||
|
spacing = 4,
|
||||||
|
layout = wibox.layout.fixed.horizontal,
|
||||||
|
set_volume_level = function(self, new_value)
|
||||||
|
self:get_children_by_id('bar')[1]:set_value(tonumber(new_value))
|
||||||
|
end,
|
||||||
|
mute = function(self)
|
||||||
|
self:get_children_by_id('bar')[1]:set_color(mute_color)
|
||||||
|
end,
|
||||||
|
unmute = function(self)
|
||||||
|
self:get_children_by_id('bar')[1]:set_color(main_color)
|
||||||
|
end
|
||||||
|
}
|
||||||
|
|
||||||
|
return bar
|
||||||
|
end
|
||||||
|
|
||||||
|
return widget
|
|
@ -0,0 +1,59 @@
|
||||||
|
local wibox = require("wibox")
|
||||||
|
local beautiful = require('beautiful')
|
||||||
|
|
||||||
|
local widget = {}
|
||||||
|
|
||||||
|
local ICON_DIR = os.getenv("HOME") .. '/.config/awesome/widgets/volume-widget/icons/'
|
||||||
|
|
||||||
|
function widget.get_widget(widgets_args)
|
||||||
|
local args = widgets_args or {}
|
||||||
|
|
||||||
|
local font = args.font or beautiful.font
|
||||||
|
local icon_dir = args.icon_dir or ICON_DIR
|
||||||
|
|
||||||
|
return wibox.widget {
|
||||||
|
{
|
||||||
|
{
|
||||||
|
id = "icon",
|
||||||
|
resize = false,
|
||||||
|
widget = wibox.widget.imagebox,
|
||||||
|
},
|
||||||
|
valign = 'center',
|
||||||
|
layout = wibox.container.place
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id = 'txt',
|
||||||
|
font = font,
|
||||||
|
widget = wibox.widget.textbox
|
||||||
|
},
|
||||||
|
layout = wibox.layout.fixed.horizontal,
|
||||||
|
set_volume_level = function(self, new_value)
|
||||||
|
self:get_children_by_id('txt')[1]:set_text(new_value)
|
||||||
|
local volume_icon_name
|
||||||
|
if self.is_muted then
|
||||||
|
volume_icon_name = 'audio-volume-muted-symbolic'
|
||||||
|
else
|
||||||
|
local new_value_num = tonumber(new_value)
|
||||||
|
if (new_value_num >= 0 and new_value_num < 33) then
|
||||||
|
volume_icon_name="audio-volume-low-symbolic"
|
||||||
|
elseif (new_value_num < 66) then
|
||||||
|
volume_icon_name="audio-volume-medium-symbolic"
|
||||||
|
else
|
||||||
|
volume_icon_name="audio-volume-high-symbolic"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
self:get_children_by_id('icon')[1]:set_image(icon_dir .. volume_icon_name .. '.svg')
|
||||||
|
end,
|
||||||
|
mute = function(self)
|
||||||
|
self.is_muted = true
|
||||||
|
self:get_children_by_id('icon')[1]:set_image(icon_dir .. 'audio-volume-muted-symbolic.svg')
|
||||||
|
end,
|
||||||
|
unmute = function(self)
|
||||||
|
self.is_muted = false
|
||||||
|
end
|
||||||
|
}
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
return widget
|
|
@ -0,0 +1,46 @@
|
||||||
|
local wibox = require("wibox")
|
||||||
|
|
||||||
|
local widget = {}
|
||||||
|
|
||||||
|
local ICON_DIR = os.getenv("HOME") .. '/.config/awesome/widgets/volume-widget/icons/'
|
||||||
|
|
||||||
|
function widget.get_widget(widgets_args)
|
||||||
|
local args = widgets_args or {}
|
||||||
|
|
||||||
|
local icon_dir = args.icon_dir or ICON_DIR
|
||||||
|
|
||||||
|
return wibox.widget {
|
||||||
|
{
|
||||||
|
id = "icon",
|
||||||
|
resize = false,
|
||||||
|
widget = wibox.widget.imagebox,
|
||||||
|
},
|
||||||
|
valign = 'center',
|
||||||
|
layout = wibox.container.place,
|
||||||
|
set_volume_level = function(self, new_value)
|
||||||
|
local volume_icon_name
|
||||||
|
if self.is_muted then
|
||||||
|
volume_icon_name = 'audio-volume-muted-symbolic'
|
||||||
|
else
|
||||||
|
local new_value_num = tonumber(new_value)
|
||||||
|
if (new_value_num >= 0 and new_value_num < 33) then
|
||||||
|
volume_icon_name="audio-volume-low-symbolic"
|
||||||
|
elseif (new_value_num < 66) then
|
||||||
|
volume_icon_name="audio-volume-medium-symbolic"
|
||||||
|
else
|
||||||
|
volume_icon_name="audio-volume-high-symbolic"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
self:get_children_by_id('icon')[1]:set_image(icon_dir .. volume_icon_name .. '.svg')
|
||||||
|
end,
|
||||||
|
mute = function(self)
|
||||||
|
self.is_muted = true
|
||||||
|
self:get_children_by_id('icon')[1]:set_image(icon_dir .. 'audio-volume-muted-symbolic.svg')
|
||||||
|
end,
|
||||||
|
unmute = function(self)
|
||||||
|
self.is_muted = false
|
||||||
|
end
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
return widget
|
|
@ -0,0 +1,64 @@
|
||||||
|
local wibox = require("wibox")
|
||||||
|
local beautiful = require('beautiful')
|
||||||
|
local gears = require("gears")
|
||||||
|
|
||||||
|
local ICON_DIR = os.getenv("HOME") .. '/.config/awesome/widgets/volume-widget/icons/'
|
||||||
|
|
||||||
|
local widget = {}
|
||||||
|
|
||||||
|
function widget.get_widget(widgets_args)
|
||||||
|
local args = widgets_args or {}
|
||||||
|
|
||||||
|
local main_color = args.main_color or beautiful.fg_normal
|
||||||
|
local mute_color = args.mute_color or beautiful.fg_urgent
|
||||||
|
local bg_color = args.bg_color or '#ffffff11'
|
||||||
|
local width = args.width or 10
|
||||||
|
local margins = args.height or 2
|
||||||
|
local shape = args.shape or 'bar'
|
||||||
|
local with_icon = args.with_icon == true and true or false
|
||||||
|
|
||||||
|
local bar = wibox.widget {
|
||||||
|
{
|
||||||
|
{
|
||||||
|
id = "icon",
|
||||||
|
image = ICON_DIR .. 'audio-volume-high-symbolic.svg',
|
||||||
|
resize = false,
|
||||||
|
widget = wibox.widget.imagebox,
|
||||||
|
},
|
||||||
|
valign = 'center',
|
||||||
|
visible = with_icon,
|
||||||
|
layout = wibox.container.place,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{
|
||||||
|
id = 'bar',
|
||||||
|
max_value = 100,
|
||||||
|
forced_width = width,
|
||||||
|
forced_height = 5,
|
||||||
|
margins = { top = margins, bottom = margins },
|
||||||
|
color = main_color,
|
||||||
|
background_color = bg_color,
|
||||||
|
shape = gears.shape[shape],
|
||||||
|
widget = wibox.widget.progressbar,
|
||||||
|
},
|
||||||
|
forced_width = width,
|
||||||
|
direction = 'east',
|
||||||
|
layout = wibox.container.rotate,
|
||||||
|
},
|
||||||
|
spacing = 4,
|
||||||
|
layout = wibox.layout.fixed.horizontal,
|
||||||
|
set_volume_level = function(self, new_value)
|
||||||
|
self:get_children_by_id('bar')[1]:set_value(tonumber(new_value))
|
||||||
|
end,
|
||||||
|
mute = function(self)
|
||||||
|
self:get_children_by_id('bar')[1]:set_color(mute_color)
|
||||||
|
end,
|
||||||
|
unmute = function(self)
|
||||||
|
self:get_children_by_id('bar')[1]:set_color(main_color)
|
||||||
|
end
|
||||||
|
}
|
||||||
|
|
||||||
|
return bar
|
||||||
|
end
|
||||||
|
|
||||||
|
return widget
|