diff options
author | bfredl <bjorn.linse@gmail.com> | 2022-09-27 18:16:58 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-09-27 18:16:58 +0200 |
commit | d84abfeb1d9f0dbd03c6089a94756f2a8468a612 (patch) | |
tree | 4d194e67ecc3b626ff703bd0b13042fb6e4b57c9 /src/nvim/api/private/helpers.c | |
parent | f46060c4cbc1efe100019075214def53fe4d47b3 (diff) | |
parent | c7d30c152d1639523d05154e245ea60ed9a51a2b (diff) | |
download | rneovim-d84abfeb1d9f0dbd03c6089a94756f2a8468a612.tar.gz rneovim-d84abfeb1d9f0dbd03c6089a94756f2a8468a612.tar.bz2 rneovim-d84abfeb1d9f0dbd03c6089a94756f2a8468a612.zip |
Merge pull request #15373 from smolck/lua-notify-dictwatcher
fix(nvim): notify dict watchers on nvim_set_var and vim.g setter
Diffstat (limited to 'src/nvim/api/private/helpers.c')
-rw-r--r-- | src/nvim/api/private/helpers.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/src/nvim/api/private/helpers.c b/src/nvim/api/private/helpers.c index b888d09343..73b5489d5c 100644 --- a/src/nvim/api/private/helpers.c +++ b/src/nvim/api/private/helpers.c @@ -218,6 +218,8 @@ Object dict_set_var(dict_T *dict, String key, Object value, bool del, bool retva return rv; } + bool watched = tv_dict_is_watched(dict); + if (del) { // Delete the key if (di == NULL) { @@ -225,6 +227,10 @@ Object dict_set_var(dict_T *dict, String key, Object value, bool del, bool retva api_set_error(err, kErrorTypeValidation, "Key not found: %s", key.data); } else { + // Notify watchers + if (watched) { + tv_dict_watcher_notify(dict, key.data, NULL, &di->di_tv); + } // Return the old value if (retval) { rv = vim_to_object(&di->di_tv); @@ -241,11 +247,16 @@ Object dict_set_var(dict_T *dict, String key, Object value, bool del, bool retva return rv; } + typval_T oldtv = TV_INITIAL_VALUE; + if (di == NULL) { // Need to create an entry di = tv_dict_item_alloc_len(key.data, key.size); tv_dict_add(dict, di); } else { + if (watched) { + tv_copy(&di->di_tv, &oldtv); + } // Return the old value if (retval) { rv = vim_to_object(&di->di_tv); @@ -255,6 +266,13 @@ Object dict_set_var(dict_T *dict, String key, Object value, bool del, bool retva // Update the value tv_copy(&tv, &di->di_tv); + + // Notify watchers + if (watched) { + tv_dict_watcher_notify(dict, key.data, &tv, &oldtv); + tv_clear(&oldtv); + } + // Clear the temporary variable tv_clear(&tv); } |