Chinaunix首页 | 论坛 | 博客
  • 博客访问: 192089
  • 博文数量: 111
  • 博客积分: 3010
  • 博客等级: 中校
  • 技术积分: 1240
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-07 07:46
文章分类

全部博文(111)

文章存档

2015年(2)

2014年(1)

2011年(1)

2010年(7)

2009年(100)

我的朋友

分类: LINUX

2009-08-07 10:04:44


转载时请注明出处和作者联系方式
文章出处:http://www.limodev.cn/blog
作者联系方式:李先静

12.X Window扩展机制--截取点

XWindow提供了另外一种扩展机制,可以在一些关键位置设置截取点,换句话说,你可以在这些关键位置插入自己的回调函数,当程序执行到这里时,注册的回调函数就会被调用。主要的截取点包括:

1. ClientStateCallback 在创建,连接和关闭client等时候被调用。调用代码在dix/dispatch.c文件中。
2. FlushCallback 在函数FlushAllOutput中被调用,调用代码在os/io.c文件中。
3. DeviceEventCallback 在有输入事件时被调用,调用代码在dix/events.c文件中。
4. EventCallback 在事件被发送到客户端时被调用,与DeviceEventCallback不同的是,这里的事件除了输入事件之外还包括GUI的事件。调用代码在dix/events.c文件中。
5. ReplyCallback 在回应客户端时(WriteToClient)时被调用,调用代码在os/io.c文件中。
6. GSkippedRequestsCallback 在SkipRequests里被调用,不过没有发现SkipRequests被调用的地方。
7. 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中的实现。

阅读(302) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~