mirror of
https://github.com/kovidgoyal/kitty
synced 2026-07-27 10:41:58 +02:00
Allow rewrap_inner to track multiple positions
This commit is contained in:
@@ -48,31 +48,41 @@ copy_range(Line *src, index_type src_at, Line* dest, index_type dest_at, index_t
|
||||
memcpy(dest->gpu_cells + dest_at, src->gpu_cells + src_at, num * sizeof(GPUCell));
|
||||
}
|
||||
|
||||
typedef struct TrackCursor {
|
||||
index_type x, y;
|
||||
bool is_tracked_line, is_sentinel;
|
||||
} TrackCursor;
|
||||
|
||||
|
||||
static void
|
||||
rewrap_inner(BufType *src, BufType *dest, const index_type src_limit, HistoryBuf UNUSED *historybuf, index_type *track_x, index_type *track_y, ANSIBuf *as_ansi_buf) {
|
||||
rewrap_inner(BufType *src, BufType *dest, const index_type src_limit, HistoryBuf UNUSED *historybuf, TrackCursor *track, ANSIBuf *as_ansi_buf) {
|
||||
bool src_line_is_continued = false;
|
||||
index_type src_y = 0, src_x = 0, dest_x = 0, dest_y = 0, num = 0, src_x_limit = 0;
|
||||
TrackCursor tc_end = {.is_sentinel = true };
|
||||
if (!track) track = &tc_end;
|
||||
|
||||
first_dest_line;
|
||||
do {
|
||||
bool is_tracked_line = src_y == *track_y;
|
||||
for (TrackCursor *t = track; !t->is_sentinel; t++) t->is_tracked_line = src_y == t->y;
|
||||
init_src_line(src_y);
|
||||
src_line_is_continued = is_src_line_continued(src_y);
|
||||
src_x_limit = src->xnum;
|
||||
if (!src_line_is_continued) {
|
||||
// Trim trailing blanks since there is a hard line break at the end of this line
|
||||
while(src_x_limit && (src->line->cpu_cells[src_x_limit - 1].ch) == BLANK_CHAR) src_x_limit--;
|
||||
|
||||
}
|
||||
if (is_tracked_line && *track_x >= src_x_limit) *track_x = MAX(1u, src_x_limit) - 1;
|
||||
for (TrackCursor *t = track; !t->is_sentinel; t++) {
|
||||
if (t->is_tracked_line && t->x >= src_x_limit) t->x = MAX(1u, src_x_limit) - 1;
|
||||
}
|
||||
while (src_x < src_x_limit) {
|
||||
if (dest_x >= dest->xnum) { next_dest_line(true); dest_x = 0; }
|
||||
num = MIN(src->line->xnum - src_x, dest->xnum - dest_x);
|
||||
copy_range(src->line, src_x, dest->line, dest_x, num);
|
||||
if (is_tracked_line && src_x <= *track_x && *track_x < src_x + num) {
|
||||
*track_y = dest_y;
|
||||
*track_x = dest_x + (*track_x - src_x + 1);
|
||||
for (TrackCursor *t = track; !t->is_sentinel; t++) {
|
||||
if (t->is_tracked_line && src_x <= t->x && t->x < src_x + num) {
|
||||
t->y = dest_y;
|
||||
t->x = dest_x + (t->x - src_x + 1);
|
||||
}
|
||||
}
|
||||
src_x += num; dest_x += num;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user