diff options
| author | Florian Fischer <florian.fischer@muhq.space> | 2024-05-10 08:55:56 +0200 |
|---|---|---|
| committer | Randy Palamar <randy@rnpnr.xyz> | 2024-05-12 09:16:29 -0600 |
| commit | 352ee0761ced17612d751bd568c888c78d279e9f (patch) | |
| tree | 9db6cc3c62b5506144b96a7aa89f7c616470c269 | |
| parent | 50a7673370fa037960e9d2c3a8d6aed1bb9c39c4 (diff) | |
| download | vis-352ee0761ced17612d751bd568c888c78d279e9f.tar.gz vis-352ee0761ced17612d751bd568c888c78d279e9f.tar.xz | |
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.
| -rw-r--r-- | vis-lua.c | 6 | ||||
| -rw-r--r-- | vis.c | 12 | ||||
| -rw-r--r-- | vis.h | 2 |
3 files changed, 20 insertions, 0 deletions
@@ -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; } } @@ -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); @@ -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. */ |
