X Window研究笔记(10)

原创 2007年09月23日 11:00:00
X Window研究笔记(10)

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

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

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

AddExtension的函数原型如下:


ExtensionEntry 
*
AddExtension(
char *name, int NumEvents, int NumErrors,
             
int (*MainProc)(ClientPtr c1),
             
int (*SwappedMainProc)(ClientPtr c2),
             
void (*CloseDownProc)(ExtensionEntry *e),
             unsigned 
short (*MinorOpcodeProc)(ClientPtr c3))

  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;
#if 0
    RenderReqCode 
= (CARD8) extEntry->base;
#endif
    RenderErrBase 
= extEntry->errorBase;
}


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

static int
ProcRenderDispatch (ClientPtr client)
...{
    REQUEST(xReq);

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


(待续)

 
版权声明:本文为博主原创文章,未经博主允许不得转载。

第二十四章、 X Window 配置介绍

在 Linux 上头的图形介面我们称之为 X Window System,简称为 X 或 X11 罗! 为何称之为系统呢?这是因为 X 窗口系统又分为 X server 与 X client ,既然是...
  • mybluetiankong
  • mybluetiankong
  • 2014年03月04日 07:45
  • 3059

习题 4.6 有一个函数:y=x (x<1) y=2x-1 (1<=x<10) y=3x-11 (x>=10) 写程序,输入x的值,输出y相应的值。

C程序设计 (第四版) 谭浩强 习题5.6 个人设计有一个函数:y⎧⎩⎨x2x−13x−11(x...
  • navicheung
  • navicheung
  • 2017年08月06日 11:48
  • 3861

数理统计学习笔记——总体与样本

数理统计是研究大量随机现象规律性的
  • libaqiangdeliba
  • libaqiangdeliba
  • 2014年09月28日 10:29
  • 1140

Window 窗口层次关系

相信在Window 下面编程的很多兄弟们都不是很清楚Window 中窗口的层次关系是怎么样的,这个东西很久已经研究过一下,后来又忘记了,今天又一次遇到了这个问题,所以便整理一下。下面就说说Window...
  • Qsir
  • Qsir
  • 2017年05月16日 13:30
  • 146

X Window编程基础 1

理解 Xwindow 很多人在用 Xwindow,但是他们是在用一些包装掩盖下的 Xwindow,那些包装有些很不稳定,占用大量资源,以至于有人说 Xwindow 是垃圾。其实 Xwindow 是一个...
  • lindyl
  • lindyl
  • 2014年03月01日 09:55
  • 1797

探究X Window System运行原理与启动过程

探究X Window System运行原理与启动过程         第一次在Debian下装XFree86,startx启动了twm,装了gnome 后startx启动了gnome环境,为什么...
  • pojkopj
  • pojkopj
  • 2013年11月15日 17:10
  • 830

大数据学习笔记·研究现状

什么是大数据如果逐字逐句来看两家公司对大数据的定义,你们会发现这两个定义非常相似,其中都提到了大量、高速和多样化的信息;关注发现、分析、洞见和决策制定。我想在某种意义上,在这个高度竞争的社会,创新意味...
  • xiang_freedom
  • xiang_freedom
  • 2016年04月22日 19:29
  • 3971

Linux下的图形界面——X Window的安装

X Window即X Windows图形用户接口,是一种计算机软件系统和网络协议,提供了一个基础的图形用户界面(GUI)和丰富的输入设备能力联网计算机。其中软件编写使用广义的命令集,它创建了一个硬件抽...
  • Wentasy
  • Wentasy
  • 2013年08月04日 09:48
  • 4128

微软2016校园招聘9月在线笔试题解

微软2016校园招聘9月在线笔试题解 题目网址列表:http://hihocoder.com/contest/mstest2015sept2/problems 题目一分析: 问题描述:在二维坐标系中...
  • chen8766250
  • chen8766250
  • 2016年08月04日 15:40
  • 867

Linux启动、关闭x-window

若需要关闭x-window可以在vi /etc/inittab将启动level改成3,若需要界面就改为5在已经没有界面的shell中要启动x-window,可以使用startx命令来启动这是因为Lin...
  • kida_yuan
  • kida_yuan
  • 2016年05月13日 09:12
  • 1332
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:X Window研究笔记(10)
举报原因:
原因补充:

(最多只允许输入30个字)