NCURSES Programming HOWTO
- NCURSES Programming HOWTO つまみぐい+α
NCURSES Programming HOWTO つまみぐい+α
2. Hello World!!!
- '''initscr()''':端末を初期化(一部の実装では画面をクリア)する。cursesライブラリを使う際には必ず最初に呼ぶこと。
- '''refresh()''':画面を更新する。printw()などで行った画面の変更はrefresh()を呼んだ時に始めて実際の画面に反映される。^J背景にある考え方としては、プログラマが画面上の複数の箇所を変更してから画面を更新するというやり方を可能にするため。
- '''endwin()''':最後にendwin()を呼ばないと、プログラムの終了後に端末の振る舞いがおかしくなるかもしれない。
4. 初期化
- '''raw()'''と'''cbreak()''':通常、端末のドライバではユーザーが復帰・改行を入力するまでバッファされるが、多くのプログラムではユーザーがキーを押した瞬間に得られたほうが都合が良い。こうした要求を満たすため、raw()とcbreak()は行単位でのバッファリングを無効にする。^J両者の違いは制御文字(Ctrl-CとかCtrl-Z)の扱いで、raw()モードではそれらの制御文字は直接プログラムに渡されるのに対し、cbreak()モードでは、端末のドライバによって解釈される(シグナルが発生する)。
- '''echo()'''と'''noecho()''':エコー(入力された文字の画面表示)を制御する。noecho()を呼ぶとエコーがオフになる。
- '''keypad()''':F1,F2,矢印キーのようなファンクションキーの読み取りを可能にする。
- '''halfdelay()''':タイムアウト付きのcbreak()モード(?)。n ×10秒入力が無ければエラーを返す。
4.7 Example
入力されたキーを表示する。
- '''attron()''', '''attroff()''':文字飾りの制御
- '''KEY_F(n)''':ファンクションキーをあらわすマクロ
- include <ncurses.h>
int main()
{ int ch;
initscr(); /* Start curses mode */
raw(); /* Line buffering disabled */
keypad(stdscr, TRUE); /* We get F1, F2 etc.. */
noecho(); /* Don't echo() while we do getch */
printw("Type any character to see it in bold\n");
ch = getch(); /* If raw() hadn't been called
* we have to press enter before it
* gets to the program */
if(ch == KEY_F(1)) /* Without keypad enabled this will */
printw("F1 Key pressed"); /* not get to us either */
/* Without noecho() some ugly escape
* charachters might have been printed
* on screen */
else
{ printw("The pressed key is ");
attron(A_BOLD);
printw("%c", ch);
attroff(A_BOLD);
}
refresh(); /* Print it on to the real screen */
getch(); /* Wait for user input */
endwin(); /* End curses mode */
return 0;
}
5. Windowについて
Windowっていう概念があります。初期化したときにはstdscrっていう名前のデフォルトWindowが作られて、簡単な作業ならこの1枚のWindowを使えば十分です。cursesではWindowを複数作って特定のWindowに対して操作を行うことができます。その場合、頭に'w'がついた関数を使いましょう。例えば、
printw("Hi There !!!"); refresh();
という処理は、こんな風になります。
wprintw(win, "Hi There !!!"); wrefresh(win);
通常、'w'なしの関数はWindowとしてstdscrを指定した'w'付きの関数のマクロになってます。
6. 出力関数
画面出力用に3種類の関数があります。
- '''addch()''' 類:1文字出力(属性付き)
- '''printw()''' 類:printf()のような書式つき出力
- '''addstr()''' 類:文字列の出力
'''addch()''' 類の関数群
addch()系での属性(文字飾り?)の指定には2つの方法がある。
- 文字と希望する属性マクロのORをとる:'''ncurses.h'''に記述されている属性マクロを使ってaddch()を次のような感じで呼ぶ。
addch(ch | A_BOLD | A_UNDERLINE); - 属性指定関数を使う:'''attrset()''','''attron()''','''attroff()'''のような関数を使う。後述。
さらに、cursesは文字ベースのグラフィック用の特殊な文字を提供していて、テーブルや水平・垂直線などを描くこともできます。それらの特殊文字については、ncurses.hの中のACS_で始まるマクロを探してください(以下、そのマクロ)。
/* VT100 symbols begin here */
- define ACS_ULCORNER NCURSES_ACS('l') /* upper left corner */
- define ACS_LLCORNER NCURSES_ACS('m') /* lower left corner */
- define ACS_URCORNER NCURSES_ACS('k') /* upper right corner */
- define ACS_LRCORNER NCURSES_ACS('j') /* lower right corner */
- define ACS_LTEE NCURSES_ACS('t') /* tee pointing right */
- define ACS_RTEE NCURSES_ACS('u') /* tee pointing left */
- define ACS_BTEE NCURSES_ACS('v') /* tee pointing up */
- define ACS_TTEE NCURSES_ACS('w') /* tee pointing down */
- define ACS_HLINE NCURSES_ACS('q') /* horizontal line */
- define ACS_VLINE NCURSES_ACS('x') /* vertical line */
- define ACS_PLUS NCURSES_ACS('n') /* large plus or crossover */
- define ACS_S1 NCURSES_ACS('o') /* scan line 1 */
- define ACS_S9 NCURSES_ACS('s') /* scan line 9 */
- define ACS_DIAMOND NCURSES_ACS('`') /* diamond */
- define ACS_CKBOARD NCURSES_ACS('a') /* checker board (stipple) */
- define ACS_DEGREE NCURSES_ACS('f') /* degree symbol */
- define ACS_PLMINUS NCURSES_ACS('g') /* plus/minus */
- define ACS_BULLET NCURSES_ACS('~') /* bullet */
/* Teletype 5410v1 symbols begin here */
- define ACS_LARROW NCURSES_ACS(',') /* arrow pointing left */
- define ACS_RARROW NCURSES_ACS('+') /* arrow pointing right */
- define ACS_DARROW NCURSES_ACS('.') /* arrow pointing down */
- define ACS_UARROW NCURSES_ACS('-') /* arrow pointing up */
- define ACS_BOARD NCURSES_ACS('h') /* board of squares */
- define ACS_LANTERN NCURSES_ACS('i') /* lantern symbol */
- define ACS_BLOCK NCURSES_ACS('0') /* solid square block */
/*
* These aren't documented, but a lot of System Vs have them anyway
* (you can spot pprryyzz{{||}}Hiki::PluginException (not plugin method): inline plugin
in a lot of AT&T terminfo strings).
* The ACS_names may not match AT&T's, our source didn't know them.
*/
- define ACS_S3 NCURSES_ACS('p') /* scan line 3 */
- define ACS_S7 NCURSES_ACS('r') /* scan line 7 */
- define ACS_LEQUAL NCURSES_ACS('y') /* less/equal */
- define ACS_GEQUAL NCURSES_ACS('z') /* greater/equal */
- define ACS_PI NCURSES_ACS('{') /* Pi */
- define ACS_NEQUAL NCURSES_ACS('|') /* not equal */
- define ACS_STERLING NCURSES_ACS('}') /* UK pound sign */
/*
* Line drawing ACS names are of the form ACS_trbl, where t is the top, r
* is the right, b is the bottom, and l is the left. t, r, b, and l might
* be B (blank), S (single), D (double), or T (thick). The subset defined
* here only uses B and S.
*/
- define ACS_BSSB ACS_ULCORNER
- define ACS_SSBB ACS_LLCORNER
- define ACS_BBSS ACS_URCORNER
- define ACS_SBBS ACS_LRCORNER
- define ACS_SBSS ACS_RTEE
- define ACS_SSSB ACS_LTEE
- define ACS_SSBS ACS_BTEE
- define ACS_BSSS ACS_TTEE
- define ACS_BSBS ACS_HLINE
- define ACS_SBSB ACS_VLINE
- define ACS_SSSS ACS_PLUS
- '''mvaddch()''':与えられた位置にカーソルを移動して文字を出力する。
つまり、
move(row,col); /* moves the cursor to rowth row and colth column */
addch(ch);
と言う処理は、以下のように書ける
mvaddch(row,col,ch);
- '''waddch()'''と'''mvwaddch()''':'w'付きのaddch()とmvaddch()
'''printw()''' 類の関数群
- '''printw()'''と'''wprintw()''':printf()と一緒
- '''mvprintw()'''と'''mvwprintw()''':move()付きのprintw()
- '''vwprintw()''':vprintf()のように、個数不定の引数を受け取って表示する。
printw() 類のサンプルプログラム
- include <ncurses.h> /* ncurses.h includes stdio.h */
- include <string.h>
int main()
{
char mesg[]="Just a string"; /* message to be appeared on the screen */
int row,col; /* to store the number of rows and *
* the number of colums of the screen */
initscr(); /* start the curses mode */
getmaxyx(stdscr,row,col); /* get the number of rows and columns */
mvprintw(row/2,(col-strlen(mesg))/2,"%s",mesg);
/* print the message at the center of the screen */
mvprintw(row-2,0,"This screen has %d rows and %d columns\n",row,col);
printw("Try resizing your window(if possible) and then run this program again");
refresh();
getch();
endwin();
return 0;
}
- '''getmaxyx(win,row,col)''':指定されたWindowの列数と行数を得るマクロ
'''addstr()''' 類の関数群
addstr()は文字列をWindowに表示するための関数で、文字列について、一文字ずつaddch()を呼ぶのと同じです。他の類の関数群と同様、'''addstr()''', '''waddstr()''', '''mvaddstr()''', '''mvwaddstr()'''の4つの関数があります。
さらにこの類にはaddnstr(str, n);という整数'n'を引数にとり、表示する文字数を最大n文字に制限する関数群、'''addnstr()''', '''waddnstr()''', '''mvaddnstr()''', '''mvwaddnstr()'''もあります。
7. 入力関数
ユーザーからの入力用にも3種類の関数があります。
- '''getch()''' 類:1文字入力
- '''scanw()''' 類:書式つき入力
- '''getstr()''' 類:文字列の入力
'''getch()'''類の関数
端末から1文字読み込むための関数ですが、注意点として、使う前に'''cbreak()'''をあらかじめ呼んでおかないと、ユーザーがリターンキー(かEOF)を入力するまで待ちに入ってしまいます。もうひとつ、良く組み合わせて使われる関数は、ユーザーの入力した文字の画面表示を無効にする'''noecho()'''です。
'''scanw()'''類の関数
- '''scanw()'''と'''mvscanw()''':読み取るべき行が'''getstr()'''(後述)によって与えられる場合、この関数の使い方はsscanf()に似ています。
- '''wscanw()'''と'''mvwscanw()''':'w'付きのscanw()とmvscanw()
- '''vwscanw()''':vscanf()のような関数
'''getstr()'''類の関数
端末から文字列を取得する場合に使う関数群です。
'''getstr()''', '''wgetstr()''', '''mvgetstr()''', '''mvwgetstr()'''とかはバッファオーバーフローの危険性があるので使ってはいけない。
'''getnstr()''', '''wgetnstr()''', '''mvgetnstr()''', '''mvwgetnstr()'''は、最大n文字までしか読み込まない(ことにより、オーバーフローを防ぐ)関数群。n文字以上の入力しようとするとbeepが発生して無視される(curs_getstr(3X))。
- include <ncurses.h> /* ncurses.h includes stdio.h */
- include <string.h>
int main()
{
char mesg[]="Enter a string: "; /* message to be appeared on the screen */
char str[80];
int row,col; /* to store the number of rows and *
* the number of colums of the screen */
initscr(); /* start the curses mode */
getmaxyx(stdscr,row,col); /* get the number of rows and columns */
mvprintw(row/2,(col-strlen(mesg))/2,"%s",mesg);
/* print the message at the center of the screen */
getnstr(str, 80);
mvprintw(LINES - 2, 0, "You Entered: %s", str);
getch();
endwin();
return 0;
}
8. 属性
- '''attron()''':現在の属性に加えて指定された属性をオンにする
- '''attroff()''':現在の属性から指定された属性をオフにする
- '''attrset()''':指定された属性をセットする
A_NORMAL | 通常の表示 (強調表示なし) |
A_STANDOUT | ターミナルの最良の強調表示モード |
A_UNDERLINE | 下線 |
A_REVERSE | 反転 |
A_BLINK | 点滅 |
A_DIM | 半分の明るさ |
A_BOLD | 特別な明るさまたは太字 |
A_PROTECT | 保護されたモード |
A_INVIS | 不可視または空白モード |
A_ALTCHARSET | 代替キャラクタセット |
A_CHARTEXT | 文字を取り出すためのビットマスク |
COLOR_PAIR(n) | 色のペアの番号 n |
これらの属性は以下のように'''OR(|)'''で組み合わせることができる
attron(A_REVERSE | A_BLINK);
- '''attr_get()''':デフォルトWindowの現在の属性と色のペアを取得する、特定のWindowの属性を取得する場合は'''wattr_get()'''を使う
- '''chgat(n, attr, color, *opts)''':現在のカーソル位置から指定されたn文字の属性と色を変更する
- include <ncurses.h>
int main(int argc, char *argv[])
{
initscr(); /* Start curses mode */
start_color(); /* Start color functionality */
init_pair(1, COLOR_RED, COLOR_BLACK);
printw("A Big string which i didn't care to type fully ");
refresh();
getch();
mvchgat(0, 0, -1, A_BLINK | A_BOLD, 1, NULL);
/*
* First two parameters specify the position at which to start
* Third parameter number of characters to update. .1 means till
* end of line
* Forth parameter is the normal attribute you wanted to give
* to the charcter
* Fifth is the color index. It is the index given during init_pair()
* use 0 if you didn't want color
* Sixth one is always NULL
*/
refresh();
getch();
endwin(); /* End curses mode */
return 0;
}
9. Window
- '''WINDOW *newwin(height, width, y, x)''':座標(x,y)に高さheight、幅widthの新しいWindowを作成する
- ''''w'付き関数群''':特定のWindowを操作する
- '''delwin()''':Windowを破棄する
- '''border(ls, rs, ts, bs, tl, tr, bl, br)''':枠線を引く。引数は順に左線、右線、上線、下線、左上角、右上角、左下角、右下角の文字で、0を指定するとデフォルトの枠線文字を使う。'''wborder()'''でWindow指定も可。
- '''box(win, vch, hch)''':winに対して縦線 vch、横線 hch で枠線を引く。なぜかこの関数は''''w'付き命名規則を無視'''している。
- '''hline(ch, n)''':現在のカーソル位置から文字 ch を使って n 個の横線を引く。'''whline()'''でWindow指定。
- '''vline(ch, n)''':現在のカーソル位置から文字 ch を使って n 個の縦線を引く。'''wvline()'''でWindow指定。
- '''mvhline(y, x, ch, n)''':座標(x,y)から文字 ch を使って n 個の横線を引く。'''mvwhline()'''でWindow指定。
- '''mvvline(y, x, ch, n)''':座標(x,y)から文字 ch を使って n 個の縦線を引く。'''mvwvline()'''でWindow指定。
- '''COLS'''と'''LINES''':initscr()を呼び出すと、画面のサイズがセットされる変数
10. 色
COLOR_BLACK | 0 |
COLOR_RED | 1 |
COLOR_GREEN | 2 |
COLOR_YELLOW | 3 |
COLOR_BLUE | 4 |
COLOR_MAGENTA | 5 |
COLOR_CYAN | 6 |
COLOR_WHITE | 7 |
- '''has_colors()''':色が使えるかどうか調べる
- '''start_color()''':色を使うとき、はじめに呼び出す
- '''init_color(col, r, g, b)''':上の表の色をRGB指定で変更する、r, g, bの指定範囲は0 - 1000
- '''init_pair(n, f, b)''':色ペアの定義。n番の色ペアを文字色 f、背景色 bとする。
- '''COLOR_PAIR(n)''':色ペア n を属性として指定するためのマクロ
- '''color_content(col, &r, &g, &b)''':指定された色の内容を取得する。
- '''pair_content(num, &f, &b)''':指定された色ペアの内容を取得する。
11. キーボード入力
'''getch()'''で入力されたキーを取得し、処理する。
int ch;
ch = getch();
if (ch == KEY_LEFT) { /* 左矢印キー */
}
12. マウス入力
13. 画面の取り扱い
座標の取得
- '''getyx(win, y, x)''':指定されたWindowの現在のカーソル位置を取得する'''マクロ'''(なので、アドレスを渡す必要は無い)
- '''getparyx(win, y, x)''':指定されたWindowが子Windowの場合、その子Windowの親Windowからの相対座標を取得するマクロ。子Windowで無い場合はy,xに-1がセットされる。
- '''getbegyx(win, y, x)''':指定されたWindowの始点の座標を取得するマクロ。
- '''getmaxyx(win, y, x)''':指定されたWindowのサイズを取得するマクロ。
画面のダンプ
- '''scr_dump(const char *filename)''':画面のダンプを指定されたファイルに保存する
- '''scr_restore(const char *filename)''':指定されたファイルを読み込み画面を復元する
Windowのダンプ
- '''putwin(win, FILE *fp)''':fpが指すファイルにWindowに関する情報を保存する
- '''WINDOW *getwin(FILE *fp)''':fpからWindow情報を取得する
14. その他の機能
- '''curs_set(n)''':カーソルの表示状態を切り替える。nは0,1,または2^J0: 非表示^J1: 表示^J2: はっきり表示
一時的にcursesモードを抜ける
'''def_prog_mode()'''を呼び出して現在の端末のモードを保存し、'''endwin()'''を呼ぶとcursesモードを一時的に抜けることができる。一度抜けたcursesモードに戻るには、'''reset_prog_mode()'''を呼び出し、'''refresh();'''で画面を再描画する。
- include <ncurses.h>
int main()
{
initscr(); /* Start curses mode */
printw("Hello World !!!\n"); /* Print Hello World */
refresh(); /* Print it on to the real screen */
def_prog_mode(); /* Save the tty modes */
endwin(); /* End curses mode temporarily */
system("/bin/sh"); /* Do whatever you like in cooked mode */
reset_prog_mode(); /* Return to the previous tty mode*/
/* stored by def_prog_mode() */
refresh(); /* Do refresh() to restore the */
/* Screen contents */
printw("Another String\n"); /* Back to curses use the full */
refresh(); /* capabilities of curses */
endwin(); /* End curses mode */
return 0; }
16. Panel ライブラリ
ncursesはWindowの重なりの処理は行わないので、Panelライブラリを使う。
基本的な流れ
- Panelに貼り付けるWindowを'''newwin()'''を使って作成する。
- '''new_panel(win)'''でPanelを作成し、好みの順序で重ねていく
- '''update_panels()'''で仮想画面上にパネルを描画し、'''doupdate()'''で実際の画面に表示する
- '''show_panel()''', '''hide_panel()''', '''move_panel()'''などを使ってPanelを操作する
- 不要になったら'''del_panel()'''でPanelを破棄する
17. Menu ライブラリ
メニューを作成するための拡張。
基本的な流れ
- cursesを初期化する
- '''new_item()'''を使って新しいアイテムを作成する。アイテムの名前と解説を指定できる。
- '''new_menu()'''を関連付けるアイテムと共に呼び出して、メニューを作成する。
- '''menu_post()'''でメニューを貼り付け、画面をrefreshする。
- ユーザーの入力をループを使って処理し、'''menu_driver()'''を使ってメニューを更新する。
- '''menu_unpost()'''を使ってメニューの掲示をやめる。
- '''free_menu()'''でメニューに割り当てられたメモリ領域を開放する。
- '''free_item()'''でアイテムに割り当てられたメモリ領域を開放する。
- cursesを終了する。
menu_driver()
'''menu_driver()'''関数は以下の形式で呼び出す。
int menu_driver(MENU *menu, int c);
'''c'''には、次のリクエストを指定する。
REQ_LEFT_ITEM | 左のアイテムに移動する |
REQ_RIGHT_ITEM | 右のアイテムに移動する |
REQ_UP_ITEM | 上のアイテムに移動する |
REQ_DOWN_ITEM | 下のアイテムに移動する |
REQ_SCR_ULINE | 上に1行スクロールする |
REQ_SCR_DLINE | 下に1行スクロールする |
REQ_SCR_DPAGE | 下に1ページスクロールする |
REQ_SCR_UPAGE | 上に1ページスクロールする |
REQ_FIRST_ITEM | 最初のアイテムに移動する |
REQ_LAST_ITEM | 最後のアイテムに移動する |
REQ_NEXT_ITEM | 次のアイテムに移動する |
REQ_PREV_ITEM | 前のアイテムに移動する |
REQ_TOGGLE_ITEM | アイテムの選択/非選択を切り替える |
表示可能なASCII文字 | パターンバッファにその文字を加え、一致する次のアイテムに移動する。^J一致するアイテムが無い場合E_NO_MATCHを返す。 |
REQ_CLEAR_PATTERN | パターンバッファをクリアする |
REQ_BACK_PATTERN | 直前の文字をパターンバッファから削除する |
REQ_NEXT_MATCH | パターンバッファに一致する次のアイテムに移動する |
REQ_PREV_MATCH | パターンバッファに一致する前のアイテムに移動する |
set_menu_format()
int set_menu_format(MENU *menu, int rows, int cols); メニューの体裁を最大rows行cols段にする。第1引数にヌルポインタを渡すと、デフォルトの値を設定する。
set_menu_opts()
メニューのオプションを指定する。
int set_menu_opts(MENU *menu, OPTIONS opts);
optsには以下の値を指定する。ORを使って複数を同時に指定することも可能。
O_ONEVALUE | 1個のアイテムしか選択できないようにする |
O_SHOWDESC | アイテムの解説も表示する |
O_ROWMAJOR | アイテムを横方向にまず並べる |
O_IGNORECASE | パターンマッチングで大文字小文字を区別しない |
O_SHOWMATCH | パターンマッチング中にカーソルをアイテムの名前に移動する |
O_NONCYCLIC | 次(前)のアイテムの選択を循環させない |
選択したアイテムの取得
- O_ONEVALUEがonの時:'''ITEM *current_item(menu)'''を呼び出して戻ってきたアイテム
- O_ONEVALUEがoffの時:
items = menu_items(menu);
for(i=0;i<item_count(menu);++i)
if(item_value(items[i]) == TRUE) { ... }
アイテムのオプション
- int '''set_item_opts('''ITEM *item, OPTIONS opts''')''';:指定されたアイテムのオプションをセット
- int '''item_opts_on('''ITEM *item, OPTIONS opts''')''';:指定されたアイテムにオプションを追加
- int '''item_opts_off('''ITEM *item, OPTIONS opts''')''';:指定されたアイテムからオプションを削除
- OPTIONS '''item_opts('''const ITEM *item''')''';:指定されたアイテムの現在のオプション値を取得
指定可能なオプションは'''O_SELECTABLE'''のみ
O_SELECTABLE | offにすると選択不可になる |
メニューに関連する属性
- '''set_menu_fore(menu, attr)''':メニュー内の選択されたアイテムの属性を指定する。初期値は'''A_STANDOUT'''
- '''set_menu_back(menu, attr)''':メニュー内の非選択状態のアイテムの属性を指定する。初期値は'''A_NORMAL'''
- '''set_menu_gray(menu, attr)''':メニュー内の選択不可能なアイテムの属性を指定する。初期値は'''A_UNDERLINE'''
18. Form ライブラリ
フォームを作成する拡張。
基本的な流れ
- cursesを初期化する
- '''new_field()'''を使って入力欄を作成する。ここで高さや幅、フォームの座標を指定できる
- '''new_form()'''を関連付ける入力欄を指定して呼び出し、フォームを作成する。
- '''form_post()'''でフォームを貼り付け、画面を更新する。
- ループを使ってユーザーの入力を処理し、'''form_driver()'''を使ってフォームを更新する。
- '''form_unpost()'''を使ってフォームの掲示をやめる。
- '''free_form()'''を使ってフォームに割り当てられたメモリ領域を開放する
- '''free_field()'''を使って入力欄に割り当てられたメモリ領域を開放する
- cursesを終了する
入力欄とフォームの作成
- FIELD *'''new_field('''int h, int w, int y, int x, int offscreen, int nbuffers''');''':座標(x,y)に高さ h、幅 w の入力欄を作成する。offscreenは、指定された行数分の隠れたバッファを準備し、スクロールを使った入力を可能とする。つまり、h = 2, w = 10, offscreen = 3 とした場合、10 * (2 + 3) = 50 文字(?)の入力が可能となる。nbuffersは、入力欄と同じサイズのバッファを指定された個数準備する。ようだが手元の環境では大きな値を指定するとfree_field()が以下のようなあやしい警告を出すので、非常に危険な匂いがする。
a.out in free(): warning: junk pointer, too high to make sense
a.out in free(): warning: chunk is already free - FORM *'''new_form('''FIELD **fields''');''':new_field()を使って作成された入力欄へのポインタの配列を受け取り、フォームを作成する。
入力欄の型の指定と検証
デフォルトでは入力欄は任意の入力を受け取るが、'''set_field_type()'''関数を使って入力値の型を宣言すると、入力値のチェックができるようになる。
- int '''set_field_type('''FIELD *field, FIELDTYPE *type, ...''');''':fieldは型を宣言する入力欄へのポインタ。typeは入力欄の型。型によって第3引数以下が必要になる。
- ''TYPE_ALNUM'':英数字。第3引数に最小の文字数を指定する。
- ''TYPE_ALPHA'':英字。第3引数に最小の文字数を指定する。
- ''TYPE_ENUM'':指定された文字列のセット。第3引数には(char ** 型の)受け付ける文字列のリストを指定する。4番目のint型のフラグは大文字小文字を区別するかどうかを指定する。5番目のフラグでは、入力の部分マッチがユニークであるべきかどうかを指定する(このフラグがオフなら複数の要素が前方一致検索によってマッチする)。文字列のリストはコピーされないので、'''自動変数を使ってはならない'''。
- ''TYPE_INTEGER'':atoi(3)でパーズ可能な整数。第3引数には精度(printfでの".#ld"相当)、4,5引数には最小値と最大値を指定する。最大値が最小値以下なら範囲指定は無視される。
- ''TYPE_NUMERIC'':(小数部付きの)数字。第3引数には精度(printfでの".#f"相当)、4,5引数にはdouble型の最小値と最大値を指定する。最大値が最小値以下なら範囲指定は無視される。
- ''TYPE_REGEXP'':正規表現。第3引数には(char *型の)正規表現を指定する。正規表現についてはregcomp(3X)およびregexec(3X)を参照。注意点として、正規表現は入力全体とマッチしなければならない。
- ''TYPE_IPV4'':IPv4アドレス。引数は不要。
入力欄の表示関連とオプション
- int '''move_field('''FIELD *field, int y, int x''');''':入力欄(which must be disconnected)の移動。
- int '''set_field_just('''FIELD *field, int justmode''');''':行端ぞろえの指定。justmodeには次のいずれかの値を渡す、''NO_JUSTIFICATION'', ''JUSTIFY_RIGHT'', ''JUSTIFY_LEFT'', ''JUSTIFY_CENTER''
- int '''set_field_fore('''FIELD * field, chtype attr''');''':入力欄の前景(文字)の属性を指定する。
- chtype '''field_fore('''FIELD *field''');''':入力欄の前景の属性を取得する。
- int '''set_field_back('''FIELD *field, chtype attr''');''':入力欄の背景の属性を指定する。
- chtype '''field_back('''FIELD *field''');''':入力欄の背景の属性を取得する。
- '''set_field_pad('''FIELD *field, int pad''');''':入力欄の穴埋め(未入力部分の)文字を指定する。
- int '''field_pad('''FIELD *field''');''':入力欄の穴埋め文字を取得する。
- int '''set_field_opts('''FIELD *field, OPTIONS opts''');''':入力欄のオプションをセットする。指定可能なオプションは下表参照。
- int '''field_opts_on('''FIELD *field, OPTIONS opts''');''':入力欄に指定されたオプションを追加する。指定可能なオプションは下表参照。
- int '''field_opts_off('''FIELD *field, OPTIONS opts''');''':入力欄から指定されたオプションを取り除く。指定可能なオプションは下表参照。
O_VISIBLE | 入力欄を表示する。オフの場合、表示が抑制される。 |
O_ACTIVE | 入力欄を変更可能にする。オフの場合、移動キー操作でこの入力欄にはいけなくなる。 |
O_PUBLIC | 入力されたデータをそのまま表示する。オフにすると表示されなくなるのでパスワード入力欄等で利用する。 |
O_EDIT | 入力欄を編集可能にする。 |
O_WRAP | ワードラップ機能。オフにすると単語の境界に関係なく行末で折り返す。 |
O_BLANK | 入力欄の先頭で文字が入力されるとまず全体をクリアする。 |
O_AUTOSKIP | 入力欄が全部埋まった時に次の欄に移動する。 |
O_NULLOK | 空白を許す。 |
O_STATIC | 入力欄のバッファサイズを初期サイズに固定する。オフにすると動的に割り当てる。 |
O_PASSOK | 評価を常に行うか、入力欄が修正されたときにのみ行うか。 |
フォームのオプション
操作
入力された値の取得
その他
- コメント:
Keyword(s):
References: