将旧的DOS TUI移植到ncurses

时间:2017-03-28 17:30:59

标签: terminal cross-platform ncurses

我想就如何移植90年代早期为MS-DOS编写的旧C ++程序提出一些建议。

该程序实现了一个非常复杂的文本用户界面。接口代码与逻辑完全分离,我认为使用ncurses并不太难。

作为一个完整的新手,我有几个问题:

  1. DOS程序拦截中断0x33以处理鼠标事件。中断处理程序将事件存储在FIFO中,主程序定期将其存储在FIFO中。 (FIFO中的每个元素都是一个C结构,包含有关事件性质,鼠标位置和按钮状态的信息。)为了保持代码逻辑不变,我想要触发一个调用的线程getch()在无限循环内异步,并以与旧程序相同的方式填充FIFO。我的想法是这个线程,只有这个线程,应该访问stdin,而主线程只负责访问stdout(通过add_wch()和类似)。是否可以安全地使用ncurses,或者stdin / stdout访问是否需要始终在同一个线程中完成?

  2. 在这个应用程序中设置颜色的方式非常拜占庭,因为它使用了“继承的调色板”的概念。基本上,窗口通常指定背景和前景颜色,并且该窗口中的每个窗口小部件仅设置前景(但是一些窗口小部件重新定义fg / bg)。我知道ncurses的attr()总是希望使用pair指定颜色,必须使用initp()进行初始化,这与这个程序的逻辑不太匹配。因此,当程序想要分别更改fg / bg颜色时,我正在考虑使用tiparm()直接发送setaf / setbf序列。 (我将失去在不支持setaf / setbf的终端上运行代码的能力,但这不会是一个巨大的损失。)发送setaf / setbf控制序列然后调用add_wch()之类的函数是安全的,或者如果后者只与attr()一起使用?

    我可以编写一些测试脚本来检查我的想法是否有效,但我不确定这种方法是否应该始终有效。

  3. 感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

有很多可能性 - 但所描述的方法听起来像 terminfo (低级)而不是 curses ,除了提到add_wch。而不是tiparm,curses应用程序将使用wattr_setinit_pairstart_color等。

ncurses I / O必须在一个线程中;虽然可以编译ncurses来帮助(通过在某些地方使用互斥锁),但是包装工人通常会忽略它(即使使用该配置,应用程序开发人员仍然可以做的工作)。

进一步阅读: