curses による文字の操作

curses ウィンドウに文字を追加するには、 キーボードまたは curses アプリケーションを使用します。 この項では、curses ウィンドウに現れる文字を追加、除去、 または変更する方法について説明します。

文字サイズ

文字セットによっては、スクリーンに表示される場合に複数のカラムを占有する、 複数カラム文字を定義しています。

宛先ウィンドウの幅より大きい幅の文字を書き出すと、エラーが生じます。

スクリーン・イメージへの文字の追加

curses ライブラリーには、 ウィンドウへのテキストの変更を書き出し、wrefresh サブルーチンに対する次のコール時に更新する必要がある領域をマークする多くのサブルーチンがあります。

waddch サブルーチン

waddch サブルーチンは、指定された文字を使用して、現在の論理カーソル位置にある文字を上書きします。 上書きの後に、 論理カーソルは 1 スペース右に移動します。 waddch サブルーチンを右マージンで呼び出した場合、 これらのサブルーチンは自動改行文字も追加します。 さらに、これらのサブルーチンの 1 つをスクロール領域下部で呼び出したときに、 scrollok サブルーチンが使用可能になっていると、領域は 1 行スクロールアップされます。 例えば、ウィンドウのボトム行で改行を追加すると、ウィンドウは 1 行スクロールアップします。

追加する文字がタブ、改行、 またはバックスペース文字文字である場合、curses は追加文字を反映するために、 カーソルをウィンドウ内で適切に移動します。 タブは 8 カラムごとに設定されます。 文字が改行である場合、curses は最初に wclrtoeol サブルーチンを使用して、 現在行を論理カーソル位置から行の末尾まで消去してから、カーソルを移動します。 waddch サブルーチン・ファミリーは以下のものから構成されます。
サブルーチン 説明
addch マクロ 文字を stdscr に追加します。
mvaddch マクロ 文字を指定された位置へ移動してから、その文字を stdscr に追加します。
mvwaddch マクロ 文字を指定された位置へ移動してから、それをユーザー定義ウィンドウに追加します。
waddch サブルーチン 文字をユーザー定義ウィンドウに追加します。

winch および waddch サブルーチン・ファミリーを一緒に使用することによって、 テキストとビデオの属性を、ある位置から別の位置へコピーすることができます。 winch サブルーチン・ファミリーを使用すれば、 文字およびそのビデオ属性を取り出すことができます。 次に、いずれかの waddch サブルーチンを使用すれば、 文字およびその属性を別の位置に追加することができます。

さらに、waddch サブルーチンを使用すれば、 制御文字をウィンドウに追加することができます。 制御文字は ^X 表記で表示されます。

注: 制御文字を備えたウィンドウの中の位置で winch サブルーチンを呼び出した場合、その文字は戻されません。 その代わりに、 制御文字を表す 1 文字が戻されます。

単一の非制御文字の出力

単一の非制御文字を出力する場合、 wechochar サブルーチンを使用すると、 パフォーマンスをかなり向上させることができます。 これらのサブルーチンは、対応する waddchr サブルーチンへのコールに続く、対応する wrefresh サブルーチンへのコールと機能的に等価です。 wechochar サブルーチンには、wechochar サブルーチン、echochar マクロ、および pechochar サブルーチンなどがあります。

文字セットによっては、非スペーシング文字が入っている場合があります。 (非スペーシング文字は、 wcwidth サブルーチンがゼロの幅を戻す、 ' ¥ 0 '文字を除く文字です。) アプリケーションは、非スペーシング文字をウィンドウに書き出す場合があります。 ウィンドウ内のすべての非スペーシング文字は、 スペーシング文字に関連していて、スペーシング文字を変更します。 ウィンドウ内の非スペーシング文字は個別に扱うことはできません。 非スペーシング文字は、 非スペーシング文字が関連しているスペーシング文字に curses 操作が影響を与える場合は常に、 暗黙的に処理されます。

