4

値COLOR_BLUEをrgb値(1000、0、0)に設定して、テキストブロックの背景を赤に設定しようとしています。Gnomeの「ターミナル」アプリケーションを使用する場合は背景が正しい(赤)が、KDEの「Konsole」を使用する場合は正しくない(青)。どうしてこれなの?次のコードは、コンパイル行を使用してLinuxでコンパイルされます。

g++ filename.cpp -lcurses

次の方法でTERMタイプをxterm-256colorに設定しました。

export TERM=xterm-256color

コードは次のとおりです。

#include <ncurses.h>
#include <cassert>
#include <csignal>

static bool stop = false;

void sigAbortHandler(int _sig)
{
    stop = true;
}

int main(int _argc, char **_argv)
{
    signal(SIGABRT, &sigAbortHandler);

    WINDOW *window = initscr();

    if (!has_colors())
    {
        delwin(window);
        endwin();
        perror("You must enable colors in your console");
    }

    if (!can_change_color())
    {
        delwin(window);
        endwin();
        perror("Error: unable to change colors, "
               "trying setting your TERM type to enable colors");
    }

    assert(start_color() == OK);
    keypad(stdscr, TRUE);
    cbreak();
    noecho();
    curs_set(0);
    nodelay(window, true);

    int background = COLOR_BLUE;
    assert(init_color(background, 1000, 0, 0) == OK);
    int foreground = 2;
    assert(init_color(foreground, 0, 0, 0) == OK);
    int pair = 1;
    assert(init_pair(pair, foreground, background) == OK);
    assert(wattron(window, COLOR_PAIR(pair)) == OK);

    short r, g, b;
    color_content(background, &r, &g, &b);
    assert(mvwprintw(window, 10, 10, "color content: %d, %d, %d", r, g, b) == OK);
    assert(wrefresh(window) == OK);
    assert(wattroff(window, COLOR_PAIR(pair)) == OK);

    while (!stop)
    {
    }

    delwin(window);
    endwin();

    return 0;
}
4

3 に答える 3

3

問題は、Konsole が期待する機能を実装していないことです。ncurses は、構成した端末の説明の内容のみを認識します。それが正しいことを確認するための汎用的な方法はありません。のRETURN-VALUEセクションはinit_color言う

init_color
端末がこの機能をサポートしていない場合、たとえば、initialize_color機能が端末の説明にない場合、エラーを返します。

おそらく、次のようなものがありTERM=xterm-256colorます。ncurses 端末データベースには正しいkonsole-256colorがあり、(infocmpと比較するために使用するとxterm-256color) 多くの点で異なります。

comparing xterm-256color to konsole-256color.
    comparing booleans.
    ccc: T:F.
    km: T:F.
    mc5i: T:F.
    comparing numbers.
    comparing strings.
    bel: '^G', NULL.
    cbt: '\E[Z', NULL.
    cnorm: '\E[?12l\E[?25h', '\E[?25h'.
    cvvis: '\E[?12;25h', NULL.
    dim: '\E[2m', NULL.
    el1: '\E[1K', NULL.
    enacs: NULL, '\E)0'.
    ich: '\E[%p1%d@', NULL.
    initc: '\E]4;%p1%d;rgb\:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\\', NULL.
    invis: '\E[8m', NULL.
    is2: '\E[!p\E[?3;4l\E[4l\E>', '\E[m\E[?7h\E[4l\E>\E7\E[r\E[?1;3;4;6l\E8'.
    kDC: '\E[3;2~', NULL.
    kEND: '\E[1;2F', NULL.
    kHOM: '\E[1;2H', NULL.
    kIC: '\E[2;2~', NULL.
    kLFT: '\E[1;2D', NULL.
    kNXT: '\E[6;2~', NULL.
    kPRV: '\E[5;2~', NULL.
    kRIT: '\E[1;2C', NULL.
    kb2: '\EOE', NULL.
    kent: '\EOM', NULL.
    kf13: '\E[1;2P', '\EO2P'.
    kf14: '\E[1;2Q', '\EO2Q'.
    kf15: '\E[1;2R', '\EO2R'.
    kf16: '\E[1;2S', '\EO2S'.
    kf25: '\E[1;5P', '\EO5P'.
    kf26: '\E[1;5Q', '\EO5Q'.
    kf27: '\E[1;5R', '\EO5R'.
    kf28: '\E[1;5S', '\EO5S'.
    kf37: '\E[1;6P', '\EO6P'.
    kf38: '\E[1;6Q', '\EO6Q'.
    kf39: '\E[1;6R', '\EO6R'.
    kf40: '\E[1;6S', '\EO6S'.
    kf49: '\E[1;3P', '\EO3P'.
    kf50: '\E[1;3Q', '\EO3Q'.
    kf51: '\E[1;3R', '\EO3R'.
    kf52: '\E[1;3S', '\EO3S'.
    kf61: '\E[1;4P', '\EO4P'.
    kf62: '\E[1;4Q', '\EO4Q'.
    kf63: '\E[1;4R', '\EO4R'.
    kind: '\E[1;2B', NULL.
    kri: '\E[1;2A', NULL.
    mc0: '\E[i', NULL.
    mc4: '\E[4i', NULL.
    mc5: '\E[5i', NULL.
    rmacs: '\E(B', '^O'.
    rmcup: '\E[?1049l', '\E[2J\E[?47l\E8'.
    rmm: '\E[?1034l', NULL.
    rs1: '\Ec', NULL.
    rs2: '\E[!p\E[?3;4l\E[4l\E>', '\E7\E[r\E8\E[m\E[?7h\E[?1;3;4;6l\E[4l\E>\E[?1000l\E[?25h'.
    sgr: '%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m', '\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t\016%e\017%;'.
    sgr0: '\E(B\E[m', '\E[0m\017'.
    smacs: '\E(0', '^N'.
    smcup: '\E[?1049h', '\E7\E[?47h'.
    smm: '\E[?1034h', NULL.

ご覧NULLのとおり、Konsole はこの機能をまったく実装していません。特に、initc(あなたが求めている機能)に対しては何もしませんでした。

参考文献:

于 2016-03-02T22:03:27.090 に答える
1

からの一見関連する抜粋man init_color:

The init_color routine changes the definition of a color.  ... The first
argument must be a legal color value; **default colors are not allowed here**.
(See the section Colors for the default color index.)
...
Colors
...
In <curses.h> the following macros are defined.  These are the default colors.
...
             COLOR_BLUE

したがって、これらの行は、ドキュメントによれば機能するはずのないことを行っていますが、一部の端末では機能する可能性があります。

int background = COLOR_BLUE;
assert(init_color(background, 1000, 0, 0) == OK);
int foreground = 2;
assert(init_color(foreground, 0, 0, 0) == OK);

事前定義された 16 の色のペア (太字の色を数えると) があるはずなので、and の代わりに and のペアを使用する1617うまくCOLOR_BLUEいく2かもしれません。

(Konsoleこれをチェックする必要はありませんが、これが理由である可能性があるか、少なくとも指摘する価値があります。)

于 2016-03-02T20:03:23.910 に答える
1

背景を COLOR_BLUE に設定するつもりでしたか? をチェックcan_change_colorしても、初期カラーは Konsole に影響を与えていないようで、背景は init_pair で COLOR_BLUE のままです。

int background = COLOR_BLUE;
assert(init_color(background, 1000, 0, 0) == OK);
...
assert(init_pair(pair, foreground, background) == OK);
assert(wattron(window, COLOR_PAIR(pair)) == OK);
于 2013-02-09T20:45:08.920 に答える