Existe uma maneira de armazenar o layout da área de trabalho atual?


29

O que eu quero ser capaz de salvar as posições atuais dos meus aplicativos, então, quando for abrir os mesmos e executar algo, eles serão reorganizados como estavam.

Por exemplo, se vou abrir uma sublime e três janelas de terminal, gostaria de poder salvá-la de alguma forma.

insira a descrição da imagem aqui

Não me importo se é um aplicativo ou uma ferramenta de linha de comando, desde que eu possa salvar facilmente as posições dos meus aplicativos.

Sou um grande fã do Moom , mas infelizmente ele funciona apenas no MacOS e sinto muita falta dele no Ubuntu. Ele suporta mais recursos e, se você souber algo próximo a ele, além do meu principal problema, isso também é bom.


@VitaliusKuchalskis O layout da janela funcionaria ou deveria ser exatamente os arquivos abertos correspondentes? E qual é o seu gerenciador de janelas? (Unidade?)
Jacob Vlijm

Não sei de que layout de janela você está falando. Acho que existe ou haverá uma ferramenta para salvar e carregar a posição e o tamanho das janelas por área de trabalho. Até agora encontrei o [wmctrl] ( en.wikipedia.org/wiki/Wmctrl ). Mas seria necessário escrever scripts ou alterar configurações para criar esse recurso. Então, eu estou querendo saber se alguém já fez isso, e teve a gentileza de compartilhá-lo.
Qualphey

@VitaliusKuchalskis, você pode dar uma olhada neste: askubuntu.com/questions/631392/… Isso pressupõe que as janelas permaneçam abertas, mas presumo que você gostaria de desligar o computador e restaurar as posições da janela após uma restauração tamanho e posição (layout). Uma pergunta importante é se você está apenas se referindo às janelas de aplicativos ou também aos arquivos que foram abertos dentro das janelas.
Jacob Vlijm

Apenas as janelas do aplicativo, é claro.
Qualphey

Na sua captura de tela, você parece gostar / usar formações lado a lado em suas janelas. Você definitivamente deve tentar o WM lado a lado, por exemplo i3.
Nixpower

Respostas:


26

Nota

O script foi corrigido / corrigido em 16 de janeiro de 2017, corrigindo alguns aplicativos cujo nome do processo difere do comando para executar o aplicativo . Possivelmente, isso ocorre ocasionalmente em aplicativos. Se alguém encontrar um, por favor deixe um comentário.


Script para lembrar e restaurar o arranjo da janela e seus aplicativos correspondentes.

O script abaixo pode ser executado com duas opções. Digamos que você tenha o arranjo de janelas como abaixo:

insira a descrição da imagem aqui

Para ler (lembrar) a organização atual da janela e seus aplicativos, execute o script com a opção:

<script> -read

Depois feche todas as janelas:

insira a descrição da imagem aqui

Em seguida, para configurar o último arranjo de janelas lembrado, execute-o com a opção:

<script> -run

e o último arranjo da janela lembrado será restaurado:

insira a descrição da imagem aqui

Isso também funcionará após uma reinicialização.

Colocando os dois comandos sob duas teclas de atalho diferentes, você pode "gravar" o arranjo da janela, desligar o computador e recuperar o mesmo arranjo da janela após (por exemplo) uma reinicialização.

O que o script faz e o que não faz

Corra com a opção -read

  • O script usa wmctrlpara listar todas as janelas, em todos os espaços de trabalho, suas posições, tamanhos, aplicativos a que pertencem
  • O script "converte" as posições da janela de relativas (para o espaço de trabalho atual, como na saída de wmctrl) para posições absolutas , nos seus espaços de trabalho de abrangência. Portanto, não importa se as janelas que você deseja lembrar estão em apenas um espaço de trabalho ou se espalham por diferentes espaços de trabalho.
  • O script "lembra" o arranjo atual da janela, gravando-o em um arquivo invisível no diretório inicial.

Corra com a opção -run

  • o script lê o último arranjo de janelas lembrado; inicia as aplicações correspondentes, move as janelas para as posições lembradas, também com a ajuda dewmctrl

