EDITAR:
1. RESPOSTA NOVA
Embora a resposta na parte inferior desta possa ser usada (consulte [2.]
), ela leva a uma ppa
-version com opções adicionais, a serem definidas em uma janela de preferências.
As opções incluem:
- Definir todos os aliases em uma janela
-
Definir cores de tema para o ícone do painel:
- Definindo limite para avisos
-
Mostrar informações sobre volumes recém-montados / conectados em uma notificação:
-
Executar na inicialização
Além disso, o indicador agora inclui um ícone menor (largura) definido para outras distros (como o xfce), que será aplicado automaticamente, dependendo do gerenciador de janelas.
Para instalar:
sudo add-apt-repository ppa:vlijm/spaceview
sudo apt-get update
sudo apt-get install spaceview
2. RESPOSTA VELHA
O script abaixo é um indicador que lista seus dispositivos e mostra seu uso. A informação é atualizada (se necessário) uma vez por dez segundos.
Além disso
-
Enquanto o indicador está sendo executado, você pode escolher um dispositivo para ser representado no ícone. O dispositivo será lembrado na próxima vez que você executar o indicador:
-
Para um ou mais (ou todos) dispositivos, você pode definir um nome alternativo ("nome personalizado"), a ser definido na cabeça do script
Como exemplo, isso:
alias = [ ["sdc1", "stick"], ["sdb1", "External"], ["sda2", "root"], ["sda4", "ntfs1"], ["sda5", "ntfs2"], ["//192.168.0.104/media", "netwerk media"], ["//192.168.0.104/werkmap_documenten", "netwerk docs"], ]
mostrará:
-
Você pode definir um limite ; Se o espaço livre de qualquer um dos seus dispositivos estiver abaixo disso, você receberá um aviso:
-
Dispositivos conectados / desconectados serão adicionados / removidos do menulado em 10 segundos.
O script
#!/usr/bin/env python3
import subprocess
import os
import time
import signal
import gi
gi.require_version('Gtk', '3.0')
gi.require_version('AppIndicator3', '0.1')
from gi.repository import Gtk, AppIndicator3, GObject
from threading import Thread
#--- set alias names below in the format [[device1, alias1], [device2, alias2]]
#--- just set alias = [] to have no custom naming
alias = []
#--- set the threshold to show a warning below
#--- set to 0 to have no warning
threshold = 17
#---
currpath = os.path.dirname(os.path.realpath(__file__))
prefsfile = os.path.join(currpath, "showpreferred")
class ShowDevs():
def __init__(self):
self.default_dev = self.get_showfromfile()
self.app = 'show_dev'
iconpath = currpath+"/0.png"
self.indicator = AppIndicator3.Indicator.new(
self.app, iconpath,
AppIndicator3.IndicatorCategory.OTHER)
self.indicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE)
self.indicator.set_menu(self.create_menu())
self.indicator.set_label("Starting up...", self.app)
self.update = Thread(target=self.check_changes)
self.update.setDaemon(True)
self.update.start()
def check_changes(self):
state1 = None
while True:
self.state2 = self.read_devices()
if self.state2 != state1:
self.update_interface(self.state2)
state1 = self.state2
time.sleep(10)
def update_interface(self, state):
warning = False; self.newmenu = []
for dev in state:
mention = self.create_mention(dev)
name = mention[0]; deci = mention[2]; n = mention[1]
if n <= threshold:
warning = True
try:
if self.default_dev in name:
newlabel = mention[3]
newicon = currpath+"/"+str(10-deci)+".png"
except TypeError:
pass
self.newmenu.append(name+" "+str(n)+"% free")
if warning:
newlabel = "Check your disks!"
newicon = currpath+"/10.png"
try:
self.update_indicator(newlabel, newicon)
except UnboundLocalError:
labeldata = self.create_mention(state[0])
newlabel = labeldata[3]
newicon = currpath+"/"+str(10-labeldata[2])+".png"
self.update_indicator(newlabel, newicon)
GObject.idle_add(self.set_new,
priority=GObject.PRIORITY_DEFAULT)
def update_indicator(self, newlabel, newicon):
GObject.idle_add(self.indicator.set_label,
newlabel, self.app,
priority=GObject.PRIORITY_DEFAULT)
GObject.idle_add(self.indicator.set_icon,
newicon,
priority=GObject.PRIORITY_DEFAULT)
def set_new(self):
for i in self.initmenu.get_children():
self.initmenu.remove(i)
for item in self.newmenu:
add = Gtk.MenuItem(item)
add.connect('activate', self.change_show)
self.initmenu.append(add)
menu_sep = Gtk.SeparatorMenuItem()
self.initmenu.append(menu_sep)
self.item_quit = Gtk.MenuItem('Quit')
self.item_quit.connect('activate', self.stop)
self.initmenu.append(self.item_quit)
self.initmenu.show_all()
def change_show(self, *args):
index = self.initmenu.get_children().index(self.initmenu.get_active())
self.default_dev = self.newmenu[index].split()[0]
open(prefsfile, "wt").write(self.default_dev)
self.update_interface(self.read_devices())
def create_mention(self, dev):
name = dev[1] if dev[1] else dev[0]
n = dev[2]; deci = round(dev[2]/10)
newlabel = name+" "+str(n)+"% free"
return (name, n, deci, newlabel)
def create_menu(self):
# create initial basic menu
self.initmenu = Gtk.Menu()
self.item_quit = Gtk.MenuItem('Quit')
self.item_quit.connect('activate', self.stop)
self.initmenu.append(self.item_quit)
self.initmenu.show_all()
return self.initmenu
def read_devices(self):
# read the devices, look up their alias and the free sapace
devdata = []
data = subprocess.check_output(["df", "-h"]).decode("utf-8").splitlines()
relevant = [l for l in data if all([
any([l.startswith("/dev/"), l.startswith("//")]),
not "/loop" in l])
]
for dev in relevant:
data = dev.split(); name = data[0]; pseudo = None
free = 100-int([s.strip("%") for s in data if "%" in s][0])
for al in alias:
if al[0] in name:
pseudo = al[1]
break
devdata.append((name, pseudo, free))
return devdata
def get_showfromfile(self):
# read the preferred default device from file
try:
defdev = open(prefsfile).read().strip()
except FileNotFoundError:
defdev = None
return defdev
def stop(self, source):
Gtk.main_quit()
ShowDevs()
GObject.threads_init()
signal.signal(signal.SIGINT, signal.SIG_DFL)
Gtk.main()
Os ícones
Configurando
A configuração é simples:
- Copie o script em um arquivo vazio, salve-o como
showusage.py
- Salve os ícones acima, exatamente nomeados como em seu rótulo , em um único diretório e o mesmo que o script (clique com o botão direito em & gt; Salvar como)
-
No cabeçalho do script, defina (possíveis) nomes alternativos (
aliasses
). Abaixo um exemplo:alias = [ ["sda2", "root"], ["sdb1", "External"] ]
Se você deseja exibir os dispositivos inalterados, use:
alias = []
e se você quiser, altere o limite para mostrar um aviso:
#--- set the threshold to show a warning below (% free, in steps of 10%) #--- set to 0 to have no warning threshold = 10
É isso
Executando
Para usar o indicador, execute o comando:
python3 /path/to/showusage.py
Para adicioná-lo ao Startup Applications, use o comando:
/bin/bash -c "sleep 10 && python3 /path/to/showusage.py"
Escolha Aplicativos: Dash & gt; Aplicativos de inicialização & gt; Adicione, adicione o comando acima.