📄 00000003.htm
字号:
<HTML><HEAD> <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>发信人: <A HREF="mailto:ccchen@cc.nctu.edu.tw">ccchen@cc.nctu.edu.tw</A> (Smart Dolphin), 信区: xwindow <BR>标 题: X 视窗的资料共享: 性质 <BR>发信站: National Chiao-Tung University, Taiwan (Fri Sep 29 20:15:24 1995) <BR>转信站: phoenix!news.csie.nctu!news.cis.nctu!news.cc.nctu!Netnews.NCTU.edu.Tw! <BR>Origin: ccsun25.cc.nctu.edu.tw <BR> <BR> <BR> <BR>Dear X users, <BR> <BR> 由於陆续有网友写 mail 来索取程式, 所以我决定将文章及程式 <BR> 一并发表在网上的 X Window 讨论群上,本文的著作权为本人所拥有, <BR> 未经本人同意,将本文转载於其他刊物或做修改後发表,均已构成侵权 <BR> 行为,请各位留意,谢谢! <BR> <BR> 本文主旨在讨论 X Window 的 Property,并实地设计了两支程式 <BR> 来探讨 X Window Property 的运作,这机制是 X Window 程式设计中 <BR> 稍微难一点的主题,不过还是希望对有兴趣的读者有所帮助。 <BR> <BR> 我把文章先行列出,程式随後,祝各位研读愉快! <BR> <BR> <BR> <BR> <BR> 陈重嘉 <BR> A maina of X & Unix <BR> <BR> <BR> <BR> <BR> <BR> X 视窗的资料共享:性质 <BR> <BR> <BR> 关键字: <BR> X 视窗系统 X window system <BR> X 伺服器 X server <BR> 机制 mechanism <BR> 性质 property <BR> 原子 atom <BR> 视窗识别码 window id <BR> <BR>导言 <BR> <BR>在 unix 系统中,不同的应用程式要共享或交换资料,可以透过像 <BR>pipe,share memory 等内部程序沟通(InterProcess Communication) <BR>的机制来达成;而在 X 视窗系统中,也提供了类似 unix 内部程序沟 <BR>通的机制,使得不同 X 视窗的应用程式可以共享或交换资料,这机制 <BR>就是 X 视窗系统中的性质(property)。打个比方来说,我们可以把 X <BR>视窗的性质看做是一个可以装填资料的容器,这个容器标明了一个名字 <BR>与其内含值的资料型态,并且将这个容器放在相关应用程式都知道的 <BR>地方,於是这些相关的应用程式就可透过这个容器,来达成资料共享或 <BR>资料交换的目的。本文即就 X 视窗的性质机制作一番研讨,并设计两支 <BR>X 视窗的应用程式,来验证透过性质的机制可使不同的应用程式共享资料。 <BR> <BR> <BR>性质与原子 <BR> <BR>在导言中提到过,性质必须有名字(name)及内含值的资料型态(data type) <BR>,这两者都是以可变长度的字元串来定义的,例如定义一个性质的名字 <BR>(name)为「bdc」,其资料型态(data type)为「bdc_type」。应用程式 <BR>可以自行定义性质的名字与内含值的资料型态,然後再分别将它们转换 <BR>为原子,也可以使用 X 视窗预先为我们定义好的性质名字的原子与资料 <BR>型态的原子,<X11/Xatom.h> 标头档中就包含了这些定义好的原子, <BR>其起始字元串皆为「XA_」,如 XA_STRING,XA_INTEGER 等。而什麽 <BR>是原子呢?我们已经知道性质的名字与内含值的资料型态是以可变长度 <BR>的字元串来定义的,但是在 X 伺服器与应用程式之间,藉由传送整个 <BR>字元串来指定性质的名字与内含值的资料型态是没有效率且浪费网路 <BR>频宽的;因此,X 视窗系统以另一个三十二位元的识别码(32-bit id) <BR>来表示这个字元串,这三十二位元的识别码就是「原子」(atom)。在 <BR>同一个 X 伺服器上,每一个原子都是唯一的(unique),不会有两个 <BR>原子是相同的。 <BR> <BR> <BR>为性质命名 <BR> <BR>应用程式可以使用 X 视窗预先定义的性质名字的原子,如果应用程式 <BR>不打算使用预先定义的性质名字的原子,可以自行定义性质的名字, <BR>然後将它转换为原子。当应用程式为一个性质取定一个名字後,接著 <BR>便是将这个名字转换为 X 伺服器看得懂的原子,转换的工作可藉由呼叫 <BR> XInternAtom 来达成,其函式的型式如下: <BR> <BR> Display *display; <BR> char property_name[]; <BR> Bool only_if_exists; <BR> Atom atom; <BR> <BR> atom = XInternAtom(display, property_name, only_if_exists); <BR> <BR> display 为应用程式和 X 伺服器的连线(connection),通常 X 视窗的 <BR> 应用程式一开始就会建立这条连线。 <BR> property_name 为性质的名字,当应用程式要产生一个新的性质时, <BR> 指定 False 给 only_if_exists;当性质已经存在且已悬挂在某视窗上, <BR> 则指定 True 给 only_if_exists,此时 XInternAtom 会传回该性质名字 <BR> 相对应的原子;但是如果此性质已经不存在,而应用程式又指明 only_if_exists <BR> 之值为 True,此时 XInternAtom 的传回值为 None。在为性质命名时,必须 <BR> 注意名字的大小写是有分别的,如「thing」和「Thing」,分别代表两个不同 <BR> 性质的名字。 <BR> <BR> 如果 XInternAtom 在执行中发生错误,则其传回值为 BadAlloc 或 BadValue。 <BR> 一个应用程式产生一个新的性质,并将它转换为相对应的原子後,即使当初 <BR> 产生该性质的应用程式结束,其性质相对应的原子的定义依然有效,除非 X <BR> 伺服器整个结束掉,这个原子的定义才会被释放。所以 X 视窗的应用程式 <BR> 应该尽量避免使用过量的原子,以节省 X 视窗的系统资源。 <BR> <BR> <BR>指明性质内含值的资料型态 <BR> <BR>性质内含值的资料型态(data type)是以可变长度来定义的,应用程式可 <BR>以使用 X 视窗预先定义的资料型态的原子,也可以自行定义一个字元 <BR>串来表示一个资料型态,然後将它转换为原子,这项转换工亦是透过呼 <BR>叫 XInternAtom 来达成。举例来说,如果应用程式使用预先定义的资 <BR>料型态原子,如 XA_STRING,则应用程式便可免掉呼叫 XInternAtom <BR>的工作,直接使用预先定义的资料型态原子;但是如果应用程式自行定义 <BR>了一个性质的资料型态为「bdc_type」,则应用程式必须呼叫 XInternAtom <BR>函式将「bdc_type」这个字元串转换为原子,以便和 X 伺服器沟通,其 <BR>程式码如下: <BR> <BR> Display *display; <BR> Atom prop_type; <BR> <BR> prop_type = XInternAtom(display, "bdc_type", False); <BR> <BR> <BR> <BR>性质的资料格式 <BR> <BR>每一个的性质都有一个资料格式,其格式的参数值为 8、16 或 32 , <BR>分别表示性质内的资料是以八、十六或三十二位元来储存。 <BR> <BR> <BR>将性质挂在视窗上并存入资料 <BR> <BR>在一般的情况下,不同的应用程要共享、交换资料,最方便的方式是 <BR>将性质挂在根视窗(root window)下,因为每一个 X 伺服器都有一个 <BR>根视窗,这个根视窗是 X 视窗应用程式「都知道的地方」,透过 <BR>DefaultRootWindow 这个巨集呼叫,应用程式可以取得根视窗的视窗 <BR>识别码。另一方式是把性质挂在某个非根视窗的视窗上,而要共享、 <BR>交换资料的相关的应用程式「都要知道这个视窗」,如此才能把资料 <BR>存到这个视窗上的性质中,或从这个视窗上的性质中读取资料。藉由 <BR>呼叫 XChangeProperty 这个函式,可以将性质挂在视窗上,并将资料 <BR>存入性质中, 其函式的型式如下: <BR> <BR> <BR> Display *display; <BR> Window window; <BR> Atom prop_name; <BR> Atom prop_type; <BR> int prop_format; <BR> int prop_mode; <BR> unsigned char *data; <BR> int nbytes; <BR> <BR> XChangeProperty(display, window, prop_name, prop_type, <BR> prop_format, prop_mode, data, nbytes); <BR> <BR> display 为应用程式和 X 伺服器的连线(connection),通常 X 视窗的 <BR> 应用程式一开始就会建立这条连线。 <BR> window 为性质欲悬挂的视窗的视窗识别码。 <BR> prop_name 为性质名字的原子。 <BR> prop_type 为性质资料型态的原子。 <BR> prop_format 指明资料将以何种格式存放於性质内,其允许值为 8、16 或 <BR> 32,如果是 16 或 32,则 XChangeProperty 中的第七个参数 data 必须做 <BR> (char *) 的型态转换(type casting)。prop_format 内的资讯使得 X 伺服器 <BR> 在必要的时候可以做 byte swap operation。 <BR> prop_mode 指明资料的储存方式,其值定义於 <X11/X.h> 中,分述如下: <BR> 一、 PropModeReplace 表示性质中的原有资料完全被新的资料所覆盖。 <BR> 二、 PropModePrepend 表示新的资料是附加於性质中的原有资料的前面。 <BR> 三、 PropModeAppend 表示新的资料是附加於性质中的原有资料的後面。 <BR> data 即为应用程式所要存放於性质中的资料,为一字元指标。 <BR> nbytes 指明 data 中有多少个 byte。 <BR> <BR> XChangeProperty 用来将资料存入悬挂在视窗上的一个性质中,如果指定的 <BR> 性质不存在, 则 XChangeProperty 会自动地产生这个性质。 此外,呼叫 <BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -