public inbox for cygwin-cvs@sourceware.org help / color / mirror / Atom feed
From: Corinna Vinschen <corinna@sourceware.org> To: cygwin-cvs@sourceware.org Subject: [newlib-cygwin] Cygwin: console: Fix garbled input for non-ASCII chars. Date: Tue, 6 Jul 2021 14:05:37 +0000 (GMT) [thread overview] Message-ID: <20210706140537.1FC063888C55@sourceware.org> (raw) https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=98e3aeb1f521151f5b18fc2af9a8fecf11a98e76 commit 98e3aeb1f521151f5b18fc2af9a8fecf11a98e76 Author: Takashi Yano <takashi.yano@nifty.ne.jp> Date: Thu Jun 24 12:40:58 2021 +0900 Cygwin: console: Fix garbled input for non-ASCII chars. - After the commit ff4440fc, non-ASCII input may sometimes be garbled. This patch fixes the issue. Addresses: https://cygwin.com/pipermail/cygwin/2021-June/248775.html Diff: --- winsup/cygwin/fhandler_console.cc | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/winsup/cygwin/fhandler_console.cc b/winsup/cygwin/fhandler_console.cc index b3eae6a5a..e00f2cdbc 100644 --- a/winsup/cygwin/fhandler_console.cc +++ b/winsup/cygwin/fhandler_console.cc @@ -205,7 +205,7 @@ fhandler_console::cons_master_thread (handle_set_t *p, tty *ttyp) DWORD output_stopped_at = 0; while (con.owner == myself->pid) { - DWORD total_read, n, i, j; + DWORD total_read, n, i; INPUT_RECORD input_rec[INREC_SIZE]; WaitForSingleObject (p->input_mutex, INFINITE); @@ -213,7 +213,7 @@ fhandler_console::cons_master_thread (handle_set_t *p, tty *ttyp) switch (cygwait (p->input_handle, (DWORD) 0)) { case WAIT_OBJECT_0: - ReadConsoleInputA (p->input_handle, + ReadConsoleInputW (p->input_handle, input_rec, INREC_SIZE, &total_read); break; case WAIT_TIMEOUT: @@ -241,7 +241,10 @@ fhandler_console::cons_master_thread (handle_set_t *p, tty *ttyp) } for (i = 0; i < total_read; i++) { - const char c = input_rec[i].Event.KeyEvent.uChar.AsciiChar; + const wchar_t wc = input_rec[i].Event.KeyEvent.uChar.UnicodeChar; + if ((wint_t) wc >= 0x80) + continue; + char c = (char) wc; bool processed = false; termios &ti = ttyp->ti; switch (input_rec[i].EventType) @@ -318,15 +321,15 @@ fhandler_console::cons_master_thread (handle_set_t *p, tty *ttyp) } if (processed) { /* Remove corresponding record. */ - for (j = i; j < total_read - 1; j++) - input_rec[j] = input_rec[j + 1]; + memmove (input_rec + i, input_rec + i + 1, + sizeof (INPUT_RECORD) * (total_read - i - 1)); total_read--; i--; } } if (total_read) /* Write back input records other than interrupt. */ - WriteConsoleInput (p->input_handle, input_rec, total_read, &n); + WriteConsoleInputW (p->input_handle, input_rec, total_read, &n); skip_writeback: ReleaseMutex (p->input_mutex); cygwait (40);
next reply other threads:[~2021-07-06 14:05 UTC|newest] Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-07-06 14:05 Corinna Vinschen [this message] -- strict thread matches above, loose matches on Subject: below -- 2021-07-06 14:00 Corinna Vinschen
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20210706140537.1FC063888C55@sourceware.org \ --to=corinna@sourceware.org \ --cc=cygwin-cvs@sourceware.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).