Причина в том, что ncurses до ABI 6, который включает в себя текущую версию, используемую в большинстве дистрибутивов, включая Debian и Amazon AMI, 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 (не считая пар, которые вы можете подделать с помощью атрибута inverse), то это то, что вам нужно сделать.
person
Andy
schedule
13.12.2012