【问题标题】:Borders don't draw properly when window has more than 8 columns当窗口超过 8 列时,边框无法正确绘制
【发布时间】:2019-01-09 16:06:35
【问题描述】:

当窗口宽度大于 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 `+-+`
 ¦       ¦
 ¦       ¦
 ¦       ¦
 +-+

【问题讨论】:

  • 对我来说没有错误。我看到一个完整的矩形。 (在 Ubuntu 18.04 上,在 bash 终端中运行,并使用 g++ 7.3.0 编译。)
  • 旁注:cbreak;不应该是cbreak();吗?
  • 好的,感谢测试。我有一种感觉,这是我的结局。我会做一些调查。
  • 你说得对,伊恩,我会在我的最后和问题中解决它。
  • 也适合我。每次我按下一个键,盒子就会向上转动一档。这可能与终端有关。您可以尝试使用不同的终端或在不同的机器上来缩小可能的原因吗?

标签: c ncurses


【解决方案1】:

ncurses 使用终端能力数据库来获取有关终端支持的终端控制序列的信息。它使用TERM 环境变量的值来查找此信息。 PuTTY 或 KiTTY 将所需的 TERM 环境变量值传递给 SSH 服务器。通常默认设置为“xterm”,但可以在 Connection -> Data -> Terminal-type string 下的会话设置中更改它强>。

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 终端支持 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 转义序列的支持。 (见change log。)

【讨论】:

    猜你喜欢
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多