NCURSES SW 在 lxterminal 中运行,但不在本机 Linux 终端中运行

NCURSES SW 在 lxterminal 中运行,但不在本机 Linux 终端中运行

我使用该库编写了一个“复杂”C 程序ncurses。它“正确”运行在 alxterminalgnome-terminal会话中运行;但在没有启动 X 的情况下不会在“本机 Linux 终端”会话中运行Ctrl(无需 X 或使用- Alt-终端重新启动 PC 即可获得F3)。

问题在于,在“本机 Linux 会话”中,程序不显示任何窗口,它仅显示第三个生成的窗口中打印的文本之一。

  • 我看到在 gnome-terminal 中TERM环境变量设置为xterm-256color.相比之下,本机 Linux 终端已TERM设置为linux.

  • 然后我TERM在本机 Linux 终端中使用以下命令进行设置:

    export TERM=xterm-256color
    

    当我设置TERMxterm-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-256colorncurses

相关链接:

相关内容