commit dd010d6ac6864d58107799eb3625cdd4660684a1
parent 1e8ddcfae89e504b4106c3cc213b1e81e9ebca7d
Author: lumidify <nobody@lumidify.org>
Date:   Sat, 23 Jan 2021 22:11:29 +0100
Do some more stuff with the scrollbar, but it's still really glitchy
Diffstat:
6 files changed, 44 insertions(+), 17 deletions(-)
diff --git a/box.c b/box.c
@@ -133,7 +133,8 @@ static void
 ltk_recalculate_box(ltk_box *box) {
 	ltk_widget *ptr;
 	ltk_rect *sc_rect = &box->sc->widget.rect;
-	int cur_pos = 0;
+	int offset = box->orient == LTK_HORIZONTAL ? box->widget.rect.x : box->widget.rect.y;
+	int cur_pos = offset;
 	for (size_t i = 0; i < box->num_widgets; i++) {
 		ptr = box->widgets[i];
 		if (box->orient == LTK_HORIZONTAL) {
@@ -164,12 +165,14 @@ ltk_recalculate_box(ltk_box *box) {
 			cur_pos += ptr->rect.h;
 		}
 	}
-	ltk_scrollbar_set_virtual_size(box->sc, cur_pos);
+	ltk_scrollbar_set_virtual_size(box->sc, cur_pos - offset);
 	if (box->orient == LTK_HORIZONTAL) {
+		sc_rect->x = box->widget.rect.x;
 		sc_rect->y = box->widget.rect.y + box->widget.rect.h - sc_rect->h;
 		sc_rect->w = box->widget.rect.w;
 	} else {
 		sc_rect->x = box->widget.rect.x + box->widget.rect.w - sc_rect->w;
+		sc_rect->y = box->widget.rect.y;
 		sc_rect->h = box->widget.rect.h;
 	}
 }
diff --git a/button.c b/button.c
@@ -128,6 +128,10 @@ static void
 ltk_button_draw(ltk_button *button, ltk_rect clip) {
 	ltk_window *window = button->widget.window;
 	ltk_rect rect = button->widget.rect;
+	ltk_rect clip_final = ltk_rect_intersect(clip, rect);
+	/* no idea why it would be less than 0, but whatever */
+	if (clip_final.w <= 0 || clip_final.h <= 0)
+		return;
 	int bw = theme.border_width;
 	LtkColor *border;
 	LtkColor *fill;
@@ -152,21 +156,25 @@ ltk_button_draw(ltk_button *button, ltk_rect clip) {
 		ltk_fatal("No style found for button!\n");
 	}
 	XSetForeground(window->dpy, window->gc, fill->xcolor.pixel);
-	XFillRectangle(window->dpy, window->xwindow, window->gc, rect.x,
-	    rect.y, rect.w, rect.h);
+	XFillRectangle(window->dpy, window->xwindow, window->gc, clip_final.x,
+	    clip_final.y, clip_final.w, clip_final.h);
 	/* FIXME: Why did I do this? */
 	if (bw < 1) return;
+	/* FIXME: Maybe draw to tmp pixmap first, so this can be done properly? */
+	/*
 	XSetForeground(window->dpy, window->gc, border->xcolor.pixel);
 	XSetLineAttributes(window->dpy, window->gc, bw, LineSolid,
 	    CapButt, JoinMiter);
 	XDrawRectangle(window->dpy, window->xwindow, window->gc,
 	    rect.x + bw / 2, rect.y + bw / 2, rect.w - bw, rect.h - bw);
+	*/
 
 	int text_w, text_h;
 	ltk_text_line_get_size(button->tl, &text_w, &text_h);
 	int text_x = rect.x + (rect.w - text_w) / 2;
 	int text_y = rect.y + (rect.h - text_h) / 2;
-	ltk_text_line_draw(button->tl, window->gc, text_x, text_y, clip);
+	/* FIXME: Actually use button->text_pixmap */
+	ltk_text_line_draw(button->tl, window->gc, text_x, text_y, clip_final);
 }
 
 static void
diff --git a/ltkd.c b/ltkd.c
@@ -187,8 +187,8 @@ ltk_mainloop(ltk_window *window) {
 	maxfd = listenfd;
 
 	printf("%d", window->xwindow);
-	fflush(stdout);
-	/*daemonize();*/
+	/*fflush(stdout);*/
+	daemonize();
 
 	while (running) {
 		rfds = rallfds;
diff --git a/test.gui b/test.gui
@@ -1,10 +1,21 @@
-grid grd1 create 2 2
+grid grd1 create 2 1
 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
+box box1 create vertical
+grid grd1 add box1 0 0 1 1 nsew
 button btn1 create "I'm a button!"
-grid grd1 add btn1 0 0 1 1 u
 button btn2 create "I'm also a button!"
-grid grd1 add btn2 1 0 1 2 ew
+button btn3 create "I'm another boring button."
+box box1 add btn1 ew
+box box1 add btn2 e
+box box1 add btn3
+box box2 create vertical
+grid grd1 add box2 1 0 1 1 nsew
+button btn4 create "2 I'm a button!"
+button btn5 create "2 I'm also a button!"
+button btn6 create "2 I'm another boring button."
+box box2 add btn4 ew
+box box2 add btn5 e
+box box2 add btn6
diff --git a/text_line.c b/text_line.c
@@ -42,7 +42,7 @@ void ltk_text_line_destroy(LtkTextLine *tl);
 
 static void ltk_text_line_create_glyphs(struct ltk_text_line *tl);
 static void ltk_text_line_draw_glyph(ltk_glyph *glyph, int xoff, int yoff,
-    XImage *img, XColor fg, ltk_rect clip);
+    XImage *img, XColor fg);
 static XImage *ltk_create_ximage(Display *dpy, int w, int h, int depth,
     XColor bg);
 
@@ -68,7 +68,7 @@ ltk_create_ximage(Display *dpy, int w, int h, int depth, XColor bg) {
 
 /* based on http://codemadness.org/git/dwm-font/file/drw.c.html#l315 */
 static void
-ltk_text_line_draw_glyph(ltk_glyph *glyph, int xoff, int yoff, XImage *img, XColor fg, ltk_rect clip) {
+ltk_text_line_draw_glyph(ltk_glyph *glyph, int xoff, int yoff, XImage *img, XColor fg) {
 	int x = glyph->x + xoff;
 	int y = glyph->y + yoff;
 	double a;
@@ -95,8 +95,7 @@ ltk_text_line_render(
 	GC gc,
 	Colormap colormap,
 	XColor fg,
-	XColor bg,
-	ltk_rect clip)
+	XColor bg)
 {
 	ltk_glyph *glyph;
 
@@ -106,7 +105,7 @@ ltk_text_line_render(
 	/* FIXME: pass old image; if it has same dimensions, just clear it */
 	XImage *img = ltk_create_ximage(dpy, tl->w, tl->h, depth, bg);
 	for (int i = 0; i < tl->glyph_len; i++) {
-		ltk_text_line_draw_glyph(&tl->glyphs[i], -tl->x_min, -tl->y_min, img, fg, clip);
+		ltk_text_line_draw_glyph(&tl->glyphs[i], -tl->x_min, -tl->y_min, img, fg);
 	}
 	return img;
 }
diff --git a/text_stb.c b/text_stb.c
@@ -535,7 +535,13 @@ ltk_text_line_render(
 /* FIXME: error checking if img is rendered yet, tm initialized, etc. */
 void
 ltk_text_line_draw(LtkTextLine *tl, GC gc, int x, int y, ltk_rect clip) {
-	XPutImage(tm.dpy, tl->window, gc, tl->img, 0, 0, x, y, tl->w, tl->h);
+	int xoff = clip.x - x;
+	int yoff = clip.y - y;
+	xoff = xoff >= 0 ? xoff : 0;
+	yoff = yoff >= 0 ? yoff : 0;
+	int w = clip.w > tl->w - xoff ? tl->w - xoff : clip.w;
+	int h = clip.h > tl->h - yoff ? tl->h - yoff : clip.h;
+	XPutImage(tm.dpy, tl->window, gc, tl->img, xoff, yoff, x + xoff, y + yoff, w, h);
 }
 
 void