我想换个窗户的位置。我的问题是,窗口可以最大化,这不允许改变它的大小和位置(窗口可以属于任何应用程序)。我用KDE4。
我尝试使用嗯,嗯 Python模块。在我的情况下,当窗口最大化时,我只想把它从一个监视器移动到另一个监视器,保持它的最大化。我需要去最大化它来设置它的几何学,所以我尝试用ewmh.setWmState()来设置_NET_WM_STATE_MAXIMIZED_VERT,_NET_WM_STATE_MAXIMIZED_HORZ设置0,然后ewmh.display.flush()。
有时,我可以配置以前最大化窗口的位置和大小,有时不能。由于某些原因,它不能可靠地工作,而且如果我只是用xrandr从单一监视器切换到三重监视器,那么对于最大化的窗口尤其可能失败。
请注意,非最大化总是有效的,什么(经常)不工作是改变窗口的位置(或大小)之后。
我也试过在终点站做这个。这是重现我的问题的最简单的方法。首先,获取一些最大化窗口的窗口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无法成功地使窗口最大化,但之后不能更改其位置或大小。
这是可重复的单一和三显示器X屏幕状态。
这个问题似乎不特定于任何特定的工具。例如,如果窗口没有最大化,但没有手动移动/调整大小,xdotool也无法更改窗口大小/位置。
到目前为止,我发现的唯一可靠的解决方法是手动、使用ewmh或使用wmctrl实现窗口的非最大化,然后手动更改窗口大小或手动移动它。只有这样,我才能使用ewmh或wmctrl来移动或调整它的大小。但很明显,这是不可接受的解决办法。
是否有可靠的方法来设置窗口几何,即使窗口目前是最大化的?首选的是通过Python的方法,但是使用shell命令的解决方案也是可以的。
发布于 2014-05-27 14:13:27
多亏了n.m。评论我找到了一个解决方案。下面是我的python中的相关部分(它保存和恢复所有窗口的状态和几何,因此这个示例不最大化、取消映射和映射所有窗口):
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,$heighthttps://stackoverflow.com/questions/23850499
复制相似问题