@@ -122,7 +122,8 @@ def _weak_or_strong_ref(func, callback):
122122
123123class CallbackRegistry :
124124 """
125- Handle registering and disconnecting for a set of signals and callbacks:
125+ Handle registering, processing, blocking, and disconnecting
126+ for a set of signals and callbacks:
126127
127128 >>> def oneat(x):
128129 ... print('eat', x)
@@ -140,9 +141,15 @@ class CallbackRegistry:
140141 >>> callbacks.process('eat', 456)
141142 eat 456
142143 >>> callbacks.process('be merry', 456) # nothing will be called
144+
143145 >>> callbacks.disconnect(id_eat)
144146 >>> callbacks.process('eat', 456) # nothing will be called
145147
148+ >>> with callbacks.blocked(signal='drink'):
149+ ... callbacks.process('drink', 123) # nothing will be called
150+ >>> callbacks.process('drink', 123)
151+ drink 123
152+
146153 In practice, one should always disconnect all callbacks when they are
147154 no longer needed to avoid dangling references (and thus memory leaks).
148155 However, real code in Matplotlib rarely does so, and due to its design,
@@ -280,6 +287,31 @@ def process(self, s, *args, **kwargs):
280287 else :
281288 raise
282289
290+ @contextlib .contextmanager
291+ def blocked (self , * , signal = None ):
292+ """
293+ Block callback signals from being processed.
294+
295+ A context manager to temporarily block/disable callback signals
296+ from being processed by the registered listeners.
297+
298+ Parameters
299+ ----------
300+ signal : str, optional
301+ The callback signal to block. The default is to block all signals.
302+ """
303+ orig = self .callbacks
304+ try :
305+ if signal is None :
306+ # Empty out the callbacks
307+ self .callbacks = {}
308+ else :
309+ # Only remove the specific signal
310+ self .callbacks = {k : orig [k ] for k in orig if k != signal }
311+ yield
312+ finally :
313+ self .callbacks = orig
314+
283315
284316class silent_list (list ):
285317 """
0 commit comments