char in_buffer[LINE_MAX], *out_buffer;
size_t out_buffer_size;
size_t in_buffer_full, out_buffer_full;
+ size_t out_buffer_write_len; /* The length of the output in the buffer except for the trailing
+ * truncated OSC, CSI, or some (but not all) ESC sequence. */
usec_t escape_timestamp;
unsigned escape_counter;
f->out_buffer = mfree(f->out_buffer);
f->out_buffer_size = 0;
f->out_buffer_full = 0;
+ f->out_buffer_write_len = 0;
f->in_buffer_full = 0;
f->csi_sequence = mfree(f->csi_sequence);
assert(f);
+ if (FLAGS_SET(f->flags, PTY_FORWARD_DUMB_TERMINAL))
+ return 0;
+
if (!f->background_color)
return 0;
static int insert_background_fix(PTYForward *f, size_t offset) {
assert(f);
+ if (FLAGS_SET(f->flags, PTY_FORWARD_DUMB_TERMINAL))
+ return 0;
+
if (!f->background_color)
return 0;
static int insert_window_title_fix(PTYForward *f, size_t offset) {
assert(f);
+ if (FLAGS_SET(f->flags, PTY_FORWARD_DUMB_TERMINAL))
+ return 0;
+
if (!f->title_prefix)
return 0;
assert(f);
assert(offset <= f->out_buffer_full);
- if (!f->background_color && !f->title_prefix)
- return 0;
-
- if (FLAGS_SET(f->flags, PTY_FORWARD_DUMB_TERMINAL))
- return 0;
-
for (size_t i = offset; i < f->out_buffer_full; i++) {
char c = f->out_buffer[i];
default:
assert_not_reached();
}
+
+ if (f->ansi_color_state == ANSI_COLOR_STATE_TEXT)
+ f->out_buffer_write_len = i + 1;
}
return 0;
}
if (f->out_buffer) {
- f->out_buffer_full = strlen(f->out_buffer);
+ f->out_buffer_full = f->out_buffer_write_len = strlen(f->out_buffer);
f->out_buffer_size = MALLOC_SIZEOF_SAFE(f->out_buffer);
}
}
}
}
- if (f->stdout_writable && f->out_buffer_full > 0) {
+ if (f->stdout_writable && f->out_buffer_write_len > 0) {
+ assert(f->out_buffer_write_len <= f->out_buffer_full);
- k = write(f->output_fd, f->out_buffer, f->out_buffer_full);
+ k = write(f->output_fd, f->out_buffer, f->out_buffer_write_len);
if (k < 0) {
if (errno == EAGAIN)
f->last_char_set = true;
}
- assert(f->out_buffer_full >= (size_t) k);
+ assert(f->out_buffer_write_len >= (size_t) k);
memmove(f->out_buffer, f->out_buffer + k, f->out_buffer_full - k);
f->out_buffer_full -= k;
+ f->out_buffer_write_len -= k;
}
}
}
/* Exit the loop if any side hung up and if there's
* nothing more to write or nothing we could write. */
- if ((f->out_buffer_full <= 0 || f->stdout_hangup) &&
+ if ((f->out_buffer_write_len <= 0 || f->stdout_hangup) &&
(f->in_buffer_full <= 0 || f->master_hangup))
return pty_forward_done(f, 0);
}