저는 여러 프로그램을 열고 화면의 창을 이동/크기 조정하는 스크립트를 작성하려고 합니다.
예를 들어,
#!/bin/bash
zim
wmctrl -r Zim -b toggle,maximized_vert
wmctrl -r Zim -e 0,700,0,-1,-1
이 스크립트를 실행하면 창이 최대화되고 오른쪽으로 조금 이동됩니다. 그러나 or zim
로 바꾸면 창을 이동하거나 크기를 조정할 수 없습니다.firefox
acroread
터미널에 입력하면 작동 wmctrl
하지만 싶습니다.스크립트 내부. 나는 그것이 firefox
화면에서의 위치를 기억하는 방식과 관련이 있을 것이라고 생각합니다 .
편집하다:내가 배치
firefox
wmctrl -lG
스크립트 내부에서 다음과 같은 출력을 얻습니다.
0x03800032 0 1168 347 750 731 briareos emacs@briareos
0x02a00002 0 -2020 -1180 1920 1080 briareos XdndCollectionWindowImp
0x02a00005 0 0 24 47 1056 briareos unity-launcher
0x02a00008 0 0 0 1920 24 briareos unity-panel
0x02a0000b 0 -420 -300 320 200 briareos unity-dash
0x02a0000c 0 -420 -300 320 200 briareos Hud
0x03c00011 0 59 52 900 1026 briareos Notes - Zim
이는 스크립트가 Firefox가 시작된 것을 알지 못한다는 것을 의미합니다.
답변1
문제
문제는 사용하는 명령 조합에서 명령이 wmctrl
성공하려면 응용 프로그램의 창이 제 시간에 나타나도록 "운이 좋아야" 한다는 것입니다.
귀하의 명령은 가벼운 응용 프로그램에서 대부분의 시간 동안 빠르게 시작될 수 있지만 Inkscape, Firefox 또는 Thunderbird와 같은 다른 응용 프로그램에서는 작동하지 않습니다.
너~할 수 있다빌드- 귀하가 한 것처럼(코멘트에서 언급한 것처럼) 5초 또는 10초의 휴식 시간이 필요하지만 필요한 것보다 더 오래 기다려야 하거나 프로세서가 사용 중이고 창이 "평소보다 늦으면" 결국 중단됩니다. .
해결책
그런 다음 해결 방법은 스크립트에 프로시저를 포함하고 의 출력에 창이 나타날 때까지 기다린 다음 wmctrl -lp
명령을 실행하여 창을 최대화하는 것입니다.
python
아래 예 에서는 작업을 수행하는 xdotool
것보다 경험상 좀 더 강력하게 창 크기를 조정했습니다 .wmctrl
#!/usr/bin/env python3
import subprocess
import getpass
import time
import sys
app = sys.argv[1]
# to only list processes of the current user
user = getpass.getuser()
get = lambda x: subprocess.check_output(x).decode("utf-8")
# get the initial window list
ws1 = get(["wmctrl", "-lp"]); t = 0
# run the command to open the application
subprocess.Popen(app)
while t < 30:
# fetch the updated window list, to see if the application's window appears
ws2 = [(w.split()[2], w.split()[0]) for w in get(["wmctrl", "-lp"]).splitlines() if not w in ws1]
# see if possible new windows belong to our application
procs = sum([[(w[1], p) for p in get(["ps", "-u", user]).splitlines() \
if app[:15].lower() in p.lower() and w[0] in p] for w in ws2], [])
# in case of matches, move/resize the window
if len(procs) > 0:
subprocess.call(["xdotool", "windowsize", "-sync", procs[0][0] , "100%", "100%"])
break
time.sleep(0.5)
t = t+1
사용하는 방법
스크립트에는
wmctrl
및 다음이 모두 필요합니다xdotool
.sudo apt-get install wmctrl xdotool
스크립트를 빈 파일에 복사하고 다른 이름으로 저장하세요.
resize_window.py
테스트 - 애플리케이션을 인수로 사용하여 스크립트를 실행합니다. 예:
python3 /path/to/resize_window.py firefox
노트
wmctrl
시작 응용 프로그램에서 스크립트로 사용하는 경우 창 목록을 가져오는 명령이 너무 일찍 실행될 가능성이 적습니다 . 문제가 발생하면 전체 절차에try
/를 추가해야 합니다.except
그렇다면 알려주시기 바랍니다.