commit 1e8ddcfae89e504b4106c3cc213b1e81e9ebca7d
parent c25f7ed3099b6026f5e0c169e30a8a28719d5633
Author: lumidify <nobody@lumidify.org>
Date:   Sat, 23 Jan 2021 16:42:31 +0100
Make scrollbar simpler so it works somewhat at least because I don't want to fight with it at the moment
Diffstat:
| M | scrollbar.c |  |  | 39 | +++++++++++++++++++++++++++++++-------- | 
1 file changed, 31 insertions(+), 8 deletions(-)
diff --git a/scrollbar.c b/scrollbar.c
@@ -159,18 +159,40 @@ ltk_scrollbar_draw(ltk_scrollbar *scrollbar, ltk_rect clip) {
 }
 
 static int
-ltk_scrollbar_mouse_press(ltk_scrollbar *scrollbar, XEvent event) {
-	if (event.xbutton.button != 1)
-		return 1;
-	scrollbar->last_mouse_x = scrollbar->widget.rect.x;
-	scrollbar->last_mouse_y = scrollbar->widget.rect.y;
-	scrollbar->cur_pos = 0;
-	ltk_scrollbar_motion_notify(scrollbar, event);
-	return 1;
+ltk_scrollbar_mouse_press(ltk_scrollbar *sc, XEvent event) {
+	int max_pos;
+	double rel_pos;
+	if (event.xbutton.button != 1 && event.xbutton.button != 3)
+		return 0;
+	if (sc->orient == LTK_HORIZONTAL) {
+		rel_pos = (event.xbutton.x - sc->widget.rect.x)  / (double)sc->widget.rect.w;
+		max_pos = sc->virtual_size > sc->widget.rect.w ? sc->virtual_size - sc->widget.rect.w : 0;
+	} else {
+		rel_pos = (event.xbutton.y - sc->widget.rect.y) / (double)sc->widget.rect.h;
+		max_pos = sc->virtual_size > sc->widget.rect.h ? sc->virtual_size - sc->widget.rect.h : 0;
+	}
+	/* On right click, move the scrollbar left/up by 30% of the total size times how far
+	   away the click is from the right/bottom.
+	   On left click, move the scrollbar right/down by 30% of the total size times how far
+	   away the click is from the left/top. */
+	if (event.xbutton.button == 1) {
+		sc->cur_pos += rel_pos * sc->virtual_size * 0.3;
+	} else if (event.xbutton.button == 3) {
+		sc->cur_pos -= (1 - rel_pos) * sc->virtual_size * 0.3;
+	}
+		
+	if (sc->cur_pos < 0)
+		sc->cur_pos = 0;
+	else if (sc->cur_pos > max_pos)
+		sc->cur_pos = max_pos;
+	sc->callback(sc->callback_data);
+	return 0;
 }
 
+/* FIXME: Make this scrollbar more "traditional" */
 static int
 ltk_scrollbar_motion_notify(ltk_scrollbar *sc, XEvent event) {
+	/*
 	double scale;
 	int delta, max_pos;
 	if (sc->widget.state != LTK_PRESSED)
@@ -193,6 +215,7 @@ ltk_scrollbar_motion_notify(ltk_scrollbar *sc, XEvent event) {
 	sc->last_mouse_y = event.xbutton.y;
 	if (delta > 0)
 		sc->callback(sc->callback_data);
+	*/
 	return 1;
 }