如何使用wmctrl将窗口移出屏幕



我正试图以编程方式移动一个窗口,使其部分显示在屏幕上。例如,单击VLC标题栏并拖动它,使只有一半的窗口可见,效果很好。

当我输出wmctrl -lG的结果时,它工作得很好:

0x04a00011  0 -293 138  600  420  HEVM002 VLC media player

然而,当我把它移回屏幕并尝试复制它的位置时,它不起作用,并把窗口夹到了另一边:

wmctrl -r "VLC media player" -e 0,-200,0,800,600

我已经在几个窗口管理器上进行了测试,它似乎在xfwm上运行良好,但在compiz上不起作用。我可以设置一个标志或类似的东西来启用将窗口移出屏幕吗?

在窗口管理器下运行时,这完全取决于窗口管理器。是否有强制部分屏幕外位置的标志取决于它是哪个窗口管理器。

实现这一点的唯一与窗口管理器无关的方法是使窗口成为override_redirect窗口。但是,当然,这意味着窗口不再被管理。使其再次成为正常窗口将导致窗口管理器再次对其进行管理,这可能再次取决于窗口管理器,这意味着迫使其再次进入边界。

也就是说,查看wmctrl的源代码,如果窗口管理器支持,它将使用_NET_MOVERESIZE_WINDOW,否则将返回到XMoveResizeWindow(或类似的)。然而,在第一种情况下,它首先将位置值强制转换为unsigned long,这实际上意味着任何负值都将丢失。在第二种情况下,负值似乎表示"不动",所以也没有运气。

您可以尝试使用xdotool windowmove,这样可以正确处理负值。也许还可以考虑对wmctrl提交一个bug?

最新更新