Jon*_*son 5 c c++ xterm console-application ansi-colors
在C或C++中,有没有办法直接读取调色板RGB值?特别有趣的是 xterm(和其他)使用的扩展颜色空间来定义多达 256 种终端颜色。
\n\n恰当的例子是我想定义自己的颜色(使用 ANSI 转义序列,例如\\e]4;3;rgb:cc/78/33\\e\\\\或 直接在 c 中),但我需要在重新定义用户颜色之前保存它们(万一他们已经重新定义了颜色) )以便我可以在程序完成时恢复它们。破坏用户设置并不好。
现在我的目标是使用 ANSI 转义序列以客户端方式执行此操作。但由于我找不到如何获取颜色,我开始考虑用 c 或 c++ 来实现这一点。
\n\n该解决方案将被编写为具有本机扩展(基本上嵌入 c 或 c++ 代码)的 ruby gem,我的目标是获得跨平台解决方案,即使主要目标是 OS X,其次是 Linux 环境......
\n\n从最初的实验开始,我已经可以为调色板中的代码点定义任何我想要的颜色。我还可以轻松恢复默认系统颜色(因为它们是 ANSI 标准)。我四处寻找在 ANSI 转义码中执行此操作的方法,但没有找到。我认为这是保存在内存中的某个地方,如果有任何方法可以找到位置,那么读取颜色应该很容易......
\n\n总结一下目前评论中的信息:
\n\n看起来一致地执行此操作的唯一方法是用不同颜色打印 \xe2\x96\x88 字符的屏幕并从中获取颜色。由于这个项目应该是跨三个主要操作系统的平台,而且 Linux 目前在用户使用时有 3 个显示管理器,而 Windows 有两个(7 和 8),我只能想象时间和时间那会很有趣:)
\n\n所以我的“解决方案”\xe2\x84\xa2 就是破坏用户的颜色(如果他们有除系统默认值之外的任何颜色......让我们面对它是相当不常见的)。我将提供一个设置文件,用户可以在其中告诉插件,如果他们对系统默认值不满意,应该恢复哪些颜色。务实又无聊,但这让我再次继续下去:)
\n[编辑 1]抱歉,这不会导致解决方案,但对于其他人,我添加了 DAC 调色板 IO 访问
看看旧的传统 EGA/VGA 参考资料...
要直接访问,请尝试以下操作:
BYTE r,g,b,c=5; // R,G,B values are 6 bit only !!!
out 0x3C8,c; // set color index to work with <0,255>
in r,0x3C9; // read color pallete for color c
in g,0x3C9; // not sure if it should be r,g,b
in b,0x3C9; // or b,g,r ... i did not use it for too many years
out 0x3C8,c; // set color index to work with <0,255>
out 0x3C9,r; // write color pallete for color c
out 0x3C9,g;
out 0x3C9,b;
Run Code Online (Sandbox Code Playgroud)
C/C++ 没有 in,out 操作,因此使用:
BYTE i,o; // this must be local !!!
WORD port; // this must be local !!!
asm {
mov dx,port // in i,port
in al,dx
mov o,al
mov dx,port // out port,o
mov al,o
out dx,al
}
Run Code Online (Sandbox Code Playgroud)