Como fazer com que o Alt + Tab retorne à mesma janela do aplicativo que a última usada (Unity)

1

Usando Alt + a aba normalmente faz o que eu quero; ele agrupa janelas do mesmo aplicativo. Se eu quiser alternar entre janelas de um mesmo aplicativo, eu uso Alt + '

No entanto, se eu tiver várias janelas de terminal abertas (por exemplo), e eu usar Alt + Tab para alternar para outro aplicativo e, em seguida, voltar para o terminal , outra janela do terminal está na frente do que a última.

Como eu o forço a sempre retornar à mesma janela do aplicativo, como o gnome 3 faz?

Unidade do Ubuntu 14.04.

    
por texasflood 20.01.2015 / 17:47

1 resposta

1

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])
    
por Jacob Vlijm 21.01.2015 / 15:39