web-dev-qa-db-fra.com

Débordement de message dans la bulle de notification

J'apprends à utiliser les notifications gtk, et il semble que tout affichage en sortie via la bulle de notification ait une taille maximale de débordement, probablement 10 lignes environ. Donc, si le message que je veux montrer est plus que cela, il est supprimé. Existe-t-il un moyen d’obliger l’affichage du message entier sans que rien ne soit supprimé?

J'utilise notifyOSD, au fait.

7
Razor

Je l'ai posté il y a quelque temps sur un Q/A supprimé (maintenant). Peut-être que cela vous est utile.


Un patch pour permettre de (très) longs messages

Le "patch" ci-dessous vous permettra d’avoir des notifications aussi longtemps que nécessaire sur votre bureau:

En cas de (très) longues notifications, au lieu de ceci:

enter image description here

vous verrez ceci:

enter image description here

La durée du message est automatiquement définie sur la longueur du texte.

Ce qu'il fait

Les notifications envoyées par notify-osd (notify-send) sont limitées à env. 120 caractères.
La solution "écoute" les messages envoyés à l'aide de dbus-monitor. Si un message dépasse 120 caractères, il reprend les messages et utilise "sa propre" fenêtre de message pour afficher la notification, comme indiqué ci-dessus.

Les scripts

  1. La configuration existe en deux sections; de "listen-" script, qui intercepte les notifications:

    #!/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 {}
    

    Copiez le script dans un fichier vide et enregistrez-le sous le nom catch_notifs.sh

  2. Le script qui crée les notifications de remplacement:

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

    Copiez le script ci-dessus dans un fichier vide, enregistrez-le sous (exactement!) message (sans extension) et rendez-le exécutable . .

  3. Stockez les deux scripts dans un seul et même répertoire .
  4. Tester le script à l'aide de la commande (à partir d'une fenêtre de terminal):

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

    (continuez-le)

    Vous pouvez tester la configuration en exécutant (dans un autre terminal):

    notify-send '<long_text>'
    
  5. Si tout fonctionne correctement, ajoutez-le à Applications de démarrage: Dash> Applications de démarrage> Ajouter. Ajoutez la commande:

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

Et ça devrait marcher :)

10
Jacob Vlijm

Comme je l'ai noté dans les commentaires, notify-osd ne convient pas très bien aux messages volumineux et vous devriez plutôt préférer zenity.

Un exemple simple d'utilisation serait le frai zenity dialogue 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)

Exemple très simple. Avec quelque chose qui nécessite de vérifier l'état de sortie, comme des questions, vous voudrez peut-être utiliser la structure try - except - else

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"

Si vous voulez quelque chose de plus avancé, envisagez probablement l’apprentissage de l’un des outils graphiques tels que PyQt ou Gtk.

4
Sergiy Kolodyazhnyy