diff options
| author | Thiago de Arruda <tpadilha84@gmail.com> | 2015-07-24 12:14:31 -0300 | 
|---|---|---|
| committer | Thiago de Arruda <tpadilha84@gmail.com> | 2015-08-13 07:41:04 -0300 | 
| commit | bef0c03b250b1cb671ad8f130228e6b4a7ae74d3 (patch) | |
| tree | 78a8d4af224c00479427471ee028a9a496cce2d8 | |
| parent | 696f9c2759b078f749625d167f3424915586108d (diff) | |
| download | rneovim-bef0c03b250b1cb671ad8f130228e6b4a7ae74d3.tar.gz rneovim-bef0c03b250b1cb671ad8f130228e6b4a7ae74d3.tar.bz2 rneovim-bef0c03b250b1cb671ad8f130228e6b4a7ae74d3.zip | |
terminal: Ensure terminal buffers are flushed on exit
When a terminal closed, make sure it is refreshed before the Terminal structure
is freed. Also extract `refresh_terminal` from `on_refresh`.
| -rw-r--r-- | src/nvim/terminal.c | 46 | 
1 files changed, 28 insertions, 18 deletions
| diff --git a/src/nvim/terminal.c b/src/nvim/terminal.c index 0285ce72d4..cf68143ac7 100644 --- a/src/nvim/terminal.c +++ b/src/nvim/terminal.c @@ -428,7 +428,13 @@ void terminal_destroy(Terminal *term)      term->buf->terminal = NULL;    }    term->buf = NULL; -  pmap_del(ptr_t)(invalidated_terminals, term); +  if (pmap_has(ptr_t)(invalidated_terminals, term)) { +    // flush any pending changes to the buffer +    block_autocmds(); +    refresh_terminal(term); +    unblock_autocmds(); +    pmap_del(ptr_t)(invalidated_terminals, term); +  }    for (size_t i = 0 ; i < term->sb_current; i++) {      xfree(term->sb_buffer[i]);    } @@ -884,6 +890,26 @@ static void invalidate_terminal(Terminal *term, int start_row, int end_row)    }  } +static void refresh_terminal(Terminal *term) +{ +  // TODO(SplinterOfChaos): Find the condition that makes term->buf invalid. +  bool valid = true; +  if (!term->buf || !(valid = buf_valid(term->buf))) { +    // destroyed by `close_buffer`. Dont do anything else +    if (!valid) { +      term->buf = NULL; +    } +    return; +  } +  bool pending_resize = term->pending_resize; +  WITH_BUFFER(term->buf, { +    refresh_size(term); +    refresh_scrollback(term); +    refresh_screen(term); +    redraw_buf_later(term->buf, NOT_VALID); +  }); +  adjust_topline(term, pending_resize); +}  // libuv timer callback. This will enqueue on_refresh to be processed as an  // event.  static void refresh_timer_cb(TimeWatcher *watcher, void *data) @@ -905,23 +931,7 @@ static void on_refresh(Event event)    // don't process autocommands while updating terminal buffers    block_autocmds();    map_foreach(invalidated_terminals, term, stub, { -    // TODO(SplinterOfChaos): Find the condition that makes term->buf invalid. -    bool valid = true; -    if (!term->buf || !(valid = buf_valid(term->buf))) { -      // destroyed by `close_buffer`. Dont do anything else -      if (!valid) { -        term->buf = NULL; -      } -      continue; -    } -    bool pending_resize = term->pending_resize; -    WITH_BUFFER(term->buf, { -      refresh_size(term); -      refresh_scrollback(term); -      refresh_screen(term); -      redraw_buf_later(term->buf, NOT_VALID); -    }); -    adjust_topline(term, pending_resize); +    refresh_terminal(term);    });    pmap_clear(ptr_t)(invalidated_terminals);    unblock_autocmds(); | 
