📄 00000003.htm
字号:
XChangeProperty 会产生一个 PropertyNotify 事件给悬挂该性质的视窗。 <BR> <BR> 性质一旦被应用程式所定义,即使当初定义该性质的应用程式结束,该性质的 <BR> 定义依然有效,除非有下列三种情况之一发生,该性质的定义才会被释放,这 <BR> 三种情况是: <BR> 一、当初定义该性质的应用程式,呼叫 XDeleteProperty 函式删除该性质的 <BR> 定义。 <BR> 二、悬挂该性质的视窗已被关掉(已不存在)。 <BR> 三、和 X 伺服器的连线(connection)已被结束掉。 <BR> <BR> 性质内能存放资料的大小是和伺服器相关的(server-dependent),如果伺服器上 <BR> 的记忆体空间够大的话,可以调整性质内能存放资料的空间大小。 <BR> <BR> <BR>由视窗上的性质中读取资料 <BR> <BR> 当应用程式知道某个视窗上有某个性质时,可以透过呼叫 XGetWindowProperty <BR> 这个函式去读取该视窗上该性质内的资料,其函式的型式如下: <BR> <BR> Display *display; <BR> Window window; <BR> Atom prop_name; <BR> long offset; <BR> long length; <BR> Bool delete; <BR> Atom prop_type; <BR> Atom ret_prop_type; <BR> int ret_format; <BR> unsigned long ret_length; <BR> unsigned long bytes_left; <BR> unsigned char *ret_prop; <BR> <BR> XGetWindowProperty(display, window, prop_name, <BR> offset, length, delete, prop_type, <BR> &ret_prop_type, &ret_format, <BR> &ret_length, &bytes_left, <BR> &ret_prop); <BR> <BR> display 为应用程式和 X 伺服器的连线(connection),通常 X 视窗的 <BR> 应用程式一开始就会建立这条连线。 <BR> window 为悬挂该性质的视窗的视窗识别码。 <BR> prop_name 为该视窗上该性质名字相对应的原子。 <BR> offset 指明应用程式要从那个起始位置读取资料。 <BR> length 指明应用程式一次要读取多少笔资料。。 <BR> delete 表示应用程式在读取性质内的资料後,要不要删除该性质,其值可为 <BR> True 或 False,当 delete 之值为 False 时,表示应用程式在读取完性质内的 <BR> 资料後,不会去删除该性质;当 delete 之值为 True 时,表示应用程式在读取 <BR> 完该性质内的资料後,如果 bytes_left 的值为零(表示性质内已无尚未读取的 <BR> 资料),则删除该视窗上的性质,并产生一个 PropertyNotify 事件给该视窗。 <BR> prop_type 表示应用程式所期望的性质是哪一种资料型态,以原子来表示。 <BR> ret_prop_type 表示该视窗上该性质之真正的资料型态,以原子来表示,此参数 <BR> 是结果回传值。 <BR> ret_format 表示该视窗上该性质内的资料格式,可能的值为 8、16 或 32,此 <BR> 参数是结果回传值。 <BR> ret_length 表示该性质内的资料,如果以 ret_format 的单位来计算,总共有多 <BR> 少笔,此参数是结果回传值。 <BR> bytes_left 表示应用程式在执行一次读取该性质内的资料後,性质内还有多少 <BR> 尚未被读取的资料;如果性质内还有尚未被读取的资料,应用程式可以再呼叫 <BR> XGetWindowProperty 函式去撷取尚未被读取的资料,此参数是结果回传值。 <BR> ret_prop 为指向该性质内资料的一个字元指标,此参数是结果回传值。 <BR> <BR> 如果应用程式指明的性质不在该视窗上,则该函式呼叫完後, ret_prop_type 之值 <BR> 为 None, ret_format 之值为零, bytes_left 之值为零,ret_length <BR> 之值为零。如果应用程式指明的性质的确悬挂在该视窗上,但是应用程式所期望 <BR> 的性质资料型态和该性质的真正资料型态不一致时,则该函式呼叫完後, <BR> ret_prop_type 表明性质真正的资料型态, ret_format 表明性质内的资料格式 <BR> (绝不会为零), bytes_left 表明该性质内有多少个位元组(byte)的资料(即使 <BR> ret_format 的值为 16 或 32), ret_length 之值为零。如果应用程式指明的性质 <BR> 的确悬挂在该视窗上且应用程式所期望的性质资料型态和该性质的真正资料型态一致 <BR> ,或该性质的真正资料型态为 AnyPropertyType 时,则在该函式呼叫完後, <BR> ret_prop_type 表明性质真正的资料型态, ret_format 表明性质内的资料格式 <BR> (绝不会为零),而 ret_length 及 bytes_left 的计算公式如下: <BR> <BR> N = 表示性质内的资料,以位元组来计算的话有多少笔。 <BR> I = 4 * offset (将单位由 long 转换为 byte) <BR> L = min( (N-I) , 4 * length ),如果 L 小於零,则为 BadValue,如果 L <BR> 大於或等於零,则将 L 除以 ret_format 後的值指定给 ret_length。 <BR> bytes_left = N - (I+L) <BR> <BR> 综合上述,可以归纳出: <BR> 一、如果 ret_format 的值为零的话,表示该视窗上没有应用程式所指明的性质。 <BR> 二、如果 ret_format 的值不为零,但是 ret_length 的值为零,表示应用程式 <BR> 所期望的性质资料型态与悬挂在该视窗上性质的真正资料型态不一致。 <BR> 三、如果 bytes_left 的值不为零,表示该性质中还有尚未被取的资料,应用程式 <BR> 应该分段地把性质内的资料全部读取出来。 <BR> <BR> 当 XGetWindowProperty 执行成功时,传回值为 Success(其值为零),失败时 <BR> 传回值为 1 。 <BR> <BR> <BR> <BR>删除性质的定义 <BR> <BR>如果应用程式打算删除性质的定义,可呼叫 XDeleteProperty 来完成这项工作, <BR>其函式的型式如下: <BR> <BR> Display *display; <BR> Widnow window; <BR> Atom prop_name; <BR> <BR> XDeleteProperty(display, window, prop_name); <BR> <BR> display 为应用程式和 X 伺服器的连线(connection),通常 X 视窗的 <BR> 应用程式一开始就会建立这条连线。 <BR> window 为悬挂该性质的视窗的视窗识别码。 <BR> prop_name 为应用程式要删除的性质名字的原子。 <BR> 此函式执行成功後,会送出 PropertyNotify 事件给原来悬挂该性质的 <BR> 视窗。 <BR> <BR> <BR>什麽时候会产生 PropertyNotify 事件 <BR> <BR>在 X 视窗函式呼叫中,共有四个函式呼叫会产生 PropertyNotify 事件, <BR>这四个函式为: <BR>一、 XChangeProperty <BR>二、 XDeleteProperty <BR>三、 XGetWindowProperty <BR>四、 XRotateWindowProperty <BR> <BR>因此,当应用程式叫用其中一个系统呼叫时,需记得其已产生了一个 <BR>PropertyNotify 事件,而选择此事件的事件遮罩(event mask)为 <BR>PropertyChangeMask,应用程式可藉由呼叫 XSelectInput 函式来选择 <BR>PropertyNotify 事件。 <BR> <BR> <BR> <BR>对 PropertyNotify 事件执行相对应的运作程序 <BR> <BR>在 X 视窗系统中,所有的运作都是根据事件发生的与否来决定要不要 <BR>执行相对应的运作程序(operation procedure),即所有的运作都是 <BR>由事件来导动的(event-driven)。在 X 视窗的系统呼叫中,部份的系 <BR>统呼叫会产生特定的事件而後送给特定的视窗,应用程式必须自己决定 <BR>是否对这些事件做出必要的反应。举例来说,在前面所介绍的 X 系统 <BR>呼叫中, XChangeProperty 就会产生一个 PropertyNotify 事件,送给 <BR>悬挂该性质的视窗,此举在通知相关的应用程式,悬挂在该视窗上的性质 <BR>内的资料已被更改或性质已被删除,接下来的就是这些相关的应用程式 <BR>必须决定当 PropertyNotify 事件发生时,要不要执行相对应的运作 <BR>程序,而这相对应的运作程序是由应用程式定义的。因此,如果应用程式 <BR>想知道某视窗上的性质内的资料是否被更动,必须在该视窗的事件回圈 <BR>中选择 (select or solicit) PropertyNotify 事件,以便当 PropertyNotify <BR>事件发生时,能执行其所定义的运作程序。 <BR> <BR> <BR>PropertyNotify 事件的结构 <BR> <BR>PropertyNotify 事件的结构定义如下: <BR> <BR>typedef struct { <BR> int type; <BR> unsigned long serial; <BR> Bool send_event; <BR> Display *display; <BR> Widnow window; <BR> Atom atom; <BR> Time time; <BR> int state; <BR>} XPropertyEvent; <BR> <BR>typedef union _XEvent { <BR> ... <BR> XPropertyEvent xproperty; <BR> ... <BR>} XEvent; <BR> <BR>XPropertyEvent 的各栏位意义如下: <BR>type 为发生的事件型态。 <BR>serial 为上一个被服务的请求的序列编号(serial number),此乃因 X 视窗系统将 <BR> 应用程式送给 X 伺服器的所有请求做了序列化处理(serialization),以 <BR> 避免在存取系统资源时发生竞争现象。 <BR>display 为指向 X 伺服器的连线(connection)。 <BR>window 为悬挂该性质视窗的视窗识别码。 <BR>atom 为该性质名字的原子。 <BR>time 表示性质内的资料被更动时,X 视窗的系统时间。 <BR>state 表示性质的变化状态,其值有二,分别是 <BR> 一、PropertyNewValue 表示性质内的资料是一个新值。 <BR> 二、PropertyDeleted 表示性质的定义已被删除。 <BR> <BR>程式说明 <BR> <BR>程式的发展平台为 Solaris 2.4, Solaris Software Developer Kit, X11R5, <BR>Motif 1.2.3 run time environment。 □例程式有两支,分述如下: <BR> <BR>【 put_to_prop.c 】 <BR> <BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -