summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorK.Takata <kentkt@csc.jp>2022-09-06 11:26:56 +0100
committerBram Moolenaar <Bram@vim.org>2022-09-06 11:26:56 +0100
commit5903aaf7eb4586cf7e4fa5a219092334b05c89de (patch)
tree7def8c1b3568a48f05766aca55c13c684678bbb1
parenta9480dbc8c4381e4139db1ab7969722f4d100bac (diff)
downloadvim-git-9.0.0394.tar.gz
patch 9.0.0394: Cygwin: multibyte characters may be broken in terminal windowv9.0.0394
Problem: Cygwin: multibyte characters may be broken in terminal window. Solution: Adjust how to read and write on the channel. (Ken Takata, closes #11063)
-rw-r--r--src/channel.c26
-rw-r--r--src/version.c2
2 files changed, 22 insertions, 6 deletions
diff --git a/src/channel.c b/src/channel.c
index 80fe4c4be..d5dee9a04 100644
--- 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 *wfds)
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, struct pollfd *fds)
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_T part, char *func)
// 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
index 219b4144b..df8ab270d 100644
--- 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,