Причина в том, что ncurses до 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 (не считая пар, которые вы можете подделать с помощью обратного атрибута), то это то, что вам придется сделать.