非スペーシング文字は属性をサポートしません。 幅の広い文字と属性を使用するインターフェースの場合、 幅の広い文字が非スペーシング文字であると、属性は無視されます。 複数カラムの文字は、すべてのカラムの属性からなる 1 つのセットを持っています。 非スペーシング文字とスペーシング文字の関連付けは、 幅の広い文字のインターフェースを使用するアプリケーションによって制御することができます。 幅の広い文字列の関数は、コード・セットに依存する関連付けを提供します。

c と呼ばれるスペーシング文字に関連する非スペーシング文字の、一般的な効果を以下に示します。

  • 非スペーシング文字は c の外観を変更する可能性があります。 (例えば、発音区別符号を文字に追加する非スペーシング文字がある可能性があります。) ただし、発音区別符号が組み込まれたスペーシング文字がある場合もあります。
  • 非スペーシング文字は cc に続く文字にブリッジする可能性があります。 この使用法の例は、合字の形成、および複合した表示形式、ワード、 または表意文字への文字の変換です。

スペーシング文字に関連付けられる非スペーシング文字の数が制限されている場合には、 すべての制限は少なくとも 5 以上に制限されます。

複合文字

複合文字は関連する文字のセットであり、 スペーシング文字およびスペーシング文字に関連する非スペーシング文字が入っている可能性があります。 スペーシング複合文字は、1 つのスペーシング文字およびそれに関連する非スペーシング文字 (もしあれば) の入った複合文字です。 複合文字を持っているコード・セットの例は ISO/IEC 10646-1:1993 です。

複合文字はスクリーンに書き出すことができます。 複合文字にスペーシング文字が組み込まれていない場合、すべての非スペーシング文字は、 指定されたスクリーン位置に存在するスペーシング複合文字に関連しています。 アプリケーションがスクリーンから情報を読み戻す場合、 アプリケーションはスペーシング複合文字を獲得します。

cchar_t データ型は、複合文字およびその解釈を表します。 cchar_t が非スペーシング複合文字を表す場合 (すなわち、 複合文字にスペーシング文字がない場合)、その解釈は使用されません。 スクリーンに書き出される場合、 既に表示されているスペーシング文字によって指定される解釈が使用されます。

タイプが cchar_t のオブジェクトは、 setchar サブルーチンを使用して初期化することができ、 その内容は getchar サブルーチンを使用して抽出することができます。 この方法で初期化されなかった cchar_t 値を取る関数の振る舞いは、cchar_t 出力引数を持っている curses 関数から得られます。

特殊文字

関数の中には、 特殊文字を処理するものがあります。 ウィンドウ内の情報に基づいてカーソルを移動しない関数では、 文字列内のこれらの特殊文字だけが使用されて、 以後の文字の位置に影響を与えます。 以下に示したカーソルの移動は、 操作の終了後は可視のカーソルの状態にはなりません。 カーソルを移動しない関数では、これらの特殊文字を使用して、 以後の文字の位置に影響を与え、 物理カーソルの移動を行うことができます。

文字 説明
バックスペース カーソルが既にカラム 0 にある場合を除いて、バックスペース文字は、 カーソルを現在行の先頭方向へ 1 カラム移動します。 バックスペース文字の後のすべての文字は、そこから始まって追加または挿入されます。
復帰 カーソルが既にカラム 0 にある場合を除いて、復帰は、カーソルを 現在行の開始位置に移動させます。 復帰の後のすべての文字は、 そこから始まって追加または挿入されます。
改行 追加操作では、curses は、行の末尾に到達するまで、 以後のカラムにバックグラウンド文字を追加します。 スクロールが発生し、改行文字の後のすべての文字が、新しい行の先頭から追加されます。

挿入操作では、改行によって現在行の残りの部分がバックグラウンド文字 (実際には wclrtoeol サブルーチン) によって消去され、 カーソルが新しい行の先頭に移動します。 スクロールが使用可能な場合、 カーソルを新しい行に進めると、スクロールが発生する可能性があります。 改行文字の後のすべての文字は、 新しい行の先頭に挿入されます。

filter 関数によって、この処理が禁止される場合があります。

タブ テキスト内のタブ文字は、 以後の文字を次の水平タブ停止位置に移動します。 デフォルトでは、タブ停止位置は、カラム 0、8、16 ... です。

