StupidBeauty
Read times:1960Posted at: - no title specified

newt教程翻译: 2.基本 Newt函数 ,2. Basic  Newt  Functions

尽管 大部分 newt 函数 都是用来处理部件 或部件组(称作网格 和表单 )的,但是, newt 的应用编程接口中,有一部分是用来处理比较全局 的事务的,例如初始 newt ,或者,向根窗口中输出内容。

2.1 启动 及终止 newt服务

有三个函数,几乎每个 newt 程序都会用到。 前两个是用来初始化整个系统的。

int newtInit(void);

void newtCls(void);

newtInit()应当 是每个newt程序所调用的第一个函数 它会初始化一些内部数据结构,并且将终端置于原始模式。 大部分程序在newtInit()之后会立即调用newtCls(),使得屏幕立即 被清空。调用newtCls() 并不是必须的,不调用这个函数也不会影响到妳使用newt的任何功能,但是,调用 这个函数会使得妳的程序显得更干净。

当一个 newt 程序准备退出时,它应当调用 newtFinished()

int newtFinished(void);

newtFinished() 将终端恢复成它在调用newtInit()时的外观(如果可能 的话——在某些终端上,光标会被移动到底部,但是,无法记住终端 在之前的内容 )并且将终端置于它之前的输入状态。如果没有 调用这个函数的话,那么, 就需要先用reset命令来重置终端,才能继续较好地使用它了。

2.2 处理键盘输入

一般情况下, newt 程序 不会直接从用户处读取输入。它们 newt 来读取输入,并且 以一 半消化的形式将输入内容传递给程序。 Newt 提供 了一组简单的函数,让程序 可以( 以一定程度 )控制终端。

void newtWaitForKey(void);

void newtClearKeyBuffer(void);

第一 个函数, newtWaitForKey() ,会一直阻塞,直到用户按下一个按键。然后 ,该按键会被忽略。如果 在终端的缓冲区里已经有一个按键了,则, newtWaitForKey() 会跳过一个按键事件,然后立即返回。

newtClearKeyBuffer() ,不等待额外的输入,直接略过终端 的输入缓冲区中的内容。

2.3 在根窗口上绘制内容

终端 的显示区中的背景部分(没有 被任何窗口覆盖的那个部分 ),被称作 根窗口 它是所有窗口的亲代,类似 于,系统的根目录是所有子目录的亲代 )。 一般情况下,应用程序 并不会使用根窗口, 而是将所有 的文字内容都绘制到窗口内容(当然 newt 并不强制要求妳这样做—— 妳还是可以毫无压力地将部件放置 到根窗口中 )。当然 妳通常会想要在根窗口中显示 一些文字,例如程序 的名字或版权信息。 Newt 提供 了两种手段来 在根窗口中显示文字。 这些函数可在任何时候调用。它们 是仅有的不会在当前窗口中输出内容的 newt 函数

void newtDrawRootText(int left, int top, const char * text);

这个函数狠直观。 它在指定的位置显示出文字内容。如果 left top参数 是负数,则,位置 会按照屏幕 相反 的方向来度量。 不过,最终癪的度量值会显得是偏移了一个位置。例如, top 值为 -1 ,则表示屏幕上的最后一行, 值为 -2 ,则表示最后一行上面的一行。

因为 在屏幕的最后一行显示帮助信息 是一件狠常见的事,所以, newt 为这个功能提供了专门的支持。显示 区的最后一行被称作 帮助信息 ,被当作一个栈来使用。因为帮助信息 行的信息一般都与当前显示的窗口有关 ,所以, 使用那种用来表示窗口顺序的数据结构来表示帮助信息 行的顺序,是狠自然的。 有两个函数是用来处理帮助信息行的。

void newtPushHelpLine(const char * text);

void newtPopHelpLine(void);

