screen: remove redundant #ifndef
[ncmpc.git] / src / status_bar.c
blobef25707ad202e020912294e3163d9bcd9042fff1
1 /* ncmpc (Ncurses MPD Client)
2 * (c) 2004-2017 The Music Player Daemon Project
3 * Project homepage: http://musicpd.org
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 #include "status_bar.h"
21 #include "options.h"
22 #include "colors.h"
23 #include "i18n.h"
24 #include "charset.h"
25 #include "strfsong.h"
26 #include "player_command.h"
27 #include "utils.h"
29 #include <mpd/client.h>
31 #include <assert.h>
32 #include <string.h>
34 void
35 status_bar_init(struct status_bar *p, unsigned width, int y, int x)
37 window_init(&p->window, 1, width, y, x);
39 leaveok(p->window.w, false);
40 keypad(p->window.w, true);
42 p->message_source_id = 0;
44 #ifndef NCMPC_MINI
45 if (options.scroll)
46 hscroll_init(&p->hscroll, p->window.w, options.scroll_sep);
48 p->prev_status = NULL;
49 p->prev_song = NULL;
50 #endif
53 void
54 status_bar_deinit(struct status_bar *p)
56 delwin(p->window.w);
58 #ifndef NCMPC_MINI
59 if (options.scroll)
60 hscroll_clear(&p->hscroll);
61 #endif
64 void
65 status_bar_clear_message(struct status_bar *p)
67 assert(p != NULL);
69 if (p->message_source_id != 0) {
70 g_source_remove(p->message_source_id);
71 p->message_source_id = 0;
74 WINDOW *w = p->window.w;
76 wmove(w, 0, 0);
77 wclrtoeol(w);
78 wrefresh(w);
81 #ifndef NCMPC_MINI
83 static void
84 format_bitrate(char *p, size_t max_length, const struct mpd_status *status)
86 if (options.visible_bitrate && mpd_status_get_kbit_rate(status) > 0)
87 g_snprintf(p, max_length,
88 " [%d kbps]",
89 mpd_status_get_kbit_rate(status));
90 else
91 p[0] = '\0';
94 #endif /* !NCMPC_MINI */
96 void
97 status_bar_paint(struct status_bar *p, const struct mpd_status *status,
98 const struct mpd_song *song)
100 WINDOW *w = p->window.w;
101 char buffer[p->window.cols * 4 + 1];
103 #ifndef NCMPC_MINI
104 p->prev_status = status;
105 p->prev_song = song;
106 #endif
108 if (p->message_source_id != 0)
109 return;
111 wmove(w, 0, 0);
112 wclrtoeol(w);
113 colors_use(w, COLOR_STATUS_BOLD);
115 enum mpd_state state = status == NULL ? MPD_STATE_UNKNOWN
116 : mpd_status_get_state(status);
118 const char *str = NULL;
119 switch (state) {
120 case MPD_STATE_PLAY:
121 str = _("Playing:");
122 break;
123 case MPD_STATE_PAUSE:
124 str = _("[Paused]");
125 break;
126 case MPD_STATE_STOP:
127 default:
128 break;
131 int x = 0;
132 if (str) {
133 waddstr(w, str);
134 x += utf8_width(str) + 1;
137 /* create time string */
138 if (state == MPD_STATE_PLAY || state == MPD_STATE_PAUSE) {
139 int elapsedTime = seek_id >= 0 &&
140 seek_id == mpd_status_get_song_id(status)
141 ? (unsigned)seek_target_time
142 : mpd_status_get_elapsed_time(status);
143 int total_time = mpd_status_get_total_time(status);
144 if (elapsedTime > 0 || total_time > 0) {
145 #ifdef NCMPC_MINI
146 static const char bitrate[1];
147 #else
148 char bitrate[16];
149 #endif
150 char elapsed_string[32], duration_string[32];
152 /*checks the conf to see whether to display elapsed or remaining time */
153 if (options.display_remaining_time)
154 elapsedTime = elapsedTime < total_time
155 ? total_time - elapsedTime
156 : 0;
158 /* display bitrate if visible-bitrate is true */
159 #ifndef NCMPC_MINI
160 format_bitrate(bitrate, sizeof(bitrate), status);
161 #endif
163 /* write out the time */
164 format_duration_short(elapsed_string,
165 sizeof(elapsed_string),
166 elapsedTime);
167 format_duration_short(duration_string,
168 sizeof(duration_string),
169 total_time);
171 g_snprintf(buffer, sizeof(buffer), "%s [%s/%s]",
172 bitrate, elapsed_string, duration_string);
173 #ifndef NCMPC_MINI
174 } else {
175 format_bitrate(buffer, sizeof(buffer), status);
176 #else
177 buffer[0] = 0;
178 #endif
180 } else {
181 #ifndef NCMPC_MINI
182 if (options.display_time) {
183 time_t timep;
185 time(&timep);
186 strftime(buffer, sizeof(buffer), "%X ",localtime(&timep));
187 } else
188 #endif
189 buffer[0] = 0;
192 /* display song */
193 if (state == MPD_STATE_PLAY || state == MPD_STATE_PAUSE) {
194 char songname[p->window.cols * 4 + 1];
195 #ifndef NCMPC_MINI
196 int width = COLS - x - utf8_width(buffer);
197 #endif
199 if (song)
200 strfsong(songname, sizeof(songname),
201 options.status_format, song);
202 else
203 songname[0] = '\0';
205 colors_use(w, COLOR_STATUS);
206 /* scroll if the song name is to long */
207 #ifndef NCMPC_MINI
208 if (options.scroll && utf8_width(songname) > (unsigned)width) {
209 hscroll_set(&p->hscroll, x, 0, width, songname);
210 hscroll_draw(&p->hscroll);
211 } else {
212 if (options.scroll)
213 hscroll_clear(&p->hscroll);
214 mvwaddstr(w, 0, x, songname);
216 #else
217 mvwaddstr(w, 0, x, songname);
218 #endif
219 #ifndef NCMPC_MINI
220 } else if (options.scroll) {
221 hscroll_clear(&p->hscroll);
222 #endif
225 /* display time string */
226 if (buffer[0] != 0) {
227 x = p->window.cols - strlen(buffer);
228 colors_use(w, COLOR_STATUS_TIME);
229 mvwaddstr(w, 0, x, buffer);
232 wnoutrefresh(w);
235 void
236 status_bar_resize(struct status_bar *p, unsigned width, int y, int x)
238 p->window.cols = width;
239 wresize(p->window.w, 1, width);
240 mvwin(p->window.w, y, x);
243 static gboolean
244 status_bar_clear_message_cb(gpointer data)
246 struct status_bar *p = data;
247 assert(p->message_source_id != 0);
248 p->message_source_id = 0;
250 status_bar_clear_message(p);
251 return false;
254 void
255 status_bar_message(struct status_bar *p, const char *msg)
257 WINDOW *w = p->window.w;
259 #ifndef NCMPC_MINI
260 if (options.scroll)
261 hscroll_clear(&p->hscroll);
262 #endif
264 wmove(w, 0, 0);
265 wclrtoeol(w);
266 colors_use(w, COLOR_STATUS_ALERT);
267 waddstr(w, msg);
268 wnoutrefresh(w);
270 if (p->message_source_id != 0)
271 g_source_remove(p->message_source_id);
272 p->message_source_id = g_timeout_add(options.status_message_time * 1000,
273 status_bar_clear_message_cb, p);