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"
26 #include "player_command.h"
29 #include <mpd/client.h>
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;
46 hscroll_init(&p
->hscroll
, p
->window
.w
, options
.scroll_sep
);
48 p
->prev_status
= NULL
;
54 status_bar_deinit(struct status_bar
*p
)
60 hscroll_clear(&p
->hscroll
);
65 status_bar_clear_message(struct status_bar
*p
)
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
;
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
,
89 mpd_status_get_kbit_rate(status
));
94 #endif /* !NCMPC_MINI */
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];
104 p
->prev_status
= status
;
108 if (p
->message_source_id
!= 0)
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
;
123 case MPD_STATE_PAUSE
:
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) {
146 static const char bitrate
[1];
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
158 /* display bitrate if visible-bitrate is true */
160 format_bitrate(bitrate
, sizeof(bitrate
), status
);
163 /* write out the time */
164 format_duration_short(elapsed_string
,
165 sizeof(elapsed_string
),
167 format_duration_short(duration_string
,
168 sizeof(duration_string
),
171 g_snprintf(buffer
, sizeof(buffer
), "%s [%s/%s]",
172 bitrate
, elapsed_string
, duration_string
);
175 format_bitrate(buffer
, sizeof(buffer
), status
);
182 if (options
.display_time
) {
186 strftime(buffer
, sizeof(buffer
), "%X ",localtime(&timep
));
193 if (state
== MPD_STATE_PLAY
|| state
== MPD_STATE_PAUSE
) {
194 char songname
[p
->window
.cols
* 4 + 1];
196 int width
= COLS
- x
- utf8_width(buffer
);
200 strfsong(songname
, sizeof(songname
),
201 options
.status_format
, song
);
205 colors_use(w
, COLOR_STATUS
);
206 /* scroll if the song name is to long */
208 if (options
.scroll
&& utf8_width(songname
) > (unsigned)width
) {
209 hscroll_set(&p
->hscroll
, x
, 0, width
, songname
);
210 hscroll_draw(&p
->hscroll
);
213 hscroll_clear(&p
->hscroll
);
214 mvwaddstr(w
, 0, x
, songname
);
217 mvwaddstr(w
, 0, x
, songname
);
220 } else if (options
.scroll
) {
221 hscroll_clear(&p
->hscroll
);
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
);
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
);
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
);
255 status_bar_message(struct status_bar
*p
, const char *msg
)
257 WINDOW
*w
= p
->window
.w
;
261 hscroll_clear(&p
->hscroll
);
266 colors_use(w
, COLOR_STATUS_ALERT
);
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
);