Estou trabalhando com multitoque e tento fazer coisas diferentes em aplicativos diferentes com os mesmos gestos.
Eu tenho um script python, funciona básico.
Bot, como posso decidir entre os aplicativos? Como obter o título da janela ativa?
Obrigado
Editar informações do sistema:
- Pitão 2.7.6
- Ubuntu 14.04 (Unidade)
Responder1
Abaixo versão atualizada. Vou deixar a resposta antiga, para não retirar a resposta que obteve os votos.
#!/usr/bin/env python3
import gi
gi.require_version("Wnck", "3.0")
from gi.repository import Wnck
scr = Wnck.Screen.get_default()
scr.force_update()
print(scr.get_active_window().get_name())
ou obtenha xid:
print(scr.get_active_window().get_xid())
ou (não muito surpreendente) obtenha pid:
print(scr.get_active_window().get_pid())
Veja também aqui para obterMétodos Wnck.Window.
Resposta antiga:
Eu apenas analisaria a saída de or xprop
e xwit
( wmctrl
talvez seja necessário instalar wmctrl
primeiro: sudo apt-get install wmctrl
). xprop dábastantede informações nas janelas.
xprop -root
fornece informações sobre a janela ativa, o ID da janela e
wmctrl -l
fornece uma lista das janelas abertas no momento. Usar a -p
opção também fornece informações sobre os pids aos quais as janelas pertencem. Combinados, você pode obter todas as informações que precisa.
por exemplo:
Em python 3, usando o subprocesso check_output():
Para obter a janela ativa (id):
-usando xprop
# [1]
import subprocess
command = "xprop -root _NET_ACTIVE_WINDOW | sed 's/.* //'"
frontmost = subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8").strip()
print(frontmost)
> 0x38060fd
-usando xprop, analisando-o "dentro" do python
# [2]
import subprocess
command = "xprop -root _NET_ACTIVE_WINDOW"
frontmost = subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8").strip().split()[-1]
print(frontmost)
> 0x38060fd
Assim que tivermos o window-id, obtenha o (pid do) aplicativo ao qual ele pertence, usando wmctrl:
NB: primeiro, temos que "consertar" o id (saída) mais frontal do comando acima para wmctrl; o id de wmctrl e xprop difere ligeiramente:
0x381e427 (xprop)
0x0381e427 (wmctrl)
para corrigir a saída da função acima (usando a saída "mais frontal" de # [1]
or # [2]
):
fixed_id = frontmost[:2]+"0"+frontmost[2:]
em seguida, obtenha o pid da (aplicação da) janela frontal:
command = "wmctrl -lp"
window_pid = [l.split()[2] for l in subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8").splitlines() if fixed_id in l][0]
> 6262
Em python 2, usando subprocess.Popen():
No python 2, subprocess.check_output não está disponível, então o procedimento é um pouco diferente e um pouco mais detalhado:
Para obter a janela ativa (id):
-usando xprop
# [1]
import subprocess
command = "xprop -root _NET_ACTIVE_WINDOW"
output = subprocess.Popen(["/bin/bash", "-c", command], stdout=subprocess.PIPE)
frontmost = output.communicate()[0].decode("utf-8").strip().split()[-1]
print frontmost
> 0x38060fd
para obter o (pid do) aplicativo ao qual pertence, usando wmctrl e a saída de# [1]
-(novamente) usando (e corrigindo) a saída de [1]
:
# [2]
import subprocess
fixed_id = frontmost[:2]+"0"+frontmost[2:]
command = "wmctrl -lp"
output = subprocess.Popen(["/bin/bash", "-c", command], stdout=subprocess.PIPE)
window_pid = [l.split()[2] for l in output.communicate()[0].decode("utf-8").splitlines() if fixed_id in l][0]
print window_pid # pid of the application
> 6262
para pegar a janelanome, usando wmctrl
e a saída de # [1]
(também usando socket.gethostname()
para dividir a saída wmctrl
por nome da máquina)
# [3]
import subprocess
import socket
command = "wmctrl -lp"
output = subprocess.Popen(["/bin/bash", "-c", command], stdout=subprocess.PIPE)
window_list = output.communicate()[0].decode("utf-8")
window_name = [l for l in window_list.split("\n") if fixed_id in l][0].split(socket.gethostname()+" ")[-1]
print window_name