summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--DOCS/man/en/options.rst12
-rw-r--r--options/options.c4
-rw-r--r--options/options.h2
-rw-r--r--player/osd.c29
4 files changed, 47 insertions, 0 deletions
diff --git a/DOCS/man/en/options.rst b/DOCS/man/en/options.rst
index 64a97811a7..f1ee540793 100644
--- a/DOCS/man/en/options.rst
+++ b/DOCS/man/en/options.rst
@@ -2380,6 +2380,18 @@ OPTIONS
``force`` enables terminal OSD even if a video window is created.
+``--term-osd-bar``, ``--no-term-osd-bar``
+ Enable printing a progress bar under the status line on the terminal.
+ (Disabled by default.)
+
+``--term-osd-bar-chars=<string>``
+ Customize the ``--term-osd-bar`` feature. The string is expected to
+ consist of 5 characters (start, left space, position indicator,
+ right space, end). You can use unicode characters, but note that double-
+ width characters will not be treated correctly.
+
+ Default: ``[-+-]``.
+
``--title=<string>``
Set the window title. Properties are expanded on playback start.
(See `Property Expansion`_.)
diff --git a/options/options.c b/options/options.c
index dbc06bdf7f..cff2eff810 100644
--- a/options/options.c
+++ b/options/options.c
@@ -597,6 +597,9 @@ const m_option_t mp_opts[] = {
{"auto", 2},
{"no", 0})),
+ OPT_FLAG("term-osd-bar", term_osd_bar, 0),
+ OPT_STRING("term-osd-bar-chars", term_osd_bar_chars, 0),
+
OPT_STRING("playing-msg", playing_msg, M_OPT_PARSE_ESCAPES),
OPT_STRING("status-msg", status_msg, M_OPT_PARSE_ESCAPES),
OPT_STRING("osd-status-msg", osd_status_msg, M_OPT_PARSE_ESCAPES),
@@ -702,6 +705,7 @@ const struct MPOpts mp_default_opts = {
.user_pts_assoc_mode = 1,
.initial_audio_sync = 1,
.term_osd = 2,
+ .term_osd_bar_chars = "[-+-]",
.consolecontrols = 1,
.play_frames = -1,
.keep_open = 0,
diff --git a/options/options.h b/options/options.h
index 5608392a99..0a50352d0d 100644
--- a/options/options.h
+++ b/options/options.h
@@ -124,6 +124,8 @@ typedef struct MPOpts {
int softsleep;
int frame_dropping;
int term_osd;
+ int term_osd_bar;
+ char *term_osd_bar_chars;
char *playing_msg;
char *status_msg;
char *osd_status_msg;
diff --git a/player/osd.c b/player/osd.c
index b2062701ea..29ac7af8fe 100644
--- a/player/osd.c
+++ b/player/osd.c
@@ -103,6 +103,29 @@ static void term_osd_set_status(struct MPContext *mpctx, const char *text)
term_osd_update(mpctx);
}
+static void add_term_osd_bar(struct MPContext *mpctx, char **line, int width)
+{
+ struct MPOpts *opts = mpctx->opts;
+
+ if (width < 5)
+ return;
+
+ int pos = get_percent_pos(mpctx) / 100.0 * (width - 2);
+
+ bstr chars = bstr0(opts->term_osd_bar_chars);
+ bstr parts[5];
+ for (int n = 0; n < 5; n++)
+ parts[n] = bstr_split_utf8(chars, &chars);
+
+ saddf(line, "%.*s", BSTR_P(parts[0]));
+ for (int n = 0; n < pos; n++)
+ saddf(line, "%.*s", BSTR_P(parts[1]));
+ saddf(line, "%.*s", BSTR_P(parts[2]));
+ for (int n = 0; n < width - 2 - pos - 1; n++)
+ saddf(line, "%.*s", BSTR_P(parts[3]));
+ saddf(line, "%.*s", BSTR_P(parts[4]));
+}
+
void print_status(struct MPContext *mpctx)
{
struct MPOpts *opts = mpctx->opts;
@@ -182,6 +205,12 @@ void print_status(struct MPContext *mpctx)
if (cache >= 0)
saddf(&line, " Cache: %d%%", cache);
+ if (opts->term_osd_bar) {
+ saddf(&line, "\n");
+ get_screen_size();
+ add_term_osd_bar(mpctx, &line, screen_width);
+ }
+
// end
term_osd_set_status(mpctx, line);
talloc_free(line);