awesome-workspace-grid/awesome-workspace-grid.lua

97 lines
2.7 KiB
Lua
Raw Normal View History

2021-12-14 07:13:48 +01:00
local awful = require("awful")
2021-12-14 08:58:43 +01:00
local naughty = require("naughty")
2021-12-14 09:35:50 +01:00
function script_path()
local str = debug.getinfo(2, "S").source:sub(2)
return str:match("(.*/)")
end
2021-12-14 07:13:48 +01:00
local workspace_grid = {}
function workspace_grid:new(args)
2021-12-14 09:11:20 +01:00
return setmetatable({}, {__index = self}):init(args)
2021-12-14 07:13:48 +01:00
end
function workspace_grid:init(args)
2021-12-14 09:18:08 +01:00
self.rows = args.rows or 2
self.columns = args.columns or 3
self.position = args.position or "top_middle"
self.visual = args.visual or true
2021-12-14 08:58:43 +01:00
if self.visual then
2021-12-14 08:58:43 +01:00
awful.screen.connect_for_each_screen(function(s)
s.workspace_notification_id = nil
end)
tag.connect_signal("property::selected", function(t)
self:on_tag_selected(t)
end)
2021-12-14 08:58:43 +01:00
end
return self
2021-12-14 07:13:48 +01:00
end
function workspace_grid:navigate(direction)
2021-12-14 09:11:20 +01:00
local t = awful.screen.focused().selected_tag
local i = t.index - 1
local c = self.columns
local r = self.rows
2021-12-14 07:13:48 +01:00
2021-12-14 09:11:20 +01:00
-- Don't cycle.
-- TODO: Add option for cycling.
-- Top row
if (i < c) and (direction == "up") then return true end
-- Left column
if (i % c == 0) and (direction == "left") then return true end
-- Right column
if ((i + 1) % c == 0) and (direction == "right") then return true end
-- Bottom row
if (i >= (r - 1) * c) and (direction == "down") then return true end
2021-12-14 07:13:48 +01:00
2021-12-14 09:11:20 +01:00
action = {
["down"] = (i + c) % (r * c) + 1,
["up"] = (i - c) % (r * c) + 1,
["left"] = (math.ceil((i + 1) / c) - 1) * c + ((i - 1) % c) + 1,
["right"] = (math.ceil((i + 1) / c) - 1) * c + ((i + 1) % c) + 1,
}
local j = action[direction]
2021-12-14 07:13:48 +01:00
2021-12-14 09:11:20 +01:00
-- Switch tags on all screens at the same time.
-- TODO: Add option to switch per-screen.
for s in screen do
t = s.tags[j]
if t then t:view_only() end
end
2021-12-14 07:13:48 +01:00
end
function workspace_grid:on_tag_selected(t)
if t.screen == nil then
return
end
-- Only need to do anything on the focused screen.
if t.screen.index ~= awful.screen.focused().index then
return
end
if t.selected == false then
-- This is the tag we are leaving
return
end
for i = 1, screen.count() do
s = screen[i]
2021-12-25 08:48:18 +01:00
icon_path = "icons/workspace_" .. self.rows .. "x" .. self.columns .. "_" .. t.index .. ".svg"
notification = naughty.notify({
2021-12-25 08:48:18 +01:00
icon = script_path() .. icon_path,
icon_size = 100,
2021-12-25 09:17:43 +01:00
margin = 0,
position = self.position,
preset = naughty.config.presets.normal,
replaces_id = s.workspace_notification_id,
screen = i,
text = nil,
timeout = 1,
})
s.workspace_notification_id = notification.id
end
end
2021-12-14 09:11:20 +01:00
return setmetatable(workspace_grid, { __call = workspace_grid.new,})