X Window研究笔记(9)

原创 2007年09月21日 20:30:00
X Window研究笔记(9)

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

插件式(Plug-in/Add-On)架构如今已经变得非常流行了,Eclipse因把这种技术发挥到极致,而倍受赞誉。这种技术被广泛采用,当然是有它的道理的,可扩展性就是其中好外之一。实际上,这并不是什么新概念,早在20多年前,X Window就采用了类似的设计方法,只是可能很长时间以来,X Window都没有采用目前常用的动态加载机制,结果很多人都以为它是一个巨大的泥团,庞大而混乱,很少有人深入去研究。当然,这只是一种误解,从逻辑上讲,它完全是基于插件式设计。在接下来的几篇文章中,我们介绍一下X Window的扩展机制:

9.X Window扩展机制--核心服务的扩展

X Window的核心服务是放在一个函数表中的,当客户端程序有请求到来时,X Window通过请求号从函数表中找到对应的服务函数,然后调用它,服务函数执行完成后返回结果。函数表其实也是一种抽象,它让框架不必知道实现的功能,扩展功能时,只要修改这个函数表,而不用修改框架。

这个函数表在programs/Xserver/dix/table.c中,其声明如下:

int (* ProcVector[256]) (
        ClientPtr 
/**//* client */
    ) 
=
...{
    ProcBadRequest,
    ProcCreateWindow,
    ProcChangeWindowAttributes,
    ProcGetWindowAttributes,
    ProcDestroyWindow,
    ProcDestroySubwindows,              
/**//* 5 */
    ProcChangeSaveSet,
    ProcReparentWindow,
    ProcMapWindow,
    ProcMapSubwindows,
    ProcUnmapWindow,                    
/**//* 10 */
    ProcUnmapSubwindows,
    ProcConfigureWindow,
    ProcCirculateWindow,
    ProcGetGeometry,
    ProcQueryTree,                      
/**//* 15 */
    ProcInternAtom,
    ProcGetAtomName,
    ProcChangeProperty,
    ProcDeleteProperty,
    ProcGetProperty,                    
/**//* 20 */
    ProcListProperties,
    ProcSetSelectionOwner,
    ProcGetSelectionOwner,
    ProcConvertSelection,
    ProcSendEvent,                      
/**//* 25 */
    ProcGrabPointer,
    ProcUngrabPointer,
    ProcGrabButton,
    ProcUngrabButton,
ProcChangeActivePointerGrab,        
/**//* 30 */
ProcGrabKeyboard,
ProcUngrabKeyboard,
ProcGrabKey,
ProcUngrabKey,
ProcAllowEvents,                    
/**//* 35 */
ProcGrabServer,
ProcUngrabServer,
ProcQueryPointer,
ProcGetMotionEvents,
ProcTranslateCoords,                
/**//* 40 */
ProcWarpPointer,
ProcSetInputFocus,
ProcGetInputFocus,
ProcQueryKeymap,
ProcOpenFont,                       
/**//* 45 */
ProcCloseFont,
ProcQueryFont,
ProcQueryTextExtents,
ProcListFonts,
ProcListFontsWithInfo,              
/**//* 50 */
ProcSetFontPath,
ProcGetFontPath,
ProcCreatePixmap,
ProcFreePixmap,
ProcCreateGC,                       
/**//* 55 */
ProcChangeGC,
ProcCopyGC,
ProcSetDashes,
ProcSetClipRectangles,
ProcFreeGC,                         
/**//* 60 */
ProcClearToBackground,
ProcCopyArea,
ProcCopyPlane,
ProcPolyPoint,
ProcPolyLine,                       
/**//* 65 */
ProcPolySegment,
ProcPolyRectangle,
ProcPolyArc,
ProcFillPoly,
ProcPolyFillRectangle,              
/**//* 70 */
ProcPolyFillArc,
ProcPutImage,
ProcGetImage,
ProcPolyText,
ProcPolyText,                       
/**//* 75 */
ProcImageText8,
ProcImageText16,
ProcCreateColormap,
ProcFreeColormap,
ProcCopyColormapAndFree,            
/**//* 80 */
ProcInstallColormap,
ProcUninstallColormap,
ProcListInstalledColormaps,
ProcAllocColor,
ProcAllocNamedColor,                
/**//* 85 */
ProcAllocColorCells,
ProcAllocColorPlanes,
ProcFreeColors,
ProcStoreColors,
ProcStoreNamedColor,                
/**//* 90 */
ProcQueryColors,
ProcLookupColor,
ProcCreateCursor,
ProcCreateGlyphCursor,
ProcFreeCursor,                     
/**//* 95 */
ProcRecolorCursor,
ProcQueryBestSize,
ProcQueryExtension,
ProcListExtensions,
ProcChangeKeyboardMapping,          
/**//* 100 */
ProcGetKeyboardMapping,
    ProcChangeKeyboardControl,
    ProcGetKeyboardControl,
    ProcBell,
    ProcChangePointerControl,           
/**//* 105 */
    ProcGetPointerControl,
    ProcSetScreenSaver,
    ProcGetScreenSaver,
    ProcChangeHosts,
    ProcListHosts,                      
/**//* 110 */
    ProcChangeAccessControl,
    ProcChangeCloseDownMode,
    ProcKillClient,
    ProcRotateProperties,
    ProcForceScreenSaver,               
/**//* 115 */
    ProcSetPointerMapping,
    ProcGetPointerMapping,
    ProcSetModifierMapping,
    ProcGetModifierMapping,
    
0,                                  /**//* 120 */
    
0,
    
0,
    
0,
    
0,
    
0,                                  /**//* 125 */
    
0,
    ProcNoOperation
}
;


