【问题标题】:How can the original terminal palette be acquired, preferably using ncurses routines?如何获取原始终端调色板,最好使用 ncurses 例程?
【发布时间】:2011-12-31 04:52:38
【问题描述】:

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

ncurses 文档声称在stdscr 上调用endwin() 将重置调色板。但是,在 Gnome 终端中,我没有看到 Ncurses 恢复的调色板。相反,我上次使用的任何调色板都超出了我的应用程序。那么,我的第一个问题是为什么没有正确恢复调色板(其他所有内容——光标位置、屏幕文本等)。

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

所以:

  • 为什么没有通过成功调用endwin(stdscr)来恢复调色板?

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

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

【问题讨论】:

  • 您是否在其他终端仿真器(例如 xterm 或控制台)中尝试过此操作,以确认您不只是从 gnome-terminal 看到不正确的行为?
  • 因此,随着今天的赏金到期,我已经继续进行了一些彻底的来源潜水。我相信我有(相当令人沮丧的)答案:

标签: unix user-interface ncurses


【解决方案1】:

因此,随着今天的赏金到期,我已经继续进行了一些彻底的资源调查。我相信我有(相当令人沮丧的)答案:

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

(2) 没有通用的方法来做到这一点。证明是矛盾的,直接从(1)得出。

唉,可怜的约里克!一个爱开玩笑的家伙。

除非有人证明我疯了,否则我认为这个问题已经解决。

【讨论】:

    猜你喜欢
    • 2021-11-07
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    相关资源
    最近更新 更多