--- a/src/vte.c
+++ b/src/vte.c
@@ -117,6 +117,7 @@ static char *vte_terminal_get_text_maybe_wrapped(VteTerminal *terminal,
 static void _vte_terminal_disconnect_pty_read(VteTerminal *terminal);
 static void _vte_terminal_disconnect_pty_write(VteTerminal *terminal);
 static void vte_terminal_stop_processing (VteTerminal *terminal);
+static void vte_terminal_start_processing (VteTerminal *terminal);
 
 static inline gboolean vte_terminal_is_processing (VteTerminal *terminal);
 static inline void vte_terminal_start_processing (VteTerminal *terminal);
@@ -7435,6 +7442,8 @@ vte_terminal_set_visibility (VteTerminal *terminal, GdkVisibilityState state)
 		/* if fully obscured, just act like we have invalidated all,
 		 * so no updates are accumulated. */
 		terminal->pvt->invalidated_all = TRUE;
+
+		vte_terminal_start_processing (terminal);
 	}
 }
 
@@ -14315,6 +14324,8 @@ process_timeout (gpointer data)
 			terminal->pvt->input_bytes = 0;
 		} else
 			vte_terminal_emit_pending_signals (terminal);
+		_vte_terminal_connect_pty_read (terminal);
+
 		if (!active && terminal->pvt->update_regions == NULL) {
 			if (terminal->pvt->active != NULL) {
 				_vte_debug_print(VTE_DEBUG_TIMEOUT,
@@ -14444,6 +14455,7 @@ update_repeat_timeout (gpointer data)
 			terminal->pvt->input_bytes = 0;
 		} else
 			vte_terminal_emit_pending_signals (terminal);
+		_vte_terminal_connect_pty_read (terminal);
 
 		again = update_regions (terminal);
 		if (!again) {
@@ -14548,6 +14560,7 @@ update_timeout (gpointer data)
 			terminal->pvt->input_bytes = 0;
 		} else
 			vte_terminal_emit_pending_signals (terminal);
+		_vte_terminal_connect_pty_read (terminal);
 
 		redraw |= update_regions (terminal);
 	}
