NCURSES SW は lxterminal で実行されますが、デフォルトの Linux 端末では実行されません。

NCURSES SW は lxterminal で実行されますが、デフォルトの Linux 端末では実行されません。

私はこのライブラリを使って「複雑な」Cプログラムを書いたncurseslxterminalセッションでは「正しく」実行されますが、gnome-terminalXを起動しないと、「基本Linuxターミナル」セッションでは実行されません。Ctrl(Xなしで利用可能な場合、または-Terminalを使用してAltPCを再起動する場合F3

問題は、「Native Linux Session」では、プログラムがウィンドウを表示せず、3番目の生成ウィンドウに印刷されたテキストの1つだけを表示することです。

  • 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(関数を介して)背景色を使用しているため、問題が発生します。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 | 8COLOR_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-256colorncurses

関連リンク:

おすすめ記事