awesomewm/desktop/tagger/tagger.lua

159 lines
3.0 KiB
Lua
Executable File

-- Tag grid manager
local Tagger = {
screen = nil, rows = 2, cols = 4
}
local Widget = require("desktop.tagger.widget")
Tagger.__index = Tagger
function Tagger:new(args)
local t = {
screen = args.screen,
layoutmanager = args.layoutmanager,
rows = args.rows or 2,
cols = args.cols or 4,
}
setmetatable(t, self)
-- Create tags on this Tagger's screen
for r=1, t.rows do
for c=1, t.cols do
awful.tag.add(
"(" .. tostring(r) .. ", " .. tostring(c) .. ")",
{
layout = t.layoutmanager:get_default_layout(),
screen = t.screen,
gap_single_client = false,
gap = beautiful.useless_gap,
volatile = false,
-- Only select the first tag
selected = ((r == 1) and (c == 1))
}
)
end
end
t._widget = Widget:new(t)
t.widget = t._widget.widget
return t
end
function Tagger:get_tag()
return self.screen.selected_tag.index
end
-- Return current column
function Tagger:get_col()
return (
(self:get_tag() - 1) % self.cols
) + 1
end
-- Return current row
function Tagger:get_row()
return math.floor(
(
self:get_tag() - self:get_col()
) / self.cols
) + 1
end
-- Select a tag by position
function Tagger:setpos(row, col)
local target_absolute = (self.cols * (row - 1)) + col
local target_relative = target_absolute - self.screen.selected_tag.index
awful.tag.viewidx(target_relative)
self:update_widget()
end
-- Update this tagger's screen's tagindicator
function Tagger:update_widget()
local clients
local tgs = self.screen.tags
for i=1, #tgs do
clients = tgs[i]:clients()
-- Each tag indicator is a "checkbox" widget.
-- Make that the currently active tag is checked and that all
-- others are not.
if (tgs[i].index == self.screen.selected_tag.index) then
self._widget.tagindicators[i].checked = true
else
self._widget.tagindicators[i].checked = false
end
-- Highlight tags that are not empty
if (#clients == 0) then
self._widget.tagindicators[i].border_color = beautiful.color.bar.inactive
else
self._widget.tagindicators[i].border_color = beautiful.color.bar.active
end
end
end
-- Navigation
function Tagger:up()
local row = self:get_row() - 1
local col = self:get_col()
if (row >= 1) then
self:setpos(row, col)
end
end
function Tagger:down()
local row = self:get_row() + 1
local col = self:get_col()
if (row <= self.rows) then
self:setpos(row, col)
end
end
function Tagger:right()
local row = self:get_row()
local col = self:get_col() + 1
if (col <= self.cols) then
self:setpos(row, col)
end
end
function Tagger:left()
local row = self:get_row()
local col = self:get_col() - 1
if (col >= 1) then
self:setpos(row, col)
end
end
-- Moving clients
function Tagger:move_client(client, direction)
if direction == "up" then
self:up()
elseif direction == "down" then
self:down()
elseif direction == "left" then
self:left()
elseif direction == "right" then
self:right()
end
if client.first_tag.layout == awful.layout.suit.floating then
client.floating = true
end
client:move_to_tag(self.screen.selected_tag)
self:update_widget()
end
return Tagger