seamus

commit 378cb18f3bb51672b80c43d27c5cbfef95b72437

Author: Pedro Lucas Porcellis <porcellis@eletrotupi.com>

ui: draw boxes around each button and fix padding on the status bar

 src/ui.c | 114 +++++++++++++++++++++++++++++++++++----------------------


diff --git a/src/ui.c b/src/ui.c
index 775735aaf43dc7e3085479bd7fa3981b24072367..70f2e6d27a4e24dd90690c8c97c7d77af5b143b1 100644
--- a/src/ui.c
+++ b/src/ui.c
@@ -41,12 +41,12 @@
 	s->t = t;
 
 	TickitWindow *main_window = tickit_window_new(root, (TickitRect){
-		.top = 2, .left = 2, .lines = tickit_window_lines(root) - 6,
+		.top = 2, .left = 2, .lines = tickit_window_lines(root) - 7,
 		.cols = tickit_window_cols(root) - 2
 	}, 0);
 
 	TickitWindow *status_window = tickit_window_new(root, (TickitRect){
-		.top = tickit_window_lines(root) - 5 + 2, .left = 2, .lines = 5,
+		.top = tickit_window_lines(root) - 5, .left = 2, .lines = 5,
 		.cols = tickit_window_cols(root) - 2
 	}, 0);
 
@@ -458,6 +458,50 @@
 	return 1;
 }
 
