如何移动或调整X11窗口(即使它们被最大化)?

我想改变一个窗口的位置。 我的问题是窗口可以最大化,这不允许改变它的大小和位置(窗口可以属于任何应用程序)。 我使用KDE4。


我试图使用ewmh Python模块。 在我的情况下,当窗口最大化,我只是想从一个显示器移动到另一个,保持最大化。 我需要unmaximize它来设置它的几何,所以我试图unmaximize它使用ewmh.setWmState()设置_NET_WM_STATE_MAXIMIZED_VERT_NET_WM_STATE_MAXIMIZED_HORZ0 ,然后ewmh.display.flush()

有时我可以configuration以前最大化的窗口的位置和大小,有时不可以。 出于某种原因,它不能可靠地工作,如果我只是从一台显示器切换到xrandr显示器与xrandr ,特别是可能失败的最大化Windows。

请注意,unmaximizing始终工作,什么(经常)不起作用正在改变窗口位置(或大小)之后。


我也试过在terminal上做这个。 这是重现我的问题最简单的方法。 首先,获得窗口ID( $WID )的一些最大化的窗口。 然后:

 wmctrl -i -r $WID -b remove,maximized_vert,maximized_horz wmctrl -i -r $WID -e 0,1280,50,1250,1250 

但是第二个命令除非在运行之前手动移动或调整窗口的大小,否则什么也不做。 与ewmh不同,如果窗口最大化, wmctrl不会如预期的那样工作。 wmctrl成功地wmctrl窗口的wmctrl ,但之后不能改变它的位置或大小。

在单屏幕和三屏幕X屏幕状态下都可以重现。

这个问题似乎不是特定于任何特定的工具。 例如,如果窗口只是unmaximized,但没有手动移动/resize,则xdotool也无法更改窗口大小/位置。


到目前为止,唯一可靠的解决方法是使用ewmhwmctrl手动ewmh窗口,然后手动更改窗口大小或手动移动窗口。 只有这样,我总是可以移动或调整它与ewmhwmctrl 。 但显然这是不可接受的解决scheme。

即使窗口最大化,是否有可靠的方法来设置窗口几何? 通过Python的方法是首选,但与shell命令的解决scheme也将罚款。

感谢纳米评论,我找到了一个解决方案。 这里是我的Python 脚本的相关部分(它保存和恢复所有窗口的状态和几何,所以这个例子unmaximizes,unmaps和映射所有窗口):

 from time import sleep from ewmh import EWMH from Xlib import display, protocol, X from Xlib.protocol.request import * ... ewmh = EWMH() disp = display.Display() poll_interval = 0.025 # s poll_attempts_limit = 10 ... def unmaximize(window): ewmh.setWmState(window, 0, "_NET_WM_STATE_MAXIMIZED_VERT") ewmh.setWmState(window, 0, "_NET_WM_STATE_MAXIMIZED_HORZ") ... for client in all_win: unmaximize(client.window) ewmh.display.flush() for client in all_win: client.xwin.unmap() poll_attempts = 0 for client in all_win: while client.xwin.get_attributes().map_state == X.IsViewable \ and poll_attempts < poll_attempts_limit: sleep(poll_interval) poll_attempts += 1 for client in all_win: client.xwin.map() poll_attempts = 0 for client in all_win: while client.xwin.get_attributes().map_state != X.IsViewable \ and poll_attempts < poll_attempts_limit: sleep(poll_interval) poll_attempts += 1 

执行此代码后,可以为任何窗口设置窗口几何。 all_win是以ewmh.getClientList()数据填充的自定义类对象列表表示的所有窗口的列表。 每个client.xwin = disp.create_resource_object("window", client.id) 。 等待映射/取消映射完成很重要,否则将是不可靠的。 此外,有必要限制轮询尝试,以防止某些窗口出现意外映射或取消映射的情况下的无限循环。


如果您不想一次性重新配置大量的窗口,使用python xlib模块进行解映射和映射并没有明显的性能提升,那么使用xdotool会更容易:

 from os import system ... system("xdotool windowunmap --sync " + str(client.window.id)) system("xdotool windowmap --sync " + str(client.window.id)) 

如果你想在shell脚本中设置窗口几何,下面的例子应该可以工作,即使窗口最大化:

 wmctrl -i -r $WID -b remove,maximized_vert,maximized_horz xdotool windowunmap --sync $WID xdotool windowmap --sync $WID wmctrl -i -r $WID -e 0,$x,$y,$width,$height