【问题标题】:color not ended in curses颜色没有以诅咒结束
【发布时间】:2016-03-17 03:17:35
【问题描述】:

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

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

这是vim,配色方案slate,看起来不错。

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

注意:我这样做的时候并没有改变任何东西,我认为这是因为我在运行代码时改变了颜色定义。另外,如果我使用其他功能,也会出错,比如:

但原来的应该是这样的:

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

【问题讨论】:

    标签: c ncurses


    【解决方案1】:

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

    如果终端能够重新定义颜色,程序员可以使用例程init_color 来更改颜色的定义

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

    ncurses 无法确定一开始的调色板是什么;它无法在退出时将调色板恢复到其初始状态(例如,在endwin 中)。与颜色 pair(默认为 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 拥有的唯一信息是如何更改颜色,所以它无法在退出时将调色板设置回其原始状态。

    进一步阅读:

    【讨论】:

    • 感谢您的回答。但它也改变了lscommand 的结果,它不在curses 模式下。这是调色板改变的副作用吗?
    • yes: "它改变了 any 应用程序使用的调色板"
    • 有什么办法可以解决这个问题吗?是否可以重新设置调色板,使其在程序即将退出时恢复正常?
    • 否:您可以将调色板设置为某种已知状态,但没有确定什么是正常的标准方法。
    • 即使没有标准,先用color_content()保存颜色状态,最后恢复可能是个好办法。
    猜你喜欢
    • 2011-11-11
    • 2018-02-27
    • 2013-10-26
    • 2012-10-15
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 2012-04-08
    相关资源
    最近更新 更多