Як отримати список запущених GUI-програм у Unity Launcher?


8

Мені потрібен список із лише тими програмами, які наразі відкриті / запущені на Dash, - ті, у яких маленька біла стрілка (и) знаходиться зліва від піктограми.

Чи є спосіб отримати його?

тире зі знімком екрана


1
Що таке контекст і як вам потрібно, щоб список був доступний (у якій формі)?
— Яків Влійм

Список відкритих вікон? Це легко зробити, але, як сказав Яків, нам, мабуть, потрібно буде знати більше інформації
— Сергій Колодяжний

Пов’язаний і, швидше за все, дублікат: askubuntu.com/q/483554/295286
— Сергій Колодяжний,

Відповіді:


4

Спосіб зробити це 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

Тепер це вражає!
— Яків Влійм

@JacobVlijm Існує більше варіантів щодо цього, але вони мають конкретне призначення та потребують більше коду та розбору. Я тут просто приклеював найпростіші. Але дякую :)
— Сергій Колодяжний

5

Цікаве запитання.

Як завжди, існують різні способи отримання списку цих додатків, кожне з яких має конкретні додаткові та недоліки.

Отримання списку процесів, представлених у запуску, за допомогою віконного списку

Оскільки у програмі запуску відображаються лише програми із (відображеним) вікном, використовуючи:

wmctrl -lp 

( wmctrlне встановлено за замовчуванням), ми можемо отримати список відкритих вікон та процес, до якого належать вікна. Формат виводу:

0x05204641  0 12618  jacob-System-Product-Name verhaal (~) - gedit

де для нас найважливіша інформація:

  • перша рядок ( 0x05204641); це вікно -id
  • третя рядок ( 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( pythonIDE) або 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
    

    Вікно є дійсним вікном у значенні пускової програми 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)

Як користуватись

  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
    

Примітки

З вашого запитання не зовсім зрозуміло, яка саме мета знайденого списку. Якщо вам потрібно мати ім’я програми, як це відображається в інтерфейсі ("читабельні" імена), можливо, підходить абсолютно інший підхід:

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

Однак у цьому випадку реальність також є більш складною, ніж теорія, як пояснено тут .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.