From 352ee0761ced17612d751bd568c888c78d279e9f Mon Sep 17 00:00:00 2001 From: Florian Fischer Date: Fri, 10 May 2024 08:55:56 +0200 Subject: lua: allow changing the displayed file of a window Change the file displayed in a window by writing the new file name to the window's file member. This is useful to change the displayed file during events. Using the edit command during an event caused by a pervious edit command causes a double free. --- vis-lua.c | 6 ++++++ vis.c | 12 ++++++++++++ vis.h | 2 ++ 3 files changed, 20 insertions(+) diff --git a/vis-lua.c b/vis-lua.c index a62daf8..ca36d2d 100644 --- a/vis-lua.c +++ b/vis-lua.c @@ -2019,6 +2019,12 @@ static int window_newindex(lua_State *L) { } lua_pop(L, 1); return ret; + } else if (strcmp(key, "file") == 0 && lua_isstring(L, 3)) { + const char* filename = lua_tostring(L, 3); + if (!vis_window_change_file(win, filename)) { + return luaL_argerror(L, 3, "failed to open"); + } + return 0; } } diff --git a/vis.c b/vis.c index 0c05558..dca90c1 100644 --- a/vis.c +++ b/vis.c @@ -505,6 +505,18 @@ bool vis_window_reload(Win *win) { return true; } +bool vis_window_change_file(Win *win, const char* filename) { + File *file = file_new(win->vis, filename); + if (!file) + return false; + file->refcount++; + if (win->file) + file_free(win->vis, win->file); + win->file = file; + view_reload(win->view, file->text); + return true; +} + bool vis_window_split(Win *original) { vis_doupdates(original->vis, false); Win *win = window_new_file(original->vis, original->file, UI_OPTION_STATUSBAR); diff --git a/vis.h b/vis.h index 8287a45..fcc1e05 100644 --- a/vis.h +++ b/vis.h @@ -209,6 +209,8 @@ bool vis_window_new(Vis*, const char *filename); bool vis_window_new_fd(Vis*, int fd); /** Reload the file currently displayed in the window from disk. */ bool vis_window_reload(Win*); +/** Change the file currently displayed in the window. */ +bool vis_window_change_file(Win*, const char *filename); /** Check whether closing the window would loose unsaved changes. */ bool vis_window_closable(Win*); /** Close window, redraw user interface. */ -- cgit v1.2.3