Мне нужен список только с теми приложениями, которые в данный момент открыты / работают в 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
Интересный вопрос
Как всегда, есть разные способы получить список этих приложений, каждое из которых имеет свои преимущества и недостатки.
Поскольку в Launcher отображаются только приложения с (отображенным) окном, используя:
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
, но не отображаются отдельно в Dash.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 Launcher
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
файла. Используя эту информацию, мы могли относительно легко создать список запущенных приложений с графическим интерфейсом, представленный их «читаемым» именем.Однако и в этом случае реальность также более сложна, чем теория, как объясняется здесь .