From c49b79d792a8a7d298b3d4dcd3dc1755a5a95060 Mon Sep 17 00:00:00 2001 From: Arun Prakash Jana Date: Sat, 26 Aug 2017 13:34:43 +0530 Subject: [PATCH] Fix cursor position issue with astral symbols MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In case of astral symbols like Devanagari matras multiple wide-char codepoints occupy a single position/column. Positioning the cursor wrt. the actual number of wide-characters in a wide-char string gets "visually incorrect". The trick is to calculate the correct number of columns needed to represent a fixed-size wide-character string. Relevant man pages: 1. wcswidth(3) 2. wctomb(3) 3. mblen(3) Interesting links: 1. https://www.gnu.org/software/libc/manual/html_node/Non_002dreentrant-Character-Conversion.html 2. https://www.gnu.org/software/libc/manual/html_node/Shift-State.html 3. https://10hash.com/c-programming/uchar/ 4. https://mathiasbynens.be/notes/javascript-unicode#accounting-for-astral-symbols Example file names for test: 1. Malgudi Days - मालगुडी डेज - E05. Swami and Friends - स्वामी और उसके दोस्त (Part 5) 2. Eso eso aamar ghare eso ♫ এসো এসো আমার ঘরে এসো ♫ Swagatalakshmi Dasgupta 3. Führer --- nnn.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/nnn.c b/nnn.c index b554f2bf..5d71b215 100644 --- a/nnn.c +++ b/nnn.c @@ -44,6 +44,9 @@ #define _XOPEN_SOURCE_EXTENDED #endif #endif +#ifndef __USE_XOPEN /* Fix failure due to wcswidth(), ncursesw/curses.h includes whcar.h on Ubuntu 14.04 */ +#define __USE_XOPEN +#endif #include #include #include @@ -64,13 +67,13 @@ #include #include #include -#include #include #include #ifndef __USE_XOPEN_EXTENDED #define __USE_XOPEN_EXTENDED 1 #endif #include +#include #include "config.h" @@ -1026,7 +1029,7 @@ xreadline(char *fname) while (1) { buf[len] = ' '; mvaddnwstr(y, x, buf, len + 1); - move(y, x + pos); + move(y, x + wcswidth(buf, pos)); if ((r = get_wch(ch)) != ERR) { if (r == OK) {