wmctrl не удается изменить размер/переместить окон в сценарии

Я пытаюсь записать сценарий, который открывает набор программ и перемещается/изменяет размер окна в экран.

Например,

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

Я запускаю этот скрипт, окно максимизируется и переместилось немного направо. Но, если я заменяю 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 был запущен.

2
задан 7 September 2016 в 23:19

1 ответ

Проблема

Проблема - то, что в комбинации команд Вы используете, необходимо "посчастливилось" иметь окно приложения, появляются вовремя, для wmctrl команды, чтобы быть успешным.
Ваши команды будут возможно работать большую часть времени на легкие приложения, запуская быстро, но повредятся на других, как Inkscape, Firefox или Thunderbird.

Можно создать - в повреждении 5 или десяти секунд, как Вы сделал (упомянутый в комментариях), но или необходимо ожидать дольше затем необходимые, или оно повредится, в конце концов, если процессор будет занят, и окно "позже чем обычно".

Решение

Решение затем состоит в том, чтобы включать процедуру в Ваш сценарий, ожидающий окна для появления в выводе 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 управляйте для выборки выполнений списка окна слишком рано. Если Вы сталкиваетесь с проблемой, мы должны добавить a try/except для целой процедуры. Если так, сообщите мне.
3
ответ дан 2 December 2019 в 02:50

Другие вопросы по тегам:

Похожие вопросы: