Як отримати список запущених 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.