Bagaimana cara mendapatkan daftar menjalankan aplikasi GUI di Unity Launcher?

8

Saya memerlukan daftar dengan hanya aplikasi yang saat ini terbuka / berjalan di Dash, yang memiliki panah putih kecil di sisi kiri ikon.

Apakah ada cara untuk mendapatkannya?

lari dengan panah screenshoot

ovidb
sumber
1
Apa konteksnya dan bagaimana Anda membutuhkan daftar itu tersedia (dalam bentuk apa)?
Jacob Vlijm
Daftar windows yang terbuka? Dapat dengan mudah dilakukan, tetapi seperti kata Yakub, kita mungkin perlu mengetahui lebih banyak info
Sergiy Kolodyazhnyy
Terkait, dan sangat mungkin duplikat: askubuntu.com/q/483554/295286
Sergiy Kolodyazhnyy

Jawaban:

4

Cara melakukannya dengan qdbusdan org.ayatana.bamfantarmuka.

Daftar aplikasi terbuka berdasarkan .desktopfile:

$ 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

Menggunakan org.ayatana.bamf.matcher.RunningApplicationsdan org.ayatana.bamf.view.Namemetode

$ 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
Sergiy Kolodyazhnyy
sumber
Nah, itu mengesankan!
Jacob Vlijm
@JacobVlijm Ada lebih banyak variasi tentang ini, tetapi mereka memiliki tujuan khusus dan memerlukan lebih banyak kode dan penguraian. Saya baru saja menempelkan yang paling sederhana di sini. Tapi terima kasih :)
Sergiy Kolodyazhnyy
5

Pertanyaan menarik.

Seperti biasa, ada berbagai cara untuk mendapatkan daftar aplikasi ini, masing-masing dengan kekurangan dan iklan tertentu.

Mendapatkan daftar proses, diwakili dalam Peluncur, menggunakan daftar jendela

Karena hanya aplikasi dengan jendela (yang dipetakan) yang muncul di Peluncur, menggunakan:

wmctrl -lp 

( wmctrltidak terinstal secara default), kita bisa mendapatkan daftar windows yang dibuka dan proses milik windows. Format output adalah:

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

di mana bagi kami informasi paling penting adalah:

  • string pertama ( 0x05204641); ini adalah jendela -id
  • string ketiga ( 12618); ini adalah id proses (pid) milik jendela, dan,
  • bagian terakhir ( verhaal (~) - gedit); ini adalah nama jendelanya .

Setelah kita memiliki pid, kita dapat mencari nama proses yang sesuai dengan perintah:

ps -p <pid> -o comm=

Kita dapat membuat skrip langkah-langkah di atas, dan daftar output untuk windows yang ada, terlihat seperti (menggunakan python):

{'gnome-terminal', 'nautilus', 'gedit', 'GuitarPro.exe', 'firefox', 'thunderbird', 'soffice.bin'}

Komplikasi

Ini kelihatannya mudah. Namun, seperti biasa, kenyataan sedikit lebih rumit. Ada beberapa pengecualian dan komplikasi yang perlu kita tangani:

  1. Beberapa jendela akan menjadi milik pid 0 , yang akan menimbulkan kesalahan ketika mencoba untuk mendapatkan propertinya. Windows Idle( pythonIDE) atau tkinterjendela semacam itu.
  2. Beberapa jendela bukan "asli" atau jendela, seperti jendela sementara (windows, yang dipanggil dari, dan milik jendela lain) atau misalnya desktop itu sendiri. Jendela-jendela ini terdaftar sebagai jendela di keluaran wmctrl, tetapi tidak muncul secara terpisah di Dash.
  3. Dalam beberapa kasus, nama aplikasi sangat berbeda dari nama proses, misalnya dalam kasus di LibreOfficemana semua modul memiliki nama proses soffice.bin. Pada saat yang sama, menjalankan perintah soffice.bin tidak akan berhasil. Dalam kasus Anda perlu mengidentifikasi modul ( Calc, Writerdll) secara terpisah, Anda akan perlu untuk mendapatkan informasi tambahan, dari jendela nama misalnya.
  4. Contoh lain adalah nama proses gnome-terminal, seperti yang muncul dalam daftar proses, seperti pada output dari ps -e ww. Di 14,04, gnome-terminalmuncul sebagai gnome-terminal, namun, dalam 15.04 / 15.10 itu menunjukkan: /usr/lib/gnome-terminal/gnome-terminal-server.

Apa yang perlu kita perbaiki setidaknya

Untuk memperbaiki masalah paling penting di atas, Anda perlu:

  • tambahkan tanda centang jika jendela itu adalah jendela "nyata" atau "normal", periksa

    xprop -id <window_id>
    

    Jika output termasuk baris:

    _NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_NORMAL
    

    Jendela adalah jendela yang valid dalam arti Unity Launcher

  • Untuk memperbaiki nama proses gnome-terminaldi 15.x(dengan asumsi Anda ingin nama proses yang disajikan gnome-terminal), kita perlu menambahkan pengecualian, untuk mengubah nama proses menjadi gnome-terminaljika muncul sebagai /usr/lib/gnome-terminal/gnome-terminal-server

Naskah

#!/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)

Cara Penggunaan

  1. Kebutuhan skrip wmctrl:

    sudo apt-get install wmctrl
    
  2. salin skrip di atas ke dalam file kosong, simpan sebagai get_running.py

  3. jalankan dengan perintah:

    python3 /path/to/get_running.py
    

    Ini akan menampilkan seperti:

    {'gnome-terminal', 'nautilus', 'gedit', 'GuitarPro.exe', 'firefox', 'thunderbird', 'soffice.bin'}
    

    atau, jalankan dengan argumen -list:

    thunderbird
    nautilus
    gnome-terminal
    firefox
    gedit
    GuitarPro.exe
    soffice.bin
    

Catatan

Dari pertanyaan Anda, tidak sepenuhnya jelas apa sebenarnya tujuan daftar yang ditemukan. Jika Anda perlu memiliki nama aplikasi, seperti yang muncul di antarmuka (nama "dapat dibaca"), pendekatan yang sama sekali berbeda mungkin cocok:

  • Semua aplikasi yang terinstal secara global memiliki .desktopfile /usr/share/applications. Dalam kebanyakan kasus, kita dapat menyimpulkan nama proses dan nama antarmuka aplikasi dari .desktopfile -nya . Dengan menggunakan informasi ini, kami dapat membuat daftar aplikasi GUI yang berjalan relatif mudah, disajikan dengan nama "dapat dibaca".

Namun dalam kasus ini, kenyataan juga lebih rumit daripada teori, seperti yang dijelaskan di sini .

Yakub Vlijm
sumber