From bf385e1140069fb1c6d41161aece0fe099513ac0 Mon Sep 17 00:00:00 2001 From: wm4 Date: Tue, 20 Sep 2016 15:31:25 +0200 Subject: 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. --- input/input.c | 24 +++++++++++++++++++++++- input/input.h | 6 +++++- 2 files changed, 28 insertions(+), 2 deletions(-) (limited to 'input') diff --git a/input/input.c b/input/input.c index 90cd439779..da1f85b829 100644 --- a/input/input.c +++ b/input/input.c @@ -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) diff --git a/input/input.h b/input/input.h index cc523efc62..16262efbe5 100644 --- a/input/input.h +++ b/input/input.h @@ -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. -- cgit v1.2.3