
나는 이 라이브러리를 사용하여 "복잡한" C 프로그램을 작성했습니다 ncurses
. lxterminal
세션 에서는 "올바르게" 실행되지만 gnome-terminal
X를 시작하지 않으면 "기본 Linux 터미널" 세션에서는 실행되지 않습니다.Ctrl(X 없이 사용 가능하거나 -Terminal 을 사용하여 AltPC를 다시 시작하는 경우 F3)
문제는 "Native Linux Session"에서 프로그램이 어떤 창도 표시하지 않고 세 번째 생성된 창에 인쇄된 텍스트 중 하나만 표시한다는 것입니다.
TERM
gnome-terminal에서는 환경 변수가 로 설정되어 있는 것을 볼 수 있습니다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
( 함수를 통해) 배경색을 사용하고 있기 때문에 문제가 발생합니다.리눅스 가상 터미널지원하지 않습니다. 배경색 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-256color
ncurses
관련된 링크들: