Мені потрібен список із лише тими програмами, які наразі відкриті / запущені на Dash, - ті, у яких маленька біла стрілка (и) знаходиться зліва від піктограми.
Чи є спосіб отримати його?
Мені потрібен список із лише тими програмами, які наразі відкриті / запущені на Dash, - ті, у яких маленька біла стрілка (и) знаходиться зліва від піктограми.
Чи є спосіб отримати його?
Відповіді:
Спосіб зробити це qdbus
та org.ayatana.bamf
інтерфейс.
Список відкритих програм за .desktop
файлом:
$ qdbus org.ayatana.bamf /org/ayatana/bamf/matcher \
> org.ayatana.bamf.matcher.RunningApplicationsDesktopFiles
/usr/share/applications/compiz.desktop
/usr/share/applications/firefox.desktop
/usr/share/applications/x-terminal-emulator.desktop
Використання org.ayatana.bamf.matcher.RunningApplications
та org.ayatana.bamf.view.Name
методи
$ qdbus org.ayatana.bamf /org/ayatana/bamf/matcher \
> org.ayatana.bamf.matcher.RunningApplications | \
> xargs -I {} qdbus org.ayatana.bamf {} org.ayatana.bamf.view.Name
Firefox Web Browser
MY CUSTOM TERMINAL
Compiz
Цікаве запитання.
Як завжди, існують різні способи отримання списку цих додатків, кожне з яких має конкретні додаткові та недоліки.
Оскільки у програмі запуску відображаються лише програми із (відображеним) вікном, використовуючи:
wmctrl -lp
( wmctrl
не встановлено за замовчуванням), ми можемо отримати список відкритих вікон та процес, до якого належать вікна. Формат виводу:
0x05204641 0 12618 jacob-System-Product-Name verhaal (~) - gedit
де для нас найважливіша інформація:
0x05204641
); це вікно -id12618
); це ідентифікатор процесу (pid), якому належить вікно, і,verhaal (~) - gedit
); це ім'я вікна .Щойно у нас є pid, ми можемо шукати відповідну назву процесу за допомогою команди:
ps -p <pid> -o comm=
Ми можемо прописати описані вище кроки та перерахувати вихід (и) для існуючих вікон, виглядаючи (використовуючи python
):
{'gnome-terminal', 'nautilus', 'gedit', 'GuitarPro.exe', 'firefox', 'thunderbird', 'soffice.bin'}
Це здається прямолінійним. Однак, як завжди, реальність дещо складніша. Є кілька винятків та ускладнень, з якими нам потрібно подолати:
Idle
( python
IDE) або tkinter
такі вікна.wmctrl
, але не відображаються окремо в тирі.LibreOffice
коли всі модулі мають ім'я процесу soffice.bin
. У той же час, запустити команду soffice.bin
не вийде. У разі , якщо необхідно визначити модулі ( Calc
, і Writer
т.д.) окремо, ви повинні були б отримати додаткову інформацію, з вікна назви , наприклад.gnome-terminal
, як це відображається у списку процесів, як у висновку ps -e ww
. Однак у 14.04 gnome-terminal
з'являється як gnome-terminal
у 15.04 / 15.10 /usr/lib/gnome-terminal/gnome-terminal-server
.Щоб виправити найважливіші проблеми вище, вам потрібно:
додайте чек, чи це вікно "справжнє" або "нормальне" вікно, позначаючи
xprop -id <window_id>
Якщо вихід включає рядок:
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_NORMAL
Вікно є дійсним вікном у значенні пускової програми Unity
gnome-terminal
в 15.x
(якщо ви хочете, щоб було представлене ім'я процесу gnome-terminal
), нам потрібно додати виняток, щоб перейменувати ім'я процесу, gnome-terminal
якщо воно відображається як
/usr/lib/gnome-terminal/gnome-terminal-server
#!/usr/bin/env python3
import subprocess
import sys
try:
listed = sys.argv[1]
except IndexError:
listed = []
get = lambda cmd: subprocess.check_output(cmd).decode("utf-8").strip()
def check_wtype(w_id):
# check the type of window; only list "NORMAL" windows
return "_NET_WM_WINDOW_TYPE_NORMAL" in get(["xprop", "-id", w_id])
def get_process(w_id):
# get the name of the process, owning the window
proc = get(["ps", "-p", w_id, "-o", "comm="])
proc = "gnome-terminal" if "gnome-terminal" in proc else proc
return proc
wlist = [l.split() for l in subprocess.check_output(["wmctrl", "-lp"])\
.decode("utf-8").splitlines()]
validprocs = set([get_process(w[2]) for w in wlist if check_wtype(w[0]) == True])
if listed == "-list":
for p in validprocs:
print(p)
else:
print(validprocs)
Сценарій потребує wmctrl
:
sudo apt-get install wmctrl
скопіюйте сценарій вище в порожній файл, збережіть його як get_running.py
запустити його командою:
python3 /path/to/get_running.py
Він виведе так:
{'gnome-terminal', 'nautilus', 'gedit', 'GuitarPro.exe', 'firefox', 'thunderbird', 'soffice.bin'}
або, запустіть з аргументом -list
:
thunderbird
nautilus
gnome-terminal
firefox
gedit
GuitarPro.exe
soffice.bin
З вашого запитання не зовсім зрозуміло, яка саме мета знайденого списку. Якщо вам потрібно мати ім’я програми, як це відображається в інтерфейсі ("читабельні" імена), можливо, підходить абсолютно інший підхід:
.desktop
файл у /usr/share/applications
. У більшості випадків ми можемо укласти ім'я процесу та ім'я інтерфейсу програми з її .desktop
файлу. Використовуючи цю інформацію, ми могли б відносно легко створити список запущених програм GUI, представлений їх "читабельним" ім'ям.Однак у цьому випадку реальність також є більш складною, ніж теорія, як пояснено тут .