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
|
2021-12-25 10:34:55 +01:00
|
|
|
self.position = args.position or "top_middle"
|
|
|
|
self.visual = args.visual or true
|
2021-12-14 08:58:43 +01:00
|
|
|
|
2021-12-25 10:34:55 +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)
|
2021-12-25 08:36:03 +01:00
|
|
|
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
|
|
|
|
|
2021-12-25 08:36:03 +01:00
|
|
|
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"
|
2021-12-25 08:36:03 +01:00
|
|
|
notification = naughty.notify({
|
2021-12-25 08:48:18 +01:00
|
|
|
icon = script_path() .. icon_path,
|
2021-12-25 08:36:03 +01:00
|
|
|
icon_size = 100,
|
2021-12-25 09:17:43 +01:00
|
|
|
margin = 0,
|
2021-12-25 10:34:55 +01:00
|
|
|
position = self.position,
|
2021-12-25 08:36:03 +01:00
|
|
|
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,})
|