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.
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.
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.
Le script ci-dessous peut être exécuté avec deux options. Disons que vous avez la disposition des fenêtres ci-dessous:
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:
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é:
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.
Exécuter avec l'option -read
wmctrl
pour répertorier toutes les fenêtres, dans tous les espaces de travail, leur position, leur taille, les applications auxquelles elles appartiennent.wmctrl
name__) 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.Exécuter avec l'option -run
wmctrl
name__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).
La combinaison de wmctrl
et Unity
a quelques bugs, quelques exemples:
wmctrl
diffè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.wmctrl
fonctionnent un peu imprévisibles si le bord de la fenêtre est très proche du Unity Launcher
ou du panneau.wmctrl
de 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 gedit
name__). Je l'ai corrigé pour gedit
name__, mais veuillez le mentionner si vous trouvez d'autres exceptions.
#!/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()
Avant de commencer, assurez-vous que wmctrl
est installé:
Sudo apt-get install wmctrl
Ensuite:
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
Ouvrez maintenant quelques fenêtres, gedit
name__, firefox
ou autre, et testez le script dans un terminal en exécutant la commande (aucun préfixe de chemin requis):
recall_windows -read
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
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.
npm install -g linux-window-session-manager
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
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
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.