Como criar uma notificação no gnome a partir do comando com funcionalidade ‘onClick’?

Como criar uma notificação no gnome a partir do comando com funcionalidade ‘onClick’?

Podemos criar uma notificação usando comandos simples.

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

Podemos torná-lo clicável e executar um script enquanto clicamos nele? Como

Quando clicamos em uma notificação enviada pelo gerenciador de arquivos Nautilus como esta insira a descrição da imagem aqui

Ele abre diretamente uma nova janela. Mas nossa notificação personalizada não faz nada. Como fazer com que nossa notificação personalizada execute uma atividade quando clicamos nela.

Responder1

Pergunta interessante!

insira a descrição da imagem aqui

...Qual foi o gatilho para a exploração abaixo sobre o assunto noRepositório experimental UB. O resultado é um pop-up de notificação/mensagem que possui as seguintes opções:

Exemplo de notificação com funcionalidade de clique (opcional)

  • defina o canto para aparecer
  • definir um comando para ser executado quando clicado
  • definir um título (negrito)
  • definir um texto de mensagem
  • definir um ícone
  • defina uma duração de vida (segundos) <- definida no snippet

As primeiras quatro opções só se aplicam se você definir o argumento, o canto padrão é inferior direito (no primário), a menos que seja definido de forma diferente.

A duração da vida é -como está- codificada, o padrão é 10 segundos, a menos que seja definido de forma diferente.

Notas

  • Observe que essas notificações -como estão- não são transmitidas dbus, portanto não podem ser "ouvidas". Um desenvolvimento adicional poderia ser torná-lo um processo em segundo plano semelhante ao daemon - mantendo o loop Gtk ativo -, apenas chamando a janela na dica do dbus.
  • Muitos dos valores/preferências podem ser movidos para gsettings

Como configurar

  • Copie o trecho em um arquivo vazio, salve-o como alternotify.pye torne-o executável
  • Execute-o com qualquer combinação das seguintes opções, basta escolher o que você precisa:

    • clique no comando:command="command_to_run"
    • título:title="Title to show"
    • texto da mensagem (corpo):body="Text body of the notification message, text, text, text"
    • ícone (do nome do ícone):icon="icon-name"
    • o canto a aparecer, 1 = NE, 2 = NW, 3 = SE, 4 = SW:position=1

Um comando completo poderia ser assim:

/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

insira a descrição da imagem aqui

O 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()

informação relacionada