wmctrl이 스크립트 내에서 창 크기 조정/이동에 실패함

wmctrl이 스크립트 내에서 창 크기 조정/이동에 실패함

저는 여러 프로그램을 열고 화면의 창을 이동/크기 조정하는 스크립트를 작성하려고 합니다.

예를 들어,

#!/bin/bash
zim
wmctrl -r Zim -b toggle,maximized_vert
wmctrl -r Zim -e 0,700,0,-1,-1

이 스크립트를 실행하면 창이 최대화되고 오른쪽으로 조금 이동됩니다. 그러나 or zim로 바꾸면 창을 이동하거나 크기를 조정할 수 없습니다.firefoxacroread

터미널에 입력하면 작동 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

사용하는 방법

  1. 스크립트에는 wmctrl및 다음이 모두 필요합니다 xdotool.

    sudo apt-get install wmctrl xdotool
    
  2. 스크립트를 빈 파일에 복사하고 다른 이름으로 저장하세요.resize_window.py

  3. 테스트 - 애플리케이션을 인수로 사용하여 스크립트를 실행합니다. 예:

    python3 /path/to/resize_window.py firefox
    

노트

  • wmctrl시작 응용 프로그램에서 스크립트로 사용하는 경우 창 목록을 가져오는 명령이 너무 일찍 실행될 가능성이 적습니다 . 문제가 발생하면 전체 절차에 try/를 추가해야 합니다. except그렇다면 알려주시기 바랍니다.

관련 정보