为什么 wmctrl 在某些窗口不起作用?

为什么 wmctrl 在某些窗口不起作用?
francisco@Ubuntu:~$ wmctrl -l
0x02600006  0 Ubuntu Área de trabalho
0x03c00002  0 Ubuntu XdndCollectionWindowImp
0x03c00005  0 Ubuntu unity-launcher
0x03c00008  0 Ubuntu unity-panel
0x03c0000b  0 Ubuntu unity-dash
0x03c0000c  0 Ubuntu Hud
0x046000b3  0 Ubuntu How to make a window aways on top? - Stack Overflow - Mozilla Firefox
0x0520000b  0    N/A Qt Creator
0x05002396  0 Ubuntu francisco@Ubuntu: ~
0x0540000b  0    N/A backlight

对于具有机器名称列的窗口,N/A我无法发送wmctrl类似这样的命令wmctrl -r "window name" -b add,above。为什么?(此外,我不知道为什么这些窗口在机器名称列方面有所不同......)

我最初的意图是将这样的命令发送到窗口backlight,一个无框架的 Qt 应用程序。使用窗口系统菜单并选中“始终在最上面”对窗口有效。我只是喜欢用编程的方式来做同样的事情。

答案1

这肯定是一个错误wmctrl
在深入研究了 wmctrl 代码后,似乎错误在于将窗口名称字符串转换为相应的窗口 ID(或 XID)。所以wmctrl -r "window name" -b add,above不可靠。

作为一种解决方法,请改用 XID,即wmctrl -i -r window_id -b add,above。在您的情况下,wmctrl -i -r 0x0520000b -b add,above应该可以工作。

大多数窗口管理功能都是作为 X 窗口属性实现的。您可以通过命令查看窗口的所有属性-- xprop

笔记:

  1. 计算机名称列为 N/A 的窗口的计算机名称属性为 。WM_CLIENT_MACHINE它很少使用。并且一些 GUI 工具包可能未实现它们。
    您可以通过运行以下命令行并单击窗口来查看窗口的计算机名称属性

    shell> xprop | grep MACHINE
    
  2. 至于 Always On Top,它是另一个属性值_NET_WM_STATE_ABOVE
    要自己检查,请运行以下命令行并单击窗口

    shell> xprop | grep _NET_WM_STATE
    

相关内容