URI: 
       tOnly wrap lines on space characters - ltkx - GUI toolkit for X11 (WIP)
  HTML git clone git://lumidify.org/ltkx.git
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 8db8f0b44f5f1c727be32114a22863bf72355a76
   DIR parent 9c62c13ad2f58414b7de5dd1b928c9dd780df8cc
  HTML Author: lumidify <nobody@lumidify.org>
       Date:   Sat, 23 May 2020 20:18:29 +0200
       
       Only wrap lines on space characters
       
       Diffstat:
         M text_buffer.c                       |      49 +++++++++++++++++++++----------
         M text_buffer.h                       |      12 ++++++++----
       
       2 files changed, 41 insertions(+), 20 deletions(-)
       ---
   DIR diff --git a/text_buffer.c b/text_buffer.c
       t@@ -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;
       t@@ -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;
       t@@ -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;
       t@@ -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");
       t@@ -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);
        }
        
       t@@ -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
   DIR diff --git a/text_buffer.h b/text_buffer.h
       t@@ -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);