forked from qtile/qtile
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhook.py
219 lines (176 loc) · 6.01 KB
/
hook.py
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
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
import utils
subscriptions = {}
SKIPLOG = set()
qtile = None
def init(q):
global qtile
qtile = q
def clear():
subscriptions.clear()
class Subscribe:
def __init__(self):
hooks = set([])
for i in dir(self):
if not i.startswith("_"):
hooks.add(i)
self.hooks = hooks
def _subscribe(self, event, func):
lst = subscriptions.setdefault(event, [])
if not func in lst:
lst.append(func)
def startup(self, func):
"""
Called when Qtile has initialized
"""
return self._subscribe("startup", func)
def setgroup(self, func):
"""
Called when group is changed.
"""
return self._subscribe("setgroup", func)
def addgroup(self, func):
"""
Called when group is added.
"""
return self._subscribe("addgroup", func)
def delgroup(self, func):
"""
Called when group is deleted.
"""
return self._subscribe("delgroup", func)
def changegroup(self, func):
"""
Called whenever a group change occurs.
"""
return self._subscribe("changegroup", func)
def focus_change(self, func):
"""
Called when focus is changed.
"""
return self._subscribe("focus_change", func)
def float_change(self, func):
"""
Called when a change in float state is made
"""
return self._subscribe("float_change", func)
def group_window_add(self, func):
"""
Called when a new window is added to a group.
"""
return self._subscribe("group_window_add", func)
def window_name_change(self, func):
"""
Called whenever a windows name changes.
"""
return self._subscribe("window_name_change", func)
def client_new(self, func):
"""
Called before Qtile starts managing a new client. Use this hook to
declare windows static, or add them to a group on startup. This
hook is not called for internal windows.
- arguments: window.Window object
## Example:
def func(c):
if c.name == "xterm":
c.togroup("a")
elif c.name == "dzen":
c.static(0)
libqtile.hook.subscribe.client_new(func)
"""
return self._subscribe("client_new", func)
def client_managed(self, func):
"""
Called after Qtile starts managing a new client. That is, after a
window is assigned to a group, or when a window is made static.
This hook is not called for internal windows.
- arguments: window.Window object
"""
return self._subscribe("client_managed", func)
def client_killed(self, func):
"""
Called after a client has been unmanaged.
- arguments: window.Window object of the killed window.
"""
return self._subscribe("client_killed", func)
def client_state_changed(self, func):
"""
Called whenever client state changes.
"""
return self._subscribe("client_state_changed", func)
def client_type_changed(self, func):
"""
Called whenever window type changes.
"""
return self._subscribe("client_type_changed", func)
def client_focus(self, func):
"""
Called whenver focus changes.
- arguments: window.Window object of the new focus.
"""
return self._subscribe("client_focus", func)
def client_mouse_enter(self, func):
"""
Called when the mouse enters a client.
"""
return self._subscribe("client_mouse_enter", func)
def client_name_updated(self, func):
"""
Called when the client name changes.
"""
return self._subscribe("client_name_updated", func)
def client_urgent_hint_changed(self, func):
"""
Called when the client urgent hint changes.
"""
return self._subscribe("client_urgent_hint_changed", func)
def layout_change(self, func):
"""
Called on layout change.
"""
return self._subscribe("layout_change", func)
def net_wm_icon_change(self, func):
"""
Called on _NET_WM_ICON chance.
"""
return self._subscribe("net_wm_icon_change", func)
def screen_change(self, func):
"""
Called when a screen is added or screen configuration is changed
(via xrandr). The hook should take two arguments: the root qtile
object and the ``xproto.randr.ScreenChangeNotify`` event. Common
usage is simply to call ``qtile.cmd_restart()`` on each event (to
restart qtile when there is a new monitor):
## Example:
def restart_on_randr(qtile, ev):
qtile.cmd_restart()
"""
return self._subscribe("screen_change", func)
subscribe = Subscribe()
class Unsubscribe(Subscribe):
"""
This class mirrors subscribe, except the _subscribe member has been
overridden to removed calls from hooks.
"""
def _subscribe(self, event, func):
lst = subscriptions.setdefault(event, [])
try:
lst.remove(func)
except ValueError:
raise utils.QtileError(
"Tried to unsubscribe a hook that was not"
" currently subscribed"
)
unsubscribe = Unsubscribe()
def fire(event, *args, **kwargs):
if event not in subscribe.hooks:
raise utils.QtileError("Unknown event: %s" % event)
if not event in SKIPLOG:
qtile.log.info(
"Internal event: %s(%s, %s)" %
(event, args, kwargs)
)
for i in subscriptions.get(event, []):
try:
i(*args, **kwargs)
except:
qtile.log.exception("Error in hook %s" % (event,))