Как не менять цвета в других терминальных программах? - PullRequest
1 голос
/ 12 июля 2020

Я нашел старую игру, которую написал с использованием ncurses. Я заметил, что после закрытия игры и запуска другой программы, основанной на ncurses, цвета изменились и для этой программы. Это вполне ожидаемое поведение, о котором я не знал, когда писал игру несколько лет go.

Поскольку ncurses не знает исходную палитру, нет возможности сбросить палитру к исходным значениям после выхода из игры. Имея это в виду, как лучше всего работать с цветами в ncurses?

Вот что я рассмотрел:

  1. Переопределение только более высоких цветов вверх по палитре. Если вы начнете изменять цвета с позиции 0, очень вероятно, что вы измените цвета, которые используют другие программы. Если вы начнете со 100 (например), гораздо менее вероятно, что ваши изменения будут мешать работе другой программы. Я полагаю, что ключевым моментом здесь является отказ от изменения 16-цветной палитры ANSI.
  2. Вручную проверьте палитру по умолчанию и выберите цвета по умолчанию, которые подходят игре. точный цвет, который вы хотите, нет гарантии, что палитра по умолчанию будет одинаковой во всех системах. Может быть библиотека для автоматического получения соответствующего цвета xterm. Похоже, что https://github.com/vim-scripts/CSApprox делает что-то подобное. Я предполагаю, что большинство современных систем будут запускать терминалы с одной и той же палитрой, так что это может быть хорошо, в зависимости от того, на какие системы вы нацеливаетесь. Палитра по умолчанию xterm доступна здесь: https://jonasjacek.github.io/colors/
  3. Используйте color_content, чтобы получить исходный цвет. Я пробовал, но не смог работай. ncurses может получить только цветовое содержание цветов, которые были установлены init_color.
  4. Восстановить палитру по умолчанию xterm палитра. Я полагаю, если терминал поддерживает 256 цветов , есть большая вероятность, что он использует палитру по умолчанию xterm. Однако пользователь мог изменить его, поэтому он может по-прежнему мешать настройке пользователя.
  5. Для получения цветов используйте спецификацию API c на xterm или другой эмулятор терминала. I не знаю, существует ли какой-либо такой API, но это было бы потенциальное решение, с основным недостатком, что он будет поддерживать только указанный c эмулятор терминала.

Я мог бы реализовать как 1, так и 2, и позволить пользователю выбирать поведение, передавая флаг. Я не знаю каких-либо терминальных программ, которые используют насыщенные цвета, поэтому не уверен, сколько программ действительно сталкивается с этой проблемой, но обязательно будет как минимум несколько. Если у вас есть примеры того, как с этим справляются другие программы, это будет очень полезно.

1 Ответ

0 голосов
/ 16 июля 2020

From https://invisible-island.net/ncurses/ncurses.faq.html:

Если описание вашего терминала не содержит возможности orig_pair или orig_colors, вы не сможете сбросить цвета до состояния pre-curses. Это происходит, например, с aixterm.

Однако, если ваш терминал поддерживает сброс цветов до состояния по умолчанию, ncurses будет использовать это при выходе из режима Curses. Типы терминалов, которые делают это, включают консоль Linux, rxvt и XFree86 xterm.

Чтобы узнать, может ли ваш терминал сбрасывать цвета, выполните:

infocmp -L | grep orig

Mine может сбрасывать только пары, но не цвета. Я не нашел API, чтобы проверить это в самой программе, но нет реальной причины проверять это, если вы не реализовали несколько способов работы с цветами. У меня, кстати, есть, и я не доволен ни тем, ни другим.

Я пробовал переопределить цвета выше в палитре, но мне все равно удалось изменить цвета для других программ. Я по-прежнему считаю разумным избегать 16 первых цветов, но похоже, что нет цветов, которые можно было бы безопасно изменить.

Я также пробовал использовать цвета по умолчанию из https://jonasjacek.github.io/colors/, но я не мог добиться желаемого эффекта. Возможно, я мог бы упростить тему и при этом сделать ее красивой, но я не мог воспроизвести тот вид, к которому стремился.

Похоже, лучшее решение - создать красивую тему с цветами по умолчанию, если это невозможно, и в этом случае вам просто придется признать, что в результате другие программы могут выглядеть не очень хорошо. В любом случае открыть новый терминал не так уж сложно, и тогда ваши цвета снова будут отсортированы.

...