Как можно получить исходную палитру терминала , предпочтительно с использованием подпрограмм ncurses?

Я разрабатываю приложение Ncurses, которое использует свою собственную палитру через init_color () (при условии can_change_colors () вернул ненулевое значение). Если COLORS меньше 256, я изменяю только первые 8 цветов (предполагая, что COLORS не меньше 8). В противном случае я изменяю до первых 256.

В документации ncurses утверждается, что вызов endwin () на stdscr сбросит палитру. Однако в Gnome-terminal Я не вижу палитру, восстановленную Ncurses. Вместо этого палитра, которую я использовал в последний раз, переносится за пределы моего приложения. Тогда мой первый вопрос: почему палитра не восстанавливается должным образом (все остальное - расположение курсора, текст на экране и т. Д. - есть).

Я мог бы обойти это (я знаю, что это уже сомнительно), получив палитру при запуске и восстановив ее вручную. Я пытаюсь сделайте это с помощью цикла color_content () после успешного вызова start_color () .К сожалению, это, похоже, возвращает палитру ncurses по умолчанию, а не фактически используемую палитру (проверено с палитрой по умолчанию Gnome-terminal и настроенной палитрой Solarized). Я проверил это, сравнив значения в ncurses / base / lib_color.c из исходников Debian ncurses-5.9.

Итак:

  • Почему палитра не восстанавливается при успешном вызове endwin (stdscr) ?

  • Как я могу получить «истинную» палитру при запуске? Ncurses является предпочтительным, но на данный момент достаточно ioctl () s и т. Д. Для UNIX или даже Linux.

Соответствующий код можно найти на Github . То, что там сейчас, может не совпадать с тем, что я описал выше, поскольку я безуспешно экспериментировал с различными техниками.

8
задан Gilles 'SO- stop being evil' 27 June 2012 в 21:30
поделиться