屏幕truecolor Ubuntu 18.04破了

时间:2018-06-12 22:03:25

标签: ncurses gnu-screen terminfo termcap

我自己编译的少数软件之一就是屏幕。我发现它倾向于支持终端的一些现代功能,而不是存储库中的版本。我已经做了一段时间了,没有太多问题。但是,在升级到18.04时,(真实)颜色似乎已经破裂。

我运行这段代码来打印一条彩虹,它仍然可以在一个裸的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 "\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一起使用而不是屏幕。

好的颜色看起来像这样: good colors

坏颜色看起来像这样: enter image description here

1 个答案:

答案 0 :(得分:3)

有人提醒我这件事:这是屏幕上的错误(请参见source-repo):

tputs(tparm("\E[48;2;%d;%d;%dm", _r, _g, _b), 1, DoAddChar);

问题是它正在使用tparm使用 termcap 语法处理 3 参数。但是 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功能)使其可移植性比人们期望的要差。为了格式化输出, termcap 仅提供tgoto,它恰好使用两个参数。

后续行动:在对此2018/11/18进行了一些讨论之后,bug report应用了建议的改进措施。