summaryrefslogtreecommitdiff
path: root/dots/sketchybar/.config/sketchybar/items/spaces.lua.j2
diff options
context:
space:
mode:
Diffstat (limited to 'dots/sketchybar/.config/sketchybar/items/spaces.lua.j2')
-rw-r--r--dots/sketchybar/.config/sketchybar/items/spaces.lua.j299
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()