Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何不更改其他终端程序中的颜色?_C_Terminal_Colors_Ncurses_Xterm - Fatal编程技术网

C 如何不更改其他终端程序中的颜色?

C 如何不更改其他终端程序中的颜色?,c,terminal,colors,ncurses,xterm,C,Terminal,Colors,Ncurses,Xterm,我发现了一个我用ncurses编写的旧游戏。我注意到,在关闭游戏并运行另一个基于ncurses的程序后,该程序的颜色也发生了变化。这完全是我几年前写游戏时没有意识到的预期行为 由于ncurses不知道初始调色板,因此退出游戏后无法将调色板重置为初始值。记住这一点,在ncurses中处理颜色的最佳方法是什么 以下是我所考虑的: 仅覆盖调色板中较高的颜色。如果从位置0开始更改颜色,则很可能会更改其他程序正在使用的颜色。如果您从100开始(例如),那么您的更改干扰其他程序的可能性要小得多。我想这里的关

我发现了一个我用
ncurses
编写的旧游戏。我注意到,在关闭游戏并运行另一个基于
ncurses
的程序后,该程序的颜色也发生了变化。这完全是我几年前写游戏时没有意识到的预期行为

由于
ncurses
不知道初始调色板,因此退出游戏后无法将调色板重置为初始值。记住这一点,在
ncurses
中处理颜色的最佳方法是什么

以下是我所考虑的:

  • 仅覆盖调色板中较高的颜色。如果从位置0开始更改颜色,则很可能会更改其他程序正在使用的颜色。如果您从100开始(例如),那么您的更改干扰其他程序的可能性要小得多。我想这里的关键是不改变16色ANSI调色板
  • 手动检查默认调色板并选择适合游戏的默认颜色。除了繁琐且可能不允许您设置所需的确切颜色之外,无法保证所有系统上的默认调色板都相同。可能有一个库可以自动获取相应的
    xterm
    颜色。好像是在做那样的事情。我假设大多数现代系统都会使用相同的调色板运行终端,所以这可能是好的,这取决于您的目标系统。
    xterm
    的默认选项板在此处可用:
  • 使用
    color\u content
    获得原始颜色。
    我尝试过,但没有效果
    ncurses
    只能获取由
    init_color
    设置的颜色的颜色内容
  • 将调色板恢复为默认的
    xterm
    调色板。
    我想如果终端支持256种颜色,它很有可能使用默认的
    xterm
    调色板。但是,用户可能已经更改了它,因此它可能仍然会干扰用户配置
  • 使用特定于
    xterm
    的API或其他终端仿真器获取颜色。
    我不知道是否存在这样的API,但这将是一个潜在的解决方案,主要缺点是它只支持特定的终端仿真器
  • 我可以实现1和2,并让用户通过传递标志来选择行为。我不知道有任何终端程序使用丰富的颜色,所以不确定有多少程序真正面临这个问题,但肯定会有至少几个。如果您有其他程序如何处理此问题的示例,那将非常有用。

    来源:

    如果您的终端描述不包含orig_对或orig_颜色功能,您将无法将颜色重置为预诅咒状态。例如,在aixterm中会发生这种情况

    但是,如果您的终端支持将颜色重置为默认状态,ncurses将在退出Curses模式时使用此选项。执行此操作的终端类型包括Linux控制台、rxvt和XFree86 xterm

    要了解终端是否可以重置颜色,请运行:

    infocmp -L | grep orig
    
    我的只能重设成对,不能重设颜色。我还没有找到一个API来检查程序本身,但是没有真正的理由检查它,除非你已经实现了多种处理颜色的方法。顺便说一句,我有过,我对这两个都不满意

    我试图覆盖调色板中较高的颜色,但我仍然设法为其他程序更改颜色。我仍然认为避免16种第一颜色是明智的,但似乎没有任何颜色可以安全地改变

    我还尝试使用的默认颜色,但我无法得到我想要的效果。我可能可以简化主题,使它看起来更漂亮,但我无法复制我想要的外观

    似乎最好的解决方案是用默认颜色制作一个好看的主题,除非这是不可能的,在这种情况下,你只能接受其他程序可能不会因此看起来很好。无论如何,打开一个新的终端并不太困难,这将使您的颜色重新排序。

    来源:

    如果您的终端描述不包含orig_对或orig_颜色功能,您将无法将颜色重置为预诅咒状态。例如,在aixterm中会发生这种情况

    但是,如果您的终端支持将颜色重置为默认状态,ncurses将在退出Curses模式时使用此选项。执行此操作的终端类型包括Linux控制台、rxvt和XFree86 xterm

    要了解终端是否可以重置颜色,请运行:

    infocmp -L | grep orig
    
    我的只能重设成对,不能重设颜色。我还没有找到一个API来检查程序本身,但是没有真正的理由检查它,除非你已经实现了多种处理颜色的方法。顺便说一句,我有过,我对这两个都不满意

    我试图覆盖调色板中较高的颜色,但我仍然设法为其他程序更改颜色。我仍然认为避免16种第一颜色是明智的,但似乎没有任何颜色可以安全地改变

    我还尝试使用的默认颜色,但我无法得到我想要的效果。我可能可以简化主题,使它看起来更漂亮,但我无法复制我想要的外观


    似乎最好的解决方案是用默认颜色制作一个好看的主题,除非这是不可能的,在这种情况下,你只能接受其他程序可能不会因此看起来很好。无论如何,打开一个新的终端并不太困难,这将使您的颜色重新排序。

    如果您的目标是xterm,您可以使用24位颜色,而不是修改调色板。这也适用于许多其他终端仿真器。@您能提供rici吗