这是第一篇,由于平时比较忙,所以只能利用晚上的时间来译,今后还会有其他的相关译出来.
curses(S)
*********
____________________________________________________________________________
curses-CRT屏幕处理与优化包
语法
======
cc ... -lcurses
#include <curses.h>
描述
===========
curses库例程为用户提供了一个独立于终端的、对更新字符屏幕进行合理优化的方法,使用这些例程的程序必须使用-lcurses选项进行编译。
curses包允许:
o 全屏幕,窗口和光条操纵
o 输出到窗口和光条
o读取终端输入
o控制终端与光标的输入和输出选项
o环境查询例程
o色彩操纵
o使用软标签键
o终端信息的存取
o使用低级curses例程
在使用任何一个处理窗口与屏幕的例程之前,必须调用initscr或newterm对例程进行初始化。
在退出前必须调用endwin例程。大多数交互的,面向屏幕的程序需要无回显的单字符输入,要达到此目的,要按以下顺序进行:
cbreak();
noecho();
也有多数程序会按这个顺序:
nonl();
intrflush(stdscr,FALSE);
keypad(stdscr,TRUE);
在你运行一个curses()程序前,如果终端定义了tab键宽度,则必须对其进行设置并在初始化串中输出,你可以在shell环境变量TERM输出后用命令tput_init来设置。(参见terminfo(F)和terminfo(M)以获取详细信息)。
curses()库允许你操纵叫做窗口的数据结构,窗口可以看作是二维的字符数组。此例程库提供了一个默认的窗口stdscr,就是整个终端的大小。你可以用newwin()来创建其他的窗口。
窗口由声明为WINDOW *的变量来引用。这些数据结构的操纵由在cursesr 的帮助文件中描述的例程来进行(这些例程均以"curs_"开头)。其中最基本的例程是move()和addch()。库中包含了这些例程的更为通用的版本,可以让你指定一个窗口。
在例程完成对一个窗口的维护后,调用refresh()告诉curses()使用户的屏幕看上去更象stdscr.窗口中的字符实际上是chtype类型(包括字符和属性数据)以便将有关字符的其他信息与每个字符一同存贮.
叫做光条(pad)的窗口同样可以维护.他们也是一些窗口,但可能不与屏幕中的一个可视的区域相关联.参考cur_pad(S)可得到更多的信息.
除了在屏幕上显示字符以外,你也可使用视频属性和色彩,输出加下划线的字符,反显的图象,或在支持彩色模式的终端上显示彩色字符.你还可输出带有删除线的字符.(line-drawing是批带有删除线还是指用线条画出的字符?)对于输入,curses()也可将方向键和功能键的转义序列译为单独的键值.视频属性,划线字符和输入键名,在curses.h中定义,如A_REVERSE, ACS_HLINE, 和 KEY_LEFT.
curses()中也有操纵彩色数字字符终端上色彩显示的例程.使用时,要先调用start_color(),通常是在initscr()后马上调用.彩色通常成对使用,称为色彩对.一个色彩对有一个前景色(字符颜色)和一个背景色(字符在其上显示的区域的颜色).
你在使用时要用init_pair()例程对一个色彩对进行初始化.初始化后,就能象使用其他视频属性一样使用在curses.h中定义的一个宏COLOR_PAIR(n).如果终端可以重新定义彩色,那么以下的例程很有用处:
o has_color根据终端是否支持彩色返回TRUE或FALSE.
o can_change_color()根据用户是否可以改变颜色返回TRUE或FALSE.
o color_content( )向用户报告在一个初始化的颜色中红绿蓝的数量.
o pair_content( )向用户报告当前的特定彩色对是如何定义的.
o init_color( ) 改变一个彩色的定义.
如果设置了环境变量LINES和COLUMNS ,或者如果程序在一个窗口环境中运行,则环境中的行列信息会覆盖由terminfo()读取的信息.在窗口环境中运行的程序需要这么做是因为屏幕是可以改变的.
如果设置了环境变量TERMINFO,则所有使用curses()的程序在标准位置查找终端定义的信息前,都要先查找本地的终端定义信息.比如,如果TERM设为wyse150,则编译的终端定义位于:
html.awk: part.03: 1917: Trying to use .nf indisplay, haventstarted.
fi 1>&2 /usr/lib/terminfo/w/wyse150
(注:此处我有些看不懂,反复读了原文有N遍,怀疑是不是其manual_page页的问题,总之,如有问题,请指正,译者注)(w由wyse150的首字母拷贝而来,以免创建一个大目录),而如果TERMINFO设为$HOME/myterms,curses()首先查找$HOME/myterms/w/wyse150,如果失败,再查找/usr/lib/terminfo/w/wyse150 .这样做对于开发实验性的定义或者在/usr/lib/terminfo的写权限禁止时很有用.
整型变量LINES和COLS在curses.h中定义,而且由initscr()例程根据屏幕大小填写.常量TRUE值为1,FALSE值为0.
curses例程还定义了WINDOW *变量curscr,用在某些低级操作如清除或重写屏幕的操作中.但它只能在很少的几个例程中使用。
国际化功能
+++++++++++++++++++++++
对附加字符集,保存一个字符所需的字节数和列数是现场指定的.(LC_CTYPE类型)
你可以在字符种类表中指定它(指LC_CTYPE,译者注).使其在编辑时完全适于字符级操作.
但对于格式屏幕,在其上随意移动字符却并不太好.
覆盖字符的例程(如addch())工作于屏幕级别.用一个需要不同列数的字符覆盖另一个字符会导致产生奇数个数的列,这些列用背景字符填充.
插入字符的例程(如insch())工作于字符级别(即在字符的边界).一个新字符在当前字符的前面插入,无论光标当前指向字符的哪一列.在插入前,光标移动到字符的第一列.
删除字符的例程(如delch())同样工作于字符级别.光标当前指向的字符被删除,无论光标当前指向字符的哪一列.在删除前,光标移动到字符的第一列.
你不能把一个多列字符放到一行的最后一列上.如果你企图这样做,最后一列被设为背景字符.这样的操作也会产生由背景字符填充的奇数列.
在做了覆盖一个窗口的边缘的字符的操作后,会发生窗口的遮挡或覆盖.这果如果产生有奇数列,将与字符操作级别同样处理。
光标可放于窗口的任意位置.在插入或删除操作前,它先移动到一个多列字符的第一列.
例程与参数名称
++++++++++++++++++++++++++
许多curses()例程拥有两个或更多版本:
o前缀为p的例程需要一个pad参数.
o名字中有w的例程通常需要一个窗口参数或一个宽字符参数.如果w在一个例程名字中出现了两次,则该例程往往需要一个窗口参数和一个宽字符参数.
o不需要pad或window参数的例程一般使用stdscr.
o前缀为mv的需要一个(x,y)坐标以在操作前移动到该坐标处.这些mv例程在调用其他例程前隐含有一个对move()的调用,坐标y指(窗口的)行,x指列.左上角坐标是(0,0),而不是(1,1).
o前缀为mvw的例程接受一个窗口参数和一对(x,y)坐标,窗口参数总是出现在坐标之前.
在任何一种情形下,win是受影响的窗口,pad是受影响的光条,win和pad总是指向WINDOW类型的指针,设定选项的例程需要一个布尔型的标志bf,它有TRUE和FALSE两种状态;该标志总是布尔型的.变量ch和attrs总是chtype类型.类型WINDOW,SCREEN,bool和chtype在curses.h中定义.类型TERMINAL在term.h中定义.其他所有的参数都是整型.许多例程可以通过将其作为嵌入宏的方式的加入优化.在编译时要使用:
cc ... -DPERFORMANCE 来明确指定.
例程名索引
++++++++++++++++++
下面的表格列出了每个curses例程名字和手册中对其详细描述的页面名
-------------------------------------------
curses Routine Name Manual Page Name
-------------------------------------------
addch curs_addch(S)
addchnstr curs_addchstr(S)
addchstr curs_addchstr(S)
addnstr curs_addstr(S)
addnwstr curs_addwstr(S)
addstr curs_addstr(S)
addwch curs_addwch(S)
addwchnstr curs_addwchstr(S)
addwchstr curs_addwchstr(S)
addwstr curs_addwstr(S)
attroff curs_attr(S)
attron curs_attr(S)
attrset curs_attr(S)
baudrate curs_termattrs(S)
beep curs_beep(S)
bkgd curs_bkgd(S)
bkgdset curs_bkgd(S)
border curs_border(S)
box curs_border(S)
can_change_color curs_color(S)
cbreak curs_inopts(S)
clear curs_clear(S)
clearok curs_outopts(S)
clrtobot curs_clear(S)
clrtoeol curs_clear(S)
color_content curs_color(S)
copywin curs_overlay(S)
curs_set curs_kernel(S)
def_prog_mode curs_kernel(S)
def_shell_mode curs_kernel(S)
del_curterm curs_terminfo(S)
delay_output curs_util(S)
delch curs_delch(S)
deleteln curs_deleteln(S)
delscreen curs_initscr(S)
delwin curs_window(S)
derwin curs_window(S)
doupdate curs_refresh(S)
draino curs_util(S)
dupwin curs_window(S)
echo curs_inopts(S)
echochar curs_addch(S)
echowchar curs_addwch(S)
endwin curs_initscr(S)
erase curs_clear(S)
erasechar curs_termattrs(S)
filter curs_util(S)
flash curs_beep(S)
flushinp curs_util(S)
getbegyx curs_getyx(S)
getch curs_getch(S)
getmaxyx curs_getyx(S)
getnwstr curs_getwstr(S)
getparyx curs_getyx(S)
getstr curs_getstr(S)
getsyx curs_kernel(S)
getwch curs_getwch(S)
getwin curs_util(S)
getwstr curs_getwstr(S)
getyx curs_getyx(S)
halfdelay curs_inopts(S)
has_colors curs_color(S)
has_ic curs_termattrs(S)
has_il curs_termattrs(S)
hline curs_border(S)
idcok curs_outopts(S)
idlok curs_outopts(S)
immedok curs_outopts(S)
inch curs_inch(S)
inchnstr curs_inchstr(S)
inchstr curs_inchstr(S)
init_color curs_color(S)
init_pair curs_color(S)
initscr curs_initscr(S)
innstr curs_instr(S)
innwstr curs_inwstr(S)
insch curs_insch(S)
insdelln curs_deleteln(S)
insertln curs_deleteln(S)
insnstr curs_insstr(S)
insnwstr curs_inswstr(S)
insstr curs_insstr(S)
instr curs_instr(S)
inswch curs_inswch(S)
inswstr curs_inswstr(S)
intrflush curs_inopts(S)
inwch curs_inwch(S)
inwchnstr curs_inwchstr(S)
inwchstr curs_inwchstr(S)
inwstr curs_inwstr(S)
is_linetouched curs_touch(S)
is_wintouched curs_touch(S)
isendwin curs_initscr(S)
keyname curs_util(S)
keypad curs_inopts(S)
killchar curs_termattrs(S)
leaveok curs_outopts(S)
longname curs_termattrs(S)
meta curs_inopts(S)
move curs_move(S)
mvaddch curs_addch(S)
mvaddchnstr curs_addchstr(S)
mvaddchstr curs_addchstr(S)
mvaddnstr curs_addstr(S)
mvaddnwstr curs_addwstr(S)
mvaddstr curs_addstr(S)
mvaddwch curs_addwch(S)
mvaddwchnstr curs_addwchstr(S)
mvaddwchstr curs_addwchstr(S)
mvaddwstr curs_addwstr(S)
mvcur curs_terminfo(S)
mvdelch curs_delch(S)
mvderwin curs_window(S)
mvgetch curs_getch(S)
mvgetnwstr curs_getwstr(S)
mvgetstr curs_getstr(S)
mvgetwch curs_getwch(S)
mvgetwstr curs_getwstr(S)
mvinch curs_inch(S)
mvinchnstr curs_inchstr(S)
mvinchstr curs_inchstr(S)
mvinnstr curs_instr(S)
mvinnwstr curs_inwstr(S)
mvinsch curs_insch(S)
mvinsnstr curs_insstr(S)
mvinsnwstr curs_inswstr(S)
mvinsstr curs_insstr(S)
mvinstr curs_instr(S)
mvinswch curs_inswch(S)
mvinswstr curs_inswstr(S)
mvinwch curs_inwch(S)
mvinwchnstr curs_inwchstr(S)
mvinwchstr curs_inwchstr(S)
mvinwstr curs_inwstr(S)
mvprintw curs_printw(S)
mvscanw curs_scanw(S)
mvwaddch curs_addch(S)
mvwaddchnstr curs_addchstr(S)
mvwaddchstr curs_addchstr(S)
mvwaddnstr curs_addstr(S)
mvwaddnwstr curs_addwstr(S)
mvwaddstr curs_addstr(S)
mvwaddwch curs_addwch(S)
mvwaddwchnstr curs_addwchstr(S)
mvwaddwchstr curs_addwchstr(S)
mvwaddwstr curs_addwstr(S)
mvwdelch curs_delch(S)
mvwgetch curs_getch(S)
mvwgetnwstr curs_getwstr(S)
mvwgetstr curs_getstr(S)
mvwgetwch curs_getwch(S)
mvwgetwstr curs_getwstr(S)
mvwin curs_window(S)
mvwinch curs_inch(S)
mvwinchnstr curs_inchstr(S)
mvwinchstr curs_inchstr(S)
mvwinnstr curs_instr(S)
mvwinnwstr curs_inwstr(S)
mvwinsch curs_insch(S)
mvwinsnstr curs_insstr(S)
mvwinsstr curs_insstr(S)
mvwinstr curs_instr(S)
mvwinswch curs_inswch(S)
mvwinswstr curs_inswstr(S)
mvwinwch curs_inwch(S)
mvwinwchnstr curs_inwchstr(S)
mvwinwchstr curs_inwchstr(S)
mvwinwstr curs_inwstr(S)
mvwprintw curs_printw(S)
mvwscanw curs_scanw(S)
napms curs_kernel(S)
newpad curs_pad(S)
newterm curs_initscr(S)
newwin curs_window(S)
nl curs_outopts(S)
nocbreak curs_inopts(S)
nodelay curs_inopts(S)
noecho curs_inopts(S)
nonl curs_outopts(S)
noqiflush curs_inopts(S)
noraw curs_inopts(S)
notimeout curs_inopts(S)
overlay curs_overlay(S)
overwrite curs_overlay(S)
pair_content curs_color(S)
pechochar curs_pad(S)
pechowchar curs_pad(S)
pnoutrefresh curs_pad(S)
p