Ho bisogno di un elenco con solo quelle app che sono attualmente aperte / in esecuzione in Dash, quelle che hanno quella piccola freccia bianca sul lato sinistro dell'icona.
C'è un modo per ottenerlo?
Ho bisogno di un elenco con solo quelle app che sono attualmente aperte / in esecuzione in Dash, quelle che hanno quella piccola freccia bianca sul lato sinistro dell'icona.
C'è un modo per ottenerlo?
Risposte:
Il modo di farlo con qdbus
e l' org.ayatana.bamf
interfaccia.
Elenco di applicazioni aperte per .desktop
file:
$ 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
Utilizzo org.ayatana.bamf.matcher.RunningApplications
e org.ayatana.bamf.view.Name
metodi
$ 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
Domanda interessante.
Come sempre, ci sono diversi modi per ottenere un elenco di queste applicazioni, ognuna con specifici vantaggi e svantaggi pubblicitari.
Poiché nel Launcher vengono visualizzate solo le applicazioni con una finestra (mappata), utilizzando:
wmctrl -lp
( wmctrl
non è installato per impostazione predefinita), possiamo ottenere un elenco di finestre aperte e il processo a cui appartengono le finestre. Il formato dell'output è:
0x05204641 0 12618 jacob-System-Product-Name verhaal (~) - gedit
dove per noi si trovano le informazioni più importanti:
0x05204641
); questa è la finestra -id12618
); questo è l' id di processo (pid) a cui appartiene la finestra everhaal (~) - gedit
); questo è il nome della finestra .Una volta ottenuto il pid, possiamo cercare il nome del processo corrispondente tramite il comando:
ps -p <pid> -o comm=
Possiamo eseguire lo script dei passaggi precedenti ed elencare gli output per le finestre esistenti, come (usando python
):
{'gnome-terminal', 'nautilus', 'gedit', 'GuitarPro.exe', 'firefox', 'thunderbird', 'soffice.bin'}
Questo sembra semplice. Tuttavia, come sempre, la realtà è un po 'più complicata. Ci sono alcune eccezioni e complicazioni di cui dobbiamo occuparci:
Idle
( python
IDE) o tkinter
sono tali finestre.wmctrl
, ma non vengono visualizzate separatamente in Dash.LibreOffice
cui tutti i moduli abbiano il nome del processo soffice.bin
. Allo stesso tempo, l'esecuzione del comando soffice.bin
non funzionerà. Nel caso in cui sia necessario identificare i moduli ( Calc
, Writer
ecc.) Separatamente, è necessario ottenere ulteriori informazioni, ad esempio dal nome della finestra .gnome-terminal
, come appare nell'elenco dei processi, come nell'output di ps -e ww
. In 14.04, gnome-terminal
appare come gnome-terminal
, tuttavia, in 15.04 / 15.10 mostra: /usr/lib/gnome-terminal/gnome-terminal-server
.Per risolvere i problemi più importanti sopra, è necessario:
aggiungere un segno di spunta se la finestra è una finestra "reale" o "normale", verificando con
xprop -id <window_id>
Se l'output include la riga:
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_NORMAL
La finestra è una finestra valida nel senso di Unity Launcher
gnome-terminal
in 15.x
(supponendo che si desideri che sia il nome del processo presentato gnome-terminal
), è necessario aggiungere un'eccezione, in cui rinominare il nome del processo gnome-terminal
se appare come
/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)
La sceneggiatura ha bisogno di wmctrl
:
sudo apt-get install wmctrl
copia lo script sopra in un file vuoto, salvalo come get_running.py
eseguirlo dal comando:
python3 /path/to/get_running.py
Verrà emesso come:
{'gnome-terminal', 'nautilus', 'gedit', 'GuitarPro.exe', 'firefox', 'thunderbird', 'soffice.bin'}
oppure, eseguire con l'argomento -list
:
thunderbird
nautilus
gnome-terminal
firefox
gedit
GuitarPro.exe
soffice.bin
Dalla tua domanda, non è del tutto chiaro quale sia esattamente lo scopo dell'elenco trovato. Se devi avere il nome dell'applicazione, come appare nell'interfaccia (nomi "leggibili"), potrebbe essere adatto un approccio completamente diverso:
.desktop
file /usr/share/applications
. Nella maggior parte dei casi, possiamo concludere il nome del processo e il nome dell'interfaccia dell'applicazione dal suo .desktop
file. Usando queste informazioni, potremmo relativamente facilmente creare un elenco di applicazioni GUI in esecuzione, presentate con il loro nome "leggibile".Anche in questo caso, tuttavia, la realtà è anche più complicata della teoria, come spiegato qui .