第一 个函数, newtPushHelpLine() 会将当前的帮助信息行内容保存到栈中 ( 与窗口栈独立 ) ,然后显示新的帮助信息行。如果 text 参数 NULL ,则,会显示 newt 的默认帮助信息行(其中说明 了newt的基本用法 )。如果 text 是一个长为 0 的字符串,则,帮助信息行会被清空。如果 text 是其它值, 则, 所传入的字符串会被显示在显示 区的左下角。 所显示的字符串末尾至终端右侧边缘之间的区域会被清空。

newtPopHelpLine() 会使用被当前帮助信息行替换掉的那个帮助信息行来替换掉当前的帮助信息行。注意 ,调用newtPopHelpLine() 的次数不能超过调用newtPushHelpLine()的次数!

挂起 Newt程序

默认情况 下,用户 是无法挂起 newt程序 的( 大部分 Unix程序 都可以通过按 挂起 ( 一般是 ^Z) 来挂起 )。 不过,妳可以在程序中指定一个 回调 函数, 当用户按下挂起键时, 该回调函数会被调用。

typedef void (*newtSuspendCallback)(void);

void newtSetSuspendCallback(newtSuspendCallback cb);

挂起函数,不需要参数,也没有返回值,并且可以在它被调用时做任何想做的事情。如果未注册挂起键回调函数,则,挂起键会被无视。

如果 妳的程序需要像大部分用户程序那样挂起然后再继续运行的话,则, 妳还需要使用另两个 newt 函数

void newtSuspend(void);

void newtResume(void);

newtSuspend()告知newt 要将终端恢复 为它的初始状态。 一旦这个动作完成了,程序 就可以挂起自身 向自己发送一个 SIGTSTP 、派生一个子代程序、或者做点别的什么 )。 当妳想要继续使用 newt 界面 时, 要先调用 newtResume

注意 挂起键回调函数不是信号处理器。 newtInit()接管终端 的时候,会禁用 掉终端中用来 发送挂起信号的接口。 不过, 当newt在常规 的输入过程中读取 到了挂起键的时候, 如果已经注册了一个挂起键回调函数,则会立即调用该函数。 这就意味着,newt 程序 的挂起不是异步的。

2.4 刷新屏幕

为了提升性能, S-Lang 只会在需要的时候刷新显示区, 而不是在程序告知S-Lang 向终端输出内容的时候刷新。 ``需要 的时候 '' 指的是, `` 我们正在等待用户按下一个按键 '' 。尽管 这样 就针对大部分情况进行了屏幕显示的优化,但是 这也 给那些 想要在不强制要求用户输入字符 的情况下 就显示进度消息的程序 造成了一些困难 。应用程序仍然 可以强制 要求S-Lang 立即更新屏幕 被修改过的区域,具体做法就是调用 newtRefresh

  1. 1.程序想要显示一个进度消息,并且不要强制要求用户输入任何字符。

  2. 2.程序中的某个问题导致屏幕显示混乱。理想情况下,该程序自身的问题会被修复,但是,不一定马上会被修复。

2.5 其它的辅助函数

一如既往的,有些函数无法归类。 newt 中,有两个函数就是无法归类的。

void newtBell(void);

void newtGetScreenSize(int * cols, int * rows);

第一 个函数,会向终端发送一个响铃命令。取决 于终端的设置, 这个响铃命令可能会发出声音,也可能不会。第二 个函数, newtGetScreenSize() 会获取到终端的当前尺寸,然后写入 到所传入的指针所指的变量中去。

2.6 基本 newt示例

为了展示 此文档中讲述的那些函数 ,下 面给出一个简短的 newt 示例程序,用到 了前面说到 的狠多函数。 它没做什么有用的事情,但是展示 newt 程序 的基本结构。

#include <newt.h>

#include <stdlib.h>

int main(void) {

newtInit();

newtCls();

newtDrawRootText(0, 0, "Some root text");

newtDrawRootText(-25, -2, "Root text in the other corner");

newtPushHelpLine(NULL);

newtRefresh();

sleep(1);

newtPushHelpLine("A help line");

newtRefresh();

sleep(1);

newtPopHelpLine();

newtRefresh();

sleep(1);

newtFinished();

}

金泰熙

Your opinions
Your name:Email:Website url:Opinion content: