Экран truecolor 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-репо, а затем снова клонировал и перекомпилировал, чтобы попытаться заставить все работать, но безрезультатно.

Мысли о том, где это пошло не так? Я даже не уверен, какая библиотека может за это отвечать или как она может работать с konsole, но не с экраном.

Хорошие цвета выглядят так: хорошие цвета

Плохие цвета выглядят так:

1 ответ

Кто-то напомнил мне об этом: это ошибка на экране (см. 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 в течение 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, после некоторого обсуждения в этом отчете об ошибках.

Другие вопросы по тегам