
Podemos crear una notificación usando comandos simples.
ex:notify-send 'SUPER IMPORTANT!' 'This is an urgent message!' -u critical
¿Podemos hacer que se pueda hacer clic en él y ejecutar un script mientras hacemos clic en él? Como
Cuando hacemos clic en una notificación enviada por el administrador de archivos Nautilus como esta
Abre directamente una nueva ventana. Pero nuestra notificación personalizada no hace nada. Cómo hacer que nuestra notificación personalizada realice una actividad cuando hacemos clic en ella.
Respuesta1
¡Interesante pregunta!
...¿Cuál fue el detonante de la exploración a continuación sobre el tema en elRepositorio experimental de la UB. El resultado es una notificación/mensaje emergente que tiene las siguientes opciones:
Ejemplo de una notificación con funcionalidad de clic (opcional)
- establecer la esquina para que aparezca
- establecer un comando para ejecutar cuando se hace clic
- establecer un título (negrita)
- establecer un texto de mensaje
- establecer un icono
- establecer una duración de vida (segundos) <- establecer en el fragmento
Las primeras cuatro opciones solo se aplican si configura el argumento, la esquina predeterminada está en la parte inferior derecha (en principal), a menos que se configure de manera diferente.
La duración de la vida está, tal como está, codificada, por defecto es de 10 segundos, a menos que se establezca de manera diferente.
Notas
- Tenga en cuenta que estas notificaciones, tal como están, no se transmiten
dbus
, por lo que no se pueden "escuchar". Un mayor desarrollo podría ser convertirlo en un proceso en segundo plano similar a un demonio (manteniendo vivo el bucle Gtk), llamando solo a la ventana en la sugerencia de dbus. - Muchos de los valores/preferencias podrían moverse a gsettings
Como instalar
- Copie el fragmento en un archivo vacío, guárdelo como
alternotify.py
y hágalo ejecutable. Ejecútelo con cualquier combinación de las siguientes opciones, simplemente elija lo que necesite:
- haga clic en el comando:
command="command_to_run"
- título:
title="Title to show"
- texto del mensaje (cuerpo):
body="Text body of the notification message, text, text, text"
- icono (del nombre del icono):
icon="icon-name"
- la esquina que aparecerá, 1 = NE, 2 = NW, 3 = SE, 4 = SW:
position=1
- haga clic en el comando:
Un comando completo podría verse así:
/path/to/alternotify.py title="Missing applet" body="To use this functionality, you need to run previews. Click this notification to switch it on." icon="budgie-hotcorners-symbolic" command="gedit /home/jacob/Bureaublad/Kap" position=4
El código
#!/usr/bin/env python3
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk, GLib
import sys
import subprocess
class NotifyWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self)
self.set_decorated(False)
distance = 80 # gsettings
winwidth = 300 # gsettings
winheight = 80 # gsettings
self.set_default_size(winwidth, winheight)
self.maingrid = Gtk.Grid()
self.add(self.maingrid)
self.set_space()
self.winpos = 4 # gsettings? default = SE
self.get_args()
self.currage = 0
self.targetage = 10 # gsettings,life seconds
GLib.timeout_add_seconds(1, self.limit_windowlife)
self.maingrid.show_all()
self.position_popup(self.winpos, winwidth, winheight, distance)
self.show_all()
Gtk.main()
def get_winpos(self, arg):
self.winpos = int(arg)
def limit_windowlife(self):
if self.currage >= self.targetage:
Gtk.main_quit()
self.currage = self.currage + 1;
return True
def position_popup(self, winpos, winwidth, winheight, distance):
monitordata = self.get_primarymonitor()
winsize = self.get_size()
winwidth, winheight = winsize.width, winsize.height
monitor_xpos = monitordata[2]
monitor_ypos = monitordata[3]
monitor_width = monitordata[0]
monitor_height = monitordata[1]
if winpos == 1:
wintargetx = monitor_xpos + distance
wintargety = monitor_ypos + distance
elif winpos == 2:
wintargetx = monitor_width + monitor_xpos - winwidth - distance
wintargety = monitor_ypos + distance
elif winpos == 3:
wintargetx = monitor_xpos + distance
wintargety = monitor_ypos + monitor_height - (
distance + winheight
)
elif winpos == 4:
wintargetx = monitor_width + monitor_xpos - winwidth - distance
wintargety = monitor_ypos + monitor_height - (
distance + winheight
)
self.move(wintargetx, wintargety)
def get_primarymonitor(self):
# see what is the resolution on the primary monitor
prim = Gdk.Display.get_default().get_primary_monitor()
geo = prim.get_geometry()
[width, height, screen_xpos, screen_ypos] = [
geo.width, geo.height, geo.x, geo.y
]
height = geo.height
return width, height, screen_xpos, screen_ypos
def show_title(self, title):
title_label = Gtk.Label(label=title)
self.maingrid.attach(title_label, 3, 1, 1, 1)
title_label.set_xalign(0)
# set title bold
self.noti_css = ".title {font-weight: bold; padding-bottom: 5px;}"
self.provider = Gtk.CssProvider.new()
self.provider.load_from_data(self.noti_css.encode())
self.set_textstyle(title_label, "title")
def set_body(self, body):
body_label = Gtk.Label(
label=body
)
self.maingrid.attach(body_label, 3, 2, 1, 1)
body_label.set_xalign(0)
body_label.set_size_request(250, -1)
body_label.set_line_wrap(True)
def set_icon(self, icon):
self.maingrid.attach(Gtk.Label(label="\t"), 2, 0, 1, 1)
if not "/" in icon:
newicon = Gtk.Image.new_from_icon_name(
icon, Gtk.IconSize.DIALOG
)
self.maingrid.attach(newicon, 1, 1, 1, 2)
self.maingrid.show_all()
def get_args(self):
args = sys.argv[1:]
funcs = [
self.show_title, self.set_body, self.set_icon,
self.connect_action, self.get_winpos,
]
argnames = ["title", "body", "icon", "command", "position"]
for arg in args:
argdata = arg.split("=")
argname = argdata[0]
arg = argdata[1]
try:
i = argnames.index(argname)
funcs[i](arg)
except ValueError:
print("invalid argument:", arg)
def connect_action(self, arg):
self.connect("button_press_event", self.run_command, arg)
pass
def set_textstyle(self, widget, style):
widget_cont = widget.get_style_context()
widget_cont.add_class(style)
Gtk.StyleContext.add_provider(
widget_cont,
self.provider,
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION,
)
def run_command(self, event, key, command):
if key.get_button()[1] == 1:
subprocess.Popen(["/bin/bash", "-c", command])
def set_space(self):
for cell in [[0, 0], [100, 0], [0, 100], [100, 100]]:
self.maingrid.attach(
Gtk.Label(label="\t"), cell[0], cell[1], 1, 1
)
NotifyWindow()