207 lines
4.8 KiB
Lua
207 lines
4.8 KiB
Lua
---------------------------------------------------------------------------
|
|
-- @author Julien Danjou <julien@danjou.info>
|
|
-- @copyright 2008 Julien Danjou
|
|
-- @release @AWESOME_VERSION@
|
|
---------------------------------------------------------------------------
|
|
|
|
-- Grab environment we need
|
|
local hooks = require("awful.hooks")
|
|
local util = require("awful.util")
|
|
local pairs = pairs
|
|
local ipairs = ipairs
|
|
local capi =
|
|
{
|
|
screen = screen,
|
|
mouse = mouse
|
|
}
|
|
|
|
--- Tag module for awful
|
|
module("awful.tag")
|
|
|
|
-- Private data
|
|
local data = {}
|
|
data.history = {}
|
|
data.history.past = {}
|
|
data.history.current = {}
|
|
|
|
-- History functions
|
|
history = {}
|
|
|
|
--- Compare 2 tables of tags.
|
|
-- @param a The first table.
|
|
-- @param b The second table of tags.
|
|
-- @return True if the tables are identical, false otherwise.
|
|
local function compare_select(a, b)
|
|
if not a or not b then
|
|
return false
|
|
end
|
|
-- Quick size comparison
|
|
if #a ~= #b then
|
|
return false
|
|
end
|
|
for ka, va in pairs(a) do
|
|
if b[ka] ~= va.selected then
|
|
return false
|
|
end
|
|
end
|
|
for kb, vb in pairs(b) do
|
|
if a[kb].selected ~= vb then
|
|
return false
|
|
end
|
|
end
|
|
return true
|
|
end
|
|
|
|
--- Update the tag history.
|
|
-- @param screen The screen number.
|
|
function history.update(screen)
|
|
local curtags = capi.screen[screen]:tags()
|
|
if not compare_select(curtags, data.history.current[screen]) then
|
|
data.history.past[screen] = data.history.current[screen]
|
|
data.history.current[screen] = {}
|
|
for k, v in ipairs(curtags) do
|
|
data.history.current[screen][k] = v.selected
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Revert tag history.
|
|
-- @param screen The screen number.
|
|
function history.restore(screen)
|
|
local s = screen or capi.mouse.screen
|
|
local tags = capi.screen[s]:tags()
|
|
for k, t in pairs(tags) do
|
|
t.selected = data.history.past[s][k]
|
|
end
|
|
end
|
|
|
|
--- Return a table with all visible tags
|
|
-- @param s Screen number.
|
|
-- @return A table with all selected tags.
|
|
function selectedlist(s)
|
|
local screen = s or capi.mouse.screen
|
|
local tags = capi.screen[screen]:tags()
|
|
local vtags = {}
|
|
for i, t in pairs(tags) do
|
|
if t.selected then
|
|
vtags[#vtags + 1] = t
|
|
end
|
|
end
|
|
return vtags
|
|
end
|
|
|
|
--- Return only the first visible tag.
|
|
-- @param s Screen number.
|
|
function selected(s)
|
|
return selectedlist(s)[1]
|
|
end
|
|
|
|
--- Set master width factor.
|
|
-- @param mwfact Master width factor.
|
|
function setmwfact(mwfact)
|
|
local t = selected()
|
|
if t then
|
|
t.mwfact = mwfact
|
|
end
|
|
end
|
|
|
|
--- Increase master width factor.
|
|
-- @param add Value to add to master width factor.
|
|
function incmwfact(add)
|
|
local t = selected()
|
|
if t then
|
|
t.mwfact = t.mwfact + add
|
|
end
|
|
end
|
|
|
|
--- Set the number of master windows.
|
|
-- @param nmaster The number of master windows.
|
|
function setnmaster(nmaster)
|
|
local t = selected()
|
|
if t then
|
|
t.nmaster = nmaster
|
|
end
|
|
end
|
|
|
|
--- Increase the number of master windows.
|
|
-- @param add Value to add to number of master windows.
|
|
function incnmaster(add)
|
|
local t = selected()
|
|
if t then
|
|
t.nmaster = t.nmaster + add
|
|
end
|
|
end
|
|
|
|
--- Set number of column windows.
|
|
-- @param ncol The number of column.
|
|
function setncol(ncol)
|
|
local t = selected()
|
|
if t then
|
|
t.ncol = ncol
|
|
end
|
|
end
|
|
|
|
--- Increase number of column windows.
|
|
-- @param add Value to add to number of column windows.
|
|
function incncol(add)
|
|
local t = selected()
|
|
if t then
|
|
t.ncol = t.ncol + add
|
|
end
|
|
end
|
|
|
|
--- View no tag.
|
|
-- @param Optional screen number.
|
|
function viewnone(screen)
|
|
local tags = capi.screen[screen or capi.mouse.screen]:tags()
|
|
for i, t in pairs(tags) do
|
|
t.selected = false
|
|
end
|
|
end
|
|
|
|
--- View a tag by its index.
|
|
-- @param i The relative index to see.
|
|
-- @param screen Optional screen number.
|
|
function viewidx(i, screen)
|
|
local tags = capi.screen[screen or capi.mouse.screen]:tags()
|
|
local sel = selected()
|
|
viewnone()
|
|
for k, t in ipairs(tags) do
|
|
if t == sel then
|
|
tags[util.cycle(#tags, k + i)].selected = true
|
|
end
|
|
end
|
|
end
|
|
|
|
--- View next tag. This is the same as tag.viewidx(1).
|
|
function viewnext()
|
|
return viewidx(1)
|
|
end
|
|
|
|
--- View previous tag. This is the same a tag.viewidx(-1).
|
|
function viewprev()
|
|
return viewidx(-1)
|
|
end
|
|
|
|
--- View only a tag.
|
|
-- @param t The tag object.
|
|
function viewonly(t)
|
|
viewnone(t.screen)
|
|
t.selected = true
|
|
end
|
|
|
|
--- View only a set of tags.
|
|
-- @param tags A table with tags to view only.
|
|
-- @param screen Optional screen number of the tags.
|
|
function viewmore(tags, screen)
|
|
viewnone(screen)
|
|
for i, t in pairs(tags) do
|
|
t.selected = true
|
|
end
|
|
end
|
|
|
|
-- Register standards hooks
|
|
hooks.arrange.register(history.update)
|
|
|
|
-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80
|