ncurses - 屏幕真彩 Ubuntu 18.04 坏了
问题描述
我自己编译的少数软件之一是屏幕。我发现它倾向于比存储库中的版本更好地支持终端的一些现代功能。我已经这样做了一段时间了,没有太多问题。但是,在升级到 18.04 时,(真)颜色似乎已经损坏。
我运行这段代码来打印彩虹,它仍然可以在裸机中工作:
awk 'BEGIN{
s="/\\/\\/\\/\\/\\"; s=s s s s s s s s;
for (colnum = 0; colnum<77; colnum++) {
r = 255-(colnum*255/76);
g = (colnum*510/76);
b = (colnum*255/76);
if (g>255) g = 510-g;
printf "\033[48;2;%d;%d;%dm", r,g,b;
printf "\033[38;2;%d;%d;%dm", 255-r,255-g,255-b;
printf "%s\033[0m", substr(s,colnum+1,1);
}
printf "\n";
}'
但是,当我启动屏幕时,颜色是关闭的。它似乎没有回落到 256 色,而是颜色值错误。
我在重新编译屏幕之前看到了这种行为。看到这个问题后,我重新编译甚至核对了我的 git repo 并重新克隆和重新编译以尝试让事情正常工作,但无济于事。
想想这哪里出了问题?我什至不确定哪个库可能对此负责,或者它如何与 konsole 而不是 screen 一起工作。
解决方案
有人提醒我这一点:这是屏幕上的一个错误(参见source-repo):
tputs(tparm("\E[48;2;%d;%d;%dm", _r, _g, _b), 1, DoAddChar);
问题是它使用termcap语法tparm
来处理3 个参数。但是termcap只能表示2 个参数。要在terminfo中执行此操作,开发人员应该执行以下操作:
tputs(tparm("\E[48;2;%p1%d;%p2%d;%p3%dm", _r, _g, _b), 1, DoAddChar);
ncurses 在 2017 年的一个错误修复使该代码片段过时了:
+ improve _nc_tparm_analyze, using that to extend the checks made by
tic for reporting inconsistencies between the expected number of
parameters for a capability and the actual.
顺便说一下,GNU screen 是一个termcap应用程序,并且混入terminfo调用(例如tparm
,这不是termcap功能)使它的可移植性不如人们希望的那样。对于格式化输出,termcap仅提供tgoto
,它使用两个参数。
推荐阅读
- java - URL 或 MalFormedURLException 问题
- c++ - 如何将一个巨大的头部分配数组设置为特定的浮点数 C++
- android - 为什么我无法从 fire tv cube 设备获得 android studio 中 RECORD AUDIO 的权限?
- sapui5 - 从 Cloud Foundry 的 Fiori Launchpad 中的 ui5 应用程序获取用户信息
- java - Java 关闭挂钩的问题
- javascript - 如何从山寨币守护进程获取通知和接收地址、金额?
- oracle-apex-19.2 - 如何仅在第一次加载页面时管理清除缓存 Oracle Apex
- python-3.x - 使用超出范围列表的数据帧上的多个 IF 语句
- linux - Linux 邮件命令:office 365 电子邮件中的 HTML 内容显示为纯文本,而在 gmail 中正确显示
- javascript - 在 HTML 中显示具有基本授权的 HTTP Get 中的图像