157 lines
3.0 KiB
Lua
Executable File
157 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,
|
|
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 = layoutmanager: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)
|
|
|
|
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
|