我们现在知道要初始化 curses 系统,必须调用函数 initscr()。在初始化之后,可以调用一些函数来自定义我们的 curses 会话。我们可以要求 curses 系统将终端设置为原始模式,或者初始化颜色,或者初始化鼠标等等。让我们讨论一些通常在 initscr() 之后立即调用的函数;
通常,终端驱动程序会缓冲用户输入的字符,直到遇到换行符或回车符。但是大多数程序要求字符在用户输入后立即可用。以上两个函数用于禁用行缓冲。这两个函数之间的区别在于控制字符(如挂起 (CTRL-Z)、中断和退出 (CTRL-C))传递给程序的方式。在 raw() 模式下,这些字符直接传递给程序,而不会生成信号。在cbreak()模式下,这些控制字符被终端驱动程序解释为任何其他字符。我个人更喜欢使用 raw(),因为我可以对用户的行为进行更大的控制。
这些函数控制是否将用户输入的字符回显到终端。noecho()关闭回显。您可能想要这样做,是为了获得对回显的更多控制,或者在使用 getch() 等函数从用户获取输入时,抑制不必要的回显。大多数交互式程序在noecho()初始化时调用它,并以受控方式进行字符的回显。这使程序员可以灵活地在窗口中的任何位置回显字符,而无需更新当前 (y,x) 坐标。
这是我最喜欢的初始化函数。它启用了对功能键(如 F1、F2、箭头键等)的读取。几乎每个交互式程序都启用此功能,因为箭头键是任何用户界面的主要组成部分。执行keypad(stdscr, TRUE)为常规屏幕 (stdscr) 启用此功能。您将在本文档的后续章节中了解有关按键管理的更多信息。
这个函数虽然不常用,但在某些时候很有用。调用 halfdelay() 可以启用半延迟模式,这类似于 cbreak() 模式,因为输入的字符可以立即供程序使用。但是,它会等待 'X' 十分之一秒以获取输入,如果在这段时间内没有输入,则返回 ERR。'X' 是传递给函数 halfdelay() 的超时值。当您想向用户请求输入,如果用户在一定时间内没有响应,我们可以做其他事情时,此函数很有用。一个可能的例子是密码提示符处的超时。
让我们编写一个程序,它将阐明这些函数的用法。
示例 2. 初始化函数用法示例
#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;
} |
这个程序是不言自明的。但我使用了一些尚未解释的函数。函数getch()用于从用户获取字符。它相当于普通的getchar()除了我们可以禁用行缓冲以避免输入后的 <回车>。在 键管理章节 中查找更多关于getch()和读取按键的信息。函数 attron 和 attroff 用于分别打开和关闭某些属性。在示例中,我使用它们以粗体打印字符。这些函数将在后面详细解释。