有几个库(如ncurses)可用于制作命令行GUI。
简单来说,它们是如何工作的呢?
我的第一反应是ncurses拦截所有键盘输入,并通过逐行输出绘制每个“帧”。然而,进一步观察发现,每个新的帧都会覆盖之前的帧。那么它是如何修改已经输出的行呢?此外,它如何处理颜色?
编辑:同样的问题也适用于任何具有“高级”界面的东西,如vim
和emacs
。
有几个库(如ncurses)可用于制作命令行GUI。
简单来说,它们是如何工作的呢?
我的第一反应是ncurses拦截所有键盘输入,并通过逐行输出绘制每个“帧”。然而,进一步观察发现,每个新的帧都会覆盖之前的帧。那么它是如何修改已经输出的行呢?此外,它如何处理颜色?
编辑:同样的问题也适用于任何具有“高级”界面的东西,如vim
和emacs
。
文本终端具有命令序列,可以执行在屏幕上移动光标、插入字符、删除行等操作。
每种终端类型都不同,具有自己的一组命令序列。ncurses有一个数据库(详见terminfo)。
在内部,ncurses维护着屏幕的两个视图:当前内容和应用了当前挂起更改后屏幕应该显示的内容。一旦程序请求重新绘制屏幕,ncurses会计算出一种有效的方式来更新屏幕以显示所需的视图。输出的确切字符/命令序列取决于使用的终端类型。