首页 > 解决方案 > 屏幕真彩 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 一起工作。

好的颜色是这样的: 好颜色

不好的颜色是这样的: 在此处输入图像描述

标签: ncursesgnu-screenterminfotermcap

解决方案


有人提醒我这一点:这是屏幕上的一个错误(参见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,它使用两个参数。

跟进:在此错误报告中进行了一些讨论后,建议的改进已于2018年 11 月 18 日应用。


推荐阅读