X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fstatus_bar.c;h=fc63d20e49e0d4fa4b50df1e5ac9b63e9da523db;hb=b3e29d017a77d1cd34bfde94bd7182422e6d695c;hp=3c167313d7f6674d0234336a4be950ee25abd160;hpb=cf98ad001d01ebce6cebf934027a636056302f7d;p=ncmpc.git diff --git a/src/status_bar.c b/src/status_bar.c index 3c16731..fc63d20 100644 --- a/src/status_bar.c +++ b/src/status_bar.c @@ -1,5 +1,5 @@ /* ncmpc (Ncurses MPD Client) - * (c) 2004-2009 The Music Player Daemon Project + * (c) 2004-2017 The Music Player Daemon Project * Project homepage: http://musicpd.org * * This program is free software; you can redistribute it and/or modify @@ -24,41 +24,98 @@ #include "charset.h" #include "strfsong.h" #include "player_command.h" +#include "time_format.h" + +#include + +#include +#include + +void +status_bar_init(struct status_bar *p, unsigned width, int y, int x) +{ + window_init(&p->window, 1, width, y, x); + + leaveok(p->window.w, false); + keypad(p->window.w, true); + + p->message_source_id = 0; #ifndef NCMPC_MINI -#include "hscroll.h" + if (options.scroll) + hscroll_init(&p->hscroll, p->window.w, options.scroll_sep); + + p->prev_status = NULL; + p->prev_song = NULL; #endif +} -#include +void +status_bar_deinit(struct status_bar *p) +{ + delwin(p->window.w); -#include +#ifndef NCMPC_MINI + if (options.scroll) + hscroll_clear(&p->hscroll); +#endif +} void -status_bar_paint(const struct status_bar *p, const struct mpd_status *status, +status_bar_clear_message(struct status_bar *p) +{ + assert(p != NULL); + + if (p->message_source_id != 0) { + g_source_remove(p->message_source_id); + p->message_source_id = 0; + } + + WINDOW *w = p->window.w; + + wmove(w, 0, 0); + wclrtoeol(w); + wrefresh(w); +} + +#ifndef NCMPC_MINI + +static void +format_bitrate(char *p, size_t max_length, const struct mpd_status *status) +{ + if (options.visible_bitrate && mpd_status_get_kbit_rate(status) > 0) + g_snprintf(p, max_length, + " [%d kbps]", + mpd_status_get_kbit_rate(status)); + else + p[0] = '\0'; +} + +#endif /* !NCMPC_MINI */ + +void +status_bar_paint(struct status_bar *p, const struct mpd_status *status, const struct mpd_song *song) { WINDOW *w = p->window.w; - enum mpd_state state; - int elapsedTime = 0; -#ifdef NCMPC_MINI - static char bitrate[1]; -#else - char bitrate[16]; -#endif - const char *str = NULL; - int x = 0; char buffer[p->window.cols * 4 + 1]; - if (time(NULL) - p->message_timestamp <= options.status_message_time) +#ifndef NCMPC_MINI + p->prev_status = status; + p->prev_song = song; +#endif + + if (p->message_source_id != 0) return; wmove(w, 0, 0); wclrtoeol(w); colors_use(w, COLOR_STATUS_BOLD); - state = status == NULL ? MPD_STATE_UNKNOWN + enum mpd_state state = status == NULL ? MPD_STATE_UNKNOWN : mpd_status_get_state(status); + const char *str = NULL; switch (state) { case MPD_STATE_PLAY: str = _("Playing:"); @@ -71,6 +128,7 @@ status_bar_paint(const struct status_bar *p, const struct mpd_status *status, break; } + int x = 0; if (str) { waddstr(w, str); x += utf8_width(str) + 1; @@ -78,61 +136,49 @@ status_bar_paint(const struct status_bar *p, const struct mpd_status *status, /* create time string */ if (state == MPD_STATE_PLAY || state == MPD_STATE_PAUSE) { + int elapsedTime = seek_id >= 0 && + seek_id == mpd_status_get_song_id(status) + ? (unsigned)seek_target_time + : mpd_status_get_elapsed_time(status); int total_time = mpd_status_get_total_time(status); - if (total_time > 0) { - /*checks the conf to see whether to display elapsed or remaining time */ - if(!strcmp(options.timedisplay_type,"elapsed")) - elapsedTime = mpd_status_get_elapsed_time(status); - else if(!strcmp(options.timedisplay_type,"remaining")) - elapsedTime = total_time - - mpd_status_get_elapsed_time(status); + if (elapsedTime > 0 || total_time > 0) { +#ifdef NCMPC_MINI + static const char bitrate[1]; +#else + char bitrate[16]; +#endif + char elapsed_string[32], duration_string[32]; - if (song != NULL && - seek_id == (int)mpd_song_get_id(song)) - elapsedTime = seek_target_time; + /*checks the conf to see whether to display elapsed or remaining time */ + if (options.display_remaining_time) + elapsedTime = elapsedTime < total_time + ? total_time - elapsedTime + : 0; /* display bitrate if visible-bitrate is true */ #ifndef NCMPC_MINI - if (options.visible_bitrate) { - g_snprintf(bitrate, 16, - " [%d kbps]", - mpd_status_get_kbit_rate(status)); - } else { - bitrate[0] = '\0'; - } + format_bitrate(bitrate, sizeof(bitrate), status); #endif - /*write out the time, using hours if time over 60 minutes*/ - if (total_time > 3600) { - g_snprintf(buffer, sizeof(buffer), - "%s [%i:%02i:%02i/%i:%02i:%02i]", - bitrate, elapsedTime/3600, (elapsedTime%3600)/60, elapsedTime%60, - total_time / 3600, - (total_time % 3600)/60, - total_time % 60); - } else { - g_snprintf(buffer, sizeof(buffer), - "%s [%i:%02i/%i:%02i]", - bitrate, elapsedTime/60, elapsedTime%60, - total_time / 60, total_time % 60); - } + /* write out the time */ + format_duration_short(elapsed_string, + sizeof(elapsed_string), + elapsedTime); + format_duration_short(duration_string, + sizeof(duration_string), + total_time); + + g_snprintf(buffer, sizeof(buffer), "%s [%s/%s]", + bitrate, elapsed_string, duration_string); #ifndef NCMPC_MINI } else { - g_snprintf(buffer, sizeof(buffer), - " [%d kbps]", - mpd_status_get_kbit_rate(status)); + format_bitrate(buffer, sizeof(buffer), status); +#else + buffer[0] = 0; #endif } -#ifndef NCMPC_MINI } else { - if (options.display_time) { - time_t timep; - - time(&timep); - strftime(buffer, sizeof(buffer), "%X ",localtime(&timep)); - } else - buffer[0] = 0; -#endif + buffer[0] = 0; } /* display song */ @@ -152,15 +198,20 @@ status_bar_paint(const struct status_bar *p, const struct mpd_status *status, /* scroll if the song name is to long */ #ifndef NCMPC_MINI if (options.scroll && utf8_width(songname) > (unsigned)width) { - static scroll_state_t st = { 0, 0 }; - char *tmp = strscroll(songname, options.scroll_sep, width, &st); - - g_strlcpy(songname, tmp, sizeof(songname)); - g_free(tmp); + hscroll_set(&p->hscroll, x, 0, width, songname); + hscroll_draw(&p->hscroll); + } else { + if (options.scroll) + hscroll_clear(&p->hscroll); + mvwaddstr(w, 0, x, songname); } -#endif - //mvwaddnstr(w, 0, x, songname, width); +#else mvwaddstr(w, 0, x, songname); +#endif +#ifndef NCMPC_MINI + } else if (options.scroll) { + hscroll_clear(&p->hscroll); +#endif } /* display time string */ @@ -181,16 +232,35 @@ status_bar_resize(struct status_bar *p, unsigned width, int y, int x) mvwin(p->window.w, y, x); } +static gboolean +status_bar_clear_message_cb(gpointer data) +{ + struct status_bar *p = data; + assert(p->message_source_id != 0); + p->message_source_id = 0; + + status_bar_clear_message(p); + return false; +} + void status_bar_message(struct status_bar *p, const char *msg) { WINDOW *w = p->window.w; +#ifndef NCMPC_MINI + if (options.scroll) + hscroll_clear(&p->hscroll); +#endif + wmove(w, 0, 0); wclrtoeol(w); colors_use(w, COLOR_STATUS_ALERT); waddstr(w, msg); wnoutrefresh(w); - p->message_timestamp = time(NULL); + if (p->message_source_id != 0) + g_source_remove(p->message_source_id); + p->message_source_id = g_timeout_add_seconds(options.status_message_time, + status_bar_clear_message_cb, p); }