Como evitar janelas sobrepostas no espaço de trabalho
Eu acredito que a solução abaixo está fazendo o que você descreve. É isso que faz:
O efeito usual: janelas sobrepostas aparecerão nos espaços de trabalho adjacentes
Efetivamente,aopressionarumacombinaçãodeteclas,esseseráoresultado
Naprática:
Umexemplo
- Trabalhandono(porexemplo)espaçodetrabalho1,comalgumasjanelassobrepostasemoutrosespaçosdetrabalho
- Emseguida,váparaaáreadetrabalho2epressioneacombinaçãodeteclasdeatalho:todasasjanelas,excetoaquelasnaáreadetrabalhoatual,serãominimizadas,e,portanto,nãoaparecerãonaáreadetrabalhoatualdequalquermaneira(excetoparaoinicializador).
- Emseguida,retornandoaoespaçodetrabalho1,pressionandoacombinaçãodeteclasnovamente,aáreadetrabalhoseráexatamentecomovocêadeixou.Mesmoasjanelasdeordemdejanela(z-wise)epossivelmenteminimizadasserãoexatamentecomoeram.Aomesmotempo,asjanelasemoutroqueaáreadetrabalhoatualestarãoocultas.
Comofunciona
Asoluçãoincluidoisscripts;umscriptdesegundoplano,querastreiaaordemzdasjanelas(jáquenãotemosferramentasparaisso)eumscriptparaminimizarasjanelaserastrearquaisjanelasjáforamminimizadaspelousuário.
Porquedoisscripts?
Inicialmente,eutinhaoscriptcombinadoemum,epareciafuncionarbem.Noentanto,nomeusistema,aumentouaocupaçãodoprocessador(ocioso)de3-4%paraaprox.9-11%,oqueémuitoparaumscriptdefundonaminhaopinião,especialmentequandovocêexecutaváriosscriptsaomesmotempo.Oscriptagoraédivididoemumaseçãodesegundoplanoquerastreiaohistóricodefoco(paraminimizarasjanelasnamesmaordemzquevocêdeixouoespaçodetrabalho)eumscriptparachamarcomumatalhodeteclado.Oscriptdesegundoplanonãoadicionapraticamentenenhumruídodefundo.
Comoconfigurar
Osscriptsprecisamdosdois
wmctrl
exdotool
:sudoapt-getinstallwmctrlxdotool
Copieoscript1abaixoemumarquivovazio,como
focus_history.py
:#!/usr/bin/env python3 import subprocess import time import os rootdata = os.environ["HOME"]+"/.focus_history" def current_windows(): try: return subprocess.check_output(["wmctrl", "-l"]).decode("utf-8") except subprocess.CalledProcessError: pass def convert_format(w_id): return w_id[:2]+(10-len(w_id))*"0"+w_id[2:] def read_data(): return open(rootdata).read().splitlines() def get_top(wlist): try: top = convert_format( [l.split("#")[-1].strip() for l in subprocess.check_output( ["xprop", "-root"] ).decode("utf-8").splitlines() \ if "_NET_ACTIVE_WINDOW(WINDOW)" in l][0]) return [l for l in wlist if top in l][0] except IndexError: pass open(rootdata, "wt").write("This is an empty line") while True: time.sleep(0.5) wdata = current_windows() if wdata != None: wlist = wdata.splitlines() # get frontmost window (as in wmctrl -lG) top = get_top(wlist) oldlist = read_data() if not any([top == oldlist[0], top == None]): # clean up closed windows [oldlist.remove(l) for l in oldlist if not l.split()[0] in wdata] # remove possible other mentions of the active window [oldlist.remove(l) for l in oldlist if l.startswith(top.split()[0])] open(rootdata, "wt").write(("\n").join([top]+oldlist))
-
Copie o script2 abaixo em um arquivo vazio, como
stop_overlap.py
:#!/usr/bin/env python3 import subprocess import time import os wfile = os.environ["HOME"]+"/.m_list" rootdata = os.environ["HOME"]+"/.focus_history" def get_res(): # get the resolution (workspace- size) data = subprocess.check_output(["xrandr"]).decode("utf-8").split() mark = data.index("current") return [int(n) for n in [data[mark+1], data[mark+3].replace(",", "")]] res = get_res() def get_wlist(res): try: # get the window data wlist = [l.split() for l in subprocess.check_output( ["wmctrl", "-lG"]).decode("utf-8").splitlines()] # check if windows are "normal" windows and see if they are minimized show = []; hide = [] for w in wlist: w_data = subprocess.check_output( ["xprop", "-id", w[0]] ).decode("utf-8") quality = [ "_NET_WM_WINDOW_TYPE_NORMAL" in w_data, "_NET_WM_STATE_HIDDEN" in w_data, ] # check if windows are on current workspace or elsewhere onthis = all([0 < int(w[2]) < res[0], 0 < int(w[3]) < res[1]]) # summarize what should be done with the windows if all([quality == [True ,True], onthis == True]): show.append(w[0]) elif all([quality == [True, False], onthis == False]): hide.append(w[0]) return [show, hide, [l[0] for l in wlist]] except subprocess.CalledProcessError: pass oncurrent = []; onother = []; d_wlist = [] wins = get_wlist(res) for w in wins[1]: # hide (minimize) windows on other workspacec -only if- they are not hidden already! subprocess.Popen(["xdotool", "windowminimize", w]) # write hidden windows to a file, so the script will only un- minimize windows # that were not hidden in the first place open(wfile, "a+").write("\n"+w) if wins[0]: # if there are windows on the current workspace that need to be un- minimized, # show them in the correct z- order, as recorded by the other script priority = reversed([l.split()[0] for l in open(rootdata).read().splitlines()]) try: d_wlist = [l for l in open(wfile).read().splitlines() if not l == "\n"] except FileNotFoundError: d_wlist = [] for w in priority: if all([w in wins[0], w in d_wlist]): subprocess.Popen(["wmctrl", "-ia", w]) time.sleep(0.1) d_wlist.remove(w) # clean up window list, remove non- existant windows d_wlist = set([item for item in d_wlist if item in wins[2]]) open(wfile, "wt").write(("\n").join(d_wlist))
-
Teste - execute a configuração: antes abrindo qualquer outra janela:
-
Execute o script1 a partir de uma janela de terminal pelo comando:
python3 /path/to/focus_history.py
-
Agora abra algumas janelas aleatórias, algumas sobrepondo seus espaços de trabalho
-
Agora vá para o espaço de trabalho adjacente, execute o script 2 com o comando:
python3 /path/to/stop_overlap.py
As janelas sobrepostas devem desaparecer
- Voltar para o primeiro espaço de trabalho, executar o último comando novamente, seu espaço de trabalho deve ser restaurado exatamente como era
-
Se tudo funcionar bem, adicione script1 a Aplicativos de inicialização: Dash > Aplicativos de inicialização > Adicionar. Adicione o comando:
/bin/bash -c "sleep 15 && python3 /path/to/focus_history.py
Adicione o script2 a uma tecla de atalho: escolha: Configurações do sistema > "Teclado" > "Atalhos" > "Atalhos personalizados". Clique no botão "+" e adicione o comando:
python3 /path/to/stop_overlap.py
para um atalho de sua escolha ...