Potrzebuję listy tylko tych aplikacji, które są obecnie otwarte / uruchomione w Dash, te, które mają małe białe strzałki po lewej stronie ikony.
Czy jest jakiś sposób, aby to zdobyć?
Potrzebuję listy tylko tych aplikacji, które są obecnie otwarte / uruchomione w Dash, te, które mają małe białe strzałki po lewej stronie ikony.
Czy jest jakiś sposób, aby to zdobyć?
Odpowiedzi:
Sposób na zrobienie tego qdbus
i org.ayatana.bamf
interfejs.
Lista otwartych aplikacji według .desktop
pliku:
$ 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
Korzystanie org.ayatana.bamf.matcher.RunningApplications
i org.ayatana.bamf.view.Name
metody
$ 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
Interesujące pytanie.
Jak zawsze, istnieją różne sposoby uzyskania listy tych aplikacji, każda z nich ma określone wady i zalety.
Ponieważ w programie uruchamiającym pojawiają się tylko aplikacje z (odwzorowanym) oknem, używając:
wmctrl -lp
( wmctrl
domyślnie nie jest instalowany), możemy uzyskać listę otwartych okien i proces, do którego należą okna. Format wyniku jest następujący:
0x05204641 0 12618 jacob-System-Product-Name verhaal (~) - gedit
gdzie dla nas najważniejsze informacje:
0x05204641
); to jest okno -id12618
); to jest identyfikator procesu (pid), do którego należy okno, i,verhaal (~) - gedit
); to jest nazwa okna .Po otrzymaniu pid możemy wyszukać odpowiednią nazwę procesu za pomocą polecenia:
ps -p <pid> -o comm=
Możemy napisać powyższe kroki i wyświetlić listę wyników dla istniejących okien, wyglądających jak (za pomocą python
):
{'gnome-terminal', 'nautilus', 'gedit', 'GuitarPro.exe', 'firefox', 'thunderbird', 'soffice.bin'}
Wydaje się to proste. Jednak, jak zawsze, rzeczywistość jest nieco bardziej skomplikowana. Jest kilka wyjątków i komplikacji, które musimy rozwiązać:
Idle
( python
IDE) lub tkinter
są takimi oknami.wmctrl
, ale nie pojawiają się osobno w Dash.LibreOffice
wszystkie moduły mają nazwę procesu soffice.bin
. Jednocześnie uruchomienie polecenia soffice.bin
nie będzie działać. W przypadku trzeba określić moduły ( Calc
, Writer
etc.) osobno, trzeba by uzyskać dodatkowe informacje, z okna za nazwą na przykład.gnome-terminal
, która pojawia się na liście procesów, tak jak na wyjściu ps -e ww
. W 1404, gnome-terminal
pojawia się gnome-terminal
jednak w 15.04 / 15.10 to pokazuje: /usr/lib/gnome-terminal/gnome-terminal-server
.Aby rozwiązać najważniejsze powyższe problemy, musisz:
dodaj zaznaczenie, czy okno jest „prawdziwe” czy „normalne”, sprawdzając za pomocą
xprop -id <window_id>
Jeśli wynik zawiera wiersz:
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_NORMAL
Okno jest prawidłowym oknem w sensie Unity Launcher
gnome-terminal
w 15.x
(zakładając, że chcesz mieć przedstawioną nazwę procesu gnome-terminal
), musimy dodać wyjątek, aby zmienić nazwę nazwy procesu na, gnome-terminal
jeśli wygląda na
/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)
Skrypt potrzebuje wmctrl
:
sudo apt-get install wmctrl
skopiuj powyższy skrypt do pustego pliku, zapisz go jako get_running.py
uruchom go za pomocą polecenia:
python3 /path/to/get_running.py
Wyjdzie jak:
{'gnome-terminal', 'nautilus', 'gedit', 'GuitarPro.exe', 'firefox', 'thunderbird', 'soffice.bin'}
lub uruchom z argumentem -list
:
thunderbird
nautilus
gnome-terminal
firefox
gedit
GuitarPro.exe
soffice.bin
Z twojego pytania nie jest całkowicie jasne, jaki jest dokładnie cel znalezionej listy. Jeśli potrzebujesz mieć nazwę aplikacji, tak jak pojawia się ona w interfejsie („czytelne” nazwy), może być odpowiednie zupełnie inne podejście:
.desktop
plik /usr/share/applications
. W większości przypadków możemy wyciągnąć nazwę procesu i nazwę interfejsu aplikacji z jego .desktop
pliku. Korzystając z tych informacji, moglibyśmy stosunkowo łatwo stworzyć listę uruchomionych aplikacji GUI, przedstawionych według ich „czytelnej” nazwy.Jednak również w tym przypadku rzeczywistość jest bardziej skomplikowana niż teoria, jak wyjaśniono tutaj .