127 lines
4 KiB
Lua
127 lines
4 KiB
Lua
local constants = require 'constants'
|
|
local settings = require 'config.settings'
|
|
|
|
local currentAudioDevice = 'None'
|
|
|
|
local volumeValue = sbar.add('item', constants.items.VOLUME .. '.value', {
|
|
position = 'right',
|
|
label = {
|
|
string = '??%',
|
|
padding_left = 0,
|
|
},
|
|
})
|
|
|
|
local volumeBracket = sbar.add('bracket', constants.items.VOLUME .. '.bracket', { volumeValue.name }, {
|
|
popup = {
|
|
align = 'center',
|
|
},
|
|
})
|
|
|
|
local volumeSlider = sbar.add('slider', constants.items.VOLUME .. '.slider', settings.dimens.graphics.popup.width, {
|
|
position = 'popup.' .. volumeBracket.name,
|
|
click_script = 'osascript -e "set volume output volume $PERCENTAGE"',
|
|
})
|
|
|
|
volumeValue:subscribe('volume_change', function(env)
|
|
local icon = settings.icons.text.volume._0
|
|
local volume = tonumber(env.INFO)
|
|
|
|
sbar.exec('SwitchAudioSource -t output -c', function(result)
|
|
-- local currentOutputDevice = result:sub(1, -2)
|
|
-- if currentOutputDevice == "AirPods Max" then
|
|
-- icon = ""
|
|
-- elseif currentOutputDevice == "AirPods von Longdong Silver" or currentOutputDevice == "AirPods von Anna" then
|
|
-- icon = ""
|
|
-- elseif currentOutputDevice == "Arctis Nova Pro Wireless" then
|
|
-- icon = ""
|
|
-- elseif currentOutputDevice == "Ear (2)" then
|
|
-- icon = ""
|
|
-- elseif currentOutputDevice == "iD4" then
|
|
-- icon = ""
|
|
-- else
|
|
if volume > 60 then
|
|
icon = settings.icons.text.volume._100
|
|
elseif volume > 30 then
|
|
icon = settings.icons.text.volume._66
|
|
elseif volume > 10 then
|
|
icon = settings.icons.text.volume._33
|
|
elseif volume > 0 then
|
|
icon = settings.icons.text.volume._10
|
|
end
|
|
-- end
|
|
|
|
local lead = ''
|
|
if volume < 10 then lead = '0' end
|
|
|
|
-- volumeIcon:set({ label = icon })
|
|
volumeSlider:set { slider = { percentage = volume } }
|
|
|
|
local hasVolume = volume ~= 0
|
|
volumeValue:set {
|
|
icon = icon,
|
|
label = {
|
|
string = hasVolume and lead .. volume .. '%' or '',
|
|
padding_right = hasVolume and 8 or 0,
|
|
},
|
|
}
|
|
end)
|
|
end)
|
|
|
|
local function hideVolumeDetails()
|
|
local drawing = volumeBracket:query().popup.drawing == 'on'
|
|
if not drawing then return end
|
|
volumeBracket:set { popup = { drawing = false } }
|
|
sbar.remove('/' .. constants.items.VOLUME .. '.device\\.*/')
|
|
end
|
|
|
|
local function toggleVolumeDetails(env)
|
|
if env.BUTTON == 'right' then
|
|
sbar.exec 'open /System/Library/PreferencePanes/Sound.prefpane'
|
|
return
|
|
end
|
|
|
|
local shouldDraw = volumeBracket:query().popup.drawing == 'off'
|
|
if shouldDraw then
|
|
volumeBracket:set { popup = { drawing = true } }
|
|
|
|
sbar.exec('SwitchAudioSource -t output -c', function(result)
|
|
currentAudioDevice = result:sub(1, -2)
|
|
|
|
sbar.exec('SwitchAudioSource -a -t output', function(available)
|
|
local current = currentAudioDevice
|
|
local counter = 0
|
|
|
|
for device in string.gmatch(available, '[^\r\n]+') do
|
|
local color = settings.colors.grey
|
|
if current == device then color = settings.colors.white end
|
|
|
|
sbar.add('item', constants.items.VOLUME .. '.device.' .. counter, {
|
|
position = 'popup.' .. volumeBracket.name,
|
|
align = 'center',
|
|
label = { string = device, color = color },
|
|
click_script = 'SwitchAudioSource -s "'
|
|
.. device
|
|
.. '" && sketchybar --set /'
|
|
.. constants.items.VOLUME
|
|
.. '.device\\.*/ label.color='
|
|
.. settings.colors.grey
|
|
.. ' --set $NAME label.color='
|
|
.. settings.colors.white,
|
|
})
|
|
counter = counter + 1
|
|
end
|
|
end)
|
|
end)
|
|
else
|
|
hideVolumeDetails()
|
|
end
|
|
end
|
|
|
|
local function changeVolume(env)
|
|
local delta = env.SCROLL_DELTA
|
|
sbar.exec('osascript -e "set volume output volume (output volume of (get volume settings) + ' .. delta .. ')"')
|
|
end
|
|
|
|
volumeValue:subscribe('mouse.clicked', toggleVolumeDetails)
|
|
volumeValue:subscribe('mouse.scrolled', changeVolume)
|
|
-- volumeValue:subscribe("mouse.exited.global", hideVolumeDetails)
|