curs_color(3x) curs_color(3x)
start_color, init_pair, init_color, has_colors, can_change_color, color_content, pair_content, COLOR_PAIR - curses 色を操作するルーチン
# include <curses.h> int start_color(void); int init_pair(short pair, short f, short b); int init_color(short color, short r, short g, short b); bool has_colors(void); bool can_change_color(void); int color_content(short color, short *r, short *g, short *b); int pair_content(short pair, short *f, short *b); int COLOR_PAIR(int n);
curses はその機能項目を持つ端末で色の属性をサポートします。 これらのルーチンを使うには、通常 initscr の直後に start_color を呼び出す必要があります。 色は常にペアで使用します。(色のペアといいます。) 色のペアは前景色(文字の色)と背景色(地の色で、文字はその上に 表示される)で構成されます。 色のペアは init_pair ルーチンで初期化します。 初期化した後は、新しい表示属性として <curses.h> で定義されるマクロ COLOR_PAIR(n) が使えます。 端末で色の変更が可能な場合は、色の定義の変更に init_color ルーチンを使うことができます。 has_colors と can_change_color ルーチンは、端末がカラー機能を 持つかどうか、ユーザーが色を変更できるかどうかにより、それぞれ TRUE か FALSE を返します。 初期化された色から color_content ルーチンで赤・緑・青の成分を 取り出すことができます。 pair_content ルーチンを使うと与えられた色のペアが 現在どのように定義されているかを探ることができます。
curses ライブラリは下記の入力を組み合わせて、実際に画面に 表示する前景色と背景色を作ります。 o 文字ごとの表示属性 (例えば waddch 経由) o ウインドウの属性 (例えば wattrset による) o 背景文字 (例えば wbkgdset)。 文字ごとの表示属性とウインドウの属性は通常 COLOR_PAIR の値を含む表示属性を含む 1 つのパラメータによって 設定されます。 wattr_set のようないくつかの関数は、色のペアの番号である 別々の引数を使います。 背景文字は特別な場合です。 これはちょうど waddch に渡されたかのような文字値を含みます。 curses ライプラリは、これらの色のペアを組み合わせる 実際の処理を、 waddch から呼び出される内部関数で処理します。 o waddch に渡される引数が空白だった場合、 特別な色のペア 0 を使います。 o curses は次にウインドウの属性を調べます。 o ウインドウの属性が色のペア 0 でなければ、 curses はウインドウの属性から色のペアを使います。 o それ以外の場合 curses は背景文字を使います。 o waddch に渡された引数が空白でないか、 特別な色のペア 0 を使わない場合、引数が 0 でなければ、 curses は引数から色のペアを選びます。 その他の場合、次にウインドウの属性を試し、 最後は背景文字を使います。 wprintw のようないくつかの curses 関数は waddch を使います。 これらは色のペアと引数を組み合わせません。 その結果、これらの呼び出しはウインドウ属性か背景文字しか 使いません。
start_color ルーチンに引数はありません。 色を使う場合には、他の色操作ルーチンを呼び出す前に start_color を呼び出す必要があります。 initscr の直後にこのルーチンを呼び出すのは良い習慣です。 start_color は以下の処理をします。 o 2 つの広域(グローバル)変数 COLORS と COLOR_PAIRS を 初期化します。(それぞれ、端末がサポートする色と色のペアの 最大数を定義します。) o 特別な色のペア 0 をデフォルトの前景色と背景色として 初期化します。他の色のペアは初期化しません。 o 端末の色を、端末が起動した時の値に戻します。 o 端末が initc (initialize_color) 機能項目を サポートしている場合、 start_color はカラーパレットの 赤・緑・青成分を表す内部テーブルを初期化します。 色成分は、端末が CGA (aka "ANSI") を用いるか、 HLS (つまり hls (hue_lightness_saturation) 機能項目が 設定されている) を用いるかによって異なります。 まず基本色 8 色(黒、赤、緑、黃、青、マゼンタ、シアン、 白)でテーブルを初期化し、その後(端末が 8 色より多くを サポートしていれば)色成分を 1000 まで初期化します。 start_color は内蔵のテーブルに合わせて 端末のカラーパレットを設定しようとはしません。 端末の色に合わせて内蔵テーブルを変更するには init_color を使います。 以下の制限が色の値と色のペアに適用されます。 これらの制限からはずれた値は不正であり、実行中エラーとなる でしょう。 o COLORS は端末データベースの max_colors 機能項目に 対応します。典型的には符号付き 16 ビット整数値です。 ( terminfo(5) を参照してください。) o 色の値は 0以上 COLORS-1 以下の範囲を想定しています。 (両端も含む、つまり 0 と COLORS-1 も含む) o 特別な色の値 -1 が特定の拡張機能関数でデフォルトの色を 表すのに使われます。 ( use_default_colors を参照してください。) o COLOR_PAIRS は端末データベースの max_pairs 機能項目に 対応します。典型的には符号付き 16 ビット整数値です。 ( terminfo(5) を参照してください。) o 有効な色のペアの値は 1 以上 COLOR_PAIRS-1 以下です。 o 色のペア 0 は特別扱いで、「色がない」ことを表します。 色のペア 0 は黒地に白と仮定されています。しかし 実際には、色を初期化する前に端末が実装している色です。 アプリケーションから変更することはできません。 init_pair ルーチンは色のペアの定義を変更します。 変更する色のペアの番号、前景色の番号、背景色の番号の 3 つの引数を取ります。 ポータブル・アプリケーションでは、 o 1 番目の引数は有効な色のペアの値でなければなりません。 デフォルトの色を使うとき( use_default_colors 参照)、 上限は前景色と背景色にデフォルトの色を使う拡張的な 色のペアを受け入れるように調整されます。 o 2 番目と 3 番目の引数は有効な色の値でなければなりません。 色のペアが以前に初期化されていた場合、画面を更新し、 現れた色のペアはすべて新しい定義に変更されます。 拡張機能として、 ncurses では assume_default_colors ルーチンで色のペア 0 を設定できます。または、初めに use_default_colors ルーチンを呼び出すことでデフォルトの色 (色番号 STRONG>-1)を使うことを指定できます。 init_color ルーチンは色の定義を変更します。 色の番号と、変更後の RGB の値(赤・緑・青の成分の輝度) 3 つの 計 4 つの引数を取ります。 1 番目の引数は有効な色の値でなければなりません。 デフォルトの色はここでは使用できません。 ( デフォルトの色の一覧は 色 の節を参照してください。) 後ろ 3 つの引数は 0 から 1000 までの値でなければなりません。 init_color を使うと、画面上のその色はすぐに新しい定義に 変更されます。 has_colors ルーチンに引数はありません。 端末が色を扱えれば TRUE を、そうでなければ FALSE を返します。 このルーチンは端末に依存しないプログラムを作るとき便利です。 例えば、色を使うか、他の表示属性を使うかを決めるために 使うことができます。 can_change_color ルーチンに引数はありません。 端末が色をサポートし、その定義を変更できるなら TRUE を、 そうでなければ FALSE を返します。 このルーチンは端末に依存しないプログラムを作るとき便利です。 color_content ルーチンを使うと、ある色の RGB (赤・緑・青) 成分の輝度を知ることができます。 色の番号と、与えられた色の RGB 成分の値を格納する short 値のアドレス 3 つ、計 4 つの引数を取ります。 1 番目の引数は有効な色の値、すなわち 0 以上 COLORS-1 以下 でなければなりません。 後ろ 3 つの引数で示されるアドレスに格納される値は、 0 (全く成分がない) 以上 1000 (最大の成分値) 以下の範囲に なります。 pair_content ルーチンを使うと、与えられた色のペアが どの色で構成されているかを知ることができます。 色のペアの番号と、前景色と背景色の番号を格納する short 値のアドレス 2 つ、計 3 つの引数を取ります。 1 番目の引数は有効な色の(訳注: ペアの)値、すなわち 1 以上 COLOR_PAIRS-1 以下でなければなりません。 2 番目と 3 番目の引数で示されるアドレスに格納される値は、 0 以上 COLORS (訳注: COLORS-1) 以下になります。
<curses.h> は次のマクロを定義しています。 これらは標準の色です(ISO-6429)。 curses はまた、すべての端末において COLOR_BLACK を デフォルトの背景色と仮定します。 COLOR_BLACK COLOR_RED COLOR_GREEN COLOR_YELLOW COLOR_BLUE COLOR_MAGENTA COLOR_CYAN COLOR_WHITE
can_change_color() と has_colors() ルーチンは TRUE または FALSE を返します。 他のすべてのルーチンは、失敗したときに整数値 ERR を、 正常終了したときに OK ( SVr4 は「 ERR 以外の整数値」としか 指定していません) を返します。 X/Open はエラーの条件を何も定義していません。 この実装は、 0 以上 COLORS-1 以下の範囲の外の色の値を 使おうとした場合(デフォルトの色を使う拡張を除く)、または 0 以上 COLOR_PAIRS-1 以下の範囲の外の色のペアの値を 使おうとした場合に ERR を返します。 init_color で使う色(訳注: 色の成分)の値は、 0 から 1000 の 範囲でなければなりません。 端末が初期化されていない場合、すべての関数はエラーを 返します。 start_color が呼び出されていない場合、 init_pair のような 後続的な関数はエラーを返します。 init_color 端末がこの機能をサポートしていない場合、例えば initialize_color 機能項目が端末記述から欠落している 場合にエラーを返します。 start_color 色のテーブルが割り当てられない場合にエラーを 返します。
ncurses の実装では、各端末ごとに別々の色有効化フラグ、 カラーパレット、色のペアのテーブル、 COLORS と COLOR_PAIRS の値があり、 start_color 関数は現在画面にしか 作用しません。 SVr4/XSI のインターフェイスはこのような考えで実際に設計 されておらず、歴史的な実装では 1 つのカラーパレットを 共有して使うことがあります。 色のペアを通して暗黙に背景色を設定すると、文字の 書き込み操作が明示的にタッチしたマスにしか作用しないことに 注意してください。 ウインドウの一部分が消去かスクロール操作で空白になるときに 使われる背景色を変えるには curs_bkgd(3x) を参照してください。 VGA 互換グラフィックスを持つ 386 と 486 マシンに適用される いくつかの注意があります。 COLOR_YELLOW は実際には茶色です。黄色にするには、 COLOR_YELLOW を A_BOLD 属性と組み合わせてください。 A_BLINK 属性は理論的には背景が明るくなるはずです。 これはしばしばうまく動作しません。 そして、ほぼ正しく動作するビデオカード( Paradise とその 互換品)でさえ、明るい黄色の背景色を設定しようとすると 間違った動作をします。(代わりに黄色の前景色が点滅します) o 色の RGB 値は設定できません。
この実装は XSI Curses による COLORS と COLOR_PAIRS の 最大値の最小限度を満足しています。 init_pair ルーチンは use_default_colors 拡張機能を サポートするため、負の値の前景色と背景色を受け付けますが、 それは use_default_colors ルーチンを初めに呼び出した場合だけ です。 すべての端末でデフォルトの背景色が COLOR_BLACK である という仮定は assume_default_colors 拡張機能を使うことで 変更できます。 この実装はポインタ、例えば color_content と pair_content が 返す値のためのポインタを検査します。そしてヌルのときには 省略可能な引数のように扱います。
curses(3x), curs_initscr(3x), curs_attr(3x), curs_variables(3x), default_colors(3x) curs_color(3x)