Как получить список запуска приложений GUI в Средстве запуска Единицы?

Мне нужен список только с теми приложениями, которые в настоящее время открыты/рабочие в Тире, те, которые имеют ту небольшую белую стрелку (стрелки) на левой стороне значка.

Там какой-либо путь состоит в том, чтобы получить его?

dash with arrows screenshoot

8
задан 1 February 2016 в 05:05

2 ответа

Способ сделать это с 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
4
ответ дан 23 November 2019 в 05:40

Интересный вопрос.

Как всегда, существуют различные способы получить список этих приложений, каждого из них с определенной рекламой - и недостатки.

Получение списка процессов, представленных в Средстве запуска, использование списка окна

Так как только приложения с (отображенным) окном появляются в Средстве запуска, с помощью:

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'}

Сложности

Это кажется простым. Однако как всегда, действительность немного более сложна. Существует несколько исключений и сложностей, о которых мы должны заботиться:

  1. Некоторые окна будут принадлежать pid 0, который повысит ошибку при попытке получить их свойства. Windows Idle (python IDE) или tkinter такие окна.
  2. Некоторые окна не "реальны" или окна, как переходные окна (окна, от которых называют, и принадлежащий другим окнам), или например сам рабочий стол. Эти окна перечислены как окна в выводе wmctrl, но не появляйтесь отдельно в Тире.
  3. В некоторых случаях название приложения очень отличается от имени процесса, например, в случае LibreOffice где все модули имеют название процесса soffice.bin. В то же время, выполнение команды soffice.bin не будет работать. В случае, если необходимо определить модули (Calc, Writer и т.д.), отдельно необходимо было бы получить дополнительную информацию с имени окна, например.
  4. Другим примером является название процесса 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)

Как использовать

  1. Потребности сценария wmctrl:

    sudo apt-get install wmctrl
    
  2. скопируйте сценарий выше в пустой файл, сохраните его как get_running.py

  3. выполните его командой:

    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
    

Примечания

От Вашего вопроса не абсолютно ясно, что является точно целью найденного списка. Если у Вас должно быть название приложения, как это появляется в интерфейсе ("читаемые" имена), совершенно другой подход мог бы подойти:

  • Все глобально установленные приложения действительно имеют a .desktop файл в /usr/share/applications. В намного большинстве случаев мы можем завершить имя процесса и имя интерфейса приложения от .desktop файл. Используя эту информацию, мы могли относительно легкий создавать список запуска приложений GUI, представленных их "читаемым" именем.

Также в этом случае однако, действительность также более сложна затем теория, как объяснено здесь.

5
ответ дан 23 November 2019 в 05:40

Другие вопросы по тегам:

Похожие вопросы: