¿Cómo crear una notificación en GNOME desde el comando con la funcionalidad 'ONCLICK'? -- mmand-line campo con gnome campo con notification camp askubuntu Relacionados El problema

How to create a notification in gnome from command with 'onClick' functionality?


3
vote

problema

Español

Podemos crear una notificación usando comandos simples.

EX: ABCDEFGHIJKLMNABCDEFGHIJKLMN0

¿Podemos hacerlo clickable y ejecutar un script mientras se hace clic en él? Como

Cuando hacemos clic en una notificación Enviar por Nautilus File Manager como este ingrese la descripción de la imagen aquí

Abre directamente una nueva ventana. Pero nuestra notificación personalizada no hace nada. Cómo hacer que nuestra notificación personalizada haga una actividad cuando lo haga clic.

Original en ingles

We can create a notification using simple commands.

ex:notify-send 'SUPER IMPORTANT!' 'This is an urgent message!' -u critical

Can we make it clickable and run a script while clicking on it? Like

When we click on a notification send by Nautilus file manager like this one enter image description here

It directly opens a new window. But our custom notification doesn't do anything. How to make our custom notification do an activity when we click it.

        
         
         

Lista de respuestas

2
 
vote
vote
La mejor respuesta
 

Pregunta interesante!

ingrese la descripción de la imagen aquí

... que fue el gatillo para la exploración a continuación sobre el tema en el UB Experimental Repo . El resultado es una ventana emergente de notificación / mensaje que tiene las siguientes opciones:

Ejemplo de una notificación con (opcional) Click-funcionality

  • Establecer la esquina para aparecer
  • Configure un comando que se ejecute al hacer clic
  • establece un título (negrita)
  • establecer un mensaje de texto
  • establecer un icono
  • establece una longitud de vida (segundos) & lt; - se establece en el fragmento

Las primeras cuatro opciones solo se aplican si establece el argumento, la esquina, por defecto, en la parte inferior derecha (en primaria), a menos que se configure de manera diferente.

La longitud de la vida es -as, se codifica con codificación dura, por defecto a 10 segundos, a menos que se configure de manera diferente.

notas

  • Tenga en cuenta que estas notificaciones, no se pasan, no se pasan a través de dbus , por lo que no pueden ser "escuchados". El desarrollo adicional podría ser convertirlo en un fondo similar a un daemon, el mantenimiento de la bucle GTK con vida, solo llamando a la ventana en la sugerencia de DBUS.
  • Muchos de los valores / preferencias podrían moverse a GSettings

Cómo configurar

  • Copie el fragmento en un archivo vacío, guárdelo como alternotify.py , hágalo ejecutable
  • ejecute con cualquier combinación de las siguientes opciones, simplemente seleccione lo que necesita:

    • Click Command: command="command_to_run"
    • Título: title="Title to show"
    • Texto del mensaje (CUERPO): ABCDEFGHIJKLMNABCDEFGHIJKLMN4
    • icono (desde el nombre del icono): icon="icon-name"
    • La esquina para aparecer, 1 = NE, 2 = NW, 3 = SE, 4 = SW: ABCDEFGHIJKLMNABCDEFGHIJKLMN6

Un comando completo podría parecer:

  /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   

ingrese la descripción de la imagen aquí

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=" "), 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=" "), cell[0], cell[1], 1, 1             )  NotifyWindow()   
 

Interesting question!

enter image description here

...Which was the trigger for the exploration below on the subject on the UB experimental repo. The result is a notification/message popup which has the following options:

Example of a notification with (optional) click-functionality

  • set the corner to appear
  • set a command to run when clicked
  • set a title (bold)
  • set a message text
  • set an icon
  • set a life length (seconds) <- set in the snippet

The first four options only apply if you set the argument, the corner defaults to bottom-right (on primary), unless set differently.

The life length is -as it is- hardcoded, defaults to 10 seconds, unless set differently.

Notes

  • Note that these notifications -as it is- are not passed through dbus, so they cannot be "listened" to. Further development could be to make it a daemon-like background process -keeping the Gtk loop alive-, only calling the window on dbus hint.
  • Many of the values/preferences could be moved to gsettings

How to setup

  • Copy the snippet into an empty file, save it as alternotify.py, make it executable
  • Run it with any combination of the following options, just pick what you need:

    • click command: command="command_to_run"
    • title: title="Title to show"
    • message text (body): body="Text body of the notification message, text, text, text"
    • icon (from icon name): icon="icon-name"
    • the corner to appear, 1 = NE, 2 = NW, 3 = SE, 4 = SW: position=1

A complete command could look like:

/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 

enter image description here

The code

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

Relacionados problema

61  ¿Cómo obtener el mensaje "Su batería está rota" para desaparecer?  ( How to get the your battery is broken message to go away ) 
Cada vez que enciendo mi computadora, veo un mensaje que dice algo como: Your battery may be old or broken. Ya estoy consciente de que mi batería es ma...

1  Notificador de correo electrónico que admite cuentas en línea, notificaciones, menú de mensajes  ( Email notifier that supports online accounts notifications messaging menu ) 
¿Hay una aplicación de notificador de correo electrónico que: se puede encontrar en los repositorios de Ubuntu (no en un PPA), está integrado con las cue...

0  Imprima un mensaje de error útil al alcanzar la cuota de impresión  ( Print a helpful error message when printing quota is reached ) 
Estoy intentando configurar cuotas de impresión para impresoras aquí en la oficina. Sin embargo, aparece cuando se alcanza la cuota, la impresión simplemente ...

3  Días de temporizador de cuenta regresiva en la barra de menú de Ubuntu  ( Days countdown timer in ubuntu menu bar ) 
Necesito un applet que pueda contar hasta un número específico de días. Actualmente estoy usando el 'Applet-applet' del centro de software, pero solo puede co...

0  Unity Mail Manipulación de cuentas múltiples  ( Unity mail handling multiple accounts ) 
He configurado el correo de Unity para que monitorea las cuentas de correo electrónico 2 (digamos, Gmail y Mail.RU). Me lo notifica correctamente sobre nuevos...

2  Sin notificaciones para Facebook o Twitter en Gwibber  ( No notifications for facebook or twitter in gwibber ) 
Estoy usando Gwibber y tengo mi cuenta de Facebook y Twitter configurada en ella. Mi sistema se estrelló hace 2 días después de que una actualización lo arrui...

126  ¿Cómo hacer un sonido una vez que se completa un proceso?  ( How to make a sound once a process is complete ) 
He comenzado un largo proceso a través de un terminal. ¿Es posible hacer que el terminal Ubuntu haga un sonido una vez que se complete el proceso? De esta man...

6  Cómo reemplazar los iconos de notificaciones de aire de Adobe  ( How to replace adobe air notifications icons ) 
He estado usando varias herramientas que dependen de la plataforma ADOBE AIR en Ubuntu, como TweetDeck y Grooveshark. Siempre he odiado, cómo se ven los ico...

9  ¿Por qué mi reloj, los applets indicadores y el área de notificación a veces se mueven cuando me reinicié? ¿Cómo puedo prevenir eso?  ( Why do my clock indicator applets and notification area sometimes move around ) 
Los tengo todos bloqueados en el panel, pero siguen moviéndose al cerrar sesión y volver a entrar. Entonces, por ejemplo, a veces la sesión del applet indicad...

2  Notificación de correo de Cron  ( Cron mail notification ) 
Me gustaría deshabilitar la notificación de correo de Crontab para una de mis tareas ... ejecuto esta tarea cada minuto, eso significa 1440 correo por día: ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos