Feche a janela do Nautilus automaticamente após a remoção da unidade

6

Lembro-me de que, ao usar 12.04 (e talvez também 14.04), se eu removesse uma unidade que estava atualmente montada e aberta em uma janela do Nautilus, a janela seria fechada automaticamente.

Agora, em 16.04, a janela aberta é revertida automaticamente para o diretório de mídia ( /media/{username} ) se eu remover uma unidade aberta. Existe alguma maneira de restaurar essa funcionalidade?

    
por Jake 13.12.2016 / 13:11

1 resposta

8

Funcionalidade de patch

Nas Preferências do nautilus, não há opções para consertá-lo, até onde eu possa ver; Nada a ser encontrado em Preferências. Com um script minúsculo, extremamente low-on-juice-background nós podemos corrigir ele no entanto. A carga adicional do processador é nula.

O script

#!/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

Como usar

  1. O script precisa de wmctrl para ser instalado

    sudo apt-get install wmctrl
    
  2. Copie o script em um arquivo vazio, salve-o como close_removed.py

  3. Teste - execute-o pelo comando

    python3 /path/to/close_removed.py
    

    conecte uma ou mais unidades, remova-as depois que elas forem montadas automaticamente. Sua janela deve fechar.

  4. Se tudo funcionar bem, adicione-o aos aplicativos de inicialização: Dash > Aplicativos de inicialização > Adicionar. Adicione o comando:

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

Explicação

  • As unidades externas são montadas em /media/<username>/<drivename>
  • Se uma unidade for desconectada, a janela nautilus correspondente será revertida para (pelo menos no meu sistema) /media/<username> . A janela é, portanto, (re) nomeada após o usuário atual.
  • Infelizmente, não podemos simplesmente fechar todas as janelas nautilus , nomeadas após o usuário atual, possíveis incompatibilidades podem ocorrer. No entanto, é seguro assumir que a janela que foi imediatamente renomeada para o usuário atual depois que a unidade foi desconectada é a que representou a unidade removida.

É assim que o script funciona, usando:

pgrep nautilus 

... na inicialização do script, para obter o pid do nautilus

wmctrl -lp

... para obter as janelas do nautilus

lsblk

... para ficar de olho em unidades possivelmente desconectadas

wmctrl -ic <window_id>

... para fechar a (s) janela (s) segmentada (s)

Nota

O script tem um ciclo de dois segundos, o que implica que a unidade precisa ser conectada por pelo menos dois segundos para funcionar.

    
por Jacob Vlijm 27.12.2016 / 11:49