# HG changeset patch # User Bram Moolenaar # Date 1561438804 -7200 # Node ID 278583ff5e4419509df054b2ce301b128b8c2e33 # Parent bb5e800dda4a94b79a448d335cec602043dcc776 patch 8.1.1592: may start file dialog while exiting commit https://github.com/vim/vim/commit/5c381eb9e72990e4153045f4911c59b9b2194edd Author: Bram Moolenaar Date: Tue Jun 25 06:50:31 2019 +0200 patch 8.1.1592: may start file dialog while exiting Problem: May start file dialog while exiting. Solution: Ignore the "browse" modifier when exiting. (Ozaki Kiichi, closes #4582 diff --git a/src/ex_cmds.c b/src/ex_cmds.c --- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -3186,7 +3186,7 @@ do_write(exarg_T *eap) ffname = eap->arg; #ifdef FEAT_BROWSE - if (cmdmod.browse) + if (cmdmod.browse && !exiting) { browse_file = do_browse(BROWSE_SAVE, (char_u *)_("Save As"), ffname, NULL, NULL, NULL, curbuf); diff --git a/src/terminal.c b/src/terminal.c --- a/src/terminal.c +++ b/src/terminal.c @@ -358,6 +358,16 @@ setup_job_options(jobopt_T *opt, int row } /* + * Flush messages on channels. + */ + static void +term_flush_messages() +{ + mch_check_messages(); + parse_queued_messages(); +} + +/* * Close a terminal buffer (and its window). Used when creating the terminal * fails. */ @@ -1455,8 +1465,7 @@ term_try_stop_job(buf_T *buf) return OK; ui_delay(10L, FALSE); - mch_check_messages(); - parse_queued_messages(); + term_flush_messages(); } return FAIL; } @@ -3064,7 +3073,7 @@ term_channel_closed(channel_T *ch) for (term = first_term; term != NULL; term = next_term) { next_term = term->tl_next; - if (term->tl_job == ch->ch_job) + if (term->tl_job == ch->ch_job && !term->tl_channel_closed) { term->tl_channel_closed = TRUE; did_one = TRUE; @@ -5628,33 +5637,31 @@ f_term_wait(typval_T *argvars, typval_T ch_log(NULL, "term_wait(): waiting for channel to close"); while (buf->b_term != NULL && !buf->b_term->tl_channel_closed) { - mch_check_messages(); - parse_queued_messages(); + term_flush_messages(); + ui_delay(10L, FALSE); if (!buf_valid(buf)) /* If the terminal is closed when the channel is closed the * buffer disappears. */ break; } - mch_check_messages(); - parse_queued_messages(); + + term_flush_messages(); } else { long wait = 10L; - mch_check_messages(); - parse_queued_messages(); + term_flush_messages(); /* Wait for some time for any channel I/O. */ if (argvars[1].v_type != VAR_UNKNOWN) wait = tv_get_number(&argvars[1]); ui_delay(wait, TRUE); - mch_check_messages(); /* Flushing messages on channels is hopefully sufficient. * TODO: is there a better way? */ - parse_queued_messages(); + term_flush_messages(); } } diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -778,6 +778,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1592, +/**/ 1591, /**/ 1590,