c语言 - 当窗口超过 8 列时,边框绘制不正确



当窗口宽度超过8时,边框绘制函数似乎无法正确绘制顶部和底部边框。作为免责声明,我正在使用KiTTY将SSH连接到Arch Linux服务器中。

我是ncurse的新手,所以我很有可能做错了什么,但从我所读到的来看,这应该是对的。。。

#include <ncurses.h>
int main() {
initscr(); cbreak();
WINDOW *win = newwin(1,1, 1,1);
for(int i=1; i < 16; ++i) {
wresize(win, i, i);
wclear(win);
box(win, 0,0); // I've also tested wborder()
wrefresh(win);
mvprintw(0,0, "size: %i", i);
getch(); //pause
}
endwin();
return 0;
}

运行这个代码,这就是我所看到的:

size: 8
+------+
¦      ¦ Displays like this (normally)
¦      ¦ for both top and bottom borders
¦      ¦
¦      ¦
¦      ¦
¦      ¦
+------+
size: 9
+-+
¦       ¦ Each size up it will continue
¦       ¦ to look like this, with the
¦       ¦ top and bottom borders looking
¦       ¦ like `+-+`
¦       ¦
¦       ¦
¦       ¦
+-+

ncurses使用终端功能数据库来获取有关终端支持的终端控制序列的信息。它使用TERM环境变量的值来查找此信息。PuTTY或KiTTY将CCD_ 2环境变量的期望值传递给SSH服务器。通常它被设置为";xterm";默认情况下,但可以在连接->下的会话设置中更改数据->终端类型字符串

PuTTY和KiTTY用于支持";xterm";在终端能力数据库中相当好,但数据库的最新版本(2017年年中以后)优化了为";xterm";使用PuTTY或KiTTY当前不支持的序列。具体而言,它现在使用ECMA-48REP(重复字符)控制序列,而PuTTY不支持该序列。为了使线路图在具有最新终端功能数据库的系统上正常工作,需要为PuTTY或KiTTY更改TERM环境变量。(它可以在如上所述的会话设置中改变;腻子";或";putty-256色";。值";xterm old";也可能起作用。

检查"/usr/share/terminfo";目录,以查看系统实际定义了哪些终端类型。终端类型的第一个字母被分割成一个子目录,以便例如;腻子";终端类型由"/usr/share/terminfo/p/putty";文件

请注意,这个问题不仅会影响线条绘制,还会影响同一字符的任何水平重复六次以上。ncurses常见问题解答:

这只涵盖了终端描述中的功能,而没有解决终端仿真器之间的差异。例如,在2017年年中,xterm终端描述的更新添加了ECMA-48REP(重复字符)控件。自1997年1月以来,它一直是xterm的一部分,但使用该功能的终端描述仅是xterm的一部分(而不是ncurses)。将其添加到ncurses后,观察到:

  • rxvt不受影响,因为它不使用TERM=xterm
  • mlterm和OSX终端支持REP,使用TERM=xterm
  • VTE、konsole、PuTTY和iTerm2不支持xterm的这一标准的长期功能,尽管他们将TERM设置为xtermxterm-256color
  • screen和tmux使用不同的TERM设置,并且似乎可以工作(尽管tmux在测试中有一些其他问题)

跟进2020-09-07

PuTTY版本0.71(发布于2019-03-16)增加了对REP转义序列的支持。(请参阅更改日志。)

最新更新