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

X Window研究笔记(9)

 
阅读更多
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的实现:

IntSProcCreateWindow(ClientPtrclient)
...{
charn;

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研究笔记

    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