diff options
author | notomo <notomo.motono@gmail.com> | 2021-06-04 09:47:43 +0900 |
---|---|---|
committer | Björn Linse <bjorn.linse@gmail.com> | 2021-06-10 09:34:29 +0200 |
commit | 1a9eb7a987d9fd45b56ed52b3a1c4f756ecd82a6 (patch) | |
tree | e1544de780be143f46fb230ab42a47e44ae0a250 /src/nvim/api/window.c | |
parent | fd7e77b2277d884c51bc6f0bd70c0e6e7a307bc1 (diff) | |
download | rneovim-1a9eb7a987d9fd45b56ed52b3a1c4f756ecd82a6.tar.gz rneovim-1a9eb7a987d9fd45b56ed52b3a1c4f756ecd82a6.tar.bz2 rneovim-1a9eb7a987d9fd45b56ed52b3a1c4f756ecd82a6.zip |
api: add nvim_win_call
Diffstat (limited to 'src/nvim/api/window.c')
-rw-r--r-- | src/nvim/api/window.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/nvim/api/window.c b/src/nvim/api/window.c index a26213af98..178375d7f1 100644 --- a/src/nvim/api/window.c +++ b/src/nvim/api/window.c @@ -11,6 +11,7 @@ #include "nvim/api/window.h" #include "nvim/api/private/defs.h" #include "nvim/api/private/helpers.h" +#include "nvim/lua/executor.h" #include "nvim/ex_docmd.h" #include "nvim/vim.h" #include "nvim/buffer.h" @@ -524,3 +525,39 @@ void nvim_win_close(Window window, Boolean force, Error *err) ex_win_close(force, win, tabpage == curtab ? NULL : tabpage); vim_ignored = try_leave(&tstate, err); } + +/// Calls a function with window as temporary current window. +/// +/// @see |win_execute()| +/// @see |nvim_buf_call()| +/// +/// @param window Window handle, or 0 for current window +/// @param fun Function to call inside the window (currently lua callable +/// only) +/// @param[out] err Error details, if any +/// @return Return value of function. NB: will deepcopy lua values +/// currently, use upvalues to send lua references in and out. +Object nvim_win_call(Window window, LuaRef fun, Error *err) + FUNC_API_SINCE(7) + FUNC_API_LUA_ONLY +{ + win_T *win = find_window_by_handle(window, err); + if (!win) { + return NIL; + } + tabpage_T *tabpage = win_find_tabpage(win); + + win_T *save_curwin; + tabpage_T *save_curtab; + + try_start(); + Object res = OBJECT_INIT; + if (switch_win_noblock(&save_curwin, &save_curtab, win, tabpage, true) == + OK) { + Array args = ARRAY_DICT_INIT; + res = nlua_call_ref(fun, NULL, args, true, err); + } + restore_win_noblock(save_curwin, save_curtab, true); + try_end(err); + return res; +} |