summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/channel.c83
-rw-r--r--src/terminal.c1
-rw-r--r--src/version.c2
3 files changed, 51 insertions, 35 deletions
diff --git a/src/channel.c b/src/channel.c
index 9d791a905..a4f1cc7b7 100644
--- a/src/channel.c
+++ b/src/channel.c
@@ -2817,25 +2817,40 @@ channel_close(channel_T *channel, int invoke_close_cb)
ch_close_part(channel, PART_OUT);
ch_close_part(channel, PART_ERR);
- if (invoke_close_cb && channel->ch_close_cb != NULL)
- {
- typval_T argv[1];
- typval_T rettv;
- int dummy;
- ch_part_T part;
-
- /* Invoke callbacks before the close callback, since it's weird to
- * first invoke the close callback. Increment the refcount to avoid
- * the channel being freed halfway. */
- ++channel->ch_refcount;
- ch_log(channel, "Invoking callbacks before closing");
- for (part = PART_SOCK; part < PART_IN; ++part)
- while (may_invoke_callback(channel, part))
- ;
-
- /* Invoke the close callback, if still set. */
- if (channel->ch_close_cb != NULL)
- {
+ if (invoke_close_cb)
+ {
+ ch_part_T part;
+
+ /* Invoke callbacks and flush buffers before the close callback. */
+ if (channel->ch_close_cb != NULL)
+ ch_log(channel,
+ "Invoking callbacks and flushing buffers before closing");
+ for (part = PART_SOCK; part < PART_IN; ++part)
+ {
+ if (channel->ch_close_cb != NULL
+ || channel->ch_part[part].ch_bufref.br_buf != NULL)
+ {
+ /* Increment the refcount to avoid the channel being freed
+ * halfway. */
+ ++channel->ch_refcount;
+ if (channel->ch_close_cb == NULL)
+ ch_log(channel, "flushing %s buffers before closing",
+ part_names[part]);
+ while (may_invoke_callback(channel, part))
+ ;
+ --channel->ch_refcount;
+ }
+ }
+
+ if (channel->ch_close_cb != NULL)
+ {
+ typval_T argv[1];
+ typval_T rettv;
+ int dummy;
+
+ /* Increment the refcount to avoid the channel being freed
+ * halfway. */
+ ++channel->ch_refcount;
ch_log(channel, "Invoking close callback %s",
(char *)channel->ch_close_cb);
argv[0].v_type = VAR_CHANNEL;
@@ -2845,25 +2860,25 @@ channel_close(channel_T *channel, int invoke_close_cb)
channel->ch_close_partial, NULL);
clear_tv(&rettv);
channel_need_redraw = TRUE;
- }
- /* the callback is only called once */
- free_callback(channel->ch_close_cb, channel->ch_close_partial);
- channel->ch_close_cb = NULL;
- channel->ch_close_partial = NULL;
+ /* the callback is only called once */
+ free_callback(channel->ch_close_cb, channel->ch_close_partial);
+ channel->ch_close_cb = NULL;
+ channel->ch_close_partial = NULL;
- --channel->ch_refcount;
+ --channel->ch_refcount;
- if (channel_need_redraw)
- {
- channel_need_redraw = FALSE;
- redraw_after_callback();
- }
+ if (channel_need_redraw)
+ {
+ channel_need_redraw = FALSE;
+ redraw_after_callback();
+ }
- if (!channel->ch_drop_never)
- /* any remaining messages are useless now */
- for (part = PART_SOCK; part < PART_IN; ++part)
- drop_messages(channel, part);
+ if (!channel->ch_drop_never)
+ /* any remaining messages are useless now */
+ for (part = PART_SOCK; part < PART_IN; ++part)
+ drop_messages(channel, part);
+ }
}
channel->ch_nb_close_cb = NULL;
diff --git a/src/terminal.c b/src/terminal.c
index 1ce4db7e9..b708f3e94 100644
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -36,7 +36,6 @@
* that buffer, attributes come from the scrollback buffer tl_scrollback.
*
* TODO:
- * - job_start('ls') sometimes does not work.
* - MS-Windows: no redraw for 'updatetime' #1915
* - in bash mouse clicks are inserting characters.
* - mouse scroll: when over other window, scroll that window.
diff --git a/src/version.c b/src/version.c
index a721d4254..d1b20b173 100644
--- a/src/version.c
+++ b/src/version.c
@@ -770,6 +770,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 869,
+/**/
868,
/**/
867,