seamus

commit 290ec2af182064c9de5508e7be5b43539cb97de0

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

ui: display "buttons" for toggling modes/states

 include/seamus.h | 4 +
 src/ui.c | 135 +++++++++++++++++++++++++++++++++++++++++++++++++


diff --git a/include/seamus.h b/include/seamus.h
index c2f8af6a9e78ab3055055526e4d4caaf1c08cd9a..01ae0a2df5371ae4047dec407f6e1843ec6f8c93 100644
--- a/include/seamus.h
+++ b/include/seamus.h
@@ -50,6 +50,10 @@ 	KEY_GOTO_START,
 	KEY_SWITCH_MODE,
 	KEY_HALF_PAGE_UP,
 	KEY_HALF_PAGE_DOWN,
+	KEY_PLAY_PAUSE,
+	KEY_STOP,
+	KEY_NEXT,
+	KEY_REPEAT,
 };
 
 struct seamus_frontend {




diff --git a/src/ui.c b/src/ui.c
index dffa17824c8a9ba15604d75f2ba3fda5d6d3c691..775735aaf43dc7e3085479bd7fa3981b24072367 100644
--- a/src/ui.c
+++ b/src/ui.c
@@ -14,6 +14,10 @@ static int scroll_page(struct seamus_frontend *seamus, int direction);
 static int scroll_to_extremes(struct seamus_frontend *seamus, int home);
 static int scroll_half_page(struct seamus_frontend *seamus, int direction);
 static int switch_window(struct seamus_frontend *seamus);
+static int toggle_play_pause(struct seamus_frontend *seamus);
+static int stop_playback(struct seamus_frontend *seamus);
+static int next_track(struct seamus_frontend *seamus);
+static int toggle_repeat(struct seamus_frontend *seamus);
 static int update_status(Tickit *t, TickitEventFlags flags, void *_info, void *data);
 static int update_main_window(Tickit *t, TickitEventFlags flags, void *_info, void *data);
 static int render_root(TickitWindow *win, TickitEventFlags flags, void *_info, void *data);
@@ -100,6 +104,10 @@ 	if (strcmp(str, "g") == 0) return KEY_GOTO_START;
 	if (strcmp(str, "Tab") == 0) return KEY_SWITCH_MODE;
 	if (strcmp(str, "C-u") == 0) return KEY_HALF_PAGE_UP;
 	if (strcmp(str, "C-d") == 0) return KEY_HALF_PAGE_DOWN;
+	if (strcmp(str, "p") == 0) return KEY_PLAY_PAUSE;
+	if (strcmp(str, "s") == 0) return KEY_STOP;
+	if (strcmp(str, "n") == 0) return KEY_NEXT;
+	if (strcmp(str, "r") == 0) return KEY_REPEAT;
 	return KEY_NONE;
 }
 
@@ -169,6 +177,26 @@ 	case KEY_SWITCH_MODE:
 		switch_window(seamus);
 		break;
 
+	case KEY_PLAY_PAUSE:
+		log_info("Play/Pause");
+		toggle_play_pause(seamus);
+		break;
+
+	case KEY_STOP:
+		log_info("Stop");
+		stop_playback(seamus);
+		break;
+
+	case KEY_NEXT:
+		log_info("Next");
+		next_track(seamus);
+		break;
+
+	case KEY_REPEAT:
+		log_info("Toggle repeat");
+		toggle_repeat(seamus);
+		break;
+
 	case KEY_NONE:
 	default:
 		log_info("Pressed something else %s", info->str);
@@ -328,6 +356,65 @@ 	return 0;
 }
 
 static int
+toggle_play_pause(struct seamus_frontend *seamus)
+{
+	if (!mpd_run_toggle_pause(seamus->conn)) {
+		log_error("Failed to toggle play/pause");
+		return 1;
+	}
+
+	fetch_current_status(seamus);
+	tickit_window_expose(seamus->main_window, NULL);
+	tickit_window_expose(seamus->status_window, NULL);
+	return 0;
+}
+
+static int
+stop_playback(struct seamus_frontend *seamus)
+{
+	if (!mpd_run_stop(seamus->conn)) {
+		log_error("Failed to stop");
+		return 1;
+	}
+
+	fetch_current_status(seamus);
+	tickit_window_expose(seamus->main_window, NULL);
+	tickit_window_expose(seamus->status_window, NULL);
+
+	return 0;
+}
+
+static int
+next_track(struct seamus_frontend *seamus)
+{
+	if (!mpd_run_next(seamus->conn)) {
+		log_error("Failed to skip to next track");
+		return 1;
+	}
+
+	fetch_current_status(seamus);
+	tickit_window_expose(seamus->main_window, NULL);
+	tickit_window_expose(seamus->status_window, NULL);
+
+	return 0;
+}
+
+static int
+toggle_repeat(struct seamus_frontend *seamus)
+{
+	// TODO: Rig which next mode will it'll be
+	if (!mpd_run_repeat(seamus->conn, !seamus->status->repeat)) {
+		log_error("Failed to toggle repeat");
+		return 1;
+	}
+
+	fetch_current_status(seamus);
+	tickit_window_expose(seamus->status_window, NULL);
+
+	return 0;
+}
+
+static int
 update_status(Tickit *t, TickitEventFlags flags, void *_info, void *data)
 {
 	(void)flags;
@@ -384,10 +471,54 @@ 	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
+	);
+
+	TickitPen *btn_active_pen = tickit_pen_new_attrs(
+		TICKIT_PEN_BG, 2,
+		TICKIT_PEN_FG, 15,
+		TICKIT_PEN_BOLD, 1,
+		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;
+
+	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;
+
+	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;
+
+	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);
+
 	if (r != 0) {
 		log_fatal("We had some trouble");
 
-		tickit_renderbuffer_goto(render_buffer, 0, 0);
+		tickit_renderbuffer_goto(render_buffer, 1, 0);
 		{
 			tickit_renderbuffer_savepen(render_buffer);
 
@@ -402,7 +533,7 @@ 			tickit_renderbuffer_restore(render_buffer);
 		}
 
 	} else {
-		tickit_renderbuffer_goto(render_buffer, 0, 0);
+		tickit_renderbuffer_goto(render_buffer, 1, 0);
 		{
 			tickit_renderbuffer_savepen(render_buffer);