diff options
Diffstat (limited to 'player')
-rw-r--r-- | player/command.c | 2 | ||||
-rw-r--r-- | player/core.h | 5 | ||||
-rw-r--r-- | player/main.c | 2 | ||||
-rw-r--r-- | player/misc.c | 6 | ||||
-rw-r--r-- | player/osd.c | 104 | ||||
-rw-r--r-- | player/playloop.c | 6 |
6 files changed, 63 insertions, 62 deletions
diff --git a/player/command.c b/player/command.c index f6f3e43a63..6ee50dea87 100644 --- a/player/command.c +++ b/player/command.c @@ -3058,7 +3058,7 @@ void run_command(MPContext *mpctx, mp_cmd_t *cmd) case MP_CMD_RUN: { #ifndef __MINGW32__ - mp_msg(mpctx->statusline, MSGL_STATUS, "\n"); + mp_msg_flush_status_line(mpctx->global); char *args[MP_CMD_MAX_ARGS + 1] = {0}; for (int n = 0; n < cmd->nargs; n++) args[n] = cmd->args[n].v.s; diff --git a/player/core.h b/player/core.h index 3285e4848d..271f96595b 100644 --- a/player/core.h +++ b/player/core.h @@ -160,7 +160,9 @@ typedef struct MPContext { struct input_ctx *input; struct osd_state *osd; struct mp_osd_msg *osd_msg_stack; - char *terminal_osd_text; + char *term_osd_text; + char *term_osd_status; + char *term_osd_contents; char *last_window_title; int add_osd_seek_info; // bitfield of enum mp_osd_seek_info @@ -408,7 +410,6 @@ void update_window_title(struct MPContext *mpctx, bool force); void stream_dump(struct MPContext *mpctx); // osd.c -void write_status_line(struct MPContext *mpctx, const char *line); void print_status(struct MPContext *mpctx); void set_osd_bar(struct MPContext *mpctx, int type, const char* name, double min, double max, double val); diff --git a/player/main.c b/player/main.c index afb3db46ea..ff9f7b732a 100644 --- a/player/main.c +++ b/player/main.c @@ -287,7 +287,7 @@ static int mpv_main(int argc, char *argv[]) struct MPContext *mpctx = talloc(NULL, MPContext); *mpctx = (struct MPContext){ .last_dvb_step = 1, - .terminal_osd_text = talloc_strdup(mpctx, ""), + .term_osd_contents = talloc_strdup(mpctx, ""), .playlist = talloc_struct(mpctx, struct playlist, {0}), }; diff --git a/player/misc.c b/player/misc.c index eb8c0c147e..700def3ae4 100644 --- a/player/misc.c +++ b/player/misc.c @@ -170,10 +170,8 @@ void stream_dump(struct MPContext *mpctx) if (!opts->quiet && ((stream->pos / (1024 * 1024)) % 2) == 1) { uint64_t pos = stream->pos - stream->start_pos; uint64_t end = stream->end_pos - stream->start_pos; - char *line = talloc_asprintf(NULL, "Dumping %lld/%lld...", - (long long int)pos, (long long int)end); - write_status_line(mpctx, line); - talloc_free(line); + MP_MSG(mpctx, MSGL_STATUS, "Dumping %lld/%lld...", + (long long int)pos, (long long int)end); } stream_fill_buffer(stream); for (;;) { diff --git a/player/osd.c b/player/osd.c index 93340d78c2..7999847720 100644 --- a/player/osd.c +++ b/player/osd.c @@ -56,44 +56,67 @@ static void sadd_percentage(char **buf, int percent) { *buf = talloc_asprintf_append(*buf, " (%d%%)", percent); } -static int get_term_width(void) +static char *join_lines(void *ta_ctx, char **parts, int num_parts) { - get_screen_size(); - int width = screen_width > 0 ? screen_width : 80; -#if defined(__MINGW32__) || defined(__CYGWIN__) - /* Windows command line is broken (MinGW's rxvt works, but we - * should not depend on that). */ - width--; -#endif - return width; + char *res = talloc_strdup(ta_ctx, ""); + for (int n = 0; n < num_parts; n++) + res = talloc_asprintf_append(res, "%s%s", n ? "\n" : "", parts[n]); + return res; } -void write_status_line(struct MPContext *mpctx, const char *line) +static void term_osd_update(struct MPContext *mpctx) { - struct MPOpts *opts = mpctx->opts; - if (opts->slave_mode) { - mp_msg(mpctx->statusline, MSGL_STATUS, "%s\n", line); - } else if (erase_to_end_of_line) { - mp_msg(mpctx->statusline, MSGL_STATUS, "%s%s\r", line, erase_to_end_of_line); + int num_parts = 0; + char *parts[2] = {0}; + + if (mpctx->term_osd_text && mpctx->term_osd_text[0]) + parts[num_parts++] = mpctx->term_osd_text; + if (mpctx->term_osd_status && mpctx->term_osd_status[0]) + parts[num_parts++] = mpctx->term_osd_status; + + char *s = join_lines(mpctx, parts, num_parts); + + if (strcmp(mpctx->term_osd_contents, s) == 0 && + mp_msg_has_status_line(mpctx->global)) + { + talloc_free(s); } else { - int pos = strlen(line); - int width = get_term_width() - pos; - mp_msg(mpctx->statusline, MSGL_STATUS, "%s%*s\r", line, width, ""); + talloc_free(mpctx->term_osd_contents); + mpctx->term_osd_contents = s; + mp_msg(mpctx->statusline, MSGL_STATUS, "%s", s); } } +static void term_osd_set_text(struct MPContext *mpctx, const char *text) +{ + if (mpctx->video_out && mpctx->opts->term_osd != 1) + text = ""; // disable + talloc_free(mpctx->term_osd_text); + mpctx->term_osd_text = talloc_strdup(mpctx, text); + term_osd_update(mpctx); +} + +static void term_osd_set_status(struct MPContext *mpctx, const char *text) +{ + talloc_free(mpctx->term_osd_status); + mpctx->term_osd_status = talloc_strdup(mpctx, text); + term_osd_update(mpctx); +} + void print_status(struct MPContext *mpctx) { struct MPOpts *opts = mpctx->opts; update_window_title(mpctx, false); - if (opts->quiet) + if (opts->quiet) { + term_osd_set_status(mpctx, ""); return; + } if (opts->status_msg) { char *r = mp_property_expand_string(mpctx, opts->status_msg); - write_status_line(mpctx, r); + term_osd_set_status(mpctx, r); talloc_free(r); return; } @@ -160,7 +183,7 @@ void print_status(struct MPContext *mpctx) saddf(&line, " Cache: %d%%", cache); // end - write_status_line(mpctx, line); + term_osd_set_status(mpctx, line); talloc_free(line); } @@ -477,22 +500,13 @@ void update_osd_msg(struct MPContext *mpctx) double pos = get_current_pos_ratio(mpctx, false); update_osd_bar(mpctx, OSD_BAR_SEEK, 0, 1, MPCLAMP(pos, 0, 1)); + print_status(mpctx); + // Look if we have a msg mp_osd_msg_t *msg = get_osd_msg(mpctx); if (msg && !msg->show_position) { - if (mpctx->video_out && opts->term_osd != 1) { - osd_set_text(osd, msg->msg); - } else if (opts->term_osd) { - if (strcmp(mpctx->terminal_osd_text, msg->msg)) { - talloc_free(mpctx->terminal_osd_text); - mpctx->terminal_osd_text = talloc_strdup(mpctx, msg->msg); - // Multi-line message => clear what will be the second line - write_status_line(mpctx, ""); - mp_msg(mpctx->statusline, MSGL_STATUS, - "%s%s\n", opts->term_osd_esc, mpctx->terminal_osd_text); - print_status(mpctx); - } - } + osd_set_text(osd, msg->msg); + term_osd_set_text(mpctx, msg->msg); return; } @@ -500,21 +514,15 @@ void update_osd_msg(struct MPContext *mpctx) if (msg && msg->show_position) osd_level = 3; - if (mpctx->video_out && opts->term_osd != 1) { - // fallback on the timer - char *text = NULL; + // clear, or if OSD level demands it, show the status + char *text = NULL; - if (osd_level >= 2) - sadd_osd_status(&text, mpctx, osd_level == 3); + if (osd_level >= 2) + sadd_osd_status(&text, mpctx, osd_level == 3); - osd_set_text(osd, text); - talloc_free(text); - return; - } + osd_set_text(osd, text); + talloc_free(text); - // Clear the term osd line - if (opts->term_osd && mpctx->terminal_osd_text[0]) { - mpctx->terminal_osd_text[0] = '\0'; - mp_msg(mpctx->statusline, MSGL_STATUS, "%s\n", opts->term_osd_esc); - } + // always clear (term-osd has separate status line) + term_osd_set_text(mpctx, ""); } diff --git a/player/playloop.c b/player/playloop.c index c61ba419b0..95e9a9c5a4 100644 --- a/player/playloop.c +++ b/player/playloop.c @@ -1164,7 +1164,6 @@ void run_playloop(struct MPContext *mpctx) get_relative_time(mpctx); } update_avsync(mpctx); - print_status(mpctx); screenshot_flip(mpctx); new_frame_shown = true; @@ -1188,10 +1187,6 @@ void run_playloop(struct MPContext *mpctx) update_osd_msg(mpctx); - // The cache status is part of the status line. Possibly update it. - if (mpctx->paused && mp_get_cache_percent(mpctx) >= 0) - print_status(mpctx); - if (!video_left && (!mpctx->paused || was_restart)) { double a_pos = 0; if (mpctx->d_audio) { @@ -1199,7 +1194,6 @@ void run_playloop(struct MPContext *mpctx) mpctx->opts->playback_speed * buffered_audio); } mpctx->playback_pts = a_pos; - print_status(mpctx); } update_subtitles(mpctx); |