我发现使用wmctrl
实用程序通过运行获取窗口大小wmctrl -lG
的奇怪现象。我发现编辑窗口不正确。我平等了终端和编辑窗口,但是wmctrl
显示这些窗口的尺寸不同。
我在使用带有 xfce DE 的 Ubuntu 16.04,但是我在 Centos 7 中也发现了同样的问题,你能解释一下为什么wmctrl
显示的编辑窗户?
答案1
GEdit 使用客户端“窗口装饰”,其中窗口标题栏和边框由程序本身绘制,而 GNOME Terminal 使用由窗口管理器应用的“传统”服务器端装饰。(请注意 GEdit 标题栏有精美的额外按钮;Nautilus 也有路径栏;Epiphany 甚至有一个可编辑的地址栏;等等。这些都是 CSD 窗口。)
这带来了两个区别:
客户端装饰,即标题栏和边框GEdit 是窗口的组成部分,并相应地扩展其边界,但 Terminal 的服务器端装饰不是 - 它们本身是一种特殊的“窗口”,只是围绕着应用程序窗口。为了解决这个问题,每当窗口管理器向窗口添加装饰时,它还会设置包含其尺寸的 _NET_FRAME_EXTENTS 属性。
但 wmctrl才不是检查此属性并且不会将服务器端窗口装饰范围添加到显示的窗口大小,因此使用 SSD 的应用程序(终端)列出的尺寸比实际尺寸要小。
在 GNOME 使用的 CSD 架构中,周围的阴影也由应用程序本身绘制,窗口边界也会相应扩大。包含阴影的区域是点击和半透明的,但它们仍然是窗口的一部分,无法轻易区分。为了解决这个问题,应用程序本身设置其他窗口属性,_GTK_FRAME_EXTENTS。
$ xprop | grep EXTENT <单击 GEdit 窗口> _GTK_FRAME_EXTENTS(基数) = 26, 26, 23, 29
当使用 CSD 的应用程序(GEdit)在 GNOME Shell 内运行并绘制这些额外的阴影时,窗口管理器会读取这些值,以便尽管窗口尺寸增加了,但仍能正确地“捕捉”和“平铺”窗口。
但 wmctrl才不是从显示的窗口大小中减去它们的范围,因此列出的窗口比实际的要大。
(请注意,这不是唯一可能的 CSD 实现。例如,Chrome 也使用客户端装饰,但不会添加阴影,也不需要像 GTK3 那样指示“范围”。相反,窗口根本没有 alpha 通道,允许窗口管理器应用自己的通道。)