X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fstatus_bar.c;h=c6357f43e6b5f1caab63032d27a96bb30176ab3c;hb=87b0849f4b11cdba6fb453e1da17c5c73d21098d;hp=657008c4eb892c7432b55b67a7cb61de453ee04b;hpb=140da05f051205910e69853be402d5d99eb3d4a0;p=ncmpc.git diff --git a/src/status_bar.c b/src/status_bar.c index 657008c..c6357f4 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-2010 The Music Player Daemon Project * Project homepage: http://musicpd.org * * This program is free software; you can redistribute it and/or modify @@ -42,8 +42,9 @@ status_bar_init(struct status_bar *p, unsigned width, int y, int x) p->message_source_id = 0; #ifndef NCMPC_MINI - hscroll_reset(&p->hscroll); - p->scroll_source_id = 0; + if (options.scroll) + hscroll_init(&p->hscroll, p->window.w, options.scroll_sep); + p->prev_status = NULL; p->prev_song = NULL; #endif @@ -54,24 +55,11 @@ status_bar_deinit(struct status_bar *p) { delwin(p->window.w); - if (p->message_source_id != 0) - g_source_remove(p->message_source_id); -} - #ifndef NCMPC_MINI -static gboolean -scroll_timer_callback(gpointer data) -{ - struct status_bar *p = data; - - p->scroll_source_id = 0; - - hscroll_step(&p->hscroll); - status_bar_paint(p, p->prev_status, p->prev_song); - doupdate(); - return false; -} + if (options.scroll) + hscroll_clear(&p->hscroll); #endif +} static gboolean status_bar_clear_message(gpointer data) @@ -91,18 +79,27 @@ status_bar_clear_message(gpointer data) return false; } +#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]; @@ -141,29 +138,28 @@ status_bar_paint(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) { + 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]; /*checks the conf to see whether to display elapsed or remaining time */ - if (song != NULL && - seek_id == (int)mpd_song_get_id(song)) - elapsedTime = seek_target_time; - else if (options.display_remaining_time) - elapsedTime = total_time - - mpd_status_get_elapsed_time(status); - else - elapsedTime = mpd_status_get_elapsed_time(status); + 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 */ @@ -177,13 +173,11 @@ status_bar_paint(struct status_bar *p, const struct mpd_status *status, g_snprintf(buffer, sizeof(buffer), "%s [%s/%s]", bitrate, elapsed_string, duration_string); #ifndef NCMPC_MINI - } else if (options.visible_bitrate) { - g_snprintf(buffer, sizeof(buffer), - " [%d kbps]", - mpd_status_get_kbit_rate(status)); -#endif } else { + format_bitrate(buffer, sizeof(buffer), status); +#else buffer[0] = 0; +#endif } } else { #ifndef NCMPC_MINI @@ -214,28 +208,19 @@ status_bar_paint(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) { - char *tmp = strscroll(&p->hscroll, songname, - options.scroll_sep, width); - - g_strlcpy(songname, tmp, sizeof(songname)); - g_free(tmp); - - if (p->scroll_source_id == 0) - p->scroll_source_id = - g_timeout_add(1000, - scroll_timer_callback, - p); - } else if (p->scroll_source_id != 0) { - g_source_remove(p->scroll_source_id); - p->scroll_source_id = 0; + 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 (p->scroll_source_id != 0) { - g_source_remove(p->scroll_source_id); - p->scroll_source_id = 0; + } else if (options.scroll) { + hscroll_clear(&p->hscroll); #endif } @@ -262,6 +247,11 @@ 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);