curses
ライブラリには,文字端末用のユーザ・インタフェースを開発するための関数が含まれています。
この章では,curses
ライブラリ関数の拡張機能について説明します。
これらの拡張機能により,マルチバイト文字を収納できるワイド文字フォーマットが使用できるようになります。
ワイド文字や複合文字フォーマットのマルチバイト文字の処理には,X/Open Curses CAE Specifications Version 4.2 に準拠する関数を使用してください。 これらの関数は,System V 国際化機能 (MNLS: Multi-National Language Supplement) に規定されている関数に代わるものです。
この章では,画面上の,またはキーボードから入力した文字や文字列を処理する
curses
関数とマクロの概要について説明します。
各節の表では,同じ処理を実行できる
curses
インタフェースが複数あるかどうかと,国際化ソフトウェアの作成に最も適した推奨
curses
インタフェースを明記します。
つまり,この表では,ワイド文字や複合文字フォーマットを扱い,X/Open Curses CAE 仕様に準拠している
curses
ライブラリ関数やマクロに重点を置きます。
アプリケーションでは,表中の「推奨ルーチン」欄にリストされている
curses
インタフェースを使用してください。
各インタフェースの構文と詳細については,セクション 3 のリファレンス・ページを参照してください。
この章は,実行したい操作に必要なインタフェースを見つけるためにご利用ください。
その後,man
コマンドを使用して,必要なインタフェースのリファレンス・ページを表示してください。
curses
ライブラリに含まれる関数の概要については,
curses
(3)
注意
一部の
curses
ルーチンは,curses
ウィンドウ上に表示されている文字を上書きします。 文字を完全に上書きできるルーチンは,wchar_t
またはcchar_t
型のデータを使用するルーチンだけです。 マルチバイト文字のように,上書きされる文字の表示幅が 1 カラムより大きいときは,これらのインタフェースは文字の残った部分を消去するために,空白文字を書き込みます。 たとえば,2 カラム幅の中国語文字の 1 カラム目を英字のa
で上書きした場合,中国語文字の 2 カラム目は,空白文字で上書きされます。国際化されていない
curses
ルーチンでマルチバイト文字を上書きしたときの動作は未定義です。
以下の項では,curses
ウィンドウ上にワイド文字を追加したり,挿入するルーチンを説明します。
ターゲットとなる場所に既に文字が存在する場合,これらのルーチンは次のいずれかの操作を行います。
既存の文字を上書きしカーソルを次に進める。
既存の文字の前に新しい文字を挿入し,カーソルは進めない。
4.1.1 ワイド文字を追加 (上書き) し,カーソルを進める
表 4-1 のルーチンは,画面上のウィンドウにワイド文字とその属性を追加し,カーソルを進めます。 文字がすでにターゲット位置に存在するときは,その文字は追加する文字で上書きされます。
ルーチンを選択する条件は,次のとおりです。
省略時のウィンドウと指定したウィンドウのどちらに文字を追加するか。
現在の座標と指定した座標のどちらに文字を追加するか。
画面を再表示するかどうか。
これらのルーチンにワイド文字とその属性を渡すには,const cchar_t
データ型を使用します。
表 4-1: ワイド文字を追加し,カーソルを進める curses ルーチン
推奨ルーチン | 代替ルーチン | 動作 |
add_wch |
addch ,addwch |
ウィンドウ: 省略時 位置: 現在 画面の再表示: しない |
wadd_wch |
waddch ,waddwch |
ウィンドウ: 指定 位置: 現在 画面の再表示: しない |
mvadd_wch |
mvaddch ,mvaddwch |
ウィンドウ: 省略時 位置: 指定 画面の再表示: しない |
mvwadd_wch |
mvwaddch ,mvwaddwch |
ウィンドウ: 指定 位置: 指定 画面の再表示: しない |
echo_wchar |
echowchar |
ウィンドウ: 省略時 位置: 現在 画面の再表示: する |
wecho_wchar |
wechowchar |
ウィンドウ: 指定 位置: 現在 画面の再表示: する |
4.1.2 ワイド文字を (上書きせずに) 挿入し,カーソルを進めない
表 4-2のルーチンは,現在の座標または指定した座標でワイド文字列をウィンドウに挿入し,書き込み操作後にカーソル位置を変更しません。 ワイド文字は,ターゲット位置にある既存の文字の前に挿入されます。 このため,これらのルーチンは,行内にすでにある文字は上書きしません。 ターゲット位置とその右側にある既存の文字は右方向に移動され,右端の文字は切り捨てられます。 このカテゴリのインタフェースを選択する条件は,次のとおりです。
省略時のウィンドウと指定したウィンドウのどちらに書き込むか。
現在の座標と指定した座標のどちらに書き込むか。
表 4-2: ワイド文字を挿入し,カーソルを進めない curses ルーチン
推奨ルーチン | 代替ルーチン | 動作 |
ins_wch |
insch ,inswch |
ウィンドウ: 省略時 位置: 現在 |
wins_wch |
winsch ,winswch |
ウィンドウ: 指定 位置: 現在 |
mvins_wch |
mvinsch ,mvinswch |
ウィンドウ: 省略時 位置: 指定 |
mvwins_wch |
mvwinsch ,mvwinswch |
ウィンドウ: 指定 位置: 指定 |
以下の項では,curses
ウィンドウに文字列を追加したり,挿入するルーチンについて説明します。
4.2.1 ワイド文字列を追加 (上書き) し,カーソルを進めない
表 4-3のルーチンは,ワイド文字列とその文字属性をウィンドウに追加します。 ただしこれらのルーチンには,次の特徴があります。
カーソルの位置を進めない。
通常はカーソル位置に影響を与える特殊文字 (改行,タブ,後退など) が文字列に含まれているかどうかを検査しない。
文字列を次の行に折り返えさずに切り捨てる。
これらのルーチンでは,ターゲット位置にすでに存在している文字は,追加する文字列の文字で上書きされます。 このカテゴリのインタフェースを選択する条件は,次のとおりです。
文字列中のすべての文字を書き込むか,それとも一部の文字だけを書き込むか。
省略時のウィンドウと指定したウィンドウのどちらに文字を書き込むか。
現在の座標と指定した座標のどちらに文字を書き込むか。
表 4-3: ワイド文字列を追加しカーソルを進めない curses ルーチン
推奨ルーチン | 代替ルーチン | 動作 |
add_wchstr |
addwchstr |
文字数: すべて ウィンドウ: 省略時 位置: 現在 |
add_wchnstr |
addwchnstr |
文字数: 指定 ウィンドウ: 省略時 位置: 現在 |
wadd_wchstr |
waddwchstr |
文字数: すべて ウィンドウ: 指定 位置: 現在 |
wadd_wchnstr |
waddwchnstr |
文字数: 指定 ウィンドウ: 指定 位置: 現在 |
mvadd_wchstr |
mvaddwchstr |
文字数: すべて ウィンドウ: 省略時 位置: 指定 |
mvadd_wchnstr |
mvaddwchnstr |
文字数: 指定 ウィンドウ: 省略時 位置: 指定 |
mvwadd_wchstr |
mvwaddwchstr |
文字数: すべて ウィンドウ: 指定 位置: 指定 |
mvwadd_wchnstr |
mvwaddwchnstr |
文字数: 指定 ウィンドウ: 指定 位置: 指定 |
4.2.2 ワイド文字列を追加 (上書き) し,カーソルを進める
4.2.1 項で説明したルーチンと同じように,表 4-4 のルーチンもワイド文字列 (ビデオ文字属性は除く) をウィンドウに追加し,既存の文字を上書きします。 ただし,これらのルーチンは,次の処理も実行します。
カーソル位置を進める。
文字位置に影響を与える特殊文字 (改行,タブ,後退など) が文字列に含まれているかどうかを検査する。
文字列を切り捨てずに,次の行に折り返す。
このカテゴリのインタフェースを選択する条件は,次のとおりです。
文字列中のすべての文字を書き込むか,それとも一部の文字だけを書き込むか。
省略時のウィンドウと指定したウィンドウのどちらに文字を書き込むか。
現在の座標と指定した座標のどちらに文字を書き込むか。
表 4-4: ワイド文字列を追加しカーソルを進める curses ルーチン
推奨ルーチン | 代替ルーチン | 動作 |
addwstr |
addstr |
文字数: すべて ウィンドウ: 省略時 位置: 現在 |
addnwstr |
代替ルーチンなし | 文字数: 指定 ウィンドウ: 省略時 位置: 現在 |
waddwstr |
waddstr |
文字数: すべて ウィンドウ: 指定 位置: 現在 |
waddnwstr |
代替ルーチンなし | 文字数: 指定 ウィンドウ: 指定 位置: 現在 |
mvaddwstr |
mvaddstr |
文字数: すべて ウィンドウ: 省略時 位置: 指定 |
mvaddnwstr |
代替ルーチンなし | 文字数: 指定 ウィンドウ: 省略時 位置: 指定 |
mvwaddwstr |
mvwaddstr |
文字数: すべて ウィンドウ: 指定 位置: 指定 |
mvwaddnwstr |
代替ルーチンなし | 文字数: 指定 ウィンドウ: 指定 位置: 指定 |
4.2.3 ワイド文字列を (上書きせずに) 挿入し,カーソルを進めない
表 4-5
で説明するルーチンは,curses
ウィンドウ内のターゲット位置の直前に,ワイド文字列を挿入します。
これらのルーチンには,次の特徴があります。
ターゲット位置とその右側にある既存の文字を,さらに右方向に移動する。
既存の文字は上書きされませんが,行の終わりで右端の文字が切り捨てられることがあります。
文字位置とカーソル位置に影響を与える特殊文字 (改行,タブ,後退など) が文字列に含まれているかどうかを検査する。
書き込み操作後にカーソルを進めない。
このカテゴリのインタフェースを選択する条件は,次のとおりです。
文字列中のすべての文字を書き込むか,それとも一部の文字だけを書き込むか。
省略時のウィンドウと指定したウィンドウのどちらに文字を書き込むか。
現在の座標と指定した座標のどちらに文字を書き込むか。
表 4-5: ワイド文字列を挿入しカーソルを進めない curses ルーチン
推奨ルーチン | 代替ルーチン | 動作 |
ins_wstr |
inswstr |
文字数: すべて ウィンドウ: 省略時 位置: 現在 |
ins_nwstr |
insnwstr |
文字数: 指定 ウィンドウ: 省略時 位置: 現在 |
wins_wstr |
winswstr |
文字数: すべて ウィンドウ: 指定 位置: 現在 |
wins_nwstr |
winsnwstr |
文字数: 指定 ウィンドウ: 指定 位置: 現在 |
mvins_wstr |
mvinswstr |
文字数: すべて ウィンドウ: 省略時 位置: 指定 |
mvins_nwstr |
mvinsnwstr |
文字数: 指定 ウィンドウ: 省略時 位置: 指定 |
mvwins_wstr |
mvwinswstr |
文字数: すべて ウィンドウ: 指定 位置: 指定 |
mvwins_nwstr |
mvwinsnwstr |
文字数: 指定 ウィンドウ: 指定 位置: 指定 |
表 4-6
のルーチンは,curses
ウィンドウ内のターゲット位置にあるワイド文字を削除します。
その行の,削除された文字以降の文字は,1 文字分左にシフトされます。
これらのルーチンは,マルチバイト文字がサポートされる前から
curses
ライブラリに含まれており,ワイド文字フォーマットを正しく処理できるように再定義されています。
このカテゴリのインタフェースを選択する条件は,次のとおりです。
省略時のウィンドウと指定したウィンドウのどちらの文字を削除するか。
現在の座標と指定した座標のどちらの文字を削除するか。
表 4-6: ワイド文字列を削除する curses ルーチン
推奨ルーチン | 代替ルーチン | 動作 |
delch |
代替ルーチンなし | ウィンドウ: 省略時 位置: 現在 |
wdelch |
代替ルーチンなし | ウィンドウ: 指定 位置: 現在 |
mvdelch |
代替ルーチンなし | ウィンドウ: 省略時 位置: 指定 |
mvwdelch |
代替ルーチンなし | ウィンドウ: 指定 位置: 指定 |
表 4-7
のルーチンは,curses
ウィンドウからワイド文字とそのビデオ属性を読み取ります。
プログラムに返されるデータは
cchar_t
型なので,ワイド文字と属性の両方が格納されます。
このカテゴリのインタフェースを選択する条件は,次のとおりです。
省略時のウィンドウと指定したウィンドウのどちらから文字を読み取るか。
現在の座標と指定した座標のどちらから文字を読み取るか。
表 4-7: ウィンドウからワイド文字を読み取る curses ルーチン
推奨ルーチン | 代替ルーチン | 動作 |
in_wch |
inch ,inwch |
ウィンドウ: 省略時 位置: 現在 |
win_wch |
winch ,winwch |
ウィンドウ: 指定 位置: 現在 |
mvin_wch |
mvinch ,mvinwch |
ウィンドウ: 省略時 位置: 指定 |
mvwin_wch |
mvwinch ,mvwinwch |
ウィンドウ: 指定 位置: 指定 |
4.5 curses ウィンドウからのワイド文字列の読み取り
curses
ウィンドウからワイド文字列を読み取るルーチンには,2 つのセットがあります。
4.5.1 項
の一連のルーチンは,ビデオ属性付きのワイド文字の文字列を読み取ります。
4.5.2 項
の一連のルーチンは,ワイド文字の文字列を,属性を取り除いて読み取ります。
4.5.1 属性付きのワイド文字列の読み取り
表 4-8
のルーチンは,curses
ウィンドウからワイド文字列とその文字属性を読み取ります。
推奨ルーチンから返される文字列は,cchar_t
データ型です。
このカテゴリのインタフェースを選択する条件は,次のとおりです。
文字列中のすべてのワイド文字を読み取るか,それとも指定した数のワイド文字を読み取るか。
省略時のウィンドウと指定したウィンドウのどちらから文字を読み取るか。
現在の座標と指定した座標のどちらから文字を読み取るか。
表 4-8: ワイド文字列とその属性を読み取る curses ルーチン
推奨ルーチン | 代替ルーチン | 動作 |
in_wchstr |
inwchstr |
文字数: すべて ウィンドウ: 省略時 位置: 現在 |
in_wchnstr |
inwchnstr |
文字数: 指定 ウィンドウ: 省略時 位置: 現在 |
win_wchstr |
winwchstr |
文字数: すべて ウィンドウ: 指定 位置: 現在 |
win_wchnstr |
winwchnstr |
文字数: 指定 ウィンドウ: 指定 位置: 現在 |
mvin_wchstr |
mvinwchstr |
文字数: すべて ウィンドウ: 省略時 位置: 指定 |
mvin_wchnstr |
mvinwchnstr |
文字数: 指定 ウィンドウ: 省略時 位置: 指定 |
mvwin_wchstr |
mvwinwchstr |
文字数: すべて ウィンドウ: 指定 位置: 指定 |
mvwin_wchnstr |
mvwinwchnstr |
文字数: 指定 ウィンドウ: 指定 位置: 指定 |
表 4-9
のルーチンは,curses
ウィンドウからワイド文字列を読み取り,wchar_t
データ型の文字列をプログラムの変数に格納します。
ビデオ属性は,文字列に格納される文字から取り除かれます。
このカテゴリのインタフェースを選択する条件は,次のとおりです。
文字列中のすべてのワイド文字を読み取るか,それとも指定した数のワイド文字を読み取るか。
省略時のウィンドウと指定したウィンドウのどちらから文字を読み取るか。
ウィンドウ内の現在の座標と指定した座標のどちらから文字を読み取るか。
表 4-9: 属性なしでワイド文字列を読み取る curses ルーチン
推奨ルーチン | 代替ルーチン | 動作 |
inwstr |
代替ルーチンなし | 文字数: すべて ウィンドウ: 省略時 位置: 現在 |
innwstr |
代替ルーチンなし | 文字数: 指定 ウィンドウ: 省略時 位置: 現在 |
winwstr |
代替ルーチンなし | 文字数: すべて ウィンドウ: 指定 位置: 現在 |
winnwstr |
代替ルーチンなし | 文字数: 指定 ウィンドウ: 指定 位置: 現在 |
mvinwstr |
代替ルーチンなし | 文字数: すべて ウィンドウ: 省略時 位置: 指定 |
mvinnwstr |
代替ルーチンなし | 文字数: 指定 ウィンドウ: 省略時 位置: 指定 |
mvwinwstr |
代替ルーチンなし | 文字数: すべて ウィンドウ: 指定 位置: 指定 |
mvwinnwstr |
代替ルーチンなし | 文字数: 指定 ウィンドウ: 指定 位置: 指定 |
表 4-10
のルーチンは,curses
ウィンドウに対応する端末から文字列を読み取り,プログラムのバッファに格納します。
このカテゴリのインタフェースを選択する条件は,次のとおりです。
文字列中のすべてのワイド文字を読み取るか,それとも指定した数のワイド文字を読み取るか。
読み取った文字を,省略時のウィンドウと指定したウィンドウのどちらで使用するか。
読み取った文字を,ウィンドウ内の現在の座標と指定した座標のどちらで使用するか。
表 4-10: ワイド文字列を端末から読み取るcursesルーチン
推奨ルーチン | 代替ルーチン | 動作 |
get_wstr |
getstr ,getwstr |
文字数: すべて ウィンドウ: 省略時 位置: 現在 |
getn_wstr |
getnwstr |
文字数: 指定 ウィンドウ: 省略時 位置: 現在 |
wget_wstr |
wgetstr ,wgetwstr |
文字数: すべて ウィンドウ: 指定 位置: 現在 |
wgetn_wstr |
wgetnwstr |
文字数: 指定 ウィンドウ: 指定 位置: 現在 |
mvget_wstr |
mvgetstr ,mvgetwstr |
文字数: すべて ウィンドウ: 省略時 位置: 指定 |
mvgetn_wstr |
mvgetnwstr |
文字数: 指定 ウィンドウ: 省略時 位置: 指定 |
mvwget_wstr |
mvwgetstr ,mvwgetwstr |
文字数: すべて ウィンドウ: 指定 位置: 指定 |
mvwgetn_wstr |
mvwgetnwstr |
文字数: 指定 ウィンドウ: 指定 位置: 指定 |
4.7 キーボードからのワイド文字の読み取りまたはキューイング
表 4-11
のルーチンは,curses
ウィンドウに対応する端末のキーボードからシングルバイト文字またはマルチバイト文字を読み取り,その文字をワイド文字フォーマットに変換して,プログラムに返します。
curses
の入力モードが
noecho
に設定されていない場合,これらのルーチンは,すべての文字を画面上に表示します。
unget_wch
インタフェースはワイド文字を入力キューの先頭に置きます。
この場合,次の
wget_wch
呼び出しにより,入力キューの文字がプログラムに返されます。
このカテゴリのインタフェースを選択する条件は,次のとおりです。
読み込んだ文字を,省略時のウィンドウと指定したウィンドウのどちらで使用するか。
読み込んだ文字を,ウィンドウ内の現在の位置と指定した位置のどちらで使用するか。
ただちに使用するか,それとも後で使用するか。
表 4-11: ワイド文字列をキーボードから読み取る curses ルーチン
推奨ルーチン | 代替ルーチン | 動作 |
get_wch |
getch ,getwch |
ウィンドウ: 省略時 位置: 現在 |
wget_wch |
wgetch ,wgetwch |
ウィンドウ: 指定 位置: 現在 |
mvget_wch |
mvgetch ,mvgetwch |
ウィンドウ: 省略時 位置: 指定 |
mvwget_wch |
mvwgetch ,mvwgetwch |
ウィンドウ: 指定 位置: 指定 |
unget_wch |
ungetch ,ungetwch |
ウィンドウ: 適用外 位置: 適用外 入力キュー: 文字をキュー付け |
表 4-12
のルーチンは,curses
ウィンドウからワイド文字を読み取って変換します。
これらの関数は,curses
ライブラリが国際化される前から
curses
ライブラリに含まれており,ワイド文字データを扱えるように拡張されています。
これらの関数はすべて,wgetstr
を呼び出してウィンドウからワイド文字列を読み取った後,scanf()
関数の規則に従って文字を解釈して変換します。
詳細については,
scanf
(3)
このカテゴリのインタフェースを選択する条件は,次のとおりです。
省略時のウィンドウと指定したウィンドウのどちらの文字列を変換するか。
現在の座標と指定した座標のどちらの文字列を変換するか。
呼び出しの引数の 1 つとして,変数リストを含める必要があるかどうか。
表 4-12: ウィンドウ内の書式付きテキストを変換する curses ルーチン
推奨ルーチン | 代替ルーチン | 動作 |
scanw |
代替ルーチンなし | ウィンドウ: 省略時 位置: 現在 引数の数: 固定 |
wscanw |
代替ルーチンなし | ウィンドウ: 指定 位置: 現在 引数の数: 固定 |
mvscanw |
代替ルーチンなし | ウィンドウ: 省略時 位置: 指定 引数の数: 固定 |
mvwscanw |
代替ルーチンなし | ウィンドウ: 指定 位置: 指定 引数の数: 固定 |
vw_scanw |
vwscanw |
ウィンドウ: 指定 位置: 現在 引数の数: 可変 |
表 4-13
のルーチンは文字列を書式付けして,curses
ウィンドウに表示します。
これらの関数は
curses
ライブラリが国際化される前から
curses
ライブラリに含まれており,ワイド文字フォーマットのデータを扱えるように再定義されています。
これらの関数は,printf()
(または
vprintf()
) と同様な形式で文字列を書式付けし,addstr()
(または
waddstr()
) と同様な形式で文字列を書き込みます。
書式付けについては,
printf
(3)
このカテゴリのインタフェースを選択する条件は,次のとおりです。
省略時のウィンドウと指定したウィンドウのどちらに表示するか。
現在の位置と指定した位置のどちらに表示するか。
呼び出しの引数の 1 つとして,変数リストを含める必要があるかどうか。
表 4-13: ウィンドウに書式付きテキストを表示する curses ルーチン
推奨ルーチン | 代替ルーチン | 動作 |
printw |
代替ルーチンなし | ウィンドウ: 省略時 位置: 現在 引数の数: 固定 |
wprintw |
代替ルーチンなし | ウィンドウ: 指定 位置: 現在 引数の数: 固定 |
mvprintw |
代替ルーチンなし | ウィンドウ: 省略時 位置: 指定 引数の数: 固定 |
mvwprintw |
代替ルーチンなし | ウィンドウ: 指定 位置: 指定 引数の数: 固定 |
vw_printw |
vwprintw |
ウィンドウ: 指定 位置: 現在 引数の数: 可変 |