web-dev-qa-db-fra.com

Comment préserver les positions des icônes du bureau après le redémarrage, sur une configuration à double moniteur (Unity)?

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:

enter image description here

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.

3
Andy

La cause

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).

Solution de contournement

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:

  • peut créer un instantané des positions actuelles des icônes lors de la déconnexion
  • restaurer les positions des icônes après le deuxième écran apparaît correctement après le redémarrage (connexion)

effectivement le bogue est contourné.

Comment lire la position de l'icône sur le bureau

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

Pour l'utiliser:

  • Copiez le script dans un fichier vide, enregistrez-le sous le nom 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.

Pour utiliser le script dans notre situation, il faudrait cependant quelques ajouts

  • 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é.

  • Ensuite, pour vous assurer que l'instantané restauré est appliqué , nous pouvons inclure le redémarrage de Nautilus dans le script.

La solution

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

Comment utiliser

  1. Copiez le script dans un fichier vide, enregistrez-le sous le nom restore_icons.py
  2. Dans la section head du script, définissez le nom (localisé) approprié du dossier Desktop:

    # --- set your localized desktop name below:
    dt_name = "Desktop"
    # ---
    
  3. 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.

    <image_1>

    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é.

  4. 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.

  5. 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.

Remarque

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.

5
Jacob Vlijm

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

1
hamathelinuxnewbie

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:

  • Permet de déplacer des icônes sur l’un des trois moniteurs
  • Définissez une taille de grille pour que les icônes soient réparties uniformément sur le bureau, aussi proches ou éloignées que vous le souhaitez
  • Ne pas souffrir du "syndrome d'icône perdue" qui se produit lorsque des moniteurs de plusieurs résolutions sont utilisés
  • Triez les icônes alphabétiquement, alphabétiquement, le préfixe "Lien vers" étant ignoré, triez par date modifiée par ordre croissant ou par date décroissante.
  • Autorise une taille de grille différente (colonnes x lignes) en fonction du moniteur, par exemple davantage sur un moniteur 4K que sur un moniteur 2K
  • Bouton Instant Test pour une expérimentation rapide sur les modifications de colonne x rangée ou les modifications d'espace réservé pour les zones de gauche, du haut, de droite ou du bas du moniteur
  • Le bouton Test durera x secondes, défini par vous, effacez toutes les fenêtres avant le test et les restaure après le test.
  • Script Bash pour des modifications faciles

Vous pouvez obtenir le script sur github .

Voici l'écran principal:

iconic main menu.png

Visitez la page github pour iconique pour voir tous les autres écrans, les explications et une copie du script.

0
WinEunuuchs2Unix