player: kill associated OSD and key bindings when removing a script

The former was done already for Lua scripts, but move it to the generic
code.
This commit is contained in:
wm4 2016-09-20 15:31:25 +02:00
parent fe872f5688
commit bf385e1140
5 changed files with 35 additions and 4 deletions

View File

@ -73,6 +73,7 @@ struct cmd_bind {
};
struct cmd_bind_section {
char *owner;
struct cmd_bind *binds;
int num_binds;
char *section;
@ -1009,13 +1010,19 @@ static void remove_binds(struct cmd_bind_section *bs, bool builtin)
}
void mp_input_define_section(struct input_ctx *ictx, char *name, char *location,
char *contents, bool builtin)
char *contents, bool builtin, char *owner)
{
if (!name || !name[0])
return; // parse_config() changes semantics with restrict_section==empty
input_lock(ictx);
// Delete:
struct cmd_bind_section *bs = get_bind_section(ictx, bstr0(name));
if ((!bs->owner || (owner && strcmp(bs->owner, owner) != 0)) &&
strcmp(bs->section, "default") != 0)
{
talloc_free(bs->owner);
bs->owner = talloc_strdup(bs, owner);
}
remove_binds(bs, builtin);
if (contents && contents[0]) {
// Redefine:
@ -1027,6 +1034,21 @@ void mp_input_define_section(struct input_ctx *ictx, char *name, char *location,
input_unlock(ictx);
}
void mp_input_remove_sections_by_owner(struct input_ctx *ictx, char *owner)
{
input_lock(ictx);
struct cmd_bind_section *bs = ictx->cmd_bind_sections;
while (bs) {
if (bs->owner && owner && strcmp(bs->owner, owner) == 0) {
mp_input_disable_section(ictx, bs->section);
remove_binds(bs, false);
remove_binds(bs, true);
}
bs = bs->next;
}
input_unlock(ictx);
}
static bool bind_matches_key(struct cmd_bind *bind, int num_keys, const int *keys)
{
if (bind->num_keys != num_keys)

View File

@ -196,9 +196,13 @@ void mp_input_disable_all_sections(struct input_ctx *ictx);
// builtin: create as builtin section; this means if the user defines bindings
// using "{name}", they won't be ignored or overwritten - instead,
// they are preferred to the bindings defined with this call
// owner: string ID of the client which defined this, or NULL
// If the section already exists, its bindings are removed and replaced.
void mp_input_define_section(struct input_ctx *ictx, char *name, char *location,
char *contents, bool builtin);
char *contents, bool builtin, char *owner);
// Remove all sections that have been defined by the given owner.
void mp_input_remove_sections_by_owner(struct input_ctx *ictx, char *owner);
// Define where on the screen the named input section should receive.
// Setting a rectangle of size 0 unsets the mouse area.

View File

@ -416,6 +416,8 @@ void mpv_detach_destroy(mpv_handle *ctx)
ctx->num_events--;
}
mp_msg_log_buffer_destroy(ctx->messages);
osd_set_external(ctx->mpctx->osd, ctx, 0, 0, NULL);
mp_input_remove_sections_by_owner(ctx->mpctx->input, ctx->name);
pthread_cond_destroy(&ctx->wakeup);
pthread_mutex_destroy(&ctx->wakeup_lock);
pthread_mutex_destroy(&ctx->lock);
@ -759,6 +761,9 @@ mpv_event *mpv_wait_event(mpv_handle *ctx, double timeout)
{
mpv_event *event = ctx->cur_event;
if (!ctx->mpctx->initialized)
return NULL;
pthread_mutex_lock(&ctx->lock);
if (!ctx->fuzzy_initialized)

View File

@ -5282,7 +5282,8 @@ int run_command(struct MPContext *mpctx, struct mp_cmd *cmd, struct mpv_node *re
case MP_CMD_DEFINE_INPUT_SECTION:
mp_input_define_section(mpctx->input, cmd->args[0].v.s, "<api>",
cmd->args[1].v.s, !!cmd->args[2].v.i);
cmd->args[1].v.s, !!cmd->args[2].v.i,
cmd->sender);
break;
case MP_CMD_AB_LOOP: {

View File

@ -391,7 +391,6 @@ static int load_lua(struct mpv_handle *client, const char *fname)
r = 0;
error_out:
osd_set_external(ctx->mpctx->osd, client, 0, 0, NULL); // remove overlay
mp_resume_all(client);
if (ctx->state)
lua_close(ctx->state);