diff options
Diffstat (limited to 'dots/sketchybar/.config/sketchybar/items/spaces.lua.j2')
-rw-r--r-- | dots/sketchybar/.config/sketchybar/items/spaces.lua.j2 | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/dots/sketchybar/.config/sketchybar/items/spaces.lua.j2 b/dots/sketchybar/.config/sketchybar/items/spaces.lua.j2 new file mode 100644 index 0000000..6d1d6a9 --- /dev/null +++ b/dots/sketchybar/.config/sketchybar/items/spaces.lua.j2 @@ -0,0 +1,99 @@ +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, +}) + +local spaceConfigs <const> = { +{% for name, ws in window_manager.workspaces.items() %} + ["{{ name }}"] = { icon = "{{ ws.icon }}", name = "{{ name }}" }, +{% endfor %} +} + +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.white }, + label = { color = isSelected and settings.colors.bg1 or settings.colors.white }, + background = { color = isSelected and settings.colors.white or settings.colors.bg1 }, + }) + 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() + {% for name, ws in window_manager.workspaces.items() | sort(attribute='1.order') %} + addWorkspaceItem("{{ name }}") + {% endfor %} + + findAndSelectCurrentWorkspace() +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() |