使用curses管理基于文本的屏幕--(三)

键盘

除了提供一个简单的接口用来管理屏幕以外,curses同时提供了一个更为简单的方法用来控制键盘。

键盘模式

键盘的读取例程是由模式来控制的。用来设置模式的函数为:

#include <curses.h>
int echo(void);
int noecho(void);
int cbreak(void);
int nocbreak(void);
int raw(void);
int noraw(void);

两个回显函数只是用来简单的打开或是关闭输入字符的回显。其余的四个函数调用控制在终端输入的字符如何可以为curses程序所用。

为了解释cbreak,我们需要理解默认的输入模式。当一个curses程序通过initscr调用开始进,输入模式被设置为cooked模式。这就意味着所有的处理是一行一行完成的;也就是说,只有在用户在输入Enter之后输入才可用。键盘特殊字符也是允许的,所以输入合适的按键序列可以在程序中生成一个信号。如果终端是由一个终端运行的,那么流控制也是允许的。通过调用cbreak,一个程序可以将输入模式设置为cbreak模式,此时字符在输入以后立即就可以为程序所用,而不是进行缓冲,直到输入Enter时也会为程序所用。如同在cooked模式中一样,键盘特殊字符也是允许的,但只是简单的按键,例如Backspace,会直接传递给程序进行处理,所以如果我们希望Backspace的功能如同我们所希望的,我们需要自己对其进行编程。

raw调用会关闭特殊字符处理,所以他可以使得通过输入特殊字符序列来产生信号或是流控制变得不可能。调用nocbreak可以将输入模式设置回cooked模式,但是特殊字符处理会保持不变;调用noraw可以重新设置cooked模式与特殊字符处理。

键盘输入

读取键盘是非常简单的。函数如下:

#include <curses.h>
int getch(void);
int getstr(char *string);
int getnstr(char *string, int number_of_characters);
int scanw(char *format, ...);

其行为动作类似于非curses程序的getchar,gets,scanf。注意,getstr并没有提供限制返回的字符串长度的办法,所以我们使用这个函数时一定要小心。如果我们的curses版本支持getnstr,这个函数会允许我们限制读取的字符数,我们应使用这个函数,而不是getnstr。这与我们在第三章所看到的gets与fgets函数相类似。

下面是一个简短的例子程序,ipmode.c,来向我们显示如何处理键盘。

试验--键盘模式与输入

1 首先,我们设置程序并且初始化curses调用。

#include <unistd.h>
#include <stdlib.h>
#include <curses.h>
#include <string.h>
#define PW_LEN 25
#define NAME_LEN 256
int main() {
    char name[NAME_LEN];
    char password[PW_LEN];
    char *real_password = “xyzzy”;
    int i = 0;
    initscr();
    move(5, 10);
    printw(“%s”, “Please login:”);
    move(7, 10);
    printw(“%s”, “User name: “);
    getstr(name);
    move(9, 10);
    printw(“%s”, “Password: “);
    refresh();

2 当用户输入他的密码后,我们需要阻止密码回显到屏幕。然后我们将密码与xyzzy进行比对。

cbreak();
noecho();
memset(password, ‘/0’, sizeof(password));
while (i < PW_LEN) {
    password[i] = getch();
    move(9, 20 + i);
    addch(‘*’);
    refresh();
    if (password[i] == ‘/n’) break;
    if (strcmp(password, real_password) == 0) break;
    i++;
}

3 最后我们重新打开键盘回显,并且输出成功还是失败。

echo();
nocbreak();
move(11, 10);
if (strcmp(password, real_password) == 0) printw(“%s”, “Correct”);
  else printw(“%s”, “Wrong”);
  refresh();
  endwin();
  exit(EXIT_SUCCESS);
}

工作原理

阻止了键盘输入的回显并且将输入模式设置为cbreak,我们为密码准备了一块内存区域。所输入密码的每一个字符都会立即进行处理,并且会在屏幕的下一个位置显示一个*。我们需要每次刷新屏幕。然后我们使用strcmp函数来比较这两个字符串,输入与实际的字符。

posted @ 2008-10-21 23:02  jlins  阅读(206)  评论(0编辑  收藏  举报