Am creat acest cod destul de complicat pentru a găsi ferestrele pe care am vrut să le mutăm pe un anumit ecran determinat de lățimea în mm a monitorului (se va redimensiona și la rezoluția corectă și se va seta aplicația pe ecran complet):
#!/usr/bin/env python3
subproces de import
timpul de import
def get(cmd): return subprocess.check_output(cmd).decode('utf-8')
def adjust_resolution(nume, rezoluție): # nume = DP-2, rezoluție: 1920x1080
get(['xrandr', '--output', nume, '--mode', res])
def edit_window(monitor, window_name, function):
print('deplasare', nume_fereastra, 'la', monitor)
get(['wmctrl', '-F', '-r', nume_fereastră, '-e', '100,' +
monitor['x'] + ',' + monitor['y'] + ',600.600'])
get(['wmctrl', '-F', '-r', nume_fereastră, '-b', funcţie])
def get_monitors():
screendata = [l.split() pentru l în get(['xrandr', '--current']
).replace('primar', '').splitlines() dacă 'conectat' în l]
monitoare = []
pentru i în interval (len (screendata)):
monitor = dict()
[mărime, x, y] = date ecran[i][2].split('+')
monitor = {
„nume”: date de ecran[i][0],
„lățime”: date de ecran[i][-3],
„înălțime”: date de ecran[i][-1],
„dimensiune”: dimensiune,
'x': x,
'y': y
}
monitors.append(monitor)
returnează monitoare
def find_element_where(elemente, cheie, valoare):
return next((articol pentru element în elemente dacă element[cheie] == valoare), Niciunul)
def window_info_to_dict(info):
_, _, x, y, lățime, înălțime, _, *nume = info.split()
return {'x': x, 'y': y, 'width': width, 'height': height, 'name': ''.join(name)}
def get_window_info():
listă returnată(hartă(window_info_to_dict, get(['wmctrl', '-l', '-G']).splitlines()))
# constante:
main_monitor_width = '256mm'
controller_app = „numele_aplicației”
video_player = „VLC media player”
rezoluție_corectă = „1920x1080”
# Variabile:
did_remove_fullscreen = Fals
în timp ce este adevărat:
încerca:
# Obțineți monitoare:
monitoare = get_monitors()
main_monitor = urmatorul(
(monitor pentru monitor în monitoare dacă monitor['width'] == main_monitor_width), niciunul)
secundar_monitor = următorul(
(monitor pentru monitor în monitoare dacă monitor['width'] != main_monitor_width), Niciunul)
# print(main_monitor)
# print(secondary_monitor)
# Obțineți Windows:
window_info = get_window_info()
controller_app_window_info = find_element_where(
window_info, „nume”, controller_app)
video_player_window_info = find_element_where(
window_info, „nume”, video_player)
# Verificați dacă monitorul secundar are dimensiunea potrivită:
dacă secondary_monitor și secondary_monitor['size'] != corect_resolution:
print('Rezoluție greșită', secondary_monitor)
adjust_resolution(secondary_monitor['nume'], corect_resolution)
# print(controller_app_window_info)
# print(video_player_window_info)
if main_monitor:
dacă controller_app_window_info['x'] != main_monitor['x'] sau controller_app_window_info['y'] != main_monitor['y'] sau controller_app_window_info['width'] != '1920' sau controller_app_window_info['height'] ! = '1080':
print('Aplicația de control nu este poziționată corect')
edit_window(main_monitor, controller_app, 'add, fullscreen')
altceva:
print('Fără monitor principal')
dacă secundar_monitor:
dacă video_player_window_info['x'] != secondary_monitor['x'] sau video_player_window_info['y'] != secondary_monitor['y'] sau video_player_window_info['width'] != '1920' sau video_player_window_info !['height'] = '1080':
print('Playerul video nu este pozitionat corect')
edit_window(secondary_monitor, video_player, 'add, fullscreen')
did_remove_fullscreen = Fals
altceva:
print('Fără monitor secundar')
dacă main_monitor și nu did_remove_fullscreen:
edit_window(main_monitor, video_player, 'remove, fullscreen')
did_remove_fullscreen = Adevărat
cu excepția excepției ca e:
print('A apărut o eroare', e)
timp.somn (10)