curses は、次のタブ停止位置に到達するまで、 以後のカラムにバックグラウンド文字を、 挿入操作では挿入し、追加操作では追加します。 現在行にタブ停止位置がこれ以上ない場合には、 折り返しまたはスクロールが発生します。

制御文字

特殊文字の処理を実行する curses 関数は、概念上、 制御文字を ( ' ^ ' ) 文字とそれに続く 2 番目の文字 (英字の場合には大文字) に変換し、 制御文字の代わりに、この文字列をウィンドウに書き出します。 ウィンドウからテキストを取り出す関数は、元の制御文字を取り出しません。

線画グラフィックス:

waddch サブルーチンによってスクリーンに線画文字を追加するために、 以下の変数を使用することができます。 変数は、端末用に定義されている場合、 A_ALTCHARSET ビットがオンになります。 それ以外の場合、以下の表にリストされているデフォルト文字が変数に保管されます。

変数名 デフォルト文字 グリフの説明
ACS_ULCORNER + 左上隅
ACS_LLCORNER + 左下隅
ACS_URCORNER + 右上隅
ACS_LRCORNER + 右下隅
ACS_RTEE + 右ティー
ACS_LTEE + 左ティー
ACS_BTEE + ボトム・ティー
ACS_TTEE + トップ・ティー
ACS_HLINE 水平線
ACS_VLINE | 縦線
ACS_PLUS + 正符号
ACS_S1 - 走査線 1
ACS_S9 _ 走査線 9
ACS_DIAMOND + ダイヤモンド
ACS_CKBOARD : チェッカー・ボード (スティップル)
ACS_DEGREE , 度記号
ACS_PLMINUS # 正/負
ACS_BULLET o 黒丸
ACS_LARROW < 左矢印
ACS_RARROW > 右矢印
ACS_DARROW v 下矢印
ACS_UARROW ^ 上矢印
ACS_BOARD # 正方形のボード
ACS_LANTERN # ランタン記号
ACS_BLOCK # 塗りつぶし正方形ブロック

waddstr サブルーチン

waddstr サブルーチンは、現在の文字から開始して、 null 終了文字列をウィンドウに追加します。 単一文字を追加する場合には、waddch サブルーチンを使用してください。 それ以外の場合には、waddstr サブルーチンを使用してください。 以下に示すのは、waddstr サブルーチン・ファミリーの一部です。
サブルーチン 説明
addstr マクロ 文字列を stdscr に追加します。
mvaddstr マクロ stdscr に文字列を追加する前に、 指定された位置に論理カーソルを移動します。
waddstr サブルーチン 文字列をユーザー定義ウィンドウに追加します。
wmvaddstr マクロ ユーザー定義ウィンドウに文字列を追加する前に、 指定された位置に論理カーソルを移動します。

winsch サブルーチン

winsch サブルーチンは、ウィンドウ内の現在の文字の前に指定された文字を挿入します。 挿入文字の右側のすべての文字は、1 スペース右側に移動します。 結果として、行上の右端の文字が脱落する可能性があります。 論理カーソルと物理カーソルの位置は、移動後も変更されません。 winsch サブルーチンには以下のものが含まれます。

サブルーチン 説明
insch マクロ stdscr に文字を挿入します。
mvinsch マクロ 文字を挿入する前に、stdscr の指定された位置に論理カーソルを移動します。
mvwinsch マクロ 文字を挿入する前に、ユーザー定義ウィンドウの指定された位置に論理カーソルを移動します。
winsch サブルーチン ユーザー定義ウィンドウに文字を挿入します。

winsertln サブルーチン

winsertln サブルーチンは、 ウィンドウ内の現在行の上にブランク行を挿入します。 insertln サブルーチンは stdscr に 1 行を挿入します。 ウィンドウのボトム行は脱落します。 winsertln サブルーチンは、ユーザー定義ウィンドウでも同じアクションを実行します。

wprintw サブルーチン

