commit 99e3c74d38ba3e85b623b73d4f16d8c9d6bf0506
parent a664daed365f583f4a5dc42b31f2f80ceeb83b4d
Author: lumidify <nobody@lumidify.org>
Date:   Sat,  6 Jun 2020 22:06:57 +0200
Fix some stuff
Diffstat:
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