首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何移动或调整X11窗口的大小(即使它们是最大化的)?

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

Stack Overflow用户
提问于 2014-05-24 23:06:05
回答 1查看 4.4K关注 0票数 6

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

我尝试使用嗯,嗯 Python模块。在我的情况下,当窗口最大化时,我只想把它从一个监视器移动到另一个监视器,保持它的最大化。我需要去最大化它来设置它的几何学,所以我尝试用ewmh.setWmState()来设置_NET_WM_STATE_MAXIMIZED_VERT_NET_WM_STATE_MAXIMIZED_HORZ设置0,然后ewmh.display.flush()

有时,我可以配置以前最大化窗口的位置和大小,有时不能。由于某些原因,它不能可靠地工作,而且如果我只是用xrandr从单一监视器切换到三重监视器,那么对于最大化的窗口尤其可能失败。

请注意,非最大化总是有效的,什么(经常)不工作是改变窗口的位置(或大小)之后。

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

代码语言:javascript
复制
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实现窗口的非最大化,然后手动更改窗口大小或手动移动它。只有这样,我才能使用ewmhwmctrl来移动或调整它的大小。但很明显,这是不可接受的解决办法。

是否有可靠的方法来设置窗口几何,即使窗口目前是最大化的?首选的是通过Python的方法,但是使用shell命令的解决方案也是可以的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-27 14:13:27

多亏了n.m。评论我找到了一个解决方案。下面是我的python中的相关部分(它保存和恢复所有窗口的状态和几何,因此这个示例不最大化、取消映射和映射所有窗口):

代码语言:javascript
复制
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就更容易了:

代码语言:javascript
复制
from os import system
...
system("xdotool windowunmap --sync " + str(client.window.id))
system("xdotool windowmap   --sync " + str(client.window.id))

如果您想在shell脚本中设置窗口几何,即使窗口最大化,下面的示例也会工作:

代码语言:javascript
复制
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
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23850499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档