wprintw サブルーチンは、 一連の文字 (現在の文字から始まる) をフォーマット設定された出力で置換します。 フォーマットは printf コマンドの場合と同じです。 printw ファミリーは以下のものから構成されます。

サブルーチン 説明
mvprintw マクロ 文字を置換する前に、stdscr の指定された位置に論理カーソルを移動します。
mvwprintw マクロ 文字を置換する前に、 ユーザー定義ウィンドウの指定された位置に論理カーソルを移動します。
printw マクロ stdscr の一連の文字を置換します。
wprintw サブルーチン ユーザー定義ウィンドウの一連の文字を置換します。

wprintw サブルーチンは、waddch サブルーチンを呼び出して文字を置換します。

unctrl マクロ

unctrl マクロは、^X 表記で指定された制御文字の印刷可能な表現を戻します。 unctrl マクロは、印刷文字を現状のまま戻します。

テキスト・スクロールの使用可能化

スクロールを使用可能にするには、 以下のサブルーチンを使用します。
サブルーチン 説明
idlok curses が行の挿入/削除のハードウェア機構を使用できるようにします。
scrollok カーソルがウィンドウの最後の行の右端から先へ移動する場合に、 ウィンドウのスクロールを可能にします。
setscrreg または wsetscrreg ウィンドウ内のソフトウェア・スクロール領域を設定します。

プログラムまたはユーザーがカーソルをウィンドウのボトムの端より先に移動した場合に、 スクロールが発生します。 スクロールを発生させるには、 最初に scrollok サブルーチンを使用して、 ウィンドウのスクロールを使用可能にする必要があります。 ウィンドウがスクロールするのは、 スクロールが使用可能であり、かつ、以下のいずれかの条件が発生した場合です。

  • カーソルがウィンドウの端より先へ移動する場合。
  • 改行文字が最後の行で検出された場合。
  • 文字が最後の行の最後の位置に挿入された場合。

ウィンドウをスクロールするとき、curses はウィンドウとディスプレイの両方を更新します。 ただし、端末上で物理的なスクロール効果を得るには、Flag パラメーターを TRUE に設定して、idlok サブルーチンを呼び出す必要があります。

スクロールが使用不可の場合、カーソルは、 ボトム行上の文字が入力された位置に留まります。

ウィンドウのスクロールが使用可能な場合、setscrreg サブルーチンを使用して、 ウィンドウ内にソフトウェア・スクロール領域を作成することができます。 領域のトップ行とボトム行を示す値を setscrreg サブルーチンに渡します。 この領域に関して setscrreg が使用可能であり、 ウィンドウのスクロールが使用可能である場合、指定されたボトム行の先へ移動する試みによって、 領域内のすべての行が 1 行上へスクロールします。 setscrreg マクロを使用すれば、stdscr 内にスクロール領域を定義することができます。 あるいは、wsetscrreg サブルーチンを使用すれば、ユーザー定義ウィンドウ内にスクロール領域を定義することができます。

注: idlok サブルーチンと異なり、 setscrreg サブルーチンは、 端末に備わっている場合がある物理スクロール領域機能の使用とは無関係です。

文字の削除

テキストを削除するには、テキストをブランク・スペースで置換するか、 または文字を文字配列から除去し、その行上の残りの文字を 1 スペース左へ移動します。

werase サブルーチン

erase マクロは、ブランク・スペースを stdscr 内のすべての位置にコピーします。 werase サブルーチンはブランク・スペースをユーザー定義ウィンドウ内のすべての位置に置きます。 ウィンドウ内の単一文字を削除するには、wdelch サブルーチンを使用してください。

wclear サブルーチン

スクリーンをクリアするには、以下のサブルーチンを使用します。
サブルーチン 説明
clear または wclear スクリーンをクリアし、次のリフレッシュのためのクリア・フラグを設定します。
clearok refresh または wrefresh サブルーチンへの次のコールで curses がウィンドウをクリアするかどうかを決定します。

wclear サブルーチン は werase サブルーチンと似ています。 ただし、wclear サブルーチンは、 ウィンドウのすべての位置にブランク・スペースを置くだけでなく、wclearok サブルーチンも呼び出します。 結果として、画面は、次回の wrefresh サブルーチンの呼び出しでクリアされます。

