256 цветов, передний план и фон
Это рассказ о двух сценариях, связанный с предыдущим вопросом.
Два сценария находятся по адресу http://gist.github.com/50692. Скрипт ansi.rb отображает все 256 цветов на всех 256 цветах фона. Сценарий ncurses.rb отображает все 256 цветов переднего плана, но фон отображает основные 16, а затем, кажется, циклически переключается между различными атрибутами, такими как мигание и обратное видео.
Так что же дает? Это ошибка в ncurses, что он использует целое число со знаком для пар цветов? (то есть "tput colors" говорит о 256, но "tput пары" говорит о 32767 вместо 65536) Кажется, что в этом случае первая половина пар цветов будет отображаться правильно, но вторая половина будет повторяться или попадать в атрибуты как int обертывания.
2 ответа
Причина в том, что ncurses pre ABI 6, который включает текущую версию, которую используют большинство дистрибутивов, включая Debian и Amazon AMI, COLOR_PAIR(n)
не может ссылаться на любые определенные пары выше 256. Это потому, что аргумент COLOR_PAIR(n)
имеет тип cchar_t
, Младшие 8 бит выбирают цветовую пару, а остальные считаются битовыми флагами. OR
редактировал определенные терминальные атрибуты. Вот почему вы видите мигание, инверсию, подчеркивание и т. Д., Когда вы пытаетесь выйти за пределы пары номер 255 в вашем примере кода.
Это довольно прискорбно, и я планирую использовать очередь в своей программе для определения цветов на лету, используя init_pair()
и просто переписать наименее недавно использованные пары в качестве компромисса. Я написал сопровождающему ncurses Томасу Дики (Thomas Dickey), спрашивающему, есть ли способ временно выйти за пределы ncurses, чтобы написать необработанные коды терминала, а затем вернуться к ncurses. Это был его ответ:
По сути, вам придется забыть об оптимизации экрана и просто сделать свой собственный рисунок, используя функции, перечисленные в terminfo(3), например, tigetstr, mvcur, tputs.
Вы можете временно выйти из ncurses, но затем придется перекрасить экран. В противном случае ncurses будет сбит с толку тем, что находится на экране и где находится курсор.
Это решение, похоже, представляет слишком много подводных камней, но если вам абсолютно необходимо более 256 одновременных пар в программе ncurses (не считая пар, которые вы можете подделать с помощью обратного атрибута), то это то, что вам придется сделать.
Я вообще не знаю Ruby, поэтому не могу привести рабочий пример, но скрипт ncurses.rb должен сказать вам кое-что, поскольку он намного короче, чем скрипт ansi.rb.
Вы не настраиваете цвета, поэтому просто зацикливаете цветовую палитру по умолчанию на 16 с вариациями, предоставляемыми такими атрибутами, как подчеркивание моргания, полужирный и т. Д.
Вам нужно использовать int init_color(short color, short r, short g, short b)
инициализировать индекс цвета значениями RGB (0 - 1000), а затем установить пары цветов, которые будут использоваться для отображения с int init_pair(short pair, short f, short b)
перед звонком COLOR_PAIR(n)
,
Для переносимости вы должны проверить bool has_colors(void)
а также bool can_change_color(void)
В моей системе справочные страницы для ncurses бесценны.