Techioz Blog

256 色、前景色と背景

概要

これは 2 つのスクリプトの物語であり、前の質問に関連しています。

2 つのスクリプトは http://gist.github.com/50692 にあります。 ansi.rb スクリプトは、256 色すべてを 256 色の背景色すべてに表示します。 ncurses.rb スクリプトは 256 色すべての前景色を表示しますが、背景には基本の 16 色が表示され、点滅や反転ビデオなどのさまざまな属性が循環しているようです。

それで何が与えられるのでしょうか?これは、色のペアに符号付き整数を使用するという ncurses のバグですか? (つまり、「tput Colors」では 256 と表示されますが、「tputpairs」では 65536 ではなく 32767 と表示されます) その場合、色のペアの前半は正しく表示されますが、後半は繰り返されるか、int として属性に入ります。包みます。

解決策

その理由は、Debian や Amazon AMI を含むほとんどのディストリビューションが使用する現在のバージョンを含む、ABI 6 より前の ncurses では、COLOR_PAIR(n) が 256 を超える定義されたペアを参照できないためです。これは、COLOR_PAIR(n) の引数が chtype 型であるためです。 。下位 8 ビットは色のペアを選択し、残りは特定の端末属性のビットフラグの論理和として扱われます。サンプル コードでペア番号 255 を超えようとすると、点滅、反転、下線などが表示されるのはこのためです。

これはかなり残念なことなので、プログラム内でキューを使用して init_pair() を使用してオンザフライで色を定義し、妥協案として最も最近使用されていないペアを上書きする予定です。私は ncurses のメンテナーである Thomas Dickey に、一時的に ncurses の外に出て生の端末コードを記述し、その後 ncurses に戻る方法があるかどうかを尋ねる手紙を書きました。彼の返事はこうだった。

この解決策には落とし穴が多すぎるように思えますが、ncurses プログラムで 256 を超える同時ペアが絶対に必要な場合 (inverse 属性で偽装できるペアはカウントしません)、これを行う必要があります。