¿Hay alguna forma de almacenar el diseño de escritorio actual?

24

Lo que quiero es poder guardar las posiciones actuales de mis aplicaciones, así que cuando abra las mismas y ejecute algo, se reorganizarán como estaban.

Por ejemplo, si voy a abrir una sublime y tres ventanas de terminal, me gustaría poder guardar eso de alguna manera.

No me importa si es una aplicación o una herramienta de línea de comandos, siempre que pueda guardar fácilmente las posiciones de mis aplicaciones.

Soy un gran fanático de Moom , pero desafortunadamente solo funciona en MacOS y realmente lo extraño cuando estoy en Ubuntu. Admite más funciones y si conoces algo cercano a él además de mi problema principal, eso también está bien.

    
pregunta Lipis 27.09.2012 - 10:02

4 respuestas

23

Nota

El script se corrigió / corrigió el 16 de enero de 2017, solucionando algunas aplicaciones cuyo nombre del proceso difiere del comando para ejecutar la aplicación . Posiblemente, esto ocurre ocasionalmente en las aplicaciones. Si alguien encuentra uno, por favor deje un comentario.

Script para recordar y restaurar la disposición de la ventana y sus aplicaciones correspondientes.

El siguiente script se puede ejecutar con dos opciones. Digamos que tiene la disposición de ventana de la siguiente manera:

Para leer (recuerde) el arreglo de la ventana actual y sus aplicaciones, ejecute el script con la opción:

<script> -read

Luego cierra todas las ventanas:

Luego, para configurar la última disposición de ventana recordada, ejecútala con la opción:

<script> -run

y se restaurará la última disposición de ventana recordada:

Esto también funcionará después de un reinicio.

Al poner los dos comandos bajo dos teclas de método abreviado diferentes, puede "grabar" su disposición de ventana, apagar su computadora y recuperar la misma disposición de ventana después (por ejemplo) de un reinicio.

Lo que hace el script, y lo que hace no

Ejecutar con la opción -read

  • El script usa wmctrl para mostrar todas las ventanas, en todos los espacios de trabajo, sus posiciones, sus tamaños, las aplicaciones a las que pertenecen
  • El script luego "convierte" las posiciones de la ventana de las posiciones relativas (al espacio de trabajo actual, como en la salida de wmctrl ) a absoluto , en los espacios de trabajo de expansión. Por lo tanto, no importa si las ventanas que desea recordar están en un solo espacio de trabajo o distribuidas en diferentes espacios de trabajo.
  • El guión luego "recuerda" la disposición de la ventana actual, escribiéndola en un archivo invisible en su directorio de inicio.

Ejecutar con la opción -run

  • el script lee la última disposición de ventana recordada; inicia las aplicaciones correspondientes, mueve las ventanas a las posiciones recordadas, también con la ayuda de wmctrl

El script no recuerda los archivos que posiblemente se puedan abrir en las ventanas, ni (por ejemplo) los sitios web que se abrieron en una ventana del navegador.

Problemas

La combinación de wmctrl y Unity tiene algunos errores, algunos ejemplos:

  • las coordenadas de la ventana, leídas por wmctrl difieren ligeramente del comando para posicionar las ventanas, como se mencionó aquí . Por lo tanto, las posiciones de la ventana recuperada pueden diferir ligeramente de la posición original.
  • Los comandos wmctrl funcionan un poco impredecibles si el borde de la ventana está muy cerca del Unity Launcher o del panel.
  • Las ventanas "recordado" deben estar completamente dentro de los bordes de un espacio de trabajo para que funcione el comando wmctrl placement.

Algunas aplicaciones abren nuevas ventanas de forma predeterminada en la misma ventana en una nueva pestaña (como gedit ). Lo arreglé para gedit , pero por favor mencione si encuentra más excepciones.

El 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()

Cómo configurar

Antes de comenzar, asegúrese de que wmctrl esté instalado:

sudo apt-get install wmctrl

Entonces:

  1. Copie la secuencia de comandos en un archivo vacío, guárdelo como recall_windows en ~/bin . Crea el directorio si es necesario. Si el directorio aún no existía, ejecute source ~/.profile o log out / in después de crear el directorio. Ahora estará en $PATH
  2. Hacer el script ejecutable (!).
  3. Ahora abre algunas ventanas, gedit , firefox o lo que sea, y prueba la ejecución del script en un terminal ejecutando el comando (no se necesita el prefijo de ruta):

    recall_windows -read
    
  4. cierra las ventanas. Ahora corre en una terminal:

    recall_windows -run
    

La configuración de tu ventana ahora debería restaurarse

Si todo funciona bien, agregue dos comandos a teclas de método abreviado: Elija: Configuración del sistema & gt; "Teclado" & gt; "Accesos directos" & gt; "Accesos directos personalizados". Haga clic en "+" y agregue los comandos:

recall_windows -read

y

recall_windows -run

a dos teclas de atajo diferentes

    
respondido por el Jacob Vlijm 07.07.2015 - 17:25
2

no hay tal programa. Puede instalar compiz cub:

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

y siga este cómo hacerlo

la compiz es la herramienta de escritorio más avanzada para unity / gnome

    
respondido por el user91632 27.09.2012 - 10:52
1

No sé de una manera simple de lograr esto.

Sin embargo, raramente necesito eso por una razón muy simple: suspender. Suspender y hibernación son tus amigos. No solo ahorra posiciones de ventana, sino que también guarda todo el estado de su sistema. Raramente apago completamente la computadora, excepto para volver a cargar una nueva versión del kernel.

    
respondido por el January 27.09.2012 - 10:23
0

Escribí una pequeña biblioteca / herramienta de línea de comandos que permite guardar y restaurar sesiones y tiene soporte para diferentes configuraciones de monitores y escritorios virtuales.

Instalación

npm install -g linux-window-session-manager

Uso

Guarde la sesión actual en ~ / .lwsm / sessionData / DEFAULT.json

lwsm save

Guarde la sesión actual en ~ / .lwsm / sessionData / my-session.json

lwsm save my-session   

Restaure la sesión de ~ / .lwsm / sessionData / DEFAULT.json

lwsm restore

Restaure la sesión de ~ / .lwsm / sessionData / my-session.json

lwsm restore my-session   

Cierre con gracia todas las aplicaciones en ejecución antes de comenzar la sesión

lwsm restore --closeAllOpenWindows

Compruébalo: enlace

    
respondido por el hugo der hungrige 25.04.2017 - 15:34

Lea otras preguntas en las etiquetas