NCURSES SW는 lxterminal에서 실행되지만 기본 Linux 터미널에서는 실행되지 않습니다.

NCURSES SW는 lxterminal에서 실행되지만 기본 Linux 터미널에서는 실행되지 않습니다.

나는 이 라이브러리를 사용하여 "복잡한" C 프로그램을 작성했습니다 ncurses. lxterminal세션 에서는 "올바르게" 실행되지만 gnome-terminalX를 시작하지 않으면 "기본 Linux 터미널" 세션에서는 실행되지 않습니다.Ctrl(X 없이 사용 가능하거나 -Terminal 을 사용하여 AltPC를 다시 시작하는 경우 F3)

문제는 "Native Linux Session"에서 프로그램이 어떤 창도 표시하지 않고 세 번째 생성된 창에 인쇄된 텍스트 중 하나만 표시한다는 것입니다.

  • TERMgnome-terminal에서는 환경 변수가 로 설정되어 있는 것을 볼 수 있습니다 xterm-256color. 반면에 기본 Linux 터미널 TERMlinux.

  • 그런 다음 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( 함수를 통해) 배경색을 사용하고 있기 때문에 문제가 발생합니다.리눅스 가상 터미널지원하지 않습니다. 배경색 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예상대로 작동하지 않습니다. 테이블의 본체는 단색 검정색입니다.그놈 터미널, 색상은 회색입니다. 그래서,색상이 좀 안맞네요, 댓글에 쓰신 대로요.

2. 그놈 터미널에서 동작이 다른 이유는 무엇입니까?

왜냐하면그놈 터미널그리고리눅스 콘솔서로 다른 이스케이프 시퀀스 세트를 사용하는 두 개의 터미널 에뮬레이터입니다. 이를 서로 다른 공급업체의 서로 다른 두 개의 하드웨어 터미널로 생각하십시오.

  • xterm X Window System의 표준 터미널 에뮬레이터입니다.

  • 그놈 터미널xterm호환되는 터미널 에뮬레이터 입니다 .

  • 리눅스 콘솔VT102에뮬레이터는 커널에 상주합니다. 예를 들어 엄밀히 말하면VT102색깔이 없습니다.

이것이 바로 ncurses터미널 독립적인 애플리케이션을 작성하기 위해 라이브러리가 필요한 이유입니다. 각 터미널 에뮬레이터의 기능 모음은 terminfo데이터베이스에 저장됩니다.리눅스 콘솔자체 항목도 있습니다그놈 터미널. ncurses이 데이터베이스의 정보를 사용하여 터미널 에뮬레이터를 관리하십시오.

다음 명령을 사용하여 항목을 비교할 수 있습니다.

infocmp -c linux xterm-256color

따라서 Linux 콘솔에서 TERM변수를 에서 로 변경 하면 linux실제(올바른) 이스케이프 시퀀스를 사용하는 대신 외부 이스케이프 시퀀스 세트를 사용하여 터미널과 통신하라는 의미입니다. 그래도 일부 코드는 유사성이 있기 때문에 이해할 수 있지만 전부는 아닙니다.xterm-256colorncurses

관련된 링크들:

관련 정보