编写Linux终端仿真器

时间:2014-03-21 22:11:09

标签: linux tty pty terminal-emulator

我想编写一个x11终端模拟器,但我不知道如何生成并与shell通信,是否有任何基本(伪或C)代码?比如要创建什么类型的PTY,如何将shell绑定到它,我必须捕获或发送的信号等等。不要真的想要整理整个xterm源。

编辑:哦,我想实现与其中任何应用程序通信的方式,我该如何进行功能发现? "客户端"中有一些隐藏的ansi序列,希望它不会与其他终端模拟器发生冲突?一些环境变量,希望它不会与"客户"或者被shell删除?

2 个答案:

答案 0 :(得分:4)

YAT(又一个终端)https://github.com/jorgen/yat适合嵌入Qt Quick程序。欢迎提供改进的贡献。 (免责声明:一位朋友开始了这个项目,我有时会对它进行处理。)这需要一种大致正确的方法(例如,它正确地使用Linux伪终端,在我的朋友解释之前我不知道的事情) ,并具有很多功能;然而,解析器是从头开始编写的,并且还没有特征完整或没有错误。

不幸的是,到目前为止,大多数终端实现都是从头开始,或者是一次性的单片fork(例如来自rxvt),这是很多工作并导致所有这些都不完整。所以我认为更好的选择是使用一个名为libvterm的可重用逻辑库:http://www.leonerd.org.uk/code/libvterm/或者将终端基于已经使用它的终端。这样,如果您发现错误并修复它们,您将改善整个生态系统。

https://github.com/timmoorhouse/imgui-terminal很有意思,并且有效(至少在某种程度上),但是它是用libvterm,IMO重写的主要候选者。如果您在OpenGL中进行立即模式渲染,那么无论如何它都可能是一个不错的选择。

http://41j.com/hterm/确实使用libvterm,并添加了一些libvterm没有的功能,用于内联图形渲染(ReGIS和PNG)。但是代码不够优雅或不够便携,IMO和图形渲染"浮动"在文本而不是真正的内联。对于某些用例,它仍然可能是一个充分的起点。在我的fork https://github.com/ec1oud/hackterm中,我使用大多数现代系统库来构建它,但它仍然依赖于SDL的过时版本,包括在内。

答案 1 :(得分:2)

好的,如果有人也需要这个,并且正在使用lua,我发现http://www.tset.de/lpty库工作正常。仍在测试ansi逃脱和东西,但应该工作。