diff options
| author | Marc André Tanner <mat@brain-dump.org> | 2016-11-14 23:30:17 +0100 |
|---|---|---|
| committer | Marc André Tanner <mat@brain-dump.org> | 2016-11-15 12:56:56 +0100 |
| commit | 0f479c4da7f0c62d7422417d3d0601c853f043aa (patch) | |
| tree | 6bb592276fd977cdbca06f8bab4eac6c4d148cf5 /vis.c | |
| parent | d770aa314255313e97b3ecb4c0cafde0fca16c9d (diff) | |
| download | vis-0f479c4da7f0c62d7422417d3d0601c853f043aa.tar.gz vis-0f479c4da7f0c62d7422417d3d0601c853f043aa.tar.xz | |
vis: defer UI initialization and overhaul argument parsing
Do not initalize curses UI before it is actually needed.
Move vis command line argument parsing logic into main.c.
This fixes `vis -v` output and exit status.
Fix #351
Diffstat (limited to 'vis.c')
| -rw-r--r-- | vis.c | 67 |
1 files changed, 9 insertions, 58 deletions
@@ -37,6 +37,13 @@ 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 && vis->event->vis_init) + vis->event->vis_init(vis); + } + va_list ap; va_start(ap, id); bool ret = true; @@ -493,7 +500,6 @@ Vis *vis_new(Ui *ui, VisEvent *event) { if (!vis) return NULL; vis->ui = ui; - vis->ui->init(vis->ui, vis); vis->tabwidth = 8; vis->expandtab = false; vis->registers[VIS_REG_BLACKHOLE].type = REGISTER_BLACKHOLE; @@ -525,9 +531,6 @@ Vis *vis_new(Ui *ui, VisEvent *event) { goto err; vis->mode_prev = vis->mode = &vis_modes[VIS_MODE_NORMAL]; vis->event = event; - if (event && event->vis_init) - event->vis_init(vis); - vis->ui->start(vis->ui); return vis; err: vis_free(vis); @@ -982,62 +985,10 @@ bool vis_signal_handler(Vis *vis, int signum, const siginfo_t *siginfo, const vo return false; } -static void vis_args(Vis *vis, int argc, char *argv[]) { - char *cmd = NULL; - bool end_of_options = false; - for (int i = 1; i < argc; i++) { - if (argv[i][0] == '-' && !end_of_options) { - switch (argv[i][1]) { - case '-': - end_of_options = true; - break; - case 'v': - vis_die(vis, "vis %s\n", VERSION); - break; - case '\0': - break; - default: - vis_die(vis, "Unknown command option: %s\n", argv[i]); - break; - } - } else if (argv[i][0] == '+') { - cmd = argv[i] + (argv[i][1] == '/' || argv[i][1] == '?'); - } else if (!vis_window_new(vis, argv[i])) { - vis_die(vis, "Can not load `%s': %s\n", argv[i], strerror(errno)); - } else if (cmd) { - vis_prompt_cmd(vis, cmd); - cmd = NULL; - } - } - - if (!vis->windows && vis->running) { - if (!strcmp(argv[argc-1], "-")) { - if (!vis_window_new_fd(vis, STDOUT_FILENO)) - vis_die(vis, "Can not create empty buffer\n"); - ssize_t len = 0; - char buf[PIPE_BUF]; - Text *txt = vis_text(vis); - while ((len = read(STDIN_FILENO, buf, sizeof buf)) > 0) - text_insert(txt, text_size(txt), buf, len); - if (len == -1) - vis_die(vis, "Can not read from stdin\n"); - text_snapshot(txt); - int fd = open("/dev/tty", O_RDONLY); - if (fd == -1) - vis_die(vis, "Can not reopen stdin\n"); - dup2(fd, STDIN_FILENO); - close(fd); - } else if (!vis_window_new(vis, NULL)) { - vis_die(vis, "Can not create empty buffer\n"); - } - if (cmd) - vis_prompt_cmd(vis, cmd); - } -} - int vis_run(Vis *vis, int argc, char *argv[]) { + if (!vis->windows) + return EXIT_SUCCESS; vis->running = true; - vis_args(vis, argc, argv); vis_event_emit(vis, VIS_EVENT_START); |