wclear サブルーチン・ファミリーには、wclear サブルーチン、clear マクロ、および clearok サブルーチンが入っています。 clear マクロは stdscr 内のすべての位置にブランクを置きます。

wclrtoeol サブルーチン

clrtoeol マクロは stdscr 内で作動し、wclrtoeol サブルーチンは同じアクションをユーザー定義ウィンドウ内で実行します。

wclrtobot サブルーチン

clrtobot マクロは stdscr 内で作動し、 wclrtobot は同じアクションをユーザー定義ウィンドウ内で実行します。

wdelch サブルーチン

スクリーンから文字を削除するには、 以下のサブルーチンを使用します。
サブルーチン 説明
delch マクロ 現在の文字を stdscr から削除します。
mvdelch マクロ stdscr から文字を削除する前に論理カーソルを移動します。
mvwdelch マクロ ユーザー定義ウィンドウから文字を削除する前に論理カーソルを移動します。
wdelch サブルーチン ユーザー定義ウィンドウ内の現在の文字を削除します。

wdelch サブルーチンは現在の文字を削除し、現在行の現在の文字の右側にあるすべての文字を、 1 桁左に移動します。 行の最後の文字はブランクで埋められます。 delch サブルーチン・ファミリーは以下のサブルーチンとマクロから構成されます。

wdeleteln サブルーチン

deleteln サブルーチンは現在行を削除し、 現在行の下にあるすべての行を 1 行上に移動します。 このアクションによって、ウィンドウのボトム行はクリアされます。

文字の獲得

プログラムはキーボードまたはディスプレイから文字を取り出すことができます。 wgetch サブルーチンはキーボードから文字を取り出します。 winch サブルーチンはディスプレイから文字を取り出します。

wgetch サブルーチン

wgetch サブルーチンは、 ウィンドウに関連する端末に接続されているキーボードから文字を読み取ります。 ウィンドウ内の何かが変更されている場合、例えば、カーソルが移動されたか、 またはテキストが変更されている場合、文字を獲得する前に、 これらのサブルーチンは、wrefresh サブルーチンを呼び出します。

wgetch サブルーチン・ファミリーは以下のものから構成されます。

サブルーチン 説明
getch マクロ stdscr から文字を獲得します。
mvgetch マクロ stdscr から文字を獲得する前にカーソルを移動します。
mvwgetch マクロ ユーザー定義ウィンドウから文字を獲得する前にカーソルを移動します。
wgetch サブルーチン ユーザー定義ウィンドウから文字を獲得します。

wgetch サブルーチンへのコールによって以前に獲得した文字を入力キューに置くには、ungetch サブルーチンを使用します。 文字は、wgetch サブルーチンへの次のコールによって取り出されます。

端末のモード

wgetch サブルーチンの出力は、部分的には、 端末のモードによって決定されます。 以下のリストは、 端末モードのタイプ別に、wgetch サブルーチンのアクションを示しています。

サブルーチン 説明
DELAY モード システムがプログラムを介してテキストを渡すまで、読み取りを停止します。 CBREAK モードも設定した場合、プログラムは 1 文字の後に停止します。 CBREAK モードを設定しない場合 (NOCBREAK モード)、wgetch サブルーチンは、 最初の改行文字の後に読み取りを停止します。 ECHO を設定した場合、 文字のウィンドウへのエコーも行われます。
HALF-DELAY モード 文字が入力されるまで、または指定されたタイムアウトに到達するまで、 読み取りを停止します。 ECHO モードを設定した場合、 文字のウィンドウへのエコーも行われます。
NODELAY モード 入力待ちがない場合には ERR の値が戻されます。
注: サブルーチン getch、mvgetch、mvwgetch、または wgetch を使用する場合、NOCBREAK モードと ECHO モードの両方を同時に設定してはなりません。 両方のモードを設定すると、各文字の入力時に、tty ドライバーの状態によっては、 望ましくない結果が生じる可能性があります。

ファンクション・キー

