Nachrichtenüberlauf in Benachrichtigungsblase

7

Ich lerne, wie man GTK-Benachrichtigungen verwendet, und es scheint, dass jede Ausgabeanzeige über die Benachrichtigungsblase eine maximale Überlaufgröße hat, wahrscheinlich 10 Zeilen oder so. Wenn die Nachricht, die ich anzeigen möchte, mehr als das ist, wird sie unterdrückt. Gibt es eine Möglichkeit, die Anzeige der gesamten Nachricht zu erzwingen, ohne dass etwas unterdrückt wird?

Ich benutze übrigens notifyOSD.

Rasierer
quelle
Sie können Zenity für längere Nachrichten verwenden. notifyosd nur für kurze Benachrichtigungen geeignet
Sergiy Kolodyazhnyy
@Serg Zenity ist eine gute Lösung für Befehlszeilenausführungen, aber ich habe absolut keine Ahnung, wie man es in einem Python-Skript verwendet. Jedes Beispiel wäre schön.
Rasiermesser
Python kann alles, was die Befehlszeile kann. Ich werde in ein paar Minuten ein Beispiel veröffentlichen
Sergiy Kolodyazhnyy

Antworten:

10

Ich habe dies vor einiger Zeit in einem (jetzt) ​​gelöschten Q / A gepostet. Vielleicht ist es nützlich für Sie.


Ein Patch für (sehr) lange Nachrichten

Mit dem folgenden "Patch" können Sie Benachrichtigungen erhalten, solange dies auf Ihrem Desktop dauert:

Bei (sehr) langen Benachrichtigungen stattdessen:

Geben Sie hier die Bildbeschreibung ein

Sie werden dies sehen:

Geben Sie hier die Bildbeschreibung ein

Die Dauer der Nachricht wird automatisch auf die Länge des Textes eingestellt.

Was es macht

Benachrichtigungen, die von notify-osd( notify-send) gesendet werden, sind auf ca. 120 Zeichen.
Die Lösung "hört" auf gesendete Nachrichten mit dbus-monitor. Wenn eine Nachricht die 120 Zeichen überschreitet, übernimmt sie die Nachrichten und verwendet "ein eigenes" Nachrichtenfenster, um die Benachrichtigung anzuzeigen, wie oben gezeigt.

Die Skripte

  1. Das Setup besteht aus zwei Abschnitten; de "listen-" Skript, das die Benachrichtigungen abfängt:

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

    Kopieren Sie das Skript in eine leere Datei und speichern Sie es unter catch_notifs.sh

  2. Das Skript, das die Ersatzbenachrichtigungen erstellt:

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

    Kopieren Sie das obige Skript in eine leere Datei, speichern Sie es als (genau!) message(Keine Erweiterung) und machen Sie es ausführbar .

  3. Speichern Sie beide Skripte in ein und demselben Verzeichnis .
  4. Testen Sie das Skript mit dem Befehl (über ein Terminalfenster):

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

    (Lass es laufen)

    Sie können das Setup testen, indem Sie (in einem anderen Terminal) ausführen:

    notify-send '<long_text>'
  5. Wenn alles einwandfrei funktioniert, fügen Sie es zu Startanwendungen hinzu: Dash> Startanwendungen> Hinzufügen. Fügen Sie den Befehl hinzu:

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

Und es sollte funktionieren :)

Jacob Vlijm
quelle
Sie erstaunlich uns einfach, ^ _ ^ b
Sergiy Kolodyazhnyy
@ Jacob Vlijm Hey, danke! Das zeigt zwar längeren Text an, aber ich habe immer noch ein Problem, da ich jetzt Tabellendaten anzeigen möchte (die nur alphanumerische Zeichen enthalten), die mit tabellarisch erstellt wurden. Dies gibt mir immer wieder einen Fehler über xargs und fehlende doppelte Anführungszeichen. Ich habe keine Ahnung warum, und Ihr Code wird beendet und notify-osd übernimmt, sodass der Text wieder unterdrückt wird. Könnten Sie das bitte untersuchen?
Rasiermesser
@Razor Ihre Frage erwähnt nichts über tabellarische Daten, wenn das wichtig gewesen wäre, hätte es in der Frage sein sollen! Ich kann es mir ansehen, werde es aber nicht innerhalb weniger Tage sein.
Jacob Vlijm
@ Jacob Vlijm Sorry, du hast recht, ich hätte das einschließen sollen. Die Tabelle ist nur Klartext, also dachte ich mir, wenn es eine Möglichkeit gäbe, längeren Text anzuzeigen, würde sich das auch um die Tabelle kümmern. Ich werde meine Frage entsprechend aktualisieren, mit einer Beispielausgabe, wie die Daten aussehen. Schätzen Sie Ihre Hilfe :)
Rasiermesser
@Razor Ich würde nicht sagen "aktualisieren" (tatsächlich ändern) die Frage ist das Richtige zu tun. Es ist eine neue Frage. In der aktuellen Frage wird nur die Länge in Zeilen erwähnt. Das Layout mit Registerkarten in Ordnung zu halten, ist ganz anders.
Jacob Vlijm
4

Wie ich in den Kommentaren bemerkt habe, notify-osdist es nicht sehr geeignet für umfangreiche Nachrichten und man sollte zenitystattdessen bevorzugen .

Ein einfaches Beispiel für die Verwendung wäre das Laichen des zenityDialogs übersubprocess.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)

Sehr einfaches Beispiel. Bei etwas, bei dem der Exit-Status überprüft werden muss, z. B. bei Fragen, möchten Sie möglicherweise die try - except - elseStruktur verwenden

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"

Wenn Sie etwas Fortgeschritteneres möchten, sollten Sie eines der grafischen Toolkits wie PyQt oder Gtk erlernen.

Sergiy Kolodyazhnyy
quelle