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!