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);