forked from aniani/vim
patch 8.0.0854: no redraw after terminal was closed
Problem: No redraw after terminal was closed. Solution: Set typebuf_was_filled. (Yasuhiro Matsumoto, closes #1925, closes #1924) Add function to check for messages even when input is available.
This commit is contained in:
@@ -809,6 +809,18 @@ mch_char_avail(void)
|
|||||||
/* never used */
|
/* never used */
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# if defined(FEAT_TERMINAL) || defined(PROTO)
|
||||||
|
/*
|
||||||
|
* Check for any pending input or messages.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
mch_check_messages(void)
|
||||||
|
{
|
||||||
|
/* TODO: check for messages */
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
@@ -175,8 +175,8 @@ typedef int waitstatus;
|
|||||||
#endif
|
#endif
|
||||||
static pid_t wait4pid(pid_t, waitstatus *);
|
static pid_t wait4pid(pid_t, waitstatus *);
|
||||||
|
|
||||||
static int WaitForChar(long msec, int *interrupted);
|
static int WaitForChar(long msec, int *interrupted, int ignore_input);
|
||||||
static int WaitForCharOrMouse(long msec, int *interrupted);
|
static int WaitForCharOrMouse(long msec, int *interrupted, int ignore_input);
|
||||||
#if defined(__BEOS__) || defined(VMS)
|
#if defined(__BEOS__) || defined(VMS)
|
||||||
int RealWaitForChar(int, long, int *, int *interrupted);
|
int RealWaitForChar(int, long, int *, int *interrupted);
|
||||||
#else
|
#else
|
||||||
@@ -481,7 +481,7 @@ mch_inchar(
|
|||||||
* We want to be interrupted by the winch signal
|
* We want to be interrupted by the winch signal
|
||||||
* or by an event on the monitored file descriptors.
|
* or by an event on the monitored file descriptors.
|
||||||
*/
|
*/
|
||||||
if (WaitForChar(wait_time, &interrupted))
|
if (WaitForChar(wait_time, &interrupted, FALSE))
|
||||||
{
|
{
|
||||||
/* If input was put directly in typeahead buffer bail out here. */
|
/* If input was put directly in typeahead buffer bail out here. */
|
||||||
if (typebuf_changed(tb_change_cnt))
|
if (typebuf_changed(tb_change_cnt))
|
||||||
@@ -536,9 +536,20 @@ handle_resize(void)
|
|||||||
int
|
int
|
||||||
mch_char_avail(void)
|
mch_char_avail(void)
|
||||||
{
|
{
|
||||||
return WaitForChar(0L, NULL);
|
return WaitForChar(0L, NULL, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(FEAT_TERMINAL) || defined(PROTO)
|
||||||
|
/*
|
||||||
|
* Check for any pending input or messages.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
mch_check_messages(void)
|
||||||
|
{
|
||||||
|
return WaitForChar(0L, NULL, TRUE);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(HAVE_TOTAL_MEM) || defined(PROTO)
|
#if defined(HAVE_TOTAL_MEM) || defined(PROTO)
|
||||||
# ifdef HAVE_SYS_RESOURCE_H
|
# ifdef HAVE_SYS_RESOURCE_H
|
||||||
# include <sys/resource.h>
|
# include <sys/resource.h>
|
||||||
@@ -718,7 +729,7 @@ mch_delay(long msec, int ignoreinput)
|
|||||||
in_mch_delay = FALSE;
|
in_mch_delay = FALSE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
WaitForChar(msec, NULL);
|
WaitForChar(msec, NULL, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(HAVE_STACK_LIMIT) \
|
#if defined(HAVE_STACK_LIMIT) \
|
||||||
@@ -5616,13 +5627,15 @@ mch_breakcheck(int force)
|
|||||||
* from inbuf[].
|
* from inbuf[].
|
||||||
* "msec" == -1 will block forever.
|
* "msec" == -1 will block forever.
|
||||||
* Invokes timer callbacks when needed.
|
* Invokes timer callbacks when needed.
|
||||||
|
* When "ignore_input" is TRUE even check for pending input when input is
|
||||||
|
* already available.
|
||||||
* "interrupted" (if not NULL) is set to TRUE when no character is available
|
* "interrupted" (if not NULL) is set to TRUE when no character is available
|
||||||
* but something else needs to be done.
|
* but something else needs to be done.
|
||||||
* Returns TRUE when a character is available.
|
* Returns TRUE when a character is available.
|
||||||
* When a GUI is being used, this will never get called -- webb
|
* When a GUI is being used, this will never get called -- webb
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
WaitForChar(long msec, int *interrupted)
|
WaitForChar(long msec, int *interrupted, int ignore_input)
|
||||||
{
|
{
|
||||||
#ifdef FEAT_TIMERS
|
#ifdef FEAT_TIMERS
|
||||||
long due_time;
|
long due_time;
|
||||||
@@ -5631,7 +5644,7 @@ WaitForChar(long msec, int *interrupted)
|
|||||||
|
|
||||||
/* When waiting very briefly don't trigger timers. */
|
/* When waiting very briefly don't trigger timers. */
|
||||||
if (msec >= 0 && msec < 10L)
|
if (msec >= 0 && msec < 10L)
|
||||||
return WaitForCharOrMouse(msec, NULL);
|
return WaitForCharOrMouse(msec, NULL, ignore_input);
|
||||||
|
|
||||||
while (msec < 0 || remaining > 0)
|
while (msec < 0 || remaining > 0)
|
||||||
{
|
{
|
||||||
@@ -5645,7 +5658,7 @@ WaitForChar(long msec, int *interrupted)
|
|||||||
}
|
}
|
||||||
if (due_time <= 0 || (msec > 0 && due_time > remaining))
|
if (due_time <= 0 || (msec > 0 && due_time > remaining))
|
||||||
due_time = remaining;
|
due_time = remaining;
|
||||||
if (WaitForCharOrMouse(due_time, interrupted))
|
if (WaitForCharOrMouse(due_time, interrupted, ignore_input))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
if (interrupted != NULL && *interrupted)
|
if (interrupted != NULL && *interrupted)
|
||||||
/* Nothing available, but need to return so that side effects get
|
/* Nothing available, but need to return so that side effects get
|
||||||
@@ -5656,7 +5669,7 @@ WaitForChar(long msec, int *interrupted)
|
|||||||
}
|
}
|
||||||
return FALSE;
|
return FALSE;
|
||||||
#else
|
#else
|
||||||
return WaitForCharOrMouse(msec, interrupted);
|
return WaitForCharOrMouse(msec, interrupted, ignore_input);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5664,12 +5677,13 @@ WaitForChar(long msec, int *interrupted)
|
|||||||
* Wait "msec" msec until a character is available from the mouse or keyboard
|
* Wait "msec" msec until a character is available from the mouse or keyboard
|
||||||
* or from inbuf[].
|
* or from inbuf[].
|
||||||
* "msec" == -1 will block forever.
|
* "msec" == -1 will block forever.
|
||||||
|
* for "ignore_input" see WaitForCharOr().
|
||||||
* "interrupted" (if not NULL) is set to TRUE when no character is available
|
* "interrupted" (if not NULL) is set to TRUE when no character is available
|
||||||
* but something else needs to be done.
|
* but something else needs to be done.
|
||||||
* When a GUI is being used, this will never get called -- webb
|
* When a GUI is being used, this will never get called -- webb
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
WaitForCharOrMouse(long msec, int *interrupted)
|
WaitForCharOrMouse(long msec, int *interrupted, int ignore_input)
|
||||||
{
|
{
|
||||||
#ifdef FEAT_MOUSE_GPM
|
#ifdef FEAT_MOUSE_GPM
|
||||||
int gpm_process_wanted;
|
int gpm_process_wanted;
|
||||||
@@ -5679,7 +5693,7 @@ WaitForCharOrMouse(long msec, int *interrupted)
|
|||||||
#endif
|
#endif
|
||||||
int avail;
|
int avail;
|
||||||
|
|
||||||
if (input_available()) /* something in inbuf[] */
|
if (!ignore_input && input_available()) /* something in inbuf[] */
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
#if defined(FEAT_MOUSE_DEC)
|
#if defined(FEAT_MOUSE_DEC)
|
||||||
@@ -5722,7 +5736,7 @@ WaitForCharOrMouse(long msec, int *interrupted)
|
|||||||
# endif
|
# endif
|
||||||
if (!avail)
|
if (!avail)
|
||||||
{
|
{
|
||||||
if (input_available())
|
if (!ignore_input && input_available())
|
||||||
return 1;
|
return 1;
|
||||||
# ifdef FEAT_XCLIPBOARD
|
# ifdef FEAT_XCLIPBOARD
|
||||||
if (rest == 0 || !do_xterm_trace())
|
if (rest == 0 || !do_xterm_trace())
|
||||||
|
@@ -1400,10 +1400,11 @@ handle_focus_event(INPUT_RECORD ir)
|
|||||||
/*
|
/*
|
||||||
* Wait until console input from keyboard or mouse is available,
|
* Wait until console input from keyboard or mouse is available,
|
||||||
* or the time is up.
|
* or the time is up.
|
||||||
|
* When "ignore_input" is TRUE even wait when input is available.
|
||||||
* Return TRUE if something is available FALSE if not.
|
* Return TRUE if something is available FALSE if not.
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
WaitForChar(long msec)
|
WaitForChar(long msec, int ignore_input)
|
||||||
{
|
{
|
||||||
DWORD dwNow = 0, dwEndTime = 0;
|
DWORD dwNow = 0, dwEndTime = 0;
|
||||||
INPUT_RECORD ir;
|
INPUT_RECORD ir;
|
||||||
@@ -1440,7 +1441,7 @@ WaitForChar(long msec)
|
|||||||
|| g_nMouseClick != -1
|
|| g_nMouseClick != -1
|
||||||
#endif
|
#endif
|
||||||
#ifdef FEAT_CLIENTSERVER
|
#ifdef FEAT_CLIENTSERVER
|
||||||
|| input_available()
|
|| (!ignore_input && input_available())
|
||||||
#endif
|
#endif
|
||||||
)
|
)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@@ -1583,8 +1584,19 @@ WaitForChar(long msec)
|
|||||||
int
|
int
|
||||||
mch_char_avail(void)
|
mch_char_avail(void)
|
||||||
{
|
{
|
||||||
return WaitForChar(0L);
|
return WaitForChar(0L, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# if defined(FEAT_TERMINAL) || defined(PROTO)
|
||||||
|
/*
|
||||||
|
* Check for any pending input or messages.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
mch_check_messages(void)
|
||||||
|
{
|
||||||
|
return WaitForChar(0L, TRUE);
|
||||||
|
}
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1614,7 +1626,7 @@ tgetch(int *pmodifiers, WCHAR *pch2)
|
|||||||
DWORD cRecords = 0;
|
DWORD cRecords = 0;
|
||||||
|
|
||||||
#ifdef FEAT_CLIENTSERVER
|
#ifdef FEAT_CLIENTSERVER
|
||||||
(void)WaitForChar(-1L);
|
(void)WaitForChar(-1L, FALSE);
|
||||||
if (input_available())
|
if (input_available())
|
||||||
return 0;
|
return 0;
|
||||||
# ifdef FEAT_MOUSE
|
# ifdef FEAT_MOUSE
|
||||||
@@ -1681,7 +1693,7 @@ mch_inchar(
|
|||||||
|
|
||||||
if (time >= 0)
|
if (time >= 0)
|
||||||
{
|
{
|
||||||
if (!WaitForChar(time)) /* no character available */
|
if (!WaitForChar(time, FALSE)) /* no character available */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else /* time == -1, wait forever */
|
else /* time == -1, wait forever */
|
||||||
@@ -1693,7 +1705,7 @@ mch_inchar(
|
|||||||
* write the autoscript file to disk. Or cause the CursorHold event
|
* write the autoscript file to disk. Or cause the CursorHold event
|
||||||
* to be triggered.
|
* to be triggered.
|
||||||
*/
|
*/
|
||||||
if (!WaitForChar(p_ut))
|
if (!WaitForChar(p_ut, FALSE))
|
||||||
{
|
{
|
||||||
#ifdef FEAT_AUTOCMD
|
#ifdef FEAT_AUTOCMD
|
||||||
if (trigger_cursorhold() && maxlen >= 3)
|
if (trigger_cursorhold() && maxlen >= 3)
|
||||||
@@ -1723,7 +1735,7 @@ mch_inchar(
|
|||||||
/* Keep looping until there is something in the typeahead buffer and more
|
/* Keep looping until there is something in the typeahead buffer and more
|
||||||
* to get and still room in the buffer (up to two bytes for a char and
|
* to get and still room in the buffer (up to two bytes for a char and
|
||||||
* three bytes for a modifier). */
|
* three bytes for a modifier). */
|
||||||
while ((typeaheadlen == 0 || WaitForChar(0L))
|
while ((typeaheadlen == 0 || WaitForChar(0L, FALSE))
|
||||||
&& typeaheadlen + 5 <= TYPEAHEADLEN)
|
&& typeaheadlen + 5 <= TYPEAHEADLEN)
|
||||||
{
|
{
|
||||||
if (typebuf_changed(tb_change_cnt))
|
if (typebuf_changed(tb_change_cnt))
|
||||||
@@ -5721,7 +5733,7 @@ cursor_visible(BOOL fVisible)
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* write `cbToWrite' bytes in `pchBuf' to the screen
|
* Write "cbToWrite" bytes in `pchBuf' to the screen.
|
||||||
* Returns the number of bytes actually written (at least one).
|
* Returns the number of bytes actually written (at least one).
|
||||||
*/
|
*/
|
||||||
static DWORD
|
static DWORD
|
||||||
@@ -5828,7 +5840,7 @@ mch_write(
|
|||||||
|
|
||||||
if (p_wd)
|
if (p_wd)
|
||||||
{
|
{
|
||||||
WaitForChar(p_wd);
|
WaitForChar(p_wd, FALSE);
|
||||||
if (prefix != 0)
|
if (prefix != 0)
|
||||||
prefix = 1;
|
prefix = 1;
|
||||||
}
|
}
|
||||||
@@ -6120,7 +6132,7 @@ mch_delay(
|
|||||||
# endif
|
# endif
|
||||||
Sleep((int)msec);
|
Sleep((int)msec);
|
||||||
else
|
else
|
||||||
WaitForChar(msec);
|
WaitForChar(msec, FALSE);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -3,6 +3,7 @@ int mch_chdir(char *path);
|
|||||||
void mch_write(char_u *s, int len);
|
void mch_write(char_u *s, int len);
|
||||||
int mch_inchar(char_u *buf, int maxlen, long wtime, int tb_change_cnt);
|
int mch_inchar(char_u *buf, int maxlen, long wtime, int tb_change_cnt);
|
||||||
int mch_char_avail(void);
|
int mch_char_avail(void);
|
||||||
|
int mch_check_messages(void);
|
||||||
long_u mch_total_mem(int special);
|
long_u mch_total_mem(int special);
|
||||||
void mch_delay(long msec, int ignoreinput);
|
void mch_delay(long msec, int ignoreinput);
|
||||||
int mch_stackcheck(char *p);
|
int mch_stackcheck(char *p);
|
||||||
|
@@ -8,6 +8,7 @@ void PlatformId(void);
|
|||||||
void mch_setmouse(int on);
|
void mch_setmouse(int on);
|
||||||
void mch_update_cursor(void);
|
void mch_update_cursor(void);
|
||||||
int mch_char_avail(void);
|
int mch_char_avail(void);
|
||||||
|
int mch_check_messages(void);
|
||||||
int mch_inchar(char_u *buf, int maxlen, long time, int tb_change_cnt);
|
int mch_inchar(char_u *buf, int maxlen, long time, int tb_change_cnt);
|
||||||
void mch_init(void);
|
void mch_init(void);
|
||||||
void mch_exit(int r);
|
void mch_exit(int r);
|
||||||
|
@@ -1305,6 +1305,7 @@ term_channel_closed(channel_T *ch)
|
|||||||
|
|
||||||
/* Need to break out of vgetc(). */
|
/* Need to break out of vgetc(). */
|
||||||
ins_char_typebuf(K_IGNORE);
|
ins_char_typebuf(K_IGNORE);
|
||||||
|
typebuf_was_filled = TRUE;
|
||||||
|
|
||||||
term = curbuf->b_term;
|
term = curbuf->b_term;
|
||||||
if (term != NULL)
|
if (term != NULL)
|
||||||
@@ -2140,31 +2141,36 @@ f_term_wait(typval_T *argvars, typval_T *rettv UNUSED)
|
|||||||
ch_log(NULL, "term_wait(): invalid argument");
|
ch_log(NULL, "term_wait(): invalid argument");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (buf->b_term->tl_job == NULL)
|
||||||
|
{
|
||||||
|
ch_log(NULL, "term_wait(): no job to wait for");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* Get the job status, this will detect a job that finished. */
|
/* Get the job status, this will detect a job that finished. */
|
||||||
if (buf->b_term->tl_job == NULL
|
if (STRCMP(job_status(buf->b_term->tl_job), "dead") == 0)
|
||||||
|| STRCMP(job_status(buf->b_term->tl_job), "dead") == 0)
|
|
||||||
{
|
{
|
||||||
/* The job is dead, keep reading channel I/O until the channel is
|
/* The job is dead, keep reading channel I/O until the channel is
|
||||||
* closed. */
|
* closed. */
|
||||||
|
ch_log(NULL, "term_wait(): waiting for channel to close");
|
||||||
while (buf->b_term != NULL && !buf->b_term->tl_channel_closed)
|
while (buf->b_term != NULL && !buf->b_term->tl_channel_closed)
|
||||||
{
|
{
|
||||||
mch_char_avail();
|
mch_check_messages();
|
||||||
parse_queued_messages();
|
parse_queued_messages();
|
||||||
ui_delay(10L, FALSE);
|
ui_delay(10L, FALSE);
|
||||||
}
|
}
|
||||||
mch_char_avail();
|
mch_check_messages();
|
||||||
parse_queued_messages();
|
parse_queued_messages();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mch_char_avail();
|
mch_check_messages();
|
||||||
parse_queued_messages();
|
parse_queued_messages();
|
||||||
|
|
||||||
/* Wait for 10 msec for any channel I/O. */
|
/* Wait for 10 msec for any channel I/O. */
|
||||||
/* TODO: use delay from optional argument */
|
/* TODO: use delay from optional argument */
|
||||||
ui_delay(10L, TRUE);
|
ui_delay(10L, TRUE);
|
||||||
mch_char_avail();
|
mch_check_messages();
|
||||||
|
|
||||||
/* Flushing messages on channels is hopefully sufficient.
|
/* Flushing messages on channels is hopefully sufficient.
|
||||||
* TODO: is there a better way? */
|
* TODO: is there a better way? */
|
||||||
|
@@ -769,6 +769,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
854,
|
||||||
/**/
|
/**/
|
||||||
853,
|
853,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user