XWindow提供了另外一种扩展机制,可以在一些关键位置设置截取点,换句话说,你可以在这些关键位置插入自己的回调函数,当程序执行到这里时,注册的回调函数就会被调用。
12.X Window扩展机制--截取点
XWindow提供了另外一种扩展机制,可以在一些关键位置设置截取点,换句话说,你可以在这些关键位置插入自己的回调函数,当程序执行到这里时,注册的回调函数就会被调用。主要的截取点包括:
- ClientStateCallback 在创建,连接和关闭client等时候被调用。调用代码在dix/dispatch.c文件中。
- FlushCallback 在函数FlushAllOutput中被调用,调用代码在os/io.c文件中。
- DeviceEventCallback 在有输入事件时被调用,调用代码在dix/events.c文件中。
- EventCallback 在事件被发送到客户端时被调用,与DeviceEventCallback不同的是,这里的事件除了输入事件之外还包括GUI的事件。调用代码在dix/events.c文件中。
- ReplyCallback 在回应客户端时(WriteToClient)时被调用,调用代码在os/io.c文件中。
- GSkippedRequestsCallback 在SkipRequests里被调用,不过没有发现SkipRequests被调用的地方。
- ServerGrabCallback 在ServerGrabCallback/ServerGrabCallback里被调用,调用代码在dix/dispatch.c文件中。
以上每个截取点都有一个回调函数链表,从理论上讲,回调函数的个数是没有限制的,可以在自己的模块中根据需要注册回调函数,X Window提供了下列函数,用于管理回调函数链表。
AddCallback向回调函数链表中注册回调函数。
Bool
AddCallback(pcbl, callback, data)
CallbackListPtr *pcbl;
CallbackProcPtr callback;
pointer data;
DeleteCallback从回调函数链表中注销回调函数。
Bool
DeleteCallback(pcbl, callback, data)
CallbackListPtr *pcbl;
CallbackProcPtr callback;
pointer data;
CallCallbacks 调用回调函数链表中的函数。
void
CallCallbacks(pcbl, call_data)
CallbackListPtr *pcbl;
pointer call_data;
DeleteCallbackList 销毁回调函数链表
void
DeleteCallbackList(pcbl)
CallbackListPtr *pcbl;
示例可以参考Xext/security.c中的实现。
查看本文来源