【问题标题】:How Do ncurses et. al. Work?如何做 ncurses 等。人。工作?
【发布时间】:2011-11-25 09:06:23
【问题描述】:

有几个库,如 ncurses,可以帮助制作命令行 GUI。

简单地说,它们是如何工作的?

我的第一个想法是 ncurses 拦截所有键盘输入,并通过正常逐行输出来绘制每个“帧”。然而,仔细检查会发现,每个新帧都会覆盖前一个帧。它如何修改已经输出的行?此外,它是如何处理颜色的?

编辑:同样的问题适用于任何带有“花哨”界面的东西,例如vimemacs

【问题讨论】:

    标签: user-interface command-line ncurses internals


    【解决方案1】:

    文本终端具有执行诸如将光标移动到屏幕上的特定位置、插入字符、删除行等操作的命令序列。

    每种终端类型都不同,并且有自己的一组命令序列。 ncurses 有一个数据库(详见terminfo

    ncurses 内部维护了两种屏幕视图:当前内容和应用当前待定更改后屏幕的外观。一旦程序请求重绘屏幕,ncurses 就会计算出一种有效的方法来更新屏幕以使其看起来像所需的视图。确切的字符/命令序列输出取决于所使用的终端类型。

    【讨论】:

    • 所以你的意思是,如果一个人要在没有 ncurses 的情况下控制终端(其目的是独立于设备,但假设我不在乎),我可以直接将这些控制字符写入标准输出, 即使大多数命令行程序只是在提示符下方打印文本,我也可以更改已经显示在屏幕任何部分的文本?
    • @huggie 是的,但你必须知道你的程序运行在什么类型的终端上。 Ncurses 会自动处理。
    【解决方案2】:

    curses(我认为也是 ncurses)通过在屏幕上移动光标来工作。有控制序列来做这些事情。再次查看代码,您会看到它们。这些序列不是 ASCII 控制字符,它们可能是以 (umm...) ESC 开头的字符串。查看here 以获得更高级别的解释。

    【讨论】:

    • 大多数终端支持(部分)ANSI escape sequences。它们以\033[ 开头,其中\033 确实是ESC。你可以在自己的终端上使用echo -e 打印其中的一些,看看会发生什么。 (reset(盲目输入并回车)将成为您的朋友,如果您设法将终端设置为不可见......)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多