如何使用 wmctrl 将 window 移出屏幕

How to move window offscreen with wmctrl

我正在尝试以编程方式移动 window 以使其部分显示在屏幕上。例如,单击 VLC 标题栏并拖动它,使 window 的一半可见就可以了。

当我输出 wmctrl -lG 的结果时,效果很好:

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

然而,当我将它移回屏幕并尝试复制它的位置时,它不起作用并将 window 剪辑到远端:

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

我已经在几个 window 管理器上进行了测试,它似乎在 xfwm 上工作正常,但在 compiz 上却不行。有没有我可以设置的标志或类似的东西来启用移动 windows off-screen?

当 运行 在 window 经理手下时,这完全取决于 window 经理。是否有强制部分离屏位置的标志取决于它是哪个window经理。

实现此目标的唯一 window 经理不可知论方法是使 window 成为 override_redirect window。但是,当然,这意味着 window 不再受管理。再次使其成为正常的 window 将导致 window 经理再次管理它,这可能再次取决于 window 经理,意味着强制它再次进入界内。

就是说,查看 wmctrl 的源代码,如果 window 管理器支持,它使用 _NET_MOVERESIZE_WINDOW,否则回退到 XMoveResizeWindow(或类似)。但是,在第一种情况下,它首先将位置值转换为 unsigned long,这实际上意味着无论如何都会丢失任何负值。在第二种情况下,负值似乎表示 "don't move",所以也不走运。

您可以尝试改用 xdotool windowmove,这样可以正确处理负值。也许还考虑针对 wmctrl 提交错误?