Preciso de uma lista com apenas os aplicativos que estão atualmente abertos / em execução no Dash, aqueles que possuem pequenas flechas brancas no lado esquerdo do ícone.
Existe alguma maneira de obtê-lo?
Preciso de uma lista com apenas os aplicativos que estão atualmente abertos / em execução no Dash, aqueles que possuem pequenas flechas brancas no lado esquerdo do ícone.
Existe alguma maneira de obtê-lo?
Respostas:
A maneira de fazê-lo com qdbus
e org.ayatana.bamf
interface.
Lista de aplicativos abertos por .desktop
arquivo:
$ 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
Usando org.ayatana.bamf.matcher.RunningApplications
e org.ayatana.bamf.view.Name
métodos
$ 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
Pergunta interessante.
Como sempre, existem diferentes maneiras de obter uma lista desses aplicativos, cada um deles com anúncios e desvantagens específicos.
Como apenas aplicativos com uma janela (mapeada) aparecem no Iniciador, usando:
wmctrl -lp
( wmctrl
não está instalado por padrão), podemos obter uma lista de janelas abertas e o ID do processo ao qual as janelas pertencem. O formato da saída é:
0x05204641 0 12618 jacob-System-Product-Name verhaal (~) - gedit
onde estão as informações mais importantes:
0x05204641
); esta é a janela -id12618
); esse é o ID do processo (pid) ao qual a janela pertence e,verhaal (~) - gedit
); este é o nome da janela .Assim que tivermos o pid, podemos procurar o nome do processo correspondente pelo comando:
ps -p <pid> -o comm=
Podemos criar um script das etapas acima e listar os resultados das janelas existentes, parecendo (usando python
):
{'gnome-terminal', 'nautilus', 'gedit', 'GuitarPro.exe', 'firefox', 'thunderbird', 'soffice.bin'}
Isso parece simples. No entanto, como sempre, a realidade é um pouco mais complicada. Existem algumas exceções e complicações que precisamos cuidar:
Idle
( python
IDE) ou tkinter
são essas janelas.wmctrl
, mas não aparecem separadamente no Dash.LibreOffice
que todos os módulos têm o nome do processo soffice.bin
. Ao mesmo tempo, executar o comando soffice.bin
não funcionará. Caso você precise identificar os módulos ( Calc
, Writer
etc.) separadamente, precisará obter informações adicionais, como o nome da janela, por exemplo.gnome-terminal
, como aparece na lista de processos, como na saída de ps -e ww
. Em 14,04, gnome-terminal
aparece como gnome-terminal
, no entanto, em 15.04 / 15.10 mostra: /usr/lib/gnome-terminal/gnome-terminal-server
.Para corrigir os problemas mais importantes acima, você precisa:
adicione uma verificação se a janela é uma janela "real" ou "normal", verificando com
xprop -id <window_id>
Se a saída incluir a linha:
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_NORMAL
A janela é uma janela válida no sentido do Unity Launcher
gnome-terminal
in 15.x
(supondo que você queira que o nome do processo apresentado seja gnome-terminal
), precisamos adicionar uma exceção para renomear o nome do processo gnome-terminal
se ele aparecer como
/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)
O script precisa wmctrl
:
sudo apt-get install wmctrl
copie o script acima em um arquivo vazio, salve-o como get_running.py
execute-o pelo comando:
python3 /path/to/get_running.py
Ele produzirá como:
{'gnome-terminal', 'nautilus', 'gedit', 'GuitarPro.exe', 'firefox', 'thunderbird', 'soffice.bin'}
ou execute com o argumento -list
:
thunderbird
nautilus
gnome-terminal
firefox
gedit
GuitarPro.exe
soffice.bin
Na sua pergunta, não está completamente claro qual é exatamente o objetivo da lista encontrada. Se você precisar ter o nome do aplicativo, como aparece na interface (nomes "legíveis"), uma abordagem completamente diferente pode ser adequada:
.desktop
arquivo /usr/share/applications
. Na maioria dos casos, podemos concluir o nome do processo e o nome da interface do aplicativo a partir de seu .desktop
arquivo. Usando essas informações, é possível criar relativamente fácil uma lista de aplicativos GUI em execução, apresentada pelo nome "legível".Também neste caso, no entanto, a realidade também é mais complicada do que a teoria, conforme explicado aqui .