web-dev-qa-db-fra.com

Est-il possible de stocker la disposition actuelle du bureau?

Ce que je veux être capable de sauvegarder les positions actuelles de mes applications, donc quand je vais ouvrir les mêmes et exécuter quelque chose, elles seront réorganisées comme elles étaient.

Par exemple, si je vais ouvrir une fenêtre sublime et trois fenêtres de terminal, j'aimerais pouvoir la sauvegarder.

enter image description here

Peu importe que ce soit une application ou un outil de ligne de commande, dans la mesure où je peux facilement enregistrer les positions de mes applications.

Je suis un grand fan de Moom , mais malheureusement cela ne fonctionne que sur MacOS et ça me manque vraiment quand je suis sur Ubuntu. Il prend en charge plus de fonctionnalités et si vous savez quelque chose qui s’ajoute à mon problème principal, c’est bien aussi.

29
Lipis

Remarque

Le script a été corrigé/corrigé le 16 janvier 2017, corrigeant quelques applications dont le nom du processus diffère de celui du ) pour exécuter l’application . Peut-être, cela se produit parfois sur les applications. Si quelqu'un en trouve un, s'il vous plaît laissez un commentaire.


Script à mémoriser et à restaurer la disposition des fenêtres et les applications correspondantes.

Le script ci-dessous peut être exécuté avec deux options. Disons que vous avez la disposition des fenêtres ci-dessous:

enter image description here

Pour lire (rappelez-vous) la disposition actuelle des fenêtres et leurs applications, exécutez le script avec l'option:

<script> -read

Puis fermez toutes les fenêtres:

enter image description here

Puis pour configurer le dernier agencement de fenêtre mémorisé, exécutez-le avec l'option:

<script> -run

et le dernier arrangement de fenêtre mémorisé sera restauré:

enter image description here

Cela fonctionnera également après un redémarrage.

En plaçant les deux commandes sous deux touches de raccourci différentes, vous pouvez "enregistrer" votre disposition de fenêtre, éteindre votre ordinateur et rappeler la même disposition de fenêtre après (par exemple) un redémarrage.

Ce que fait le script et ce qu'il fait non

Exécuter avec l'option -read

  • Le script utilise wmctrlpour répertorier toutes les fenêtres, dans tous les espaces de travail, leur position, leur taille, les applications auxquelles elles appartiennent.
  • Le script convertit ensuite les positions de la fenêtre de positions relatives (à l’espace de travail actuel, comme dans le résultat de wmctrlname__) en absolues , sur vos espaces de travail fractionnés. . Par conséquent, peu importe si les fenêtres que vous souhaitez mémoriser se trouvent sur un seul espace de travail ou sur plusieurs espaces de travail.
  • Le script "se souvient" ensuite de la disposition de la fenêtre en cours, en l'écrivant dans un fichier invisible de votre répertoire personnel.

Exécuter avec l'option -run

  • le script lit le dernier agencement de fenêtre mémorisé; il lance les applications correspondantes, déplace les fenêtres vers les positions mémorisées, également à l'aide de wmctrlname__

Le script ( ne se souvient pas des fichiers qui pourraient éventuellement être ouverts dans les fenêtres, ni (par exemple, des sites Web ouverts dans une fenêtre de navigateur).

Problèmes

La combinaison de wmctrlet Unitya quelques bugs, quelques exemples:

  • les coordonnées de la fenêtre, lues par wmctrldiffèrent légèrement de la commande permettant de positionner les fenêtres, comme indiqué ici . Par conséquent, les positions de fenêtre rappelées peuvent légèrement différer de la position d'origine.
  • Les commandes wmctrlfonctionnent un peu imprévisibles si le bord de la fenêtre est très proche du Unity Launcher ou du panneau.
  • Les fenêtres "mémorisées" doivent se situer complètement à l'intérieur des limites d'un espace de travail pour que la commande wmctrlde son emplacement fonctionne correctement.

Certaines applications ouvrent de nouvelles fenêtres par défaut dans la même fenêtre dans un nouvel onglet (comme geditname__). Je l'ai corrigé pour geditname__, mais veuillez le mentionner si vous trouvez d'autres exceptions.

Le scénario

#!/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()

Comment mettre en place

Avant de commencer, assurez-vous que wmctrlest installé:

Sudo apt-get install wmctrl

Ensuite:

  1. Copiez le script dans un fichier vide, enregistrez-le sous le nom recall_windows dans ~/bin. Créez le répertoire si nécessaire. Si le répertoire n'existe pas encore, exécutez source ~/.profile ou déconnectez-vous/ouvrez après avoir créé le répertoire. Il sera maintenant dans $PATH
  2. Rendre le script exécutable (!).
  3. Ouvrez maintenant quelques fenêtres, geditname__, firefoxou autre, et testez le script dans un terminal en exécutant la commande (aucun préfixe de chemin requis):

    recall_windows -read
    
  4. fermer les fenêtres. Maintenant, lancez dans un terminal:

    recall_windows -run
    

Votre configuration de fenêtre devrait maintenant être restaurée

Si tout fonctionne correctement, ajoutez deux commandes aux touches de raccourci: Choisissez: Paramètres système> "Clavier"> "Raccourcis"> "Raccourcis personnalisés". Cliquez sur le "+" et ajoutez les commandes:

recall_windows -read

et

recall_windows -run

à deux touches de raccourci différentes

25
Jacob Vlijm

J'ai écrit un petit outil de bibliothèque/ligne de commande qui permet de sauvegarder et de restaurer des sessions et qui prend en charge différentes configurations de moniteurs ainsi que des bureaux virtuels.

Installation

npm install -g linux-window-session-manager

Usage

Enregistrez la session en cours dans ~/.lwsm/sessionData/DEFAULT.json

lwsm save

Enregistrez la session en cours dans ~/.lwsm/sessionData/my-session.json

lwsm save my-session   

Restaurer la session depuis ~/.lwsm/sessionData/DEFAULT.json

lwsm restore

Restaurez la session à partir de ~/.lwsm/sessionData/my-session.json

lwsm restore my-session   

Fermez gracieusement toutes les applications en cours d'exécution avant de commencer la session

lwsm restore --closeAllOpenWindows

Découvrez-le: https://github.com/johannesjo/linux-window-session-manager

3
hugo der hungrige

il n'y a pas de tel programme. Vous pouvez installer Compiz Cub:

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

et suivez ce tutoriel

le compiz est l'outil de bureau le plus avancé pour l'unité/gnome

2
user91632

Je ne connais pas de moyen simple d'y parvenir.

Cependant, j’en ai rarement besoin pour une raison très simple: suspendre. Suspendre et veille prolongée sont vos amis. Non seulement vous enregistrez les positions de fenêtre, mais vous enregistrez également l’ensemble de l’état de votre système. J'éteins rarement complètement l'ordinateur, sauf pour recharger une nouvelle version du noyau.

1
January