nix/config/sketchybar/items/yabai.lua

190 lines
5 KiB
Lua

local colors = require 'colors'
-- local icons = require("icons")
local settings = require 'settings'
local app_icons = require 'app_icons'
local spaces = {}
local space_has_windows = {}
local yabai_cmd = '/etc/profiles/per-user/rayandrew/bin/yabai'
for i = 1, 10, 1 do
local space = sbar.add('space', 'space.' .. i, {
space = i,
icon = {
font = { family = settings.font.numbers },
string = i,
padding_left = 15,
padding_right = 8,
color = colors.white,
highlight_color = colors.red,
},
label = {
padding_right = 20,
color = colors.grey,
highlight_color = colors.white,
font = 'sketchybar-app-font:Regular:16.0',
y_offset = -1,
},
padding_right = 1,
padding_left = 1,
background = {
color = colors.bg1,
-- border_width = 1,
height = 26,
-- border_color = colors.black,
},
popup = { background = { border_width = 5, border_color = colors.black } },
})
spaces[i] = space
-- Single item bracket for space items to achieve double border on highlight
local space_bracket = sbar.add('bracket', { space.name }, {
background = {
color = colors.transparent,
-- border_color = colors.bg2,
height = 28,
border_width = 2,
},
})
-- Padding space
sbar.add('space', 'space.padding.' .. i, {
space = i,
script = '',
width = settings.group_paddings,
})
local space_popup = sbar.add('item', 'space.popup.' .. i, {
position = 'popup.space.' .. i,
padding_left = 5,
padding_right = 0,
background = {
drawing = true,
image = {
corner_radius = 9,
scale = 0.2,
},
},
})
space:subscribe('space_change', function(env)
local selected = env.SELECTED == 'true'
local color = selected and colors.grey or colors.bg2
local has_windows = space_has_windows[i] or false
space:set {
icon = { highlight = selected },
label = { highlight = selected },
background = { border_color = selected and colors.black },
drawing = selected or has_windows,
}
space_bracket:set {
background = { border_color = selected and colors.grey },
}
end)
space:subscribe('mouse.clicked', function(env)
if env.BUTTON == 'other' then
space_popup:set { background = { image = 'space.' .. env.SID } }
space:set { popup = { drawing = 'toggle' } }
else
local op = (env.BUTTON == 'right') and '--destroy' or '--focus'
sbar.exec(yabai_cmd .. ' -m space ' .. op .. ' ' .. env.SID)
end
end)
space:subscribe('mouse.exited', function(_) space:set { popup = { drawing = false } } end)
end
local space_window_observer = sbar.add('item', {
drawing = false,
updates = true,
})
-- local spaces_indicator = sbar.add("item", {
-- padding_left = -3,
-- padding_right = 0,
-- icon = {
-- padding_left = 8,
-- padding_right = 9,
-- color = colors.grey,
-- string = icons.switch.on,
-- },
-- label = {
-- width = 0,
-- padding_left = 0,
-- padding_right = 8,
-- string = "Spaces",
-- color = colors.bg1,
-- },
-- background = {
-- color = colors.with_alpha(colors.grey, 0.0),
-- border_color = colors.with_alpha(colors.bg1, 0.0),
-- }
-- })
space_window_observer:subscribe('space_windows_change', function(env)
local icon_line = ''
local no_app = true
for app, count in pairs(env.INFO.apps) do
no_app = false
local lookup = app_icons[app]
local icon = ((lookup == nil) and app_icons['Default'] or lookup)
icon_line = icon_line .. icon
end
if no_app then icon_line = '' end
-- Track window state
space_has_windows[env.INFO.space] = not no_app
-- Query if this space is currently selected
local space_info = spaces[env.INFO.space]:query()
local is_selected = space_info and space_info.icon and space_info.icon.highlight or false
sbar.animate('tanh', 10, function()
spaces[env.INFO.space]:set {
label = icon_line,
drawing = is_selected or not no_app,
}
end)
end)
-- spaces_indicator:subscribe("swap_menus_and_spaces", function(env)
-- local currently_on = spaces_indicator:query().icon.value == icons.switch.on
-- spaces_indicator:set({
-- icon = currently_on and icons.switch.off or icons.switch.on
-- })
-- end)
--
-- spaces_indicator:subscribe("mouse.entered", function(env)
-- sbar.animate("tanh", 30, function()
-- spaces_indicator:set({
-- background = {
-- color = { alpha = 1.0 },
-- border_color = { alpha = 1.0 },
-- },
-- icon = { color = colors.bg1 },
-- label = { width = "dynamic" }
-- })
-- end)
-- end)
--
-- spaces_indicator:subscribe("mouse.exited", function(env)
-- sbar.animate("tanh", 30, function()
-- spaces_indicator:set({
-- background = {
-- color = { alpha = 0.0 },
-- border_color = { alpha = 0.0 },
-- },
-- icon = { color = colors.grey },
-- label = { width = 0, }
-- })
-- end)
-- end)
--
-- spaces_indicator:subscribe("mouse.clicked", function(env)
-- sbar.trigger("swap_menus_and_spaces")
-- end)