Salvando e restaurando as posições das janelas

5

Estou experimentando um bug em que quando a máquina retorna do modo de espera, um monitor conectado via displayport (MST) não volta, mas as janelas ainda estão na área que ele cobre, se estiver ligado.

A única maneira de se recuperar desse curto período de uma reinicialização é desabilitar e reativar a exibição agora. Eu posso fazer isso através da linha de comando, mas quando a tela está desabilitada, todas as janelas são rearranjadas na tela restante. p>

Existe uma maneira de persistir as posições das janelas e restaurá-las para que meu script possa fazer essa sequência: -

  1. enumerar janelas, armazenar posições
  2. exibir (atrapalhando posições)
  3. exibir (fazendo a exibição funcionar novamente, yay!)
  4. restaura a posição das janelas

Eu posso fazer os passos 2 e 3 bem, mas estou perdido para os passos 1 e 4

Eu sei que posso forçar uma posição por aplicativo, mas não é isso que eu quero, pois posso fazer coisas diferentes e ter os mesmos aplicativos em posições diferentes. Também tenho vários terminais abertos, preciso das posições atuais armazenando de alguma forma e restaurando .

Qualquer ajuda seria apreciada!

    
por Anthony Graham 02.06.2015 / 18:21

3 respostas

7

Tire um "instantâneo" da disposição da janela e restaure-a

O script abaixo pode ser usado para obter as posições atuais da janela de todas as janelas "normais" (executadas com o argumento -get ) ou restaurar a última disposição da janela (executada com o argumento -restore ).

Como explicado aqui , usando wmctrl icw A unidade tem alguns problemas. Se é satisfatório na sua situação é decidir.

Como usar

O script usa wmctrl :

sudo apt-get install wmctrl

Então:

  1. Copie o script em um arquivo vazio, salve-o como window_arrange.py
  2. Execute:

    python3 /path/to/window_arrange.py -get
    

    para "gravar" o arranjo de janelas atual e

    python3 /path/to/window_arrange.py -restore
    

    para restaurar o último arranjo de janela "gravado"

O script:

#!/usr/bin/env python3
import subprocess
import os
import sys

wfile = os.environ["HOME"]+"/.windowlist"
arg = sys.argv[1]

def get(command):
    return subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8")

def check_window(w_id):
    w_type = get("xprop -id "+w_id)
    if " _NET_WM_WINDOW_TYPE_NORMAL" in w_type:
        return True
    else:
        return False

def read_windows():
    w_list =  [l.split()[:6] for l in get("wmctrl -lG").splitlines()]
    relevant = [(" ").join(w) for w in w_list if check_window(w[0]) == True]
    with open(wfile, "wt") as out:
        for item in relevant:
            out.write(item+"\n")

def restore_windows():
    try:
        wlist = [l.split() for l in open(wfile).read().splitlines()]
    except FileNotFoundError:
        pass
    else:
        for w in wlist:
            try:
                cmd = "wmctrl -ir "+w[0]+" -e 0,"+(",").join(w[2:])
                subprocess.Popen(["/bin/bash", "-c", cmd])
            except:
                pass

if arg == "-restore":
    restore_windows()
elif arg == "-get":
    read_windows()
    
por Jacob Vlijm 02.06.2015 / 21:06
2

Se você instalar o wmctrl, poderá usar "wmctrl -Gl" para obter uma listagem de todas as janelas com suas posições e tamanhos atuais. Você pode usar essas informações na etapa 4 para chamar wmctrl com a opção -e para restaurar o tamanho e a posição. Por exemplo:

wmctrl -ir <id> -e 0,<x>,<y>,<w>,<h>
    
por jholtrop 02.06.2015 / 19:32
2

Se você preferir o NodeJs: eu escrevi uma pequena biblioteca / ferramenta de linha de comando que permite salvar e restaurar sessões e tem suporte para diferentes configurações de monitores, bem como desktops virtuais. Você pode querer verificar a implementação dos recursos relacionados à janela: link

Você pode encontrar a coisa toda aqui: link

    
por hugo der hungrige 25.04.2017 / 17:41