Мне нужен список только с теми приложениями, которые в настоящее время открыты/рабочие в Тире, те, которые имеют ту небольшую белую стрелку (стрелки) на левой стороне значка.
Там какой-либо путь состоит в том, чтобы получить его?
Способ сделать это с 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
); это - окно - идентификатор12618
); это - идентификатор процесса (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
Окно является допустимым окном в смысле Средства запуска Единицы
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, представленных их "читаемым" именем. Также в этом случае однако, действительность также более сложна затем теория, как объяснено здесь.