前言 1
0.1 有关文档及培训课程 1
目录 1
0.1.3 如何订购其它参考书 2
0.1.2 有关UNIX系统shell及C编程的书目 2
0.1.1 有关字符用户界面的其它书目 2
0.2 如何对本指南提出意见 3
0.1.4 培训课程 3
Ⅰ.1.2 本指南的组织 5
Ⅰ.1.1 本指南的读者 5
第一篇 程序员指南:字符用户界面(FMLI) 5
有关本指南 5
Ⅰ.1 简介 5
Ⅰ.1.3 本指南使用的印刷符号约定 6
1.2 什么是FMLI? 9
1.1 简介 9
第一章 FMLI引论 9
图1-1:FMLI屏幕 10
1.2.1 屏幕布局 10
1.2.2 画面 11
1.3.1.1 菜单画面 12
1.3 用FMLI编程 12
1.3.1 画面定义文件 12
1.3.1.2 表格画面 13
1.3.3 终端独立性 14
1.3.1.3 正文画面 14
1.3.2 应用层定义文件 14
1.3.2.1 初始化文件 14
1.3.2.2 命令文件 14
1.3.2.3 别名文件 14
1.4 应用程序示例 15
1.3.3.1 异常中止后的恢复 15
图1-3:Text·welcome:一个正文画面定义文件 16
图1-2:Menu·sample:一个简单的菜单画面定义文件 16
1.5 使用FMLI应用程序 17
图1-4:Menu·sample:屏幕输出 18
1.5.1 命名键及替代的击键 19
1.5.2 游动 19
1.5.2.1 在菜单画面内游动 19
1.5.2.2 选择菜单项 20
1.5.2.3 在正文画面内游动 21
1.5.2.4 在画面之间游动 21
图1-5:Menu·Sample:选择welcome之后的屏幕输出 21
1.5.3 执行命令 22
1.5.3.1 命令菜单 22
1.5.3.2 命令行 23
1.5.3.4 联机帮助 24
1.5.3.5 访问UNIX系统 24
1.5.3.3 标记屏幕的功能键 24
2.1 简介 27
2.2.2 注释 27
2.2 句法、规则及约定 27
第二章 表格和菜单语言 27
2.2.1 画面定义文件的命名约定 27
2.2.3 区分大小写 28
2.2.4 类型强制 28
2.2.4.1 文件类型强制 28
2.2.4.2 改变描述字赋值次数的类型强制 28
2.2.5 特殊字符 29
2.2.6 引括机制 30
2.2.7 反引括表达式 30
2.2.8 文件改向 31
2.2.9 语法错误 31
2.2.7.1 表达式算符 31
2.3.1 用户定义的变量 32
2.3.2 内部变量 32
2.3 变量 32
2.3.2.1 变量赋值 33
2.4 描述字 35
2.4.1 描述字类型 35
2.4.2 画面定义文件描述字 36
2.4.2.1 菜单描述字 36
表2-1:用于菜单定义文件的画面描述字 37
表2-2:用于菜单定义文件的项描述字 37
2.4.2.2 表格描述字 38
表2-3:用于菜单定义文件的SLK描述字 38
表2-4:用于表格定义文件的画面描述字 38
表2-5:用于表格定义文件的字段描述字 39
表2-6:用于表格定义文件的SLK描述字 40
2.4.2.3 正文画面描述字 40
表2-7:用于正文画面定义文件的画面描述字 40
表2-8:用于正文画面定义文件的SLK描述字 41
2.4.3 应用层文件描述字 41
表2-9:用于初始化文件的介绍性画面描述字 42
2.4.3.1 初始化文件描述字 42
表2-10:用于初始化文件的标题行描述字 43
表2-11:用于初始化文件的一般描述字 43
表2-13:用于初始化文件的应用程序SLK描述字 44
表2-12:初始化文件的色彩描述字 44
2.4.3.2 应用程序SLK描述字 44
2.5 FMLI命令 45
表2-14:命令文件描述字 45
2.4.3.3 命令文件描述字 45
2.5.1 FMLI命令:句法和应用 46
图2-1:命令菜单的FMIL命令的默认设置 50
图2-2:FMLI命令对功能键的默认设置 50
2.5.2 用户访问FMLI命令 50
2.6 内部实用程序 51
2.6.1 内部实用程序概述 51
2.7 条件语句 53
2.8 中断信号处理 54
2.9 终端显示属性 56
图2-3:用于决定按下中断键时,interrupt和Oninterrupt值的继承层次 56
表2-15:对应显示属性的FMLI字符序列表 57
表2-16:替代的字符集 57
2.9.1 使用替代的字符集 57
3.2 菜单画面描述字 59
第三章 画面定义文件 59
3.1 简介 59
3.2.1 菜单的画面描述字 60
3.2.2 菜单的项描述字 64
3.3 菜单定义文件的示例 65
3.3.1 定义简单菜单 65
图3-1:Menu·items:有关菜单项描述字的一个示例 66
图3-2:Menu·items:屏幕输出 66
图3-3:Menu·frame:有关菜单画面描述字的一个示例 67
3.3.2 创建多列和可滚动的菜单 68
图3-4:Menu·frame:屏幕输出 68
图3-5:Menu·rows:有关可滚动菜单的一个示例 68
图3-6:Menu·rows:屏幕输出 69
图3-7:Menu·columns:有关两列菜单的一个示例 69
3.3.3 使用reread描述字 70
图3-9:Menu·reread:一个动态更改菜单的示例 70
图3-8:Menu·columns:屏幕输出 70
图3-11:Menu·reread:出现一个SIGALRM之后的屏幕输出 71
图3-10:Menu·reread:屏幕输出 71
图3-12:Menu·interrupt:有关中断信号处理的一个示例 72
3.3.4 使用interrupt和oninterrupt描述字 72
图3-13:Menu·oninterr:有关中断处理的又一个示例 73
图3-14:Menu·descrip:有关description描述字的一个示例 73
3.3.5 为菜单项提供补充信息 73
3.3.6 显示项消息 74
图3-15:Menu·descrip:屏幕输出 74
图3-16:Menu·itemmsg:有关itemmsg描述字的一个示例 75
图3-17:Menu·itemmsg:屏幕输出 75
图3-18:Menu·show:有关show描述字的一个示例 76
3.3.7 使用show描述字 76
图3-19:Menu·show:屏幕输出 77
图3-20:Menu·edit:一个动态创建菜单的示例 77
3.3.8 创建动态菜单 77
图3-21:Menu·edit:屏幕输出 78
图3-22:Menu·dynamic:一个动态创建菜单的示例 78
3.4 表格的画面描述字 79
图3-23:Menu·edit:选择Menu Files时的屏幕输出 79
3.4.1 表格的画面描述字 80
3.4.2 字段描述字 83
3.5.1 把用户的输入存入表格 88
3.5 表格定义文件的示例 88
图3-24:Form·addr:有关表格的一个示例 89
图3-25:Form·addr:屏幕输出 90
图3-27:Addr·file:用户保存该表格之后的内容 91
3.5.2 验证表格字段 91
图3-26:Form·addr:用户填完表后的屏幕输出 91
图3-29:Form·6choices:有关选择菜单的一个示例 92
图3-28:Form·3choices:用menuonly描述字进行字段验证的一个示例 92
图3-30:Form·6choices:屏幕输出 93
3.5.3 用valid描述字验证一个字段值的示例 94
图3-31:Form·6choices:在用户从选择菜单中选择了一个项之后的屏幕输出 94
图3-32:Form·valid:使用valid描述字进行字段验证的一个示例 94
3.6 正文画面描述字 95
3.6.1 正文画面描述字 96
图3-33:Text·USA:有关正文画面的一个示例 99
3.7 正文画面定义文件的示例 99
3.7.1 定义正文画面的属性 99
图3-35:Text·readfile:在一个正文画面中使用readfile和longline的一个示例 100
3.7.2 用readfile和longline定义正文画面 100
图3-34:Text·USA:屏幕输出 100
3.7.3 使用正文画面头及终端属性 101
图3-36:Text·header:有关正文画面头的一个示例 101
图3-37:Text·header:屏幕输出 102
3.8 其他一些有用的示例 102
图3-38:Menu·lininfo:一个用LININFO定义帮助信息的示例 102
3.8.1 为菜单或表格字段定义求助画面 102
图3-39:Text·get-help:有关帮助正文画面的一个示例 103
图3-40:Text·item2:有关帮助正文画面的一个示例 103
图3-42:Menu·lininfo:屏幕输出 104
图3-41:Text·item3:有关帮助正文画面的一个示例 104
图3-43:Menu·lininfo:对项1求助之后的屏幕输出 105
图3-44:Menu·lininfo:对项2求助之后的屏幕输出 105
3.8.2 使用合作处理实用程序 105
图3-45:Menu·talk:有关合作处理的一个示例 106
图3-47:talk:有关合作进程的一个示例 107
图3-46:Form·talk:有关合作处理的一个示例 107
第四章 应用层定义文件 109
4.1 简介 109
4.2 初始化文件 109
4.2.1 介绍性画面描述字 110
4.2.2.1 标题行的示范定义 111
4.2.1.1 介绍性画面的示范定义 111
4.2.2 标题行描述字 111
4.2.3 色彩属性描述字 112
4.2.3.1 定义色彩属性的示例 113
4.2.4 一般的应用程序描述字 114
4.2.5 标记屏幕的功能键描述字 116
图4-1:将FMII命令指派给功能键的默认方式 117
4.2.5.1 标记屏幕的功能键的示范定义 118
4.3 命令文件 119
4.3.1 命令描述字 119
4.3.1.2 禁用已存的FMLI命令的示例 120
4.4 别名文件 120
4.3.1.1 增加针对应用程序的命令的示例 120
4.4.1 增加路径别名的示例 121
4.5 fmli命令句法 121
附录A 编程建议及已知的问题 123
A.1 编程建议 123
A.1.1 自动的功能键下行装入 123
A.1.2 表格字段的验证 124
A.1.2.1 相互依赖字段的验证 124
A.1.2.2 使用跨画面的全局变量 125
A.1.3 命令 125
A.1.5 表格 126
A.1.6 菜单 126
A.1.4 合作处理 126
A.1.7 正文 128
A.1.8 反引括表达式 128
A.1.9 色彩 129
A.1.10 消息行 129
A.1.11 语法 129
A.1.12 杂项 129
A.2.2 屏幕呈现 130
A.2.1 初始化 130
A.2 已知的问题 130
A.2.3 消息行 130
A.2.4 命令行 130
A.2.6.2 表格字段的验证 131
A.2.5 标记屏幕的功能键 131
A.2.6.3 水平可滚动的表格字段 131
A.2.6.4 表格的其他问题 131
A.2.6 表格 131
A.2.6.1 多页表格 131
A.2.7 正文画面 132
A.2.8 命令 132
A.2.9 内部实用程序 133
A.2.9.1 regex 133
A.2.9.3 合作处理实用程序 133
A.2.9.2 readfile 133
A.2.10 描述字 134
A.2.9.4 if then else 134
A.2.9.5 其他的内部实用程序问题 134
A.2.12 杂项 135
A.2.11 中断设施 135
附录B 命名键及替代的击键 137
附录C FMLI手册页 143
词汇表 171
5.1 概述 179
第二篇 程序员指南:字符用户界面(ETI) 179
第五章 ETI引论 179
5.1.1 本指南的组织 179
5.1.2 本文档中使用的约定 180
5.2 什么是ETI? 181
5.2.1 ETI库 181
图5-1:一个简单的ETI程序 182
5.2.2 ETI/terminfo的连接 182
图5-2:屏幕管理系统的组成 183
5.2.3 屏幕管理系统的其余部分 183
第六章 基本的ETI程序设计 185
6.1 简介 185
6.2 每个ETI程序需要什么 185
6.2.1 前导文件 185
6.2.2 例程initscr(),refresh(),endwin() 186
图6-1:在程序中应用initscr()、refresh()、以及endwin()的意图 186
6.3 编译ETI程序 187
6.3.1 使用TAM变换库 187
6.4 运行ETI程序 188
6.5 有关initsrc()行数和列数的详情 188
6.5 有关refresh()以及窗口的详情 189
图6-2:stdscr和终端屏幕的关系(之一) 189
6.5.1 充填 190
图6-3:stdscr和终端屏幕的关系(之二) 190
图6-4:映射到一个物理屏幕的多个窗口和pad 191
7.2 输出 193
7.1 简介 193
7.2.1 addch() 193
第七章 简单的输入和输出 193
7.2.2 addstr() 194
7.2.3 printw() 195
7.2.4 move() 196
7.2.5 clear()和erase() 197
7.2.6 clrtoeol()和clrtobot() 198
7.3 输入 199
7.3.1 getch() 199
7.3.2 getstr() 201
7.3.3 scanw() 202
7.4 输出属性 203
7.4.1 attron(),attrset()和attroff() 204
7.4.2 standout()和standend() 205
7.4.3 色彩处理 205
7.4.3.1 色彩特征是如何起作用的 205
图7-1:默认的色彩表 206
图7-2:一个色彩对表的示例 207
7.4.3.4 可移植性准则 208
7.4.3.2 使用COLOR_PAIR(n)属性 208
7.4.3.3 改变色彩的定义 208
7.4.3.5 其他的宏和例程 209
7.4.3.6 start_color() 210
7.4.3.7 init_pair() 210
7.4.3.8 init_color() 211
7.5 响铃、振鸣以及光闪烁:beap()和flash() 212
7.6 输入选项 212
图7-3:ETI程序的输入选项设置 213
7.6.1 echo()和noecho() 214
7.6.2 cbreak()和nocbreak() 214
8.2 输出和输入 217
第八章 窗口 217
8.1 简介 217
8.3 例程wnoutrefresh()和doupdate() 218
图8-1:使用wnoutrefresh()和doupdate() 218
图8-2:窗口和终端屏幕的关系(之一) 219
图8-3:窗口和终端屏幕的关系(之二) 220
图8-4:窗口和终端屏幕的关系(之三) 221
8.4 新窗口 221
8.4.1 newwin() 222
8.4.2 subwin() 222
8.5 ETI与高级函数的低级界面(curses) 223
图8-5:低层ETI(cunes)界面的示范例程 224
9.2 编译和连接面板程序 225
9.3 创建面板 225
第九章 面板 225
9.1 简介 225
9.4 基本面板窗口操作 226
9.4.1 获取面板窗口指针 226
9.4.2 改变面板窗口 227
9.4.3 在屏幕上移动面板窗口 227
9.6 更新屏幕上的面板 228
9.5 将面板移至舱面的顶部或底部 228
9.7.1 隐藏面板 229
9.7 使面板不可见 229
9.7.1.1 核实面板是否已被隐藏 230
9.7.2 恢复面板 230
9.8 获取给定面板之上或之下的面板 231
9.9 设置和获取面板用户指针 232
图9-1:使用面板用户指针的示例 233
9.10 删除面板 234
10.1 简介 235
图10-1:一个样本菜单 235
10.2 编译和连接菜单程序 235
10.3 用ETI编写菜单程序概述 235
第十章 菜单 235
10.3.3 菜单程序样本 236
10.3.1 一些重要的菜单术语 236
10.3.2 菜单应用程序所做的事情 236
图10-2:用ETI创建菜单的样本菜单程序 237
10.4 创建和释放菜单项 238
图10-3:创建一个项数组 239
10.5 两种菜单:单值菜单和多值菜单 240
10.5.1 在多值菜单中操纵项的选择值 240
10.6.2 设置项的选项 241
10.6 操纵项属性 241
图10-4:在菜单处理中使用item_value() 241
10.6.1 获取项名及说明 241
10.6.3 核实项的可见性 243
10.6.4 改变项属性的当前默认值 244
10.7 设置项的用户指针 244
图10-5:使用项用户指针 245
10.8 创建和释放菜单 246
10.9.1 获取和改变菜单项 247
10.9 操纵菜单属性 247
图10-6:改变和菜单相关联的项 248
10.9.2 计算菜单项的数目 248
10.10.1 决定菜单的大小 249
10.9.3 改变菜单属性的当前默认值 249
10.10 显示菜单 249
10.10.1.1 规定菜单格式 250
图10-8:菜单格式(3,2)的示例 251
图10-7:菜单格式(2,2)的示例 251
10.10.1.2 改变菜单的标记串 252
图10-9:菜单格式(4,3)的示例 252
10.10.1.3 查询菜单大小 254
10.10.2 将窗口和子窗口和菜单相联 254
图10-10:菜单函数写入子窗口,应用程序写入窗口 255
10.10.3 获取和改变菜单的显示属性 256
图10-11:创建一个带有边界的菜单 256
10.10.4 安置和撤除菜单 258
图10-12:显示和抹掉菜单的样本例程 259
10.11 菜单驱动程序处理 260
图10-13:将键翻译成菜单请求的样本例程 261
10.11.1 定义键虚拟化的对应 261
10.11.2.1 项游动请求 262
10.11.2 ETI菜单请求 262
10.11.2.5 模式缓冲区请求 263
10.11.2.3 菜单滚动请求 263
10.11.2.2 定向的项游动请求 263
10.11.2.4 多值菜单选择请求 263
10.11.3 应用程序定义的命令 264
10.11.4 调用菜单驱动程序 265
图10-15:菜单输出举例(2) 265
图10-14:ETI键值的整数范围和MENU请求 265
图10-16:调用菜单驱动程序的样本程序 266
10.11.5 建立项和菜单初始化和终止例程 269
10.11.5.4 函数set_menu_term 270
10.11.5.1 函数set_menu_init 270
10.11.5.2 函数set_item_init 270
10.11.5.3 函数set_item_term 270
10.11.6 获取和改变当前项 271
图10-17:使用一个初始化例程来产生项的提示符 271
10.11.7 获取和改变顶行 273
10.11.8 定位菜单光标 274
图10-18:将光标返回到菜单驱动程序处理的正确位置 274
10.11.9 改变和获取模式缓冲区 274
10.12 操纵菜单用户指针 275
图10-19:设置和使用菜单用户指针示例 276
10.13 设置和获取菜单选项 277
11.2 编译和连接表格程序 281
11.3.1 一些重要的表格术语 281
11.1 简介 281
11.3 用ETI编写表格程序的概述 281
第十一章 表格 281
图11-1:表格显示的样本 281
11.3.2 典型的表格应用程序做些什么 282
11.3.3 表格应用程序样本 282
图11-2:生成表格样本的代码 283
11.4 创建和释放字段 286
11.5.1 获取字段大小和位置信息 288
11.5 操纵字段属性 288
11.5.2 动态可增长的字段 289
11.5.3 移动一个字段 291
图11-3:按给定的行数移动所有表格字段 292
11.5.4 改变字段属性的当前默认值 292
11.5.5 设置字段类型以保证合法性 292
11.5.5.1 TYPE_ALPHA 293
11.5.5.2 TYPE_ALNUM 294
11.5.5.3 TYPE_ENUM 294
11.5.5.4 TYPE_INTEGER 295
图11-4:将一个字段设置为颜色的TYPE_ENOM 295
11.5.5.5 TYPE_NUMERIC 296
11.5.6 对齐字段中的数据 297
11.5.5.6 TYPE_REGEXP 297
11.6 设置字段前景、背景和填充字符 298
11.7 某些有帮助的字段特点 300
11.7.1 设置和读取字段缓冲区 300
11.7.2 设置和读取字段状态 301
11.7.3 设置和获取字段用户指针 302
图11-5:使用字段状态来更新数据库 302
图11-6:使用字段用户指针来匹配项 303
11.8 操纵字段选项 304
11.9 创建和释放表格 307
11.10 操纵表格属性 308
图11-7:创建一个表格 308
11.10.1 改变和获取已有表格上的字段 309
11.10.2 计算字段的数目 310
11.10.4 改变ETI表格默认属性 311
11.11 显示表格 311
11.10.3 查询脱屏数据的存在 311
11.11.1 决定表格的尺寸 312
11.11.1.1 确定表格的尺度 312
11.11.2 使窗口和子窗口与一个表格相关联 313
图11-9:在一个表格周围创建边界 314
图11-8:表格函数写入子窗口,应用程序写入窗口 314
11.11.3 安置和撤除表格 315
图11-10:安置和撤除表格 316
11.12 表格驱动程序处理 317
11.12.1 定义虚拟键映射 317
图11-11:键虚拟化例程样本 318
11.12.2 ETI表格请求 320
11.12.2.1 页游动请求 320
11.12.2.2 当前页上的字段间游动请求 320
11.12.2.3 字段内的游动请求 321
11.12.2.4 字段编辑请求 322
11.12.2.5 滚动请求 323
11.12.2.7 选择请求 324
11.12.3 应用程序定义的命令 324
11.12.2.6 字段合法化请求 324
11.12.4 调用表格驱动程序 324
图11-12:赛马表格输出 325
图11-13:表格驱动程序的用法示例 325
11.12.5 建立字段和表格初始化和终止例程 329
11.12.5.2 set_field_init()函数 330
11.12.5.4 set_form_term()函数 330
11.12.5.3 set_field_term()函数 330
11.12.5.1 set_form_init()函数 330
图11-14:更新一列总数的终止例程样本 331
11.12.6 操纵当前字段 332
图11-15:增亮当前字段的字段初始化和终止例程 332
图11-16:操纵当前字段示例 333
图11-17:改变和核实表格页数的示例 334
11.12.7 改变表格页 334
11.12.8 定位表格光标 335
图11-18:在打印页号后重新定位光标 335
图11-19:使用表格用户指针的模式匹配 336
11.13 设置和获取表格用户指针 336
11.14 设置和获取表格选项 337
11.15.1 从另两个字段类型建造一个字段类型 339
11.15 创建和操纵程度员定义的字段类型 339
11.15.2 用合法化函数创建一个字段类型 340
图11-20:创建程序员定义的字段类型 341
11.15.4 支持程序员定义的字段类型 342
11.15.3 释放程序员定义的字段类型 342
11.15.4.1 字段类型的实参支持 343
图11-21:创建带有填充和范围实参的TYPE_HEX 344
11.15.4.2 支持下一个以及先前的选择函数 346
图11-22:创建字段类型的下一个选择函数 347
12.2 画线条或其它图形的例程 349
12.1 简介 349
第十二章 其它ETI例程 349
12.3 使用软标号的例程 350
12.4 用多个终端进行工作 351
图12-1:向几个终端发送消息 352
13.1.1 本章的组织 353
13.1 简介 353
第十三章 terminfo 353
13.1.2 terminfo是什么 353
13.2 用terminfo例程进行工作 354
13.2.1 每个terminfo程序需要什么 354
图13-1:使用terminfo例程的shell脚本 354
图13-2:terminfo程序的典型画面 355
13.2.2 编译和运行terminfo程序 355
13.2.3 terminfo程序示例 355
图13-3:terminfo程序示例 356
13.3 用terminfo数据库进行工作 358
13.3.1 编写终端说明 358
13.3.1.1 命名终端 359
13.3.1.2 了解终端能力 359
13.3.1.3 说明终端能力 360
13.3.1.4 编译终端说明 363
13.3.1.5 测试终端说明 364
13.3.2 比较或显示terminfo说明 365
13.3.3 将termcap说明转换为terminfo说明 365
D.2 在ETI下编译和运行TAM应用程序 367
D.1 简介 367
附录D TAM变换库 367
D.3 完善在ETI下运行的TAM应用程序的提示 368
D.4 TAM变换库如何工作 368
图D-1:从TAM到ETI函数调用的转换 368
D.4.1 TAM调用到ETI调用的转换 368
图D-2:TAM高级函数 371
图D-3:在TAM转义序列和虚拟键值之间进行转换 371
D.4.2 TAM变换键盘子系统 371
附录E ETI程序示例 375
E.1.1 editor程序 375
E.1 程序示例 375
E.1.2 higldight程序 379
E.1.3 Scatter程序 381
E.1.4 show程序 382
E.1.5 two程序 384
E.1.6 window程序 386
E.1.7 clors程序 387
附录F ETI手册页 389