web-dev-qa-db-fra.com

Sauvegarde et restauration des positions de fenêtre

Je rencontre un problème qui fait que, lorsque la machine revient en veille, un moniteur connecté via displayport (MST) ne se rallume pas, mais les fenêtres se trouvent toujours dans la zone qu’il recouvre s’il s’est allumé.

La seule façon de récupérer de ce court redémarrage est de désactiver et de réactiver l'affichage maintenant que je peux le faire via la ligne de commande très bien, mais lorsque l'affichage est désactivé, toutes les fenêtres sont réorganisées sur l'écran restant.

Est-il possible de conserver les positions de la fenêtre et de les restaurer afin que mon script puisse effectuer cette séquence:

  1. énumérer les fenêtres, les positions des magasins
  2. afficher (positions dérangeantes)
  3. display on (pour que l'affichage fonctionne à nouveau, yay!)
  4. restaurer la position des fenêtres

Je peux faire les étapes 2 et 3, mais je suis perdu pour les étapes 1 et 4

Je sais que je peux forcer une position par application, mais ce n'est pas ce que je veux, car je peux faire différentes choses et avoir les mêmes applications dans différentes positions. J'ai également plusieurs terminaux ouverts. J'ai besoin que les positions actuelles soient stockées et restaurées.

Toute aide serait appréciée!

5
Anthony Graham

Prenez un "instantané" de la disposition des fenêtres et restaurez-la

Le script ci-dessous peut être utilisé pour obtenir les positions actuelles de toutes les fenêtres "normales" (exécutées avec l'argument -get), ou pour restaurer le dernier agencement de fenêtres (exécuté avec l'argument -restore).

Comme expliqué ici , en utilisant wmctrl i.c.w. L'unité a quelques problèmes. Si c'est satisfaisant dans votre situation, c'est à vous de décider.

Comment utiliser

Le script utilise wmctrl:

Sudo apt-get install wmctrl

Ensuite:

  1. Copiez le script dans un fichier vide, enregistrez-le sous le nom window_arrange.py
  2. Exécutez-le par:

    python3 /path/to/window_arrange.py -get
    

    "enregistrer" la disposition actuelle des fenêtres, et

    python3 /path/to/window_arrange.py -restore
    

    pour restaurer le dernier agencement de fenêtre "enregistré"

Le scénario:

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

Si vous préférez NodeJs: 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. Vous voudrez peut-être vérifier l'implémentation des fonctionnalités liées à la fenêtre: https://github.com/johannesjo/linux-window-session-manager/blob/master/lib/x11-wrapper.js

Vous pouvez trouver le tout ici: https://github.com/johannesjo/linux-window-session-manager

2
hugo der hungrige

Si vous installez wmctrl, vous pouvez utiliser "wmctrl -Gl" pour obtenir une liste de toutes les fenêtres avec leurs positions et tailles actuelles. Vous pouvez ensuite utiliser ces informations à l'étape 4 pour appeler wmctrl avec l'option -e afin de restaurer la taille et la position. Par exemple:

wmctrl -ir <id> -e 0,<x>,<y>,<w>,<h>
2
jholtrop