diff options
Diffstat (limited to '.config/sketchybar/items/spaces.lua')
| -rw-r--r-- | .config/sketchybar/items/spaces.lua | 135 |
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() |
