Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
marvel
GitHub Repository: marvel/qnf
Path: blob/master/awesome/eminent.lua
987 views
1
-- Grab environment
2
local ipairs = ipairs
3
local pairs = pairs
4
local awful = require("awful")
5
local naughty = require("naughty")
6
local table = table
7
local capi = {
8
tag = tag,
9
mouse = mouse,
10
client = client,
11
screen = screen,
12
wibox = wibox,
13
timer = timer,
14
keygrabber = keygrabber,
15
}
16
17
-- Eminent: Effortless wmii-style dynamic tagging
18
module("eminent")
19
20
-- Grab the original functions we're replacing
21
local deflayout = nil
22
local orig = {
23
new = awful.tag.new,
24
viewidx = awful.tag.viewidx,
25
26
taglist = awful.widget.taglist.new,
27
label = awful.widget.taglist.label.all,
28
}
29
30
-- Return tags with stuff on them, mark others hidden
31
function gettags(screen)
32
local tags = {}
33
34
for k, t in ipairs(capi.screen[screen]:tags()) do
35
if t.selected or #t:clients() > 0 then
36
awful.tag.setproperty(t, "hide", false)
37
table.insert(tags, t)
38
else
39
awful.tag.setproperty(t, "hide", true)
40
end
41
end
42
43
return tags
44
end
45
46
-- Pre-create tags
47
awful.tag.new = function (names, screen, layout)
48
deflayout = layout and layout[1] or layout
49
return orig.new(names, screen, layout)
50
end
51
52
-- View tag by relative index
53
awful.tag.viewidx = function (i, screen)
54
-- Hide tags
55
local s = screen and screen.index or capi.mouse.screen
56
local ctags = capi.screen[s]:tags()
57
local tags = gettags(s)
58
local sel = awful.tag.selected()
59
60
-- Check if we should "create" a new tag
61
local selidx = awful.util.table.hasitem(tags, sel)
62
local tagidx = awful.util.table.hasitem(ctags, sel)
63
64
-- Create a new tag if needed
65
if selidx == #tags and i == 1 and #sel:clients() > 0 then
66
-- Deselect all
67
awful.tag.viewnone(s)
68
69
if #ctags >= tagidx+1 then
70
-- Focus next
71
ctags[tagidx+1].selected = true
72
else
73
-- Create new
74
local tag = capi.tag { name = ""..(tagidx+1) }
75
tag.screen = s
76
tag.selected = true
77
awful.tag.setproperty(tag, "layout", deflayout)
78
end
79
else
80
-- Call original
81
orig.viewidx(i, screen)
82
end
83
end
84
85
-- Taglist label functions
86
awful.widget.taglist.label.all = function (t, args)
87
if t.selected or #t:clients() > 0 then
88
return orig.label(t, args)
89
end
90
end
91
92
93
-- Update hidden status
94
local function uc(c) gettags(c.screen) end
95
local function ut(s, t) gettags(s.index) end
96
97
capi.client.add_signal("unmanage", uc)
98
capi.client.add_signal("new", function(c)
99
c:add_signal("property::screen", uc)
100
c:add_signal("tagged", uc)
101
c:add_signal("untagged", uc)
102
end)
103
104
for screen=1, capi.screen.count() do
105
awful.tag.attached_add_signal(screen, "property::selected", uc)
106
capi.screen[screen]:add_signal("tag::attach", ut)
107
capi.screen[screen]:add_signal("tag::detach", ut)
108
end
109
110