# HG changeset patch # User Bram Moolenaar # Date 1662460203 -7200 # Node ID 87e205ae86d37ae197246aa5293e1a937f7a7221 # Parent 63a4c39ecf2d75706afe705395435360ca00b272 patch 9.0.0394: Cygwin: multibyte characters may be broken in terminal window Commit: https://github.com/vim/vim/commit/5903aaf7eb4586cf7e4fa5a219092334b05c89de Author: K.Takata Date: Tue Sep 6 11:26:56 2022 +0100 patch 9.0.0394: Cygwin: multibyte characters may be broken in terminal window Problem: Cygwin: multibyte characters may be broken in terminal window. Solution: Adjust how to read and write on the channel. (Ken Takata, closes #11063) diff --git a/src/channel.c b/src/channel.c --- a/src/channel.c +++ b/src/channel.c @@ -3589,6 +3589,24 @@ channel_free_all(void) // Buffer size for reading incoming messages. #define MAXMSGSIZE 4096 +/* + * Check if there are remaining data that should be written for "in_part". + */ + static int +is_channel_write_remaining(chanpart_T *in_part) +{ + buf_T *buf = in_part->ch_bufref.br_buf; + + if (in_part->ch_writeque.wq_next != NULL) + return TRUE; + if (buf == NULL) + return FALSE; + return in_part->ch_buf_append + ? (in_part->ch_buf_bot < buf->b_ml.ml_line_count) + : (in_part->ch_buf_top <= in_part->ch_buf_bot + && in_part->ch_buf_top <= buf->b_ml.ml_line_count); +} + #if defined(HAVE_SELECT) /* * Add write fds where we are waiting for writing to be possible. @@ -3604,8 +3622,7 @@ channel_fill_wfds(int maxfd_arg, fd_set chanpart_T *in_part = &ch->ch_part[PART_IN]; if (in_part->ch_fd != INVALID_FD - && (in_part->ch_bufref.br_buf != NULL - || in_part->ch_writeque.wq_next != NULL)) + && is_channel_write_remaining(in_part)) { FD_SET((int)in_part->ch_fd, wfds); if ((int)in_part->ch_fd >= maxfd) @@ -3629,8 +3646,7 @@ channel_fill_poll_write(int nfd_in, stru chanpart_T *in_part = &ch->ch_part[PART_IN]; if (in_part->ch_fd != INVALID_FD - && (in_part->ch_bufref.br_buf != NULL - || in_part->ch_writeque.wq_next != NULL)) + && is_channel_write_remaining(in_part)) { in_part->ch_poll_idx = nfd; fds[nfd].fd = in_part->ch_fd; @@ -3865,8 +3881,6 @@ channel_read(channel_T *channel, ch_part // Store the read message in the queue. channel_save(channel, part, buf, len, FALSE, "RECV "); readlen += len; - if (len < MAXMSGSIZE) - break; // did read everything that's available } // Reading a disconnection (readlen == 0), or an error. diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -704,6 +704,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 394, +/**/ 393, /**/ 392,