Estouro de mensagem na bolha de notificação

7

Estou aprendendo como usar notificações gtk e parece que qualquer exibição de saída por meio do balão de notificação tem um tamanho máximo de estouro, provavelmente 10 linhas ou mais. Então, se a mensagem que eu quero mostrar é mais do que isso, ela é suprimida. Existe alguma maneira de forçar a exibição da mensagem inteira sem que nada seja suprimido?

Estou usando o notifyOSD, a propósito.

    
por Razor 21.07.2016 / 05:05

2 respostas

9

Eu postei isso há um tempo atrás em um Q / A (agora) excluído. Talvez seja útil para você.

Um patch para permitir mensagens (muito) longas

O "patch" abaixo permitirá que você tenha notificações, desde que leve em sua área de trabalho:

Em caso de notificações (muito) longas, em vez disso:

vocêveráisto:

Aduraçãodamensageméautomaticamentedefinidaparaotamanhodotexto.

Oquefaz

Asnotificações,enviadaspornotify-osd(notify-send),estãolimitadasaappr.120caracteres.
Asolução"escuta" as mensagens enviadas, usando dbus-monitor . Se uma mensagem exceder os 120 caracteres, ela assumirá as mensagens e usará a janela de mensagem "própria" para exibir a notificação, conforme mostrado acima.

Os scripts

  1. A configuração existe de duas seções; de "listen-" script, que intercepta as notificações:

    #!/bin/bash
    
    currdir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
    
    dbus-monitor "interface='org.freedesktop.Notifications'" |\
     grep --line-buffered "string" |\
     grep --line-buffered -e method -e ":" -e '""' -e urgency -e notify -v |\
     grep --line-buffered '.*(?=string)|(?<=string).*' -oPi |\
     grep --line-buffered -v '^\s*$' |\
     xargs -I '{}' $currdir/message {}
    

    Copie o script em um arquivo vazio e salve-o como catch_notifs.sh

  2. O script que cria as notificações de substituição:

    #!/usr/bin/env python3
    import subprocess
    import os
    import gi
    gi.require_version('Gtk', '3.0')
    from gi.repository import GObject, Gtk, Gdk, Pango
    from threading import Thread
    import time
    import sys
    
    text = sys.argv[1]
    length = len(text)
    showtime = length/20
    
    def get_screen():
        scr = [s.split("x") for s in subprocess.check_output([
            "xrandr"]).decode("utf-8").split() if "+0+0" in s][0]
        return int(scr[0]) -450
    
    class Splash(Gtk.Window):
    
        def __init__(self):
            Gtk.Window.__init__(self, title="splashtitle")
            maingrid = Gtk.Grid()
            self.add(maingrid)
            maingrid.set_border_width(20)
            label = Gtk.Label(text)
            label.set_line_wrap(True)
            label.set_max_width_chars(45)
            label.modify_font(Pango.FontDescription('Ubuntu 11'))
            maingrid.attach(label, 0, 0, 1, 1)
            self.stop = Thread(target=self.close_window)
            self.stop.start()
    
        def close_window(self):
            time.sleep(showtime)
            Gtk.main_quit()
    
    def splashwindow():
        window = Splash()
        window.set_decorated(False)
        window.set_resizable(False)
        window.override_background_color(Gtk.StateType.NORMAL, Gdk.RGBA(0,0,0,1))
        window.modify_fg(Gtk.StateFlags.NORMAL, Gdk.color_parse("white"))
        # window.set_opacity(0.8)
        window.move(get_screen(), 80)
        window.set_keep_above(True)
        window.show_all()
        window.set_default_size(200, 500)
        GObject.threads_init()
        Gtk.main()
    
    if len(text) > 120:
        subprocess.Popen(["pkill", "notify-osd"])
        splashwindow()
    
    Copie o script acima em um arquivo vazio, salve-o como (exatamente!) message (sem extensão) e torne-o executável.

  3. Armazene os dois scripts em um único diretório e o mesmo .
  4. Teste- execute o script pelo comando (a partir de uma janela de terminal):

    /bin/bash /path/to/catch_notifs.sh
    

    (mantenha-o em execução)

    Você pode testar a configuração executando (em outro terminal):

    notify-send '<long_text>'
    
  5. Se tudo funcionar bem, adicione-o aos aplicativos de inicialização: Dash > Aplicativos de inicialização > Adicionar. Adicione o comando:

    /bin/bash /path/to/catch_notifs.sh
    

E isso deve funcionar:)

    
por Jacob Vlijm 21.07.2016 / 08:06
4

Como eu notei nos comentários, notify-osd não é muito adequado para mensagens extensas e deve-se preferir zenity .

Um exemplo simples de uso seria gerar o diálogo zenity via subprocess.call([COMMAND,OPTIONS])

import subprocess 

text="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat."
command=['zenity', '--info', '--text="' +text + '"', '--width=250', '--height=300' ]
subprocess.call(command)

Exemplo muito simples. Com algo que exige a verificação do status de saída, como perguntas, você pode usar try - except - else structure

import subprocess 

text='Do you want to use Zenity?'
command=['zenity', '--question', 
         '--text="' +text + '"',
         '--width=250', '--height=300' ]


try:
    stdout = subprocess.check_call(command)

except subprocess.CalledProcessError:
    pass # if return sttus is non-zero, do something here

else:
    # if exit status was 0 , we do something here
    print "Yes, I want to use Zenity too"

Se você quiser algo mais avançado, provavelmente considere aprender um dos toolkits gráficos como PyQt ou Gtk.

    
por Sergiy Kolodyazhnyy 21.07.2016 / 05:51