首页 > 解决方案 > 为什么 init_pair 在 COLOR_PAIRS 范围的一半内失败?

问题描述

在我的平台上:

通过这个 makefile 配置构建:

pkgenv=PKG_CONFIG_PATH=/usr/local/opt/ncurses/lib/pkgconfig pkg-config ncursesw

flags=-Wall -std=c17 -ggdb
cflags=$(flags) $(shell $(pkgenv) --cflags)
ldflags=$(flags) $(shell $(pkgenv) --libs)

这个最小的可重现示例失败:

#include <assert.h>
#include <ncursesw/ncurses.h>

int main() {
    assert(NULL != initscr());
    assert(has_colors());
    assert(can_change_color());

    assert(ERR != start_color());
    assert(COLOR_PAIRS == 0x10000);
    assert(COLORS == 256);
    assert(ERR != init_pair(1, 9, 10));
    assert(ERR != init_pair(0x7FFE, 9, 10));
    // OK up to here

    // Fails
    assert(ERR != init_pair(0x7FFF, 9, 10));

    endwin();
    puts("OK");
    return 0;
}

但为什么?什么COLOR_PAIRS报告(65536)和什么init_pair接受(1-32766)似乎是两个不同的东西。对于它的价值,浏览头文件,

#define NCURSES_PAIRS_T short

他们为此选择了签名数量,这很奇怪。

标签: cncurses

解决方案


颜色对的标准类型是 (signed) short,在大多数机器上是 16 位的。原因是它可以追溯到 1980 年代,当时空间(和颜色可用性)更加有限。

ncurses 6.1具有允许 32 位值的扩展(例如,使用init_extended_pair),这brew公式似乎允许,尽管到目前为止没有人对此发表评论。

如手册页的可移植性部分所述init_pair

X/Open Curses 没有指定终端可以支持的颜色和颜色对的数量限制。但是,在使用参数的缩写时,它继承了SVr4对已编译 terminfo 数据库的实现细节,该数据库使用带符号的 16 位数字。这个实现提供了那些使用短参数的函数的扩展版本,允许应用程序使用更大的颜色和对数。

为了您的娱乐,这里的截图使用了 ncurses 6.1 的扩展数字功能


推荐阅读