Files
mac-dots/sketchybar/items/spaces.lua
xenomxrph 8d16baf6f1 initalize
2025-07-16 15:00:51 +02:00

109 lines
3.3 KiB
Lua

local constants = require("constants")
local settings = require("config.settings")
local spaces = {}
local swapWatcher = sbar.add("item", {
drawing = false,
updates = true,
})
local currentWorkspaceWatcher = sbar.add("item", {
drawing = false,
updates = true,
})
-- Modify this file with Visual Studio Code - at least vim does have problems with the icons
-- copy "Icons" from the nerd fonts cheat sheet and replace icon and name accordingly below
-- https://www.nerdfonts.com/cheat-sheet
local spaceConfigs <const> = {
["1"] = { icon = "", name = "Main" },
["2"] = { icon = "", name = "Terminal" },
["3"] = { icon = "", name = "Code" },
["4"] = { icon = "󰘳", name = "Notes" },
["5"] = { icon = "", name = "Security" },
["D"] = { icon = "", name = "Discord" },
["S"] = { icon = "", name = "Music"},
}
local function selectCurrentWorkspace(focusedWorkspaceName)
for sid, item in pairs(spaces) do
if item ~= nil then
local isSelected = sid == constants.items.SPACES .. "." .. focusedWorkspaceName
item:set({
icon = { color = isSelected and settings.colors.bg1 or settings.colors.bg1 },
label = { color = isSelected and settings.colors.bg1 or settings.colors.bg1 },
background = { color = isSelected and settings.colors.magenta or settings.colors.purple },
})
end
end
sbar.trigger(constants.events.UPDATE_WINDOWS)
end
local function findAndSelectCurrentWorkspace()
sbar.exec(constants.aerospace.GET_CURRENT_WORKSPACE, function(focusedWorkspaceOutput)
local focusedWorkspaceName = focusedWorkspaceOutput:match("[^\r\n]+")
selectCurrentWorkspace(focusedWorkspaceName)
end)
end
local function addWorkspaceItem(workspaceName)
local spaceName = constants.items.SPACES .. "." .. workspaceName
local spaceConfig = spaceConfigs[workspaceName]
spaces[spaceName] = sbar.add("item", spaceName, {
label = {
width = 0,
padding_left = 0,
string = spaceConfig.name,
},
icon = {
string = spaceConfig.icon or settings.icons.apps["default"],
color = settings.colors.white,
},
background = {
color = settings.colors.bg1,
},
click_script = "aerospace workspace " .. workspaceName,
})
spaces[spaceName]:subscribe("mouse.entered", function(env)
sbar.animate("tanh", 30, function()
spaces[spaceName]:set({ label = { width = "dynamic" } })
end)
end)
spaces[spaceName]:subscribe("mouse.exited", function(env)
sbar.animate("tanh", 30, function()
spaces[spaceName]:set({ label = { width = 0 } })
end)
end)
sbar.add("item", spaceName .. ".padding", {
width = settings.dimens.padding.label
})
end
local function createWorkspaces()
sbar.exec(constants.aerospace.LIST_ALL_WORKSPACES, function(workspacesOutput)
for workspaceName in workspacesOutput:gmatch("[^\r\n]+") do
addWorkspaceItem(workspaceName)
end
findAndSelectCurrentWorkspace()
end)
end
swapWatcher:subscribe(constants.events.SWAP_MENU_AND_SPACES, function(env)
local isShowingSpaces = env.isShowingMenu == "off" and true or false
sbar.set("/" .. constants.items.SPACES .. "\\..*/", { drawing = isShowingSpaces })
end)
currentWorkspaceWatcher:subscribe(constants.events.AEROSPACE_WORKSPACE_CHANGED, function(env)
selectCurrentWorkspace(env.FOCUSED_WORKSPACE)
sbar.trigger(constants.events.UPDATE_WINDOWS)
end)
createWorkspaces()