From 3474624c2c17058f0fd9f3f1821971e7213d285b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Fri, 1 May 2020 12:05:38 +0200 Subject: [PATCH] unicode-combining: completely remove unicode combining characters when feature is disabled --- grid.c | 8 ++++++++ render.c | 2 ++ selection.c | 10 ++++++++-- terminal.c | 3 +++ terminal.h | 5 +++++ 5 files changed, 26 insertions(+), 2 deletions(-) diff --git a/grid.c b/grid.c index 2a6b1073..22e4ecaf 100644 --- a/grid.c +++ b/grid.c @@ -34,12 +34,16 @@ grid_row_alloc(int cols, bool initialize) if (initialize) { row->cells = calloc(cols, sizeof(row->cells[0])); +#if FOOT_UNICODE_COMBINING row->comb_chars = calloc(cols, sizeof(row->comb_chars[0])); +#endif for (size_t c = 0; c < cols; c++) row->cells[c].attrs.clean = 1; } else { row->cells = malloc(cols * sizeof(row->cells[0])); +#if FOOT_UNICODE_COMBINING row->comb_chars = malloc(cols * sizeof(row->comb_chars[0])); +#endif } return row; @@ -51,7 +55,9 @@ grid_row_free(struct row *row) if (row == NULL) return; +#if FOOT_UNICODE_COMBINING free(row->comb_chars); +#endif free(row->cells); free(row); } @@ -208,6 +214,7 @@ grid_reflow(struct grid *grid, int new_rows, int new_cols, new_row->cells[new_col_idx] = *old_cell; new_row->cells[new_col_idx].attrs.clean = 1; +#if FOOT_UNICODE_COMBINING struct combining_chars *old_comb_chars = &old_row->comb_chars[c - empty_count + i]; struct combining_chars *new_comb_chars @@ -216,6 +223,7 @@ grid_reflow(struct grid *grid, int new_rows, int new_cols, new_comb_chars->count = old_comb_chars->count; for (size_t j = 0; j < ALEN(new_comb_chars->chars); j++) new_comb_chars->chars[j] = old_comb_chars->chars[j]; +#endif /* Translate tracking point(s) */ if (is_tracking_point && i >= empty_count) { diff --git a/render.c b/render.c index a87601d2..41b5c5b7 100644 --- a/render.c +++ b/render.c @@ -442,6 +442,7 @@ render_cell(struct terminal *term, pixman_image_t *pix, } } + #if FOOT_UNICODE_COMBINING /* Combining characters */ const struct combining_chars *comb_chars = &row->comb_chars[col]; for (size_t i = 0; i < comb_chars->count; i++) { @@ -461,6 +462,7 @@ render_cell(struct terminal *term, pixman_image_t *pix, g->width, g->height); pixman_image_unref(src); } +#endif /* Underline */ if (cell->attrs.underline) { diff --git a/selection.c b/selection.c index b84f4228..f9f7f6cd 100644 --- a/selection.c +++ b/selection.c @@ -142,8 +142,12 @@ min_bufsize_for_extraction(const struct terminal *term) { const struct coord *start = &term->selection.start; const struct coord *end = &term->selection.end; - const size_t chars_per_cell - = 1 + ALEN(term->grid->cur_row->comb_chars[0].chars); + const size_t chars_per_cell = +#if FOOT_UNICODE_COMBINING + 1 + ALEN(term->grid->cur_row->comb_chars[0].chars); +#else + 1; +#endif switch (term->selection.kind) { case SELECTION_NONE: @@ -237,12 +241,14 @@ extract_one(struct terminal *term, struct row *row, struct cell *cell, assert(ctx->idx + 1 <= ctx->size); ctx->buf[ctx->idx++] = cell->wc; +#if FOOT_UNICODE_COMBINING const struct combining_chars *comb_chars = &row->comb_chars[col]; assert(cell->wc != 0); assert(ctx->idx + comb_chars->count <= ctx->size); for (size_t i = 0; i < comb_chars->count; i++) ctx->buf[ctx->idx++] = comb_chars->chars[i]; +#endif ctx->last_row = row; ctx->last_cell = cell; diff --git a/terminal.c b/terminal.c index bbbf2127..9c3c24e8 100644 --- a/terminal.c +++ b/terminal.c @@ -2295,7 +2295,10 @@ term_print(struct terminal *term, wchar_t wc, int width) cell->wc = term->vt.last_printed = wc; cell->attrs = term->vt.attrs; +#if FOOT_UNICODE_COMBINING row->comb_chars[term->grid->cursor.point.col].count = 0; +#endif + row->dirty = true; cell->attrs.clean = 0; diff --git a/terminal.h b/terminal.h index b1f7ac8e..62c7e707 100644 --- a/terminal.h +++ b/terminal.h @@ -77,16 +77,21 @@ struct damage { int lines; }; +#if FOOT_UNICODE_COMBINING struct combining_chars { uint8_t count; wchar_t chars[2]; /* TODO: how many do we need? */ }; +#endif struct row { struct cell *cells; bool dirty; bool linebreak; + +#if FOOT_UNICODE_COMBINING struct combining_chars *comb_chars; +#endif }; struct sixel {