Come ottenere l'elenco delle applicazioni GUI in esecuzione in Unity Launcher?


8

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?

trattino con le frecce screenshot


1
Qual è il contesto e come sarebbe necessario che l'elenco fosse disponibile (in quale forma)?
Jacob Vlijm,

Elenco di finestre aperte? Può essere fatto facilmente, ma come ha detto Jacob, probabilmente avremmo bisogno di sapere maggiori informazioni
Sergiy Kolodyazhnyy,

Correlato, e molto probabilmente un duplicato: askubuntu.com/q/483554/295286
Sergiy Kolodyazhnyy,

Risposte:


4

Il modo di farlo con qdbuse l' org.ayatana.bamfinterfaccia.

Elenco di applicazioni aperte per .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

Utilizzo org.ayatana.bamf.matcher.RunningApplicationse org.ayatana.bamf.view.Namemetodi

$ 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

Questo è impressionante!
Jacob Vlijm,

@JacobVlijm Ci sono più varianti su questo, ma hanno uno scopo specifico e richiedono più codice e analisi. Ho appena incollato i più semplici qui. Ma grazie :)
Sergiy Kolodyazhnyy,

5

Domanda interessante.

Come sempre, ci sono diversi modi per ottenere un elenco di queste applicazioni, ognuna con specifici vantaggi e svantaggi pubblicitari.

Ottenere un elenco di processi, rappresentato nel programma di avvio, utilizzando l'elenco delle finestre

Poiché nel Launcher vengono visualizzate solo le applicazioni con una finestra (mappata), utilizzando:

wmctrl -lp 

( wmctrlnon è 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:

  • la prima stringa ( 0x05204641); questa è la finestra -id
  • la terza stringa ( 12618); questo è l' id di processo (pid) a cui appartiene la finestra e
  • l'ultima sezione ( verhaal (~) - 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'}

complicazioni

Questo sembra semplice. Tuttavia, come sempre, la realtà è un po 'più complicata. Ci sono alcune eccezioni e complicazioni di cui dobbiamo occuparci:

  1. Alcune finestre apparterranno a pid 0 , che genererà un errore quando si tenta di ottenere le loro proprietà. Windows di Idle( pythonIDE) o tkintersono tali finestre.
  2. Alcune finestre non sono "reali" o finestre, come finestre transitorie (finestre che vengono chiamate e appartenenti ad altre finestre) o, ad esempio, il desktop stesso. Queste finestre sono elencate come finestre nell'output di wmctrl, ma non vengono visualizzate separatamente in Dash.
  3. In alcuni casi, il nome dell'applicazione è piuttosto diverso dal nome del processo, ad esempio nel caso in LibreOfficecui 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, Writerecc.) Separatamente, è necessario ottenere ulteriori informazioni, ad esempio dal nome della finestra .
  4. Un altro esempio è il nome del processo di gnome-terminal, come appare nell'elenco dei processi, come nell'output di ps -e ww. In 14.04, gnome-terminalappare come gnome-terminal, tuttavia, in 15.04 / 15.10 mostra: /usr/lib/gnome-terminal/gnome-terminal-server.

Quello che dobbiamo risolvere almeno

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

  • Per correggere il nome del processo gnome-terminalin 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-terminalse appare come /usr/lib/gnome-terminal/gnome-terminal-server

copione

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

Come usare

  1. La sceneggiatura ha bisogno di wmctrl:

    sudo apt-get install wmctrl
    
  2. copia lo script sopra in un file vuoto, salvalo come get_running.py

  3. 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
    

Appunti

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:

  • Tutte le applicazioni installate a livello globale dispongono di un .desktopfile /usr/share/applications. Nella maggior parte dei casi, possiamo concludere il nome del processo e il nome dell'interfaccia dell'applicazione dal suo .desktopfile. 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 .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.