窗口超过8列时边框无法正确绘制

时间:2019-01-09 16:06:35

标签: c ncurses

当窗口的宽度大于8时,边框绘制功能似乎无法正确绘制上下边框。作为免责声明,我正在使用KiTTY SSH进入Arch Linux服务器。

我是ncurses的新手,所以很有可能我做错了事,但是从我读到的内容来看,这应该是正确的...

#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 `+-+`
 ¦       ¦
 ¦       ¦
 ¦       ¦
 +-+

1 个答案:

答案 0 :(得分:1)

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

PuTTY和KiTTY曾经在终端能力数据库中很好地支持“ xterm”的控制序列,但是数据库的最新版本(2017年中以后)优化了为“ xterm”定义的序列,以使用当前不支持的序列通过PuTTY或KiTTY。具体来说,现在它利用了PuTTY不支持的ECMA-48 REP (重复字符)控制序列。为了使线条图在具有最新终端功能数据库的系统上正常工作,需要更改PuTTY或KiTTY的TERM环境变量。 (可以如上所述在会话设置中更改它。)终端功能数据库的最新版本的合适值包括“ putty”或“ putty-256color”。值“ xterm-old”也可以使用。

检查主机系统上的“ / usr / share / terminfo”目录,以查看系统实际定义了哪些终端类型。终端类型的第一个字母被拆分为一个子目录,例如,“ putty”终端类型的终端功能由“ / usr / share / terminfo / p / putty”文件定义。

请注意,此问题不仅影响画线,而且还会影响同一字符的水平重复超过六次。由ncurses FAQ解决:

  

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

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