我使用该库编写了一个“复杂”C 程序ncurses
。它“正确”运行在 alxterminal
或gnome-terminal
会话中运行;但在没有启动 X 的情况下不会在“本机 Linux 终端”会话中运行Ctrl(无需 X 或使用- Alt-终端重新启动 PC 即可获得F3)。
问题在于,在“本机 Linux 会话”中,程序不显示任何窗口,它仅显示第三个生成的窗口中打印的文本之一。
我看到在 gnome-terminal 中
TERM
环境变量设置为xterm-256color
.相比之下,本机 Linux 终端已TERM
设置为linux
.然后我
TERM
在本机 Linux 终端中使用以下命令进行设置:export TERM=xterm-256color
当我设置
TERM
为xterm-256color
程序运行更好并显示可用界面,但构造框的所有字符都被其他字符替换时,垂直线字符被字符替换x
。但我认为
xterm
是针对 X 终端部分然后我尝试了ansi
:export TERM=ansi
使用最后一个设置,程序几乎不会像本机设置那样显示任何内容。
使用
vt100
:export TERM=vt100
程序运行得更好,但显示为黑白。
使用 ncurses 库发布的示例也会发生相同的行为。
你有什么解释吗?
如何设置终端功能才能正确启动 ncurses 程序?
我可能没有在代码中设置与终端相关(或与 ncurses 相关)的内容?
例子
#include <ncurses.h>
static void initGeneralScreen(void);
int main()
{
WINDOW * deskW, * msgW, * otherW;
initGeneralScreen();
deskW = newwin(21,80,0,0);
wbkgd(deskW, COLOR_PAIR(3));
box(deskW, 0, 0 ); // sets default borders for the window
wrefresh( deskW ); // update the terminal screen
msgW = newwin(3, 80, 21, 0);
wbkgd(msgW, COLOR_PAIR(1));
box(msgW, 0, 0 ); // sets default borders for the window
wrefresh(msgW ); // update the terminal screen
otherW = newwin(1,78,0,1);
wbkgd(otherW, COLOR_PAIR(1));
wrefresh(otherW ); // update the terminal screen
mvwprintw(msgW,1,1,"Test ... <Hit a key to exit>");
wrefresh(msgW ); // update the terminal screen
mvwprintw(otherW,0,0,"Test1");
wrefresh(otherW ); // update the terminal screen
wgetch(deskW);
delwin( otherW );
delwin( msgW );
delwin( deskW );
endwin();
return 0;
}
void initGeneralScreen(void)
{
initscr(); // initialize Ncurses
noecho(); // disable echoing of characters on the screen
raw(); //
keypad(stdscr,TRUE);
start_color();
init_pair(1,COLOR_YELLOW | 8, COLOR_BLUE);
init_pair(2,COLOR_YELLOW, COLOR_BLUE);
init_pair(3,COLOR_WHITE | 8, COLOR_BLACK | 8);
}
笔记:
- 核心
Linux 4.15.0-101-generic #102-Ubuntu SMP Mon May 11 10:07:26 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
libncurses.so.5.9
答案1
我变了
init_pair(1,COLOR_YELLOW | 8, COLOR_BLUE);
init_pair(2,COLOR_YELLOW, COLOR_BLUE);
init_pair(3,COLOR_WHITE | 8, COLOR_BLACK | 8);
到
init_pair(1,COLOR_YELLOW, COLOR_BLUE);
init_pair(2,COLOR_YELLOW, COLOR_BLUE);
init_pair(3,COLOR_WHITE, COLOR_BLACK);
程序开始按预期工作。
出现问题的原因是您使用了背景颜色(通过wbkgd
功能),这Linux虚拟终端不支持。它仅支持 8 种背景颜色和 8 种前景颜色 -关于 ncurses 颜色。
看:
printf("COLOR_YELLOW\t\t%d\n", COLOR_YELLOW);
printf("COLOR_BLUE\t\t%d\n", COLOR_BLUE);
printf("COLOR_BLACK\t\t%d\n", COLOR_BLACK);
printf("COLOR_WHITE\t\t%d\n", COLOR_WHITE);
puts("");
printf("COLOR_YELLOW | 8\t%d\n", COLOR_YELLOW | 8);
printf("COLOR_BLACK | 8\t\t%d\n", COLOR_BLACK | 8);
printf("COLOR_WHITE | 8\t\t%d\n", COLOR_WHITE | 8);
输出
COLOR_YELLOW 3
COLOR_BLUE 4
COLOR_BLACK 0
COLOR_WHITE 7
COLOR_YELLOW | 8 11 // not allowed for background
COLOR_BLACK | 8 8 // not allowed for background
COLOR_WHITE | 8 15 // not allowed for background
编辑
1.
根据init_pair签名:
int init_pair(short pair, short f, short b);
第二个参数用于前景,第三个参数用于背景,因此在示例中,颜色对中唯一的第三个参数3
应从简单更改COLOR_BLACK | 8
为简单。COLOR_BLACK
因此,这在 Linux 控制台中是合法的:
init_pair(1,COLOR_YELLOW | 8, COLOR_BLUE);
init_pair(2,COLOR_YELLOW, COLOR_BLUE);
init_pair(3,COLOR_WHITE | 8, COLOR_BLACK);
TERM=xterm-256color
这回答了为什么在控制台中设置时看不到太多颜色变化。因为只有COLOR_BLACK | 8
不支持,其他都好。和COLOR_BLACK | 8
没有按预期工作 - 桌子的主体是纯黑色的,与gnome 终端,其颜色为灰色。所以,颜色不完全正确,正如您在评论中所写。
2. 为什么在 gnome-terminal 中行为不同?
因为gnome 终端和Linux 控制台是两个终端模拟器,它们使用不同的转义序列集。将它们视为来自不同供应商的两个不同硬件终端。
xterm 是 X Window 系统的标准终端仿真器。
gnome 终端是
xterm
兼容的终端仿真器。Linux 控制台是VT102模拟器驻留在内核中。例如,不是严格的VT102没有颜色。
这就是ncurses
需要库的原因 - 编写独立于终端的应用程序。每个终端仿真器功能的集合存储在terminfo
数据库中。Linux 控制台有自己的条目,以及gnome 终端。ncurses
使用此数据库中的信息来管理终端仿真器。
您可以通过以下命令比较条目:
infocmp -c linux xterm-256color
因此,当您在 Linux 控制台中将TERM
变量从更改linux
为时,您是说使用一组外部转义序列来与终端通信,而不是使用真实的(正确的)转义序列。尽管如此,有些代码还是可以理解的,因为它们有相似之处,但并非全部。xterm-256color
ncurses
相关链接: