私はこのライブラリを使って「複雑な」Cプログラムを書いたncurses
。lxterminal
セッションでは「正しく」実行されますが、gnome-terminal
Xを起動しないと、「基本Linuxターミナル」セッションでは実行されません。Ctrl(Xなしで利用可能な場合、または-Terminalを使用してAltPCを再起動する場合F3)
問題は、「Native Linux Session」では、プログラムがウィンドウを表示せず、3番目の生成ウィンドウに印刷されたテキストの1つだけを表示することです。
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
(関数を介して)背景色を使用しているため、問題が発生します。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);
2番目のパラメータは前景用で、3番目のパラメータは背景用であるため、この例では色ペアの3番目のパラメータのみを単純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端末で動作が異なるのはなぜですか?
なぜならGNOME端末そしてLinuxコンソール異なるエスケープシーケンスセットを使用する2つの端末エミュレータ。これを異なるベンダーの2つの異なるハードウェア端末と考えてください。
xterm X Window Systemの標準端末エミュレータです。
GNOME端末
xterm
互換性のある端末エミュレータです。LinuxコンソールはいVT102エミュレータはカーネルにあります。例えば、厳密に言えばVT102色がありません。
これが、ncurses
端末に依存しないアプリケーションを作成するためにライブラリが必要な理由です。各端末エミュレータの機能コレクションはterminfo
データベースに保存されます。Linuxコンソール独自のアイテムもありますGNOME端末。ncurses
このデータベースの情報を使用して端末エミュレータを管理します。
次のコマンドを使用して項目を比較できます。
infocmp -c linux xterm-256color
したがって、LinuxコンソールでTERM
変数をからに変更すると、実際のlinux
(正しい)エスケープシーケンスを使用するのではなく、外部エスケープシーケンスセットを使用して端末と通信することを意味します。それでも、いくつかのコードは類似性があるので理解できますが、すべてではありません。xterm-256color
ncurses
関連リンク: