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?

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?

Jawaban:
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
Pertanyaan menarik.
Seperti biasa, ada berbagai cara untuk mendapatkan daftar aplikasi ini, masing-masing dengan kekurangan dan iklan tertentu.
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:
0x05204641); ini adalah jendela -id12618); ini adalah id proses (pid) milik jendela, dan,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'}
Ini kelihatannya mudah. Namun, seperti biasa, kenyataan sedikit lebih rumit. Ada beberapa pengecualian dan komplikasi yang perlu kita tangani:
Idle( pythonIDE) atau tkinterjendela semacam itu.wmctrl, tetapi tidak muncul secara terpisah di Dash.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.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.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
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#!/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)
Kebutuhan skrip wmctrl:
sudo apt-get install wmctrl
salin skrip di atas ke dalam file kosong, simpan sebagai get_running.py
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
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:
.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 .