URI: 
       tFix some stuff - ltk - Socket-based GUI for X11 (WIP)
  HTML git clone git://lumidify.org/ltk.git (fast, but not encrypted)
  HTML git clone https://lumidify.org/git/ltk.git (encrypted, but very slow)
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 99e3c74d38ba3e85b623b73d4f16d8c9d6bf0506
   DIR parent a664daed365f583f4a5dc42b31f2f80ceeb83b4d
  HTML Author: lumidify <nobody@lumidify.org>
       Date:   Sat,  6 Jun 2020 22:06:57 +0200
       
       Fix some stuff
       
       Diffstat:
         M draw.c                              |      24 ++++++++++++++++++++----
         M ltk.c                               |      39 ++++++++++++++-----------------
         A test_anim.sh                        |      19 +++++++++++++++++++
         M text_common.c                       |       4 ++--
         M text_common.h                       |       6 +++---
         A tmp.gui                             |      70 +++++++++++++++++++++++++++++++
       
       6 files changed, 132 insertions(+), 30 deletions(-)
       ---
   DIR diff --git a/draw.c b/draw.c
       t@@ -139,7 +139,7 @@ ltk_draw_clear(ltk_window *window, ltk_draw *draw) {
                XGetGeometry(window->dpy, draw->pix, &win, &x, &y, &w, &h, &bw, &d);
                XSetForeground(window->dpy, window->gc, draw->bg.pixel);
                XFillRectangle(window->dpy, window->xwindow, window->gc, 0, 0, w, h);
       -        ltk_window_invalidate_rect(window, draw->widget.rect);
       +        ltk_draw_draw(draw);
        }
        
        static void
       t@@ -152,22 +152,38 @@ ltk_draw_set_color(ltk_window *window, ltk_draw *draw, const char *color) {
        
        static void
        ltk_draw_line(ltk_window *window, ltk_draw *draw, int x1, int y1, int x2, int y2) {
       +        ltk_rect rect = draw->widget.rect;
                XSetForeground(window->dpy, window->gc, draw->fg.pixel);
                XSetLineAttributes(window->dpy, window->gc, 2, LineSolid, CapButt, JoinMiter);
                XDrawLine(window->dpy, draw->pix, window->gc, x1, y1, x2, y2);
       -        ltk_window_invalidate_rect(window, draw->widget.rect);
       +        x1 += rect.x;
       +        y1 += rect.y;
       +        x2 += rect.x;
       +        y2 += rect.y;
       +        if (x1 > rect.x + rect.w) x1 = rect.x + rect.w;
       +        if (y1 > rect.y + rect.h) y1 = rect.y + rect.h;
       +        if (x2 > rect.x + rect.w) x2 = rect.x + rect.w;
       +        if (y2 > rect.y + rect.h) y2 = rect.y + rect.h;
       +        XDrawLine(window->dpy, window->xwindow, window->gc, x1, y1, x2, y2);
        }
        
        static void
        ltk_draw_rect(ltk_window *window, ltk_draw *draw, int x, int y, int w, int h, int fill) {
       +        int x_win, y_win, w_win, h_win;
       +        ltk_rect rect = draw->widget.rect;
                XSetForeground(window->dpy, window->gc, draw->fg.pixel);
       +        x_win = x + rect.x;
       +        y_win = y + rect.y;
       +        w_win = x + w > rect.w ? rect.w - x : w;
       +        h_win = y + h > rect.h ? rect.h - y : h;
                if (fill) {
       -                XFillRectangle(window->dpy, window->xwindow, window->gc, x, y, w, h);
       +                XFillRectangle(window->dpy, draw->pix, window->gc, x, y, w, h);
       +                XFillRectangle(window->dpy, window->xwindow, window->gc, x_win, y_win, w_win, h_win);
                } else {
                        XSetLineAttributes(window->dpy, window->gc, 2, LineSolid, CapButt, JoinMiter);
                        XDrawRectangle(window->dpy, draw->pix, window->gc, x, y, w, h);
       +                XDrawRectangle(window->dpy, window->xwindow, window->gc, x_win, y_win, w_win, h_win);
                }
       -        ltk_window_invalidate_rect(window, draw->widget.rect);
        }
        
        static void
   DIR diff --git a/ltk.c b/ltk.c
       t@@ -95,6 +95,8 @@ ltk_clean_up(ltk_window *window) {
                XCloseDisplay(window->dpy);
                ltk_destroy_theme(window->theme);
                ltk_destroy_window(window);
       +        if (tokens) free(tokens);
       +        if (cmd_input) free(cmd_input);
        }
        
        void
       t@@ -178,49 +180,42 @@ read_cmdline(int fd) {
                return 0;
        }
        
       +/* FIXME: turn this into something that doesn't, you know,
       +   explode at the slightest touch... */
        static int
        tokenize(void) {
                char *c;
       +        tokens_len = 0;
                if (!cmd_input || cmd_input[0] == '\0') return 0;
                for (c = cmd_input; *c == ' '; c++)
                        ;
       -        tokens_len = 0;
                size_t cur_tok = 0;
       -        size_t cur_tok_len = 0;
       -        size_t cur_tok_bufsize = 0;
                int in_str = 0;
                char **tmp;
       -        char *tmp2;
       +        if (tokens_bufsize)
       +                tokens[0] = c;
                while (*c != '\0') {
                        if (cur_tok >= tokens_bufsize) {
       -                        tokens_bufsize = !tokens_bufsize ? 1 : tokens_bufsize;
       +                        if (!tokens_bufsize)
       +                                tokens_bufsize = 1;
                                tmp = realloc(tokens, tokens_bufsize * 2 * sizeof(char *));
                                if (!tmp) ltk_fatal("Out of memory while parsing command.\n");
                                tokens = tmp;
       +                        tokens[cur_tok] = c;
                                tokens_bufsize *= 2;
                        }
       -                if (cur_tok_len + 1 >= cur_tok_bufsize) {
       -                        cur_tok_bufsize = !cur_tok_bufsize ? 1 : cur_tok_bufsize;
       -                        if (cur_tok_len == 0)
       -                                tokens[cur_tok] = NULL; /* so realloc works the first time */
       -                        tmp2 = realloc(tokens[cur_tok], cur_tok_bufsize * 2 * sizeof(char));
       -                        if (!tmp2) ltk_fatal("Out of memory while parsing command.\n");
       -                        tokens[cur_tok] = tmp2;
       -                        cur_tok_bufsize *= 2;
       -                }
                        if (*c == '"') {
       +                        if (!in_str)
       +                                tokens[cur_tok] = c + 1;
                                in_str = !in_str;
       +                        *c = '\0';
                        } else if (*c == ' ' && !in_str) {
       -                        tokens[cur_tok][cur_tok_len] = '\0';
       +                        *c = '\0';
                                cur_tok++;
       -                        cur_tok_len = 0;
       -                        cur_tok_bufsize = 0;
       -                } else {
       -                        tokens[cur_tok][cur_tok_len++] = *c;
       +                        tokens[cur_tok] = c + 1;
                        }
                        c++;
                }
       -        tokens[cur_tok][cur_tok_len] = '\0';
                tokens_len = cur_tok + 1;
        }
        
       t@@ -228,6 +223,9 @@ static void
        proc_cmds(ltk_window *window) {
                if (!tokenize()) return;
                if (!tokens_len) return;
       +        for (int i = 0; i < tokens_len; i++) {
       +                printf("%s\n", tokens[i]);
       +        }
                if (strcmp(tokens[0], "grid") == 0) {
                        ltk_grid_cmd(window, tokens, tokens_len);
                } else if (strcmp(tokens[0], "button") == 0) {
       t@@ -273,7 +271,6 @@ ltk_mainloop(ltk_window *window) {
                                struct ltk_event_queue *cur = window->last_event;
                                struct ltk_event_queue *last;
                                do {
       -                                printf("%s %s\n", cur->id, cur->name);
                                        free(cur->id);
                                        free(cur->name);
                                        last = cur;
   DIR diff --git a/test_anim.sh b/test_anim.sh
       t@@ -0,0 +1,19 @@
       +#!/bin/sh
       +
       +echo "grid grd1 create 2 2
       +grid grd1 set-row-weight 0 1
       +grid grd1 set-row-weight 1 1
       +grid grd1 set-column-weight 0 1
       +grid grd1 set-column-weight 1 1
       +set-root-widget grd1
       +draw drw1 create 100 100 #fff
       +grid grd1 add drw1 0 1 1 1 15
       +draw drw1 set-color #000
       +"
       +
       +i=0
       +while [[ $i -lt 300 ]]; do
       +        echo "draw drw1 line $i $i 5 5";
       +        sleep 0.05;
       +        i=$((i+5));
       +done
   DIR diff --git a/text_common.c b/text_common.c
       t@@ -139,7 +139,7 @@ ltk_destroy_text(ltk_text *tm)
        }
        
        ltk_glyph_info *
       -ltk_create_glyph_info(ltk_font *font, unsigned int id, float scale)
       +ltk_create_glyph_info(ltk_font *font, int id, float scale)
        {
                ltk_glyph_info *glyph = malloc(sizeof(ltk_glyph_info));
                if (!glyph) ltk_fatal("Out of memory while trying to create glyph info.\n");
       t@@ -162,7 +162,7 @@ ltk_destroy_glyph_info(ltk_glyph_info *gi)
        }
        
        ltk_glyph_info *
       -ltk_get_glyph_info(ltk_font *font, unsigned int id, float scale, khash_t(glyphinfo) *cache)
       +ltk_get_glyph_info(ltk_font *font, int id, float scale, khash_t(glyphinfo) *cache)
        {
                int ret;
                khint_t k;
   DIR diff --git a/text_common.h b/text_common.h
       t@@ -40,7 +40,7 @@ typedef struct {
        
        /* Contains general info on glyphs that doesn't change regardless of the context */
        typedef struct {
       -        unsigned int id;
       +        int id;
                unsigned char *alphamap;
                int w;
                int h;
       t@@ -84,11 +84,11 @@ ltk_text *ltk_init_text(char *font_name);
        
        void ltk_destroy_text_manager(ltk_text *tm);
        
       -ltk_glyph_info *ltk_create_glyph_info(ltk_font *font, unsigned int id, float scale);
       +ltk_glyph_info *ltk_create_glyph_info(ltk_font *font, int id, float scale);
        
        void ltk_destroy_glyph_info(ltk_glyph_info *gi);
        
       -ltk_glyph_info *ltk_get_glyph_info(ltk_font *font, unsigned int id, float scale, khash_t(glyphinfo) *cache);
       +ltk_glyph_info *ltk_get_glyph_info(ltk_font *font, int id, float scale, khash_t(glyphinfo) *cache);
        
        khash_t(glyphinfo) *ltk_get_glyph_cache(ltk_text *tm, uint16_t font_id, uint16_t font_size);
        
   DIR diff --git a/tmp.gui b/tmp.gui
       t@@ -0,0 +1,70 @@
       +grid grd1 create 2 2
       +grid grd1 set-row-weight 0 1
       +grid grd1 set-row-weight 1 1
       +grid grd1 set-column-weight 0 1
       +grid grd1 set-column-weight 1 1
       +set-root-widget grd1
       +draw drw1 create 100 100 #fff
       +grid grd1 add drw1 0 1 1 1 15
       +draw drw1 set-color #000
       +
       +draw drw1 line 0 0 5 5
       +draw drw1 line 5 5 5 5
       +draw drw1 line 10 10 5 5
       +draw drw1 line 15 15 5 5
       +draw drw1 line 20 20 5 5
       +draw drw1 line 25 25 5 5
       +draw drw1 line 30 30 5 5
       +draw drw1 line 35 35 5 5
       +draw drw1 line 40 40 5 5
       +draw drw1 line 45 45 5 5
       +draw drw1 line 50 50 5 5
       +draw drw1 line 55 55 5 5
       +draw drw1 line 60 60 5 5
       +draw drw1 line 65 65 5 5
       +draw drw1 line 70 70 5 5
       +draw drw1 line 75 75 5 5
       +draw drw1 line 80 80 5 5
       +draw drw1 line 85 85 5 5
       +draw drw1 line 90 90 5 5
       +draw drw1 line 95 95 5 5
       +draw drw1 line 100 100 5 5
       +draw drw1 line 105 105 5 5
       +draw drw1 line 110 110 5 5
       +draw drw1 line 115 115 5 5
       +draw drw1 line 120 120 5 5
       +draw drw1 line 125 125 5 5
       +draw drw1 line 130 130 5 5
       +draw drw1 line 135 135 5 5
       +draw drw1 line 140 140 5 5
       +draw drw1 line 145 145 5 5
       +draw drw1 line 150 150 5 5
       +draw drw1 line 155 155 5 5
       +draw drw1 line 160 160 5 5
       +draw drw1 line 165 165 5 5
       +draw drw1 line 170 170 5 5
       +draw drw1 line 175 175 5 5
       +draw drw1 line 180 180 5 5
       +draw drw1 line 185 185 5 5
       +draw drw1 line 190 190 5 5
       +draw drw1 line 195 195 5 5
       +draw drw1 line 200 200 5 5
       +draw drw1 line 205 205 5 5
       +draw drw1 line 210 210 5 5
       +draw drw1 line 215 215 5 5
       +draw drw1 line 220 220 5 5
       +draw drw1 line 225 225 5 5
       +draw drw1 line 230 230 5 5
       +draw drw1 line 235 235 5 5
       +draw drw1 line 240 240 5 5
       +draw drw1 line 245 245 5 5
       +draw drw1 line 250 250 5 5
       +draw drw1 line 255 255 5 5
       +draw drw1 line 260 260 5 5
       +draw drw1 line 265 265 5 5
       +draw drw1 line 270 270 5 5
       +draw drw1 line 275 275 5 5
       +draw drw1 line 280 280 5 5
       +draw drw1 line 285 285 5 5
       +draw drw1 line 290 290 5 5
       +draw drw1 line 295 295 5 5