Действительно ли это возможно, или через сценарий оболочки или через терминальную команду, предполагая, что Вы имеете PID, определяете, имеет ли это главное окно (форма), и затем получите информацию об этом (заголовок) и покажите/скройте/закройте его?
Так как Вы упоминаете командную строку, сценарий ниже выполнений в окне терминала. Вы выполняете его с pid
как аргумент, например:
python3 /path/to/script.py 1234
Впоследствии, окно (список) появляется, которых можно выбрать (список-) число и ввести опцию работать на нем:
Current Windows for pid 2189:
------------------------------------------------------------
[1] Niet-opgeslagen document 1 - gedit
[2] testbackup.py (~/Bureaublad) - gedit
------------------------------------------------------------
Type window number + option:
-k [kill (gracfully)]
-m [minimize]
-s [show]
Press <Enter> to cancel
------------------------------------------------------------
1 -k
Если нет никаких окон:
There are no windows for pid 1234
#!/usr/bin/env python3
import subprocess
import sys
pid = sys.argv[1]
message = """
------------------------------------------------------------
Type window number + option:
-k [kill (gracfully)]
-m [minimize]
-s s[how]
<Enter> to cancel
------------------------------------------------------------
"""
# just a helper function
get = lambda cmd: subprocess.check_output(cmd).decode("utf-8").strip()
# get the window list
wlist = [l.split()[0] for l in get(["wmctrl", "-lp"]).splitlines() if pid in l]
# create a indexed list of window name, id
wdata = [[i+1, get(["xdotool", "getwindowname", w_id]), w_id] \
for i, w_id in enumerate(wlist)]
# if the list is not empty (windows exist)
if wdata:
# print the window list
print("\nCurrent Windows for pid "+pid+":\n"+"-"*60)
for item in wdata:
print("["+str(item[0])+"]", item[1])
# ask for user input (see "message" at the top)
action = input(message)
action = action.split()
# run the chosen action
try:
subj = [item[2] for item in wdata if item[0] == int(action[0])][0]
options = ["-k", "-m", "-s"]; option = options.index(action[1])
command = [
["wmctrl", "-ic", subj],
["xdotool", "windowminimize", subj],
["wmctrl", "-ia", subj],
][option]
subprocess.Popen(command)
except (IndexError, ValueError):
pass
else:
print("There are no windows for pid", pid)
Сценарий использует обоих xdotool
и wmctrl
:
sudo apt-get install wmctrl xdotool
Скопируйте сценарий в пустой файл, сохраните его как get_wlist.py
Выполните его с командой:
python3 /path/to/get_wlist.py <pid>
Для управления переместите или закройте окна, на Linux существует два важных инструмента: xdotool
и wmctrl
. Из этих двух, xdotool
вероятно, самый устойчивый, который я предпочитаю в целом. Хотя опции обоих перекрытий инструментов, они действительно завершают друг друга однако, и создать список окна нам просто нужно wmctrl
.
В большинстве случаев поэтому я заканчиваю тем, что использовал смесь обоих инструментов.
Что делает сценарий:
Сценарий получает в настоящее время открываемый список окна, с помощью команды:
wmctrl -lp
Который дает нам информацию и об идентификаторе окна и о pid, это принадлежит, с выводом, будучи похож:
0x05a03ecc 0 2189 jacob-System-Product-Name Niet-opgeslagen document 1 - gedit
Сценарий затем отфильтровывает окна, принадлежа соответствующему pid, ищет имя окна с xdotool
команда:
xdotool getwindowname <window_id>
и отображает найденные окна по имени. Под капотом пронумерованы эти окна.
впоследствии, если пользователь вводит число + опция, соответствующее действие выполняется на выбранном окне:
wmctrl -ic <window_id>
закрывать окно корректно, или
xdotool windowminimize <window_id>
минимизировать выбранное окно, или
wmctrl -ia <window_id>
повысить окно.