我正在开发一个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。目前有什么可能与我上面描述的完全不符,因为我一直在试验各种技术而没有成功。
答案 0 :(得分:2)
所以,今天赏金到期,我已经完成了一些彻底的潜水源。我相信我有(相当令人沮丧)的答案:
(1)endwin()正在重置调色板,但似乎将其重置为terminfo配置中TERM值的定义。任何应用程序的调色板更改都没有可移植地写入terminfo数据库(显然)或上下文(更不幸的是),因此无法跨应用程序进行ncurses。
(2)没有一般的方法可以做到这一点。证据是矛盾的,直接来自(1)。
唉,可怜的约里克!一个无限开玩笑的人。除非有人证明我不在我的脑海中,否则我认为这个问题已经解决了。