Como posso evitar a aparência irritante da janela de sobreposição do espaço de trabalho?

2

No espaço de trabalho atual, não quero ver a borda de uma janela em que estava trabalhando em outro espaço de trabalho.

Também gosto de poder empurrar uma janela para fora da tela, então forçar limites não seria uma boa solução.

Existe uma maneira de não mostrar uma janela se não fizer parte da área de trabalho atual?

    
por Seph Reed 04.12.2015 / 04:53

1 resposta

1

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

  1. Osscriptsprecisamdosdoiswmctrlexdotool:

    sudoapt-getinstallwmctrlxdotool
  2. Copieoscript1abaixoemumarquivovazio,comofocus_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))
  3. 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))
    
  4. 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 ...

    
por Jacob Vlijm 05.12.2015 / 16:22