summaryrefslogtreecommitdiff
path: root/.config/sketchybar/items/spaces.lua
diff options
context:
space:
mode:
Diffstat (limited to '.config/sketchybar/items/spaces.lua')
-rw-r--r--.config/sketchybar/items/spaces.lua135
1 files changed, 115 insertions, 20 deletions
diff --git a/.config/sketchybar/items/spaces.lua b/.config/sketchybar/items/spaces.lua
index 7595df5..28b1ebb 100644
--- a/.config/sketchybar/items/spaces.lua
+++ b/.config/sketchybar/items/spaces.lua
@@ -1,3 +1,4 @@
+-- TODO: Highlighting is kinda fixed, multiple windows in one space label is broken, last two things, but annoying
local constants = require("constants")
local settings = require("config.settings")
@@ -13,16 +14,6 @@ local currentWorkspaceWatcher = sbar.add("item", {
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 = "iTerm2" },
- ["2"] = { icon = "󰖟", name = "Firefox" },
- ["3"] = { icon = "󱞁", name = "Notes" },
- ["4"] = { icon = "󰌾", name = "Secrets" },
-}
-
local function selectCurrentWorkspace(focusedWorkspaceName)
for sid, item in pairs(spaces) do
if item ~= nil then
@@ -35,7 +26,7 @@ local function selectCurrentWorkspace(focusedWorkspaceName)
end
end
- sbar.trigger(constants.events.UPDATE_WINDOWS)
+ -- sbar.trigger(constants.events.UPDATE_WINDOWS)
end
local function findAndSelectCurrentWorkspace()
@@ -47,16 +38,16 @@ 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,
+ string = "Empty",
},
icon = {
- string = spaceConfig.icon or settings.icons.apps["default"],
+ string = workspaceName,
+ font = settings.fonts.icons(),
color = settings.colors.white,
},
background = {
@@ -82,24 +73,128 @@ local function addWorkspaceItem(workspaceName)
})
end
-local function createWorkspaces()
+local function updateWorkspaceItem(workspaceWindows, spacePos)
+ local space = constants.items.SPACES .. "." .. spacePos
+ -- spaces[space] = nil
+ -- sbar.remove("/" .. constants.items.SPACES .. "\\." .. spacePos .. "/")
+ local foundWindows = {}
+ if workspaceWindows then
+ foundWindows = workspaceWindows:gmatch("[^\n]+")
+ end
+
+ local windowsInSpace = {}
+ local firstIcon = nil
+ local firstWinID = nil
+ local cnt = 0
+ if foundWindows ~= nil and foundWindows ~= "" then
+ for window in foundWindows do
+ cnt = cnt + 1
+ local parsedWindow = {}
+ for key, value in string.gmatch(window, "(%w+)=([%w%s]+)") do
+ parsedWindow[key] = value
+ end
+
+ local windowName = parsedWindow["name"]
+ local icon = settings.icons.apps[windowName] or settings.icons.apps["default"]
+ table.insert(windowsInSpace, windowName)
+
+ if cnt == 1 then
+ firstIcon = icon
+ firstWinID = parsedWindow["id"]
+ end
+ end
+ elseif foundWindows == "" then
+ print("!!! no windows in " .. space .. "moving along !!!")
+ else
+ print("nothing works anymore... and your gonna carry that weight")
+ end
+
+ spaces[space]:set("item", space, {
+ label = {
+ width = 0,
+ padding_left = 0,
+ string = table.concat(windowsInSpace, " ") or "Empty",
+ },
+ icon = {
+ string = firstIcon or settings.icons.apps["default"],
+ font = settings.fonts.icons(),
+ color = settings.colors.white,
+ },
+ background = {
+ color = settings.colors.bg1,
+ },
+ click_script = "aerospace focus --window-id " .. tostring(firstWinID),
+ })
+
+ spaces[space]:subscribe("mouse.entered", function(env)
+ sbar.animate("tanh", 30, function()
+ spaces[space]:set({ label = { width = "dynamic" } })
+ end)
+ end)
+
+ spaces[space]:subscribe("mouse.exited", function(env)
+ sbar.animate("tanh", 30, function()
+ spaces[space]:set({ label = { width = 0 } })
+ end)
+ end)
+
+ sbar.add("item", space .. ".padding", {
+ width = settings.dimensions.paddings.label,
+ })
+end
+
+local function triggerWorkspaceUpdates(focusedWorkSpace)
sbar.exec(constants.aerospace.LIST_ALL_WORKSPACES, function(workspacesOutput)
- for workspaceName in workspacesOutput:gmatch("[^\r\n]+") do
- addWorkspaceItem(workspaceName)
+ -- sbar.remove("/" .. constants.items.FRONT_APPS .. "\\.*/")
+ -- sbar.remove("/" .. constants.items.SPACES .. "\\.*/")
+ workspacesOutput = workspacesOutput:gmatch("[^\r\n]+")
+
+ for wpName in workspacesOutput do
+ addWorkspaceItem(wpName)
+ end
+
+ -- so sbar.exec() doesn't trigger the function if output is nothing from cmd; lazy workaround
+ for i = 1, 5, 1 do
+ sbar.exec(
+ "aerospace list-windows --workspace " .. i .. ' --format "id=%{window-id}, name=%{app-name}"',
+ function(workspaceWindows)
+ updateWorkspaceItem(workspaceWindows, i)
+ end
+ )
+ end
+
+ if focusedWorkSpace then
+ selectCurrentWorkspace(focusedWorkSpace)
end
+ end)
+end
- findAndSelectCurrentWorkspace()
+local function createWorkspaces()
+ sbar.exec(constants.aerospace.LIST_ALL_WORKSPACES, function(workspacesOutput)
+ sbar.exec('aerospace list-windows --all --format "id=%{window-id}, name=%{app-name}"', function(anyWindows)
+ triggerWorkspaceUpdates()
+ end)
+ -- if ~tableContains(sbar.query("items"), "workspaces.1") then
+ -- print()
+ -- for workspaceName in workspacesOutput:gmatch("[^\r\n]+") do
+ -- print("addWorkspaceItem(workspaceName)")
+ -- addWorkspaceItem(workspaceName)
+ -- end
+ -- end
end)
+ findAndSelectCurrentWorkspace()
end
+-- that button on the left side
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)
+-- highlighting
currentWorkspaceWatcher:subscribe(constants.events.AEROSPACE_WORKSPACE_CHANGED, function(env)
- selectCurrentWorkspace(env.FOCUSED_WORKSPACE)
- sbar.trigger(constants.events.UPDATE_WINDOWS)
+ triggerWorkspaceUpdates(env.FOCUSED_WORKSPACE)
end)
+-- entry point
createWorkspaces()