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
-
O script precisa de
wmctrl
para ser instaladosudo apt-get install wmctrl
-
Copie o script em um arquivo vazio, salve-o como
close_removed.py
-
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.
-
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.