Я создал этот довольно сложный код, чтобы найти окна, которые я хотел переместить на определенный экран, определяемый шириной монитора в миллиметрах (он также изменит размер до правильного разрешения и установит полноэкранный режим приложения):
#!/usr/bin/env python3
подпроцесс импорта
время импорта
def get(cmd): return subprocess.check_output(cmd).decode('utf-8')
def Adjust_resolution(имя, разрешение): # имя = DP-2, разрешение: 1920x1080
get(['xrandr', '--output', имя, '--mode', res])
def edit_window (монитор, имя_окна, функция):
print('переезд', имя_окна, 'в', монитор)
get(['wmctrl', '-F', '-r', имя_окна, '-e', '100,' +
монитор ['x'] + ',' + монитор ['y'] + ',600,600'])
get(['wmctrl', '-F', '-r', имя_окна, '-b', функция])
защита get_monitors():
screendata = [l.split() для l в get(['xrandr', '--current']
).replace('primary', '').splitlines() если 'connected' в l]
мониторы = []
для i в диапазоне (len (экранные данные)):
монитор = дикт()
[размер, x, y] = данные экрана[i][2].split('+')
монитор = {
'имя': данные экрана[i][0],
'ширина': данные экрана[i][-3],
'высота': данные экрана[i][-1],
'размер': размер,
'х': х,
'у': у
}
monitors.append(монитор)
вернуть мониторы
def find_element_where (элементы, ключ, значение):
return next((item for item in elements if item[key] == value), None)
защита window_info_to_dict (информация):
_, _, x, y, ширина, высота, _, *name = info.split()
return {'x': x, 'y': y, 'width': ширина, 'height': высота, 'name': ' '.join(name)}
защита get_window_info():
список возврата (карта (window_info_to_dict, get (['wmctrl', '-l', '-G']).splitlines ()))
# Константы:
main_monitor_width = '256 мм'
controller_app = 'имя_приложения'
video_player = 'Медиаплеер VLC'
правильное_разрешение = '1920x1080'
# Переменные:
did_remove_fullscreen = Ложь
пока верно:
пытаться:
# Получить мониторы:
мониторы = get_monitors()
main_monitor = следующий(
(монитор для монитора в мониторах, если монитор['ширина'] == main_monitor_width), Нет)
вторичный_монитор = следующий (
(монитор для монитора в мониторах, если монитор['ширина'] != main_monitor_width), нет)
# печать (основной_монитор)
# печать (вторичный_монитор)
# Получить окна:
window_info = get_window_info()
controller_app_window_info = find_element_where(
window_info, 'имя', controller_app)
video_player_window_info = find_element_where(
window_info, 'имя', video_player)
# Проверьте, правильный ли размер вторичного монитора:
если вторичный_монитор и вторичный_монитор['размер'] != правильное_разрешение:
print('Неверное разрешение',secondary_monitor)
настроить_разрешение (вторичный_монитор ['имя'], правильное_разрешение)
# печать (controller_app_window_info)
# печать (video_player_window_info)
если основной_монитор:
if controller_app_window_info['x'] != main_monitor['x'] или controller_app_window_info['y'] != main_monitor['y'] или controller_app_window_info['width'] != '1920' или controller_app_window_info['height'] ! = '1080':
print('Приложение контроллера расположено неправильно')
edit_window (main_monitor, controller_app, «добавить, полноэкранный режим»)
еще:
print('Нет основного монитора')
если вторичный_монитор:
if video_player_window_info['x'] != вторичный_монитор['x'] или video_player_window_info['y'] != вторичный_монитор['y'] или video_player_window_info['ширина'] != '1920' или video_player_window_info['высота'] ! = '1080':
print('Видеоплеер расположен неправильно')
edit_window (secondary_monitor, video_player, «добавить, полноэкранный режим»)
did_remove_fullscreen = Ложь
еще:
print('Нет вторичного монитора')
если main_monitor, а не did_remove_fullscreen:
edit_window (main_monitor, video_player, «удалить, полноэкранный режим»)
did_remove_fullscreen = Истина
кроме Исключения как e:
print('Произошла ошибка', e)
время сна(10)