URI: 
       tAdd LtkTextEdit (non-working) - 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 d992e1c9a4486549c34466de7e54c5a87d5eb6a6
   DIR parent 105a46b568587d48c05ba2a848d8107d5eeed1b3
  HTML Author: lumidify <nobody@lumidify.org>
       Date:   Wed, 13 May 2020 19:04:58 +0200
       
       Add LtkTextEdit (non-working)
       
       Diffstat:
         M text_buffer.c                       |      17 +++++++++++++++++
         A text_edit.c                         |      48 +++++++++++++++++++++++++++++++
         A text_edit.h                         |      32 +++++++++++++++++++++++++++++++
       
       3 files changed, 97 insertions(+), 0 deletions(-)
       ---
   DIR diff --git a/text_buffer.c b/text_buffer.c
       t@@ -560,6 +560,7 @@ ltk_text_line_recalculate(LtkTextManager *tm, struct ltk_text_line *tl) {
                ltk_text_line_shape(tm, tl);
        }
        
       +
        void
        ltk_text_line_insert_text(struct ltk_text_line *tl, uint32_t *text, size_t len) {
                /* check if any characters have a different script, only recalc then */
       t@@ -597,6 +598,22 @@ ltk_text_line_insert_text(struct ltk_text_line *tl, uint32_t *text, size_t len) 
                ltk_text_line_recalculate(tl);
        }
        
       +/* must be NULL-terminated */
       +void
       +ltk_text_line_insert_utf8(struct ltk_text_line *tl, char *text) {
       +        size_t len = u8_strlen(text);
       +        uint32_t *new = malloc(sizeof(uint32_t) * len);
       +        if (!new) {
       +                (void)fprintf("Error allocating memory for string\n");
       +                exit(1);
       +        ]
       +        size_t inc = 0;
       +        for (int i = 0; i < len; i++)
       +                new[i] = u8_nextmemchar(text, &inc);
       +        ltk_text_line_insert_text(tl, new, len);
       +        free(new);
       +}
       +
        struct ltk_text_line *
        ltk_text_line_create(void) {
                struct ltk_text_line *line = malloc(sizeof(struct ltk_text_line));
   DIR diff --git a/text_edit.c b/text_edit.c
       t@@ -0,0 +1,48 @@
       +/*
       + * This file is part of the Lumidify ToolKit (LTK)
       + * Copyright (c) 2020 lumidify <nobody@lumidify.org>
       + *
       + * Permission is hereby granted, free of charge, to any person obtaining a copy
       + * of this software and associated documentation files (the "Software"), to deal
       + * in the Software without restriction, including without limitation the rights
       + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
       + * copies of the Software, and to permit persons to whom the Software is
       + * furnished to do so, subject to the following conditions:
       + *
       + * The above copyright notice and this permission notice shall be included in all
       + * copies or substantial portions of the Software.
       + *
       + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
       + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
       + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
       + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
       + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
       + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
       + * SOFTWARE.
       + */
       +
       +extern Ltk *ltk_global;
       +
       +void
       +ltk_draw_text_edit(LtkTextEdit *te) {
       +        XColor fg = ltk_global->theme->window->fg;
       +        XColor bg = ltk_global->theme->window->bg;
       +        LtkRect rect = te->widget.rect;
       +        LtkWindow *window = te->widget.window;
       +        if (!te->tl->img)
       +                ltk_render_text_line(te->tl, rect.w, ltk_global->display, window->xwindow, window->gc, ltk_global->colormap, fg, bg);
       +        XPutImage(ltk_global->display, window->xwindow, window->gc, te->tl->img, 0, 0, rect.x, rect.y, te->tl->w, te->tl->h);
       +}
       +
       +LtkTextEdit *ltk_create_text_edit(LtkWindow *window, const char *text) {
       +        LtkTextEdit *te = malloc(sizeof(LtkTextEdit));
       +        if (!te)
       +                ltk_fatal("ERROR: Unable to allocate memory for LtkTextEdit.\n");
       +        ltk_fill_widget_defaults(&te->widget, window, &ltk_draw_text_edit, &ltk_destroy_text_edit, 1);
       +        te->tl = ltk_text_line_create();
       +        ltk_text_line_insert_utf8(te->tl, text);
       +}
       +void ltk_destroy_text_edit(LtkTextEdit *te) {
       +        ltk_text_line_destroy(te->tl);
       +        free(te);
       +}
   DIR diff --git a/text_edit.h b/text_edit.h
       t@@ -0,0 +1,32 @@
       +/*
       + * This file is part of the Lumidify ToolKit (LTK)
       + * Copyright (c) 2020 lumidify <nobody@lumidify.org>
       + *
       + * Permission is hereby granted, free of charge, to any person obtaining a copy
       + * of this software and associated documentation files (the "Software"), to deal
       + * in the Software without restriction, including without limitation the rights
       + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
       + * copies of the Software, and to permit persons to whom the Software is
       + * furnished to do so, subject to the following conditions:
       + *
       + * The above copyright notice and this permission notice shall be included in all
       + * copies or substantial portions of the Software.
       + *
       + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
       + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
       + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
       + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
       + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
       + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
       + * SOFTWARE.
       + */
       +
       +typedef struct {
       +        LtkWidget widget;
       +        struct ltk_text_line *tl;
       +} LtkTextEdit;
       +
       +/* FIXME: standardize ltk_<widget>_destroy, etc. instead of ltk_destroy_<widget> */
       +void ltk_draw_text_edit(LtkTextEdit *te);
       +LtkTextEdit *ltk_create_text_edit(LtkWindow *window, const char *text);
       +void ltk_destroy_text_edit(LtkTextEdit *te);