summaryrefslogtreecommitdiffstats
path: root/player
diff options
context:
space:
mode:
Diffstat (limited to 'player')
-rw-r--r--player/command.c2
-rw-r--r--player/core.h5
-rw-r--r--player/main.c2
-rw-r--r--player/misc.c6
-rw-r--r--player/osd.c104
-rw-r--r--player/playloop.c6
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);