O script não lembra os arquivos que possivelmente podem ser abertos nas janelas, nem (por exemplo) os sites que foram abertos em uma janela do navegador.

Problemas

A combinação de wmctrle Unitytem alguns erros, alguns exemplos:

  • as coordenadas da janela, conforme lidas por, wmctrldiferem ligeiramente do comando para posicionar as janelas, conforme mencionado aqui . Portanto, as posições recuperadas da janela podem diferir ligeiramente da posição original.
  • Os wmctrlcomandos funcionam um pouco imprevisíveis se a borda da janela estiver muito próxima Unity Launcherao painel ou.
  • As janelas "lembradas" precisam estar completamente dentro das bordas de uma área de trabalho para que o wmctrlcomando de posicionamento funcione bem.

Alguns aplicativos abrem novas janelas por padrão na mesma janela em uma nova guia (como gedit). Eu o corrigi gedit, mas mencione se encontrar mais exceções.

O script

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

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 get_res():
    # get resolution and the workspace correction (vector)
    xr = subprocess.check_output(["xrandr"]).decode("utf-8").split()
    pos = xr.index("current")
    res = [int(xr[pos+1]), int(xr[pos+3].replace(",", "") )]
    vp_data = subprocess.check_output(["wmctrl", "-d"]).decode("utf-8").split()
    curr_vpdata = [int(n) for n in vp_data[5].split(",")]
    return [res, curr_vpdata]

app = lambda pid: subprocess.check_output(["ps", "-p",  pid, "-o", "comm="]).decode("utf-8").strip()

def read_windows():
    res = get_res()
    w_list =  [l.split() for l in get("wmctrl -lpG").splitlines()]
    relevant = [[w[2],[int(n) for n in w[3:7]]] for w in w_list if check_window(w[0]) == True]
    for i, r in enumerate(relevant):      
        relevant[i] = app(r[0])+" "+str((" ").join([str(n) for n in r[1]]))
    with open(wfile, "wt") as out:
        for l in relevant:
            out.write(l+"\n")

def open_appwindow(app, x, y, w, h):
    ws1 = get("wmctrl -lp"); t = 0
    # fix command for certain apps that open in new tab by default
    if app == "gedit":
        option = " --new-window"
    else:
        option = ""
    # fix command if process name and command to run are different
    if "gnome-terminal" in app:
        app = "gnome-terminal"
    elif "chrome" in app:
        app = "/usr/bin/google-chrome-stable"


    subprocess.Popen(["/bin/bash", "-c", app+option])
    # fix exception for Chrome (command = google-chrome-stable, but processname = chrome)
    app = "chrome" if "chrome" in app else app
    while t < 30:      
        ws2 = [w.split()[0:3] for w in get("wmctrl -lp").splitlines() if not w in ws1]
        procs = [[(p, w[0]) for p in get("ps -e ww").splitlines() \
                  if app in p and w[2] in p] for w in ws2]
        if len(procs) > 0:
            time.sleep(0.5)
            w_id = procs[0][0][1]
            cmd1 = "wmctrl -ir "+w_id+" -b remove,maximized_horz"
            cmd2 = "wmctrl -ir "+w_id+" -b remove,maximized_vert"
            cmd3 = "wmctrl -ir "+procs[0][0][1]+" -e 0,"+x+","+y+","+w+","+h
            for cmd in [cmd1, cmd2, cmd3]:   
                subprocess.call(["/bin/bash", "-c", cmd])
            break
        time.sleep(0.5)
        t = t+1

def run_remembered():
    res = get_res()[1]
    try:
        lines = [l.split() for l in open(wfile).read().splitlines()]
        for l in lines:          
            l[1] = str(int(l[1]) - res[0]); l[2] = str(int(l[2]) - res[1] - 24)
            open_appwindow(l[0], l[1], l[2], l[3], l[4])   
    except FileNotFoundError:
        pass

if arg == "-run":
    run_remembered()
