Avoid double scan of output to look for escape codes
This commit is contained in:
10
kitty/line.c
10
kitty/line.c
@@ -302,17 +302,18 @@ write_hyperlink(hyperlink_id_type hid, ANSIBuf *output) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
bool
|
||||||
line_as_ansi(Line *self, ANSIBuf *output, const GPUCell** prev_cell, index_type start_at, index_type stop_before, char_type prefix_char) {
|
line_as_ansi(Line *self, ANSIBuf *output, const GPUCell** prev_cell, index_type start_at, index_type stop_before, char_type prefix_char) {
|
||||||
#define ENSURE_SPACE(extra) ensure_space_for(output, buf, Py_UCS4, output->len + extra, capacity, 2048, false);
|
#define ENSURE_SPACE(extra) ensure_space_for(output, buf, Py_UCS4, output->len + extra, capacity, 2048, false);
|
||||||
#define WRITE_SGR(val) { ENSURE_SPACE(128); write_sgr(val, output); }
|
#define WRITE_SGR(val) { ENSURE_SPACE(128); escape_code_written = true; write_sgr(val, output); }
|
||||||
#define WRITE_CH(val) { ENSURE_SPACE(1); output->buf[output->len++] = val; }
|
#define WRITE_CH(val) { ENSURE_SPACE(1); output->buf[output->len++] = val; }
|
||||||
#define WRITE_HYPERLINK(val) { ENSURE_SPACE(2256); write_hyperlink(val, output); }
|
#define WRITE_HYPERLINK(val) { ENSURE_SPACE(2256); escape_code_written = true; write_hyperlink(val, output); }
|
||||||
|
bool escape_code_written = false;
|
||||||
output->len = 0;
|
output->len = 0;
|
||||||
index_type limit = MIN(stop_before, xlimit_for_line(self));
|
index_type limit = MIN(stop_before, xlimit_for_line(self));
|
||||||
char_type previous_width = 0;
|
char_type previous_width = 0;
|
||||||
if (prefix_char) { WRITE_CH(prefix_char); previous_width = wcwidth_std(prefix_char); }
|
if (prefix_char) { WRITE_CH(prefix_char); previous_width = wcwidth_std(prefix_char); }
|
||||||
if (limit <= start_at) return;
|
if (limit <= start_at) return escape_code_written;
|
||||||
|
|
||||||
static const GPUCell blank_cell = { 0 };
|
static const GPUCell blank_cell = { 0 };
|
||||||
GPUCell *cell;
|
GPUCell *cell;
|
||||||
@@ -354,6 +355,7 @@ line_as_ansi(Line *self, ANSIBuf *output, const GPUCell** prev_cell, index_type
|
|||||||
}
|
}
|
||||||
previous_width = cell->attrs.width;
|
previous_width = cell->attrs.width;
|
||||||
}
|
}
|
||||||
|
return escape_code_written;
|
||||||
#undef CMP_ATTRS
|
#undef CMP_ATTRS
|
||||||
#undef CMP
|
#undef CMP
|
||||||
#undef WRITE_SGR
|
#undef WRITE_SGR
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ void line_add_combining_char(Line *, uint32_t , unsigned int );
|
|||||||
index_type line_url_start_at(Line *self, index_type x);
|
index_type line_url_start_at(Line *self, index_type x);
|
||||||
index_type line_url_end_at(Line *self, index_type x, bool, char_type, bool);
|
index_type line_url_end_at(Line *self, index_type x, bool, char_type, bool);
|
||||||
bool line_startswith_url_chars(Line*);
|
bool line_startswith_url_chars(Line*);
|
||||||
void line_as_ansi(Line *self, ANSIBuf *output, const GPUCell**, index_type start_at, index_type stop_before, char_type prefix_char) __attribute__((nonnull));
|
bool line_as_ansi(Line *self, ANSIBuf *output, const GPUCell**, index_type start_at, index_type stop_before, char_type prefix_char) __attribute__((nonnull));
|
||||||
unsigned int line_length(Line *self);
|
unsigned int line_length(Line *self);
|
||||||
size_t cell_as_unicode(CPUCell *cell, bool include_cc, Py_UCS4 *buf, char_type);
|
size_t cell_as_unicode(CPUCell *cell, bool include_cc, Py_UCS4 *buf, char_type);
|
||||||
size_t cell_as_unicode_for_fallback(CPUCell *cell, Py_UCS4 *buf);
|
size_t cell_as_unicode_for_fallback(CPUCell *cell, Py_UCS4 *buf);
|
||||||
|
|||||||
@@ -2479,13 +2479,10 @@ ansi_for_range(Screen *self, const Selection *sel, bool insert_newlines, bool st
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
line_as_ansi(line, &output, &prev_cell, xr.x, x_limit, prefix_char);
|
if (line_as_ansi(line, &output, &prev_cell, xr.x, x_limit, prefix_char)) has_escape_codes = true;
|
||||||
PyObject *t = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, output.buf, output.len);
|
PyObject *t = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, output.buf, output.len);
|
||||||
if (!t) return NULL;
|
if (!t) return NULL;
|
||||||
PyTuple_SET_ITEM(ans, i, t);
|
PyTuple_SET_ITEM(ans, i, t);
|
||||||
if (!has_escape_codes) {
|
|
||||||
for (size_t i = 0; i < output.len; i++) { if (output.buf[i] == 0x1b) { has_escape_codes = true; break; } }
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
PyObject *t = PyUnicode_FromFormat("%s%s", has_escape_codes ? "\x1b[m" : "", output.active_hyperlink_id ? "\x1b]8;;\x1b\\" : "");
|
PyObject *t = PyUnicode_FromFormat("%s%s", has_escape_codes ? "\x1b[m" : "", output.active_hyperlink_id ? "\x1b]8;;\x1b\\" : "");
|
||||||
if (!t) return NULL;
|
if (!t) return NULL;
|
||||||
|
|||||||
Reference in New Issue
Block a user