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