Hello Cág, Brett and netbsd-users@! (I'll reply to both emails here) Cág writes: > [...] > I don't understand whether it's a curses(3) thing or a program bug, but > linking against ncursesw makes noice display the name correctly. > [...]
At least regarding the noice problem, that's just a kludge but a possible patch that workaround the problem is attached in this email (it can be used as a LOCALPATCHES for sysutils/noice). Most printw() calls in noice seems easy to be changed to addstr() ones and with them the single bytes are output as-is (IIUC!). Brett Lymn writes: > [...] > More than likely an application bug but one that is hidden by the > behaviour of ncursss. It is hard to say without looking at the code but > it could be something in the terminal initialisation or environment that > is changing what is on the screen... The complicating factor in some > situations is the differences in the interpretation done by the terminal > doing the display (though, in this case I don't think this applies). > [...] The following code should be enough to reproduce what happens in noice via argv[]: #include <locale.h> #include <curses.h> int main(int argc, char *argv[]) { int i; setlocale(LC_ALL, ""); initscr(); for (i = 1; i < argc; i++) printw("%s\n", argv[i]); getch(); endwin(); return 0; }
$NetBSD$ Directly use addstr() instead of printw() in order to output every bytes without any transformation (and hence also correctly displaying Unicode characters). --- noice.c.orig 2018-08-10 18:55:47.299592935 +0200 +++ noice.c 2018-08-10 19:01:15.778111428 +0200 @@ -293,7 +293,8 @@ printmsg(char *msg) { move(LINES - 1, 0); - printw("%s\n", msg); + addstr(msg); + addstr("\n"); } /* Display warning as a message */ @@ -324,7 +325,7 @@ printprompt(char *str) { clearprompt(); - printw(str); + addstr(str); } /* Returns SEL_* if key is bound and 0 otherwise. @@ -428,10 +429,16 @@ if (strlen(name) > maxlen) name[maxlen] = '\0'; - if (cm == 0) - printw("%s%s\n", active ? CURSR : EMPTY, name); - else - printw("%s%s%c\n", active ? CURSR : EMPTY, name, cm); + if (cm == 0) { + addstr(active ? CURSR : EMPTY ); + addstr(name); + addstr("\n"); + } else { + addstr(active ? CURSR : EMPTY); + addstr(name); + addch(cm); + addstr("\n"); + } } int