ltk

Socket-based GUI for X11 (WIP)
git clone git://lumidify.org/ltk.git (fast, but not encrypted)
git clone https://lumidify.org/git/ltk.git (encrypted, but very slow)
Log | Files | Refs | README | LICENSE

commit 99e3c74d38ba3e85b623b73d4f16d8c9d6bf0506
parent a664daed365f583f4a5dc42b31f2f80ceeb83b4d
Author: lumidify <nobody@lumidify.org>
Date:   Sat,  6 Jun 2020 22:06:57 +0200

Fix some stuff

Diffstat:
Mdraw.c | 24++++++++++++++++++++----
Mltk.c | 39++++++++++++++++++---------------------
Atest_anim.sh | 19+++++++++++++++++++
Mtext_common.c | 4++--
Mtext_common.h | 6+++---
Atmp.gui | 70++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
6 files changed, 132 insertions(+), 30 deletions(-)

diff --git a/draw.c b/draw.c @@ -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 @@ -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 diff --git a/ltk.c b/ltk.c @@ -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 @@ -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; } @@ -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) { @@ -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; diff --git a/test_anim.sh b/test_anim.sh @@ -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 diff --git a/text_common.c b/text_common.c @@ -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"); @@ -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; diff --git a/text_common.h b/text_common.h @@ -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; @@ -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); diff --git a/tmp.gui b/tmp.gui @@ -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