第一章:NCURSES库简介
1、介绍
在过去使用电传终端的那些日子,终端和中央电脑分开放置,并通过串行电缆连接。每个终端的配置是通过发送一系列字节完成的。
所有的终端功能(例如:改变光标的位置,清除屏幕某一区域的内容,卷动屏幕,切换显示模式,添加下划线,改变字符的外观、颜色、亮度等等)都是通过一系列叫做转义序列(escape sequence)的连续字节实现的。被叫作转义序列是因为这些连续字节都是以一个“0x1B”字符开头,即转义字符(按下ESC键输入的字符)作为开头字符的字符串。现在,通过合适的终端仿真,我们也可以向终端仿真程序发送转义序列,并且在终端窗口上得到同样的输出效果。
假设你想在终端(或者终端仿真窗口)输出一段背景是彩色的文字,可以将以下这段转义序列输入到你的字符控制台(也许是控制台窗口):
echo "^[[0;31;40mIn Color"
在这里 “^[” 就是所谓的转义字符。(注意:在这里 “^[” 是一个字符。不是依次键入“^”和“[”字符。要打出这个字符,要先按下Ctrl-V,然后按下ESC键。)执行以上的命令后。你应该可以看见“In Color”的背景变为红色了。从此以后输出的文本信息都是以这样的效果输出的。
如果想终止这种效果并回到原来的方式可以使用以下的命令:
echo "^[[0;37;40m"
现在知道这些字符(转移序列)的神奇作用了吗?(译者注:试着更改各分号之间的参数,看看会有什么结果。)也许会和自己想象的结果不一样?因为显示结果可能会因为终端的不同而有所不同。
因此,UNIX的设计者发明了一种叫做 termcap的机制。termcap实际上是一个列出特定终端所有可用功能的文件。并随同转义序列的要求显示出特定的效果。
但是,在这种机制发明后的几年中,termcap被一种叫做terminfo的机制取代。不用花过多的时间研究termcap的细节是terminfo机制的创建思想。terminfo通过让应用程序访问terminfo的数据库从而得到控制字符,并将这些控制字符发送终端或终端仿真程序。
2、NCURSES是什么?
你可能会想知道,为什么引入的所有这些技术更新史。因为假设在以上情况下,每个应用程序都在访问terminfo数据库并且做一些必要的原始处理(比如发送控制字符等等)。不久这些操作的复杂度将会变得难以控制。于是,CURSES诞生了。
CURSES的命名是来自一个叫做 “cursor optimization”(光标最优化)的双关语(译者注:CURSES本身有诅咒的意思)。CURSES构成了一个工作在原始终端代码之上的封装,并向用户提供了一个灵活高效的API(Application Programming Interface 应用程序接口)。它提供了移动光标,建立窗口,产生颜色,处理鼠标操作等功能。使应用程序不需要担心那些底层的终端功能。
那么什么是NCURSES?NCURSES是从最早的System V Release 4.0 (SVr4)中 CURSES的一个克隆。这是一个可自由配置的库,完全兼容旧版本的CURSES。简而言之,它是一个管理应用程序在字符终端屏幕显示的函数库。当后面提到CURSES库的时候,同时可以和NCURSES库互换。
NCURSES包由Pavel Curtis发起并组织,最初的维护人员是Zeyd Ben-Halim <zmbenhal@netcom.com>和Eric S. Raymond <esr@snark.thyrsus.com>,他们在1.8.1及以后版本中增加了很多的新功能。Jürgen Pfeifer< juergen.pfeifer@gmx.net >撰写了菜单库和面板库。使菜单和面板库同Ada95中捆绑的菜单和面板库一样好。Thomas Dickey<dickey@herndon4.his.com>和Jürgen Pfeifer进行着NCURSES的维护工作。Florian La Roche
<florian@gnu.org>持有NCURSES的版权,他在自由软件基金会(GNU)中担任NCURSES的维护工作。如果要联系目前的NCURSES的维护者请发电子邮件至bug-ncurses@gnu.org。
3、我们可以用NCURSES做什么?
NCURSES不仅是一个底层终端功能的封装,而且提供了一个相当稳固的工作框架(Framework)可以在字符模式下产生漂亮的界面。它提供了一些创建窗口的函数。而它的姊妹库 Menu、Panel和Form则提供了对CURSES基础库的扩展。这些扩展库通常都随同CURSES一起发行。我们可以建立一个同时包含多窗口(multiple windows)、菜单(menus)、面板(panels)和表单(forms)的应用程序。窗口可以被独立管理,例如让它卷动(scrollability)甚至隐藏。
菜单(Menus)可以让用户建立命令选项,方便用户执行命令。而窗体(Forms)允许用户建立一些简单的数据输入和显示的窗口。面板(Panels)是NCURSES窗口管理功能的扩展,可以用它覆盖或堆积窗口。
以上这些就是NCURSES的一些基本介绍。在以后的章节里,我们将详细的介绍NCURSES库。
4、在哪能得到它
你现在应该知道NCURSES可以做什么了。在你使用之前必须先下载它。你在安装操作系统时(Linux)应该已经附带了。万一如果你的操作系统还没有安装NCURSES库,可以通过以下的途径可以下载得到:
下载并编译安装文件包:
你可以通过ftp://ftp.gnu.org/pub/gnu/ncurses/ncurses.tar.gz免费下载NCURSES。也可以通过GNU的FTP目录:http://www.gnu.org/order/ftp.html 找到提供免费下载NCURSES文件包的站点。最新发布的稳定版本为:5.2 20001021.(译者翻译时已经有5.4版本的NCURSES下载了)
包裹文件中的README和INSTALL文件是安装NCURSES库的最主要资料。通常是这样安装NCURSES的:
tar zxvf ncurses<version>.tar.gz #解压缩并且释放文件包
cd ncurses<version> #进入解压缩的目录(注意版本)
./configure #按照你的系统环境制作安装配置文件
make #编译源代码并且编译NCURSES库
su root #切换到root用户环境
make install #安装编译好的NCURSES库
使用RPM安装文件:
可以在http://rpmfind.net 找到NCURSES的RPM格式安装包。可以在root模式下使用以下的命令安装:(以5.2版本为例)
rpm –vih <下载的RPM文件>
1.4 本文档的写作意图和涵盖范围
这份文档的目的是成为一份NCURSES库以及其姊妹库的综合指南。我们将以一个简单的“Hello, World!”程序作为起点。循序渐进的讲解NCURSES库中更多更高级的功能和操作。所以在撰写这份文档的时候假定读者不了解NCURSES库。
1.5 关于文档中出现的程序
这份文档中用到的所有程序已经被压缩成一个tar.gz的文件(需要相关软件解压缩)。可以通过http://www.linuxdoc.org/HOWTO/NCURSES-Programming-HOWTO/ncurses_programs.tar.gz 下载到。以下是这个压缩包解压缩后的目录结构:
ncurses
|
|----> JustForFun -- just for fun 部分的程序
|----> basics -- 一些基础部分的程序
|----> demo -- make 之后的程序
| |
| |----> exe -- 一些已编译的可执行示例程序
|----> forms -- 和form 库相关的程序
|----> menus -- 和menus 库相关的程序
|----> panels -- 和 panels 库相关的程序
|----> Makefile -- 一级目录的下的 Makefile
|----> README -- 一级目录下的 README 文件包含程序说明。
|----> COPYING -- 程序版权信息文档。
这些目录下包扩以下的文件:
JustForFun
|
|----> hanoi.c -- 汉诺塔示例
|----> life.c -- 生命演示游戏
|----> magic.c -- 一个魔方程序
|----> queens.c -- 八皇后问题
|----> shuffle.c -- 一个非常有意思的程序,只要你有时间去……
|----> tt.c -- 一个非常简单的打字练习程序
basics
|
|----> acs_vars.c -- 可选字符(ACS)变量示例
|----> hello_world.c -- 简单的“Hello, World!”程序
|----> init_func_example.c -- 初始化函数示例
|----> key_code.c -- 显示键盘字符代码的程序
|----> mouse_menu.c -- 一个可以使用鼠标访问的菜单
|----> other_border.c -- 展示与box()函数不同的显示边框的其它函数
|----> printw_example.c -- 一个非常简单的使用printw()函数的例子
|----> scanw_example.c -- 一个非常简单的使用getstr()函数的例子
|----> simple_attr.c -- 一个在屏幕上打印C源程序注释的例子
|----> simple_color.c -- 一个简单的演示颜色的例子
|----> simple_key.c -- 一个可以用方向键访问的菜单的例子
|----> temp_leave.c -- 一个演示临时离开CURSES模式的例子
|----> win_border.c -- 展示窗口和边框的例子
|----> with_chgat.c -- chgat()函数使用的例子
forms
|
|----> form_attrib.c -- 展示field属性的用法
|----> form_options.c -- 展示field选项的用法
|----> form_simple.c -- 一个简单的表单例子
|----> form_win.c -- 一个简单的窗口和表单联合使用的例子
menus
|
|----> menu_attrib.c -- 展示菜单属性的用法
|----> menu_item_data.c -- 展示 item_name() 等等函数的用法
|----> menu_multi_column.c -- 建立多列菜单
|----> menu_scroll.c -- 展示菜单滚动的示例
|----> menu_simple.c -- 一个用方向键控制菜单的例子
|----> menu_toggle.c -- 建立多值菜单和解释 REQ_TOGGLE_ITEM
|----> menu_userptr.c -- 用户指针的用法
|----> menu_win.c -- 菜单和窗口结合的演示例子
panels
|
|----> panel_browse.c -- 通过 tab 浏览展示用户指针的用法
|----> panel_hide.c -- 隐藏和取消隐藏面板的例子
|----> panel_resize.c -- 移动和改变面板大小的例子
|----> panel_simple.c -- 一个简单的面板使用例子
Makefile包含在一级主目录里。它将会把所有的程序编译成可执行的文件。并把这些文件存在demo/exec目录下面。你也可以选择将其编译到别的目录下。每个目录下都有一个README文件详细描述了每个目录下的C源程序的内容。
对于每一个示例,我都给出了这些程序调用NCURSES目录下相关文件的路径名。
如果你希望在线阅读这些程序中某个单独的程序,可以通过浏览器访问一下网址:http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/ncurses_programs/所有以上发布的程序都遵照GPL(http://www.gnu.org/copyleft/gpl.txt)许可协议发行,你可以在许可协议允许的范围内任意处置程序代码。
1.6关于此文档的其他文件发布格式
这份HOWTO文档还有很多其它的文件发布格式,可以在tldp.org 下载到。以下是关于这份文档其它格式的下载链接:
1.6.1在tldp.org上的已发布格式链接:
1.7原文贡献者
感谢Sharath(sharath_1@usa.net)和Emre Akbas编写了其中的一些段落。简介部分最初由Sharath写成。当重新写这部分的时候饮用了他最初完成的部分。Emre帮忙编写了printw()函数和scanw()函数部分。
之后是Ravi Parimi(parimi@ece.arizona.edu)。他是这个项目最初的实现者。在撰写这份文档时,他对这份文档提供了很多的意见。并且在文章撰写完毕后耐心的校对了整份文档。他还在Linux和Solaris平台上检查过文中使用的每一个程序。你可以从他的注记中发现你的问题。
1.8远景规划
这些是正在进行或者将要进行的项目。如果你有项目或者想加入某个项目。请和Padala联系。
l 给最后讲述form库的一章增加更多的示例程序。(这个项目Padala正在进行)
l 准备一个演示程序展示文档中所有的示例。同时允许用户通过程序描述展示这些示例。让用户亲自编译并且察看这些程序。一个有对话框的用户界面更好。(这个项目N.N.Ashok正在进行)
l 加入Debug信息,使用 _trace,_tarcemouse 。
l 通过NCURSES库中的函数访问termcap或tremios
l 使用户可以同时在两个终端上工作。
l 在“其它特色”章节(Miscellaneous features)中增加一些东西。
1.9关于著作权
Copyright (c) 2001 by Pradeep Padala. This document may be distributed under the terms set forth in the LDP license at linuxdoc.org/COPYRIGHT.html.
This HOWTO is free documentation; you can redistribute it and/or modify it under the terms of the LDP license. This document is distributed in the hope that it will be useful, but without any warranty, without even the implied warranty of merchantability or fitness for a particular purpose. See the LDP license for more details.