summaryrefslogtreecommitdiffstats
path: root/player
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-01-17 22:26:04 +0100
committerwm4 <wm4@nowhere>2014-01-17 22:26:04 +0100
commita0a2ea8713bcd1b0ed35eaaaa93625e973480563 (patch)
treef0687c50776b5cc83edd41a1f23bbd5949c7f9f7 /player
parentc47c59f2df6e3a394c0484d894136df8ebe10297 (diff)
downloadmpv-a0a2ea8713bcd1b0ed35eaaaa93625e973480563.tar.bz2
mpv-a0a2ea8713bcd1b0ed35eaaaa93625e973480563.tar.xz
player: remove OSD stack
If certain OSD messages were displayed at the same time, the hidden messages were put on the stack, and displayed again once the higher priority messages disappeared. The idea was probably that lower priority messages could not hide higher priority ones, and also that the lower messages did not get lost. But in practice, this gives confusing results with OSD messages randomly reappearing for a brief time. Remove it.
Diffstat (limited to 'player')
-rw-r--r--player/command.c2
-rw-r--r--player/core.h1
-rw-r--r--player/osd.c70
3 files changed, 15 insertions, 58 deletions
diff --git a/player/command.c b/player/command.c
index adcf9daa17..646b96864a 100644
--- a/player/command.c
+++ b/player/command.c
@@ -2790,8 +2790,6 @@ void run_command(MPContext *mpctx, mp_cmd_t *cmd)
if (msg_osd && opts->osd_level <= 1)
set_osd_msg(mpctx, OSD_MSG_OSD_STATUS, 0, osd_duration,
"OSD: %s", opts->osd_level ? "yes" : "no");
- else
- rm_osd_msg(mpctx, OSD_MSG_OSD_STATUS);
break;
}
diff --git a/player/core.h b/player/core.h
index f99c23bdf9..2c6b41d745 100644
--- a/player/core.h
+++ b/player/core.h
@@ -416,7 +416,6 @@ void set_osd_bar(struct MPContext *mpctx, int type, const char* name,
double min, double max, double val);
void set_osd_msg(struct MPContext *mpctx, int id, int level, int time,
const char* fmt, ...) PRINTF_ATTRIBUTE(5,6);
-void rm_osd_msg(struct MPContext *mpctx, int id);
void set_osd_function(struct MPContext *mpctx, int osd_function);
void set_osd_subtitle(struct MPContext *mpctx, const char *text);
diff --git a/player/osd.c b/player/osd.c
index 44837f22b2..05ab509f69 100644
--- a/player/osd.c
+++ b/player/osd.c
@@ -233,8 +233,6 @@ void print_status(struct MPContext *mpctx)
typedef struct mp_osd_msg mp_osd_msg_t;
struct mp_osd_msg {
- /// Previous message on the stack.
- mp_osd_msg_t *prev;
/// Message text.
char *msg;
int id, level, started;
@@ -249,16 +247,18 @@ struct mp_osd_msg {
static mp_osd_msg_t *add_osd_msg(struct MPContext *mpctx, int id, int level,
int time)
{
- rm_osd_msg(mpctx, id);
- mp_osd_msg_t *msg = talloc_struct(mpctx, mp_osd_msg_t, {
- .prev = mpctx->osd_msg_stack,
+ struct MPOpts *opts = mpctx->opts;
+ if (level > opts->osd_level)
+ return NULL;
+
+ talloc_free(mpctx->osd_msg_stack);
+ mpctx->osd_msg_stack = talloc_struct(mpctx, mp_osd_msg_t, {
.msg = "",
.id = id,
.level = level,
.time = time / 1000.0,
});
- mpctx->osd_msg_stack = msg;
- return msg;
+ return mpctx->osd_msg_stack;
}
static void set_osd_msg_va(struct MPContext *mpctx, int id, int level, int time,
@@ -267,7 +267,8 @@ static void set_osd_msg_va(struct MPContext *mpctx, int id, int level, int time,
if (level == OSD_LEVEL_INVISIBLE)
return;
mp_osd_msg_t *msg = add_osd_msg(mpctx, id, level, time);
- msg->msg = talloc_vasprintf(msg, fmt, ap);
+ if (msg)
+ msg->msg = talloc_vasprintf(msg, fmt, ap);
}
void set_osd_msg(struct MPContext *mpctx, int id, int level, int time,
@@ -280,31 +281,6 @@ void set_osd_msg(struct MPContext *mpctx, int id, int level, int time,
}
/**
- * \brief Remove a message from the OSD stack
- *
- * This function can be used to get rid of a message right away.
- *
- */
-
-void rm_osd_msg(struct MPContext *mpctx, int id)
-{
- mp_osd_msg_t *msg, *last = NULL;
-
- // Search for the msg
- for (msg = mpctx->osd_msg_stack; msg && msg->id != id;
- last = msg, msg = msg->prev) ;
- if (!msg)
- return;
-
- // Detach it from the stack and free it
- if (last)
- last->prev = msg->prev;
- else
- mpctx->osd_msg_stack = msg->prev;
- talloc_free(msg);
-}
-
-/**
* \brief Get the current message from the OSD stack.
*
* This function decrements the message timer and destroys the old ones.
@@ -314,11 +290,8 @@ void rm_osd_msg(struct MPContext *mpctx, int id)
static mp_osd_msg_t *get_osd_msg(struct MPContext *mpctx)
{
- struct MPOpts *opts = mpctx->opts;
- mp_osd_msg_t *msg, *prev, *last = NULL;
double now = mp_time_sec();
double diff;
- char hidden_dec_done = 0;
if (mpctx->osd_visible && now >= mpctx->osd_visible) {
mpctx->osd_visible = 0;
@@ -336,33 +309,19 @@ static mp_osd_msg_t *get_osd_msg(struct MPContext *mpctx)
mpctx->osd_last_update = now;
- // Look for the first message in the stack with high enough level.
- for (msg = mpctx->osd_msg_stack; msg; last = msg, msg = prev) {
- prev = msg->prev;
- if (msg->level > opts->osd_level && hidden_dec_done)
- continue;
- // The message has a high enough level or it is the first hidden one
- // in both cases we decrement the timer or kill it.
+ mp_osd_msg_t *msg = mpctx->osd_msg_stack;
+ if (msg) {
if (!msg->started || msg->time > diff) {
if (msg->started)
msg->time -= diff;
else
msg->started = 1;
// display it
- if (msg->level <= opts->osd_level)
- return msg;
- hidden_dec_done = 1;
- continue;
+ return msg;
}
// kill the message
talloc_free(msg);
- if (last) {
- last->prev = prev;
- msg = last;
- } else {
- mpctx->osd_msg_stack = prev;
- msg = NULL;
- }
+ mpctx->osd_msg_stack = NULL;
}
// Nothing found
return NULL;
@@ -496,7 +455,8 @@ static void add_seek_osd_messages(struct MPContext *mpctx)
if (mpctx->video_out && mpctx->opts->term_osd != 1) {
mp_osd_msg_t *msg = add_osd_msg(mpctx, OSD_MSG_TEXT, 1,
mpctx->opts->osd_duration);
- msg->show_position = true;
+ if (msg)
+ msg->show_position = true;
}
}
if (mpctx->add_osd_seek_info & OSD_SEEK_INFO_CHAPTER_TEXT) {