J'ai une configuration à double moniteur sous Unity sous Ubuntu 14.04
À chaque démarrage de la machine, le système semble oublier les positions des icônes de mon bureau sur l'écran de droite (Connecté via VGA). Les icônes sont toutes bien placées sur le côté droit de l'écran, mais lorsque je démarre, toutes les icônes sont regroupées en haut à gauche sous le lanceur, certaines d'entre elles se chevauchant, comme ci-dessous:
Comment puis-je résoudre ce problème afin que les icônes du bureau apparaissent au même endroit à chaque démarrage? Les icônes de l’écran de gauche (connecté via HDMI) sont toujours correctes et restent toujours dans les mêmes positions.
Très probablement, le problème est le résultat d'un bogue (lié au pilote vidéo). Je suppose que le deuxième écran n'est pas mémorisé d'une manière ou d'une autre, et "virtuellement" reconnecté à un stade plutôt tardif du processus de démarrage (connexion).
Comme souvent, même s’il s’agit d’un bogue, cela ne signifie pas que nous ne pouvons pas trouver de solution de rechange. Si nous:
effectivement le bogue est contourné.
Vous pouvez obtenir la position sur le bureau d'une icône avec la commande:
gvfs-info -a 'metadata::nautilus-icon-position' '<file>'
Ce sera a.o. affichez les coordonnées de l’icône sur votre bureau, que nous pourrons sauvegarder dans un fichier. Si nous faisons un instantané de cette manière de votre bureau avant d'éteindre l'ordinateur, nous pourrons ensuite restaurer la position de l'icône par la suite, avec la commande:
gvfs-set-attribute -t string '<file>' 'metadata::nautilus-icon-position' '500,500'
(par exemple)
Un script permettant de prendre un tel instantané et de restaurer la disposition des icônes (en fonction de l'argument) serait:
#!/usr/bin/env python3
import subprocess
import os
import sys
# --- set your localized desktop name below:
dt_name = "Bureaublad"
# ---
# used strings & definitions
val = " 'metadata::nautilus-icon-position' "
search = "gvfs-info -a"+val
set_val = "gvfs-set-attribute -t string "
home = os.environ["HOME"]
dt_dir = home+"/"+dt_name
datafile = home+"/.desktop_items.txt"
arg = sys.argv[1]
get = lambda cmd: subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
def snapshot():
try:
os.remove(datafile)
except FileNotFoundError:
pass
dt_items = os.listdir(dt_dir)
dt_data = []
for f in [f for f in dt_items if all([not f.startswith("."), not f.endswith("~")])]:
f = '"'+f+'"' if f.count(" ") > 0 else f
file = dt_dir+"/"+f
cmd = search+file
try:
loc = [int(n) for n in get(cmd).split()[-1].split(",")]
# loc[0] = loc[0] - screen_pos[0]; loc[1] = loc[1] - screen_pos[1]
loc = (",").join([str(n) for n in loc])
open(datafile, "a+").write(file+"|||"+loc+"\n")
except:
pass
subprocess.Popen(["/bin/bash", "-c", "notify-send 'A snapshot was taken'"])
def restore():
items = [l.strip().split("|||") for l in open(datafile).readlines()]
for item in items:
try:
xy = [int(n) for n in item[1].split(",")]
move_to = (",").join(str(n) for n in [xy[0], xy[1]])
command = set_val+item[0]+val+move_to
subprocess.Popen(["/bin/bash", "-c", command])
except:
pass
subprocess.Popen(["/bin/bash", "-c", "notify-send 'Click on the desktop and press F5'"])
if arg == "snapshot":
snapshot()
Elif arg == "restore":
restore()
restore_desktop.py
Dans la section head du script, dans la ligne:
# --- set your localized desktop name below:
dt_name = "Desktop"
# ---
définir le nom localisé de votre dossier de bureau ("Bureaublad" en néerlandais)
Pour prendre un instantané de la disposition actuelle des icônes, exécutez la commande suivante:
python3 /path/to/restore_desktop.py snapshot
Pour restaurer un instantané déjà pris:
python3 /path/to/restore_desktop.py restore
puis cliquez sur le bureau et appuyez sur F5 pour actualiser le bureau.
Le bureau doit toujours être actualisé à partir de la ligne de commande pour réellement appliquer la restauration des icônes. Cela peut être fait soit en redémarrant nautilus
, soit en appuyant sur F5 avec le bureau en face. Puisque nous l'utilisons au démarrage, la première option pourrait être la plus élégante.
Nous devons prendre un instantané lors de la déconnexion en tant qu'utilisateur actuel pour nous assurer que la dernière disposition des icônes est enregistrée dans un instantané. Jusqu'à présent, je ne pouvais pas trouver un moyen de le faire. Cependant, comme toujours, il existe une solution de contournement. Si nous incluons la commande
gnome-session-quit --poweroff
dans notre script, nous pouvons simplement appeler le script (avec les bons arguments) pour inclure la procédure d'arrêt et prendre l'instantané.
Le script final devient alors:
#!/usr/bin/env python3
import subprocess
import os
import sys
import time
# --- set your localized desktop name below:
dt_name = "Desktop"
# ---
# used strings & definitions
val = " 'metadata::nautilus-icon-position' "
search = "gvfs-info -a"+val
set_val = "gvfs-set-attribute -t string "
home = os.environ["HOME"]
dt_dir = home+"/"+dt_name
datafile = home+"/.desktop_items.txt"
arg = sys.argv[1]
get = lambda cmd: subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
def snapshot():
# remove the previous snapshot
try:
os.remove(datafile)
except FileNotFoundError:
pass
# list the items on the desktop, look up their positions
dt_items = os.listdir(dt_dir)
dt_data = []
for f in [f for f in dt_items if all([not f.startswith("."), not f.endswith("~")])]:
f = '"'+f+'"' if f.count(" ") > 0 else f
file = dt_dir+"/"+f
cmd = search+file
try:
loc = [int(n) for n in get(cmd).split()[-1].split(",")]
loc = (",").join([str(n) for n in loc])
open(datafile, "a+").write(file+"|||"+loc+"\n")
except:
pass
# notify that a snapshot was taken
subprocess.call(["/bin/bash", "-c", "notify-send 'A snapshot was taken'"])
# send the command to shutdown
subprocess.Popen(["gnome-session-quit", "--power-off"])
def restore():
# wait for 20 seconds for the desktop to be fully loaded and the screen to be found
time.sleep(20)
# read the snapshot file
items = [l.strip().split("|||") for l in open(datafile).readlines()]
for item in items:
try:
# place the icon(s) acoording to the remembered position(s)
xy = [int(n) for n in item[1].split(",")]
move_to = (",").join(str(n) for n in [xy[0], xy[1]])
command = set_val+item[0]+val+move_to
subprocess.Popen(["/bin/bash", "-c", command])
except:
pass
# restart nautilus
subprocess.call(["killall", "nautilus"])
subprocess.Popen(["nautilus"])
# send notification
subprocess.Popen(["/bin/bash", "-c", "notify-send 'Icon positions were restored'"])
if arg == "snapshot":
snapshot()
Elif arg == "restore":
restore()
restore_icons.py
Dans la section head du script, définissez le nom (localisé) approprié du dossier Desktop
:
# --- set your localized desktop name below:
dt_name = "Desktop"
# ---
Testez le script en exécutant la commande:
python3 /path/to/restore_icons.py snapshot
Un instantané de la disposition actuelle sera pris. De fermer le menu apparaît sur votre bureau, mais annulez-le en cliquant sur à l'extérieur du menu sur votre bureau.
Puis délibérément déconner avec vos icônes (positions) sur votre bureau.
Enfin, relancez le script avec un autre argument:
python3 /path/to/restore_icons.py restore
Attendez 20 secondes (voir Remarque en bas, pourquoi cela est inclus dans le script) et les icônes de votre bureau seront restaurées à leur état antérieur à la prise de l'instantané.
Si tout fonctionne correctement, ajoutez une touche de raccourci: Choisissez: Paramètres système> "Clavier"> "Raccourcis"> "Raccourcis personnalisés". Cliquez sur le "+" et ajoutez la commande:
python3 /path/to/restore_icons.py snapshot
Ce sera le raccourci que vous devez utiliser pour éteindre votre ordinateur.
Ajoutez la commande restore aux applications de démarrage: Dash> Applications de démarrage> Ajouter. Ajoutez la commande:
python3 /path/to/restore_icons.py restore
Maintenant, 20 secondes après le démarrage (connexion), vos icônes seront exactement comme vous les avez laissées à l’arrêt.
La pause de 20 secondes permet de s'assurer que le deuxième moniteur est trouvé et reconnecté avant l'exécution de la commande de restauration.
Le script fonctionne également sur Linux Mint 18.3 Cinnamon également, lorsque j’ai apporté les modifications mineures suivantes:
remplacer:
nautilus-icon-position -> nemo-icon-position gnome-session-quit -> cinnamon-session-quit "killall", "nautilus" -> "killall", "nemo-desktop" sous-processus.Popen ]) -> subprocess.POpen (["nemo-desktop"])
merci beaucoup pour ce super script
cannelle
J'ai écrit iconic
pour résoudre ce problème en vous permettant de sauvegarder et de charger paramètres d'icône de bureau. De plus, il va:
Vous pouvez obtenir le script sur github .
Voici l'écran principal:
Visitez la page github pour iconique pour voir tous les autres écrans, les explications et une copie du script.