`
jinghuainfo
  • 浏览: 1521071 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

X Window研究笔记(10)

 
阅读更多
X Window研究笔记(10)

转载时请注明出处和作者联系方式
作者联系方式:李先静 <xianjimli at hotmail dot com>

10.X Window扩展机制--扩展(Extension)

XWindow中有大量扩展模块,每个扩展模块完成一组相关的功能,把扩展功能从核心功能中剥离出来,可以大大提高X Server的可配置性和扩展性。扩展模块的实现机制很简单:每一个扩展模块都有一个初始化函数,这个函数在X Window起动时被调用,在这里面会初始化一些该模块的数据结构,然后会调用AddExtension把相关回调函数注册进去。

AddExtension的函数原型如下:


ExtensionEntry
*
AddExtension(
char*name,intNumEvents,intNumErrors,
int(*MainProc)(ClientPtrc1),
int(*SwappedMainProc)(ClientPtrc2),
void(*CloseDownProc)(ExtensionEntry*e),
unsigned
short(*MinorOpcodeProc)(ClientPtrc3))

  1. Name: 插件的名称。
  2. NumEvents: 为扩展保留的事件数。
  3. NumErrors:为扩展保留的错误码数。
  4. MainProc: 扩展的处理函数。
  5. SwappedMainProc: 扩展的处理函数,在处理前先交换字节顺序。
  6. CloseDownProc: 扩展的析构函数。
  7. MinorOpcodeProc: 用来得到子处理号,一般没有什么用处,在出错时,设置到错误信息里。

从AddExtension的实现中,我们很容易看出,扩展其实也是通过前一章所说的ProcVector来实现的。

i=NumExtensions;
newexts
=(ExtensionEntry**)xrealloc(extensions,
(i
+1)*sizeof(ExtensionEntry*));
if(!newexts)
...{
xfree(ext
->name);
xfree(ext);
return((ExtensionEntry*)NULL);
}

NumExtensions
++;
extensions
=newexts;
extensions[i]
=ext;
ext
->index=i;
ext
->base=i+EXTENSION_BASE;
ext
->CloseDown=CloseDownProc;
ext
->MinorOpcode=MinorOpcodeProc;
ProcVector[i
+EXTENSION_BASE]=MainProc;
SwappedProcVector[i
+EXTENSION_BASE]=SwappedMainProc;


从理论上说,框架完全是独立于扩展的,增加增/删扩展不需要修改框架的代码。但实际情况往往不是这样的,有的扩展依赖框架提供一些特殊功能,有的扩展依赖另外一些扩展,所以在X Server的代码中,常常出现很多ifdef之类的宏,这些宏用来控制是否启用某些扩展。

下面我们来看一个实际的例子(render):

在mi/miinitext.c: InitExtensions函数中,RenderExtensionInit函数被调用,RenderExtensionInit的实现如下:

void
RenderExtensionInit(INITARGS)
...{
ExtensionEntry
*extEntry;

if(!PictureType)
return;
if(!PictureFinishInit())
return;
RenderClientPrivateIndex
=AllocateClientPrivateIndex();
if(!AllocateClientPrivate(RenderClientPrivateIndex,
sizeof(RenderClientRec)))
return;
if(!AddCallback(&ClientStateCallback,RenderClientCallback,0))
return;

extEntry
=AddExtension(RENDER_NAME,0,RenderNumberErrors,
ProcRenderDispatch,SProcRenderDispatch,
RenderResetProc,StandardMinorOpcode);
if(!extEntry)
return;
#if0
RenderReqCode
=(CARD8)extEntry->base;
#endif
RenderErrBase
=extEntry->errorBase;
}


ProcRenderDispatch是扩展的主分发函数,它调用子处理函数去完成实际的请求。其中stuff->data是子处理号,以子处理号从ProcRenderVector中找到对应的函数,并调用它。

staticint
ProcRenderDispatch(ClientPtrclient)
...{
REQUEST(xReq);

if(stuff->data<RenderNumberRequests)
return(*ProcRenderVector[stuff->data])(client);
else
returnBadRequest;
}


(待续)

分享到:
评论

相关推荐

    X Window研究笔记

    X Window研究笔记 虽然X Window是一个非常复杂的系统,但只要静下心来分析,通常遇到的问题也是很容易解决的,前年我花了一段时间去研究X Window的实现,我发现了解它的实现后,很多问题都迎刃而解了

    X-window简略笔记

    X-window简略笔记

    X-Window程式设计入门 教程

    X Window 程式设计入门--第一章 什么是 X Window X Window 程式设计入门--第二章 X Programming 的第一步 X Window 程式设计入门--第三章 绘图(Graphic) X Window 程式设计入门--第三章 绘图(Graphic) X Window 程...

    Xwindow程序设计入门

    Xwindow程序设计入门,网上收藏,很好的资料,对了解xwindow编程很有帮助

    X Window 系统使用指南

    X Window System 是一套在各种位元映像显示器 (bitmapped dispalys) 上具有极大可携性 (portable) 的视窗系统 (window system), 它是由麻省理工学院 (MIT)所发展出来. X Windows System ( 本书以後部 份简称为...

    OpenGL for x window (1)

    This practical guide shows X programmers how to construct working 3D applications using OpenGL and how to tightly integrate OpenGL applications with the X Window System. Written by a Silicon Graphics...

    X window 直接渲染架构

    描述X window 直接渲染架构的概念,实现

    X window介绍及启动流程

    对Linux操作系统的桌面环境软件X window的介绍及启动流程

    xwindow程序设计相关资料

    X Window System 是一套在各种位元映像显示器 (bitmapped dispalys) 上具有极大可携性 (portable) 的视窗系统 (window system), 它是由麻省理工学院 (MIT)所发展出来. X Windows System ( 本书以後部 份简称为...

    Linux与X Window系统基础

    Linux与X Window系统基础 Linux与X Window系统基础

    Linux下X-Window系统程序设计简介.pdf

    Linux下X-Window系统程序设计简介.pdf

    X Window 用户指南

    这个文档为Linux用户提供了一些基本的关于理解和配置X-Window系统的信息。 这只是一个入门级别的文档。假设已经有了一个安装好的并且正在工作的 X-Window系统。

    window manager for x

    window manager for x window manager for x window manager for x

    X-Window介绍

    关于X window的介绍。让你了解并熟悉X window。

    xwindow相关包

    Xwindow 是一个非常出色的图形系统,你应该抱怨的是那些不稳定的包装,而不是 Xwindow 本身。

    Xming-X window 工具

    Xming, windows操作系统连接Linux, Unix的x window 工具。

    Window批处理命令学习笔记

    Window批处理命令学习笔记,批处理实用简小工具

    X Window架构与启动代码分析

    一份课程报告,介绍了X-Window的架构体系,并对启动代码做了分析

Global site tag (gtag.js) - Google Analytics