窗口属性说明
当你使用 xprop 命令获取一个窗口的属性时,你会在终端中看到很多窗口相关的内容。这些属性分别有着不同的作用.
应用窗口属性
_NET_WM_NAME
1 | _NET_WM_NAME、UTF8_STRING |
客户端应该将其设置为 UTF-8 编码的窗口标题。如果设置,窗口管理器应该优先于 WM_NAME 使用它。
_NET_WM_VISIBLE_NAME
1 | _NET_WM_VISIBLE_NAME、UTF8_STRING |
如果窗口管理器显示的窗口名称不是 _NET_WM_NAME,则窗口管理器必须将其设置为以 UTF-8 编码显示的标题。
原理:此属性适用于显示与窗口的 _NET_WM_NAME 或 WM_NAME 不同的标题的窗口管理器(即显示了 xterm <1>、xterm <2>、…,但每个窗口的 _NET_WM_NAME / WM_NAME 仍然是 xterm)从而允许寻呼机显示与窗口管理器相同的标题。
_NET_WM_ICON_NAME
1 | _NET_WM_ICON_NAME、UTF8_STRING |
客户端应该将其设置为 UTF-8 编码的此窗口图标的标题。如果设置,窗口管理器应该优先于 WM_ICON_NAME 使用它。
_NET_WM_VISIBLE_ICON_NAME
1 | _NET_WM_VISIBLE_ICON_NAME,UTF8_STRING |
如果窗口管理器显示的图标名称不是 _NET_WM_ICON_NAME,则窗口管理器必须将其设置为以 UTF-8 编码显示的标题。
_NET_WM_DESKTOP
1 | _NET_WM_DESKTOP desktop, CARDINAL/32 |
Cardinal 确定窗口所在(或希望所在)的桌面,第一个桌面从 0 开始。客户端可以选择不设置这个属性,在这种情况下,窗口管理器应该按照它的意愿放置它。0xFFFFFFFF 表示该窗口应该出现在所有桌面上。
每当撤回的窗口请求映射时,窗口管理器都应遵守 _NET_WM_DESKTOP。
窗口管理器应在窗口退出时移除该属性,但在关闭时应保留该属性,例如响应丢失 WM_Sn 管理器选择的所有权。
基本原理:在窗口撤销时删除该属性有助于想要重用已撤销窗口的遗留应用程序。关闭时不删除该属性允许下一个窗口管理器将窗口恢复到以前的桌面。
客户端可以通过向根窗口发送 _NET_WM_DESKTOP 客户端消息来请求更改未撤消窗口的桌面:
1 | _NET_WM_DESKTOP |
有关源指示的详细信息,请参阅“请求中的源指示”一节。窗口管理器必须在所有窗口上更新此属性。
_NET_WM_WINDOW_TYPE
1 | _NET_WM_WINDOW_TYPE, ATOM[]/32 |
这应该在映射到指示窗口功能类型的原子列表之前由客户端设置。窗口管理器应该使用此属性来确定窗口的装饰、堆叠位置和其他行为。客户端应该按优先级顺序指定窗口类型(第一个是最可取的),但必须包括以下列表中的至少一个基本窗口类型原子。这是为了允许扩展类型列表,同时为无法识别扩展的窗口管理器提供默认行为。
此提示也应该为覆盖重定向窗口设置,以允许合成管理器将一致的装饰应用于菜单、工具提示等。
基本原理:此提示旨在替换 MOTIF 提示。对 MOTIF 提示的反对意见之一是它们纯粹是对窗户装饰的视觉描述。通过描述窗口的功能,窗口管理器可以对相同类型的窗口应用一致的装饰和行为。可能的行为示例包括将停靠栏/面板保持在顶部或仅在另一个窗口具有焦点时才隐藏可固定菜单/工具栏(NextStep 样式)。
1 | _NET_WM_WINDOW_TYPE_DESKTOP,ATOM |
_NET_WM_WINDOW_TYPE_DESKTOP 表示桌面功能。这可以包括一个包含与屏幕尺寸相同的桌面图标的单个窗口,允许桌面环境完全控制桌面,而无需代理根窗口点击。
_NET_WM_WINDOW_TYPE_DOCK 表示停靠或面板功能。通常,窗口管理器会将此类窗口保留在所有其他窗口之上。
_NET_WM_WINDOW_TYPE_TOOLBAR 和 _NET_WM_WINDOW_TYPE_MENU 分别表示工具栏和可固定菜单窗口(即从主应用程序“撕下”的工具栏和菜单)。这种类型的窗口可以设置 WM_TRANSIENT_FOR 提示,指示主应用程序窗口。请注意,_NET_WM_WINDOW_TYPE_MENU 应设置在撕下的托管窗口上,其中 _NET_WM_WINDOW_TYPE_DROPDOWN_MENU 和 _NET_WM_WINDOW_TYPE_POPUP_MENU 通常用于覆盖重定向窗口。
_NET_WM_WINDOW_TYPE_UTILITY 表示小的持久实用程序窗口,例如调色板或工具箱。它不同于 TOOLBAR 类型,因为它不对应于从主应用程序中撕下的工具栏。它与 DIALOG 类型不同,因为它不是临时对话框,用户可能会在他们工作时保持打开状态。这种类型的窗口可以设置 WM_TRANSIENT_FOR 提示,指示主应用程序窗口。
_NET_WM_WINDOW_TYPE_SPLASH 表示该窗口是应用程序启动时显示的启动画面。
_NET_WM_WINDOW_TYPE_DIALOG 表示这是一个对话窗口。如果未设置 _NET_WM_WINDOW_TYPE,则必须将设置了 WM_TRANSIENT_FOR 的托管窗口视为这种类型。使用 WM_TRANSIENT_FOR 覆盖重定向窗口,但没有 _NET_WM_WINDOW_TYPE 必须被视为 _NET_WM_WINDOW_TYPE_NORMAL。
_NET_WM_WINDOW_TYPE_DROPDOWN_MENU 表示所讨论的窗口是下拉菜单,即通常在用户单击菜单栏时出现的那种菜单,而不是通常在用户右键单击对象时出现的弹出菜单。此属性通常用于覆盖重定向窗口。
_NET_WM_WINDOW_TYPE_POPUP_MENU 表示有问题的窗口是一个弹出菜单,即当用户右键单击一个对象时通常会出现的那种菜单,而不是通常在用户单击菜单栏时出现的下拉菜单。此属性通常用于覆盖重定向窗口。
_NET_WM_WINDOW_TYPE_TOOLTIP 表示有问题的窗口是工具提示,即通常在鼠标光标悬停在对象上一段时间后出现的一小段解释性文本。此属性通常用于覆盖重定向窗口。
_NET_WM_WINDOW_TYPE_NOTIFICATION 表示通知。通知的一个示例是出现带有信息文本的气泡,例如“您的笔记本电脑电量不足”等。此属性通常用于覆盖重定向窗口。
_NET_WM_WINDOW_TYPE_COMBO 应该用在组合框弹出的窗口上。一个示例是出现在文本字段下方的窗口,其中包含建议完成的列表。此属性通常用于覆盖重定向窗口。
_NET_WM_WINDOW_TYPE_DND 表示正在拖动窗口。当有问题的窗口包含一个对象从一个地方拖到另一个地方的表示时,客户应该设置这个提示。一个例子是一个包含从一个文件管理器窗口拖到另一个文件管理器窗口的图标的窗口。此属性通常用于覆盖重定向窗口。
_NET_WM_WINDOW_TYPE_NORMAL 表示这是一个普通的顶级窗口,无论是托管还是覆盖重定向。必须将既没有 _NET_WM_WINDOW_TYPE 也没有设置 WM_TRANSIENT_FOR 的托管窗口视为这种类型。没有 _NET_WM_WINDOW_TYPE 的覆盖重定向窗口必须被视为这种类型,无论它们是否设置了 WM_TRANSIENT_FOR。
_NET_WM_STATE
1 | _NET_WM_STATE, ATOM[] |
描述窗口状态的提示列表。列表中存在的原子必须被视为已设置,列表中不存在的原子必须被视为未设置。每当撤回的窗口请求映射时,窗口管理器都应该遵守 _NET_WM_STATE。希望更改窗口状态的客户端必须向根窗口发送 _NET_WM_STATE 客户端消息(见下文)。窗口管理器必须保持此属性更新以反映窗口的当前状态。
窗口管理器应在窗口退出时删除该属性,但在关闭时应保留该属性,例如响应失去 WM_Sn 管理器选择的所有权。
基本原理:在窗口撤销时删除该属性有助于想要重用已撤销窗口的遗留应用程序。关闭时不删除该属性允许下一个窗口管理器将窗口恢复到以前的状态。
可能的原子是:
1 | _NET_WM_STATE_MODAL,ATOM |
一个实现可以向这个列表添加新的原子。没有扩展的实现必须忽略任何未知原子,有效地将它们从列表中删除。这些扩展原子不能以前缀 _NET 开头。
_NET_WM_STATE_MODAL 表示这是一个模式对话框。如果 WM_TRANSIENT_FOR 提示设置为另一个顶级窗口,则该对话框是该窗口的模态对话框;如果 WM_TRANSIENT_FOR 未设置或设置为根窗口,则对话框是其窗口组的模态对话框。
_NET_WM_STATE_STICKY 表示窗口管理器应该保持窗口在屏幕上的位置固定,即使虚拟桌面滚动时也是如此。
NET_WM_STATE_MAXIMIZED{VERT,HORZ} 表示窗口{vertically,horizontally}最大化。
_NET_WM_STATE_SHADED 表示窗口是阴影的。
_NET_WM_STATE_SKIP_TASKBAR 指示窗口不应包含在任务栏上。该提示应由应用程序请求,即它表明该窗口本质上从不在任务栏中。如果 _NET_WM_WINDOW_TYPE 已经传达了窗口的确切性质,则应用程序不应设置此提示。
_NET_WM_STATE_SKIP_PAGER 表示该窗口不应包含在寻呼机中。这个提示应该由应用程序请求,即它表明窗口本质上从不在寻呼机中。如果 _NET_WM_WINDOW_TYPE 已经传达了窗口的确切性质,则应用程序不应设置此提示。
_NET_WM_STATE_HIDDEN 应由窗口管理器设置,以指示如果窗口的桌面/视口处于活动状态且其坐标在屏幕边界内,则该窗口在屏幕上不可见。典型的例子是最小化的窗口应该处于 _NET_WM_STATE_HIDDEN 状态。寻呼机和类似的应用程序应该使用 _NET_WM_STATE_HIDDEN 而不是 WM_STATE 来决定是否以桌面上窗口的微型表示形式显示窗口。
实现说明:如果应用程序要求切换 _NET_WM_STATE_HIDDEN,则窗口管理器可能应该忽略该请求,因为 _NET_WM_STATE_HIDDEN 是窗口其他方面的函数,例如最小化,而不是独立状态。
_NET_WM_STATE_FULLSCREEN 表示窗口应该填满整个屏幕并且没有窗口装饰。此外,窗口管理器负责在从全屏切换回普通窗口后恢复原始几何图形。例如,演示程序将使用此提示。
_NET_WM_STATE_ABOVE 表示窗口应该在大多数窗口的顶部(有关详细信息,请参阅“堆叠顺序”一节)。
_NET_WM_STATE_BELOW 表示该窗口应位于大多数窗口下方(有关详细信息,请参阅“堆叠顺序”部分)。
_NET_WM_STATE_ABOVE 和 _NET_WM_STATE_BELOW 主要用于用户首选项,不应由应用程序使用,例如用于引起对其对话框的注意(在这种情况下应使用紧急提示,请参阅名为“紧急”的部分)。
_NET_WM_STATE_DEMANDS_ATTENTION 表示在窗口内或窗口中发生了某些操作。例如,如果窗口请求激活但窗口管理器拒绝它,则它可能由窗口管理器设置,或者如果应用程序完成了某些工作,则它可以设置它。这种状态可以由客户端和窗口管理器设置。当窗口管理器决定窗口得到所需的关注(通常,它被激活)时,它应该被取消设置。
要更改映射窗口的状态,客户端必须向根窗口发送 _NET_WM_STATE 客户端消息:
1 | window = the respective client window |
此消息允许同时更改两个属性,特别是允许同时更改水平和垂直最大化。如果仅更改一个属性,则 l[2] 必须设置为零。有关源指示的详细信息,请参阅“请求中的源指示”一节。l[0],动作,必须是以下之一:
1 | _NET_WM_STATE_REMOVE 0 /* remove/unset property */ |
_NET_WM_ALLOWED_ACTIONS
1 | _NET_WM_ALLOWED_ACTIONS, ATOM[] |
指示窗口管理器支持此窗口的用户操作的原子列表。列表中存在的原子表示允许的操作,列表中不存在的原子表示此窗口不支持的操作。窗口管理器必须保持该属性更新以反映当前对窗口“活动”或“敏感”的操作。任务栏、寻呼机和其他工具使用 _NET_WM_ALLOWED_ACTIONS 来决定应向用户提供哪些操作。
可能的原子是:
1 | _NET_WM_ACTION_MOVE,ATOM |
一个实现可以向这个列表添加新的原子。没有扩展的实现必须忽略任何未知原子,有效地将它们从列表中删除。这些扩展原子不能以前缀 _NET 开头。
请注意,此处列出的操作是_窗口管理器_将为此窗口执行的操作。仍然必须通过本规范中概述的正常机制来请求操作。例如,_NET_WM_ACTION_CLOSE 并不意味着客户端可以向该窗口发送 WM_DELETE_WINDOW 消息;这意味着客户端可以使用 _NET_CLOSE_WINDOW 消息来要求窗口管理器这样做。
窗口管理器在最初管理窗口时应该忽略 _NET_WM_ALLOWED_ACTIONS 的值。这个值可能是以前的具有不同策略的窗口管理器遗留下来的。
_NET_WM_ACTION_MOVE 表示窗口可以在屏幕上移动。
_NET_WM_ACTION_RESIZE 表示可以调整窗口大小。(实施说明:窗口管理器可以识别不可调整大小的窗口,因为它在 WM_NORMAL_HINTS 中的最小和最大大小将相同。)
_NET_WM_ACTION_MINIMIZE 表示窗口可以被图标化。
_NET_WM_ACTION_SHADE 表示窗口可能有阴影。
_NET_WM_ACTION_STICK 表示窗口可能会切换其粘性状态(如 _NET_WM_STATE_STICKY)。请注意,此状态与视口有关,而不是桌面。
_NET_WM_ACTION_MAXIMIZE_HORZ 表示窗口可以水平最大化。
_NET_WM_ACTION_MAXIMIZE_VERT 表示窗口可以垂直最大化。
_NET_WM_ACTION_FULLSCREEN 表示窗口可以进入全屏状态。
_NET_WM_ACTION_CHANGE_DESKTOP 表示窗口可以在桌面之间移动。
_NET_WM_ACTION_CLOSE 表示窗口可以关闭(即可以发送_NET_CLOSE_WINDOW 消息)。
_NET_WM_ACTION_ABOVE 表示窗口可以放置在窗口的“above”层(即会响应_NET_WM_STATE_ABOVE 的变化;详见“堆叠顺序”一节)。
_NET_WM_ACTION_BELOW 表示窗口可以放置在窗口的“下”层(即将响应 _NET_WM_STATE_BELOW 更改;有关详细信息,另请参阅“堆叠顺序”部分))。
_NET_WM_STRUT
1 | _NET_WM_STRUT, left, right, top, bottom, CARDINAL[4]/32 |
此属性等效于 _NET_WM_STRUT_PARTIAL 属性,其中所有起始值为 0,所有结束值为逻辑屏幕的高度或宽度。_NET_WM_STRUT_PARTIAL 是在 _NET_WM_STRUT 之后引入的,因此,除了 _NET_WM_STRUT_PARTIAL 之外,客户端还可以设置此属性,以确保与支持旧版本规范的窗口管理器向后兼容。
_NET_WM_STRUT_PARTIAL
1 | _NET_WM_STRUT_PARTIAL, left, right, top, bottom, left_start_y, left_end_y, |
如果窗口要在屏幕边缘保留空间,则该属性必须由客户端设置。该属性包含 4 个基数,指定屏幕每个边框处保留区域的宽度,另外 8 个基数指定与四个支柱中的每一个相对应的开始和结束。值的顺序是左、右、上、下、left_start_y、left_end_y、right_start_y、right_end_y、top_start_x、top_end_x、bottom_start_x、bottom_end_x。所有坐标都是根窗口坐标。客户端可以随时更改此属性,因此如果窗口管理器使用此属性为窗口分配特殊语义,则窗口管理器必须监视属性通知事件。
如果此属性和 _NET_WM_STRUT 属性都设置,则窗口管理器必须忽略 _NET_WM_STRUT 属性值并使用 _NET_WM_STRUT_PARTIAL 的值。这将确保客户端可以安全地设置这两个属性,而不会放弃新属性的改进语义。
struts 的目的是在桌面边界保留空间。例如,这对于停靠区域、任务栏或面板非常有用。窗口管理器在限制窗口位置时应该考虑这个保留区域——例如,最大化的窗口不应覆盖该区域。
与每个支柱相关联的开始和结束值允许保留不跨越整个屏幕宽度或高度的区域。Struts 必须在根窗口坐标中指定,也就是说,它们 _不_相对于任何视口或 Xinerama 监视器的边缘。
例如,对于出现在屏幕底部的面板样式的客户端,高 50 像素,占据屏幕边缘左侧 200-600 像素的空间,将底部支柱设置为 50,并将 bottom_start_x 设置为 200和bottom_end_x 到600。另一个例子是使用Xinerama 扩展的屏幕面板。假设设置使用两台显示器,一台以 1280x1024 运行,另一台以 1024x768 运行在右侧,两个物理显示器的顶部边缘对齐。如果面板想要用 50 像素高的面板填充较小显示器的整个底部边缘,则应设置底部支柱为 306,bottom_start_x 为 1280,bottom_end_x 为 2303。请注意,支柱是相对于屏幕边缘的,而不是 xinerama 显示器的边缘。
基本原理:简单的“不要覆盖”提示不足以处理例如自动隐藏面板。
注意:自动隐藏面板应该将支柱设置为其最小的隐藏尺寸。没有延伸到屏幕边框全长的“角”面板应该只设置一个支柱。
_NET_WM_ICON_GEOMETRY
1 | _NET_WM_ICON_GEOMETRY, x, y, width, height, CARDINAL[4]/32 |
这个可选属性可以由独立的工具设置,比如任务栏或图标框。它指定了可能图标的几何形状,以防窗口被图标化。
基本原理:这使得窗口管理器可以显示漂亮的动画,例如将窗口变形为其图标。
Tips:控制中心个性化中设置窗口的最小化效果,就是依赖的这个属性
_NET_WM_ICON
1 | _NET_WM_ICON CARDINAL[][2+n]/32 |
这是客户端可能的图标数组。本规范没有规定这些图标的大小,但个别桌面环境或工具包可能会这样做。窗口管理器可以将这些图标中的任何一个缩放到适当的大小。
这是一个 32 位封装的 CARDINAL ARGB 数组,高字节为 A,低字节为 B。前两个基数是宽度,高度。数据按行,从左到右,从上到下。
_NET_WM_PID
1 | _NET_WM_PID CARDINAL/32 |
如果设置,此属性必须包含拥有此窗口的客户端的进程 ID。这可以被窗口管理器用来杀死不响应 _NET_WM_PING 协议的窗口。
如果设置了 _NET_WM_PID,则还必须设置 ICCCM 指定的属性 WM_CLIENT_MACHINE。虽然 ICCCM 仅要求将 WM_CLIENT_MACHINE 设置为 “从运行服务器的机器上看到的形成运行客户端的机器名称的字符串”,但符合此规范要求将 WM_CLIENT_MACHINE 设置为完全限定域名客户的主机。
另请参阅有关终止挂起进程的实施说明。
_NET_WM_HANDLED_ICONS
1 | _NET_WM_HANDLED_ICONS |
该属性可由寻呼机在其自己的顶级窗口之一上设置,以指示窗口管理器不需要为图标化窗口提供图标,例如,如果它是任务栏并为图标化窗口提供按钮。
_NET_WM_USER_TIME
1 | _NET_WM_USER_TIME CARDINAL/32 |
此属性包含此窗口中最后一次用户活动发生的 XServer 时间。
在映射窗口之前,客户端应在每个新的顶级窗口(或由 _NET_WM_USER_TIME_WINDOW 属性指出的窗口)上将此属性设置为导致窗口出现的用户交互的时间戳。例如,仅处理核心事件的客户端可能会使用最后一个 KeyPress 或 ButtonPress 事件的时间戳。ButtonRelease 和 KeyRelease 事件通常不应被视为用户交互,因为应用程序可能会从全局键绑定接收 KeyRelease 事件,并且通常释放事件的时间戳可能晚于匹配按下事件触发的操作。如果应用程序是通过启动通知启动的,客户端可以从 DESKTOP_STARTUP_ID 环境变量中获取导致其第一个窗口出现的时间戳。如果客户端不知道导致第一个窗口出现的用户交互的时间戳(例如,因为它没有通过启动通知启动),那么它不应为该窗口设置属性。新映射窗口上的特殊值零可用于请求该窗口在映射时最初不被聚焦。
如果客户端有活动窗口,它也应该在有用户活动时更新窗口上的这个属性。
基本原理:此属性允许窗口管理器在映射时更改窗口的焦点、堆叠和/或放置行为,具体取决于新窗口是由用户操作创建的还是由用户操作激活的“弹出”窗口。计时器或其他一些事件。
_NET_WM_USER_TIME_WINDOW
1 | _NET_WM_USER_TIME_WINDOW WINDOW/32 |
此属性包含客户端在其上设置 _NET_WM_USER_TIME 属性的窗口的 XID。客户端应检查窗口管理器是否支持 _NET_WM_USER_TIME_WINDOW,如果不支持,则回退到在顶层窗口上设置 _NET_WM_USER_TIME 属性。
原理:在顶层窗口本身存储频繁变化的 _NET_WM_USER_TIME 属性会导致每个对该窗口的任何属性感兴趣的应用程序在每次按键时都被唤醒,这对于使用电池供电的笔记本电脑尤其不利。
_NET_FRAME_EXTENTS
1 | _NET_FRAME_EXTENTS, left, right, top, bottom, CARDINAL[4]/32 |
窗口管理器必须将 _NET_FRAME_EXTENTS 设置为窗口框架的范围。left、right、top 和 bottom 是窗口管理器添加的相应边框的宽度。
实例分析:
打开visual studio code.运行xprop命令后点击vscode页面,属性内容如下:
1 | _NET_WM_ICON_GEOMETRY(CARDINAL) = 322, 1040, 41, 41 #应用图标在桌面上的位置,一般由任务栏或者图标框设置 |