还有一个函数表,叫作SwappedProcVector,它与ProcVector中的函数功能上基本是对应的,特殊之处在于,在调用真正的服务前,先预处理一下请求的数据,客户端程序可能运行在不同字节顺序的机器上,这时候要交换一下数据的字节顺序。我们可以看SProcCreateWindow的实现:

Int SProcCreateWindow(ClientPtr client)
...{  
    
char n;

    REQUEST(xCreateWindowReq);
    swaps(
&stuff->length, n);
    REQUEST_AT_LEAST_SIZE(xCreateWindowReq);
    swapl(
&stuff->wid, n);
    swapl(
&stuff->parent, n);
    swaps(
&stuff->x, n);
    swaps(
&stuff->y, n);
    swaps(
&stuff->width, n);
    swaps(
&stuff->height, n);
    swaps(
&stuff->borderWidth, n);
    swaps(
&stuff->class, n);
    swapl(
&stuff->visual, n);
    swapl(
&stuff->mask, n);
    SwapRestL(stuff);
    
return((* ProcVector[X_CreateWindow])(client));
}


有了这种机制,增加新的功能,只需要增一个处理函数就行了,处理函数并需要知道请求从何而来,何时被调用。相反,要裁剪某些功能,亦只需要从这里拿开这个函数就可以了。当然,实际很少直接修改这个函数表,增加新功能往往是扩展模块来实现,扩展模块最终也是修改这个函数表,这是后话,暂且不提。

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

X Window研究笔记

  • 2010年02月02日 23:07
  • 658KB
  • 下载

《鸟哥的Linux私房菜》读书笔记:X window介绍及启动流程

X Window System简介X Window System是跨网络和操作系统的,其是一个软件。1.主要组件 X Server:硬件管理、屏幕绘制和提供字型功能。 X Client:负责 X Se...

CentOS7学习笔记(2)——X window与文本模式的切换,systemd服务

在Centos7下,可以通过[Ctrl] + [Alt] + [F1] ~ [F6]在X window与文本模式的切换。systemd服务:RHEL/CentOS 7.0中一个最主要的改变,就是切换到...
  • bitsec
  • bitsec
  • 2015年01月30日 11:02
  • 747

Linux 学习笔记 -- 第五部分 Linux 系统管理员 -- 第24章 X Window 设置介绍

X window 设置介绍 什么是X Window System 图形界面 X Window 的发展简史 1.在 UNIX Like 上面的图形用户界面 (GUI) 被称为 ...
  • tedpenk
  • tedpenk
  • 2014年07月07日 10:11
  • 341

Linux与X Window系统基础

  • 2011年12月25日 13:37
  • 47.92MB
  • 下载

X Window Programming From Scratch

  • 2017年11月09日 17:19
  • 2.64MB
  • 下载

Cocos2d-x window开发环境配置安装教程

Cocos2d-x window开发环境配置安装教程 首先:要了解VS2012、VS2013对cocos2d-x各个版本支持区别: VS2012:支持cocos2d-x 2.0、co...

X window介绍及启动流程

  • 2015年06月02日 15:57
  • 2KB
  • 下载

X window 直接渲染架构

  • 2010年12月06日 21:32
  • 575KB
  • 下载

x window 实现原理

1、X Window System采用C/S结构,但和我们常见的C/S不同。常见的C/S结构中,称提供服务的一方为server,即服务器端(如HTTP服务,FTP服务等),使用服务的称为Client,...
  • hxh129
  • hxh129
  • 2012年08月07日 17:03
  • 948
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:X Window研究笔记(9)
举报原因:
原因补充:

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