Skip to content

Commit

Permalink
player: kill associated OSD and key bindings when removing a script
Browse files Browse the repository at this point in the history
The former was done already for Lua scripts, but move it to the generic
code.
  • Loading branch information
wm4 committed Sep 20, 2016
1 parent fe872f5 commit bf385e1
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 4 deletions.
24 changes: 23 additions & 1 deletion input/input.c
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ struct cmd_bind {
};

struct cmd_bind_section {
char *owner;
struct cmd_bind *binds;
int num_binds;
char *section;
Expand Down Expand Up @@ -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:
Expand All @@ -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)
Expand Down
6 changes: 5 additions & 1 deletion input/input.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
5 changes: 5 additions & 0 deletions player/client.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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)
Expand Down
3 changes: 2 additions & 1 deletion player/command.c
Original file line number Diff line number Diff line change
Expand Up @@ -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: {
Expand Down
1 change: 0 additions & 1 deletion player/lua.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit bf385e1

Please sign in to comment.