ファンクション・キーが curses.h ファイルに定義されています。 キーパッドが使用可能であれば、wgetch サブルーチンによってファンクション・キーを戻すことができます。 端末によっては、ファンクション・キーのすべてはサポートしない場合があります。 端末が特定のキーをサポートするかどうかを調べるには、 その terminfo データベース定義を検査します。

ファンクション・キーの取得

プログラムが keypad サブルーチンを使用してキーボードを使用可能にし、 ユーザーがファンクション・キーを押すと、 そのファンクション・キーのトークンが元の文字の代わりに戻されます。 使用可能なファンクション・キーは、 /usr/include/curses.h ファイルで定義されています。 各定義ステートメントは、KEY_ 接頭部で始まり、 キーは値 03510 で始まる整数として定義されています。

ファンクション・キーの先頭である可能性がある文字 (エスケープ文字など) が受信されると、curses はタイマー (/usr/include/sys/time.h に定義されているタイプ timeval の構造体) を設定します。 タイマーが期限切れになる前に、シーケンスの残りの部分が受信されない場合、 その文字はパススルーされます。 それ以外の場合、ファンクション・キーの値が戻されます。 この理由のため、ユーザーが Esc キーを押した後に、 エスケープがプログラムに戻る前に遅延が生じます。 したがって、wgetch サブルーチンなどの単一文字サブルーチンを呼び出す場合、 できるだけ Esc キーの使用を回避します。 このタイマーは、ESCDELAY 環境変数を使用して、 指定変更または拡張することができます。

ESCDELAY 環境変数は、タイムアウトになって、ESC キー・ストロークを、 バッファー内の他の文字と結合してキー・シーケンスを作成するのではなく、 エスケープ文字として処理する前に待つ時間の長さを設定します。 ESCDELAY 値はミリ秒の 5 分の 1 単位で測定されます。 ESCDELAY 変数が 0 の場合、システムは、 バッファーからの情報を待たずに、エスケープ応答をすぐに組み立てます。 0 から 99,999 の任意の値を選択することができます。 ESCDELAY 変数のデフォルト設定値は 500 (1/10 秒) です。

wgetch サブルーチンがタイマーを設定するのを防ぐには、notimeout サブルーチンを呼び出します。 notimeout を TRUE に設定すると、curses はデータの取り出し時に、 ファンクション・キーと文字を区別しません。

keyname サブルーチン

keyname サブルーチンは、Key 引数のシンボル名を含んでいる文字列を指すポインターを戻します。 Key 引数として、wgetchgetchmvgetch、 または mvwgetch サブルーチンから戻される任意のキーを指定することができます。

winch サブルーチン

winch サブルーチンは現在位置の文字を取り出します。 その位置に属性が設定されている場合、 属性値と論理 OR された値が戻されます。 winch サブルーチンを使用すれば、文字だけ、またはその属性だけを抽出することができます。 このためには、定義済み定数 A_CHARTEXTA_ATTRIBUTES を論理 & (アンパーサンド) 演算子とともに使用します。 これらの定数は curses.h ファイルに定義されています。 winch サブルーチンを以下に示します。

サブルーチン 説明
inch マクロ stdscr から現在の文字を取得します。
mvinch マクロ stdscr 上で inch サブルーチンを呼び出す前に論理カーソルを移動します。
mvwinch マクロ ユーザー定義ウィンドウで winch サブルーチンを呼び出す前に論理カーソルを移動します。
winch サブルーチン ユーザー定義ウィンドウから現在の文字を取得します。

wscanw サブルーチン

wscanw サブルーチンは文字データを読み、変換仕様に従って解釈し、変換結果をメモリーに保管します。 wscanw サブルーチンは wgetstr サブルーチンを使用して、文字データを読みます。 wscanw サブルーチンを以下に示します。

サブルーチン 説明
mvscanw マクロ stdscr をスキャンする前に論理カーソルを移動します。
mvwscanw マクロ スキャンする前にユーザー定義ウィンドウ内の論理カーソルを移動します。
scanw マクロ stdscr をスキャンします。
wscanw サブルーチン ユーザー定義ウィンドウをスキャンします。