web-dev-qa-db-fra.com

Fermer la fenêtre de Nautilus automatiquement après le retrait du lecteur

Je me souviens qu'en utilisant 12.04 (et peut-être aussi 14.04), si je retirais un lecteur actuellement monté et ouvert dans une fenêtre Nautilus, cette fenêtre se fermerait automatiquement.

Désormais, en 16.04, la fenêtre ouverte revient automatiquement au répertoire de support (/media/{username}) si je supprime un lecteur ouvert. Est-il possible de restaurer cette fonctionnalité?

6
Jake

Fonctionnalité de correctif

Dans les préférences de Nautilus, il n'y a pas d'option pour le réparer, autant que je sache. -on ne peut en trouver dans les préférences. Avec un minuscule script extrêmement lent, nous pouvons patch le faire. Le fardeau supplémentaire du processeur est le nihil.

Le scénario

#!/usr/bin/env python3
import subprocess
import os
import time

def get(cmd):
    try:
        return subprocess.check_output(cmd).decode("utf-8").strip()
    except subprocess.CalledProcessError:
        pass

curruser = os.environ["USER"]
nautpid = get(["pgrep", "nautilus"])
connected1 = [l for l in get("lsblk").splitlines() if "media" in l]
wlist1 = [l.strip() for l in get(["wmctrl", "-lp"]).splitlines() if nautpid in l]

t = 0
while True:
    time.sleep(1.5)
    connected2 = [l for l in get("lsblk").splitlines() if "media" in l]
    time.sleep(0.5)
    while True:
        wlist = get(["wmctrl", "-lp"])
        if wlist:
            break
    wlist2 = [l.strip() for l in wlist.splitlines() if nautpid in l]
    removed = [l for l in connected1 if not l in connected2]
    if removed:
        close = [
            w for w in wlist2 if all([
                not w in wlist1,
                any([
                    w.endswith(" "+curruser),
                    w.endswith(" Home")]),
                ])
            ]
        for w in close:
            subprocess.Popen(["wmctrl", "-ic", w.split()[0]])
    connected1 = connected2
    wlist1 = wlist2
    # periodically (re)set nautpid to fix if nautilus crashed somehow
    t += 1
    if t == 20:
        nautpid = get(["pgrep", "nautilus"])
        t = 0

Comment utiliser

  1. Le script doit installer wmctrl

    Sudo apt-get install wmctrl
    
  2. Copiez le script dans un fichier vide, enregistrez-le sous le nom close_removed.py

  3. Testez-le par la commande

    python3 /path/to/close_removed.py
    

    connectez un ou plusieurs lecteurs, supprimez-les après leur montage automatique. Leur fenêtre devrait se fermer.

  4. Si tout fonctionne correctement, ajoutez-le à Applications de démarrage: Dash> Applications de démarrage> Ajouter. Ajoutez la commande:

    /bin/bash -c "sleep 15 && python3 /path/to/close_removed.py"
    

Explication

  • Les disques externes sont montés dans /media/<username>/<drivename>
  • Si un lecteur est déconnecté, la fenêtre nautilus correspondante revient à (du moins sur mon système) /media/<username>. La fenêtre est donc nommée d'après l'utilisateur actuel.
  • Malheureusement, nous ne pouvons pas simplement fermer toutes les fenêtres nautilus, nommées d'après l'utilisateur actuel, des incompatibilités possibles peuvent se produire. Il est toutefois prudent de supposer que la fenêtre qui était immédiatement renommée en utilisateur actuel après la déconnexion du lecteur est celle qui représente le lecteur supprimé.

Voici comment fonctionne le script en utilisant:

pgrep nautilus 

... au démarrage du script, pour obtenir le pid de nautile

wmctrl -lp

... pour obtenir les fenêtres de nautile

lsblk

... pour garder un oeil sur les lecteurs éventuellement déconnectés

wmctrl -ic <window_id>

... pour fermer la ou les fenêtres ciblées

Remarque

Le script a un cycle de deux secondes, ce qui implique que le lecteur doit être connecté au moins deux secondes pour fonctionner.

8
Jacob Vlijm