Последовательная идентичная команда wmctrl изменяет размер xfce4-терминала
Я пишу скрипт листов, который использует 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 2 1 1
(это означает размер сетки: 2x2, строки 1-2, столбцы 1-1 (он же правая половина экрана (команда, которую он запустит, выводится на терминал))
размер окна снова изменяется во второй раз, игнорируя границы и расширяясь за пределы панели xfce. Ниже приведены изображения после первого и второго запуска скрипта. Смотрите в нижней части окна для расхождения. Обратите внимание, что команда wmctrl выполняется одинаково оба раза.
первый запуск, когда эмулятор терминала перемещается из центра вправо
второй запуск, где эмулятор терминала расширяется на несколько пикселей вниз на панель
Такое поведение также происходит при запуске wmctrl непосредственно из командной строки, поэтому проблема не в питоне. (для моего размера экрана, wmctrl -r :ACTIVE: -e 0,0,0,960,1024
, Я включил скрипт python, потому что он позволяет вам получить эту информацию / команду специально для вашего экрана, если вы хотите проверить поведение.)
Это говорит о том, что проблема в том, что "wmctrl возвращает геометрию окна внутри украшений". Однако я не могу получить родительское окно, и оно, кажется, не существует, поэтому решение кажется таким, что оно может быть специфичным для unity/gedit. Это также не объясняет, почему последовательная команда дублирования перемещения изменяет геометрию окна, когда первая команда помещает его в нужное место.
Я протестировал несколько терминальных эмуляторов, чтобы выяснить, не является ли эмулятор источником проблемы.
Эта проблема не возникает при запуске команды или программы из xterm, terminator (хотя есть странное поведение), qterminal, eterm, rxvt, stterm и kterm. Это происходит в xfce4-терминале и lilyterm. Похожее, но не идентичное странное поведение в gnome-Terminal и Roxterm. Это наводит меня на мысль, что это специфическая ошибка эмулятора терминала. Проблема может быть связана с первым, а не со вторым изменением размера, поскольку xterm и другие эмуляторы полностью расширяются при первом запуске.
Я использую xfce 4.12 на производной Ubuntu 16.04 (xenial) (ядро: x86_64 Linux 4.8.17-galliumos). Моя версия wmctrl - 1.07. Моя версия xfwm4 - 4.12.3(версия 7fdcb53). У меня разрешение экрана 1920х1080. Окно, которое я изменяю, является xfce4-терминал 0.6.3.
Я хотел бы знать, могу ли я что-то сделать, чтобы предотвратить это. Я изменил размер окна до 0,0,0,0, а затем до нужных размеров, но для этого требуется другая команда и ужасная вспышка.
Tldr: дважды запустить команду SAME wmctrl (wmctrl -r :ACTIVE: -e 0,960,0,960,1024
) из экземпляра терминала xfce4 перемещает окно во второй раз, расширяя его вниз. Я хочу знать, почему это происходит и как это предотвратить.