Закрыть окно Nautilus автоматически после удаления диска

6

Я помню, что при использовании 12.04 (и, возможно, также 14.04), если бы я удалил диск, который был в данный момент установлен и открыт в окне Nautilus, окно автоматически закрывается.

Теперь, в 16.04, открытое окно автоматически возвращается в каталог мультимедиа ( /media/{username} ), если я удалю открытый диск. Есть ли способ восстановить эту функциональность?

    
задан Jake 13.12.2016 в 13:11
источник

1 ответ

8

Функциональность патча

В настройках «Наутилус» нет возможности исправить это, насколько я могу видеть; - Невозможно найти в настройках. С крошечным сценарием с очень низким разрешением на сок-фон можно использовать патч . Дополнительная нагрузка процессора - nihil.

Скрипт

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

Как использовать

  1. Для скрипта требуется wmctrl для установки

    sudo apt-get install wmctrl
    
  2. Скопируйте сценарий в пустой файл, сохраните его как close_removed.py

  3. Протестируйте его командой

    python3 /path/to/close_removed.py
    

    подключите один или несколько дисков, удалите их после их автоматической установки. Их окно должно закрыться.

  4. Если все работает нормально, добавьте его в приложения для запуска: Dash > Приложения для запуска > Добавлять. Добавьте команду:

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

Объяснение

  • Внешние диски монтируются в /media/<username>/<drivename>
  • Если диск отключен, соответствующее окно nautilus вернется к (по крайней мере, в моей системе) /media/<username> . Окно поэтому (re) имеет имя после текущего пользователя.
  • К сожалению, мы не можем просто закрыть все окна nautilus , названные в честь текущего пользователя, могут возникнуть возможные несоответствия. Однако можно с уверенностью предположить, что окно, которое было , сразу же переименовано в текущий пользователь после отсоединения диска - это тот, который отображает удаленный диск.

Так работает сценарий, используя:

pgrep nautilus 

... при запуске скрипта, чтобы получить pid nautilus

wmctrl -lp

... чтобы получить окна nautilus

lsblk

... следить за возможными отсоединенными дисками

wmctrl -ic <window_id>

... для закрытия целевого окна (ов)

Примечание

Сценарий имеет цикл в две секунды, что означает, что диск должен быть подключен как минимум две секунды для его работы.

    
ответ дан Jacob Vlijm 27.12.2016 в 11:49
источник