ltkx

GUI toolkit for X11 (WIP)
git clone git://lumidify.org/ltkx.git
Log | Files | Refs | README | LICENSE

commit 8db8f0b44f5f1c727be32114a22863bf72355a76
parent 9c62c13ad2f58414b7de5dd1b928c9dd780df8cc
Author: lumidify <nobody@lumidify.org>
Date:   Sat, 23 May 2020 20:18:29 +0200

Only wrap lines on space characters

Diffstat:
Mtext_buffer.c | 49+++++++++++++++++++++++++++++++++----------------
Mtext_buffer.h | 12++++++++----
2 files changed, 41 insertions(+), 20 deletions(-)

diff --git a/text_buffer.c b/text_buffer.c @@ -113,6 +113,9 @@ ltk_text_line_wrap(struct ltk_text_line *tl, int max_width) { int last_linebreak = par_is_rtl ? tl->w : 0; int cur_start = 0; /* FIXME: also calculate max height of each line */ + /* Note: 0x20 is space */ + /* Note: No, this doesn't do proper Unicode linebreaking */ + /* Note: This is probably buggy */ while (cur) { if (sl->w + cur->w <= max_width) { sl->w += cur->w; @@ -127,14 +130,23 @@ ltk_text_line_wrap(struct ltk_text_line *tl, int max_width) { glyph = &cur->glyphs[i]; int cur_w = sl->w + cur_start - glyph->x_abs; if (cur_w > max_width) { + int char_break = -1; for (int j = i; j < cur->num_glyphs; j++) { - if (cur->glyphs[j].cluster != glyph->cluster || + if (char_break == -1 && cur->glyphs[j].cluster != glyph->cluster) + char_break = j; + if ((j != i && tl->log_buf->buf[cur->glyphs[j].cluster] == 0x20) || j == cur->num_glyphs - 1 || sl->len == 0) { if (j == cur->num_glyphs - 1 && - cur->glyphs[j].cluster == glyph->cluster && - sl->len > 0) { - i = j; - last_linebreak = cur_start; + tl->log_buf->buf[cur->glyphs[j].cluster] != 0x20) { + if (sl->len == 0) { + char_break = char_break == -1 ? j : char_break; + i = char_break - 1; + last_linebreak = cur->glyphs[char_break].x_abs; + sl->len += j - char_break + 1; + } else { + i = j; + last_linebreak = cur_start; + } } else { i = j - 1; last_linebreak = cur->glyphs[j].x_abs; @@ -175,14 +187,23 @@ ltk_text_line_wrap(struct ltk_text_line *tl, int max_width) { of the two? What if the glyph width is actually larger than x_advance? */ int cur_w = sl->w + glyph->x_abs + glyph->x_advance - cur_start; if (cur_w > max_width) { + int char_break = -1; for (int j = i; j >= 0; j--) { - if (cur->glyphs[j].cluster != glyph->cluster || + if (char_break == -1 && cur->glyphs[j].cluster != glyph->cluster) + char_break = j; + if ((j != i && tl->log_buf->buf[cur->glyphs[j].cluster] == 0x20) || j == 0 || sl->len == 0) { if (j == 0 && - cur->glyphs[j].cluster == glyph->cluster && - sl->len > 0) { - i = j; - last_linebreak = cur_start; + tl->log_buf->buf[cur->glyphs[j].cluster] != 0x20) { + if (sl->len == 0) { + char_break = char_break == -1 ? j : char_break; + i = char_break + 1; + last_linebreak = cur->glyphs[char_break + 1].x_abs; + sl->len += char_break - j + 1; + } else { + i = j; + last_linebreak = cur_start; + } } else { i = j + 1; last_linebreak = cur->glyphs[j + 1].x_abs; @@ -882,8 +903,6 @@ ltk_text_line_create(uint16_t font_size) { line->len = 0; line->w_wrapped = line->h_wrapped = 0; line->font_size = font_size; - /* FIXME */ - line->line_gap = 0; return line; error: (void)fprintf(stderr, "No memory left while creating text line\n"); @@ -937,7 +956,7 @@ ltk_text_buffer_insert_utf8_at_cursor(struct ltk_text_buffer *tb, char *text) { new[i] = c; } } - ltk_text_line_insert_utf32(tb->cur_line, tb->cursor_pos, new, actual_len); + //ltk_text_line_insert_utf32(tb->cur_line, tb->cursor_pos, new, actual_len); free(new); } @@ -948,10 +967,8 @@ ltk_text_buffer_create(void) { (void)fprintf(stderr, "No memory while creating text buffer\n"); exit(1); } - buf->head = ltk_text_line_create(20); - buf->cur_line = buf->head; + buf->head = NULL; buf->cursor_pos = 0; - buf->line_gap = 0; } void diff --git a/text_buffer.h b/text_buffer.h @@ -84,14 +84,18 @@ struct ltk_text_line { int h; int w_wrapped; int h_wrapped; - unsigned int line_gap; +}; + +struct ltk_text_line_list { + struct ltk_text_line *tl; + XImage *img; + struct ltk_text_line_list *next; + struct ltk_text_line_list *last; }; struct ltk_text_buffer { - struct ltk_text_line *head; - struct ltk_text_line *cur_line; + struct ltk_text_line_list *head; size_t cursor_pos; - unsigned int line_gap; }; void ltk_soft_line_destroy(struct ltk_soft_line *sl);