Вопрос

Это рассказ о двух сценариях, связанный с предыдущим вопросом .

Эти два сценария находятся по адресу http://gist.github.com/50692 . Скрипт ansi.rb отображает все 256 цветов на всех 256 цветах фона. Сценарий ncurses.rb отображает все 256 цветов переднего плана, но фон отображает основные 16, а затем, кажется, переключается между различными атрибутами, такими как мигание и обратное видео.

Так что же дает? Это ошибка в ncurses, что он использует целое число со знаком для пар цветов? (то есть «tput colors» говорит о 256, но «tput пары» говорит о 32767 вместо 65536) Кажется, что в этом случае первая половина пар цветов будет отображаться правильно, но вторая половина будет повторяться или попадать в атрибуты как int обручи.

Это было полезно?

Решение

Причина в том, что ncurses до ABI 6, который включает в себя текущую версию, которую используют большинство дистрибутивов, включая Debian и Amazon AMI, COLOR_PAIR(n) не может ссылаться ни на какие определенные пары выше 256. Это потому, что аргумент cchar_t имеет тип OR Младшие 8 бит выбирают пару цветов, а остальные обрабатываются как битовые флаги init_pair() для определенных атрибутов терминала. Вот почему в вашем примере кода вы видите мигание, инверсию, подчеркивание и т. Д., Когда вы пытаетесь выйти за пределы пары номер 255.

Это довольно прискорбно, и я планирую использовать очередь в своей программе, чтобы определять цвета на лету с помощью <=> и просто перезаписывать наименее использованные пары в качестве компромисса. Я написал сопровождающему 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 неоценимы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top