X Window研究笔记(13)



13.X Window扩展机制--客户端勾子函数

扩展模块是X Window的主要扩展方式,前面我们介绍它在X Server中的实现。其实在客户端,X Window也为扩展模块扩展提供了方便,以此可以hook一些重要的功能,很多扩展模块都利用了这种机制。hook接口如下:

X Window研究笔记(13)_bufferX Window研究笔记(13)_扩展_02typedef struct _XExtensionHooks ...{
X Window研究笔记(13)_struct_03    int (*create_gc)(
X Window研究笔记(13)_buffer_04X Window研究笔记(13)_string_05              Display*                  /**//* display */,
X Window研究笔记(13)_buffer_04X Window研究笔记(13)_string_05              GC                        /**//* gc */,
X Window研究笔记(13)_buffer_04X Window研究笔记(13)_string_05              XExtCodes*                /**//* codes */
X Window研究笔记(13)_struct_03); 
X Window研究笔记(13)_struct_03    int (*copy_gc)(
X Window研究笔记(13)_buffer_04X Window研究笔记(13)_string_05              Display*                  /**//* display */,
X Window研究笔记(13)_buffer_04X Window研究笔记(13)_string_05              GC                        /**//* gc */,
X Window研究笔记(13)_buffer_04X Window研究笔记(13)_string_05              XExtCodes*                /**//* codes */
X Window研究笔记(13)_struct_03);
X Window研究笔记(13)_struct_03    int (*flush_gc)(
X Window研究笔记(13)_buffer_04X Window研究笔记(13)_string_05              Display*                  /**//* display */,
X Window研究笔记(13)_buffer_04X Window研究笔记(13)_string_05              GC                        /**//* gc */,
X Window研究笔记(13)_buffer_04X Window研究笔记(13)_string_05              XExtCodes*                /**//* codes */
X Window研究笔记(13)_struct_03);
X Window研究笔记(13)_struct_03    int (*free_gc)(
X Window研究笔记(13)_buffer_04X Window研究笔记(13)_string_05              Display*                  /**//* display */,
X Window研究笔记(13)_buffer_04X Window研究笔记(13)_string_05              GC                        /**//* gc */,
X Window研究笔记(13)_buffer_04X Window研究笔记(13)_string_05              XExtCodes*                /**//* codes */
X Window研究笔记(13)_struct_03);
X Window研究笔记(13)_struct_03    int (*create_font)(
X Window研究笔记(13)_buffer_04X Window研究笔记(13)_string_05              Display*                  /**//* display */,
X Window研究笔记(13)_buffer_04X Window研究笔记(13)_string_05              XFontStruct*              /**//* fs */,
X Window研究笔记(13)_buffer_04X Window研究笔记(13)_string_05              XExtCodes*                /**//* codes */
X Window研究笔记(13)_struct_03);
X Window研究笔记(13)_struct_03    int (*free_font)(
X Window研究笔记(13)_buffer_04X Window研究笔记(13)_string_05              Display*                  /**//* display */,
X Window研究笔记(13)_buffer_04X Window研究笔记(13)_string_05              XFontStruct*              /**//* fs */,
X Window研究笔记(13)_buffer_04X Window研究笔记(13)_string_05              XExtCodes*                /**//* codes */
X Window研究笔记(13)_struct_03);
X Window研究笔记(13)_struct_03    int (*close_display)(
X Window研究笔记(13)_buffer_04X Window研究笔记(13)_string_05              Display*                  /**//* display */,
X Window研究笔记(13)_buffer_04X Window研究笔记(13)_string_05              XExtCodes*                /**//* codes */
X Window研究笔记(13)_struct_03);
X Window研究笔记(13)_struct_03Bool (*wire_to_event)(
X Window研究笔记(13)_buffer_04X Window研究笔记(13)_string_05               Display*                 /**//* display */,
X Window研究笔记(13)_buffer_04X Window研究笔记(13)_string_05               XEvent*                  /**//* re */,
X Window研究笔记(13)_buffer_04X Window研究笔记(13)_string_05               xEvent*                  /**//* event */
X Window研究笔记(13)_struct_03);
X Window研究笔记(13)_struct_03    Status (*event_to_wire)(
X Window研究笔记(13)_buffer_04X Window研究笔记(13)_string_05              Display*                  /**//* display */,
X Window研究笔记(13)_buffer_04X Window研究笔记(13)_string_05              XEvent*                   /**//* re */,
X Window研究笔记(13)_buffer_04X Window研究笔记(13)_string_05              xEvent*                   /**//* event */
X Window研究笔记(13)_struct_03);
X Window研究笔记(13)_struct_03    int (*error)(
X Window研究笔记(13)_buffer_04X Window研究笔记(13)_string_05              Display*                  /**//* display */,
X Window研究笔记(13)_buffer_04X Window研究笔记(13)_string_05              xError*                   /**//* err */,
X Window研究笔记(13)_buffer_04X Window研究笔记(13)_string_05              XExtCodes*                /**//* codes */,
X Window研究笔记(13)_buffer_04X Window研究笔记(13)_string_05              int*                      /**//* ret_code */
X Window研究笔记(13)_struct_03);
X Window研究笔记(13)_struct_03    char *(*error_string)(
X Window研究笔记(13)_buffer_04X Window研究笔记(13)_string_05                Display*                /**//* display */,
X Window研究笔记(13)_buffer_04X Window研究笔记(13)_string_05                int                     /**//* code */,
X Window研究笔记(13)_buffer_04X Window研究笔记(13)_string_05                XExtCodes*              /**//* codes */,
X Window研究笔记(13)_buffer_04X Window研究笔记(13)_string_05                char*                   /**//* buffer */,
X Window研究笔记(13)_buffer_04X Window研究笔记(13)_string_05                int                     /**//* nbytes */
X Window研究笔记(13)_struct_03);
X Window研究笔记(13)_string_95} XExtensionHooks;


在上面这些函数中,close_display(关闭DISPLAY时被调用),wire_to_event(发现事件时被调用)和 event_to_wire(发出事件时被调用)三个函数使用最为频繁。

示例可以参考lib/Xext中的代码。

(待续)