如何获取原始终端调色板,最好使用ncurses例程?

时间:2011-12-31 04:52:38

标签: unix user-interface ncurses

我正在开发一个Ncurses应用程序,它通过init_color()使用自己的调色板(假设can_change_colors()返回非零)。如果COLORS小于256,我只修改前8种颜色(假设COLORS至少为8)。否则,我修改到前256个。

ncurses文档声称在endwin()上调用stdscr会重置调色板。然而,在Gnome-terminal中,我没有看到Ncurses恢复的调色板。相反,我上次使用的任何调色板都超出了我的应用范围。那么,我的第一个问题是为什么调色板没有被正确恢复(其他一切 - 光标位置,屏幕文本等)。

通过在启动时获取调色板并手动恢复,我可以解决这个问题(我知道这已经有问题了)。在成功调用color_content()后,我尝试使用start_color()循环执行此操作。不幸的是,这似乎返回默认的ncurses调色板,而不是实际使用的调色板(使用Gnome-terminal的默认调色板和配置的Solarized调色板测试)。我通过检查来自Debian的ncurses-5.9来源的ncurses/base/lib_color.c中的值来验证这一点。

所以:

  • 为什么通过成功拨打endwin(stdscr)来恢复调色板?

  • 如何在启动时获取“真实”调色板? Ncurses是首选,但Unix或甚至Linux特定的ioctl()等等就足够了。

可以找到相关代码on Github。目前有什么可能与我上面描述的完全不符,因为我一直在试验各种技术而没有成功。

1 个答案:

答案 0 :(得分:2)

所以,今天赏金到期,我已经完成了一些彻底的潜水源。我相信我有(相当令人沮丧)的答案:

(1)endwin()正在重置调色板,但似乎将其重置为terminfo配置中TERM值的定义。任何应用程序的调色板更改都没有可移植地写入terminfo数据库(显然)或上下文(更不幸的是),因此无法跨应用程序进行ncurses。

(2)没有一般的方法可以做到这一点。证据是矛盾的,直接来自(1)。

唉,可怜的约里克!一个无限开玩笑的人。

除非有人证明我不在我的脑海中,否则我认为这个问题已经解决了。