屏幕真彩色 Ubuntu 18.04 坏了
Screen truecolor Ubuntu 18.04 broke
我自己编译的为数不多的几个软件之一就是screen。我发现它倾向于比存储库中的版本更好地支持终端的一些现代功能。我这样做已经有一段时间了,没有太大问题。但是,在升级到 18.04 时,(true)colors 似乎已经损坏。
我 运行 这段打印彩虹的代码,它在裸 konsole 中仍然有效:
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 "3[48;2;%d;%d;%dm", r,g,b;
printf "3[38;2;%d;%d;%dm", 255-r,255-g,255-b;
printf "%s3[0m", substr(s,colnum+1,1);
}
printf "\n";
}'
但是,当我启动屏幕时,颜色是关闭的。好像没有回落到256色,而是颜色值不对。
我在重新编译屏幕之前看到了这种行为。看到问题后,我重新编译甚至破坏了我的 git 存储库并重新克隆和重新编译以尝试让事情正常进行,但无济于事。
想想哪里出了问题?我什至不确定哪个库可能对此负责,或者它如何与 konsole 但不是屏幕一起工作。
好看的颜色是这样的:
不好的颜色是这样的:
有人提醒我:这是屏幕错误(参见 source-repo):
tputs(tparm("\E[48;2;%d;%d;%dm", _r, _g, _b), 1, DoAddChar);
问题是它正在使用tparm
处理3个参数,使用termcap语法。但是termcap只能表示2个参数。要在 terminfo 中执行此操作,开发人员应该这样做:
tputs(tparm("\E[48;2;%p1%d;%p2%d;%p3%dm", _r, _g, _b), 1, DoAddChar);
ncurses 的一个 bug-fixes 在 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 屏幕,顺便说一句,是一个 termcap 应用程序,并混入 terminfo 调用(例如 tparm
,它不是 termcap feature) makes it less portable than one might wish. For formatting output, termcap provides only tgoto
,它正好使用两个参数。
跟进:已应用建议的改进 2018/11/18, after some discussion in this bug report。
我自己编译的为数不多的几个软件之一就是screen。我发现它倾向于比存储库中的版本更好地支持终端的一些现代功能。我这样做已经有一段时间了,没有太大问题。但是,在升级到 18.04 时,(true)colors 似乎已经损坏。
我 运行 这段打印彩虹的代码,它在裸 konsole 中仍然有效:
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 "3[48;2;%d;%d;%dm", r,g,b;
printf "3[38;2;%d;%d;%dm", 255-r,255-g,255-b;
printf "%s3[0m", substr(s,colnum+1,1);
}
printf "\n";
}'
但是,当我启动屏幕时,颜色是关闭的。好像没有回落到256色,而是颜色值不对。
我在重新编译屏幕之前看到了这种行为。看到问题后,我重新编译甚至破坏了我的 git 存储库并重新克隆和重新编译以尝试让事情正常进行,但无济于事。
想想哪里出了问题?我什至不确定哪个库可能对此负责,或者它如何与 konsole 但不是屏幕一起工作。
好看的颜色是这样的:
不好的颜色是这样的:
有人提醒我:这是屏幕错误(参见 source-repo):
tputs(tparm("\E[48;2;%d;%d;%dm", _r, _g, _b), 1, DoAddChar);
问题是它正在使用tparm
处理3个参数,使用termcap语法。但是termcap只能表示2个参数。要在 terminfo 中执行此操作,开发人员应该这样做:
tputs(tparm("\E[48;2;%p1%d;%p2%d;%p3%dm", _r, _g, _b), 1, DoAddChar);
ncurses 的一个 bug-fixes 在 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 屏幕,顺便说一句,是一个 termcap 应用程序,并混入 terminfo 调用(例如 tparm
,它不是 termcap feature) makes it less portable than one might wish. For formatting output, termcap provides only tgoto
,它正好使用两个参数。
跟进:已应用建议的改进 2018/11/18, after some discussion in this bug report。