Existe-t-il un moyen de stocker la disposition actuelle du bureau?

29

Ce que je veux être en mesure de sauvegarder les positions actuelles de mes applications, donc quand je vais ouvrir les mêmes et exécuter quelque chose, elles se réorganiseront comme elles étaient.

Par exemple, si je vais ouvrir un sublime et trois fenêtres de terminal, je voudrais pouvoir le sauvegarder d'une manière ou d'une autre.

entrez la description de l'image ici

Peu m'importe s'il s'agit d'une application ou d'un outil de ligne de commande, tant que 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 sur Ubuntu. Il prend en charge plus de fonctionnalités et si vous savez quelque chose de proche en plus de mon problème principal, c'est bien aussi.

Lipis
la source
@VitaliusKuchalskis La disposition des fenêtres ferait-elle, ou devrait-elle être exactement les fichiers ouverts correspondants? Et quel est votre gestionnaire de fenêtres? (Unité?)
Jacob Vlijm
Je ne sais pas de quelle disposition de fenêtre parlez-vous? Je pense qu'il existe ou existera un outil pour enregistrer et charger la position et la taille des fenêtres par espace de travail. Jusqu'à présent, j'ai trouvé [wmctrl] ( en.wikipedia.org/wiki/Wmctrl ). Mais il faudrait pour cela écrire des scripts ou changer de configuration. Je me demande donc si quelqu'un a déjà fait ça et a eu la gentillesse de le partager.
Qualphey
@VitaliusKuchalskis pourriez-vous jeter un œil à celui-ci: askubuntu.com/questions/631392/… Cela suppose que la ou les fenêtres restent ouvertes, mais je suppose que vous souhaitez éteindre l'ordinateur et restaurer les positions des fenêtres après une restauration taille et position (mise en page). Une question importante est alors de savoir si vous faites simplement référence aux fenêtres d' application , ou également aux fichiers qui ont été ouverts à l'intérieur des fenêtres.
Jacob Vlijm
Seules les fenêtres d'application bien sûr.
Qualphey
À partir de votre capture d'écran, vous semblez aimer / utiliser des formations de carrelage pour vos fenêtres. Vous devriez certainement essayer un WM en mosaïque, par exemple i3.
nixpower

Réponses:

26

Remarque

Le script a été corrigé / corrigé le 16 janvier 2017, corrigeant certaines applications dont le nom du processus diffère de la commande pour exécuter l'application . Cela peut se produire occasionnellement sur les applications. Si quelqu'un en trouve un, veuillez laisser un commentaire.


Script pour mémoriser et restaurer l'agencement des fenêtres et leurs applications correspondantes.

Le script ci-dessous peut être exécuté avec deux options. Disons que vous avez l'agencement des fenêtres comme ci-dessous:

entrez la description de l'image ici

Pour lire (mémoriser) l'agencement actuel des fenêtres et leurs applications, exécutez le script avec l'option:

<script> -read

Fermez ensuite toutes les fenêtres:

entrez la description de l'image ici

Ensuite, pour configurer la dernière disposition de fenêtre mémorisée, exécutez-la avec l'option:

<script> -run

et la dernière disposition de fenêtre mémorisée sera restaurée:

entrez la description de l'image ici

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êtres, arrêter votre ordinateur et rappeler la même disposition de fenêtres après (par exemple) un redémarrage.

Ce que fait le script et ce qu'il ne fait pas