elif arg == "-read":
    read_windows()

Como configurar

Antes de começar, verifique se wmctrlestá instalado:

sudo apt-get install wmctrl

Então:

  1. Copie o script para um arquivo vazio, salve-o como recall_windowsem ~/bin. Crie o diretório, se necessário. Se o diretório ainda não existir, execute source ~/.profileou efetue logout / logon depois de criar o diretório. Agora estará em$PATH
  2. Torne o script executável (!).
  3. Agora abra algumas janelas, gedit, firefoxou o que quer, e teste-executar o script em um terminal executando o comando (nenhum caminho prefixo necessário):

    recall_windows -read
    
  4. feche as janelas. Agora execute em um terminal:

    recall_windows -run
    

Sua configuração de janela agora deve ser restaurada

Se tudo funcionar bem, adicione dois comandos às teclas de atalho: Escolha: Configurações do sistema> "Teclado"> "Atalhos"> "Atalhos personalizados". Clique no "+" e adicione os comandos:

recall_windows -read

e

recall_windows -run

para duas teclas de atalho diferentes


2
Hah! Apenas lendo o primeiro parágrafo e eu sabia que era um dos seus! (upvoted)
Fabby

@Fabby e celebrando meu feriado :)
Jacob Vlijm

Parece ótimo! Agora pode-se facilmente adicionar um segundo parâmetro para um nome de configuração e, em seguida, armazenar / restaurar diferentes ambientes, clientA, clientB, home, .. legal!
Bachi

versões diferentes seria legal, seria ótimo se pudesse fechar o programa. Pensando se há algo na tela quando a esposa entra, eu poderia facilmente fazer parecer que estou trabalhando!
Jamie Hutber 18/08/16

Você poderia dar uma olhada nesse problema relacionado ao espaço de trabalho ? Obrigado!!
noz sobre natty

4

Escrevi uma pequena ferramenta de biblioteca / linha de comando que permite salvar e restaurar sessões e oferece suporte a diferentes configurações de monitores e áreas de trabalho virtuais.

Instalação

npm install -g linux-window-session-manager

Uso

Salve a sessão atual em ~ / .lwsm / sessionData / DEFAULT.json

lwsm save

Salve a sessão atual em ~ / .lwsm / sessionData / my-session.json

lwsm save my-session   

Restaure a sessão de ~ / .lwsm / sessionData / DEFAULT.json

lwsm restore

Restaure a sessão a partir de ~ / .lwsm / sessionData / my-session.json

lwsm restore my-session   

Feche graciosamente todos os aplicativos em execução antes de iniciar a sessão

lwsm restore --closeAllOpenWindows

Confira: https://github.com/johannesjo/linux-window-session-manager


11
Funciona bem! Esta deve ser a melhor resposta.
precisa saber é o seguinte

2

não existe esse programa. Você pode instalar o compiz cub:

sudo apt-get install compiz compizconfig-settings-manager compiz-fusion-plugins-extra compiz-fusion-plugins-main compiz-plugins

e siga este guia

o compiz é a ferramenta de desktop mais avançada para unity / gnome


1

Não conheço uma maneira simples de conseguir isso.

No entanto, raramente preciso disso por um motivo muito simples: suspender. Suspender e hibernação são seus amigos. Você não apenas salva as posições da janela, mas também salva todo o estado do seu sistema. Eu raramente desligo o computador completamente, exceto para recarregar uma nova versão do kernel.


Bem, eu não estou trocando nem nada .. mas estou abrindo, você conhece novos terminais, outro projeto, os navegadores estão sendo fechados ou algo assim, etc. a captura de tela foi apenas um exemplo ..
Lipis

Bem, sim. Tenho desktops que não toquei há semanas e que contêm várias janelas de terminal, janelas do navegador e janelas de exibição gráfica R relacionadas a um projeto específico.
janeiro

Suspender é a solução que uso no meu notebook, no entanto, para um PC de mesa é um pouco mais complicado, pois é necessário ter um nobreak.
Cantoni 6/08
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.