Как автоматически вызвать приложение, запущенное пользователем по ярлыку
Я создал сочетание клавиш 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
Как пользоваться
Скрипт нужен
wmctrl
чтобы прочитать список окон и поднять окно:sudo apt-get install wmctrl
- Скопируйте скрипт в пустой файл, сохраните его как
raise_window.py
Протестируйте его с помощью команды:
python3 /path/to/raise_window.py
Если все работает нормально, добавьте команду к сочетанию клавиш: выберите: "Системные настройки" > "Клавиатура" > "Сочетания клавиш" > "Пользовательские сочетания клавиш". Нажмите "+" и добавьте команду:
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>