Почему init_pair терпит неудачу для половины диапазона COLOR_PAIRS? - PullRequest
0 голосов
/ 05 января 2019

На моей платформе:

  • OSX Mojave 10.14.2
  • ncurses от Homebrew:

    $ brew info ncurses
    ncurses: stable 6.1 (bottled) [keg-only]
    

build через эту конфигурацию make-файла:

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

Странно, что они выбрали для этого подписанное количество.

1 Ответ

0 голосов
/ 05 января 2019

Стандартный тип для цветовой пары - это (подписано) short, что на большинстве машин составляет 16 бит. Причина в том, что он восходит к 1980-м годам, когда пространство (и доступность цветов) были более ограниченными.

ncurses 6.1 имеет расширения, которые допускают 32-битные значения (например, используя init_extended_pair), которые brew s формула кажется, позволяет, хотя пока никто не комментировал это.

Как отмечено в разделе Переносимость страницы init_pair руководства

X / Open Curses не определяет ограничение на количество цветов и цветовые пары, которые может поддерживать терминал. Тем не менее, в его использовании коротких для параметров он переносит подробности реализации SVr4 для скомпилированная база данных terminfo, которая использует 16-разрядные числа со знаком . это реализация обеспечивает расширенные версии тех функций, которые используют короткие параметры, позволяющие приложениям использовать большие цветовые и парные число.

Для вашего удовольствия скриншоты здесь используйте функцию расширенных номеров ncurses 6.1

...