4

ターミナルでの色の使用を許可する C++ クラスを作成しています。すべての端末で動作するようにしたい:

  • True Color (24 ビット) をサポートする端末での印刷、
  • それをサポートする端末で256色(6x6x6)で、
  • それ以外は基本16色。

termcap を使用して C 関数を書いたことがあるので、今回はそれを使用することを考えました。ただし、マニュアルページには次のように書かれています:

termcap データベースは、文字セル端末とプリンターの機能を記述するための古い機能です。古いプログラムでの機能のためにのみ保持されます。新しいものは、terminfo データベースと関連ライブラリを使用する必要があります。

そこで、terminfo を使用しようとしましたが、これを行う方法が見つかりませんでした。私のシステムには terminfo.h がありません (私は Debian で実行しています)。

私の質問は:

最新のツール (つまり、manpage によると、termcap ではない) を使用して、C/C++ で現在の端末の色の可能性を取得するにはどうすればよいですか?

4

1 に答える 1

5

簡単に言えば、 2018 年 1 月にncurses 6.1がリリースされるまで、terminfo から情報を取得できなかったということです。

より長い答え:

  • TrueColor を効果的に使用するには、3 つのパラメーター ( redgreenblue )を処理するインターフェイスが必要です。Termcap はこれを行うことができません。Terminfo は複数のパラメータを処理できますが...
  • TrueColor 自体を扱う標準の端末機能(ブール値、数値、または文字列である機能の名前) はありません。
  • 既存の機能を適応させることはできますが、制限があります

terminfo(5)マニュアルを見ると、次の (文字列) が表示される場合があります。

   initialize_color          initc  Ic   initialize color #1
                                         to (#2,#3,#4)
   initialize_pair           initp  Ip   Initialize color
                                         pair #1 to
                                         fg=(#2,#3,#4),
                                         bg=(#5,#6,#7)

これら(数字)に関連するもの:

   max_colors                colors Co   maximum number of
                                         colors on screen
   max_pairs                 pairs  pa   maximum number of
                                         color-pairs on the
                                         screen

ANSI の色とそれらと互換性のあるスキーム (16 色、88 色、256 色など) は、前景と背景をペアで色付けしていることを前提としています。その理由は、ずっと前にハードウェア端末がそのように機能したからです。このinitialize_color機能は、別のスキーム (Tektronix) 用であり、便利に見えるかもしれません。

ただし、terminfo はコンパイルされ、結果のバイナリ ファイルには符号付き 16 ビット整数のみが格納されます。max_pairs 端末の説明を使用して、適切な色または max_colors24 ビット色を格納することはできませんでした。(termcap はすべてを文字列として格納しますが、前述のように、このアプリケーションには適していません)。

この質問と回答が最初に書かれてから数年後、terminfo が更新され、符号付き 32 ビット整数を使用する新しいファイル形式を使用するようになりました。これは、24 ビット RGB カラーで色数を表現するのに十分です。

詳細については、ncurses 6.1のリリース発表と更新されたマニュアル ページを参照してください。term(5)マニュアル ページでは、terminfo データに直接アクセスする一部のアプリケーションで使用される古い API にはまだ制限があることを指摘しています。

参考文献:

于 2016-03-22T19:39:46.390 に答える