Synopsis: bug in the alternate character set output Category: system Environment: System: OpenBSD 4.2 & 4.9 Architecture: OpenBSD.i386 Machine: i386 Description: curses and the like applications display curses ACS_VLINE characters incorrectly if the ACS_VLINE character is set to "|" How-To-Repeat: let's prepare test terminfo entry, where curses ACS_VLINE character is set to "|" (i. e. acsc must have "x|" somewhere in a terminfo description):
# cd # vi xterm0.ti # cat xterm0.ti # ACS test xterm0|xterm with simple ASCII pseudographics, acsc=+>\,<-\^.v0#`+a\:f\\h#j+k+l+m+n+o~p-q-r-s_t+u+v+w+|!}#~ox|, use=xterm, # cat xterm0.ti >> /usr/src/share/termtypes/termtypes.master # cd /usr/src/share/termtypes # make obj # make cleandir # make depend # make # make install after that let's prepare test curses program: # cd # vi test.c # cat test.c #include <stdlib.h> #include <curses.h> void ERROR(char *diag) { printf("%s\n", diag); exit(1); } int main() { if (initscr() == NULL) ERROR("initscr() error!"); if (cbreak() != OK) ERROR("cbreak() error!"); if (noecho() != OK) ERROR("noecho() error!"); if (nonl() != OK) ERROR("nonl() error!"); if (intrflush(stdscr, FALSE) != OK) ERROR("intrflush(stdscr, FALSE) error!"); if (keypad(stdscr, TRUE) != OK) ERROR("keypad(stdscr, TRUE) error!"); if (border(0, 0, 0, 0, 0, 0, 0, 0) != OK) ERROR("border(0, 0, 0, 0, 0, 0, 0, 0) error!"); if (refresh() != OK) ERROR("refresh() error!"); if (getch() == ERR) ERROR("getch() error!"); if (endwin() != OK) ERROR("endwin() error!"); return (0); } # rm -f test ; cc -lcurses -o test test.c ; echo $? 0 at console with TERM set to "xterm0" or in an xterm window (which was started as "xterm -tn xterm0 &") let's run our test program: # ./test this test shows us that curses ACS_VLINE characters are displayed incorrectly (i. e. not as "|") Fix: workaround is dumb - change "|" to "!" and curses ACS_VLINE characters will be displayed correctly (as "!"); but this does not fix the problem! -- Alexei Malinin