nic*_*ack 8 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调色板进行测试).我通过检查ncurses/base/lib_color.c来自Debian的ncurses-5.9来源的值来验证这一点.
所以:
为什么通过成功调用恢复调色板endwin(stdscr)?
如何在启动时获得"真正的"调色板?Ncurses是首选,但Unix或甚至Linux特定的ioctl()s等现在就足够了.
相关代码可以在Github上找到.目前的情况可能与我上面描述的完全不符,因为我一直在尝试各种技术而没有成功.
因此,随着今天的赏金到期,我继续进行了一些彻底的源头挖掘。我相信我有(相当令人沮丧的)答案:
(1) endwin() 正在重置调色板,但它似乎将其重置为 terminfo 配置中 TERM 值的定义。任何应用程序进行的调色板更改都不能移植到 terminfo 数据库(显然)或上下文(更不幸的是)中,因此跨应用程序的 ncurses 不可用。
(2) 没有通用的方法可以做到这一点。证明是通过反证法,并直接从(1)得出。
唉,可怜的约里克!一个爱无限开玩笑的家伙。
除非有人证明我疯了,否则我认为这个问题已经解决了。