gpt4 book ai didi

NCurses:为什么init_color返回OK但仍然没有设置颜色?

转载 作者:行者123 更新时间:2023-12-02 10:26:44 30 4
gpt4 key购买 nike

我试图通过将值 COLOR_BLUE 设置为 rgb 值(1000, 0, 0)来将文本 block 的背景设置为红色。如果我使用 Gnome 的“终端”应用程序,背景是正确的(红色),但如果我使用 KDE 的“Konsole”,背景是不正确的(蓝色)。为什么是这样?以下代码将在 Linux 上使用编译行进行编译:

g++ filename.cpp -lcurses

我通过以下方式将术语类型设置为 xterm-256color:

export TERM=xterm-256color

代码如下:

#include <ncurses.h>
#include <cassert>
#include <csignal>

static bool stop = false;

void sigAbortHandler(int _sig)
{
stop = true;
}

int main(int _argc, char **_argv)
{
signal(SIGABRT, &sigAbortHandler);

WINDOW *window = initscr();

if (!has_colors())
{
delwin(window);
endwin();
perror("You must enable colors in your console");
}

if (!can_change_color())
{
delwin(window);
endwin();
perror("Error: unable to change colors, "
"trying setting your TERM type to enable colors");
}

assert(start_color() == OK);
keypad(stdscr, TRUE);
cbreak();
noecho();
curs_set(0);
nodelay(window, true);

int background = COLOR_BLUE;
assert(init_color(background, 1000, 0, 0) == OK);
int foreground = 2;
assert(init_color(foreground, 0, 0, 0) == OK);
int pair = 1;
assert(init_pair(pair, foreground, background) == OK);
assert(wattron(window, COLOR_PAIR(pair)) == OK);

short r, g, b;
color_content(background, &r, &g, &b);
assert(mvwprintw(window, 10, 10, "color content: %d, %d, %d", r, g, b) == OK);
assert(wrefresh(window) == OK);
assert(wattroff(window, COLOR_PAIR(pair)) == OK);

while (!stop)
{
}

delwin(window);
endwin();

return 0;
}

最佳答案

问题是 Konsole 没有实现您期望的功能。 ncurses 只知道您配置的终端描述中的内容。没有通用的方法来检查它是否正确。 RETURN-VALUE init_color 部分说

init_color
returns an error if the terminal does not support this feature, e.g., if the initialize_color capability is absent from the terminal description.

大概您有类似 TERM=xterm-256color 的内容。 ncurses 终端数据库有正确的 konsole-256color ,(使用 infocmpxterm-256color 进行比较)在许多方面都有所不同:

comparing xterm-256color to konsole-256color.
comparing booleans.
ccc: T:F.
km: T:F.
mc5i: T:F.
comparing numbers.
comparing strings.
bel: '^G', NULL.
cbt: '\E[Z', NULL.
cnorm: '\E[?12l\E[?25h', '\E[?25h'.
cvvis: '\E[?12;25h', NULL.
dim: '\E[2m', NULL.
el1: '\E[1K', NULL.
enacs: NULL, '\E)0'.
ich: '\E[%p1%d@', NULL.
initc: '\E]4;%p1%d;rgb\:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\\', NULL.
invis: '\E[8m', NULL.
is2: '\E[!p\E[?3;4l\E[4l\E>', '\E[m\E[?7h\E[4l\E>\E7\E[r\E[?1;3;4;6l\E8'.
kDC: '\E[3;2~', NULL.
kEND: '\E[1;2F', NULL.
kHOM: '\E[1;2H', NULL.
kIC: '\E[2;2~', NULL.
kLFT: '\E[1;2D', NULL.
kNXT: '\E[6;2~', NULL.
kPRV: '\E[5;2~', NULL.
kRIT: '\E[1;2C', NULL.
kb2: '\EOE', NULL.
kent: '\EOM', NULL.
kf13: '\E[1;2P', '\EO2P'.
kf14: '\E[1;2Q', '\EO2Q'.
kf15: '\E[1;2R', '\EO2R'.
kf16: '\E[1;2S', '\EO2S'.
kf25: '\E[1;5P', '\EO5P'.
kf26: '\E[1;5Q', '\EO5Q'.
kf27: '\E[1;5R', '\EO5R'.
kf28: '\E[1;5S', '\EO5S'.
kf37: '\E[1;6P', '\EO6P'.
kf38: '\E[1;6Q', '\EO6Q'.
kf39: '\E[1;6R', '\EO6R'.
kf40: '\E[1;6S', '\EO6S'.
kf49: '\E[1;3P', '\EO3P'.
kf50: '\E[1;3Q', '\EO3Q'.
kf51: '\E[1;3R', '\EO3R'.
kf52: '\E[1;3S', '\EO3S'.
kf61: '\E[1;4P', '\EO4P'.
kf62: '\E[1;4Q', '\EO4Q'.
kf63: '\E[1;4R', '\EO4R'.
kind: '\E[1;2B', NULL.
kri: '\E[1;2A', NULL.
mc0: '\E[i', NULL.
mc4: '\E[4i', NULL.
mc5: '\E[5i', NULL.
rmacs: '\E(B', '^O'.
rmcup: '\E[?1049l', '\E[2J\E[?47l\E8'.
rmm: '\E[?1034l', NULL.
rs1: '\Ec', NULL.
rs2: '\E[!p\E[?3;4l\E[4l\E>', '\E7\E[r\E8\E[m\E[?7h\E[?1;3;4;6l\E[4l\E>\E[?1000l\E[?25h'.
sgr: '%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m', '\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t\016%e\017%;'.
sgr0: '\E(B\E[m', '\E[0m\017'.
smacs: '\E(0', '^N'.
smcup: '\E[?1049h', '\E7\E[?47h'.
smm: '\E[?1034h', NULL.

在您看到NULL的地方,Konsole根本没有实现该功能。特别是,它对 initc (您所询问的功能)没有任何作用。

进一步阅读:

关于NCurses:为什么init_color返回OK但仍然没有设置颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10809350/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com