颜色并没有以诅咒结束

标签 c ncurses

我最近正在使用 curses 库开发一个游戏项目,并且使用了与颜色相关的函数,例如 start_color()init_color()init_pair()。该颜色在我的项目中效果很好,但一旦使用,其他 TUI 应用程序(如 vim)中的颜色就会出错。

例如: 当我第一次编辑代码的某些部分时,它是这样的:

first image

这是带有 colorcheme slatevim,看起来不错。

但是,当我运行代码并退出并再次编辑代码时,它会变成这样:

second image

注意:我执行此操作时没有更改任何内容,我认为这是因为我在运行代码时更改了颜色定义。另外,如果我使用其他函数,也会出错,例如:

Third

但原来的应该是这样的: Fourth

我想知道为什么会发生这种情况,我认为可能有一些我没有使用的颜色结束函数,就像initscr()endwin(),应该还有一个用于 start_color() 的函数。谁能告诉我为什么?非常感谢。

最佳答案

对于支持它的终端,init_color()与 ncurses 中其他与颜色相关的函数具有不同的效果。它改变任何应用程序使用的颜色调色板:

If a terminal is capable of redefining colors, the programmer can use the routine init_color to change the definition of a color.

调色板存储在终端模拟器中;每个使用颜色的应用程序都将使用相同的颜色集,除非它通过转义序列修改调色板。这些转义序列记录在XTerm Control Sequences中。 .

ncurses 无法确定一开始的调色板是什么;它无法在退出时将调色板恢复到其初始状态(例如,在 endwin 中)。与颜色(默认为0)不同,所有可以生成颜色的终端都没有使用预定义的调色板。要了解这一点,请比较这些变体的 initc 功能:

   initc=\E]4;%p1%d;rgb\:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\\,
   initc=\E]P%p1%x%p2%{255}%*%{1000}%/%02x%p3%{255}%*%{1000}%/%02x%p4%{255}%*%{1000}%/%02x,

因为 ncurses 拥有的唯一信息是如何更改颜色,因此它无法在退出时将调色板设置回其原始状态。

进一步阅读:

关于颜色并没有以诅咒结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36051061/

相关文章:

C字符串递归函数从中间找出相等性

c - 如何用 `1234567890` 打印 `1 2 3 4 5 6 7 8 9 0` 到 `C` ?

c - Ncurses,非阻塞getch错过了第一个字符

c++ - 清除 ncurses 中的字段缓冲区

c++ - 为 ARM 交叉编译 ncurses 5.9 - 找不到表单库

c++ - memcpy 没有按预期进行

iphone - IOS 中奇怪的 float 问题

C程序中使用terminfo捕获字符串key

c - printw() 和 mvwprintw() 不打印

找不到-llibc