Мне нужен список только с теми приложениями, которые в данный момент открыты / работают в Dash, с теми, которые имеют маленькую белую стрелку (и) в левой части значка.
Есть ли способ получить это?
14.04
unity-dash
process
launcher
ovidb
источник
источник
Ответы:
Способ сделать это с
qdbus
иorg.ayatana.bamf
интерфейсом.Список открытых приложений по
.desktop
файлам:Использование
org.ayatana.bamf.matcher.RunningApplications
иorg.ayatana.bamf.view.Name
методыисточник
Интересный вопрос
Как всегда, есть разные способы получить список этих приложений, каждое из которых имеет свои преимущества и недостатки.
Получение списка процессов, представленных в Launcher, используя список окон
Поскольку в Launcher отображаются только приложения с (отображенным) окном, используя:
(
wmctrl
не устанавливается по умолчанию), мы можем получить список открытых окон и идентификатор процесса, к которому они принадлежат. Формат вывода:где для нас самая важная информация находится в:
0x05204641
); это окно -id12618
); это идентификатор процесса (pid), к которому принадлежит окно, и,verhaal (~) - gedit
); это имя окна .Получив pid, мы можем найти соответствующее имя процесса с помощью команды:
Мы можем написать сценарий, описанный выше, и перечислить вывод (ы) для существующих окон, используя (используя
python
):осложнения
Это кажется простым. Однако, как всегда, реальность немного сложнее. Есть несколько исключений и осложнений, о которых нам нужно позаботиться:
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
.Что нам нужно исправить хотя бы
Чтобы исправить наиболее важные проблемы, описанные выше, вам необходимо:
добавить проверку, является ли окно "реальным" или "нормальным" окном, проверяя с помощью
Если вывод содержит строку:
Окно является действительным окном в смысле Unity Launcher
gnome-terminal
в15.x
(при условии, что вы хотите, чтобы имя представленного процесса былоgnome-terminal
), нам нужно добавить исключение, чтобы переименовать имя процесса,gnome-terminal
если оно выглядит как/usr/lib/gnome-terminal/gnome-terminal-server
скрипт
Как пользоваться
Скрипту нужно
wmctrl
:скопируйте скрипт выше в пустой файл, сохраните его как
get_running.py
запустите его командой:
Это выведет как:
или запустите с аргументом
-list
:Ноты
Из вашего вопроса не совсем понятно, какова цель найденного списка. Если вам нужно иметь имя приложения, как оно отображается в интерфейсе («читаемые» имена), может подойти совершенно другой подход:
.desktop
файл в/usr/share/applications
. В далеких большинстве случаев, можно заключить имя процесса и имя интерфейса приложения из его.desktop
файла. Используя эту информацию, мы могли относительно легко создать список запущенных приложений с графическим интерфейсом, представленный их «читаемым» именем.Однако и в этом случае реальность также более сложна, чем теория, как объясняется здесь .
источник