@@ -67,6 +67,7 @@ def __init__(self, eventloop, invalidate, exec_func, bell_func=None,
67
67
self .pid = None
68
68
self .is_terminated = False
69
69
self .suspended = False
70
+ self ._reader_connected = False
70
71
71
72
# Create pseudo terminal for this pane.
72
73
self .master , self .slave = os .openpty ()
@@ -153,7 +154,7 @@ def done():
153
154
" PID received. Back in the main thread. "
154
155
# Close pty and remove reader.
155
156
os .close (self .master )
156
- self .eventloop . remove_reader ( self . master )
157
+ self ._remove_reader ( )
157
158
self .master = None
158
159
159
160
# Callback.
@@ -256,12 +257,21 @@ def write_key(self, key):
256
257
key , application_mode = self .screen .in_application_mode )
257
258
self .write_input (data )
258
259
260
+ def _remove_reader (self ):
261
+ """
262
+ Stop processing stdout from the process.
263
+ """
264
+ if self .master is not None and self ._reader_connected :
265
+ self .eventloop .remove_reader (self .master )
266
+ self ._reader_connected = False
267
+
259
268
def _connect_reader (self ):
260
269
"""
261
270
Process stdout output from the process.
262
271
"""
263
- if self .master is not None :
272
+ if self .master is not None and not self . _reader_connected :
264
273
self .eventloop .add_reader (self .master , self ._read )
274
+ self ._reader_connected = True
265
275
266
276
def _read (self ):
267
277
"""
@@ -282,13 +292,13 @@ def process():
282
292
283
293
# Otherwise, postpone processing until we have CPU time available.
284
294
else :
285
- if self .master is not None :
286
- self .eventloop .remove_reader (self .master )
295
+ self ._remove_reader ()
287
296
288
297
def do_asap ():
289
298
" Process output and reconnect to event loop. "
290
299
process ()
291
- self ._connect_reader ()
300
+ if not self .suspended :
301
+ self ._connect_reader ()
292
302
293
303
# When the event loop is saturated because of CPU, we will
294
304
# postpone this processing max 'x' seconds.
@@ -303,14 +313,14 @@ def do_asap():
303
313
do_asap , _max_postpone_until = timestamp )
304
314
else :
305
315
# End of stream. Remove child.
306
- self .eventloop . remove_reader ( self . master )
316
+ self ._remove_reader ( )
307
317
308
318
def suspend (self ):
309
319
"""
310
320
Suspend process. Stop reading stdout. (Called when going into copy mode.)
311
321
"""
312
322
self .suspended = True
313
- self .eventloop . remove_reader ( self . master )
323
+ self ._remove_reader ( )
314
324
315
325
def resume (self ):
316
326
"""
0 commit comments