Как автоматически вызвать приложение, запущенное пользователем по ярлыку

Я создал сочетание клавиш Ctrl+Alt+C для gnome-calculator, Это прекрасно работает, но если в настоящий момент запущено другое приложение, калькулятор открывается позади другого приложения.

Как сделать калькулятор активным при запуске с помощью этого ярлыка?

1 ответ

Решение

Запуск скрипта ниже запустит gnome-calculator (или любое другое приложение, см. "Заметки"), дождитесь появления его окна и поднимите его.

Сценарий

#!/usr/bin/env python3
import subprocess
import time

app = "gnome-calculator"
subprocess.Popen([app])

t = 0
while t < 20:
    try:
        # wait for the application's pid
        pid = subprocess.check_output(["pgrep", "-f", app]).decode("utf-8").strip()
    except subprocess.CalledProcessError:
        pass
    else:
        try:
            # read the window list
            w_data = subprocess.check_output(["wmctrl", "-lp"]).decode("utf-8").splitlines()
            # find the window of the found pid
            window = [w.split()[0] for w in w_data if pid in w][0]
            # raise it and terminate the script
            subprocess.Popen(["wmctrl", "-ia", window])
            break
        except IndexError:
            pass
    time.sleep(0.5)
    t = t + 1

Как пользоваться

  1. Скрипт нужен wmctrl чтобы прочитать список окон и поднять окно:

    sudo apt-get install wmctrl
    
  2. Скопируйте скрипт в пустой файл, сохраните его как raise_window.py
  3. Протестируйте его с помощью команды:

    python3 /path/to/raise_window.py
    
  4. Если все работает нормально, добавьте команду к сочетанию клавиш: выберите: "Системные настройки" > "Клавиатура" > "Сочетания клавиш" > "Пользовательские сочетания клавиш". Нажмите "+" и добавьте команду:

    python3 /path/to/raise_window.py
    

Заметки

  • Чтобы предотвратить бесконечный цикл (например, если приложение по какой-то причине не запускается), сценарий будет ждать десять секунд, а затем все равно завершится. Если вы хотите увеличить время, измените значение в строке:

    while t < 20
    

    (20 знак равно 20 * 0.5 секунд)

  • Как уже упоминалось, вы можете использовать скрипт для "исправления" поведения любого приложения, которое не вызывается само по себе, путем изменения строки:

    app = "gnome-calculator"
    

    запустить другое приложение (app = "<application>"), или же:

    В качестве альтернативы использовать скрипт для различных приложений:

    заменить строку:

    app = "gnome-calculator"
    

    от:

    app = sys.argv[1]
    

    и добавьте в заголовок раздела сценария (прямо под шебанг):

    import sys
    

    Затем запустите скрипт командой:

    python3 raise_window.py <application>
    

объяснение

Чтобы поднять окно, вы можете использовать команду:

wmctrl -ia <window_id> 

или же

wmctrl -a <window_name>

(при условии, wmctrl установлено)

Поскольку имя окна, возможно, не является уникальным, предпочтительнее использовать идентификатор. Хитрость заключается в том, чтобы дождаться появления pid приложения, протестировав его с помощью команды:

pgrep -f <application>

Если команда имеет вывод, это означает, что приложение имеет pid и запускается. Следующее, что нужно посмотреть, есть ли в приложении окно (уже), с помощью команды:

wmctrl -lp

который выведет список окон, их идентификатор окна и соответствующий pid (приложения).

Если есть совпадение найденного pid и окон в списке, у нас есть наше окно, которое нам нужно поднять. Мы можем проанализировать идентификатор окна из строки окна в списке, который мы впоследствии будем использовать для вызова окна с помощью команды:

wmctrl -ia <window_id>
Другие вопросы по тегам