aboutsummaryrefslogtreecommitdiff
path: root/vis.c
diff options
context:
space:
mode:
Diffstat (limited to 'vis.c')
-rw-r--r--vis.c112
1 files changed, 13 insertions, 99 deletions
diff --git a/vis.c b/vis.c
index cabad67..616b463 100644
--- a/vis.c
+++ b/vis.c
@@ -35,86 +35,6 @@ static void macro_replay(Vis *vis, const Macro *macro);
static void macro_replay_internal(Vis *vis, const Macro *macro);
static void vis_keys_push(Vis *vis, const char *input, size_t pos, bool record);
-bool vis_event_emit(Vis *vis, enum VisEvents id, ...) {
- if (!vis->event)
- return true;
-
- if (!vis->initialized) {
- vis->initialized = true;
- vis->ui->init(vis->ui, vis);
- if (vis->event->init)
- vis->event->init(vis);
- }
-
- va_list ap;
- va_start(ap, id);
- bool ret = true;
-
- switch (id) {
- case VIS_EVENT_INIT:
- break;
- case VIS_EVENT_START:
- if (vis->event->start)
- vis->event->start(vis);
- break;
- case VIS_EVENT_FILE_OPEN:
- case VIS_EVENT_FILE_SAVE_PRE:
- case VIS_EVENT_FILE_SAVE_POST:
- case VIS_EVENT_FILE_CLOSE:
- {
- File *file = va_arg(ap, File*);
- if (file->internal)
- break;
- if (id == VIS_EVENT_FILE_OPEN && vis->event->file_open) {
- vis->event->file_open(vis, file);
- } else if (id == VIS_EVENT_FILE_SAVE_PRE && vis->event->file_save_pre) {
- const char *path = va_arg(ap, const char*);
- ret = vis->event->file_save_pre(vis, file, path);
- } else if (id == VIS_EVENT_FILE_SAVE_POST && vis->event->file_save_post) {
- const char *path = va_arg(ap, const char*);
- vis->event->file_save_post(vis, file, path);
- } else if (id == VIS_EVENT_FILE_CLOSE && vis->event->file_close) {
- vis->event->file_close(vis, file);
- }
- break;
- }
- case VIS_EVENT_WIN_OPEN:
- case VIS_EVENT_WIN_CLOSE:
- case VIS_EVENT_WIN_HIGHLIGHT:
- case VIS_EVENT_WIN_STATUS:
- {
- Win *win = va_arg(ap, Win*);
- if (win->file->internal && id != VIS_EVENT_WIN_STATUS)
- break;
- if (vis->event->win_open && id == VIS_EVENT_WIN_OPEN) {
- vis->event->win_open(vis, win);
- } else if (vis->event->win_close && id == VIS_EVENT_WIN_CLOSE) {
- vis->event->win_close(vis, win);
- } else if (vis->event->win_highlight && id == VIS_EVENT_WIN_HIGHLIGHT) {
- vis->event->win_highlight(vis, win);
- } else if (vis->event->win_status && id == VIS_EVENT_WIN_STATUS) {
- vis->event->win_status(vis, win);
- }
- break;
- }
- case VIS_EVENT_QUIT:
- if (vis->event->quit)
- vis->event->quit(vis);
- break;
- case VIS_EVENT_TERM_CSI:
- if (vis->event->term_csi)
- vis->event->term_csi(vis, va_arg(ap, const long *));
- break;
- case VIS_EVENT_UI_DRAW:
- if (vis->event->ui_draw)
- vis->event->ui_draw(vis);
- break;
- }
-
- va_end(ap);
- return ret;
-}
-
/** window / file handling */
static void file_free(Vis *vis, File *file) {
@@ -182,7 +102,7 @@ err:
return path_normalized[0] ? strdup(path_normalized) : NULL;
}
-static File *file_new(Vis *vis, const char *name) {
+static File *file_new(Vis *vis, const char *name, bool internal) {
char *name_absolute = NULL;
bool cmp_names = 0;
struct stat new;
@@ -225,7 +145,9 @@ static File *file_new(Vis *vis, const char *name) {
if (!(file = file_new_text(vis, text)))
goto err;
file->name = name_absolute;
- vis_event_emit(vis, VIS_EVENT_FILE_OPEN, file);
+ file->internal = internal;
+ if (!internal)
+ vis_event_emit(vis, VIS_EVENT_FILE_OPEN, file);
return file;
err:
free(name_absolute);
@@ -235,11 +157,9 @@ err:
}
static File *file_new_internal(Vis *vis, const char *filename) {
- File *file = file_new(vis, filename);
- if (file) {
+ File *file = file_new(vis, filename, true);
+ if (file)
file->refcount = 1;
- file->internal = true;
- }
return file;
}
@@ -495,7 +415,7 @@ bool vis_window_reload(Win *win) {
return false; /* can't reload unsaved file */
/* temporarily unset file name, otherwise file_new returns the same File */
win->file->name = NULL;
- File *file = file_new(win->vis, name);
+ File *file = file_new(win->vis, name, false);
win->file->name = name;
if (!file)
return false;
@@ -507,7 +427,7 @@ bool vis_window_reload(Win *win) {
}
bool vis_window_change_file(Win *win, const char* filename) {
- File *file = file_new(win->vis, filename);
+ File *file = file_new(win->vis, filename, false);
if (!file)
return false;
file->refcount++;
@@ -596,7 +516,7 @@ void vis_doupdates(Vis *vis, bool doupdate) {
}
bool vis_window_new(Vis *vis, const char *filename) {
- File *file = file_new(vis, filename);
+ File *file = file_new(vis, filename, false);
if (!file)
return false;
vis_doupdates(vis, false);
@@ -676,7 +596,7 @@ void vis_window_close(Win *win) {
vis_draw(vis);
}
-Vis *vis_new(Ui *ui, VisEvent *event) {
+Vis *vis_new(Ui *ui) {
if (!ui)
return NULL;
Vis *vis = calloc(1, sizeof(Vis));
@@ -719,13 +639,8 @@ Vis *vis_new(Ui *ui, VisEvent *event) {
if (!(vis->shell = strdup(shell)))
goto err;
vis->mode_prev = vis->mode = &vis_modes[VIS_MODE_NORMAL];
- vis->event = event;
- if (event) {
- if (event->mode_insert_input)
- vis_modes[VIS_MODE_INSERT].input = event->mode_insert_input;
- if (event->mode_replace_input)
- vis_modes[VIS_MODE_REPLACE].input = event->mode_replace_input;
- }
+ vis_modes[VIS_MODE_INSERT].input = vis_event_mode_insert_input;
+ vis_modes[VIS_MODE_REPLACE].input = vis_event_mode_replace_input;
return vis;
err:
vis_free(vis);
@@ -735,10 +650,9 @@ err:
void vis_free(Vis *vis) {
if (!vis)
return;
- vis_event_emit(vis, VIS_EVENT_QUIT);
- vis->event = NULL;
while (vis->windows)
vis_window_close(vis->windows);
+ vis_event_emit(vis, VIS_EVENT_QUIT);
file_free(vis, vis->command_file);
file_free(vis, vis->search_file);
file_free(vis, vis->error_file);