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