Xlib 窗口属性.docx
- 文档编号:14427023
- 上传时间:2023-04-23
- 格式:DOCX
- 页数:47
- 大小:36.86KB
Xlib 窗口属性.docx
《Xlib 窗口属性.docx》由会员分享,可在线阅读,更多相关《Xlib 窗口属性.docx(47页珍藏版)》请在冰豆网上搜索。
Xlib窗口属性
Xlib窗口属性
Xlib
窗口属性
所有的InputOutput窗口都可以有零个或者多个像素的边框宽度,一个可选的背景,一个事件压制掩码(它压制来自孩子的事件传播),和一个property列表。
窗口的边框和背景可以是一个实心颜色或者是一个称为平铺的调色板。
除了根窗口之外的所有的窗口都有父亲并且都是由它们的父亲所裁剪。
如果一个窗口是在压栈压在另一个窗口的上面,它遮挡用于输入的其它窗口。
如果一个窗口有背景(大多数都有),它遮挡其它用于输出的窗口。
尝试输出到被遮挡的区域将不起任何作用,并且对于被遮挡区域不会生成输入事件。
窗口也会与property列表相关联。
InputOutput和InputOnly窗口都有下面的共同属性,但是InputOnly窗口只有这些属性:
win-gravity
event-mask
do-not-propagate-mask
override-redirect
cursor
如果你为一个InputOnly窗口指定任何其它的属性,就会产生一个BadMatch错误。
InputOnly窗口是用于在不必要使用InputOutput窗口的情况下控制输入事件的。
InputOnly窗口是不可见的;可能只被用于控制像光标、输入事件生成以及捕获等的一些东西;并且不能用在任何图形请求中。
注意InputOnly窗口不能作为InputOutput窗口的下级窗口。
窗口有可编程宽度的边框和调色板以及背景调色板或者平铺贴片。
像素值可以用作实心颜色。
如果没有产生更进一步对它们明确地引用,那么背景和边框位图可以在创建窗口之后立即释放。
调色板要么可以与它的父亲有关,要么完全无关。
如果ParentRelative,就会使用父亲的背景。
当窗口是第一次创建,它们在屏幕上并不可见(还没有被映射)。
对于在屏幕上不可见并且没有回填窗口的任何输出都将会被丢弃。
某个应用程序可能希望在窗口被映射到屏幕之前很久创建这个窗口。
当窗口最终被映射到屏幕上(使用XMapWindow),如果并没有维护回填,Xserver为窗口生成Expose事件。
窗口管理器可以覆盖你为顶层窗口选择的大小、边框宽度和位置。
你的程序必须准备使用顶层窗口的实际大小和位置。
对于客户应用程序而言去重新改变它自己的大小是不可接受的,除非是为了直接响应人的指令才这么做。
而是你的程序要么使用给它的空间,要么如果对于任何有用的工作而言空间太小的话,你的程序可能要求用户去改变窗口的大小。
对于窗口管理器而言,你的顶层窗口的边框被认为是可以改变的。
要设置窗口的属性,设置XSetWindowAttributes结构适当的成员,并且与你随后调用XCreateWindow和XChangeWindowAttributes中对应的值位掩码做或(OR)运算,或者使用任何设置适当属性的其它便利函数之一。
用于值掩码位的符号和XSetWindowAttributes结构是:
/*Windowattributevaluemaskbits*/
#defineCWBackPixmap(1L<<0)
#defineCWBackPixel(1L<<1)
#defineCWBorderPixmap(1L<<2)
#defineCWBorderPixel(1L<<3)
#defineCWBitGravity(1L<<4)
#defineCWWinGravity(1L<<5)
#defineCWBackingStore(1L<<6)
#defineCWBackingPlanes(1L<<7)
#defineCWBackingPixel(1L<<8)
#defineCWOverrideRedirect(1L<<9)
#defineCWSaveUnder(1L<<10)
#defineCWEventMask(1L<<11)
#defineCWDontPropagate(1L<<12)
#defineCWColormap(1L<<13)
#defineCWCursor(1L<<14)
/*Values*/
typedefstruct{
Pixmapbackground_pixmap;
unsignedlongbackground_pixel;
Pixmapborder_pixmap;
unsignedlongborder_pixel;
intbit_gravity;
intwin_gravity;
intbacking_store;
unsignedlongbacking_planes;
usnginedlongbakcing_pixel;
Boolsave_under;
longevent_mask;
longdo_not_propagate_mask;
Booloverride_redirect;
Colormapcolormap;
Cursorcursor;
}XSetWindowAttributes;
下面列出了每一个窗口属性的缺省值并且标志着这个属性对于InputOutput和InputOnly窗口而言是否可以接受:
属性缺省值InputOutputInputOnly
background-pixmapNoneYesNo
background-pixelUndefinedYesNo
border-pixmapCopyFromParentYesNo
border-pixelUndefinedYesNo
bit-gravityForgetGravityYesNo
win-gravityNorthWestGravityYesYes
backing-storeNotUsefulYesNo
backing-planesAllonesYesNo
backing-pixelzeroYesNo
save-underFalseYesNo
event-maskemptysetYesYes
do-not-propagate-maskemptysetYesYes
override-redirectFalseYesYes
colormapCopyFromParentYesNo
cursorNoneYesYes
背景属性
只有InputOutput窗口可以有背景。
你可以通过使用像素或者位图来设置InputOutput窗口的背景。
窗口的background-pixmap属性指定的位图被用于窗口的背景。
这个位图可以是任何大小,尽管一些大小可以比另一些快。
窗口的background-pixel属性指定用于以一种单一颜色绘制窗口的背景。
你可以将background-pixmap设置成一个位图、None(缺省)或者ParentRelative。
你可以将窗口的background-pixel设置成任何像素值(没有缺省值)。
如果你指定了background-pixel,它要么覆盖缺省的background-pixmap,要么覆盖你可能在background-pixmap中设置的任何值。
用background-pixel填充的未定义大小的pixmap用作背景。
对背景像素并不进行范围检查;它简单地截取成适当的位数。
如果你设置background-pixmap,它覆盖缺省值。
这个background-pixmap和窗口必须有相同的深度,或者产生BadMatch错误。
如果你将background-pixmap设为None,窗口就没有定义的背景。
如果你将background-pixmap设置为ParentRelative:
使用父窗口的background-pixmap。
不过,子窗口必须与其父亲有相同的深度,或者产生BadMatch错误。
如果父窗口的background-pixmap为None,那么窗口的background-pixmap也是None。
背景平铺的原点总是与父窗口的背景平铺原点对齐。
如果background-pixmap并不是ParentRelative,背景平铺原点就是子窗口的原点。
是通过设置background-pixmap或者background-pixel来设置新背景,都覆盖任何以前的背景。
如果没有对它进一步明确的引用(Xserver将在需要的时候保持一份拷贝来使用)的话,background-pixmap可以立即被释放。
如果你随后将位图用于背景的话,结果是未定义的,因为X实现是自由地创建位图的副本或者使用相同的位图。
当窗口的区域并没有有效的内容时,并且要么区域是可见的,要么服务器正在维护回填,服务器自动地用窗口背景平铺区域,除非窗口的背景为None。
如果背景是None,来自其它与这个窗口具有相同深度窗口的前一屏内容被简单地留在适当的位置,只要内容是来自这个窗口父亲或者父亲的后继。
否则被暴露区域的内容是未定义的。
随后为这个区域生成Expose事件,即使background-pixmap是None。
边框属性
只有InputOnly窗口可以有边框。
你可以通过使用像素或者位图来设置InputOutput窗口的边框。
窗口的border-pixmap属性指定用于窗口边框的位图。
窗口的border-pixel属性指定由用于窗口边框的像素填充的未定义大小的位图。
在背景像素上不必执行范围检查;它简单地截取成合适的位数。
边框平铺的原点总是与背景平铺原点一样。
你也可以将border-pixmap设置为任意大小的位图(一些可能比另一些快)或者CopyFromParent(缺省)。
你可以将border-pixel设置为任何像素值(非缺省)。
如果你设置border-pixmap,它覆盖缺省值。
这个border-pixmap和窗口必须有相同的深度,或者产生BadMatch错误。
如果你将border-pixmap设置为CopyFromParent,父窗口的border-pixmap就会被复制。
对父窗口边框属性的后续更改并不会影响子窗口。
不过,子窗口与父窗口必须有相同的深度,或者产生BadMatch错误。
如果没有更进一步对这个border-pixmap的引用,它可立即释放它。
如果你随后将位图用于边框,后果是未定义的,因为X实现对于是创建一个位图的副本还是使用相同的位图是自由的。
如果你指定一个border-pixel,它要么覆盖缺省的border-pixmap,要么你可以将border-pixmap设置成任何值。
在窗口边框中的所有像素都将被设置为border-pixel。
不论是通过设置border-pixel还是通过设置border-pixmap来设置新边框,都会覆盖前面的边框。
向一个窗口输出总是会在这个窗口的范围以内进行裁剪。
因此,图形操作从不会影响窗口边框。
OverrideRedirect标志
要控制窗口的放置或者增加装饰,窗口管理器常常需要解释(重定向)任何映射或者配置请求。
不过,弹出式窗口常常需要被映射但无须窗口管理器这样做。
要控制InputOutput或者InputOnly窗口是否忽略这些结构控制功能,使用override-redirect标志。
Override-redirect标志指定在这个窗口上的映射和配置是否应当在覆盖其父窗口的SubstructureRedirectMask。
你可以将override-redirect标志设置为True或者False(缺省)。
窗口管理器使用这个信息以避免影响弹出式窗口。
控制输入焦点
Xlib提供了可用于移动鼠标指针位置以及设置和获取输入焦点的函数。
要将鼠标指针移动到屏幕上的任意一处时,使用XWarpPointer。
XWarpPointer(display,src_w,dest_w,src_x,src_y,src_width,src_height,dest_x,dest_y)
Display*display;
Windowscr_w,dest_w;
intsrc_x,src_y;
unsignedintsrc_width,src_height;
intdest_x,dest_y;
要设置焦点,使用XSetInputFocus。
XSetInputFocus(display,focus,revert_to,time)
Display*display;
Windowfocus;
intrevert_to;
Timetime;
display指定要连接到的Xserver。
focus指定的窗口、PointerRoot、或者None。
revert_to如果窗口变得不可视的话,其指定输入焦点应该回到何处。
你可以指定RevertToParent、RevertToRoot、或者RevertToNone。
time指定时间。
你可以发送一个时间戳或者CurrentTime。
XSetInputFocus函数改变输入焦点和last-focus-change时间。
如果指定的时间比当前last-focus-change时间还早或者比当前Xserver时间还晚的话,它不产生任何影响。
否则,last-focus-change时间就被设置为指定的时间(CurrentTime由当前Xserver时间所取代)。
XSetInputFocus导致Xserver生成FocusIn和FocusOut事件。
取决于焦点参数,会发生如下情况:
如果焦点是None,所有的键盘事件都会被丢弃,直到设置了一个新的焦点窗口,并且revert_to参数被忽略。
如果焦点是一个窗口,它就变成键盘的焦点窗口。
如果生成的键盘事件会正常地报告给这个窗口或者它的后代之一的话,那么这个事件报告照常。
否则,事件报告给相关的焦点窗口。
如果焦点是PointerRoot,焦点窗口就动态地趋向于在第一个键盘事件上鼠标指针所指向的任何屏幕的根窗口。
在这种情况下,忽略revert_to参数。
指定的焦点窗口在XSetInputFocus被调用时必须是可视的,或者产生一个BadMatch错误结果。
如果焦点窗口后来变成不可视的话,Xserver会评估revert_to参数来按如下方案决定新的焦点窗口:
如果revert_to是RevertToParent,焦点还原到父窗口(或者最近的可视祖先窗口),并且新的revert_to值变成RevertToNone。
如果revert_to是RevertToPointerRoot或者RevertToNone,焦点分别还原到PointerRoot或者None。
当焦点还原时,Xserver生成FocusIn和FocusOut事件,但是last-focus-change时间并不受影响。
XSetInputFocus可以生成BadMatch、BadValue、以及BadWindow错误。
要获得当前的输入焦点,使用XGetInputFocus。
XGetInputFocus(display,focus_return,revert_to_return)
Display*display;
Window*focus_return;
int*revert_to_return;
映射窗口
如果在一个窗口上已经调用过XMapWindow的话,它就被视作已映射的。
它出于以下几个原因之一在屏幕上可能并不可见:
它是由另外一个不透明的窗口所遮挡。
它的祖先之一并没有被映射。
它整个地被某个祖先所剪切。
当窗口的部分或者全部在屏幕上可见时才生成Exposure事件。
客户程序只有在它已经请求了Expose事件的情况下才能接收到它们。
当窗口被解除映射时,按照栈顺序保留它们的位置。
窗口管理器可能想去控制子窗口的放置。
如果窗口管理器在父窗口(通常是一个根窗口)中已经选择了SubstructureRedirectMask的话,那么由其它客户程序在子窗口上发起的映射请求就不会被执行,并且会向窗口管理器发送一个MapRequest请求。
不过,如果子窗口的override-redirect标志被设置为True(通常只是在弹出菜单上)的话,映射请求会被执行。
一个铺开窗口的窗口管理器可能决定重新定位并且重新调整其它客户程序的窗口大小,然后决定将窗口映射到它的最终位置。
想提供装饰的窗口管理器可能会将子窗口的父属关系重新调整到第一个帧。
只有单个客户程序在一个时间可以选择SubstructureRedirectMask。
类似地,单个的客户程序可以在父窗口上选择ResizeRedirectMask。
然后,其它客户程序对窗口的大小进行调整的尝试都会被压制,并且客户程序会接收到ResizeRequest事件。
要映射一个给定的窗口,使用XMapWindow。
XMapWindow(display,w)
Display*display;
Windoww;
display指定到Xserver的连接。
w指定窗口。
XMapWindow函数映射窗口及其有映射请求的所有子窗口。
映射一个具有未映射祖先的窗口并不能显示这个窗口,而是将它标记为具备在这个祖先变成映射后显示的条件。
这样的窗口称为不可视的。
当它的所有祖先都被映射时,如果这个窗口没有被其它的窗口所遮盖的话,它就变成可视的并且会在屏幕上看见。
如果这个窗口已经被映射过了,这个函数也没有任何影响。
如果窗口的override-redirect是False,并且如果一些其它的客户程序已经在父窗口上选择了SubstructureRedirectMask的话,那么Xserver生成一个MapRequest事件,并且XMapWindow函数并不映射窗口。
否则,窗口会被映射,并且Xserver生成MapNotify事件。
如果窗口变成可视的,并且它早期的内容并没有被记下,Xserver用它的背景平铺这个窗口。
如果窗口的背景没有定义,现有的屏幕内容就不会被更新,并且Xserver生成零个或者多个Expose事件。
如果回填是在窗口没有被映射的时候进行维护,那么就没有Expose事件生成。
如果回填将会在现在维护,全部窗口的暴露就总会被生成。
否则,只有可见的区域会被报告。
类似的平铺和暴露会发生在任何级别的新的可视窗口上。
如果窗口是InputOutput窗口,XMapWindow在每一个它所主导要被显示的InputOutput窗口上生成Expose事件。
如果客户程序映射并且描绘了窗口,并且如果客户程序开始处理事件,那么窗口会被描绘两次。
要避免这一点,首先询问Expose事件,然后映射窗口,以使客户程序正常处理输入事件。
事件列表将为每一个出现在屏幕上的窗口包括Expose。
客户程序对Expose事件的正常响应应当是重绘窗口。
这种方式通常导致更简单的程序以及与窗口管理器之间的正确交互。
XMapWindow可以生成BadWindow错误。
要映射并且提升窗口,使用XMapRaised。
XMapRaised(display,w)
Display*display;
Windoww;
XMapRaised函数本质上是类似于XMapWindow中其映射窗口以及窗口的所有有映射请求的子窗口。
不过,它也提升指定的窗口到显式栈的栈顶。
XMapRaised可以生成多个BadWindow错误。
要为某个指定的窗口映射所有的子窗口,使用XMapSubwindows。
XMapSubwindows(display,w)
Display*display;
Windoww;
XMapSubwindows函数按照从顶到底的栈顺序为指定的窗口映射其所有的子窗口。
Xserver在每一个新显示的窗口上生成Expose事件。
这可能比每次映射许多窗口更加有效,因为server只需要一次就能对所有的窗口,而不是一个窗口执行很多工作。
配置窗口
Xlib提供了可用于移动窗口、重新改变窗口大小、移动并重新改变窗口大小,或者改变窗口边框宽度等的函数。
要改变这些参数之一,设置XWindowChanges结构的恰当成员并且或上(OR)在随后调用的XConfigureWindow中对应的值掩码。
对于值掩码位和XWindowChanges结构的符号是:
/*Configurewindowvaluemaskbits*/
#defineCWX(1<<0)
#defineCWY(1<<1)
#defineCWWidth(1<<2)
#defineCWHeight(1<<3)
#defineCWBorderWidth(1<<4)
#defineCWSibling(1<<5)
#defineCWStackMode(1<<6)
/*Values*/
typedefstruct{
intx,y;
intwidth,height;
intborder_width;
Windowsibling;
intstack_mode;
}XWindowChanges;
成员x和y用于设置窗口的x和y坐标,它是与父窗口的原点有关的,并且指示窗口的左上角的位置。
宽度和高度成员用于设置窗口的内部大小,不包括边框,并且必须非零,或者产生BadValue错误。
尝试配置根窗口不会产生任何效果。
成员border_width成员用于设置以像素为单位的边框宽度。
注意只是设置边框宽度使窗口的外层左上角在一个固定的位置,而移动相对于窗口原点的绝对位置。
如果尝试将InputOnly窗口的边框宽度属性设置为非零,会产生一个BadMatch错误。
成员sibling用于为栈操作设置兄弟窗口。
成员stack_mode成员用于设置窗口如何被重新调整栈位置并且可以被设置为Above、Below、TopIf、BottomIf、或者Opposite。
如果窗口的override-redirect标记是False并且如果一些其它的客户程序在父窗口上选择了Substr
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Xlib 窗口属性 窗口 属性