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)