256 цветов, переднего плана и фона

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

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

Итак, что дает? Является ли это ошибкой в ​​ncurses, что она использует целое число со знаком для пар цветов? (т.е. "цвета tput" говорит 256, но "tput pairs" говорит, что вместо 32767 вместо 65536). Кажется, что если бы это было так, первая половина пар цветов отображалась бы правильно, а вторая половина повторялась бы или попадала в атрибуты в виде int обручи.

6
задан pushcx 25 янв. '09 в 2:30
источник поделиться
2 ответов

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

Это довольно неудачно, и я планирую использовать в своей очереди очередь для определения цветов на лету с помощью init_pair() и просто перезаписать наименее используемые пары в качестве компромисса. Я написал поддерживающего ncurses Томаса Дики, спрашивающего, есть ли способ временно выйти за пределы ncurses, чтобы написать исходные коды терминалов, а затем вернуться к ncurses. Это был его ответ:

По сути, вам придется забыть о оптимизации экрана и просто сделать ваш собственный чертеж, используя функции, перечисленные в terminfo (3), например, tigetstr, mvcur, tputs.

Вы можете временно выйти из ncurses, но затем перерисовать экран. В противном случае ncurses будет смущен тем, что на экране и где курсор.

Это решение, кажется, представляет слишком много ошибок, но если вам абсолютно нужно 256 одновременных пар в программе ncurses (не считая пары, которые вы могли бы подделать с помощью обратного атрибута), то это то, что вам нужно будет сделать.

7
ответ дан Andy 13 дек. '12 в 22:40
источник поделиться

Я вообще не знаю Ruby, поэтому не могу представить рабочий пример, но ncurses.rb script должен сказать вам кое-что, что он намного короче, чем ansi.rb script.

Вы не настраиваете цвета, поэтому просто зацикливаете 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)

В моей системе страницы man для ncurses неоценимы.

2
ответ дан James Morris 19 окт. '09 в 2:03
источник поделиться

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