Curses 库

curses 库提供一组功能使您能操作终端显示器而无需考虑终端类型。 curses 库支持颜色。 然而不支持多字节字符。 对 curses 文档中字符的所有引用都是指单字节字符。

在整个文档中,curses 库被称为 curses

curses 编程的基础是窗口数据结构。 可使用此结构在终端显示器上处理数据。 可指示 curses 将整个终端显示器当作一个大窗口对待,或者可在显示器上创建多个窗口。 这些窗口的大小可以不同,并且可以彼此重叠。 典型的 curses 应用程序具有一个单个的大窗口,并且在此大窗口中有一个子窗口。

终端显示器上的每个窗口都有它自己的窗口数据结构。 此结构保留有关窗口的状态信息,比如其大小以及驻留在显示器上的位置。 curses 使用该窗口数据结构获取执行指令所需的相关信息。

术语

使用 curses 编程时,应该熟悉以下术语:

术语 定义
当前字符 逻辑光标当前位于的字符。
当前行 逻辑光标当前位于的行。
curscr curses 提供的虚拟缺省窗口。 curscr(当前屏幕)为当前出现在终端外部显示器上内容的内部表示。 不要修改 curscr。
显示 连接到工作站的物理显示器。
逻辑光标 每个窗口中的光标位置。 窗口数据结构跟踪其逻辑光标的位置。
填充 (pad) pad 是不受屏幕大小限制的窗口
物理光标 出现在显示器上的光标。 工作站使用该光标写到显示器。 每个显示器只有一个物理光标。
屏幕 充满整个显示器的窗口。 显示器与 stdscr 同义。
标准错误 由表示整个显示器的 curses 提供的虚拟缺省窗口(标准屏幕)。
窗口 C 数据结构的指针以及显示器上该数据结构的图形表示。 窗口可被认为是随时表示整个显示器或显示器的一部分显示情况的二维数组。

命名约定

单个 curses 子例程可以有多个版本。 多版本 curses 子例程遵循独特的命名约定,这些命名约定可标识各个版本。 这些约定向标准 curses 子例程添加一个前缀,并标识子例程所需的参数或在调用子例程时执行的操作。 不同版本的 curses 子例程名称使用以下前缀:

prefix 描述
w 标识需要窗口参数的子例程
p 标识需要 pad 参数的子例程
mv 标识首先执行移动到程序提供的坐标的子例程

如果某一个 curses 子例程有多个版本且不含有上述前缀之一,那么使用 curses 缺省窗口 stdscr(标准屏幕)。 大部分使用 stdscr 的子例程均为使用 #define 语句在 /usr/include/curses.h 文件中创建的宏。 预处理器在编译时替换这些语句。 因此,这些宏在已编译的汇编程序代码、跟踪、调试程序或 curses 源代码中不出现。

如果某一个 curses 子例程只有一个版本,那么它不必使用 stdscr。 例如:printw 子例程将字符串显示到 stdscr。 wprintw 子例程通过提供 window 参数将字符串显示到特定窗口。 mvprintw 子例程将指定坐标移动到 stdscr,然后执行与 printw 子例程相同的函数。 同样,mvwprintw 子例程将指定坐标移动到指定窗口,然后执行与 wprintw 子例程相同的函数。

curses 程序的结构

通常,curses 程序的进度如下:

  1. 启动 curses。
  2. 检查颜色支持(可选)。
  3. 启动颜色(可选)。
  4. 创建一个或多个窗口。
  5. 操作窗口。
  6. 破坏一个或多个窗口。
  7. 停止 curses。

某些步骤是可选的,因此程序不必完全遵循此进度。

返回值

除了少数例外,所有 curses 子例程均能返回整数值 ERR 或整数值 OK。 对不遵照此约定的子例程进行了相应的说明。 返回指针的子例程总是返回空指针或错误。