-
Notifications
You must be signed in to change notification settings - Fork 44
/
init.lua
168 lines (150 loc) · 5.06 KB
/
init.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
-- revelation.lua
--
-- Library that implements Expose like behavior.
--
-- @author Perry Hargrave [email protected]
-- @author Espen Wiborg [email protected]
-- @author Julien Danjou [email protected]
--
-- @copyright 2008 Espen Wiborg, Julien Danjou
--
local awful = require('awful')
local aw_rules = require('awful.rules')
local pairs = pairs
local setmetatable = setmetatable
local table = table
local capi = {
tag = tag,
client = client,
keygrabber = keygrabber,
mousegrabber = mousegrabber,
mouse = mouse,
screen = screen
}
local clientData = {} -- table that holds the positions and sizes of floating clients
module("revelation")
config = {
-- Name of expose tag.
tag_name = "Revelation",
-- Match function can be defined by user.
-- Must accept a `rule` and `client` and return `boolean`.
-- The rule forms follow `awful.rules` syntax except we also check the
-- special `rule.any` key. If its true, then we use the `match.any` function
-- for comparison.
match = {
exact = aw_rules.match,
any = aw_rules.match_any
},
}
-- Executed when user selects a client from expose view.
--
-- @param restore Function to reset the current tags view.
function selectfn(restore)
return function(c)
restore()
-- Pop to client tag
awful.tag.viewonly(c:tags()[1], c.screen)
-- Focus and raise
capi.client.focus = c
c:raise()
end
end
-- Tags all matching clients with tag t
-- @param rule The rule. Conforms to awful.rules syntax.
-- @param clients A table of clients to check.
-- @param t The tag to give matching clients.
function match_clients(rule, clients, t)
local mf = rule.any and config.match.any or config.match.exact
for _, c in pairs(clients) do
if mf(c, rule) then
-- Store geometry before setting their tags
if awful.client.floating.get(c) then
clientData[c] = c:geometry()
awful.client.floating.set(c, false)
end
awful.client.toggletag(t, c)
c.minimized = false
end
end
return clients
end
-- Arrow keys and 'hjkl' move focus, Return selects, Escape cancels. Ignores
-- modifiers.
--
-- @param restore a function to call if the user presses escape
-- @return keyboardhandler
function keyboardhandler (restore)
return function (mod, key, event)
if event ~= "press" then return true end
-- translate vim-style home keys to directions
if key == "j" or key == "k" or key == "h" or key == "l" then
if key == "j" then
key = "Down"
elseif key == "k" then
key = "Up"
elseif key == "h" then
key = "Left"
elseif key == "l" then
key = "Right"
end
end
--
if key == "Escape" then
restore()
return false
elseif key == "Return" then
selectfn(restore)(capi.client.focus)
return false
elseif key == "Left" or key == "Right" or
key == "Up" or key == "Down" then
awful.client.focus.bydirection(key:lower())
end
return true
end
end
-- Implement Exposé (ala Mac OS X).
--
-- @param rule A table with key and value to match. [{class=""}]
-- @param s The screen to consider clients of. [mouse.screen].
function expose(rule, s)
local rule = rule or {class=""}
local scr = s or capi.mouse.screen
local t = awful.tag.new({config.tag_name},
scr,
awful.layout.suit.fair)[1]
awful.tag.viewonly(t, t.screen)
match_clients(rule, capi.client.get(scr), t)
local function restore()
awful.tag.history.restore()
awful.tag.setscreen(t, nil)
t.selected = false
capi.keygrabber.stop()
capi.mousegrabber.stop()
for _, c in pairs(capi.client.get(src)) do
if clientData[c] then
c:geometry(clientData[c]) -- Restore positions and sizes
awful.client.floating.set(c, true)
end
end
end
capi.keygrabber.run(keyboardhandler(restore))
local pressedMiddle = false
capi.mousegrabber.run(function(mouse)
local c = awful.mouse.client_under_pointer()
if mouse.buttons[1] == true then
selectfn(restore)(c)
return false
elseif mouse.buttons[2] == true and pressedMiddle == false and c ~= nil then -- is true whenever the button is down.
pressedMiddle = true -- extra variable needed to prevent script from spam-closing windows
c:kill()
return true
elseif mouse.buttons[2] == false and pressedMiddle == true then
pressedMiddle = false
end
return true
--Strange but on my machine only fleur worked as a string.
--stole it from
--https://github.com/Elv13/awesome-configs/blob/master/widgets/layout/desktopLayout.lua#L175
end,"fleur")
end
setmetatable(_M, { __call = function(_, ...) return expose(...) end })