+static void
+draw_button(TickitRenderBuffer *rb, int row, int col, const char *label, int active)
+{
+	TickitPen *pen = tickit_pen_new_attrs(
+		TICKIT_PEN_BG, active ? 2 : 8,
+		TICKIT_PEN_FG, 15,
+		TICKIT_PEN_BOLD, 1,
+		0
+	);
+
+	/*
+	 * Box-drawing characters from Unicode block U+2500-U+257F.
+	 * To produce the same UTF-8 bytes for a character,
+	 * spit that into either python or coreutils:
+	 *
+	 *     printf '\u250C' | xxd | head -c9   => "e2 94 8c"
+	 *
+	 * Or use python:      python3 -c "print('\u250c'.encode('utf-8').hex())"
+	 * Or look up in any Unicode table under "Box Drawing"
+	 *
+	 * ┌───┐   (U+250C + U+2500×3 + U+2510)
+	 * │ P │   (U+2502 + <interior> + U+2502)
+	 * └───┘   (U+2514 + U+2500×3 + U+2518)
+	 */
+
+	tickit_renderbuffer_goto(rb, row, col);
+	tickit_renderbuffer_text(rb, "\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90");
+
+	tickit_renderbuffer_goto(rb, row + 1, col);
+	tickit_renderbuffer_text(rb, "\xe2\x94\x82");
+
+	tickit_renderbuffer_savepen(rb);
+	tickit_renderbuffer_setpen(rb, pen);
+	tickit_renderbuffer_text(rb, " ");
+	tickit_renderbuffer_text(rb, label);
+	tickit_renderbuffer_text(rb, " ");
+	tickit_renderbuffer_restore(rb);
+
+	tickit_renderbuffer_text(rb, "\xe2\x94\x82");
+
+	tickit_renderbuffer_goto(rb, row + 2, col);
+	tickit_renderbuffer_text(rb, "\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98");
+}
+
 static int
 render_status_window(TickitWindow *win, TickitEventFlags flags, void *_info, void *data)
 {
@@ -471,77 +515,57 @@ 	tickit_renderbuffer_eraserect(render_buffer, &info->rect);
 
 	int r = fetch_current_status(seamus);
 
-	TickitPen *btn_pen = tickit_pen_new_attrs(
-		TICKIT_PEN_BG, 8,
-		TICKIT_PEN_FG, 15,
-		TICKIT_PEN_BOLD, 1,
-		0
-	);
+	const char *pause_desc =
+		seamus->status->state == MPD_STATE_PLAY ? "Pause" : "Play";
 
-	TickitPen *btn_active_pen = tickit_pen_new_attrs(
-		TICKIT_PEN_BG, 2,
-		TICKIT_PEN_FG, 15,
-		TICKIT_PEN_BOLD, 1,
-		0
-	);
+	/* → is U+2192 RIGHTWARDS ARROW; same printf/Unicode-table lookup as above */
+	const char *repeat_desc =
+		seamus->status->repeat ? "\xe2\x86\x92off" : "\xe2\x86\x92on";
 
+	int row = 0;
 	int col = 1;
 
-	tickit_renderbuffer_savepen(render_buffer);
-	tickit_renderbuffer_setpen(render_buffer, btn_pen);
-	tickit_renderbuffer_goto(render_buffer, 0, col);
-	tickit_renderbuffer_text(render_buffer, "[P]");
-	tickit_renderbuffer_restore(render_buffer);
-	col += 5;
+	draw_button(render_buffer, row, col, "P", 0);
+	tickit_renderbuffer_goto(render_buffer, row + 3, col + 1);
+	tickit_renderbuffer_text(render_buffer, pause_desc);
+	col += 7;
 
-	tickit_renderbuffer_savepen(render_buffer);
-	tickit_renderbuffer_setpen(render_buffer, btn_pen);
-	tickit_renderbuffer_goto(render_buffer, 0, col);
-	tickit_renderbuffer_text(render_buffer, "[S]");
-	tickit_renderbuffer_restore(render_buffer);
-	col += 5;
+	draw_button(render_buffer, row, col, "S", 0);
+	tickit_renderbuffer_goto(render_buffer, row + 3, col + 1);
+	tickit_renderbuffer_text(render_buffer, "Stop");
+	col += 7;
 
-	tickit_renderbuffer_savepen(render_buffer);
-	tickit_renderbuffer_setpen(render_buffer, btn_pen);
-	tickit_renderbuffer_goto(render_buffer, 0, col);
-	tickit_renderbuffer_text(render_buffer, "[N]");
-	tickit_renderbuffer_restore(render_buffer);
-	col += 5;
+	draw_button(render_buffer, row, col, "N", 0);
+	tickit_renderbuffer_goto(render_buffer, row + 3, col + 1);
+	tickit_renderbuffer_text(render_buffer, "Next");
+	col += 7;
 
-	TickitPen *r_pen = seamus->status->repeat ? btn_active_pen : btn_pen;
-	tickit_renderbuffer_savepen(render_buffer);
-	tickit_renderbuffer_setpen(render_buffer, r_pen);
-	tickit_renderbuffer_goto(render_buffer, 0, col);
-	tickit_renderbuffer_text(render_buffer, "[R]");
-	tickit_renderbuffer_restore(render_buffer);
+	draw_button(render_buffer, row, col, "R", seamus->status->repeat);
+	tickit_renderbuffer_goto(render_buffer, row + 3, col + 1);
+	tickit_renderbuffer_text(render_buffer, repeat_desc);
 
 	if (r != 0) {
 		log_fatal("We had some trouble");
 
-		tickit_renderbuffer_goto(render_buffer, 1, 0);
+		tickit_renderbuffer_goto(render_buffer, 4, 0);
 		{
 			tickit_renderbuffer_savepen(render_buffer);
-
 			TickitPen *pen = tickit_pen_new_attrs(
 					TICKIT_PEN_FG, 1,
 					TICKIT_PEN_BOLD, 1,
 					0);
-
 			tickit_renderbuffer_setpen(render_buffer, pen);
 			tickit_renderbuffer_text(render_buffer, "We had some error fetching the status");
 			tickit_renderbuffer_restore(render_buffer);
 		}
-
 	} else {
-		tickit_renderbuffer_goto(render_buffer, 1, 0);
+		tickit_renderbuffer_goto(render_buffer, 4, 0);
 		{
 			tickit_renderbuffer_savepen(render_buffer);
-
 			TickitPen *pen = tickit_pen_new_attrs(
 					TICKIT_PEN_FG, 4,
 					TICKIT_PEN_BOLD, 1,
 					0);
-
 			tickit_renderbuffer_setpen(render_buffer, pen);
 			tickit_renderbuffer_text(render_buffer, seamus->status->description);
 			tickit_renderbuffer_restore(render_buffer);