Linux 连续相同的wmctrl命令调整xfce4终端的大小

Linux 连续相同的wmctrl命令调整xfce4终端的大小,linux,window-managers,terminal-emulator,xfce,wmctrl,Linux,Window Managers,Terminal Emulator,Xfce,Wmctrl,我正在编写一个使用wmctrl移动窗口的平铺脚本。在xfce4终端实例上使用它时,连续第二次相同的运行会调整窗口的大小。以下是重要的代码: #!/usr/bin/python3 import subprocess import os import sys class Screen(object): def __init__(self, rows, cols): self.rows = rows self.cols = cols #

我正在编写一个使用wmctrl移动窗口的平铺脚本。在xfce4终端实例上使用它时,连续第二次相同的运行会调整窗口的大小。以下是重要的代码:

#!/usr/bin/python3 

import subprocess
import os
import sys

class Screen(object):
    def __init__(self, rows, cols):
        self.rows = rows
        self.cols = cols

        # All workspaces and their data
        desk_output = subprocess.getoutput("wmctrl -d").split("\n")
        # All workspace numbers
        desk_list = [line.split()[0] for line in desk_output]

        # Data about current desktop. Not sure how it works with multiple.
        current = [line for line in desk_output if line.split()[1] == "*"][0].split()

        self.desktop = current[0]
        self.width, self.height = map(int, current[8].split('x'))
        self.orig_x, self.orig_y = current[7].split(',')

        row_division = self.height // self.rows
        col_division = self.width // self.cols


        self.grid = []
        for rownum in range(rows):
            row = []
            for colnum in range(cols):
                col = []
                col.append((col_division*colnum, col_division*(colnum+1))) 
                col.append((row_division*rownum, row_division*(rownum+1))) 
                row.append(col)
            self.grid.append(row)


        # Grid format is something like this:
        # [[(0, 640), (0, 522)],    [(640, 1280), (0, 522)],    [(1280, 1920), (0, 522)]],
        # [[(0, 640), (522, 1044)], [(640, 1280), (522, 1044)], [(1280, 1920), (522, 1044)]]

        # Debug purposes
        for i in self.grid:
            print(i)

    def get_coords(self, cols, rows):
        """Precondition: two two-tuples of (start,end) for rows and columns.
           postcondition: desired x, y, width, height of window in pixels.
        """
        row_start, row_end = rows
        col_start, col_end = cols

        x_start_coord = self.grid[0][col_start-1][0][0]
        x_end_coord =   self.grid[0][col_end - 1][0][1]
        x_coords = (x_start_coord, x_end_coord)

        y_start_coord = self.grid[row_start-1][0][1][0]
        y_end_coord =   self.grid[row_end - 1][0][1][1]
        y_coords = (y_start_coord, y_end_coord)


        x = x_coords[0]
        y = y_coords[0]
        w = y_coords[1] - y_coords[0]
        h = x_coords[1] - x_coords[0]

        return (x, y, h, w)

    def move_active(self,x,y,w,h):
        command = ','.join(map(str, [" wmctrl -r :ACTIVE: -e 0", x, y, w, h]))

        # Print command for debugging
        print(command)
        os.system(command)



if __name__ == "__main__":
    screen_rows = int(sys.argv[1])
    screen_cols = int(sys.argv[2])
    first_row = int(sys.argv[3])
    last_row = int(sys.argv[4])
    first_col = int(sys.argv[5])
    last_col = int(sys.argv[6])

    cols_filled = (first_col, last_col)
    rows_filled = (first_row, last_row)
    s = Screen(screen_rows, screen_cols)
    c = s.get_coords(cols_filled, rows_filled)

    # Print the coords we are about to move to
    print(c)
    s.move_active(*c)
如果我使用相同的坐标连续调用此脚本两次:

python3 screen.py 2 2 1
(这意味着网格大小:2x2,第1-2行,第1-1列(也称为屏幕的右半部分(它将运行的命令打印到终端))

第二次重新调整窗口大小,忽略边框并扩展到xfce面板之外。下面是第一次和第二次脚本运行后的图像。请参阅窗口底部以了解差异。请注意,wmctrl命令的运行两次都相同

其中终端仿真器从中心移到右侧

其中终端仿真器向下扩展几个像素到面板中

当直接从命令行运行wmctrl时也会发生这种行为,因此问题不在python中。(对于我的屏幕大小,
wmctrl-r:ACTIVE:-e 0,0,09601024
。我包括python脚本,因为如果您希望测试该行为,它允许您获得专门针对屏幕的信息/命令。)

表明问题在于“wmctrl正在返回装饰内窗口的几何图形”。但是,我无法获取父窗口,而且它似乎不存在,因此解决方案似乎是unity/gedit特有的。它也没有解释为什么在第一个命令将其放置在正确位置时,连续重复的移动命令会更改窗口的几何图形

我测试了一些终端仿真器,看看仿真器是否是问题的根源

从xterm、terminator运行命令或程序时,不会出现此问题(尽管存在奇怪的行为)、qterminal、etrem、rxvt、stterm和kterm。它确实发生在xfce4终端和lilyterm中。gnome终端和roxterm中有类似但不完全相同的奇怪行为。这使我相信这是一个终端模拟器特有的错误/怪癖。问题可能与第一次调整大小有关,而不是第二次调整大小,因为xterm和另一个e混血儿在第一次奔跑时就完全展开

我在Ubuntu 16.04(xenial)派生版本(内核:x86_64 Linux 4.8.17-galliumos)上运行xfce 4.12。我的wmctrl版本是1.07。我的xfwm4版本是4.12.3(修订版7fdcb53)。我的屏幕分辨率是1920x1080。我正在调整的窗口是xfce4终端0.6.3

我想知道我是否可以做些什么来防止这种情况。我一直在将窗口调整到0,0,0,然后调整到所需的尺寸,但这需要另一个命令和一个丑陋的闪光灯


Tldr:运行相同的wmctrl命令两次(
wmctrl-r:ACTIVE:-e 0960,09601024
)从xfce4终端实例开始,第二次移动窗口,将其向下扩展。我想知道为什么会发生这种情况,以及如何阻止这种情况发生。

能否将xfce4终端更新为0.8.x?从那时起,它已被移植到GTK3,许多错误已得到修复。在遵循依赖链、编译gtk、glib和xfce4终端之后,我新版本(xfce4终端0.8.6git-bf34128(xfce4.12))。同样的行为也存在。对于遇到这种情况的其他人,所需的软件包是libgtk3.0-cil libffi dev libmount dev gtk doc tools libgirepository1.0-dev libgeoxy dev libatk-bridge2.0-dev xfce4 dev tools libvte-2.91-dev libxfce4ui-2-devCan your update xfce4 terminal to 0.8.x?从那时起,它已被移植到GTK3,许多错误已修复。遵循依赖链,编译gtk、glib和xfce4终端之后,我得到了新版本(xfce4终端0.8.6git-bf34128(xfce4.12))。存在相同的行为。对于遇到此问题的其他人,所需的包是libgtk3.0-cil libffi dev libmount dev gtk doc tools libgirepository1.0-dev libepoxy dev libatk-bridge2.0-dev xfce4 dev tools libvte-2.91-dev libxfce4ui-2-dev