Exécuter avec l'option -read

  • Le script utilise wmctrlpour répertorier toutes les fenêtres, dans tous les espaces de travail, leurs positions, leurs tailles, les applications auxquelles elles appartiennent
  • Le script «convertit» ensuite les positions de la fenêtre de positions relatives (dans l'espace de travail actuel, comme dans la sortie de wmctrl) en positions absolues , sur vos espaces de travail étendus. Par conséquent, peu importe si les fenêtres dont vous souhaitez vous souvenir se trouvent sur un seul espace de travail ou se répartissent sur différents espaces de travail.
  • Le script "se souvient" alors de la disposition actuelle de la fenêtre, l'écrivant dans un fichier invisible dans votre répertoire personnel.

Exécuter avec l'option -run

  • le script lit la dernière disposition de fenêtre mémorisée; il démarre les applications correspondantes, déplace les fenêtres vers les positions mémorisées, également à l'aide dewmctrl

Le script ne se souvient pas des fichiers qui pourraient éventuellement être ouverts dans les fenêtres, ni (par exemple) des sites Web qui ont été 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, telles que lues par, wmctrldiffèrent légèrement de la commande de positionnement des fenêtres, comme mentionné ici . Par conséquent, les positions de fenêtre rappelées peuvent légèrement différer de la position d'origine.
  • Les wmctrlcommandes fonctionnent un peu imprévisibles si le bord de la fenêtre est très proche du Unity Launcherou du panneau.
  • Les fenêtres "mémorisées" doivent être complètement à l'intérieur des bordures d'un espace de travail pour que la wmctrlcommande de placement fonctionne correctement.

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

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

Comment installer

Avant de commencer, assurez-vous qu'il wmctrlest installé:

sudo apt-get install wmctrl

Ensuite:

  1. Copiez le script dans un fichier vide, enregistrer comme recall_windowsdans ~/bin. Créez le répertoire si nécessaire. Si le répertoire n'existait pas encore, exécutez l'un source ~/.profileou l' autre ou déconnectez-vous / après avoir créé le répertoire. Ce sera désormais$PATH
  2. Rendez le script exécutable (!).
  3. Maintenant , ouvrez quelques fenêtres, gedit, firefoxou autre, et exécuter le script de test dans un terminal en exécutant la commande (pas de préfixe de chemin nécessaire):

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

    recall_windows -run
    

La configuration de votre 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

Jacob Vlijm
la source
2
Hah! Je viens de lire le premier paragraphe et je savais que c'était l'un des vôtres! (a voté)
Fabby
@Fabby et célébrer mes vacances :)
Jacob Vlijm
Ça a l'air super! Maintenant, on pourrait facilement ajouter un deuxième paramètre pour un nom de paramètre, puis stocker / restaurer différents environnements, clientA, clientB, home, .. cool!
Bachi
différentes versions seraient cool, ce serait génial si cela pouvait fermer le programme. En pensant s'il y a quelque chose à l'écran lorsque la femme arrive, je pourrais facilement donner l'impression que je travaille!
Jamie Hutber du
Pourriez-vous peut-être jeter un œil à ce problème lié à l'espace de travail ? Merci!!
noisette sur natty
4

J'ai écrit un petit outil de bibliothèque / ligne de commande qui permet d'enregistrer et de restaurer des sessions et 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   

Restaurez la session à partir de ~ / .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 démarrer la session

lwsm restore --closeAllOpenWindows

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

hugo der hungrige
la source
1
Fonctionne très bien! Cela devrait être la meilleure réponse.
user3751385
2

il n'y a pas un 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


la source
1

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

Cependant, j'ai rarement besoin de cela pour une raison très simple: suspendre. La suspension et l' hibernation sont vos amis. Non seulement vous enregistrez les positions des fenêtres, mais vous enregistrez également tout l'état de votre système. J'arrête rarement l'ordinateur complètement, sauf pour recharger une nouvelle version du noyau.

janvier
la source
Eh bien, je ne le change pas ou quoi que ce soit .. mais j'ouvre vous savez de nouveaux terminaux, un autre projet, les navigateurs se ferment ou quelque chose, etc. la capture d'écran n'était qu'un exemple ..
Lipis
Hé bien oui. J'ai des bureaux que je n'ai pas touchés depuis des semaines maintenant qui contiennent plusieurs fenêtres de terminal, fenêtres de navigateur, fenêtres d'affichage graphique R qui se rapportent toutes à un projet particulier.
Janvier
La suspension est la solution que j'utilise pour mon ordinateur portable, cependant, pour un PC de bureau est un peu plus compliqué, car il est nécessaire d'avoir un nobreak.
cantoni