Abaixo de um script que alterna entre as janelas do aplicativo. Ele lembra a última janela usada (= frontmost) de todos os aplicativos em execução, ignorando outras janelas do mesmo aplicativo.
O script é baseado no mesmo princípio que os scripts aqui , mas desde que o script só é executado quando uma combinação de teclas é pressionada, a última janela usada (por aplicativo) precisa ser armazenada e lida fora do script (memória de -).
Como usar
-
O script usa
wmctrl
sudo apt-get install wmctrl
-
Copie o script abaixo em um arquivo vazio, igual a
alternative_switcher.py
-
Adicione a uma combinação de teclas de atalho: Escolha: Configurações do sistema > "Teclado" > "Atalhos" > "Atalhos personalizados". Clique no botão "+" e adicione o comando:
python3 /path/to/alternative_switcher.py
-
Use-o como um alternador alternativo com sua combinação de teclas.
Nota
O script alterna entre janelas de aplicativos "normais", conforme definido como "_NET_WM_WINDOW_TYPE_NORMAL" na saída do comando xprop -id <window_id>
. Isso significa que janelas de diálogo serão excluídas da lista de janelas, assim como Idle
windows por exemplo, que possuem pid 0.
O script
#!/usr/bin/env python3
import subprocess
import os
import getpass
home = os.environ["HOME"]
lastdir = home+"/.config/alternative_switcher"; wlist = lastdir+"/"+"wlist.txt"
def get(command):
return subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8")
def get_frontmost():
cmd = "xprop -root"
frontmost = [l for l in get(cmd).splitlines() if\
"ACTIVE_WINDOW(WINDOW)" in l][0].split()[-1]
return frontmost[:2]+"0"+frontmost[2:]
# read last used windowlist
if not os.path.exists(lastdir):
os.makedirs(lastdir)
try:
with open(wlist) as src:
windowlist = eval(src.read())
except (FileNotFoundError, SyntaxError):
windowlist = []
# creating window list: id, application name
w_data = [l.split()[0:7] for l in get("wmctrl -lpG").splitlines()]
[windowlist.remove(w) for w in windowlist if not w[1] in [data[0] for data in w_data]]
windows = [[get("ps -u "+getpass.getuser()+" | grep "+w[2]).split()[-1], w[0]]
for w in w_data if "_NET_WM_WINDOW_TYPE_NORMAL" in get("xprop -id "+w[0])]
# get frontmost window + application
frontmost = [data for data in windows if data[1] == get_frontmost()][0]
[windowlist.remove(item) for item in windowlist if item[0] == frontmost[0]]
# add frontmost to windowlist of last-used application windows
windowlist.insert(0, frontmost)
current_app = frontmost[0]
# determine next application
apps = sorted(set([w[0] for w in windows]))
next_app_i = apps.index(current_app)+1
if next_app_i == len(apps):
next_app_i = 0
next_app = apps[next_app_i]
# find matching window to raise
try:
next_w = [w[1] for w in windowlist if w[0] == next_app][0]
except IndexError:
next_w = [w[1] for w in windows if w[0] == next_app][0]
# write last- window list
with open(wlist, "wt") as out:
out.write(str(windowlist))
# raise next window
cmd = "wmctrl -ia "+next_w
subprocess.Popen(["/bin/bash", "-c", cmd])