Patch 8.0.0854
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.
Files: src/terminal.c, src/os_unix.c, src/proto/os_unix.pro,
src/os_win32.c, src/proto/os_win32.pro, src/os_mswin.c
*** ../vim-8.0.0853/src/terminal.c 2017-08-03 19:22:32.281906757 +0200
--- src/terminal.c 2017-08-03 20:32:59.023355123 +0200
***************
*** 1305,1310 ****
--- 1305,1311 ----
/* Need to break out of vgetc(). */
ins_char_typebuf(K_IGNORE);
+ typebuf_was_filled = TRUE;
term = curbuf->b_term;
if (term != NULL)
***************
*** 2140,2170 ****
ch_log(NULL, "term_wait(): invalid argument");
return;
}
/* Get the job status, this will detect a job that finished. */
! if (buf->b_term->tl_job == NULL
! || STRCMP(job_status(buf->b_term->tl_job), "dead") == 0)
{
/* The job is dead, keep reading channel I/O until the channel is
* closed. */
while (buf->b_term != NULL && !buf->b_term->tl_channel_closed)
{
! mch_char_avail();
parse_queued_messages();
ui_delay(10L, FALSE);
}
! mch_char_avail();
parse_queued_messages();
}
else
{
! mch_char_avail();
parse_queued_messages();
/* Wait for 10 msec for any channel I/O. */
/* TODO: use delay from optional argument */
ui_delay(10L, TRUE);
! mch_char_avail();
/* Flushing messages on channels is hopefully sufficient.
* TODO: is there a better way? */
--- 2141,2176 ----
ch_log(NULL, "term_wait(): invalid argument");
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. */
! if (STRCMP(job_status(buf->b_term->tl_job), "dead") == 0)
{
/* The job is dead, keep reading channel I/O until the channel is
* closed. */
+ 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();
ui_delay(10L, FALSE);
}
! mch_check_messages();
parse_queued_messages();
}
else
{
! mch_check_messages();
parse_queued_messages();
/* Wait for 10 msec for any channel I/O. */
/* TODO: use delay from optional argument */
ui_delay(10L, TRUE);
! mch_check_messages();
/* Flushing messages on channels is hopefully sufficient.
* TODO: is there a better way? */
*** ../vim-8.0.0853/src/os_unix.c 2017-08-03 13:51:02.380784846 +0200
--- src/os_unix.c 2017-08-03 20:32:09.339711561 +0200
***************
*** 175,182 ****
#endif
static pid_t wait4pid(pid_t, waitstatus *);
! static int WaitForChar(long msec, int *interrupted);
! static int WaitForCharOrMouse(long msec, int *interrupted);
#if defined(__BEOS__) || defined(VMS)
int RealWaitForChar(int, long, int *, int *interrupted);
#else
--- 175,182 ----
#endif
static pid_t wait4pid(pid_t, waitstatus *);
! static int WaitForChar(long msec, int *interrupted, int ignore_input);
! static int WaitForCharOrMouse(long msec, int *interrupted, int ignore_input);
#if defined(__BEOS__) || defined(VMS)
int RealWaitForChar(int, long, int *, int *interrupted);
#else
***************
*** 481,487 ****
* We want to be interrupted by the winch signal
* or by an event on the monitored file descriptors.
*/
! if (WaitForChar(wait_time, &interrupted))
{
/* If input was put directly in typeahead buffer bail out here. */
if (typebuf_changed(tb_change_cnt))
--- 481,487 ----
* We want to be interrupted by the winch signal
* or by an event on the monitored file descriptors.
*/
! if (WaitForChar(wait_time, &interrupted, FALSE))
{
/* If input was put directly in typeahead buffer bail out here. */
if (typebuf_changed(tb_change_cnt))
***************
*** 536,544 ****
int
mch_char_avail(void)
{
! return WaitForChar(0L, NULL);
}
#if defined(HAVE_TOTAL_MEM) || defined(PROTO)
# ifdef HAVE_SYS_RESOURCE_H
# include <sys/resource.h>
--- 536,555 ----
int
mch_char_avail(void)
{
! 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)
# ifdef HAVE_SYS_RESOURCE_H
# include <sys/resource.h>
***************
*** 718,724 ****
in_mch_delay = FALSE;
}
else
! WaitForChar(msec, NULL);
}
#if defined(HAVE_STACK_LIMIT) \
--- 729,735 ----
in_mch_delay = FALSE;
}
else
! WaitForChar(msec, NULL, FALSE);
}
#if defined(HAVE_STACK_LIMIT) \
***************
*** 5616,5628 ****
* from inbuf[].
* "msec" == -1 will block forever.
* Invokes timer callbacks when needed.
* "interrupted" (if not NULL) is set to TRUE when no character is available
* but something else needs to be done.
* Returns TRUE when a character is available.
* When a GUI is being used, this will never get called -- webb
*/
static int
! WaitForChar(long msec, int *interrupted)
{
#ifdef FEAT_TIMERS
long due_time;
--- 5627,5641 ----
* from inbuf[].
* "msec" == -1 will block forever.
* 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
* but something else needs to be done.
* Returns TRUE when a character is available.
* When a GUI is being used, this will never get called -- webb
*/
static int
! WaitForChar(long msec, int *interrupted, int ignore_input)
{
#ifdef FEAT_TIMERS
long due_time;
***************
*** 5631,5637 ****
/* When waiting very briefly don't trigger timers. */
if (msec >= 0 && msec < 10L)
! return WaitForCharOrMouse(msec, NULL);
while (msec < 0 || remaining > 0)
{
--- 5644,5650 ----
/* When waiting very briefly don't trigger timers. */
if (msec >= 0 && msec < 10L)
! return WaitForCharOrMouse(msec, NULL, ignore_input);
while (msec < 0 || remaining > 0)
{
***************
*** 5645,5651 ****
}
if (due_time <= 0 || (msec > 0 && due_time > remaining))
due_time = remaining;
! if (WaitForCharOrMouse(due_time, interrupted))
return TRUE;
if (interrupted != NULL && *interrupted)
/* Nothing available, but need to return so that side effects get
--- 5658,5664 ----
}
if (due_time <= 0 || (msec > 0 && due_time > remaining))
due_time = remaining;
! if (WaitForCharOrMouse(due_time, interrupted, ignore_input))
return TRUE;
if (interrupted != NULL && *interrupted)
/* Nothing available, but need to return so that side effects get
***************
*** 5656,5662 ****
}
return FALSE;
#else
! return WaitForCharOrMouse(msec, interrupted);
#endif
}
--- 5669,5675 ----
}
return FALSE;
#else
! return WaitForCharOrMouse(msec, interrupted, ignore_input);
#endif
}
***************
*** 5664,5675 ****
* Wait "msec" msec until a character is available from the mouse or keyboard
* or from inbuf[].
* "msec" == -1 will block forever.
* "interrupted" (if not NULL) is set to TRUE when no character is available
* but something else needs to be done.
* When a GUI is being used, this will never get called -- webb
*/
static int
! WaitForCharOrMouse(long msec, int *interrupted)
{
#ifdef FEAT_MOUSE_GPM
int gpm_process_wanted;
--- 5677,5689 ----
* Wait "msec" msec until a character is available from the mouse or keyboard
* or from inbuf[].
* "msec" == -1 will block forever.
+ * for "ignore_input" see WaitForCharOr().
* "interrupted" (if not NULL) is set to TRUE when no character is available
* but something else needs to be done.
* When a GUI is being used, this will never get called -- webb
*/
static int
! WaitForCharOrMouse(long msec, int *interrupted, int ignore_input)
{
#ifdef FEAT_MOUSE_GPM
int gpm_process_wanted;
***************
*** 5679,5685 ****
#endif
int avail;
! if (input_available()) /* something in inbuf[] */
return 1;
#if defined(FEAT_MOUSE_DEC)
--- 5693,5699 ----
#endif
int avail;
! if (!ignore_input && input_available()) /* something in inbuf[] */
return 1;
#if defined(FEAT_MOUSE_DEC)
***************
*** 5722,5728 ****
# endif
if (!avail)
{
! if (input_available())
return 1;
# ifdef FEAT_XCLIPBOARD
if (rest == 0 || !do_xterm_trace())
--- 5736,5742 ----
# endif
if (!avail)
{
! if (!ignore_input && input_available())
return 1;
# ifdef FEAT_XCLIPBOARD
if (rest == 0 || !do_xterm_trace())
*** ../vim-8.0.0853/src/proto/os_unix.pro 2017-08-01 22:24:21.553439094
+0200
--- src/proto/os_unix.pro 2017-08-03 20:32:14.475674718 +0200
***************
*** 3,8 ****
--- 3,9 ----
void mch_write(char_u *s, int len);
int mch_inchar(char_u *buf, int maxlen, long wtime, int tb_change_cnt);
int mch_char_avail(void);
+ int mch_check_messages(void);
long_u mch_total_mem(int special);
void mch_delay(long msec, int ignoreinput);
int mch_stackcheck(char *p);
*** ../vim-8.0.0853/src/os_win32.c 2017-08-02 23:18:21.459665648 +0200
--- src/os_win32.c 2017-08-03 20:39:27.768564299 +0200
***************
*** 1400,1409 ****
/*
* Wait until console input from keyboard or mouse is available,
* or the time is up.
* Return TRUE if something is available FALSE if not.
*/
static int
! WaitForChar(long msec)
{
DWORD dwNow = 0, dwEndTime = 0;
INPUT_RECORD ir;
--- 1400,1410 ----
/*
* Wait until console input from keyboard or mouse is available,
* 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.
*/
static int
! WaitForChar(long msec, int ignore_input)
{
DWORD dwNow = 0, dwEndTime = 0;
INPUT_RECORD ir;
***************
*** 1440,1446 ****
|| g_nMouseClick != -1
#endif
#ifdef FEAT_CLIENTSERVER
! || input_available()
#endif
)
return TRUE;
--- 1441,1447 ----
|| g_nMouseClick != -1
#endif
#ifdef FEAT_CLIENTSERVER
! || (!ignore_input && input_available())
#endif
)
return TRUE;
***************
*** 1583,1590 ****
int
mch_char_avail(void)
{
! return WaitForChar(0L);
}
#endif
/*
--- 1584,1602 ----
int
mch_char_avail(void)
{
! 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
/*
***************
*** 1614,1620 ****
DWORD cRecords = 0;
#ifdef FEAT_CLIENTSERVER
! (void)WaitForChar(-1L);
if (input_available())
return 0;
# ifdef FEAT_MOUSE
--- 1626,1632 ----
DWORD cRecords = 0;
#ifdef FEAT_CLIENTSERVER
! (void)WaitForChar(-1L, FALSE);
if (input_available())
return 0;
# ifdef FEAT_MOUSE
***************
*** 1681,1687 ****
if (time >= 0)
{
! if (!WaitForChar(time)) /* no character available */
return 0;
}
else /* time == -1, wait forever */
--- 1693,1699 ----
if (time >= 0)
{
! if (!WaitForChar(time, FALSE)) /* no character available */
return 0;
}
else /* time == -1, wait forever */
***************
*** 1693,1699 ****
* write the autoscript file to disk. Or cause the CursorHold event
* to be triggered.
*/
! if (!WaitForChar(p_ut))
{
#ifdef FEAT_AUTOCMD
if (trigger_cursorhold() && maxlen >= 3)
--- 1705,1711 ----
* write the autoscript file to disk. Or cause the CursorHold event
* to be triggered.
*/
! if (!WaitForChar(p_ut, FALSE))
{
#ifdef FEAT_AUTOCMD
if (trigger_cursorhold() && maxlen >= 3)
***************
*** 1723,1729 ****
/* 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
* three bytes for a modifier). */
! while ((typeaheadlen == 0 || WaitForChar(0L))
&& typeaheadlen + 5 <= TYPEAHEADLEN)
{
if (typebuf_changed(tb_change_cnt))
--- 1735,1741 ----
/* 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
* three bytes for a modifier). */
! while ((typeaheadlen == 0 || WaitForChar(0L, FALSE))
&& typeaheadlen + 5 <= TYPEAHEADLEN)
{
if (typebuf_changed(tb_change_cnt))
***************
*** 5721,5727 ****
/*
! * write `cbToWrite' bytes in `pchBuf' to the screen
* Returns the number of bytes actually written (at least one).
*/
static DWORD
--- 5733,5739 ----
/*
! * Write "cbToWrite" bytes in `pchBuf' to the screen.
* Returns the number of bytes actually written (at least one).
*/
static DWORD
***************
*** 5828,5834 ****
if (p_wd)
{
! WaitForChar(p_wd);
if (prefix != 0)
prefix = 1;
}
--- 5840,5846 ----
if (p_wd)
{
! WaitForChar(p_wd, FALSE);
if (prefix != 0)
prefix = 1;
}
***************
*** 6120,6126 ****
# endif
Sleep((int)msec);
else
! WaitForChar(msec);
#endif
}
--- 6132,6138 ----
# endif
Sleep((int)msec);
else
! WaitForChar(msec, FALSE);
#endif
}
*** ../vim-8.0.0853/src/proto/os_win32.pro 2017-08-02 23:18:21.459665648
+0200
--- src/proto/os_win32.pro 2017-08-03 20:39:33.036526458 +0200
***************
*** 8,13 ****
--- 8,14 ----
void mch_setmouse(int on);
void mch_update_cursor(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);
void mch_init(void);
void mch_exit(int r);
*** ../vim-8.0.0853/src/os_mswin.c 2017-03-19 21:47:46.897119250 +0100
--- src/os_mswin.c 2017-08-03 20:41:29.415690323 +0200
***************
*** 809,814 ****
--- 809,826 ----
/* never used */
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
*** ../vim-8.0.0853/src/version.c 2017-08-03 19:22:32.285906728 +0200
--- src/version.c 2017-08-03 20:42:00.807464738 +0200
***************
*** 771,772 ****
--- 771,774 ----
{ /* Add new patch number below this line */
+ /**/
+ 854,
/**/
--
BLACK KNIGHT: I move for no man.
ARTHUR: So be it!
[hah] [parry thrust]
[ARTHUR chops the BLACK KNIGHT's left arm off]
ARTHUR: Now stand aside, worthy adversary.
BLACK KNIGHT: 'Tis but a scratch.
The Quest for the Holy Grail (Monty Python)
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.