为了简化信号传播机制,必须单独处理加速键。因为加速键信号的接收者往往不在加速键处理者的 子树中(父子窗口关系),如果不单独处理加速键,就必须允许信号由父节点向子节点传播。
考虑到加速键总是在某些特定的构件中使用,可以由构件自行注册加速键。因此没有必要在GIRL源 文件中给出注册加速键的手段。构件将根据由构件本身定义的约定注册加速键(例如,把菜单项字符串 中&之后的字符作为加速键字符)。
为了给加速键注册提供便利,加速键在C/C++程序中被定义成整数。C/C++程序可以通过宏访问给定 的加速键。所有加速键宏在头文件keysym.h中定义。除了为每个加速键定义了单独的宏,还提供了如下 宏以便于访问加速键:
为了简化加速键注册操作,把加速键编程组。加速键编组有利于成组地添加、删除加速键。结构 girlAccelGroup用于表示加速键组。
构件注册加速键可以调用以下函数:
初始化给出的加速键表,并且把accel作为第一个加速键。当出现该加速键时,预定义信号 sig_accel将被发送给给出的构件。
清除给出的加速键表。如果该加速键表被安装了,那么它将被自动卸载。清除加速键表不会 影响加速键表指定的构件。在应用程序退出之前,必须清除所有加速键表,否则将产生内存泄漏。
把accel添加到给定加速键表之后。当出现该加速键时,预定义信号sig_accel将被发送给在 girl_setup_accelgroup中给出的构件。
获取加速键表中第一个加速键。如果返回NOKEY,则表示扫描完成。整数scanproc用于储存扫描进程。
获取加速键表中的下一个加速键。如果返回NOKEY,则表示扫描完成。整数scanproc用于储存扫描进程。
获取加速键表指定构件。
把给定的加速键表安装到系统中去。返回真表示安装成功。返回假表示安装失败。
从系统中卸载给定的加速键表。
把加速键发送给指定的加速键表。如果给定的加速键表含有给定的加速键,那么将预定义信号sig_accel 发送给在girl_setup_accelgroup中指定的构件。
把加速键发送给所有安装到系统中的加速键表。
需要说明的是:如果在同一个加速键表中出现了重复的加速键,则后一个加速键将被忽略。如果同一个 加速键出现在不同的加速键表中,后安装的加速键表中的加速键被优先使用。