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)