143 lines
3.8 KiB
Lua
143 lines
3.8 KiB
Lua
local colors = require("colors").sections.widgets.volume
|
|
local icons = require "icons"
|
|
|
|
local popup_width = 250
|
|
|
|
local volume_icon = sbar.add("item", "widgets.volume", {
|
|
position = "right",
|
|
icon = {
|
|
color = colors.icon,
|
|
},
|
|
label = { drawing = false },
|
|
background = { drawing = false },
|
|
popup = {
|
|
align = "center",
|
|
y_offset = 2,
|
|
},
|
|
padding_right = 8,
|
|
})
|
|
|
|
local volume_slider = sbar.add("slider", popup_width, {
|
|
position = "popup." .. volume_icon.name,
|
|
slider = {
|
|
highlight_color = colors.slider.highlight,
|
|
background = {
|
|
height = 12,
|
|
corner_radius = 6,
|
|
color = colors.slider.bg,
|
|
border_color = colors.slider.border,
|
|
border_width = 2,
|
|
},
|
|
knob = {
|
|
string = "",
|
|
drawing = true,
|
|
},
|
|
},
|
|
background = { color = colors.bg1, height = 2, y_offset = -20 },
|
|
click_script = 'osascript -e "set volume output volume $PERCENTAGE"',
|
|
})
|
|
|
|
volume_icon:subscribe("volume_change", function(env)
|
|
local icon = icons.volume._0
|
|
local volume = tonumber(env.INFO)
|
|
sbar.exec("SwitchAudioSource -t output -c", function(result)
|
|
if volume > 60 then
|
|
icon = icons.volume._100
|
|
elseif volume > 30 then
|
|
icon = icons.volume._66
|
|
elseif volume > 10 then
|
|
icon = icons.volume._33
|
|
elseif volume > 0 then
|
|
icon = icons.volume._10
|
|
end
|
|
|
|
volume_icon:set { icon = icon }
|
|
volume_slider:set { slider = { percentage = volume } }
|
|
end)
|
|
end)
|
|
|
|
local function volume_collapse_details()
|
|
local drawing = volume_icon:query().popup.drawing == "on"
|
|
if not drawing then
|
|
return
|
|
end
|
|
volume_icon:set { popup = { drawing = false } }
|
|
sbar.remove "/volume.device\\.*/"
|
|
end
|
|
|
|
local current_audio_device = "None"
|
|
local function volume_toggle_details(env)
|
|
if env.BUTTON == "right" then
|
|
sbar.exec "open /System/Library/PreferencePanes/Sound.prefpane"
|
|
return
|
|
end
|
|
|
|
local should_draw = volume_icon:query().popup.drawing == "off"
|
|
if should_draw then
|
|
volume_icon:set { popup = { drawing = true } }
|
|
sbar.exec("SwitchAudioSource -t output -c", function(result)
|
|
current_audio_device = result:sub(1, -2)
|
|
sbar.exec("SwitchAudioSource -a -t output", function(available)
|
|
local current = current_audio_device
|
|
local color = colors.popup.item
|
|
local counter = 0
|
|
|
|
for device in string.gmatch(available, "[^\r\n]+") do
|
|
if current == device then
|
|
color = colors.popup.highlight
|
|
end
|
|
sbar.add("item", "volume.device." .. counter, {
|
|
position = "popup." .. volume_icon.name,
|
|
width = popup_width,
|
|
align = "center",
|
|
label = { string = device, color = color },
|
|
background = { drawing = false },
|
|
click_script = 'SwitchAudioSource -s "'
|
|
.. device
|
|
.. '" && sketchybar --set /volume.device\\.*/ label.color='
|
|
.. colors.popup.item
|
|
.. " --set $NAME label.color="
|
|
.. colors.popup.highlight,
|
|
})
|
|
counter = counter + 1
|
|
end
|
|
end)
|
|
end)
|
|
else
|
|
volume_collapse_details()
|
|
end
|
|
end
|
|
|
|
local function volume_scroll(env)
|
|
local delta = env.SCROLL_DELTA
|
|
sbar.exec('osascript -e "set volume output volume (output volume of (get volume settings) + ' .. delta .. ')"')
|
|
end
|
|
|
|
volume_icon:subscribe("mouse.clicked", function(env)
|
|
volume_toggle_details(env)
|
|
-- sbar.animate("tanh", 8, function()
|
|
-- volume_icon:set({
|
|
-- background = {
|
|
-- shadow = {
|
|
-- distance = 0,
|
|
-- },
|
|
-- },
|
|
-- y_offset = -4,
|
|
-- padding_left = 8,
|
|
-- padding_right = 0,
|
|
-- })
|
|
-- volume_icon:set({
|
|
-- background = {
|
|
-- shadow = {
|
|
-- distance = 4,
|
|
-- },
|
|
-- },
|
|
-- y_offset = 0,
|
|
-- padding_left = 4,
|
|
-- padding_right = 4,
|
|
-- })
|
|
-- end)
|
|
end)
|
|
|
|
volume_icon:subscribe("mouse.scrolled", volume_scroll)
|