mirror of
https://codeberg.org/tmayoff/.dotfiles.git
synced 2025-12-06 16:58:34 -05:00
152 lines
4.2 KiB
Lua
152 lines
4.2 KiB
Lua
local colors = require("colors")
|
|
local icons = require("icons")
|
|
local settings = require("settings")
|
|
|
|
local popup_width = 250
|
|
|
|
local volume_percent = sbar.add("item", "widgets.volume1", {
|
|
position = "right",
|
|
icon = { drawing = false },
|
|
label = {
|
|
string = "??%",
|
|
padding_left = -1,
|
|
font = { family = settings.font.numbers }
|
|
},
|
|
})
|
|
|
|
local volume_icon = sbar.add("item", "widgets.volume2", {
|
|
position = "right",
|
|
padding_right = -1,
|
|
icon = {
|
|
string = icons.volume._100,
|
|
width = 0,
|
|
align = "left",
|
|
color = colors.grey,
|
|
font = {
|
|
style = settings.font.style_map["Regular"],
|
|
size = 14.0,
|
|
},
|
|
},
|
|
label = {
|
|
width = 25,
|
|
align = "left",
|
|
font = {
|
|
style = settings.font.style_map["Regular"],
|
|
size = 14.0,
|
|
},
|
|
},
|
|
})
|
|
|
|
local volume_bracket = sbar.add("bracket", "widgets.volume.bracket", {
|
|
volume_icon.name,
|
|
volume_percent.name
|
|
}, {
|
|
background = { color = colors.bg1 },
|
|
popup = { align = "center" }
|
|
})
|
|
|
|
sbar.add("item", "widgets.volume.padding", {
|
|
position = "right",
|
|
width = settings.group_paddings
|
|
})
|
|
|
|
local volume_slider = sbar.add("slider", popup_width, {
|
|
position = "popup." .. volume_bracket.name,
|
|
slider = {
|
|
highlight_color = colors.blue,
|
|
background = {
|
|
height = 6,
|
|
corner_radius = 3,
|
|
color = colors.bg2,
|
|
},
|
|
knob= {
|
|
string = "",
|
|
drawing = true,
|
|
},
|
|
},
|
|
background = { color = colors.bg1, height = 2, y_offset = -20 },
|
|
click_script = 'osascript -e "set volume output volume $PERCENTAGE"'
|
|
})
|
|
|
|
volume_percent:subscribe("volume_change", function(env)
|
|
local volume = tonumber(env.INFO)
|
|
local icon = icons.volume._0
|
|
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
|
|
|
|
local lead = ""
|
|
if volume < 10 then
|
|
lead = "0"
|
|
end
|
|
|
|
volume_icon:set({ label = icon })
|
|
volume_percent:set({ label = lead .. volume .. "%" })
|
|
volume_slider:set({ slider = { percentage = volume } })
|
|
end)
|
|
|
|
local function volume_collapse_details()
|
|
local drawing = volume_bracket:query().popup.drawing == "on"
|
|
if not drawing then return end
|
|
volume_bracket: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_bracket:query().popup.drawing == "off"
|
|
if should_draw then
|
|
volume_bracket: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)
|
|
current = current_audio_device
|
|
local color = colors.grey
|
|
local counter = 0
|
|
|
|
for device in string.gmatch(available, '[^\r\n]+') do
|
|
local color = colors.grey
|
|
if current == device then
|
|
color = colors.white
|
|
end
|
|
sbar.add("item", "volume.device." .. counter, {
|
|
position = "popup." .. volume_bracket.name,
|
|
width = popup_width,
|
|
align = "center",
|
|
label = { string = device, color = color },
|
|
click_script = 'SwitchAudioSource -s "' .. device .. '" && sketchybar --set /volume.device\\.*/ label.color=' .. colors.grey .. ' --set $NAME label.color=' .. colors.white
|
|
|
|
})
|
|
counter = counter + 1
|
|
end
|
|
end)
|
|
end)
|
|
else
|
|
volume_collapse_details()
|
|
end
|
|
end
|
|
|
|
local function volume_scroll(env)
|
|
local delta = env.INFO.delta
|
|
if not (env.INFO.modifier == "ctrl") then delta = delta * 10.0 end
|
|
|
|
sbar.exec('osascript -e "set volume output volume (output volume of (get volume settings) + ' .. delta .. ')"')
|
|
end
|
|
|
|
volume_icon:subscribe("mouse.clicked", volume_toggle_details)
|
|
volume_icon:subscribe("mouse.scrolled", volume_scroll)
|
|
volume_percent:subscribe("mouse.clicked", volume_toggle_details)
|
|
volume_percent:subscribe("mouse.exited.global", volume_collapse_details)
|
|
volume_percent:subscribe("mouse.scrolled", volume_scroll)
|
|
|